第5章 數(shù)據(jù)預(yù)處理_第1頁(yè)
第5章 數(shù)據(jù)預(yù)處理_第2頁(yè)
第5章 數(shù)據(jù)預(yù)處理_第3頁(yè)
第5章 數(shù)據(jù)預(yù)處理_第4頁(yè)
第5章 數(shù)據(jù)預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩103頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章數(shù)據(jù)預(yù)處理數(shù)據(jù)準(zhǔn)備數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)清洗數(shù)據(jù)標(biāo)準(zhǔn)化實(shí)戰(zhàn)1:運(yùn)動(dòng)員數(shù)據(jù)分析預(yù)處理實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理掌握數(shù)據(jù)預(yù)處理的基本流程。掌握數(shù)據(jù)清洗的基本方法。了解數(shù)據(jù)標(biāo)準(zhǔn)化的基本方法。掌握數(shù)據(jù)類型轉(zhuǎn)換的基本方法。5.1數(shù)據(jù)準(zhǔn)備數(shù)據(jù)的加載堆疊合并數(shù)據(jù)重疊合并數(shù)據(jù)5.1數(shù)據(jù)準(zhǔn)備5.1.1數(shù)據(jù)的加載-方法一importpandasaspddf=pd.read_csv("train.csv")#使用相對(duì)路徑加載數(shù)據(jù)df.head(100)#讀取前100條數(shù)據(jù)datetime season holiday workingday weather temp atemp humidity windspeed casual registered count0 2011-01-0100:00:00 1 0 0 1 9.84 14.395 81 0.0000 3 13 161 2011-01-0101:00:00 1 0 0 1 9.02 13.635 80 0.0000 8 32 40... ... ... ... ... ...98 2011-01-0507:00:00 1 0 1 1 7.38 9.090 43 12.9980 1 87 8899 2011-01-0508:00:00 1 0 1 1 8.20 9.090 40 19.9995 3 192 195100rows×12columns不僅可以讀取前100條數(shù)據(jù),在head()括號(hào)中的參數(shù)可以根據(jù)實(shí)際情況來改變具體的數(shù)據(jù)量。5.1數(shù)據(jù)準(zhǔn)備5.1.1數(shù)據(jù)的加載-方法二df=pd.read_csv("train.csv",chunksize=10)foriindf:print(i)“chunksize=10”參數(shù)能夠?qū)⑺袛?shù)據(jù)以一次10條的形式讀取出來,這樣可以減小對(duì)電腦內(nèi)存的壓力。注意此時(shí)返回的是一個(gè)可迭代的對(duì)象TextFileReader,可以通過for循環(huán)迭代讀取數(shù)據(jù)5.1數(shù)據(jù)準(zhǔn)備5.1.2堆疊合并數(shù)據(jù)pd.concat(objs,axis=0,join=‘outer’,join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,sort=None,copy=True)Pandas通過concat()函數(shù)能夠輕松地將Series與DataFrame對(duì)象組合在一起,用于沿某個(gè)特定的軸執(zhí)行連接操作。參數(shù)說明objs一個(gè)序列或者是Series、DataFrame對(duì)象axis表示在哪個(gè)軸方向上(行或者列)進(jìn)行連接操作,默認(rèn)axis=0表示行方向,即橫向拼接;axis=1表示列方向,即縱向拼接join指定連接方式,取值為{"inner","outer"},默認(rèn)為outer表示取并集,inner代表取交集ignore_index布爾值參數(shù),默認(rèn)為False,如果為True,表示不在連接的軸上使用索引join_axes表示索引對(duì)象的列表5.1數(shù)據(jù)準(zhǔn)備5.1.2堆疊合并數(shù)據(jù)#現(xiàn)將表構(gòu)成list,然后在作為concat的輸入In[4]:frames=[df1,df2,df3]#多個(gè)dataframeIn[5]:result=pd.concat(frames)相同字段的表首尾相接5.1數(shù)據(jù)準(zhǔn)備5.1.2堆疊合并數(shù)據(jù)result=pd.concat(frames,keys=['x','y','z'])不同字段的表首尾相接5.1數(shù)據(jù)準(zhǔn)備5.1.3重疊合并數(shù)據(jù)重疊合并數(shù)據(jù)并不常用。重疊合并數(shù)據(jù)是指當(dāng)兩組數(shù)據(jù)的索引完全重合或部分重合,且數(shù)據(jù)中存在缺失值時(shí),可以采用重疊合并的方式組合數(shù)據(jù),能將一組數(shù)據(jù)的空值填充為另一組數(shù)據(jù)中對(duì)應(yīng)位置的值。這里使用combine()函數(shù)將數(shù)據(jù)進(jìn)行重疊合并。5.2數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)分析與挖掘體系位置數(shù)據(jù)轉(zhuǎn)換的方法常見操作數(shù)據(jù)基本字段類型數(shù)據(jù)類型轉(zhuǎn)換過程5.2數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)轉(zhuǎn)換是有數(shù)據(jù)預(yù)處理中的一個(gè)過程,圖為在數(shù)據(jù)分析與數(shù)據(jù)挖掘框架系統(tǒng)中的位置5.2.1數(shù)據(jù)分析與挖掘體系位置5.2數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)標(biāo)準(zhǔn)化(DataStandardization):將數(shù)據(jù)按比例縮放,使數(shù)據(jù)都落在一個(gè)特定的區(qū)間。數(shù)據(jù)離散化(DataDiscretization):將數(shù)據(jù)用區(qū)間或者類別的概念替換。5.2.1數(shù)據(jù)轉(zhuǎn)換的方法5.2數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)標(biāo)準(zhǔn)化5.2.2數(shù)據(jù)轉(zhuǎn)換的方法數(shù)據(jù)標(biāo)準(zhǔn)化的目的是避免數(shù)據(jù)量級(jí)對(duì)模型的訓(xùn)練造成影響,數(shù)據(jù)標(biāo)準(zhǔn)化常見的方法有:最大-最小標(biāo)準(zhǔn)化、Z-Score標(biāo)準(zhǔn)化以及小數(shù)定標(biāo)標(biāo)準(zhǔn)化最大最小標(biāo)準(zhǔn)化。假設(shè)原始變量的值為x,使用最大最小標(biāo)準(zhǔn)化將其轉(zhuǎn)換到0和1之間的值為y,最大值定義為A,最小值定義為B,則:Z-Score標(biāo)準(zhǔn)化。通過總體數(shù)據(jù)的均值(μ),總體數(shù)據(jù)的標(biāo)準(zhǔn)差(σ)以及個(gè)體的觀測(cè)值(x),并代入Z-Score的公式即可實(shí)現(xiàn)標(biāo)準(zhǔn)化,公式如下。小數(shù)定標(biāo)標(biāo)準(zhǔn)化。小數(shù)定標(biāo)法是通過整體移動(dòng)變量的小數(shù)點(diǎn)位置達(dá)到標(biāo)準(zhǔn)化的目的。移動(dòng)的位數(shù)取決于變量的最大值。比如說,變量的最大值為789,則小數(shù)點(diǎn)需要移動(dòng)的位數(shù)是1000,那么就把變量中所有的數(shù)據(jù)除以1000,全部數(shù)據(jù)被規(guī)范到[-1,1]。5.2數(shù)據(jù)轉(zhuǎn)換數(shù)據(jù)離散化5.2.2數(shù)據(jù)轉(zhuǎn)換的方法數(shù)據(jù)離散化的方法與數(shù)據(jù)清理與數(shù)據(jù)規(guī)約的方法有重合之處。畢竟在數(shù)據(jù)預(yù)處理中,很多理念是相通的,數(shù)據(jù)離散化中較常用的方法有如下幾個(gè):分箱離散化、直方圖離散化、聚類分類離散化、相關(guān)度離散化等。分箱離散化。分箱離散化就是將數(shù)據(jù)排序,其次將數(shù)據(jù)分入等頻的箱中,將箱中的值統(tǒng)一替換成同樣的指標(biāo)值。分箱離散化對(duì)箱子的個(gè)數(shù)很敏感,同時(shí),當(dāng)數(shù)據(jù)中outlier很多時(shí),也容易影響分箱結(jié)果。直方圖離散化。直方圖離散化與分箱離散化是很相似的,它與分箱離散化都是無(wú)監(jiān)督技術(shù)。直方圖離散化通過將值分為相等的分區(qū),把值離散化到直方圖不同的柱中,保證直方圖每個(gè)柱中的數(shù)據(jù)相同,或者直方圖的每個(gè)柱子相隔同等距離。聚類分類離散化。不論是用聚類方法還是分類方法,都是將變量的值分為簇或組。簇或組內(nèi)的值用統(tǒng)一的屬性代替,由此實(shí)現(xiàn)離散化。相關(guān)度離散化。ChiMerge方法是相關(guān)度離散化的一種手段,它采取自下而上的方式,通過遞歸找到鄰近的區(qū)間,通過不斷的合并形成大區(qū)間。ChiMerge的合并依據(jù)是卡方檢驗(yàn)值,具有較小卡方值的數(shù)據(jù)會(huì)被合并在一起,之后不斷循環(huán)遞歸。5.2數(shù)據(jù)轉(zhuǎn)換簡(jiǎn)單函數(shù)變換5.2.3常見操作簡(jiǎn)單函數(shù)變換是對(duì)原始數(shù)據(jù)進(jìn)行某些數(shù)學(xué)函數(shù)的變換,常用的變換包括平方、開方、取對(duì)數(shù)、差分運(yùn)算等,即:數(shù)據(jù)變換的目的是將數(shù)據(jù)轉(zhuǎn)化為更方便分析的數(shù)據(jù)。簡(jiǎn)單的函數(shù)變換常用來將不具有正態(tài)分布的數(shù)據(jù)變換成具有正態(tài)分布的數(shù)據(jù)。在時(shí)間序列分析中,有時(shí)簡(jiǎn)單的對(duì)數(shù)變換或者差分運(yùn)算就可以將非平穩(wěn)序列轉(zhuǎn)換成平穩(wěn)序列。5.2數(shù)據(jù)轉(zhuǎn)換連續(xù)特征變換5.2.3常見操作連續(xù)特征變換的常用方法有三種:基于多項(xiàng)式的數(shù)據(jù)變換、基于指數(shù)函數(shù)的數(shù)據(jù)變換、基于對(duì)數(shù)函數(shù)的數(shù)據(jù)變換。連續(xù)特征變換能夠增加數(shù)據(jù)的非線性特征捕獲特征之間的關(guān)系,有效提高模型的復(fù)雜度。#encoding=utf-8importnumpyasnpfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.preprocessingimportFunctionTransformer#導(dǎo)入相關(guān)模塊X=np.arange(9).reshape(3,3)print(X)#多項(xiàng)式Xploy=PolynomialFeatures(2)print(ploy.fit_transform(X))#當(dāng)degree=2時(shí)ploy=PolynomialFeatures(3)print(ploy.fit_transform(X))#當(dāng)degree=3時(shí)X=np.array([[0,1],[2,3]])transformer=FunctionTransformer(np.log1p)#括號(hào)內(nèi)的就是自定義函數(shù)print(transformer.fit_transform(X))#正態(tài)化處理transformer=FunctionTransformer(np.exp)print(transformer.fit_transform(X))#指數(shù)函數(shù)處理多項(xiàng)式5.2數(shù)據(jù)轉(zhuǎn)換連續(xù)特征變換5.2.3常見操作多項(xiàng)式X運(yùn)行結(jié)果[[012][345][678]][[1.0.1.2.0.0.0.1.2.4.][1.3.4.5.9.12.15.16.20.25.][1.6.7.8.36.42.48.49.56.64.]]當(dāng)degree=2時(shí),以第二行為例,程序運(yùn)行結(jié)果當(dāng)degree=3時(shí),以第二行為例,程序運(yùn)行結(jié)果[[1.0.1.2.0.0.0.1.2.4.0.0.0.0.0.0.1.2.4.8.][1.3.4.5.9.12.15.16.20.25.27.36.45.48.60.75.64.80.100.125.][1.6.7.8.36.42.48.49.56.64.216.252.288.294.336.384.343.392.448.512.]]當(dāng)degree=3時(shí),以第二行為例,程序運(yùn)行結(jié)果[[0.0.69314718][1.098612291.38629436]]5.2數(shù)據(jù)轉(zhuǎn)換連續(xù)特征變換5.2.3常見操作多項(xiàng)式X運(yùn)行結(jié)果[[012][345][678]][[1.0.1.2.0.0.0.1.2.4.][1.3.4.5.9.12.15.16.20.25.][1.6.7.8.36.42.48.49.56.64.]]當(dāng)degree=2時(shí),以第二行為例,程序運(yùn)行結(jié)果當(dāng)degree=3時(shí),以第二行為例,程序運(yùn)行結(jié)果[[1.0.1.2.0.0.0.1.2.4.0.0.0.0.0.0.1.2.4.8.][1.3.4.5.9.12.15.16.20.25.27.36.45.48.60.75.64.80.100.125.][1.6.7.8.36.42.48.49.56.64.216.252.288.294.336.384.343.392.448.512.]]當(dāng)degree=3時(shí),以第二行為例,程序運(yùn)行結(jié)果[[0.0.69314718][1.098612291.38629436]]5.2數(shù)據(jù)轉(zhuǎn)換連續(xù)特征變換5.2.3常見操作指數(shù)函數(shù)處理多項(xiàng)式程序運(yùn)行結(jié)果[[1.2.71828183][7.389056120.08553692]]從上面的例子可以看出:生成多項(xiàng)式特征與自定義函數(shù),在輸入特征中增加非線性特征可以有效提高模型的復(fù)雜度,其中最常用的是多項(xiàng)式特征。5.2數(shù)據(jù)轉(zhuǎn)換5.2.4數(shù)據(jù)基本字段類型以小費(fèi)數(shù)據(jù)集(tips.csv)為例,介紹數(shù)據(jù)預(yù)處理中常用到的不同數(shù)據(jù)類型轉(zhuǎn)換方法。即分類型數(shù)據(jù)轉(zhuǎn)換成數(shù)值型數(shù)據(jù)、連續(xù)型數(shù)據(jù)轉(zhuǎn)換成離散型數(shù)據(jù)。tips包含244個(gè)樣本,對(duì)應(yīng)數(shù)據(jù)集的每行數(shù)據(jù)。每行數(shù)據(jù)包含每個(gè)樣本的七個(gè)特征(總消費(fèi)金額、小費(fèi)金額、顧客性別、顧客是否抽煙、聚餐的星期、聚餐的時(shí)間段、聚餐人數(shù)),所以tips數(shù)據(jù)集是一個(gè)244行7列的二維表。其中,總消費(fèi)金額(total_bill)和小費(fèi)金額(tip)均為連續(xù)型數(shù)據(jù)集;顧客性別(sex)、是否抽煙(smoker)、聚餐的星期(day)、聚餐的時(shí)間段(time)均為分類型數(shù)據(jù);聚餐人數(shù)(size)為離散型數(shù)據(jù)。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程讀取數(shù)據(jù)importpandasaspdtips=pd.read_csv('tips.csv')tips.head()5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程分類型轉(zhuǎn)數(shù)值型-map()函數(shù)df1=tips.copy()dict1={'Male':0,'Female':1}#設(shè)置字典參數(shù)df1.sex=df1.sex.map(dict1)dict2={'No':0,'Yes':1}df1.smoker=df1.smoker.map(dict2)dict3={'Sun':6,'Sat':5,'Thur':3,'Fri':4}df1.day=df1.day.map(dict3)dict4={'Dinner':0,'Lunch':1}df1.time=df1.time.map(dict4)df1.head()5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程分類型轉(zhuǎn)數(shù)值型-replace()函數(shù)df2=tips.copy()df2.sex=df2.sex.replace(df2.sex.unique(),[0,1])df2.smoker=df2.smoker.replace(df2.smoker.unique(),[0,1])df2.day=df2.day.replace(df2.day.unique(),[6,5,3,4])df2.time=df2.time.replace(df2.time.unique(),[0,1])df2.head()replace()函數(shù)可以把字符串中的舊字符串替換成新字符串,如果指定第三個(gè)參數(shù)max,則替換不超過max次。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程分類型轉(zhuǎn)數(shù)值型-LabelEncoder()函數(shù)df3=tips.copy()fromsklearn.preprocessingimportLabelEncoderdf3.sex=LabelEncoder().fit_transform(df3.sex)df3.smoker=LabelEncoder().fit_transform(df3.smoker)df3.day=LabelEncoder().fit_transform(df3.day)df3.time=LabelEncoder().fit_transform(df3.time)df3.head()LabelEncoder()函數(shù)可以將值轉(zhuǎn)換為0~n-1個(gè)類型,也可以用來將非數(shù)值的標(biāo)簽轉(zhuǎn)換為數(shù)值標(biāo)簽(需要確保非數(shù)值標(biāo)簽是可比的和可哈希的),即,將類型變量轉(zhuǎn)換為數(shù)值組成的數(shù)組。產(chǎn)生結(jié)果為連續(xù)型特征。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程分類型轉(zhuǎn)數(shù)值型-get_dummies()函數(shù)df4=tips.copy()df4=pd.get_dummies(df4.iloc[:,2:-1])#返回pd.DataFrame對(duì)象df4.head()get_dummies相當(dāng)于onehot編碼,常用與把離散的類別信息轉(zhuǎn)化為onehot編碼形式。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程分類型轉(zhuǎn)數(shù)值型-OneHotEncoder()函數(shù)df5=tips.copy()fromsklearn.preprocessingimportOneHotEncodermat=OneHotEncoder().fit_transform(df5.iloc[:,2:-1])#返回sparsematrix對(duì)象arr=arr.toarray()#返回np.array對(duì)象arr在sklearn包中,OneHotEncoder()函數(shù)非常實(shí)用,它可以實(shí)現(xiàn)將分類特征的每個(gè)元素轉(zhuǎn)化為一個(gè)可以用來計(jì)算的值。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程連續(xù)型轉(zhuǎn)離散型-等寬法data1=tips.copy()data1.total_bill=pd.cut(x=data1.total_bill,bins=4,labels=range(0,4))data1.tip=pd.cut(x=data1.tip,bins=4,labels=range(0,4))data1.head()等寬法是基于連續(xù)性變量的極差對(duì)變量進(jìn)行等差區(qū)間的劃分5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程連續(xù)型轉(zhuǎn)離散型-等頻法data2=tips.copy()data2.total_bill=pd.cut(x=data2.total_bill,bins=4,labels=range(0,4))data2.tip=pd.cut(x=data2.tip,bins=4,labels=range(0,4))data2.head()等頻法是基于區(qū)間內(nèi)數(shù)據(jù)點(diǎn)數(shù)量相等或相近的原則將連續(xù)性隨機(jī)變量劃分等頻的區(qū)間,即劃分后的不同區(qū)間內(nèi)的變量取值點(diǎn)數(shù)相同或相近。5.2數(shù)據(jù)轉(zhuǎn)換5.2.5數(shù)據(jù)類型轉(zhuǎn)換過程連續(xù)型轉(zhuǎn)離散型-二值化importnumpyasnpfromsklearn.preprocessingimportBinarizerdata3=tips.copy()arr1=np.array(data3.total_bill)data3.total_bill=Binarizer(threshold=20).transform(arr1.reshape(-1,1))arr2=np.array(data3.tip)data3.tip=Binarizer(threshold=5).transform(arr2.reshape(-1,1))data3.head()二值化常用方法是Binarizer類及其類方法transform()?;驹硎窃O(shè)置一個(gè)閾值threshold,當(dāng)記錄數(shù)據(jù)大于該閾值,則標(biāo)注為1,否則為0。5.3數(shù)據(jù)清洗導(dǎo)入與查看數(shù)據(jù)集缺失值處理重復(fù)值處理異常值處理5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集讀入CSV數(shù)據(jù)species:3個(gè)企鵝種類:阿德利巴布亞帽帶.culmen_length_mm:鳥的嘴峰長(zhǎng)度。culmen_depth_mm:鳥的嘴峰深度。flipper_length_mm:腳掌長(zhǎng)度。body_mass_g:體重。island:島嶼的名字。sex:企鵝的性別。本節(jié)選用帕爾默企鵝數(shù)據(jù)集,此數(shù)據(jù)集由KristenGorman博士和南極洲LTER的帕爾默科考站共同創(chuàng)建,包含344只企鵝的數(shù)據(jù)。importpandasaspddata=pd.read_csv('penguins_lter.csv')print(data)數(shù)據(jù)說明5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)data.head()#查看數(shù)據(jù)集前5行審視數(shù)據(jù)的核心目的是:觀察各數(shù)據(jù)字段的數(shù)據(jù)類型,分清楚連續(xù)型數(shù)據(jù)、分類型數(shù)據(jù)和時(shí)間型數(shù)據(jù),觀察數(shù)據(jù)有無(wú)缺失的部分。查看數(shù)據(jù)集前5行5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)data.tail()#查看數(shù)據(jù)集倒數(shù)5行審視數(shù)據(jù)的核心目的是:觀察各數(shù)據(jù)字段的數(shù)據(jù)類型,分清楚連續(xù)型數(shù)據(jù)、分類型數(shù)據(jù)和時(shí)間型數(shù)據(jù),觀察數(shù)據(jù)有無(wú)缺失的部分。查看數(shù)據(jù)后五行5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)()#查看數(shù)據(jù)集基本信息審視數(shù)據(jù)的核心目的是:觀察各數(shù)據(jù)字段的數(shù)據(jù)類型,分清楚連續(xù)型數(shù)據(jù)、分類型數(shù)據(jù)和時(shí)間型數(shù)據(jù),觀察數(shù)據(jù)有無(wú)缺失的部分。查看數(shù)據(jù)集基本信息。5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)data.columns#查看數(shù)據(jù)集列名查看數(shù)據(jù)集列名。5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)data.describe()#查看數(shù)據(jù)集的統(tǒng)計(jì)信息查看數(shù)據(jù)集統(tǒng)計(jì)信息5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視整體數(shù)據(jù)data.isna().sum()#查看數(shù)據(jù)集每一列有無(wú)空值查看數(shù)據(jù)集每一列有無(wú)空值。5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視局部數(shù)據(jù)(單行、列,多行、列)data.studyName#篩選指定列數(shù)據(jù)篩選指定列5.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視局部數(shù)據(jù)(單行、列,多行、列)data.studyName.value_counts(dropna=False)#查看列各值的個(gè)數(shù)查看數(shù)據(jù)集中指定列各值的個(gè)數(shù)PAL0910120PAL0809114PAL0708110Name:studyName,dtype:int645.3數(shù)據(jù)清洗5.3.1導(dǎo)入與查看數(shù)據(jù)集審視局部數(shù)據(jù)(單行、列,多行、列)data.iloc[4]:篩選第5行數(shù)據(jù)。data.iloc[0:4]:篩選指定行,第1-4行數(shù)據(jù)。data.iloc[:,0:4]:篩選數(shù)據(jù)集的第1-5列數(shù)據(jù)。data.iloc[[0,2,4],[3,4]]:篩選指定行,指定列,逗號(hào)前是行,后是列。篩選第1、3、5行數(shù)據(jù)的第4、5列數(shù)據(jù)。data.sort_values(by=[‘Age’],ascending=True):按照某一列的值從小到大排序。True為從小到大,F(xiàn)alse為從大到小。查看數(shù)據(jù)集行數(shù)據(jù)信息5.3數(shù)據(jù)清洗5.3.2缺失值處理缺失值處理方法5.3數(shù)據(jù)清洗5.3.2缺失值處理完全變量和不完全變量在數(shù)據(jù)集中,常將不含缺失值的變量稱為完全變量,數(shù)據(jù)集中含有缺失值的變量稱為不完全變量。在圖中‘CulmenLength’列與“CulmenDepth”列就屬于不完全變量,另外兩列屬于完全變量。5.3數(shù)據(jù)清洗5.3.2缺失值處理缺失數(shù)據(jù)的類型(1)隨機(jī)丟失(MAR,MissingatRandom)隨機(jī)丟失意味著數(shù)據(jù)丟失的概率與丟失的數(shù)據(jù)本身無(wú)關(guān),而僅與部分已觀測(cè)到的數(shù)據(jù)有關(guān)。即數(shù)據(jù)的缺失不是完全隨機(jī)的,該類數(shù)據(jù)的缺失依賴于其他完全變量。(2)完全隨機(jī)丟失(MCAR,MissingCompletelyatRandom)數(shù)據(jù)的缺失是完全隨機(jī)的,不依賴于任何不完全變量或完全變量,不影響樣本的無(wú)偏性。簡(jiǎn)單來說,就是數(shù)據(jù)丟失的概率與其假設(shè)值以及其他變量值都完全無(wú)關(guān)。(3)非隨機(jī)丟失(MNAR,MissingnotatRandom)數(shù)據(jù)的缺失與不完全變量自身的取值有關(guān)。分為兩種情況:缺失值取決于其假設(shè)值(例如,高收入人群通常不希望在調(diào)查中透露他們的收入);或者,缺失值取決于其他變量值(假設(shè)女性通常不想透露她們的年齡,則這里年齡變量缺失值受性別變量的影響)。5.3數(shù)據(jù)清洗5.3.2缺失值處理檢測(cè)缺失值Pandas可以用isnull(),isna(),notnull()和notna()四個(gè)方法來檢測(cè)缺失值。若要直觀地統(tǒng)計(jì)表中各列的缺失率,可以用自定義函數(shù)或者missingno庫(kù)來實(shí)現(xiàn)。方法說明isnull()若返回的值為True,說明存在缺失值notnull()若返回的值為False,說明存在缺失值isna()若返回的值為True,說明存在缺失值notna()若返回的值為False,說明存在缺失值isnull()若返回的值為True,說明存在缺失值5.3數(shù)據(jù)清洗5.3.2缺失值處理isnull()與notnull()第一步:創(chuàng)建并打印出二維數(shù)據(jù)importpandasaspdimportnumpyasnp#要使用NaN,NAN或nan都必須導(dǎo)入numpy庫(kù)#手動(dòng)創(chuàng)建一個(gè)DataFrame#注意:手動(dòng)創(chuàng)建的時(shí)候,空值必須用NumPy中的NaN、NAN或者nan占位df=pd.DataFrame({'序號(hào)':['S1','S2','S3','S4'],'姓名':['張千','李四','王五','趙六'],'性別':['男','男','女','男'],'年齡':[15,16,15,14],'住址':[np.nan,np.nan,np.nan,np.nan]})print(df)序號(hào)姓名性別年齡住址0S1張千男15NaN1S2李峰男16NaN2S3王詩(shī)女15NaN3S4趙德男14NaN5.3數(shù)據(jù)清洗5.3.2缺失值處理isnull()與notnull()第一步:創(chuàng)建并打印出二維數(shù)據(jù)importpandasaspdimportnumpyasnp#要使用NaN,NAN或nan都必須導(dǎo)入NumPy庫(kù)#手動(dòng)創(chuàng)建一個(gè)DataFrame或者用上篇方式讀取文件#注意:手動(dòng)創(chuàng)建的時(shí)候,空值必須用NumPy中的NaN、NAN或者nan占位df=pd.DataFrame({'序號(hào)':['S1','S2','S3','S4'],'姓名':['張千','李峰','王詩(shī)','趙德'],'性別':['男','男','女','男'],'年齡':[15,16,15,14],'住址':[np.nan,np.nan,np.nan,np.nan]})df.isna()序號(hào) 姓名 性別 年齡 住址0 False False False False True1 False False False False True2 False False False False True3 False False False False True5.3數(shù)據(jù)清洗5.3.2缺失值處理isna()與notna()若數(shù)據(jù)集中存在空值,則返回False。importpandasaspddata=pd.read_csv('penguins_lter.csv')data.notna()#查看數(shù)據(jù)集是否含有空值5.3數(shù)據(jù)清洗5.3.2缺失值處理isna()與notna()查看數(shù)據(jù)集每一列是否含有空值data.isna().sum()#查看數(shù)據(jù)集每一列是否有空值5.3數(shù)據(jù)清洗5.3.2缺失值處理處理缺失值刪除缺失值,Pandas中提供了刪除缺失值的dropna()方法。dropna()方法用于刪除缺失值所在的一行或一列數(shù)據(jù),并返回一個(gè)刪除缺失值后的新對(duì)象。DataFrame.dropna(axis=0,how=‘a(chǎn)ny’,thresh=None,subset=None,inplace=False)參數(shù)說明取值與舉例axis表示是否刪除包含缺失值的行或列0或’index’,代表按行刪;1或’columns’,代表按列刪。how表示刪除缺失值的方式any,當(dāng)任何值為NaN值時(shí)便刪除整行或整列;all,當(dāng)所有值都為NaN值時(shí)便刪除整行或整列。thresh表示保留至少有N個(gè)非NaN值的行或列數(shù)值,如thresh=3,那么只要這行或這列有3個(gè)及以上的非空值,就不刪除;subset表示刪除指定列的缺失值

