一、缺失值處理辦法匯總


檢測缺失值:

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.]

 

三、、隨機森林模擬數據法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM