簡體   English   中英

將 Function 應用於 Dask DataFrame 組

[英]Apply Function to Groups of Dask DataFrame

我有一個巨大的 CSV 文件,我最初將其轉換為 Parquet 文件。 該文件包含來自不同傳感器的信息。

|    |   Unnamed: 0 |   sensor_id | timestamp           |    P1 |   P2 |
|---:|-------------:|------------:|:--------------------|------:|-----:|
|  0 |            0 |        4224 | 2020-05-01T00:00:00 |  0.5  | 0.5  |
|  1 |            1 |        3016 | 2020-05-01T00:00:00 |  0.77 | 0.7  |
|  2 |            2 |       29570 | 2020-05-01T00:00:00 |  0.82 | 0.52 |

為了處理數據,我想創建幾個較小的(使用重采樣等)數據幀,其中包含每個傳感器的時間序列。 然后應將這些時間序列插入 HDF5 文件中。

除了遍歷每個組之外,還有其他更快的可能性嗎:

import dask.dataframe as dd
import numpy as np

def parse(d):
    # ... parsing
    return d

# load data
data = dd.read_parquet(fp)
sensor_ids = np.unique(test['sensor_id'].values).compute() # get array of all ids/groups
groups = test.groupby('sensor_id')

res = []
for idx in sensor_ids:
    d = parse(groups.get_group(idx).compute())
    res.append(d)

# ... loop over res ... store ...

我正在考慮使用data.groupby('sensor_id').apply(....)但這會導致單個 DataFrame。 雖然上面的解決方案在每次迭代中調用compute() - 方法導致計算時間太長。 數據總共包含約。 200_000_000行。 總共有大約11_000傳感器/組。

我可以實現將每個傳感器的時間序列寫入 HDF5 文件到 function 並調用apply嗎?

一組/傳感器的預期結果如下所示:

parse(data.groupby('sensor_id').get_group(4224).compute()).to_markdown()

| timestamp           |   sensor_id |      P1 |      P2 |
|:--------------------|------------:|--------:|--------:|
| 2020-05-01 00:00:00 |        4224 | 2.75623 | 1.08645 |
| 2020-05-02 00:00:00 |        4224 | 5.69782 | 3.21847 |

如果您願意將小數據集保存為鑲木地板,那么循環不是最好的方法,您可以使用選項partition_on

import dask.dataframe as dd
data = dd.read_parquet(fp)
data.to_parquet("data_partitioned", partition_on="sensor_id")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM