您是否还在使用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)


分享到:


相關文章: