【问题标题】:Can I .set_index() lazily ( or to be executed concurrently ), on Dask Dataframes?我可以在 Dask Dataframes 上懒惰地(或同时执行) .set_index() 吗?
【发布时间】:2017-10-17 19:17:45
【问题描述】:

tl;dr:

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

这是场景:

  • 我有几个时间序列
  • 每个时间序列存储几个 .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() 方法可以懒惰地应用,我会用上面描述的步骤创建一个完整的计算图,最后,所有的东西都会并行同时计算(我想)。

【问题讨论】:

    标签: python dataframe concurrency dask dask-distributed


    【解决方案1】:

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

    在您的情况下,听起来您的数据已经排序,并且您可以明确提供这些数据。你应该看看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
    

    【讨论】:

    • 感谢@MRocklin 的及时回复。我忘了说。我已经用sorted=True 试过了,但它仍然很慢(我说的是大约 5 年的数据,在许多情况下,采样率不到一秒)。即使len() 与分区数匹配,我也很难让divisions=divisions 工作。但我仍然没有足够的时间进一步调查这个问题。但是,总而言之,从您的评论中,您说我不能轻易地set_index() 并行处理 2 个数据帧?即使它们彼此完全没有关系?
    • 如果您的数据已排序并且您知道分区,那么您可以轻松调用 set_index。您可能想了解有关部门的更多信息:dask.pydata.org/en/latest/dataframe-design.html#partitions
    猜你喜欢
    • 2018-04-17
    • 2017-02-15
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2022-10-13
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多