inplace表示是否操作原數(shù)據(jù)True會(huì)直接修改原數(shù)據(jù)文件;False會(huì)修改原數(shù)據(jù)的副本。5.3數(shù)據(jù)清洗5.3.2缺失值處理處理缺失值使用常量填充,全局常量缺失值可以用0,均值、中位數(shù)、眾數(shù)等填充。#均值填充data['col']=data['col'].fillna(data['col'].means())#中位數(shù)填充data['col']=data['col'].fillna(data['col'].median())#眾數(shù)填充data['col']=data['col'].fillna(stats.mode(data['col'])[0][0])5.3數(shù)據(jù)清洗5.3.2缺失值處理處理缺失值插值填充,采用某種插入模式進(jìn)行填充,比如取缺失值前后值的均值進(jìn)行填充。#interpolate()插值法,缺失值前后數(shù)值的均值,但是若缺失值前后也存在缺失,則不進(jìn)行計(jì)算插補(bǔ)。df['c']=df['c'].interpolate()#用前面的值替換,當(dāng)?shù)谝恍杏腥笔е禃r(shí),該行利用向前替換無(wú)值可取,仍缺失df.fillna(method='pad')#用后面的值替換,當(dāng)最后一行有缺失值時(shí),該行利用向后替換無(wú)值可取,仍缺失df.fillna(method='backfill')#用后面的值替換5.3數(shù)據(jù)清洗5.3.2缺失值處理處理缺失值利用KNN算法填充,其實(shí)是把目標(biāo)列當(dāng)作目標(biāo)標(biāo)量,利用非缺失的數(shù)據(jù)進(jìn)行KNN算法擬合,最后對(duì)目標(biāo)列缺失進(jìn)行預(yù)測(cè)。(對(duì)于連續(xù)特征一般是加權(quán)平均,對(duì)于離散特征一般是加權(quán)投票),這里只做了解使用。隨機(jī)森林算法填充的思想和KNN填充是類似的,即利用已有數(shù)據(jù)擬合模型,對(duì)缺失變量進(jìn)行預(yù)測(cè)。此處只做了解使用。5.3數(shù)據(jù)清洗5.3.3重復(fù)值處理檢測(cè)重復(fù)值常見的數(shù)據(jù)重復(fù)分為兩種:①記錄重復(fù)(存在一個(gè)或幾個(gè)特征的某幾條記錄值完全相同)。②特征重復(fù)(存在一個(gè)或多個(gè)特征的名稱不同,但是數(shù)據(jù)完全相同)。Pandas中使用duplicated()方法來檢測(cè)數(shù)據(jù)中的重復(fù)值。檢測(cè)完數(shù)據(jù)后會(huì)返回一個(gè)由布爾值組成的Series類對(duì)象,該對(duì)象中若包含True,說明該值對(duì)應(yīng)的一行數(shù)據(jù)為重復(fù)項(xiàng)。DataFrame.duplicated(subset=None,keep=‘first’)subset表示識(shí)別重復(fù)項(xiàng)的列索引或列索引序列。默認(rèn)標(biāo)識(shí)所有的列索引。keep表示采用哪種方式保留重復(fù)項(xiàng)?!癴irst”為默認(rèn)值,刪除重復(fù)項(xiàng),僅保留第一次出現(xiàn)的數(shù)據(jù)項(xiàng)?!發(fā)ast”,刪除重復(fù)項(xiàng),僅保留最后一次出現(xiàn)的數(shù)據(jù)項(xiàng)。importpandasaspdimportnumpyasnpstu_info=pd.DataFrame({'序號(hào)':['S1','S2','S3','S4','S4'],'姓名':['張三','李四','王五','趙六','趙六'],'性別':['男','男','女','男','男'],'年齡':[15,16,15,14,14],'住址':['蘇州','南京',np.nan,np.nan,np.nan]})#檢測(cè)stu_info對(duì)象中的重復(fù)值stu_info.duplicated()0False1False2False3False4Truedtype:bool5.3數(shù)據(jù)清洗5.3.3重復(fù)值處理stu_info[stu_info.duplicated()]#篩選stu_info中重復(fù)值標(biāo)記為True的數(shù)據(jù)記錄篩選出重復(fù)值標(biāo)記為True的所有數(shù)據(jù)5.3數(shù)據(jù)清洗5.3.3重復(fù)值處理5.3數(shù)據(jù)清洗5.3.3重復(fù)值處理處理重復(fù)值數(shù)據(jù)去重是處理重復(fù)值的主要方法,但如下幾種情況慎重去重:(1)樣本不均衡時(shí),故意重復(fù)采樣的數(shù)據(jù);(2)分類模型,某個(gè)分類訓(xùn)練數(shù)據(jù)過少,可以采取簡(jiǎn)單復(fù)制樣本的方法來增加樣本數(shù)量重復(fù)記錄用戶檢測(cè)業(yè)務(wù)規(guī)則問題。(3)事務(wù)型數(shù)據(jù),尤其與錢相關(guān)的業(yè)務(wù)場(chǎng)景下出現(xiàn)重復(fù)數(shù)據(jù)時(shí),如重復(fù)訂單,重復(fù)出庫(kù)申請(qǐng)。5.3數(shù)據(jù)清洗5.3.3重復(fù)值處理處理重復(fù)值對(duì)于重復(fù)值,Pandas中一般使用drop_duplicates()方法刪除重復(fù)值。DataFrame.drop_duplicates(subset=None,keep=‘first’,inplace=False,ignore_index=False)#刪除stu_info對(duì)象中的重復(fù)值stu_info.drop_duplicates()5.3數(shù)據(jù)清洗5.3.3異常值處理1.概述模型通常是對(duì)整體樣本數(shù)據(jù)結(jié)構(gòu)的一種表達(dá)方式,這種表達(dá)方式通常抓住的是整體樣本一般性的性質(zhì),而那些在這些性質(zhì)上表現(xiàn)完全與整體樣本不一致的點(diǎn),就稱其為異常點(diǎn)。異常點(diǎn)在某些場(chǎng)景下極為重要,如疾病預(yù)測(cè),通常健康人的身體指標(biāo)在某些維度上是相似,如果一個(gè)人的身體指標(biāo)出現(xiàn)了異常,那么他的身體情況在某些方面肯定發(fā)生了改變,當(dāng)然這種改變并不一定是由疾病引起(通常被稱為噪音點(diǎn)),但異常的發(fā)生和檢測(cè)是疾病預(yù)測(cè)一個(gè)重要起始點(diǎn)。相似的場(chǎng)景也可以應(yīng)用到信用欺詐,網(wǎng)絡(luò)攻擊等等。5.3數(shù)據(jù)清洗5.3.3異常值處理2.異常值檢測(cè)-簡(jiǎn)單統(tǒng)計(jì)直接觀察整體數(shù)據(jù),使用Pandas.describe()觀察數(shù)據(jù)的統(tǒng)計(jì)描述(統(tǒng)計(jì)數(shù)據(jù)應(yīng)當(dāng)為連續(xù)性)簡(jiǎn)單使用散點(diǎn)圖5.3數(shù)據(jù)清洗5.3.3異常值處理2.異常值檢測(cè)-3σ原則前提條件:數(shù)據(jù)分布需要服從正態(tài)分布或者近似正態(tài)分布。這個(gè)是根據(jù)正態(tài)分布的性質(zhì)而得出的方法5.3數(shù)據(jù)清洗5.3.3異常值處理3.異常值處理-刪除異常值drop()函數(shù)Pandas提供drop()函數(shù),可按指定行索引或列索引來刪除異常值。DataFrame.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,errors=‘raise’)參數(shù)說明labels表示要?jiǎng)h除的行索引或列索引,可以刪除一個(gè)或多個(gè)。axis指定刪除行或刪除列index指定要?jiǎng)h除的行columns指定要?jiǎng)h除的列5.3數(shù)據(jù)清洗5.3.3異常值處理3.異常值處理-替換異常值replace()函數(shù)最常用的方式,用指定的值,或根據(jù)算法計(jì)算出來的值,替換檢測(cè)出的異常值。DataFrame.replace(to_replace=None,Value=None,inplace=False,limit=None,regex=False,method=’pad’)參數(shù)說明to_place表示被替換的值value表示被替換后的值,默認(rèn)為None。inplace表示是否修改原數(shù)據(jù)。method表示替換方式。5.3數(shù)據(jù)清洗5.3.3異常值處理3.異常值處理-其他處理異常值的方法①刪除含有異常值的記錄:直接將含有異常值的記錄刪除。②視為缺失值:將異常值視為缺失值,利用缺失值處理的方法進(jìn)行處理。③平均值修正:可用前后兩個(gè)觀測(cè)值的平均值修正該異常值。④不處理:直接在具有異常值的數(shù)據(jù)集上進(jìn)行數(shù)據(jù)挖掘與分析。5.4數(shù)據(jù)標(biāo)準(zhǔn)化數(shù)據(jù)標(biāo)準(zhǔn)化的原因數(shù)據(jù)標(biāo)準(zhǔn)化的方法標(biāo)準(zhǔn)化的意義5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.1數(shù)據(jù)標(biāo)準(zhǔn)化的原因3.異常值處理-其他處理異常值的方法當(dāng)某些算法要求樣本具有零均值和單位方差,需要消除樣本不同屬性具有不同量級(jí)時(shí)的影響時(shí):1)數(shù)量級(jí)的差異將導(dǎo)致量級(jí)較大的屬性占據(jù)主導(dǎo)地位2)數(shù)量級(jí)的差異將導(dǎo)致迭代收斂速度減慢3)依賴于樣本距離的算法對(duì)于數(shù)據(jù)的數(shù)量級(jí)非常敏感在不同的問題中,標(biāo)準(zhǔn)化的意義不同:①在回歸預(yù)測(cè)中,標(biāo)準(zhǔn)化是為了讓特征值有均等的權(quán)重;②在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中,通過將數(shù)據(jù)標(biāo)準(zhǔn)化,能夠加速權(quán)重參數(shù)的收斂;③主成分分析中,需要對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理;默認(rèn)指標(biāo)間權(quán)重相等,不考慮指標(biāo)間差異和相互影響。5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法1.min-max標(biāo)準(zhǔn)化也叫極差標(biāo)準(zhǔn)化法,是消除變量量綱和變異范圍影響最簡(jiǎn)單的方法。具體方法:找出每個(gè)屬性的最小值

