1 import pandas as pd 2 import numpy as np 3 4 # 加载数据 5 data = pd.read_excel("../day07/qs.xlsx") 6 # print("data: ", data) 7 print("data的列索引: ", data.columns) 8 print("data的数据类型: ", data.dtypes) 9 10 # 1、检测缺失值 11 # isnull 检测缺失值 经常和sum连用, 推荐使用 12 res_null = pd.isnull(data).sum() 13 print("res: ", res_null) 14 # notnull 检测缺失值 经常和sum连用 15 print("data的形状: ", data.shape) 16 res = pd.notnull(data) 17 print("res: ", 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("删除之后的结果: ", data) 30 31 32 # 填充法: 不会造成数据丢失,但是可能会影响数据的分布,可能会影响最终结果 33 # 只要不影响数据分布或者对结果影响不是很大的情况 34 # 数值型 ——可以使用均值、众数、中位数来填充,也可以使用这一列的上下邻居数据来填充 35 # 类别数据(非数值型) ——可以使用众数来填充,也可以使用这一列的上下邻居数据来填充 36 # 使用众数来填充非数值型数据 37 # (1)计算指标 38 mode = data.loc[:, "门店编号"].mode()[0] 39 print("mode: ", 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("填充之后的结果: ", 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("线性插值: ", linear_1([6, 7])) # [13. 15.] 注意不是1是第一个索引 74 # print("线性插值: ", linear_1([5, 6])) # [11. 13.] 75 print("线性插值: ", linear_2([6, 7])) # [76. 102] 76 print("线性插值: ", 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("拉格朗日: ", la_1) # [13, 15] 83 print("拉格朗日: ", 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: ", data) 97 # 替换之后,可以删除、填充、插值 98 data.loc[:, "门店编号"].fillna(value=mode, inplace=True) 99 print("最终的data: ", data) 100 print(type(np.nan))