數據分析——數據校驗

  不少時候在數據分析以前,咱們須要對樣本進行校驗,以肯定樣本的價值。html

  先寫入數據:app

import pandas as pd
import numpy as np

df = pd.DataFrame({'一班':[90,80,66,75,99,55,76,78,98,None,90],
                   '二班':[75,98,100,None,77,45,None,66,56,80,57],
                   '三班':[45,89,77,67,65,100,None,75,64,88,99]})

 

1完整性校驗

# 判斷是否爲缺失值(空值)
df.isnull()

# 統計出每一列的缺失值數目
df.isnull().sum()

# 每一列缺失比例
df.isnull().sum()/df.shape[0]
# 判斷非空值的數目
df.notnull().sum()

  筆記:這裏也能夠用到describe方法,以下:函數

# 使用describe方法查看數據的完整性,統計出了非空值的數目
df.describe().iloc[0,:]

  忘了describe方法的話,請查看《Python之Pandas知識點post

 

2時間跨度檢驗

  不少樣本的時間數據並非以datatime64類型存儲的,此時咱們得先進行「數據類型修改」url

  詳見:《Python之Pandas知識點》的4.3數據修改spa


  以後進行最大最小相減就OK了。code

print(date.max()-date.min())

 

3重複檢驗

# 二班和四班是相同的
df1 = pd.DataFrame({'一班':[90,80,66,90,99,55,76,90,98,None,90],
                   '二班':[75,98,100,75,77,45,None,75,56,80,57],
                   '三班':[45,89,77,45,65,100,None,45,64,88,99],
                   '四班':[75,98,100,75,77,45,None,75,56,80,57]})

 

3.1樣本重複檢驗(行)

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)htm

  • subset:表示以這幾個特徵爲基礎,對總體樣本進行去重。默認爲使用全部特徵
  • keep:表示保留第幾個重複的樣本。只容許填入first(保留第一個),last(保留最後一個),False(只要存在重複均不保留)。默認爲first
  • inplace:表示是否在原DataFrame上進行操做,會改變原數據。默認爲False
# 刪除重複樣本(行)
df1.drop_duplicates()

# 計算樣本重複率
(df1.shape[0] - df1.drop_duplicates().shape[0])/df1.shape[0]

 

3.2特徵重複檢驗(列)

  特徵重複檢驗相比樣本重複檢驗要麻煩一點,由於沒有現成的函數可調用。blog

  須要用到類似度的概念,以下:get

  • pearson類似度
  • spearman類似度
  • kendall類似度
# 使用pandas的方法:DataFrame.corr(method='pearson')
asso = df1.corr()
# 輸出asso,看一下是怎樣的先
print(asso)

  不難看出,這是一個對稱矩陣,因此咱們只須要判斷右上半角的數據即可。

# 輸出應刪除的columns,1.0可根據需求改動
delCol = []
for i in range(len(asso)):
    for j in range(i+1,len(asso)):
        if asso.iloc[i,j] == 1.0:
            delCol.append(asso.columns[j])
        
print(delCol)

 

最後,附上一段 ♦特徵重複檢驗♦ 的自定義代碼:

# 輸入DataFrame,輸出特徵重複的列名,可直接複製調用
def drop_features(data,way = 'pearson',assoRate = 1.0):
    '''
    此函數用於求取類似度大於assoRate的兩列中的一個,主要目的用於去除數值型特徵的重複
    data:數據框,無默認
    assoRate:類似度,默認爲1
    '''
    assoMat = data.corr(method = way)
    delCol = []
    length = len(assoMat)
    for i in range(length):
        for j in range(i+1,length):
            if asso.iloc[i,j] >= assoRate:
                delCol.append(assoMat.columns[j])
    return(delCol)

  效果以下:

drop_features(df1)

 

  是否是超好用,巨方便~~~不謝

相關文章
相關標籤/搜索