我有這個資料框:
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”列,但我不確定。如何按資料子集按資料框分組并找到每個子集的曲線更改數量并將其與原始資料框匹配?
uj5u.com熱心網友回復:
使用GroupBy.transform這里每團體對新列應用的解決方案:
def f(x):
#for debug
print (x)
slopes = x.diff().bfill()
#for debug
print (slopes)
signs = slopes > 0
changes = signs.astype(float).diff(periods=-1).fillna(0)
return changes.abs().sum()
df['Curve_Changes'] = df.groupby('ID')['Value'].transform(f)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409082.html
標籤:
