1. MAD
#MAD(mean absolute deviation)又称为绝对值差中位数法,是一种先需计算所有因子与平均值之间的距离总和来检测离群值的方法.
#处理的逻辑:
#第一步,找出所有因子的中位数 Xmedian
#第二步:得到每个因子与中位数的绝对偏差值 Xi?Xmedian
#第三步:得到绝对偏差值的中位数 MAD
#第四步:确定参数 n,从而确定合理的范围为 [Xmedian?nMAD,Xmedian+nMAD],并针对超出合理范围的因子值做如下的调整
#超出最大值的用最大值代替,小于最小值的用最小值代替。
def filter_extreme_MAD(series,n): #MAD:中位数去极值
median = series.quantile(0.5)
new_median = ((series - median).abs()).quantile(0.50)
max_range = median + n*new_median
min_range = median - n*new_median
return np.clip(series,min_range,max_range)
data6=Series([18,18,19,19,20,20,100])
data7 = filter_extreme_MAD(data6,7)
print(data7)1
2
3
4
5
6
7
8
9
10
2. 3σ法
#3σ法又称为标准差法。标准差本身可以体现因子的离散程度,是基于因子的平均值 Xmean而定的。
#在离群值处理过程中,可通过用 Xmean±nσ来衡量因子与平均值的距离。
#标准差法处理的逻辑与MAD法类似:
#第一步:计算出因子的平均值与标准差
#第二步:确认参数 n(这里选定 n = 3)
#第三步:确认因子值的合理范围为 [Xmean?nσ,Xmean nσ],并对因子值作如下的调整:
#超出最大值的用最大值代替,小于最小值的用最小值代替。
def filter_extreme_3sigma(series,n=3): #3 sigma
mean = series.mean()
std = series.std()
max_range = mean + n*std
min_range = mean - n*std
print(max_range)
print(min_range)
return np.clip(series,min_range,max_range)
data8 = filter_extreme_3sigma(data6)
print(data8)1
2
3
4
5
6
7
8
9
10
11
3. 百分位法
#将因子值进行升序的排序,对排位百分位高于97.5%或排位百分位低于2.5%的因子值,进行类似于 MAD 、 3σ 的方法进行调整。
def filter_extreme_percentile(series,min = 0.10,max = 0.90): #百分位法
series = series.sort_values()
q = series.quantile([min,max])
return np.clip(series,q.iloc[0],q.iloc[1])
data9 = filter_extreme_percentile(data6)
print(data9)1
2
3
4
5
6
7