(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

费弗里發表於2024-06-05

本文完整程式碼及附件已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  大家好我是費老師,就在幾天前,經過六年多的持續開發迭代,著名的開源高效能分析型資料庫DuckDB釋出了其1.0.0正式版本。

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  DuckDB具有極強的單機資料分析效能表現,功能豐富,具有諸多擴充外掛,且除了預設的SQL查詢方式外,還非常友好地支援在PythonRJavaNode.js等語言環境下使用,特別是在Python中使用非常的靈活方便,今天的文章,費老師我就將帶大家一起快速瞭解DuckDBPython中的常見使用姿勢😎~

2 DuckDB在Python中的使用

  DuckDB的定位是嵌入式關係型資料庫,在Python中安裝起來非常的方便,以當下最主流的開源Python環境管理工具mamba為例,直接在終端中執行下列命令,我們就一步到位的完成了對應演示虛擬環境的建立,並在環境中完成了python-duckdbjupyterlabpandaspolars等相關分析工具的安裝:

mamba create -n duckdb-demo python=3.9 -y && mamba activate duckdb-demo && mamba install python-duckdb jupyterlab pandas polars pyarrow -y

2.1 資料集的匯入

2.1.1 直接匯入檔案

  作為一款資料分析工具,能夠方便靈活的匯入各種格式的資料非常重要,DuckDB預設可直接匯入csvparquetjson等常見格式的檔案,我們首先使用下列程式碼生成具有五百萬行記錄的簡單示例資料,並分別匯出為csvparquet格式進行比較:

# 利用pandas生成示例資料檔案
import numpy as np
import pandas as pd

generated_df = pd.DataFrame(
    {
        '類別': np.random.choice(list('ABCDEF'), 1000000),
        '數值': np.round(np.random.uniform(0, 1000000, 1000000), 3)
    }
)

# 分別匯出為csv、parquet格式
generated_df.to_csv('./demo_data.csv', index=False)
generated_df.to_parquet('./demo_data.parquet')

  針對兩種格式的檔案,分別比較預設情況下DuckDBpandaspolars的讀取速度:

  • csv格式
(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用
  • parquet格式
(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  可以看到,無論是對比pandas還是polarsDuckDB的檔案讀取效能都是大幅領先甚至碾壓級的⚡。

  除此之外,DuckDB也可以透過SQL語句的方式進行等價操作:

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

2.1.2 讀取其他框架的資料物件

  除了預設可直接讀取少數幾種常見資料格式外,DuckDBPython中還支援直接以執行SQL語句的方式,直接讀取pandaspolars等框架中的資料框,這一點可太強大了,意味著只要是pandaspolars等框架可以讀取的格式,DuckDB都可以直接“拿來吧你”🤣:

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

2.2 執行分析運算

  DuckDB作為一款關係型資料庫,其執行分析運算最直接的方式就是寫SQL,針對DuckDB預設讀取到記憶體中的物件(DuckDB中稱作關係):

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  我們可以透過duckdb.sql()直接將關係當作表名,書寫SQL語句進行查詢分析,下面是一些簡單的例子:

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  比較一下與pandaspolars之間執行相同任務的耗時差異,DuckDB依舊是碾壓級的存在👍:

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

2.3 計算結果轉換

  DuckDB預設自帶的檔案寫出介面比較少,依舊是隻針對csvparquet等主流格式具有相應的write_parquet()write_csv()可以直接匯出檔案,但是針對PythonDuckDB提供了多樣化的資料轉換介面,可以快捷高效地將計算結果轉換為Python物件、pandas資料框、polars資料框、numpy陣列等常用格式:

(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  基於此,就不用擔心透過DuckDB計算的資料結果不好匯出為其他各種格式檔案了~

  如果你恰好需要轉出為csvparquet等格式,那麼直接使用DuckDB的檔案寫出介面,效能依舊是非常強大的:

  • csv格式
(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用
  • parquet格式
(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用

  更多有關DuckDBPython中應用的內容,請移步官方文件(https://duckdb.org/docs/api/python/overview),費老師我也會在之後持續的分享DuckDB相關教程文章,歡迎持續關注,一起來熟練掌握這款資料分析利器😉。


  以上就是本文的全部內容,歡迎在評論區與我們進行討論~

相關文章