別再用Pandas處理大數據了!現在你擁有更好的選擇

全文共1584字,預計學習時長7分鐘

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

圖源:unsplash

 

衆所周知,Pandas是最好的探索性數據分析工具之一。但它並非對於每個工作來說都是最佳選擇,大數據處理就與它“氣場不合”。

 

Pandas並不具備多處理器,並且處理較大的數據集速度很慢。筆者消耗在等待Pandas讀取一堆文件或對其進行彙總計算上的時間太多太多了。最近,筆者發現了一個更好的工具可以更新數據處理管道,使這些CPU內核正常工作!

 

筆者使用該工具進行繁重的數據處理,例如讀取包含10 G數據的多個文件,對其進行過濾並彙總。數據處理工作結束之後,再將結果保存到一個較小的適用於Pandas的CSV文件中,然後繼續對Pandas進行探索性數據分析。這就方便許多啦,一起來認識認識這個新工具吧!

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

認識Dask

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

Dask提供了高級並行性的分析功能,得以擁有大規模處理數據的性能。適用於Dask的算法工具包有numpy, pandas和sklearn。

 

Dask是一個開源且免費的工具。它使用現有的PythonAPI和數據結構來簡化在Dask支持的等效項之間的切換。它使簡單的事情變得更容易,讓複雜的事情變得可能。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

Pandas vs Dask

 

來看一個實際的例子。在工作中,我們通常會得到一堆需要分析的文件。下面模擬筆者的工作日,並創建10個具有100K條目的文件(每個文件有196 MB)。

 

fromsklearn.datasets import make_classification
import pandas as pdfor i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y =make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i,index=False)

 

先用Pandas讀取這些文件並測算時間。Pandas不支持本地glob,因此需要循環讀取文件。

 

%%timeimport globdf_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

 

Pandas花了16秒讀取文件。

 

CPU times: user 14.6 s, sys:1.29 s, total: 15.9 s
Wall time: 16 s

 

想象一下如果文件擴大100倍,Pandas可能就無能爲力了,你甚至無法用Pandas讀取它們。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

圖源:unsplash

 

而Dask可以處理無法讀入內存的數據,它會將數據分成多個塊並指定任務鏈。現在我們來計算一下Dask加載這些文件需要多長時間。

 

importdask.dataframe as dd%%time
df = dd.read_csv('trainset_*.csv')CPU times: user 154 ms, sys: 58.6 ms, total:212 ms
Wall time: 212 ms

 

只要154 ms! 這是怎麼做到的?事實上,這個時間是不準確的。Dask延遲了執行模式。它僅在需要時才進行計算。定義執行圖,Dask得以優化任務的執行,並重復該實驗。此外,Dask的read_csv函數在本機使用glob。

 

%%timedf= dd.read_csv('trainset_*.csv').compute()CPU times: user 39.5 s, sys: 5.3 s,total: 44.8 s
Wall time: 8.21 s

 

計算功能強制Dask返回結果,Dask讀取文件的速度是Pandas的兩倍。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

Pandas vs Dask CPU使用率

 

Dask是否用到了所提供的所有CPU核心功能?比較一下讀取文件時Pandas和Dask之間的CPU使用率就知道了,看看代碼是否與上面的相同。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

讀取文件時Pandas的CPU使用情況

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

讀取文件時Dask的CPU使用情況

 

我們可以看到,Pandas和Dask在讀取文件時的多處理差異很明顯。

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

究竟發生了什麼?

 

Dask的數據框架由多個Pandas的數據框架組成,按索引劃分。當使用Dask執行read_csv函數時,多個進程將讀取一個文件,甚至能夠被可視化爲執行圖。

 

exec_graph= dd.read_csv('trainset_*.csv')
exec_graph.visualize()

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

讀取多個文件時,Dask執行速度較慢。

 

安裝方法

 

要安裝Dask,只需運行:

 

python-m pip install "dask[complete]"

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

 

Dask的缺點

 

既然Dask這麼出色,我們能否直接用它取代Pandas呢?哪有這麼簡單的事兒。只有來自Pandas的某些特定功能,才能被遷移到Dask。其中一些功能很難並行化,例如排序值和在未排序的列上設置索引。

 

Dask也並非是萬能的,用於不適合主內存的數據集是最適合它的“舞臺”。Dask是建立在Pandas之上的,Pandas運行緩慢,Dask則同樣運行緩慢。Dask在數據管道過程中僅僅是一個好用的工具,它不能替代其他庫。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

圖源:unsplash

 

爲你的工作挑選合適的工具,爲你的工具尋找匹配的“舞臺”,這樣它才能夠盡情“表演”。

 

別再用Pandas處理大數據了!現在你擁有更好的選擇

我們一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 “讀芯術”

(添加小編微信:dxsxbb,加入讀者圈,一起討論最新鮮的人工智能科技哦~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章