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', '區局', '註冊時間', '渠道細分', '累計完成數據')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章