數據預處理:使用Hive,Scipy 和 data.describe( )處理缺失值的方法

在數據預處理過程中,空值的處理主要有以下三種處理方式:

  1. 刪除記錄:當原始數據量大,空值數據所佔比例較小,對結果影響不大時,可以對其進行丟棄處理。
  2. 插值:當原始數量較少,直接刪除空值會造成樣本量不足,可能會改變變量的原有分佈。此時,可以利用現有變量的信息,對空值進行填補。
  3. 不處理

Note:有時對於異常值,也會先將其置爲空值,然後根據情況使用以下方法處理。

可以使用多種處理方法:

  • data.describe( ):刪除記錄

       describe() 函數可以查看數據的基本情況,包括:count 非空值數、mean 平均值、std 標準差、max 最大值、min 最小值、(25%、50%、75%)分位數等。

       len(data) 是數據的記錄數

STEP1:統計數據中空值的記錄數爲:

explore=data.describe().T    #轉置後方便查閱
explore['null']=len(data)-explore['count']   #空值的記錄數=總記錄數-非空值記錄數

得到了數據中空值的記錄數,則可以估量選用哪種處理方式。

STEP2:丟棄空值記錄,並存儲結果

(1)、丟棄屬性 sum_yr_1 且   sum_yr_2 爲 空 的記錄(==保留sum_yr 不爲空的記錄)

(2)、丟棄屬性 sum_yr 爲 的、avg_discount 不爲0、seg_km_sum 爲0的記錄(==保留 sum_yr 非0的,或者 avg_discount 與 seg_km_sum 同時爲0的記錄)

data = data[ data['SUM_YR_1'].notnull()*data['SUM_YR_2'].notnull() ]  #保留非空值

secdata1 = data['SUM_YR_1']!=0
secdata2 = data['SUM_YR_2']!=0
secdata3 = (data['SEG_KM_SUM']==0) & (data['avg_discount']==0)  #與

data = data[ secdata1 | secdata2 | secdata3 ]  #或
  • Hive:刪除記錄

STEP1:統計數據中某幾個字段的空值記錄數(HiveQL)

use mysql  /*聲明要使用的數據庫*/

create table t_null_count as 
select * from
(select count(*) as sum_yr_null_count from air_data_base where sum_yr is null)
sum_yr_null_count,
(select count(*) as avg_kr_null_count from air_data_base where avg_kr is null)
avg_kr_null_count;

表 t_null_count 中是各個屬性的空值記錄數,根據記錄數分析要選用哪種方式處理空值。

STEP2:丟棄空值記錄,並存儲結果

(1)、丟棄屬性 sum_yr 爲 空 的記錄,將結果存儲在 t_sumyr_notnull 表

create table t_sumyr_notnull as
select * from air_data_base where sum_yr is not null;

(2)、丟棄屬性 avg_kr 爲 的記錄,將結果存儲在 t_avgkr_not_0 表

create table t_avgkr_not_0 as 
select * from t_sumyr_notnull where avg_kr<>0;

 

  • Scipy:插值

拉格朗日法進行插值:

import pandas as pd
from scipy.interpolate import lagrange  #導入拉格朗日插值函數

inputfile='inputsale.csv'
outputfile='sales.xls'

data=pd.read_csv(inputfile)

#自定義列向量插值函數
def ployinterp_column(s,n,k=5):   # s 列向量,n 被插值的位置,k 取前後的數據個數
  y=s[list(range(n-k,n) + list(range(n+1,n+1+k))]   #使用缺失值前後各5個未缺失的數據參與建模
  y=y[y.notnull()]  #剔除空值
  return lagrange(y.index, list(y))(n)  #插值並返回插值結果

#逐個元素判斷是否需要插值
for i in data.columns:
  for j in range(len(data)):
      if(data[i].isnull())[j]:    如果爲空,那麼進行插值
        data[i][j] = ployinterp_column(data[i],j)

data.to_excel(outputfile)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章