1 import pandas as pd 2 import numpy as np 3 4 # 加載數據 5 data = pd.read_excel("../day07/qs.xlsx") 6 # print("data: \n", data) 7 print("data的列索引: \n", data.columns) 8 print("data的數據類型: \n", data.dtypes) 9 10 # 1、檢測缺失值 11 # isnull 檢測缺失值 經常和sum連用, 推薦使用 12 res_null = pd.isnull(data).sum() 13 print("res: \n", res_null) 14 # notnull 檢測缺失值 經常和sum連用 15 print("data的形狀: \n", data.shape) 16 res = pd.notnull(data) 17 print("res: \n", res) # 輸出bool-Dataframe 18 19 # 2、處理缺失值 20 # 刪除法: 簡單,但是容易造成數據的大量丟失 21 # how = "any" ——只要有缺失值就刪除 22 # how = "all" ——只有全行或者全列都為缺失值才刪除 23 # axis 24 # inplace 25 print("~"*60) 26 data.dropna(how="any", axis=0, inplace=True) 27 data.dropna(how="any", axis=1, inplace=True) 28 data.dropna(how="all", axis=0, inplace=True) 29 print("刪除之后的結果: \n", data) 30 31 32 # 填充法: 不會造成數據丟失,但是可能會影響數據的分布,可能會影響最終結果 33 # 只要不影響數據分布或者對結果影響不是很大的情況 34 # 數值型 ——可以使用均值、眾數、中位數來填充,也可以使用這一列的上下鄰居數據來填充 35 # 類別數據(非數值型) ——可以使用眾數來填充,也可以使用這一列的上下鄰居數據來填充 36 # 使用眾數來填充非數值型數據 37 # (1)計算指標 38 mode = data.loc[:, "門店編號"].mode()[0] 39 print("mode: \n", mode) 40 # (2)填充 41 # 如果使用指標來填充,只需要value與inplace 42 data.loc[:, "門店編號"].fillna(value=mode, inplace=True) 43 44 # 填充類別id與商品id ——都為整數,可以使用指標——眾數 45 # 使用上下鄰居來填充 46 # method = backfill 或者 bfill 下一個非空鄰居 47 # method = pad 或者ffill 上一個非空鄰居 48 data.loc[:, "類別ID"].fillna(method="backfill", inplace=True) 49 data.loc[:, "類別ID"].fillna(method="bfill", inplace=True) 50 data.loc[:, "類別ID"].fillna(method="ffill", inplace=True) 51 data.loc[:, "類別ID"].fillna(method="pad", inplace=True) 52 print("填充之后的結果: \n", data) 53 54 55 # 插值法 56 # 線性插值 ——你和線性關系進行插值 57 # 多項式插值 ——擬合多項式進行插值 58 # 拉格朗日多項式插值、牛頓多項式插值 59 # 樣條插值 ——擬合曲線進行插值 60 x = np.array([1, 2, 3, 4, 5, 8, 9]) 61 y = np.array([3, 5, 7, 9, 11, 17, 19]) 62 z = np.array([2, 8, 18, 32, 50 ,128, 162]) 63 from scipy.interpolate import spline 64 from scipy.interpolate import interp1d 65 from scipy.interpolate import lagrange 66 67 # 線型插值 68 linear_1 = interp1d(x=x, y=y, kind="linear") 69 linear_2 = interp1d(x=x, y=z, kind="linear") 70 linear_3 = interp1d(x=x, y=y, kind="cubic") 71 72 73 print("線性插值: \n", linear_1([6, 7])) # [13. 15.] 注意不是1是第一個索引 74 # print("線性插值: \n", linear_1([5, 6])) # [11. 13.] 75 print("線性插值: \n", linear_2([6, 7])) # [76. 102] 76 print("線性插值: \n", linear_3([6, 7])) # [76. 102] 77 78 # 拉格朗日插值 79 la_1 = lagrange(x=x, w=y) 80 la_2 = lagrange(x=x, w=y) 81 82 print("拉格朗日: \n", la_1) # [13, 15] 83 print("拉格朗日: \n", la_2) # [72, 98] 84 85 # 樣條插值 ——擬合曲線進行差池 86 print(spline(xk=x, yk=y, xnew=[6, 7])) # [13, 15] 87 print(spline(xk=x, yk=z, xnew=[6, 7])) # [72, 98] 88 89 # 對於線型關系,線型插值,表現良好,多項式插值,與樣條插值也表現良好 90 # 對於非線型關系,線型插值,表現不好,多項式插值,與樣條插值表現良好 91 # 推薦如果想要使用插值方式,使用拉格朗日插值和樣條插值 92 93 94 # 對於非NaN類型的數據——先將非NaN類型的數據轉化為np.nan 95 data.replace("*", np.nan, inplace=True) 96 print("data: \n", data) 97 # 替換之后,可以刪除、填充、插值 98 data.loc[:, "門店編號"].fillna(value=mode, inplace=True) 99 print("最終的data: \n", data) 100 print(type(np.nan))