如何帮助熊猫处理大量数据?

熊猫库是探索性数据分析的最佳工具之一。但这并不意味着熊猫是适合解决任何问题的通用工具。特别是,我们正在谈论处理大量数据。我碰巧花了非常长的时间,等待熊猫读取很多文件或处理它们,然后根据其中包含的信息计算一些我感兴趣的指标。事实是,熊猫不支持并行数据处理机制。结果,该程序包无法充分利用现代多核处理器的功能。大熊猫中的大型数据集将被缓慢处理。



最近,我着手寻找可以帮助我处理大数据的东西。我设法找到了想要的东西,然后将找到的工具嵌入到数据处理管道中。我用它来处理大量数据。例如,读取包含10 GB数据的文件,以对其进行过滤和聚合。当我设法解决此类问题时,我将获得的内容保存在一个适合熊猫的较小的CSV文件中,然后开始使用熊猫处理数据。

这是一个Jupyter笔记本,其中包含您可以尝试的这种材料的示例。

达斯克


我用来处理大量数据的工具是Dask它支持并行数据处理,使您可以加快现有工具的工作。其中包括numpy,pandas和sklearn。Dask是一个免费的开源项目。它使用Python API和数据结构,可轻松将Dask集成到现有项目中。如果我们简短地描述Dask,那么我们可以说这个库简化了常见问题的解决,并使得解决极大复杂性的问题成为可能。

比较熊猫和黄昏


我可以在这里描述Dask的功能,因为该库有很多有趣的东西,但是,我只考虑一个实际示例。在工作过程中,我通常会遇到一些大型文件,需要分析其中存储的数据。让我们玩我的典型任务之一,创建10个文件,每个文件包含100,000条记录。每个此类文件的大小均为196 MB。

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)

现在使用熊猫读取这些文件,并测量读取它们所需的时间。pandas没有内置支持glob,因此我们必须循环读取文件:

%%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

熊猫花了16秒钟读取了这些文件:

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

如果我们谈论的是Dask,则可以注意到,该库允许您处理内存中不适合的文件。这可以通过将它们分成多个块并编译任务链来完成。让我们测量一下Dask读取这些文件所需的时间:

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

达斯花了154毫秒!这怎么可能?实际上,这是不可能的。达斯克实现了延迟任务范式。仅在需要计算结果时才执行计算。我们描述了执行图,这使Dask能够优化任务的执行。重复实验。请注意,read_csvDask 的功能具有内置的支持glob

%%time
df = 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

使用该功能会compute强制Dask返回结果,为此您需要真正读取文件。结果是Dask读取文件的速度是熊猫的两倍。

可以说,Dask允许您为Python项目配备缩放工具。

比较Pandas和Dask中的CPU使用率


Dask是否使用系统上的所有处理器内核?在读取文件时,比较熊猫和Dask中处理器资源的使用情况。我们上面审查过的相同代码在这里适用。


读取熊猫文件时使用处理器资源


使用Dask读取文件时使用处理器资源

上面的两个动画图像使您可以清楚地看到pandas和Dask在读取文件时如何使用处理器资源。

在达斯克的肠子里会发生什么?


Dask数据框由几个熊猫数据框组成,这些熊猫数据框由索引分隔。当我们read_csv从Dask 执行函数时,它会通过多个进程读取相同的文件。

我们甚至可以可视化此任务的图形。

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


读取多个文件时运行时图表模糊

缺点


也许您现在有以下想法:“如果Dask库非常好,为什么不使用它代替熊猫呢?” 但不是那么简单。仅将某些熊猫功能移植到Dask。事实是某些任务很难并行化。例如,对数据进行排序并将索引分配给未排序的列。Dask并不是绝对解决数据分析和处理所有任务的工具。建议将此库仅用于处理不完全适合内存的数据集。由于Dask库基于熊猫,因此在Dask中运行缓慢的所有事物在Dask中都将保持缓慢。如前所述,Dask是一个有用的工具,可以内置到数据处理管道中,但是该工具不能替代其他库。

安装Dask


为了安装Dask,您可以使用以下命令:

python -m pip install "dask[complete]"

摘要


在本文中,我仅简要介绍了Dask的功能。如果您对此库感兴趣,请阅读Dask 上的这些很棒的教程以及datafreymam Dask的文档而且,如果您想知道哪些功能支持Dask数据帧,请阅读API 说明DataFrame

您会使用Dask库吗?

我们提醒您,我们正在继续进行预测竞赛,您可以在其中赢得全新的iPhone。仍有时间进行深入分析,并对主题价值做出最准确的预测。


All Articles