2017-10-17 73 views
1

TL;博士:

是否有可能.set_index()方法在幾個DASK Dataframes 並行 同時?或者,是否有可能在幾個Dask數據幀上懶洋洋地插入.set_index(),因此會導致 並行地被設置爲 我可以.set_index()懶惰(或要併發執行),在Dask Dataframes?

下面是這種情況:

  • 我有幾個時間序列
  • 每個時間序列存儲的是幾個.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()方法可以延遲應用,我會創建一個完整的計算圖與上述步驟和最後,一切將並行計算 並行 (我認爲)。

回答

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 
+0

謝謝你的及時回覆@MRocklin。我忘了說。我用'sorted = True'嘗試過,但它仍然非常慢(我在談論大約5年的數據,在很多情況下采樣率小於1秒)。即使在'len()'與分區數相匹配時,我也努力爭取使用「divisions = divisions」。但我仍然沒有足夠的時間進一步調查這個問題。但是,總結一下,從你的評論中,你可以說我不能在2個Dataframes上並行輕鬆調用'set_index()'?即使他們根本不相互關聯? –

+0

如果您的數據已分類並且您知道分部,那麼您可以輕鬆調用set_index。您可能想了解有關部門的更多信息:http://dask.pydata.org/en/latest/dataframe-design.html#partitions – MRocklin