資料預處理(資料清洗)的一般方法及python實現

angan3830發表於2019-01-28

資料預處理的一般方法及python實現

這是一個大資料的時代。我們在很多時候都要處理各種各樣的資料。但是並非所有資料都是拿來即可使用,都是要先經過一番處理後才能進行下一步操作。在我們爬到資料或者要處理一份資料檔案時,首先要對資料進行清洗和除噪。本文就總結一下,一般資料預處理過程中可能要用到的方法。

  

 

1.查詢資料的缺失值

在拿到第一份原始資料的時候,首先要檢查資料的完整性。因為在建立模型進行迴歸分類分析的時候,通常需要一份完整的資料檔案。除非特定的例如XGBM的演算法,可以在有缺失值的基礎上得出運算結果。

以下,是對資料的缺失值的查詢,並計算出相應的比例。

 

def missing_values_table(df):

        # Total # of missing values

        mis_val = df.isnull().sum()

       

        # Proportion of missing values

        mis_val_percent = 100 * mis_val / len(df)

       

        # Create a table containing the results

        mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)

       

        # Set column names

        mis_val_table_ren_columns = mis_val_table.rename(

        columns = {0 : 'Number of Missing Values', 1 : 'Percentage of Total Values (%)'})

       

        # Sort the table by percentage of missing values (descending order)

        mis_val_table_ren_columns = mis_val_table_ren_columns[

            mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(

        'Percentage of Total Values (%)', ascending = False).round(3)

        

        # Print summary information

        print ("The dataframe has " + str(df.shape[1]) + " columns.\n"     

            "There are " + str(mis_val_table_ren_columns.shape[0]) +

              " columns having missing values.")

       

        # Results output

        return mis_val_table_ren_columns

 

mis_train = missing_values_table(pro_train)

print(mis_train)

 

 

 

2. 缺失值的處理

對於確實值的處理,我們有兩種方式。第一是直接將缺失值所在的行或者列刪除,第二則是用其他資料的平均值,眾數,或者上下值來填充這個資料表格中的缺失值。

一:直接刪除有缺失值的

使用dropna()函式,可以刪除所有又缺失值的行

Train=train.dropna()

 

或者,可以在後面新增feature,選擇你要刪除哪些feature的缺失項。這是因為有些特徵對於結果的影響非常的重要,哪怕有很大的缺失率(達到60%-70%),也依然要將其保留,然後用其他值去填充進去。

pro_train.dropna(subset=['CNT_FAM_MEMBERS','AMT_ANNUITY','AMT_GOODS_PRICE',

                         'EXT_SOURCE_2','OBS_30_CNT_SOCIAL_CIRCLE',

                         'DEF_60_CNT_SOCIAL_CIRCLE','OBS_60_CNT_SOCIAL_CIRCLE',

                         'DEF_30_CNT_SOCIAL_CIRCLE','NAME_TYPE_SUITE'], inplace = True)

       

mis_train = missing_values_table(pro_train)

 

 

 

 

二.使用平均值或者其他值來填充缺失項

用均值填:

data['volumn'] = data['volumn'].fillna(data['volumn'].mean()))

 

用前後值填:

data['volumn'] = data['volumn'].fillna(method='pad')

data['volumn'] = data['volumn'].fillna(method='bfill')

 

 

 

3. 用一列資料來篩選另一列的資料

 

例如,要用一列滬交所的股票程式碼,把一串資料中(包括所有滬深兩市和可轉債)的資料中篩選出來。

index = df1[‘symbol’].isin(df2['code'])

 

outfile = df1[index]

 

 

4. 聚合分類groupby的使用

做資料分析的時候,經常要把一類相同型別的資料整合起來做分析。以股市為例,我們可能會要整合tickdata,也可能以股票的程式碼為標的來進行整合。然後再對聚合後的資料來進行篩選(以聚合好的資料為參考物件,比如聚合好求均值,去除均值小於某一個數值的所有項)。

以下是我自己想出來用dataframe解決此類問題的一種方式,應該會有更簡單的解決方法,歡迎留言談論。

 

grouped2=train['volumepercent'].groupby(train['symbol'])

symbolmean=grouped2.sum()

select=pd.DataFrame(symbolmean)

a=select[(select["volumepercent"]>y1) & (select["volumepercent"]<y2) ].index.tolist()

 

 

另一方面,可能會用到連續求兩次聚合的情況,例如第一次取平均,第二次取中位數。

以下也是我個人的解決方法,因為直接處理dataframe 的結構有點問題,所以我是處理好第一步以後,存了個新檔案再讀取做第二步的處理。

grsz=outfilesz.groupby([outfilesz['symbol'], outfilesz['start']])

sz=grsz.mean()

sz.to_csv('dealsz.csv')

 

new2=pd.read_csv('dealsz.csv')

grrsz=new2.groupby(new2['start'])

medsz=grrsz.median()

medsz.to_csv('sz_medianvalue.csv')

 

 

5. 選取或者刪除某些特定的行

 

刪除帶有特定字元的行:

Outfile=ourfile[~ outfile[‘symbol’].str.contains(‘SS’)]

 

 

~是不包含的意思。

簡單篩選:

c=train.loc[train["Churn"] == "Yes"]

 

 

 

6. 和並列

Final=pd.contact([a,b,c,d],axis=1)

 

這是把列合併起來。

 

7.  將非數字資訊轉化為數字資訊

有許多影響因素是不是數字因素,是文字因素。比如調查網路使用狀況的時候,可能會有移動聯通電信之類的分別,要將其轉化為1,2,3等數字來觀察其相關性及一系列問題。

對於兩種feature和兩種以上feature有些許不同,一個採用標籤編碼,一個採用單熱編碼。

 

# Categorical features encoding

# Label encoding for columns with 2 or fewer classes

LE = LabelEncoder()

for f in pro_train:

    if pro_train[f].dtype == 'object':

        if len(list(pro_train[f].unique())) <= 2:

            LE.fit(pro_train[f])

            pro_train[f] = LE.transform(pro_train[f])

            pro_test[f] = LE.transform(pro_test[f])

 

# One-hot encoding for the rest categorical features (classes >=3)

pro_train = pd.get_dummies(pro_train)

pro_test = pd.get_dummies(pro_test)

 

print('Shape of training set : {}'.format(pro_train.shape))

print('Shape of testing set: {}' .format(pro_test.shape))

 

 

 

8. 計算不同feature之間的相關性

如果要做迴歸分類,要選取有相關性聯絡的feature來做模型,例如尼泊爾海嘯之類的因素要捨棄。但同時互相之間相關性較強的feature,在建立同一個模型的時候也要只留下一個即可。

correlations = app_train.corr()['MonthlyCharges'].sort_values()

 

可以將相關性做個排序。

也可以用隨機森林來篩選出相關性最高的feature,精確度很高,但若是資料量大的話,這速度會非常的慢。之後會總結一下隨機森林的相關知識和程式碼。

 

資料清洗是一個很麻煩的工作,本文只是一小部分處理情況,之後可能還會來做類似的整理。

轉載於:https://www.cnblogs.com/yaniesta/p/10330523.html

相關文章