當前位置: 妍妍網 > 碼農

效能碾壓pandas、polars的數據分析神器來了

2024-06-05碼農

添加微訊號 " CNFeffery " 備註 " 數據分析 " 入技術交流群

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

1 簡介

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

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

2 DuckDB在Python中的使用

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

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 預設可直接匯入 csv parquet json 等常見格式的檔,我們首先使用下列程式碼生成具有五百萬行記錄的簡單範例數據,並分別匯出為 csv parquet 格式進行比較:

# 利用pandas生成範例數據檔
import numpy as np
import pandas as pd
generated_df = pd.DataFrame(
{
'類別': np.random.choice(list('ABCDEF'), 5000000),
'數值': np.round(np.random.uniform(010000005000000), 3)
}
)
# 分別匯出為csv、parquet格式
generated_df.to_csv('./demo_data.csv', index=False)
generated_df.to_parquet('./demo_data.parquet')

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

  • csv 格式

  • parquet 格式

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

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

    2.1.2 讀取其他框架的數據物件

    除了預設可直接讀取少數幾種常見數據格式外, DuckDB Python 中還支持直接以執行 SQL 語句的方式,直接讀取 pandas polars 等框架中的數據框,這一點可太強大了,意味著只要是 pandas polars 等框架可以讀取的格式, DuckDB 都可以直接「拿來吧你」🤣:

    2.2 執行分析運算

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

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

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

    2.3 計算結果轉換

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

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

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

  • csv 格式

  • parquet 格式

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

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

    加入知識星球 【我們談論數據科學】

    600+ 小夥伴一起學習!

    · 推薦閱讀 ·