# 导入第三方模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 导入数据
sunspots = pd.read_csv(r'merge2.csv',usecols=[3])
u =np.mean(sunspots) #计算平均值
std =np.std(sunspots) #计算标准差
print(u,std)
#绘制箱线图(1.5倍的四分位差,如需绘制3倍的四分位差,只需调整whis参数)
plt.boxplot(x = sunspots, # 指定绘制箱线图的数据
whis = 1.5, # 指定1.5倍的四分位差
widths = 0.7, # 指定箱线图的宽度为0.8
patch_artist = True, # 指定需要填充箱体颜色
showmeans = True, # 指定需要显示均值
boxprops = {'facecolor':'steelblue'}, # 指定箱体的填充色为铁蓝色
#指定异常点的填充色、边框色和大小
flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':5},
# 指定均值点的标记符号(菱形)、填充色和大小
meanprops = {'marker':'D','markerfacecolor':'black', 'markersize':4},
medianprops = {'linestyle':'--','color':'orange'}, # 指定中位数的标记符号(虚线)和颜色
labels = [''] # 去除箱线图的x轴刻度值
)
#显示图形
plt.show()
s=sunspots.describe()
print (s)
print('________')
#寻找异常点
df2 =sunspots.copy()
lst=[]
for col in df2:
df2_col =df2[col]
Q1 = df2_col.quantile(q=0.25)
Q3 = df2_col.quantile(q=0.75)
iqr = Q3 - Q1
low_whisker = Q1 - 1.5 * (Q3 - Q1)
up_whisker = Q3 + 1.5 * (Q3 - Q1)
error=df2_col[(df2_col < low_whisker)|(df2_col >up_whisker )]
lst.append(error)
err_data= pd.concat(lst)
print('一共检测到异常数据共:%i'%len(err_data))
print('展示异常数据前20条:',err_data.head(20))
# 处理异常值 → 替换为NaN,并以插值方法处理
Q1 = df2_col.quantile(q=0.25)
Q3 = df2_col.quantile(q=0.75)
iqr = Q3 - Q1
low_whisker = Q1 - 1.5 * (Q3 - Q1)
up_whisker = Q3 + 1.5 * (Q3 - Q1)
data_nor=df2_col[(df2_col >=low_whisker)& (df2_col <=up_whisker )]# 将正常的数据按数据框形式筛选出来,返回一个已用NaN替换掉异常值
data_nor.isna().sum()
data_nor.isna().sum().sum()
# print (data_nor)
# 插值处理NaN
data_clean = data_nor.fillna(data_nor.mean())
data_clean.isna().sum() # 确认缺失值已处理
print (data_clean)
data_clean.to_csv("merge6.csv",index=False,encoding="utf_8_sig")
箱线图代码
于 2021-05-25 08:14:38 首次发布