⼀、缺失值处理办法汇总
检测缺失值:
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 lagrangeimport 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.]
三、、随机森林模拟数据法