赞
踩
小白在之前文章中已经阐述了箱线图的原理,这里小白就把自己在工作中做的一个自动化异常值检测拿来分享一下~
原理请看这篇博文(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的代码量和重复劳动。欢迎大家提出一些建议哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。