您是否還在使用Pandas來處理大數據?

Pandas不具有多CPU支持,並且對於較大的數據集來說速度很慢。 有一個更好的工具可以使這些CPU內核正常工作!

您是否還在使用Pandas來處理大數據?

> Photo by Chris Curry on Unsplash

在探索性數據分析方面,Pandas是最好的工具之一。 但這並不意味著它是適用於每個任務的最佳工具,例如大數據處理。 我已經花了很多時間等待熊貓讀取一堆文件或對其進行彙總並計算功能。

最近,我花時間找到了一個更好的工具,這使我可以更新數據處理管道。 我使用此工具進行繁重的數據處理-例如讀取包含10個數據的多個文件,對其應用過濾器並進行彙總。 完成繁重的處理後,我將結果保存到一個較小的"對熊貓友好"的CSV文件中,然後繼續對熊貓進行探索性數據分析。

下載Jupyter Notebook以遵循示例。

認識Dask

您是否還在使用Pandas來處理大數據?

> Dask logo from dask.org

Dask為分析提供了高級並行性,從而為您喜歡的工具提供了大規模的性能。 其中包括numpy,pandas和sklearn。 它是開源的,免費提供。 它使用現有的Python API和數據結構來簡化在Dask支持的等效項之間切換。

Dask使簡單的事情變得容易而複雜的事情變得可能

Pandas vs Dask

我可以繼續描述Dask,因為它具有許多功能,但讓我們看一個實際的例子。 在工作中,通常會得到一堆需要分析的文件。 讓我們模擬一下我的工作日,並創建10個包含10萬個條目的文件(每個文件有196 MB)。

<code>

from

sklearn.datasets

import

make_classification

import

pandas

as

pd

for

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

)/<code>

現在,讓我們用Pandas讀取這些文件並測量時間。 Pandas 沒有本地glob支持,因此我們需要循環讀取文件。

<code>

%%time

import

glob

df_list

=

[]

for

filename in glob.glob('trainset_*.csv'):

df_

=

pd.read_csv(filename)

df_list.append(df_)

df

=

pd.concat(df_list)

df.shape

/<code>

Pandas 花了16秒讀取文件。

CPU times:

user 14.6 s,

sys: 1.29 s, t

otal: 15.9 s

Wall time: 16 s

現在,假設這些文件的大小是原來的100倍-您甚至無法用Pandas讀取它們。

您是否還在使用Pandas來處理大數據?

> Meme created with imgflip

通過將數據分成多個塊並指定任務鏈,Dask可以處理不適合內存的數據。 我們來衡量一下Dask需要多長時間加載這些文件。

<code> 

import

dask.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

/<code>

Dask 需要154毫秒! 這怎麼可能呢? 好吧,不是。 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 sWall time: 8.21 s

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

Dask在本地擴展Python

Pandas vs Dask CPU使用率

Dask是否使用您所支付的所有核心? 讓我們比較一下讀取文件時Pandas和Dask之間的CPU使用情況-代碼與上面的相同。

您是否還在使用Pandas來處理大數據?

> CPU usage with pandas when reading files

您是否還在使用Pandas來處理大數據?

> CPU usage with Dask when reading files

在上面的屏幕錄像中,在讀取文件時,Pandas 和 Dask 的多CPU 差異很明顯。

幕後發生了什麼?

Dask的DataFrame由多個 Pandas DataFrame組成,按索引劃分。 當我們使用Dask執行read_csv時,多個進程將讀取一個文件。

我們甚至可以可視化執行圖。

<code>

exec_graph

= dd.read_csv(

'trainset_*.csv'

) exec_graph.visualize()/<code>
您是否還在使用Pandas來處理大數據?

> Dask execution graph when reading multiple files.

Dask 的缺點

您可能會想,如果達斯克(Dask)如此出色,為什麼不一起拋棄Pandas。 好吧,這不是那麼簡單。 只有來自Pandas的某些功能才能移植到Dask。 其中一些很難並行化,例如排序值和在未排序的列上設置索引。 Dask不是靈丹妙藥-僅在不適合主存儲器的數據集上才建議使用Dask。 由於Dask是建立在Pandas之上的,因此Pandas行動緩慢,而Dask則行動緩慢。 就像我之前提到的,Dask是數據管道過程中的有用工具,但它不能替代其他庫。

僅建議將Dask用於不適合主存儲器的數據集

如何安裝Dask

要安裝Dask,只需運行:

<code>

python

-m pip install

"dask[complete]"

/<code>

這將安裝整個Dask庫。

結論

在此博客文章中,我僅涉及Dask庫的表面。 如果您想深入研究,請查看驚人的Dask教程和Dask的DataFrame文檔。 有興趣在Dask中支持哪些DataFrame函數? 檢查DataFrame API。

你走之前

您是否還在使用Pandas來處理大數據?

> Meme created with imgflip

(本文翻譯自Roman Orac的文章《Are you still using Pandas for big data?》,參考:
https://towardsdatascience.com/are-you-still-using-pandas-for-big-data-12788018ba1a)


分享到:


相關文章: