Pandas庫基礎分析——數據規整化處理

前言

在數據分析和建模以前須要審查數據是否知足數據處理應用的要求,以及對數據進行清洗,轉化,合併,重塑等一系列規整化處理。pandas標準庫提供了高級靈活的方法,可以輕鬆地將數據規整化爲正確的形式,本文經過例程介紹使用pandas庫從獲取數據到最終數據重塑的方法。python

數據文件獲取

Pandas庫提供專門處理csv文件的方法read_csv(),具體可參考《Pandas庫基礎分析——CSV文件加載和存儲》中的Pandas庫讀寫CSV文件章節。segmentfault

數據信息查看

當數據量較大時,將數據全部信息輸出到控制檯中會顯得過於冗雜,可經過查看部分數據信息,簡要了解數據的特性。微信

(1)查看數據前5行和尾部倒數5行數據,列名和索引信息,數據行列形狀app

print df_csvload.head()#查看前幾行   
print df_csvload.tail()#查看後幾行
print df_csvload.columns#查看列名
print df_csvload.index#查看索引
print df_csvload.shape#查看形狀

圖片描述

(2)查看各列數據描述性統計信息,如最小值、最大值、均值、標準差等spa

print df_csvload.describe()#查看各列數據描述性統計

圖片描述

(3)查看數據是否有缺失及每列數據的類型code

print df_csvload.info()#查看缺失及每列數據類型

圖片描述

缺失值處理

對Pandas作數據時不可避免會由於一些緣由出現缺失值NaN(Not a number),好比兩個DataFrame對象進行運算時對於沒法匹配的位置就會出現缺失值。經過數據信息查看可知數據中存在缺失值,好比dataA、dataC、dataE各存在2個NaN,dataB、dataD、各存在1個NaN。對象

(1)Pandas包中isnull()和notnull()方法用於判斷數據是否爲缺失值,如果缺失值則isnull()返回值爲True,notnull()返回值爲False。blog

print df_csvload.isnull()#判斷數據缺失值

圖片描述

(2)因爲isnull()和notnull()方法判斷缺失值生成的是全部數據的True/False矩陣,對於龐大的Dataframe數據,很難一眼看出缺失值位置,可在df_csvload.isnull()矩陣基礎上結合數據轉置方法.T和篩選知足True值條件列方法.any(),查找出含有NaN值所在的行。索引

print df_csvload[df_csvload.isnull().T.any().T]#查看NAN值所在行

圖片描述

(3)對缺失值的處理的方法有刪除和填充,此處經過DataFrame.dropna()方法將全部值都爲缺失值的行刪除,DataFrame.fillna()方法在列方向上對缺失值前值填充。圖片

df_csvload = df_csvload.dropna(axis=0,how='all')#NAN值刪除 行全部爲NAN刪除
df_csvload.fillna(method='ffill',axis=0,inplace=True)#NAN值填充 列方向前值填充
print df_csvload[df_csvload.isnull().values==True]#查看NAN值刪除填充後值

圖片描述

特殊值處理

(1)查看各列數據描述性統計信息時發現「Flow」列最小值爲0值,查找出0值具體位置後用「Flow」列經過中位值填充0值

注:loc爲經過行和列的標籤名提取相應數據,iloc爲經過位置提取特定的數據,而ix爲標籤和位置索引混合的方式切片數據
print df_csvload[df_csvload.values==0]#查看全部0值的元素
print df_csvload[df_csvload.Flow.isin([0])]#查看指定列0值
df_csvload.loc[df_csvload.loc[:,'Flow']==0,'Flow'] = df_csvload.Flow.median()#中位值替換0值

圖片描述

(2)查看各列數據值時發現「dateE」列數據精度保留了6位小數,而「Flow」列數據精度保留了1位小數,此處將「dateE」列數據的精度更改成2位小數,將「Flow」列數據轉化爲整數,以便於顯示和運算。

df_csvload = df_csvload.round(2)#保留2位小數
df_csvload.Flow = df_csvload.Flow.astype(int)#轉換爲整數

圖片描述

數據運算轉化

(1)篩選出「Flow」列值大於該列均值的行,並只提取出所需的「date」列數據用於後續的運算。(可以使用&、|符號實現多條件篩選)

new_df = df_csvload[['dataA','dataB','dataC','dataD']][(df_csvload.Flow>df_csvload.Flow.mean())]

圖片描述

(2)經過apply()方法做用於DataFrame的行,計算出new_df每行數值最大與最小值之差,以及每行數值與平均值之差。

max_min_df = new_df.apply((lambda x:x.max() - x.min()),axis = 1)#計算橫軸最大最小值之差
err_mean_df = new_df.apply((lambda x:x-x.mean()),axis = 1)#計算橫軸數值與平均值之差

圖片描述

也可分別計算new_df中每列數值與mean_df均值的偏差。Pandas中Series與Series之間經過index匹配運算(加減乘除),同理Series與DataFrame之間是Series的index與DataFrame的columns之間匹配,運算的方式是將DataFrame每一行都與Series進行匹配運算,DataFrame之間則同時對index與columns進行匹配成功的元素進行運算,當以上類型出現沒法匹配時用NaN進行填充。

mean_df = new_df.apply((lambda x:x.mean()),axis = 1)#計算橫軸平均值
dataA_df = new_df.dataA - mean_df#計算偏差
dataB_df = new_df.dataB - mean_df#計算偏差
dataC_df = new_df.dataC - mean_df#計算偏差
dataD_df = new_df.dataD - mean_df#計算偏差

(3)applymap()方法做用於DataFrame元素級,此處將err_mean_df數值轉換爲真值矩陣

err_mean_df = err_mean_df.applymap(lambda x: True if(x>0) else False)# 大於零爲True 小於零爲False

數據合併及鏈接

pandas提供了三種方式實現數據的合併,pandas.merge根據一個或多個鍵將不一樣的DataFrame中的行鏈接起來;pandas.concat沿着一條軸將多個對象堆疊到一塊兒;combine_first將重複數據編接在一塊兒,用一個對象中的值填充另一個對象中的缺失值。此處使用pd.concat將數據按列方向合併,即axis爲1,設置keys值用於造成鏈接軸上的層次化索引。

mer_df = pd.DataFrame({'max_min':max_min_df,'mean':mean_df})
result =pd.concat([mer_df, err_mean_df],axis=1,keys=['diff_para','diff_err'])

圖片描述

更多python量化交易內容互動請加微信公衆號:PythonQT-YuanXiao
歡迎訂閱量化交易課程: 連接地址
相關文章
相關標籤/搜索