开挖!
这个异常值检测基于的是两点:
所以一个很容易想到的方法就是舍弃在上述区间之外的数。
代码实现也比较容易,跟上一个实训箱线图代码实现一般无二。
只需要借住
S
e
r
i
e
s
Series
Series中的函数
m
e
a
n
mean
mean计算平均值、
s
t
d
std
std计算标准差即可。
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
data = pd.read_csv("src/death.csv", index_col='Unnamed: 0')
data = data.dropna(axis=1, thresh=data.shape[0] * 0.2)
data = data.dropna(axis=0, thresh=data.shape[1] * 0.2)
a = pd.isna(data).sum()
cols = [x for i, x in enumerate(a.index) if a[i] > 0]
mode_list = 'FIPS Admin2'
for i in cols:
if mode_list.find(i) != -1:
data[i] = data[i].fillna(data[i].mode().iloc[0])
else:
data[i] = data[i].fillna(data.mean()[i])
cols = '2008/10/20,2008/11/20,2008/12/20'.split(',')
x = data[cols]
########## Begin ##########
# 3σ 原则检测异常值
bar, sigma = x.mean(), x.std()
outliers_index = (x < bar - 3 * sigma) | (x > bar + 3 * sigma)
# 删除异常值
x = x[~outliers_index]
# 打印各列异常值个数
print(outliers_index.sum())
########## End ##########