检测缺失值:
1 # 检测缺失值 2 # isnull --判定,如果是缺失值,---True 如果不是,---False --和sum连用 --统计各列的缺失值个数 3 # notnull --判定,如果有值,True,如果缺失,--False,和sum连用 --count类似--统计非空数据的数目 4 # print('缺失值检测:\n', pd.isnull(data).sum()) ---推荐 5 # print('缺失值检测:\n', pd.notnull(data).sum())
1 pd.DataFrame.info() 2 #直接查看个行列的具体信息
1 np.nan()
一、业务法
1.直接删除
优点:简单粗暴
缺点:容易造成数据的大量丢失,造成观测样本缺少
建议使用场景:只有当整行或者整列为丢失的情况下删除
参数:pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None,inplace=False)

2.填充特定字段
使用建议:
- 数据特征可分为数值型和类别型,两者出现缺失值时的处理方法也是不同的。
-
-
缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。
-
缺失值所在特征为类别型时,则选择使用众数来替换缺失值
-
-
使用场景:
- 只要不影响数据分布或者对结果影响不是很大的情况下,可以使用,根绝业务场景进行判断
- 优点:不会造成数据丢失,但是可能会影响数据的分布,造成结果误差
参数:pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False,limit=None)

二、插值法
拟合一定的关系来进行数据的填充,用现有的数据拟合未知的数据。
在使用 插值法,
(1)如果真实数据的关系 是线性的, 那么使用线性插值、拉格朗日插值、样条插值---结果都是可以接受的
(2)如果真实数据的关系 是非线性的,那么使用线性插值的结果与真实结果存在差异,
(3)而样条插值、拉格朗日插值效果明显会比线性插值较好一些
如果遇到插值 ---推荐使用拉格朗日插值、样条插值
特殊字符的缺失值--无法检测 如:* ? : ' ' ! ...
1.线性插值
拟合线性关系进行插值
1 # 导入插值模块 2 from scipy.interpolate import interp1d # 线性插值模块 3 from scipy.interpolate import lagrange # 拉格朗日插值模块 4 from scipy.interpolate import spline # 样条插值模块(新版本--移除了,使用interp1d进行样条插值) 5 6 # 创建插值数据 7 # 用现有的数据---去拟合未知的数据 8 # 长度一样的 9 x = np.array([1, 2, 3, 4, 5, 8, 9]) 10 y = np.array([3, 5, 7, 9, 11, 17, 19]) 11 z = np.array([2, 8, 18, 32, 50, 128, 162]) 12 13 # 使用x来分别按照线性插值、拉格朗日插值、样条插值 来 拟合出 y z中缺失的值 14 # 线性插值 15 # x-->用来拟合的数据 16 # y --->需要被拟合的数据 17 # 用x 来拟合y 18 # kind='linear' ---线性的拟合 19 linear_1 = interp1d(x=x, y=y, kind='linear') 20 linear_2 = interp1d(x=x, y=z, kind='linear') 21 22 print('使用线性拟合来拟合数据:\n', linear_1([6, 7])) # 填写x确实的值来预测y为[ 13. 15.] 23 print('使用线性拟合来拟合数据:\n', linear_2([6, 7])) # 填写x确实的值来预测预测z[ 76. 102.]
2.多项式插值
1 # 样条插值 2 # xk--->用来拟合的数据 3 # yk ---> 需要被拟合的数据 4 # print(spline(xk=x, yk=y, xnew=[6, 7])) # [ 13. 15.] 5 # print(spline(xk=x, yk=z, xnew=[6, 7])) # [ 72. 98.]
3.拉格朗日插值法
思路:找一个基准数组x,里面缺失值的位置和真实的数据y缺失值的位置一样。然后用x去拟合y
# 拉格朗日插值 # 使用x 借助拉格朗日多项式 来拟合 y z # 拉格朗日插值模块 # x --->用来拟合的数据 # w --->需要被拟合的数据
from scipy.interpolate import lagrange # 拉格朗日插值模块
la1 = lagrange(x=x, w=y)la2 = lagrange(x=x, w=z)print('使用拉格朗日拟合数据:\n', la1([6, 7])) # [ 13. 15.]print('使用拉格朗日拟合数据:\n', la2([6, 7])) # [ 72. 98.]
万能代码:
import pandas as pd from scipy.interpolate import lagrange import numpy as np # 借助拉格朗日插值模块来进行具体数值的插值 # 以qs文件为例来进行插值缺失值 data = pd.read_excel('./qs.xlsx') print('data:\n', data) # 展示的小数 保留 2位小数 # 保留两位小数 pd.set_option('display.float_format', lambda x: '%.1f' % x) # 插值 类别ID # 定义插值函数 # 确定以 前后多少个 数据来进行构建 (拉格朗日)关系 n = 5 # 循环去查看缺失值的位置 for i in range(data.shape[0]): # i 代表行下标 # print(i) # 判定如果是缺失值,就进行插值 if np.isnan(data.iloc[i, 1]): # print(i) if i - n <= 0:#当起始值为1时候 start = 0 else: start = i - n # 获取 缺失值的 前后的 n个数据 mask = data.iloc[start:i + n + 1, 1] print(mask) # 获取已知的序列 ---以 index为已知的序列x, # 如果不是 0 1 2 3 这样有序的 行索引---reset_index x = mask.index # 在x 中 剔除 缺失缺失位置 x # mask.notnull() ---->bool数组 ---有值就是True,无值就是False x = x[mask.notnull()] print('x:\n', x) # 获取 y ---在mask中选择 为True 的数据 y = mask[mask.notnull()].values print('y:\n', y) # 进行拟合 ---拉格朗日多项式来拟合 # 构建拉格朗日对象 la = lagrange(x=x, w=y) # 拟合 data.iloc[i, 1] = la([i]) print('插值之后的结果:\n',data)
4.样条插值
. 拟合样条曲线关系
1 # 样条插值 2 # xk--->用来拟合的数据 3 # yk ---> 需要被拟合的数据 4 from scipy.interpolate import spline # 样条插值模块(新版本--移除了,使用interp1d进行样条插值)
5 print(spline(xk=x, yk=y, xnew=[6, 7])) # [ 13. 15.]
6 print(spline(xk=x, yk=z, xnew=[6, 7])) # [ 72. 98.]
三、、随机森林模拟数据法