如何在Dask中执行时间导数而不进行排序

时间:2017-12-22 17:17:39

标签: python dask dask-distributed

我正在开发一个涉及一些大于内存的数据集的项目,并且一直在评估用于处理集群而不是本地计算机的不同工具。一个看起来特别有趣的项目是dask,因为它的pandas API与DataFrame类非常相似。

我想收集时间序列相关数据的时间导数。这显然需要按时间戳排序时间序列数据,以便您在行之间采取有意义的差异。但是,dask DataFrames没有sort_values方法。

使用Spark DataFrame并使用Window函数时,对分区内的排序提供了开箱即用的支持。也就是说,您可以执行以下操作:

from pyspark.sql.window import Window
my_window = Window.partitionBy(df['id'], df['agg_time']).orderBy(df['timestamp'])

然后我可以使用此窗口函数来计算差异等。

我想知道是否有办法在dask中实现类似的东西。原则上我可以使用Spark,但是我有点时间紧张,而且我对它的API的熟悉程度远远低于熊猫。

1 个答案:

答案 0 :(得分:1)

您可能希望将时间序列设置为索引

df = df.set_index('timestamp')

这允许更智能的时间序列算法,包括滚动操作,随机访问等。您可能需要查看http://dask.pydata.org/en/latest/dataframe-api.html#rolling-operations

请注意,通常设置索引并执行完整排序可能很昂贵。理想情况下,您的数据的格式已经按时间排序。

实施例

因此,在您的情况下,如果您只想计算衍生物,您可能会执行以下操作:

df = df.set_index('timestamp')
df.x.diff(...)