和最大值

,將其一個(gè)原始值X通過min-max標(biāo)準(zhǔn)化映射成在區(qū)間[0,1]中的值。公式:無(wú)論原始數(shù)據(jù)是正值還是負(fù)值,經(jīng)過處理后,該變量各個(gè)觀察值的數(shù)值變化范圍都滿足0≤X'≤1,并且正指標(biāo)、逆指標(biāo)均可轉(zhuǎn)化為正向指標(biāo),作用方向一致。但如果有新數(shù)據(jù)加入,就可能會(huì)導(dǎo)致最大值(Xmax)和最小值(Xmin)發(fā)生變化,就需要進(jìn)行重新定義,并重新計(jì)算極差(R)。5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法2.z-score標(biāo)準(zhǔn)化(規(guī)范化)當(dāng)遇到某個(gè)指標(biāo)的最大值和最小值未知的情況,或有超出取值范圍的離群數(shù)值時(shí),上面的方法就不再適用了,可以采用另一種數(shù)據(jù)標(biāo)準(zhǔn)化最常用的方法,即Z-score標(biāo)準(zhǔn)化,也叫標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化法。它基于原始數(shù)據(jù)的均值(mean)和標(biāo)準(zhǔn)差(standarddeviation)進(jìn)行數(shù)據(jù)的標(biāo)準(zhǔn)化,將A的原始值x使用z-score標(biāo)準(zhǔn)化到x'。z-score標(biāo)準(zhǔn)化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數(shù)據(jù)的情況。公式:新數(shù)據(jù)=(原數(shù)據(jù)-均值)/標(biāo)準(zhǔn)差均值和標(biāo)準(zhǔn)差都是在樣本集上定義的,而不是在單個(gè)樣本上定義的。標(biāo)準(zhǔn)化是針對(duì)某個(gè)屬性的,需要用到所有樣本在該屬性上的值。5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法3.線性比例標(biāo)準(zhǔn)化法(1)極大化法對(duì)于正指標(biāo),取該指標(biāo)的最大值Xmax,然后用該變量的每一個(gè)觀察值除以最大值,即:(2)極小化法對(duì)于逆指標(biāo),取該指標(biāo)的最小值Xmin,然后用該變量的最小值除以每一個(gè)觀察值,即:注:以上兩種方法不適用于X<0的情況。正指標(biāo):是一種評(píng)估指標(biāo),指標(biāo)數(shù)值大小與司法績(jī)效高低一致;正指標(biāo)越大越好。逆指標(biāo):是強(qiáng)度相對(duì)的指標(biāo),指標(biāo)數(shù)值大小與司法績(jī)效高低相反;逆指標(biāo)越小越好。對(duì)于逆向指標(biāo)使用線性比例法進(jìn)行標(biāo)準(zhǔn)化后,實(shí)際上是進(jìn)行了非線性的變換,變換后的指標(biāo)無(wú)法客觀地反映原始指標(biāo)的相互關(guān)系,轉(zhuǎn)換時(shí)需要注意。5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法4.log函數(shù)標(biāo)準(zhǔn)化法首先對(duì)該變量的每一個(gè)觀察值取以10為底的log值,然后再除以該指標(biāo)最大值()的log值,即:

