pandas的自带数据集_你还在用Pandas处理大型数据?我发现了一个既省时又省事的工具:Dask!...

f142face4c0f7eb113cbd0f45d5e39a3.png
Pandas不具有多处理支持,并且对于较大的数据集来说,速度非常慢。 现在有一个更好的工具可以使这些CPU内核正常工作!

在性数据分析方面,Pandas是最好的工具之一。但这并不意味着它适用于所有任务(比如说大数据处理)。在日常的工作中,我们往往要花很长时间等待Pandas读取文件或等待计算结果。

最近,我发现了一个新工具,能快速处理大量的数据,比如读取多个包含10G数据的文件,对它们应用过滤器并进行聚合。当我完成繁重的处理后,我将结果保存到一个较小的“pandas-friendly”CSV文件中,并继续在pandas中进行探索性数据分析。

本文中的例子将在Jupyter Notebook中进行演示,还没安装的同学记得先安装好。

认识Dask

5f594f7228d5f3ad770dbcedbcfd21ad.png

Dask为数据分析提供了高级并行性,从而为你喜欢的工具提供了大规模的性能。 其中包括numpy,pandas和sklearn, Dask是开源而且免费的, 它使用现有的Python API和数据结构来简化在Dask支持的等效项之间切换。

Dask能让简单的事情变得更加容易,也能让复杂的事情变成有可能。

Pandas vs Dask

在我的日常工作中,经常需要分析一大堆文件,我来模拟一下每天的工作:创建10个包含10万个条目的文件(每个文件有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读取这些文件并估算时间,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

Pandas花了16秒读取文件。

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

现在我们可以想象一下,如果这些文件再多100倍的话:可能连Pandas都看不懂了!

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

Dask仅需154毫秒,用时这么短?这是因为Dask执行了延迟模式,它会在需要的时候执行计算。我们需要先定义执行图,这样Dask就可以根据任务来优化执行。我们来重复一下这个实验,Dask的read-csv函数以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读取文件速度就是Pandas的两倍!

Dask能在本地对Python进行扩展。

Pandas与Dask的CPU使用率

让我们在读取文件时比较pandas和Dask之间的CPU使用情况:代码与上面相同。

9bcf1c0c944de3920376a809b9d06104.png
读取文件时pandas的CPU使用率

e4eff14db5bbda191b0e9f79c424e857.gif
读取文件时Dask的CPU使用率

上图可以看出,pandas和Dask在读取文件时在多处理方面的差异非常明显。

背后发生了什么?

Dask的数据帧由多个pandas数据帧组成,这些数据帧按索引进行拆分。当我们用Dask执行read_csv时,多个进程读取一个文件。

我们可以来可视化执行图。

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

e0b5c2ce21dd57b7efa28b7c928d2d37.png
读取多个文件时的Dask执行图

Dask的缺点

你可能会想,如果Dask这么牛,为什么不一起抛弃Pandas。 当然不可能那么简单,只有来自pandas的某些功能才能移植到Dask上执行。有一些很难并行化,例如排序值和在未排序的列上设置索引。 Dask不是灵丹妙药-仅在不适合主存储器的数据集上,才建议使用Dask。 由于Dask是建立在Pandas之上的,因此Pandas响应速度慢,而Dask则行动缓慢。 就像我之前提到的,Dask是数据管道过程中的有用工具,但它不能替代其他库。

建议只对不适合主内存的数据集使用Dask。

如何安装Dask?

要安装Dask,只需运行:

python -m pip install "dask[complete]"

一行代码就能安装整个Dask库。

最后

在这篇文章中只触及了Dask库的表面知识。如果你想更深入地了解Dask,应该去学习Dask教程DataFrame文档。

--END--

欢迎大家关注我们的公众号:为AI呐喊(weainahan)

找工作一定少不了项目实战经验,为了帮助更多缺少项目实战的同学入门Python,我们在头条上创建了一个专栏:《7小时快速掌握Pthon核心编程》,通过一个项目,快速掌握Python,欢迎大家点击链接或者阅读原文进行试看~

头条专栏​learning.snssdk.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值