前言:由於清單較多,除了判斷文件大小是否變大外(而且只能判斷是不是更新了),無法獲知數據是否有異常,必須每天手動打開,清單一多費時費力(比如我現在每天就有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', '區局', '註冊時間', '渠道細分', '累計完成數據')