首页 > 解决方案 > Dask - Groupby 在两个索引上并取 diff() 输出的最小值

问题描述

本质上,我的情况是:我有 4 个设备('A'、'B'、'C'、'D'),每个设备有 4 个引擎(0、1、2、3),每 X 秒检查一次其状态。检查它们的 UNIX 时间在when下面数据框的列中表示。

我的目标是找到每个引擎和设备的采样“频率”(可以使用diff函数来完成),从而将我获得的时间差标准化为给定引擎和设备的最小时间差。换句话说:对于每个引擎和设备计算两个连续行之间的时间差,找到最小的一个(总共将有 4*4=16),最后将所有其他行归一化到这个最小值。

我拥有的 Dask 数据框如下所示(仅显示第一行):

指数 什么时候 设备 引擎
0 1601510485159 '一个' 0
1 1601510485159 '一个' 1
2 1601510485159 '乙' 2
3 1601510485159 '乙' 3
4 1601510485159 '乙' 2
5 1601510485159 '一个' 1
6 1601510485159 'C' 2
7 1601510485159 '一个' 0
8 1601510485159 'C' 1
9 1601510485159 '一个' 2

我想做的是:

我所做的是:

df_engines.groupby(['device', 'engine']).when.diff().min().compute()

但是,这会引发错误:

AttributeError: 'SeriesGroupBy' object has no attribute 'diff'

我已经在谷歌上搜索了一段时间,是我唯一能找到的东西,但我实际上不明白它如何帮助我解决我的问题。

此外,我想避免循环遍历“设备”和“引擎”的所有可能值来产生差异,除非问题无法以任何其他方式解决。但是,这是我发现唯一可行的解​​决方案,但仍然知道它的效率很低:

df_single_device = df_engines[df_engines['device'] == 'A']
single_device_single_metric = df_single_device[df_single_device['engine'] == 1].when.diff().dropna().compute()
single_device_single_metric.min()

尽管如此,最后一段代码实际上返回了所需的值,但应为所有其他设备和引擎重复。

标签: pythondask

解决方案


推荐阅读