在Dask Dataframes上我可以懒得(或同时执行).set_index()吗?

时间:2017-10-17 19:17:46

标签: python dataframe concurrency dask dask-distributed

  

tl; dr:

是否可以同时在几个Dask Dataframes 并行上使用 .set_index() 方法?或者,是否有可能.set_index()懒惰地在几个Dask数据帧上,这会导致索引同时设置并行

以下是该方案:

  • 我有几个时间序列
  • 每个时间序列都存储了多个 .csv 文件。每个文件都包含与特定日期相关的数据。此外,文件分散在不同的文件夹中(每个文件夹包含一个月的数据)
  • 每个时间序列都有不同的采样率
  • 所有时间序列都有相同的列。所有人都有一个包含DateTime的列。
  • 数据太大,无法在内存中处理。这就是我使用Dask的原因。
  • 我想将所有时间序列合并到一个DataFrame中,由DateTime对齐。为此,我需要首先resample()每个和所有时间序列到一个共同的采样率。然后.join()所有时间序列。
  • .resample()只能应用于索引。因此,在重新采样之前,我需要在每个时间序列的DateTime列上.set_index()
  • 当我在一个时间序列上询问.set_index()方法时,计算立即开始。这导致我的代码被阻止并等待。此时,如果我检查我的机器资源使用情况,我可以看到正在使用许多核心,但使用率不超过~15%。这让我觉得,理想情况下,我可以将.set_index()方法同时应用于多个时间序列。

在达到上述情况后,我尝试了一些不优雅的解决方案来并行化.set_index()方法在多个时间序列中的应用(例如创建 multiprocessing.Pool ) ,哪些都没有成功。在详细介绍这些问题之前,如何解决上述情况有一个干净的方法吗?在实现Dask时,上述场景是否在某种程度上被考虑?

或者,是否有可能.set_index()懒惰?如果.set_index()方法可以懒惰地应用,我会用上面描述的步骤创建一个完整的计算图,最后,所有内容都将同时计算并行(我认为)。

1 个答案:

答案 0 :(得分:0)

Dask.dataframe需要知道数据帧的所有分区的最小值和最大值,以便合理地并行执行日期时间操作。默认情况下,它会读取数据一次,以便找到好的分区。如果数据没有排序,那么它将进行排序(可能非常昂贵)进行排序

在您的情况下,听起来您的数据已经排序,并且您可以明确地提供这些数据。您应该查看dd.DataFrame.set_index docstring

的最后一个示例
    A common case is when we have a datetime column that we know to be
    sorted and is cleanly divided by day.  We can set this index for free
    by specifying both that the column is pre-sorted and the particular
    divisions along which is is separated

    >>> import pandas as pd
    >>> divisions = pd.date_range('2000', '2010', freq='1D')
    >>> df2 = df.set_index('timestamp', sorted=True, divisions=divisions)  # doctest: +SKIP