目录
异常值的检测与处理
一、异常值的检测
1、使用3σ准则检测异常值
定义一个基于3σ准则检测的函数,使用该函数检测文件中的数据,并返回异常值
2、使用箱形图检测异常值
根据data.xlsx文件中的数据,使用boxplot()方法绘制一个箱型图
定义一个从箱型图形中获取异常值的函数,并返回data.xlsx文件中数据的异常值及其对应的索引
二、异常值的处理
1、删除异常值
使用drop()方法根据指定的行索引中读取的data.xlsx 文件的数据中删除异常值
异常值被删除后,可以再次调佣定义值的three_sigma()函数进行检测,以确保异常值全部删除
2、替换异常值
使用replace()方法从data.xlsx文件读取的数据的异常值
异常值的检测与处理
一、异常值的检测
1、使用3σ准则检测异常值
定义一个基于3σ准则检测的函数,使用该函数检测文件中的数据,并返回异常值
import numpy as np
import pandas as pd
def three_sigma(ser):
"""
ser参数:被检测的数据,接收DataFrom的一列数据
返回: 异常值及其对应的行索引
"""
# 计算平均值
mean_data = ser.mean()
# 计算标准差
std_data = ser.std()
# 小于 μ - 3σ 或 μ + 3σ的数值均为异常值
rule = (mean_data - 3 * std_data > ser) | (mean_data + 3 * std_data < ser)
# 返回异常值的行索引
index = np.arange(ser.shape[0])[rule]
# 获取异常值
outliers = ser.iloc[index]
return outliers
# 读取data.xlsx文件
execl_data = pd.read_excel('C:/py数据/第5章/data.xlsx')
# 对value列进行异常值检测
print(three_sigma(execl_data['value']))
121 13.2
710 13.1
Name: value, dtype: float64
2、使用箱形图检测异常值
根据data.xlsx文件中的数据,使用boxplot()方法绘制一个箱型图
import pandas as pd
import matplotlib.pyplot as plt
execl_data = pd.read_excel('C:/py数据/第5章/data.xlsx')
# print(execl_data)
plt.boxplot(execl_data['value'], sym='rs')
plt.show()
定义一个从箱型图形中获取异常值的函数,并返回data.xlsx文件中数据的异常值及其对应的索引
import pandas as pd
import numpy as np
def box_outliers(ser):
# 对待检测的数集进行排序
global Q3, Q1
new_ser = ser.sort_values()
# 判断数据的总数量是奇数还是偶数
if new_ser.count() % 2 == 0:
# 计算Q3,Q1,IQR
Q3 = new_ser[int(len(new_ser) / 2):].median()
Q1 = new_ser[:int(len(new_ser) / 2)].median()
elif new_ser.count() % 2 != 0:
Q3 = new_ser[int((len(new_ser) - 1) / 2):].median()
Q1 = new_ser[:int((len(new_ser) - 1) / 2)].median()
IQR = round(Q3 - Q1, 1)
rule = (round(Q3 + 1.5 * IQR, 1) < ser) | (round(Q1 - 1.5 * IQR, 1) > ser)
index = np.arange(ser.shape[0])[rule]
# 获取异常值及其索引
outliers = ser.iloc[index]
return outliers
execl_data = pd.read_excel('C:/py数据/第5章/data.xlsx')
print(box_outliers(execl_data['value']))
0 12.7
121 13.2
255 12.7
353 13.0
694 12.8
710 13.1
724 12.9
Name: value, dtype: float64
二、异常值的处理
1、删除异常值
使用drop()方法根据指定的行索引中读取的data.xlsx 文件的数据中删除异常值
# 根据行索引删除异常值
execl_data = pd.read_excel('C:/py数据/第5章/data.xlsx')
execl_data.drop([121, 710])
异常值被删除后,可以再次调佣定义值的three_sigma()函数进行检测,以确保异常值全部删除
clean_data = execl_data.drop([121,710])
# 再次检测数据中是否有异常值
print(three_sigma(clean_data['value']))
Series([], Name: value, dtype: float64)
2、替换异常值
替换异常值既可以是固定数值,也可以计算得出的值
使用replace()方法从data.xlsx文件读取的数据的异常值
replace_data = execl_data.replace({13.2:10.2,13.1:10.5})
# 根据行索引获取替换后的值
print(replace_data.loc[121])
print(replace_data.loc[710])
Unnamed: 0 121.0
value 10.2
Name: 121, dtype: float64
Unnamed: 0 710.0
value 10.5
Name: 710, dtype: float64