【Python】实现箱线图异常值检测

   小白在之前文章中已经阐述了箱线图的原理,这里小白就把自己在工作中做的一个自动化异常值检测拿来分享一下~

原理请看这篇博文(https://blog.csdn.net/Jarry_cm/article/details/95473014

        小白根据箱线图的原理,分析工作中的情况,比如说酒店每天的浏览量异常值检测,那么就可以根据历史30天或者更多天的数据来检测,昨天的浏览量是否异常。

首先,为了实现自动化,这里将参数直接提炼出来,这样实现,以后的人直接在shell脚本中设置参数,不需要修改python脚本,就达到兼容的效果。

import pandas as pd
import sys
file_path = sys.argv[1]
file_name_t = sys.argv[2]
file_name_y = sys.argv[3]
k = float(sys.argv[4])
yesterday = sys.argv[5]

 shell中设置参数:每次只调整这些参数即可

file_path="/home/hotel/chen_lib"
file_name_t="boxret1.csv"
file_name_y="boxret2.csv"
python_name="boxplot.py"
k=1.5
yesterday='${zdt.addDay(-1).format("yyyyMMdd")}'

读入数据,将昨天数据之前的数据读入,然后计算四分之一分位数等,计算出最大最小阈值,然后判断昨天的数据是否超过上下限。超过设置为1,不超过设置为0。将这个结果导出到csv中,shell脚本可以读取该csv到表中。这样就可以啦

#读入数据
dataset1 = pd.read_csv(file_path+'/'+file_name_t,sep=',', header='infer')
#将日期转为datetime类型
#dataset1['d']=pd.to_datetime(dataset1['d'],format='%Y/%m/%d')


#先取日期小于今天的数据,这里暂时用这个月的最后一天代替
dataset2 = dataset1[dataset1['d'] <yesterday]
#取出测试集,这里重新设置索引,以方便下面的使用
df = (dataset1[dataset1['d']==yesterday]).reset_index(drop=True)

#获取统计数据
c = dataset2.describe()
#四分位距IQR
c.loc['IQR']= c.loc['75%']-c.loc['25%']
#最小估计值
c.loc['LowerLimit'] = c.loc['25%'] - k*c.loc['IQR']
#最大估计值
c.loc['UpperLimit'] = c.loc['75%'] + k*c.loc['IQR']
#输出要参与计算的columns
cols=c.columns.values.tolist()
#创建一个空的结果集
rets = pd.DataFrame(columns = cols) #创建一个空的dataframe
for col in cols:
    if df.loc[0,col] > c.loc['UpperLimit',col] or df.loc[0,col] < c.loc['LowerLimit',col]:
        result = 1
        rets.loc[0,col] = result
    else:
        result = 0
        rets.loc[0,col] = result

#输出结果集到服务器
rets.to_csv(file_path+'/'+file_name_y,sep=',',index=False,header=False)

     因为实际中,异常值可能需要乘的系数不一定是1.5或者3,这就需要根据实际情况,来判断这个系数的取值,确定之后,直接调度该脚本就可以实现异常值检测的效果。不需要每个人在重复做一遍该计算操作,减少SQL的代码量和重复劳动。欢迎大家提出一些建议哦!

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值