數據分析——數據校驗


  很多時候在數據分析之前,我們需要對樣本進行校驗,以確定樣本的價值。

  先寫入數據:

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知識點

 

2時間跨度檢驗

  很多樣本的時間數據並不是以datatime64類型存儲的,此時我們得先進行“數據類型修改”

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


  之后進行最大最小相減就OK了。

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)

  • 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特征重復檢驗(列)

  特征重復檢驗相比樣本重復檢驗要麻煩一點,因為沒有現成的函數可調用。

  需要用到相似度的概念,如下:

  • 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)

 

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


免責聲明!

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



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