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)