• 【数据分析&数据挖掘】缺失值的检测与处理——删除法、填充法&插值法


      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))
  • 相关阅读:
    ffmpeg通过组播udp推ts流
    C# 多线程总结
    《图解HTTP》6-首部
    官网下载Java连接MySql驱动jar包
    FineReport——JDBC 连接 MySQL 数据库
    serializeArray()方式请求,php获取的方法
    win10无线wifi总是掉线断网
    C# Post请求中Json格式写法
    Layui upload 上传有进度条
    java 基于redis分布式锁
  • 原文地址:https://www.cnblogs.com/Tree0108/p/12116125.html
Copyright © 2020-2023  润新知