1 import pandas as pd 2 3 # 異常值 ——遠離正常值范圍的錯誤值 4 # 異常值 ——刪掉 5 6 # 異常值判斷 ——3σ 箱線圖分析 7 8 # 3σ 接住標准正態部分得到的規律——99.73%都在(μ-3α,μ+3α)之間,超過這個范圍的數據認為是異常的 9 10 def three_sigma(data): 11 """ 12 進行3sigma異常值剔除 13 :param data: 原數據——series 14 :return: bool數組 15 """ 16 17 # 上限 18 up = data.mean() + 3 * data.std() 19 # 下線 20 low = data.mean() - 3 * data.std() 21 22 # 在上限與下限之間的數據是正常的 23 bool_index = (data < up) & (data > low) 24 25 return bool_index 26 27 28 def box_analysis(data): 29 """ 30 箱線圖分析去除異常值 31 :param data: 原數據——series 32 :return: bool數組 33 """ 34 # 上四分位數 35 qu = data.quantile(q=0.75) 36 # 下四分位數 37 ql = data.quantile(q=0.25) 38 # 計算四分位間距 39 iqr = qu - ql 40 41 # 上限 42 up = qu + 1.5 * iqr 43 # 下限 44 low = ql - 1.5 * iqr 45 46 bool_index = (data < up) & (data > low) 47 48 return bool_index 49 50 51 # 驗證——加載detail 52 detail = pd.read_excel("../day05/meal_order_detail.xlsx") 53 print("detail的列索引: \n", detail.columns) 54 print("detail的形狀: \n", detail.shape) 55 56 # 對amounts列進行異常值處理 57 bool_index = three_sigma(detail.loc[:, "amounts"]) 58 bool_index = box_analysis(detail.loc[:, "amounts"]) 59 print("bool_index: \n", bool_index) 60 61 # 獲取異常值處理之后的結果 62 detail = detail.loc[bool_index, :] 63 print("異常值處理之后的結果: \n", detail.shape)