python - 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 |
我想做的是:
做一个 groupBy(['device', 'engine'])
使“何时”栏有所不同
取其最小值
(奖励)通过最小值对每个组进行归一化
我所做的是:
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()
尽管如此,最后一段代码实际上返回了所需的值,但应为所有其他设备和引擎重复。
解决方案
推荐阅读
- sql - 从 2 个表中查询匹配条件的 SQL
- python - Paramiko - 错误的身份验证类型 [Cisco SG-300 交换机]
- php - PHPML库问题
- r - 安装具有依赖项 R 的重复包
- google-sheets - 带有 OR 但没有 SUM 的 COUNTIFS
- asp.net - Asp 网络表单 C# 中的 Elmah 页面限制
- bash - 无法在 Docker 中构建最新的 Jenkins
- spring - 如何在应用程序启动并运行时重新加载 WebSecurityConfigurerAdapter 的 Configure 方法
- javascript - 从 Angular 6 调用时,节点中的 Passport-azure-ad 不会重定向到 Microsoft 登录页面
- r - 使用 fread 将向量中的元素拆分到不同的列