使用Dask DataFrame和Pandas高效读取时间序列CSV数据的目录

6
我有一个时间序列数据的目录,存储为CSV文件,每天一个文件。我该如何使用Dask DataFrame高效地加载和处理它?
免责声明:我维护Dask。这个问题在其他频道中经常出现,因此我决定在StackOverflow上添加一个问题,以便将来可以指向它。
1个回答

9

简单解决方案

如果您只是想快速获取一些内容,那么可以简单地使用dask.dataframe.read_csv函数,并使用globstring作为路径:

import dask.dataframe as dd
df = dd.read_csv('2000-*.csv')

关键字参数

dask.dataframe.read_csv 函数支持大多数 pandas.read_csv 的关键字参数,因此您可能需要进行一些微调。

df = dd.read_csv('2000-*.csv', parse_dates=['timestamp'])

设置索引

许多操作,如分组、连接、索引查找等,如果目标列是索引,则可以更有效。例如,如果将时间戳列设置为索引,则可以轻松地查找特定范围的值,或者可以高效地与另一个数据帧沿时间进行连接。这里的节省可以轻松达到10倍。

实现这一点的朴素方法是使用set_index方法。

df2 = df.set_index('timestamp')

然而,如果你知道你的新索引列是已排序的,那么通过传递sorted=True关键字参数,可以使这个过程更快。

df2 = df.set_index('timestamp', sorted=True)

分区

在上述情况中,我们仍然需要通过数据一次来查找好的分界点。但是,如果您的数据已经被很好地分割(例如每天一个文件),则可以将这些分区值传递给set_index函数,以避免进行初始遍历(对于大量CSV数据可能是昂贵的操作)。

import pandas as pd
divisions = tuple(pd.date_range(start='2000', end='2001', freq='1D'))
df2 = df.set_index('timestamp', sorted=True, divisions=divisions)

这个解决方案可以将时间戳列正确且廉价地设置为索引,从而允许未来高效的计算。

转换为另一种格式

CSV是一种普遍且方便的格式,但它也非常慢。您可能会对其他格式(如Parquet)感兴趣。它们可以轻松地快10倍到100倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接