基于3σ原则检测异常值
3σ原则又称为拉依达原则,根据正态分布得出的。(凡是超过(μ-3σ,μ+3σ)这个区间的均为异常值)
# 异常值的处理
def three_sigma(ser1):
# 求平均值
mean_value = ser1.mean()
# 求标准差
std_value = ser1.std()
# 位于(μ-3σ,μ+3σ)区间的数据是正常的,不在这个区间的数据为异常的
# 一旦发现有异常值,就标注为True,否则标注为False
rule = (mean_value-3*std_value>ser1)|(ser1.mean()+3*ser1.std()<ser1)
# 返回异常值的索引位置
index = np.arange(ser1.shape[0])[rule]
# 这里表示取0轴数据,[rule]是条件筛选
# 获取异常数据
outrange = ser1.iloc[index]
return outrange
# 不过使用这个函数时,传值时要一列数据一列数据传
打开文件代码为
file = open(文件路径)
df=read_csv(file)
df
基于箱尾图检测异常值
replace()
replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
to_replace:表示查找被替代值的方式
value:用来替换任何匹配to_replace的值,默认值None。
limit:表示向前或向后填充的最大尺寸间隙。
regex:接收布尔值或与to_replace相同的类型,默认为False,表示是否将to_replace和value解释为正则表达式。
mtehod:替换时使用的方法,pad/ffill表示向前填充,bfill表示向后填充。
# 这里为一个replace()小例子
df = pd.DataFrame({
"菜谱名":["红烧肉","铁板鱿鱼","小炒肉","干锅鸭掌","酸菜鱼"],
"价格":[38,25,26,388,35]
})
df.replace(to_replace=df["价格"][3],value=38.8)
# 或者这里也可以写成 df.replace(to_replace=388,value=38.8)
---------------------------------下面是输出结果---------------------------------
菜谱名 价格
0 红烧肉 38.0
1 铁板鱿鱼 25.0
2 小炒肉 26.0
3 干锅鸭掌 38.8
4 酸菜鱼 35.0