我正在處理計量的時間序列資料,它不應該具有超過 n 步的完全相同的值。我想構建一個腳本,在給定閾值 n 的情況下,如果記錄了超過 n 個步驟的相同值,則拆分時間序列。例如:閾值 = 3
計量資料幀:
values
0 0.23
1 0.24
2 0.21
3 0.19
4 0.00
5 0.00
6 0.00
7 0.00
8 0.00
9 0.11
10 0.14
11 0.12
腳本后的預期結果:
清理資料幀_1:
values
0 0.23
1 0.24
2 0.21
3 0.19
清理資料幀_2:
values
0 0.11
1 0.14
2 0.12
由于超過三行具有相同的值,因此洗掉了相同的值并創建了兩個新的資料框。如果以后某個時候會再次重復相同的值,我需要將其拆分為第三個資料幀等。
到目前為止我的想法:
在給定串列中識別相同值重復的函式:
def one_value(L):
return all(x == y for x, y in zip(L, L[1:]))
timeseries_dummy_1 = [0.23,0.24,0.21,0.19,0,0,0,0,0,0.11,0.14,0.12]
df_1 = pd.DataFrame(timeseries_dummy_1,columns = ["values"])
threshold = 3
df_split = np.array_split(df_1, np.ceil(len(df_1)/threshold))
faulty_ = []
i=0
for day in df_split:
if one_value(list(day["values"])) == True:
faulty_.append(i)
i =1
for f_ in faulty_:
df_1.drop(df_1.index[(0 f_*threshold):(threshold f_*threshold)],inplace=True)
print(df_1)
values
0 0.23
1 0.24
2 0.21
3 0.19
4 0.00
5 0.00
9 0.11
10 0.14
11 0.12
到目前為止,這作業正常,當然還有一些 0,但就我的背景關系而言,這很好,因為閾值定義了要自行查看的某些時間范圍。這意味著只有當整個閾值范圍是相同的值時,它才應該被洗掉。到現在為止還挺好。
現在我需要從這個資料幀中獲取兩個資料幀,但具有一個靈活的函式,該函式可能會檢測所有突然“跳躍”值的索引,如這里的 5 到 9。所以第一個資料幀應該是索引 0 到 5,然后接下來的 9 點到 11 點,如果還有更多的休息時間,再從那里的任何地方開始。
我怎么能那樣做?
uj5u.com熱心網友回復:
試試這個:
df:
df = pd.DataFrame({'values': [.23,.24,.21,.21,0,0,0,0,0,.11,.14,.12]})
Solution:
threshold = 3
s = df['values'].groupby(df['values'].diff().ne(0).cumsum()).transform('count').lt(threshold)
i = ~s
d = {n 1: df for n,(name,df) in enumerate(df.loc[s].groupby(i.cumsum()))}
輸出是一個字典,你可以選擇你想要的系列。d.get(1)將回傳第一個系列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474525.html
下一篇:如何將對稱矩陣轉換為鄰接表
