檢測缺失值:
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.]
三、、隨機森林模擬數據法