异常值检测-箱线图 头歌代码注释

本文介绍了如何使用Python的pandas库对CSV数据进行预处理,包括处理缺失值和异常值检测。通过箱型图和四分位数范围(IQR)方法,作者展示了如何找出并删除数据集中的异常值,最后生成箱型图并保存结果。
摘要由CSDN通过智能技术生成

 方法一:

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 ########## 

out_index = []
for col in x.columns: 
  # 对每一列分别用箱型图进行判断
    Q1 = x[col].quantile(q=0.25)       # 下四分位
    Q3 = x[col].quantile(q=0.75)       # 上四分位
    low_whisker = Q1 - 1.5 * (Q3 - Q1)  # 下边缘
    up_whisker = Q3 + 1.5 * (Q3 - Q1)   # 上边缘
        
    # 寻找异常点,获得异常点索引值,删除索引值所在行数据
    rule = (x[col] > up_whisker) | (x[col] < low_whisker)  
    #得到异常值的下标
    out = x[col].index[rule]
    #转化成列表,并入out_index中
    out_index += out.tolist()
    #打印该列的异常值数目
    print("%s    %d"%(col,len(out.tolist()))) 
#删除异常值
x_c1=x.drop(out_index)

print("dtype: int64")

########## End ########## 
x_c1.boxplot()
plt.savefig(r'src/step1/ans_img')
plt.show()

个人觉得其中比较难理解的是这一步 

rule = (x[col] > up_whisker) | (x[col] < low_whisker) 

 rule是一个布尔型Pandas Series,它通过比较数据子集 x 中的每个元素与预先计算的上下界阈值来标识潜在的异常值。

表达式 (x < lower_limit) | (x > upper_limit) 会返回一个新的布尔系列,其中:

  • 对于所有小于 lower_limit 的数值,对应位置上的布尔值为 True
  • 对于所有大于 upper_limit 的数值,对应位置上的布尔值也为 True
  • 其余数值对应的布尔值为 False

 print("dtype: int64")

这一步单纯是凑答案了,图像没问题,就少了一个这个。

 方法二:

来源  http://t.csdnimg.cn/lGnci

Q1 = x.quantile(0.25)
Q3 = x.quantile(0.75)
IQR = Q3 - Q1

lower_limit = Q1 - 1.5 * IQR
upper_limit = Q3 + 1.5 * IQR

outliers_index = (x < lower_limit) | (x > upper_limit)

# 使用波浪线(~)进行逻辑非操作,选出不在 outliers_index 的行
# 即保留非异常值的行
x_c1 = x[~outliers_index]
print(outliers_index.sum())

outliers_index.sum() 是对布尔型Pandas Series outliers_index 进行求和操作。在布尔类型数据中,True 被视为 1,False 被视为 0。当执行 .sum() 操作时,实际上是计算出   outliers_index 中所有 True 值的数量,即标识为异常值的数据点数量。这段代码的主要目的是统计经过四分位数范围(IQR)方法检测后,在数据子集 x 中识别出的异常值个数。这样输出的结果就直接是答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值