前言:由于清单较多,除了判断文件大小是否变大外(而且只能判断是不是更新了),无法获知数据是否有异常,必须每天手动打开,清单一多费时费力(比如我现在每天就有9个清单),所以就想编一个程序来自动判断数据是否异常。
异常的判定原则是:
1、昨日销量为0;
2、昨日销量非常少(少于下分位数-1.5个IQR)
具体代码如下:
import pandas as pd
import numpy as np
from datetime import timedelta
from datetime import date
import warnings
warnings.filterwarnings("ignore")
def yesterday_format(format_type):
'''获得昨天的标准日期:2019-4-27'''
today = date.today()
oneday = timedelta(days = 1)
yesterday = today - oneday
if format_type == 'type1':
date_yes = yesterday.strftime("%Y" + '-' + "%m" + '-' + "%d") #昨天的标准格式:2019-4-27
elif format_type == 'type2':
date_yes = yesterday.strftime("%Y" + "%m" + "%d") #昨天的另一种格式:20191101
elif format_type == 'type3':
yesterday = yesterday - oneday
date_yes = yesterday.strftime("%Y" + "%m" + "%d") #前天的标准格式:20191101(小翼管家的数据只到前天)
return date_yes
def IQR_check(temp_pivot, list_name, date_time, date_yes, count_name):
'''把IQR部分步骤打包'''
try:
temp_yesterday = temp_pivot[temp_pivot[date_time] == date_yes][count_name].values[0]
except:
temp_yesterday = 0
temp_75per = np.percentile(temp_pivot[count_name], 75)
temp_25per = np.percentile(temp_pivot[count_name], 25)
IQR = temp_75per - temp_25per
if temp_yesterday == 0:
print('{}昨日销量为0,请注意!'.format(list_name))
elif temp_25per - 1.5 * IQR <= temp_yesterday:
print('{}昨日销量为{},正常!'.format(list_name, temp_yesterday))
else:
print('{}昨日销量为{},异常,请注意!'.format(list_name, temp_yesterday))
def yesterday_sales_check(df_name, list_name, quju, date_time, qd_name, count_name):
'''昨天销量检查
:param df_name: DataFrame的名字
:param list_name: 清单的名字
:param quju: 清单中区局的列名
:param date_time:清单中统计日期的列名
:param qd_name:清单中渠道管理细分的列名
:param count_name:清单中需要统计的列名
'''
if list_name != '播播TV':
if quju == '协销区局':
temp_list = df_name[(df_name[quju] == '浦东') & (df_name[qd_name].isin(['专营渠道', '开放渠道', '中小渠道']))]
elif quju == '(初始)发展区局':
temp_list = df_name[(df_name[quju] == '浦东')]
else:
temp_list = df_name[(df_name[quju]=='浦东电信局') & (df_name[qd_name].isin(['专营渠道', '开放渠道', '中小渠道']))]
if list_name == '小翼管家':
temp_pivot = temp_list.pivot_table(index=date_time, values=count_name, aggfunc='count').reset_index()
temp_pivot[date_time] = temp_pivot[date_time].astype('str')
date_yes = yesterday_format('type3')
else:
date_yes = yesterday_format('type1')
temp_list.loc[:, date_time] = pd.to_datetime(temp_list[date_time], format="%Y" + '-' + "%m" + '-' + "%d") # 把统计日期进行标准化(2019-04-25)
temp_pivot = temp_list.pivot_table(index=date_time, values=count_name, aggfunc='count').reset_index()
IQR_check(temp_pivot, list_name, date_time, date_yes, count_name)
else:
temp_list = df_name[(df_name[quju] == '浦东电信局') & (df_name[qd_name].isin(['专营渠道', '开放渠道', '中小渠道']))]
temp_pivot = temp_list.pivot_table(index=date_time, values=count_name, aggfunc='sum').reset_index()
temp_pivot[date_time] = temp_pivot[date_time].astype('str')
date_yes = yesterday_format('type2')
IQR_check(temp_pivot, list_name, date_time, date_yes, count_name)
#导入清单
cdma = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\cdma.xls", encoding='gbk', sep='\t')
kd = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\kd.xls", encoding='gbk', sep='\t')
yun = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\家庭云.xls", encoding='gbk', sep='\t')
# chaiji = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\宽带主动拆机.xls", encoding='gbk', sep='\t')
wifi = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\全屋wifi.xls", encoding='gbk', sep='\t')
kanjia = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\天翼看家.xls", encoding='gbk', sep='\t')
guanjia = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\小翼管家.xls", encoding='gbk', sep='\t')
xiaoshoupin = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\主要销售品.xls", encoding='gbk', sep='\t')
bobotv = pd.read_excel(r"C:\Users\Administrator\Desktop\报表\数据\播播TV.xlsx", encoding='gbk', skiprows=2)
#进行判断
yesterday_sales_check(cdma, '移动号线', '销售区局', '统计日期', '渠道管理细分', '订单号')
yesterday_sales_check(kd, '宽带', '促销区局', '完工日期', '渠道管理细分', '订单号')
yesterday_sales_check(xiaoshoupin, '主要销售品', '(初始)发展区局', '安装日期', '渠道管理细分', '(初始)订单号')
yesterday_sales_check(yun, '家庭云', '发展区局', '促销时间', '发展渠道管理细分', '资产ID')
yesterday_sales_check(wifi, '全屋WIFI', '发展区局', '促销时间', '发展渠道管理细分', '订单号')
yesterday_sales_check(kanjia, '天翼看家', '发展区局', '促销时间', '发展渠道管理细分', '订单号')
yesterday_sales_check(guanjia, '小翼管家', '协销区局', '统计日期', '协销渠道', '是否协销')
yesterday_sales_check(bobotv, '播播TV', '区局', '注册时间', '渠道细分', '累计完成数据')