SAC介紹:
pandas非常實用的SAC機制,SAC指的是分組操作中的Split-Apply-Combine 3個過程养交,分布代表數(shù)據(jù)的切割抓狭,應(yīng)用和組合。
1线欲、Split: 切割明场,就是通過某個指定的信息進行分組,生成不同的組別
2李丰、Apply:應(yīng)用苦锨,對不同的組別使用不同的功能函數(shù),比如求和趴泌,求均值舟舒,最值等,可以是python嗜憔,pandas的內(nèi)置函數(shù)桅打,也可以是自定義的函數(shù)铡羡。
3筏餐、Combine:組合鸿秆,將Apply應(yīng)用之后的結(jié)果再次組合在一起,得到最終的結(jié)果帚稠。
通常情況下谣旁,SAC過程都需要和groupby函數(shù)聯(lián)合使用。
項目背景:磁盤故障可以根據(jù)其smart值進行監(jiān)控和預(yù)測滋早,smart值是反應(yīng)磁盤特征的各種特征值榄审,比如各種錯誤的頻率。samrt值每天會產(chǎn)生一條數(shù)據(jù)杆麸。如圖一搁进,論文指出,故障磁盤的前n天其磁盤smart值會產(chǎn)生如圖一的變化昔头。
所以饼问,根據(jù)其故障的變化特征,需要做一下特征處理揭斧,按如下圖公式進行迭代處理莱革,實現(xiàn)權(quán)重衰減。
具體做法:取一定長度的時間窗口,設(shè)定初始阿爾法值盅视,每次用當(dāng)前值*阿爾法 + 前一個值 * 阿爾法的剩余量捐名,一直迭代到窗口的長度結(jié)束,實現(xiàn)權(quán)重衰減闹击。
需求實現(xiàn):
取窗口長度為7镶蹋,計算每個磁盤按日期變化的情況,根據(jù)公式
ABS(E7-E6)+ABS(E6-E5) * 0.7+ABS(E5-E4) * 0.7^2+ABS(E4-E3) * >0.7^3+ABS(E3-E2) * 0.7^4+ABS(E2-E1) * 0.7^5
初始值如圖:
期望實現(xiàn)效果:
方案:使用pandas的組內(nèi)shift上下平移
f1['smart_3_raw_2'] = f1.groupby('serial_number')['smart_3_raw'].transform(lambda x:
alpha ** 0 * np.abs(x - x.shift(1)) \
+ alpha ** 1 * np.abs(x.shift(1) - x.shift(2)) \
+ alpha ** 2 * np.abs(x.shift(2) - x.shift(3)) \
+ alpha ** 3 * np.abs(x.shift(3) - x.shift(4)) \
+ alpha ** 4 * np.abs(x.shift(4) - x.shift(5)) \
+ alpha ** 5 * np.abs(x.shift(5) - x.shift(6)))
此時產(chǎn)生效果:
原因:
shift平移后赏半,超出窗口大小的位置為Nan了贺归。需要對Nan加以處理。
方案:
加上 fill_value = 0即可除破。
f1['smart_3_raw_2'] = f1.groupby('serial_number')['smart_3_raw'].transform(lambda x:
alpha ** 0 * np.abs(x - x.shift(1, fill_value=0)) \
+ alpha ** 1 * np.abs(x.shift(1, fill_value=0) - x.shift(2, fill_value=0)) \
+ alpha ** 2 * np.abs(x.shift(2, fill_value=0) - x.shift(3, fill_value=0)) \
+ alpha ** 3 * np.abs(x.shift(3, fill_value=0) - x.shift(4, fill_value=0)) \
+ alpha ** 4 * np.abs(x.shift(4, fill_value=0) - x.shift(5, fill_value=0)) \
+ alpha ** 5 * np.abs(x.shift(5, fill_value=0) - x.shift(6, fill_value=0)))
效果:
2022-10-13 21:06 第1次
2022-10-16 00:30 第2次修改