注:=的區(qū)間不一定在[0,1];為樣本最大值;此方法要求≥1。5.4數(shù)據(jù)標(biāo)準(zhǔn)化5.4.3標(biāo)準(zhǔn)化的意義4.log函數(shù)標(biāo)準(zhǔn)化法1.標(biāo)準(zhǔn)化、歸一化的區(qū)別:歸一化是標(biāo)準(zhǔn)化的一種,它的縮放僅與最大、最小值的差別有關(guān);輸出范圍在0—1間;標(biāo)準(zhǔn)化縮放和每個(gè)值都有關(guān)系,通過方差體現(xiàn)出來。當(dāng)數(shù)據(jù)更集中時(shí),數(shù)據(jù)標(biāo)準(zhǔn)化后更分散;數(shù)據(jù)分布很廣時(shí),數(shù)據(jù)標(biāo)準(zhǔn)化后會(huì)更集中。輸出范圍是一個(gè)特定的區(qū)間,在正無(wú)窮到負(fù)無(wú)窮。①如果對(duì)輸出結(jié)果范圍有要求,用歸一化;②如果數(shù)據(jù)較穩(wěn)定,不存在極端的最大最小值,用歸一化;③如果數(shù)據(jù)有異常值和較多噪音,用標(biāo)準(zhǔn)化,可間接通過中心化避免異常值、極端值的影響。2.標(biāo)準(zhǔn)化的意義數(shù)據(jù)標(biāo)準(zhǔn)化其實(shí)是對(duì)向量X按比例壓縮再平移,本質(zhì)上是一種線性變換。線性變換又很多良好的性質(zhì),這決定了對(duì)數(shù)據(jù)變換后的數(shù)據(jù)反而能提高數(shù)據(jù)效率。比如:線性變換不改變?cè)紨?shù)據(jù)的數(shù)值排序。這保證了數(shù)據(jù)變換后依然有意義,因?yàn)榫€性變換保持線性組合與線性關(guān)系式不變。5.5實(shí)戰(zhàn)1:運(yùn)動(dòng)員數(shù)據(jù)分析預(yù)處理任務(wù)說明任務(wù)分析與預(yù)處理5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.1任務(wù)說明1.案例背景當(dāng)前,籃球運(yùn)動(dòng)是最受歡迎的運(yùn)動(dòng)之一,相應(yīng)地,當(dāng)紅球星的信息也被廣泛關(guān)注。本次案例針對(duì)籃球運(yùn)動(dòng)員個(gè)人的信息,技能水平等各項(xiàng)指標(biāo)進(jìn)行相關(guān)的分析與統(tǒng)計(jì)。在對(duì)球員信息進(jìn)行分析時(shí),讀者可能會(huì)關(guān)注如下的內(nèi)容:①籃球運(yùn)動(dòng)員的失誤與上場(chǎng)時(shí)長(zhǎng)有什么聯(lián)系?②球員的各項(xiàng)數(shù)據(jù)之間的相關(guān)性如何?③哪些數(shù)據(jù)會(huì)對(duì)球員的得分有影響?5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.1任務(wù)說明2.任務(wù)目標(biāo)①計(jì)算我國(guó)男籃、女籃運(yùn)動(dòng)員的平均身高與平均體重。②分析我國(guó)籃球運(yùn)動(dòng)員的年齡分布。③計(jì)算我國(guó)籃球運(yùn)動(dòng)員的體質(zhì)指數(shù)實(shí)現(xiàn)思路。工作環(huán)境:Win10-64bit和Anaconda,JupyterNotebook。5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理1.具體流程數(shù)據(jù)分析與預(yù)處理的流程5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理文件讀取importpandasaspdall_data=pd.read_excel('data/運(yùn)動(dòng)員信息.xlsx')5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)篩選#篩選出國(guó)籍為中國(guó)的運(yùn)動(dòng)員all_data=all_data[all_data['國(guó)籍']=='中國(guó)']#查看DataFrame類對(duì)象的摘要,包括索引、各列數(shù)據(jù)類型、非空值數(shù)量、內(nèi)存使用情況等all_()觀察輸出結(jié)果可知,數(shù)據(jù)中后5列的非空值數(shù)量不等,說明可能存在缺失值、重復(fù)值等;所有列的數(shù)據(jù)類型均為Object型,因此后續(xù)需要先對(duì)部分列進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換操作,之后才能計(jì)算要求的統(tǒng)計(jì)指標(biāo)。5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-檢測(cè)重復(fù)值all_data[all_data.duplicated().values==True]#檢測(cè)重復(fù)值5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-處理缺失值#篩選出項(xiàng)目為籃球的數(shù)據(jù)basketball_data=all_data[all_data['項(xiàng)目']=='籃球']5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-處理缺失值#先統(tǒng)一數(shù)據(jù)單位basketball_data.loc[:,'體重']=basketball_data.loc[:,'體重'].replace({'88千克':'88kg'})basketball_data通過分別輸出男籃與女籃的數(shù)據(jù),發(fā)現(xiàn)女籃運(yùn)動(dòng)員數(shù)據(jù)中“體重”一列存在缺失值,且該列中行索引為65的數(shù)據(jù)與其他行數(shù)據(jù)的單位不統(tǒng)一。需要處理體重列的缺失值。5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-處理缺失值#采用向前填充的方式,替換體重為8kg的值basketball_data['體重'].replace(to_replace=None,method='pad',inplace=True)basketball_data從數(shù)據(jù)可以看到,體重列存在NaN缺失值,第一種方法是直接用向前填充的方式替換,使之擁有與上一行相同的數(shù)值,此方法適合缺失數(shù)據(jù)較少的數(shù)據(jù)集。5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-處理缺失值#計(jì)算女籃運(yùn)動(dòng)員的平均體重——先清除缺失值,再轉(zhuǎn)換數(shù)據(jù)類型,最后計(jì)算平均值female_weight=basketball_data['體重'].dropna()#lambdax:x[0,-2]意為刪掉最后兩個(gè)字符,即去除單位,astype(int)意為將去除kg這個(gè)單位后的體重?cái)?shù)據(jù)轉(zhuǎn)換為整數(shù)類型female_weight=female_weight.apply(lambdax:x[0:-2]).astype(int)#mean()意為求平均數(shù),round代表四舍五入fill_female_weight=round(female_weight.mean())#將平均體重的小數(shù)點(diǎn)舍棄,只保留整數(shù),轉(zhuǎn)換為str字符串類型之后就可以把kg這個(gè)單位拼接回來了fill_female_weight=str(int(fill_female_weight))+'kg'#填充缺失值。。basketball_data.loc[:,'體重'].fillna(fill_female_weight,inplace=True)basketball_data 這里還有另一種方法可以處理缺失值NaN。即用正常體重?cái)?shù)據(jù)的“平均值”來填充。先清除所有缺失值,再將數(shù)據(jù)類型轉(zhuǎn)換為整型后計(jì)算平均體重,然后通過得到的平均體重填充缺失值,5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理轉(zhuǎn)換體重一列為整型數(shù)據(jù),并將該列的索引重命名為“體重/kg”basketball_data=pd.concat([male_data,female_data])basketball_data['體重']=basketball_data['體重'].apply(lambdax:x[0:-2]).astype(int)basketball_data.rename(columns={'體重':'體重/kg'},inplace=True)basketball_data 這里還有另一種方法可以處理缺失值NaN。即用正常體重?cái)?shù)據(jù)的“平均值”來填充。先清除所有缺失值,再將數(shù)據(jù)類型轉(zhuǎn)換為整型后計(jì)算平均體重,然后通過得到的平均體重填充缺失值,5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-檢測(cè)與處理異常值a.使用箱型圖檢測(cè)男籃運(yùn)動(dòng)員的身高數(shù)據(jù) frommatplotlibimportpyplotasplt#設(shè)置中文顯示plt.rcParams['font.sans-serif']=['SimHei']#使用箱型圖檢測(cè)男籃運(yùn)動(dòng)員“身高/cm”一列是否有異常值male_data.boxplot(column=['身高/cm'])plt.show()為提高后期計(jì)算的準(zhǔn)確性,需要對(duì)整租數(shù)據(jù)做異常值檢測(cè),這里通過箱型圖和3σ原則兩種方式分別檢測(cè)“身高/cm”和“體重/kg”兩列數(shù)據(jù)。5.5數(shù)據(jù)標(biāo)準(zhǔn)化5.5.2任務(wù)分析與預(yù)處理2.?dāng)?shù)據(jù)獲取與處理數(shù)據(jù)清洗-檢測(cè)與處理異常值b.使用箱型圖檢測(cè)男籃運(yùn)動(dòng)員的身高數(shù)據(jù) #使用箱型圖檢測(cè)女籃運(yùn)動(dòng)員“身高/cm”一列是否有異常值female_data.boxplot(column=['身高/cm'])plt.show()觀察以上兩個(gè)箱型圖可知,女籃運(yùn)動(dòng)員的身高數(shù)據(jù)中存在一個(gè)小于170的值,經(jīng)核實(shí)后確認(rèn)該值為非異常值,可直接忽略。5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理任務(wù)說明任務(wù)實(shí)現(xiàn)直觀數(shù)據(jù)分析5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理5.5.1任務(wù)說明1.案例背景豆瓣讀書是豆瓣網(wǎng)上的一個(gè)子欄目,上線于2005年,已成為國(guó)內(nèi)信息最全,用戶數(shù)量最大且最為活躍的讀書網(wǎng)站,豆瓣讀書專注于為用戶提供全面且精細(xì)化的讀書服務(wù),同時(shí)不斷探索新的產(chǎn)品模式。本次案例將根據(jù)豆瓣讀書數(shù)據(jù)情況將數(shù)據(jù)集進(jìn)行預(yù)處理,包括數(shù)據(jù)的異常數(shù)據(jù)清洗,數(shù)據(jù)類型轉(zhuǎn)換,以及根據(jù)直觀數(shù)據(jù)進(jìn)行初步數(shù)據(jù)分析。5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-文件讀取importpandasaspdimportnumpyasnpdf=pd.read_csv(r'/PythonTest/Data/book_douban.csv',index_col=0)df.head(10)5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-文件讀取()查看數(shù)據(jù)集的字段類型<class'pandas.core.frame.DataFrame'>Int64Index:60626entries,1to60670Datacolumns(total9columns):#ColumnNon-NullCountDtype----------------------------0書名60626non-nullobject1作者60623non-nullobject2出版社60626non-nullobject3出版時(shí)間60626non-nullobject4數(shù)60626non-nullobject5價(jià)格60611non-nullobject6ISBM60626non-nullobject7評(píng)分60626non-nullfloat648評(píng)論數(shù)量60626non-nullobjectdtypes:float64(1),object(8)memoryusage:4.6+MB5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df=df.rename(columns={'數(shù)':'頁(yè)數(shù)'})df.reset_index(drop=True,inplace=True)df.head(10)在數(shù)據(jù)讀取時(shí),發(fā)現(xiàn)字段“數(shù)”表達(dá)不明確,為了更加直觀,現(xiàn)將“數(shù)”改為“頁(yè)數(shù)”,并且重置索引。5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df.shape()查看數(shù)據(jù)的矩陣形狀(60626,9)df.describe()查看評(píng)分的統(tǒng)計(jì)信息5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df.replace('None',np.nan,inplace=True)df.isnull().sum()洗數(shù)據(jù)集中的空值,首先將數(shù)據(jù)中的None值替換為Null值,然后查看數(shù)據(jù)的空值情況。書名0作者1014出版社2718出版時(shí)間992頁(yè)數(shù)4257價(jià)格1849ISBM1087評(píng)分0評(píng)論數(shù)量6655dtype:int645.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗deldf['ISBM']#去除ISBM列df.dropna(axis=0,subset=['作者','出版社','出版時(shí)間','頁(yè)數(shù)','價(jià)格','評(píng)分','評(píng)論數(shù)量'],how='any',inplace=True)#去除指定列含有空值的行df.reset_index(drop=True,inplace=True)#重置索引df.isnull().sum()選取數(shù)據(jù)中空值較多的列進(jìn)行清洗或刪除書名0作者0出版社0出版時(shí)間0頁(yè)數(shù)0價(jià)格0評(píng)分0評(píng)論數(shù)量0dtype:int645.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df.drop(df[df['出版時(shí)間'].str.len()!=4].index,axis=0,inplace=True)df['出版時(shí)間']=df['出版時(shí)間'].astype(32)df.drop(df[df['出版時(shí)間']>2019].index,inplace=True)df.head()清洗時(shí)間列,將時(shí)間字段由字符串類型轉(zhuǎn)換為整數(shù)類型,并將出版時(shí)間大于顯示實(shí)際時(shí)間的數(shù)據(jù)清除。5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['評(píng)論數(shù)量']=df['評(píng)論數(shù)量'].astype(32)()在查看數(shù)據(jù)類型時(shí),發(fā)現(xiàn)“評(píng)論數(shù)量”字段數(shù)據(jù)類型為“object”,現(xiàn)將該字段轉(zhuǎn)換為整型類型。<class'pandas.core.frame.DataFrame'>RangeIndex:47745entries,0to47744Datacolumns(total8columns):#ColumnNon-NullCountDtype----------------------------0書名47745non-nullobject1作者47745non-nullobject2出版社47745non-nullobject3出版時(shí)間47745non-nullobject4頁(yè)數(shù)47745non-nullobject5價(jià)格47745non-nullobject6評(píng)分47745non-nullfloat647評(píng)論數(shù)量47745non-nullint32dtypes:float64(1),int32(1),object(6)memoryusage:2.7+MB5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['頁(yè)數(shù)'].str.contains('\.').value_counts()查看頁(yè)數(shù)是否含有小數(shù)點(diǎn)的情況False47738True7Name:頁(yè)數(shù),dtype:int645.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['頁(yè)數(shù)']=df['頁(yè)數(shù)'].apply(lambdax:x.replace(',','').replace('',''))df.drop(df[~(df['頁(yè)數(shù)'].str.isdecimal())].index,axis=0,inplace=True)df將頁(yè)數(shù)列中的異常字符清除5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['頁(yè)數(shù)']=df['頁(yè)數(shù)'].astype(32)df.drop((df[df['頁(yè)數(shù)']==0]).index,inplace=True)()轉(zhuǎn)換頁(yè)數(shù)的格式并且清除頁(yè)數(shù)為0的數(shù)據(jù)<class'pandas.core.frame.DataFrame'>Int64Index:47456entries,0to47744Datacolumns(total8columns):#ColumnNon-NullCountDtype----------------------------0書名47456non-nullobject1作者47456non-nullobject2出版社47456non-nullobject3出版時(shí)間47456non-nullobject4頁(yè)數(shù)47456non-nullint325價(jià)格47456non-nullobject6評(píng)分47456non-nullfloat647評(píng)論數(shù)量47456non-nullint32dtypes:float64(1),int32(2),object(5)memoryusage:2.9+MB5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['價(jià)格']=df['價(jià)格'].apply(lambdax:x.replace(',','').replace('',''))forr_index,rowindf.iterrows():ifrow[5].replace('.','').isdecimal()==False:df.drop(r_index,axis=0,inplace=True)elifrow[5][-1].isdecimal()==False:df.drop(r_index,axis=0,inplace=True)df['價(jià)格']=df['價(jià)格'].astype(float)df.tail()轉(zhuǎn)換頁(yè)數(shù)的格式并且清除頁(yè)數(shù)為0的數(shù)據(jù)5.6.2任務(wù)實(shí)現(xiàn)5.6實(shí)戰(zhàn)2:豆瓣讀書數(shù)據(jù)預(yù)處理1.?dāng)?shù)據(jù)獲取與處理-數(shù)據(jù)清洗df['書名'].value_counts()查看重復(fù)的書名奇諾之***4GOSICK***3張愛玲*

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論