本文完整程式碼及附件已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
大家好我是費老師,就在幾天前,經過六年多的持續開發迭代,著名的開源高效能分析型資料庫DuckDB
釋出了其1.0.0
正式版本。
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/44af200227c6387ae06f185c35cf14cb866df152f9889909880111c0e902af61.png)
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'), 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
格式
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/8e400b7b323ba432f13e01d37e16fe651420a433c82b0e3141f2cfc41cada36b.png)
parquet
格式
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/cf8edce9b440ac972277bb3d1d11813b514b9148a4fc12920ac22c18f26ecc36.png)
可以看到,無論是對比pandas
還是polars
,DuckDB
的檔案讀取效能都是大幅領先甚至碾壓級的⚡。
除此之外,DuckDB
也可以透過SQL
語句的方式進行等價操作:
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/b2bafd6a339fd6957f931c57b41e25be36d9b82d6713c8b5e445f2a4a2937b6c.png)
2.1.2 讀取其他框架的資料物件
除了預設可直接讀取少數幾種常見資料格式外,DuckDB
在Python
中還支援直接以執行SQL
語句的方式,直接讀取pandas
、polars
等框架中的資料框,這一點可太強大了,意味著只要是pandas
、polars
等框架可以讀取的格式,DuckDB
都可以直接“拿來吧你”🤣:
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/edf5f74658f94998bf829739c3d2c1fc76a63914e57c93250b8311a6dc770500.png)
2.2 執行分析運算
DuckDB
作為一款關係型資料庫,其執行分析運算最直接的方式就是寫SQL
,針對DuckDB
預設讀取到記憶體中的物件(DuckDB
中稱作關係):
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/77d945e54aa18a067041e843e9c68a660022533eebfd9869bdb4fe9375ac3eac.png)
我們可以透過duckdb.sql()
直接將關係當作表名,書寫SQL
語句進行查詢分析,下面是一些簡單的例子:
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/ed1d687ff28573d10ac9dd316d7fba6543f31c26cf8bbd517975bb15f0fe145c.png)
比較一下與pandas
、polars
之間執行相同任務的耗時差異,DuckDB
依舊是碾壓級的存在👍:
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/8a062adaf23379275567abb27a192445c0b3efe10b6d98c7544afba3bf23d33d.png)
2.3 計算結果轉換
DuckDB
預設自帶的檔案寫出介面比較少,依舊是隻針對csv
、parquet
等主流格式具有相應的write_parquet()
、write_csv()
可以直接匯出檔案,但是針對Python
,DuckDB
提供了多樣化的資料轉換介面,可以快捷高效地將計算結果轉換為Python
物件、pandas
資料框、polars
資料框、numpy
陣列等常用格式:
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/f69ccf88335ce964df1d02ee7da413e033065fa64366b77c770db96fd7782be7.png)
基於此,就不用擔心透過DuckDB
計算的資料結果不好匯出為其他各種格式檔案了~
如果你恰好需要轉出為csv
、parquet
等格式,那麼直接使用DuckDB
的檔案寫出介面,效能依舊是非常強大的:
csv
格式
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/d6d08670b51a8c02497928bc30fb6f4b072a9985c61ee7c3aeff6825e947c994.png)
parquet
格式
![(資料科學學習手札161)高效能資料分析利器DuckDB在Python中的使用](https://i.iter01.com/images/157a73dbcfb22c4ff37c32b6a464ea0242cde5241fb2208037ac72297aef3bf8.png)
更多有關DuckDB
在Python
中應用的內容,請移步官方文件(https://duckdb.org/docs/api/python/overview
),費老師我也會在之後持續的分享DuckDB
相關教程文章,歡迎持續關注,一起來熟練掌握這款資料分析利器😉。
以上就是本文的全部內容,歡迎在評論區與我們進行討論~