pandas读取csv相对路径_你还在用Pandas处理大型数据?我发现了一个既省时又省事的工具:Dask!...

Posted 卖山楂啦prss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas读取csv相对路径_你还在用Pandas处理大型数据?我发现了一个既省时又省事的工具:Dask!...相关的知识,希望对你有一定的参考价值。

转自:https://blog.csdn.net/weixin_39621456/article/details/112378654


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

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

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

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

认识Dask

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使用情况:代码与上面相同。


读取文件时pandas的CPU使用率


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

背后发生了什么?

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

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

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


读取多个文件时的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–

以上是关于pandas读取csv相对路径_你还在用Pandas处理大型数据?我发现了一个既省时又省事的工具:Dask!...的主要内容,如果未能解决你的问题,请参考以下文章

怎么调用pandas读取csv文件

python中的panda库1

如何将SalesForce数据导入Python Panda数据帧

用pandas导入csv表格后,怎么指定那一列是index

python之panda模块2

从 Google Cloud 存储读取 csv 到 pandas 数据框