你有想過在 pandas 中直接使用 sql嗎?我知道許多小伙伴已經知道一些庫也可以做到這種體驗,不過他們的性能太差勁了(基于sqlite,或其他服務端數據庫)。
今天我要介紹另一個專用于數據分析的列式數據庫,性能是其他同體驗的庫的1000倍以上。可以無縫接入 pandas ,做到了性能與使用體驗同時提升。
這就是今天的主角,duckdb。
duckdb 是一個單機數據庫,你大概率會用它與 sqlite 比較。
最明顯的區別就是,duckdb 是一個分析數據管理系統,而 sqlite 是一個事務型關系數據庫。
這意味著,如果你現在有一大堆數據處理任務,期間無須顧忌會有其他用戶插入新數據或刪除數據。那么 duckdb 就可以非常好應對這種場景。
對于我們這種 pandas 老用戶,duckdb 支持 pandas 的 dataFrame 通用底層格式(parquet/arrow等)上并行運行查詢,而且沒有單獨的導入步驟。這就是它能保持使用體驗的同時,大幅提升查詢性能的最大原因。
我們需要安裝這些庫 :
pip install pandas duckdb -U
先看一個例子,看看它是如何便捷與 dataframe 交互。
首先,導入今天需要用到的庫:
我們有一大堆銷售數據,加載其中一份數據看看:
此時,希望使用 sql 做一些數據查詢處理,你認為下面的 sql 簡單嗎?
(1) 直接使用 dataframe 的變量名作為表名查詢
這真的可以做到嗎?加上一點點 duckdb 的調用即可:
(2) duckdb.query 做查詢
(3) df,把查詢結果轉回 dataframe
也就是,可以直接使用當前環境下的變量作為表名。
我知道之前就有其他的庫可以做到這種體驗,但是必需強調,duckdb 是直接使用 dataframe 的內存數據(因為底層數據格式通用),因此,這個過程中的輸入和輸出數據的傳輸時間幾乎可以忽略不計。
并且,這個過程中,duckdb比 pandas 更快處理數據(多線程),并且內存使用量也比 pandas 要低得多。
特別在一些需要分組的數據處理任務上,就算只使用單線程的 duckdb 也會比 pandas 的快兩倍。如果是過濾+分組+列投影,會存在 5-8倍 的差異。
如果加上表連接,則可能會到 15倍 的差異。
如果使用其他的一些 pandas 使用 sql 的庫,比如 pandasSql ,它比 duckdb 性能差距 1000倍 以上!
以上性能對比指標,均是 duckdb 官方說明,以后有機會實際操作對比。
性能方面,就"吹"到這里。但是,我說 duckdb 有極致的使用體驗,不僅僅只是可以直接使用 dataframe 變量名作為表名寫 sql 。而是它提供了許多 sql 引擎沒有的優化語法體驗。
現在我們需要加載所有的銷售數據文件,如果使用 pandas 加載,則是這樣子:
duckdb提供了許多方便的內置函數:
默認情況下,duckdb 會把 csv 的第一行也加入到記錄中:
可以使用內置函數,通過參數設定一些加載規則:
不過,這個 header 參數其實是加載所有數據之后,再設置第一行為表頭。所以會看到實際數據仍然有一些表頭行:
我們可以直接在條件過濾中一步到位過濾掉無用的行:
此時,我們可以隨時切換使用方式。
sql 中有一些語句在特定場景下,會顯得"無意義"。比如我希望查詢所有的列:
每次都寫一句 select * ,有點麻煩。在 duckdb 里面,我們可以直接省略 select 語句。
有時候,我們希望排除某幾列,可以這么寫:
這些功能都得益于它基于的列式數據儲存方式。
再看幾個小小的 sql 體驗改進。
別名用在過濾條件中:
自動識別分組列名:
它還有許多有意思的特性,如果希望我后續做更多的教學,評論區告訴我。
duckdb 是一個很有潛力的數據分析處理工具,結合 pandas 能否大幅提升我們的工作效率,值得大家嘗試使用。
本文鏈接:http://www.www897cc.com/showinfo-26-41716-0.htmlPython數據分析專用數據庫,與pandas結合,10倍提速+極致體驗
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 五個令人驚嘆的Jupyter黑科技
下一篇: 數據加密難做?試試這個庫