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))