将功能应用于Dask DataFrame组

时间:2020-07-05 22:18:24

标签: python csv dask

我有一个巨大的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 |

为了处理数据,我想创建几个较小的(使用重采样等)DataFrame,其中包含每个传感器的时间序列。然后,应将这些时间序列插入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-File到函数中并调用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 |

1 个答案:

答案 0 :(得分:1)

如果您乐意将小型数据集保存为拼花,则循环并不是最好的方法,您可以仅使用选项partition_on

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