我有一个时间序列数据的目录,存储为CSV文件,每天一个文件。我该如何使用Dask DataFrame高效地加载和处理它?
免责声明:我维护Dask。这个问题在其他频道中经常出现,因此我决定在StackOverflow上添加一个问题,以便将来可以指向它。
免责声明:我维护Dask。这个问题在其他频道中经常出现,因此我决定在StackOverflow上添加一个问题,以便将来可以指向它。
如果您只是想快速获取一些内容,那么可以简单地使用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倍。