Pandas:写了一个简易的销量异常检测器

前言:由于清单较多,除了判断文件大小是否变大外(而且只能判断是不是更新了),无法获知数据是否有异常,必须每天手动打开,清单一多费时费力(比如我现在每天就有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', '区局', '注册时间', '渠道细分', '累计完成数据')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章