SAC介绍:
pandas非常实用的SAC机制,SAC指的是分组操作中的Split-Apply-Combine 3个过程,分布代表数据的切割,应用和组合。
1、Split: 切割,就是通过某个指定的信息进行分组,生成不同的组别
2、Apply:应用,对不同的组别使用不同的功能函数,比如求和,求均值,最值等,可以是python,pandas的内置函数,也可以是自定义的函数。
3、Combine:组合,将Apply应用之后的结果再次组合在一起,得到最终的结果。
通常情况下,SAC过程都需要和groupby函数联合使用。
项目背景:磁盘故障可以根据其smart值进行监控和预测,smart值是反应磁盘特征的各种特征值,比如各种错误的频率。samrt值每天会产生一条数据。如图一,论文指出,故障磁盘的前n天其磁盘smart值会产生如图一的变化。
所以,根据其故障的变化特征,需要做一下特征处理,按如下图公式进行迭代处理,实现权重衰减。
具体做法:取一定长度的时间窗口,设定初始阿尔法值,每次用当前值*阿尔法 + 前一个值 * 阿尔法的剩余量,一直迭代到窗口的长度结束,实现权重衰减。
需求实现:
取窗口长度为7,计算每个磁盘按日期变化的情况,根据公式
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
初始值如图:
期望实现效果:
方案:使用pandas的组内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)))
此时产生效果:
原因:
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次修改