【发布时间】:2022-01-12 08:53:16
【问题描述】:
我有这个数据框:
Value ID
Timestamp
-----------------------------------------
2018-07-03 02:19:28 45 111
2018-07-03 02:19:29 36 111
2018-07-03 02:19:30 64 111
2018-07-03 02:19:31 35 111
2018-07-03 02:19:32 22 111
...
2018-07-03 03:43:14 35 232
2018-07-03 03:43:15 44 232
2018-07-03 03:43:16 64 232
2018-07-03 03:43:17 44 232
2018-07-03 03:43:18 64 232
...
2018-07-03 05:20:28 35 555
2018-07-03 05:21:28 44 555
2018-07-03 05:22:28 75 555
2018-07-03 05:19:28 84 555
2018-07-03 05:19:28 35 555
...
在这里,每个 ID 代表整个数据集的不同“子集”。所以 ID 111 是它自己的时间序列数据集,232 是它自己的时间序列数据集,而 555 是它自己的时间序列数据集,还有很多没有显示。我想要做的是,使用 python,对于这些数据子集中的每一个,根据“值”列中的值找到峰值和谷值的数量,然后将其附加到原始数据框中,如下所示:
Value ID Curve_Changes
Timestamp
------------------------------------------------------------
2018-07-03 02:19:28 45 111 4
2018-07-03 02:19:29 36 111 4
2018-07-03 02:19:30 64 111 4
2018-07-03 02:19:31 35 111 4
2018-07-03 02:19:32 22 111 4
...
2018-07-03 03:43:14 35 232 9
2018-07-03 03:43:15 44 232 9
2018-07-03 03:43:16 64 232 9
2018-07-03 03:43:17 44 232 9
2018-07-03 03:43:18 64 232 9
...
2018-07-03 05:20:28 35 555 12
2018-07-03 05:21:28 44 555 12
2018-07-03 05:22:28 75 555 12
2018-07-03 05:19:28 84 555 12
2018-07-03 05:19:28 35 555 12
...
基于这个理想的输出示例数据框,这意味着如果您要绘制对应于 ID 111 的时间序列数据子集,您会看到 4 条曲线变化(无论是峰值还是谷值),如果您要绘制ID 232 对应的时间序列数据子集,您会看到 9 条曲线变化(无论是峰还是谷)等
我正在尝试使用此代码来查找峰谷数:
slopes = df["Value"].diff().bfill()
signs = slopes > 0
changes = signs.astype(float).diff(periods=-1).fillna(0)
num_changes = changes.abs().sum()
num_changes 是我想要的曲线变化次数。我能够让它在整个数据帧上工作,但我很困惑如何让它为每个单独的时间序列数据子集工作,以产生我上面显示的理想输出示例数据帧。我不确定这应该如何组织,但我认为这将是一个.groupby() 类型的任务,我认为我需要对“ID”列进行“分组”,但我不确定。如何按数据子集按数据帧分组,并找到每个子集的曲线变化次数并将其与原始数据帧匹配?
【问题讨论】:
标签: python pandas dataframe subset curve