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

程序員咋不禿頭 2024-06-07 07:26:44
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 npimport pandas as pdgenerated_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')

針對兩種格式的文件,分別比較默認情況下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相關教程文章,歡迎持續關注,一起來熟練掌握這款數據分析利器。

2 阅读:119

程序員咋不禿頭

簡介:感謝大家的關注