數(shù)據(jù)分析工具:Pandas架構(gòu)分析
在工作中,我們一般用excel或者SQL來處理和分析數(shù)據(jù),本文分享了Pandas框架,給出該工具的使用方法,供大家參考。
以往數(shù)據(jù)分析常使用的工具是excel和sql,用這兩個工具做過大數(shù)據(jù)分析的網(wǎng)友都能感受到那種痛苦,本文對Python的Pandas大數(shù)據(jù)分析工具做架構(gòu)分析,以方便掌握該強大的工具。
本文的架構(gòu)分析是通過閱讀pandas中文出版物教程、互聯(lián)網(wǎng)搜索、代碼驗證的基礎(chǔ)上得到的結(jié)構(gòu)猜想,并沒有深入源代碼分析,實際架構(gòu)與本分析可能略有出入,請知悉。
1. 結(jié)構(gòu)概覽
Pandas就是數(shù)據(jù)容器,容器好不好用,不僅取決于容器能裝多少東西,更取決于,取出來是否方便。Pandas的Series和DataFrame作為數(shù)據(jù)容器就像一本書。
- 數(shù)組容器:就是這本書只有頁碼。如果書本不超過幾百頁,或者使用的很少,使用起來并沒有問題,如果書本有十萬頁,頻繁找東西時肯定就麻煩了。數(shù)據(jù)分析就像在幾十萬、幾百萬頁的書本里,找數(shù)據(jù),只有頁碼是不夠用的。
- Index容器:Index是對數(shù)組容器頁碼的拓展,在原頁碼的基礎(chǔ)上增加了文本描述,讀者對頻繁使用的章節(jié)可以夾個標(biāo)簽。Index容器有很多子類型,可以簡化索引的使用,如:DatetimeIndex、PeriodIndex、IntervalIndex等
- MultiIndex容器:是對Index容器的組合,不僅支持一層便簽,可以支持任意層便簽,通過該容器可以實現(xiàn)目錄管理。
Series是一列數(shù)據(jù)值,DataFrame是N列數(shù)據(jù)是,是N個Series的組合。Series和DataFrame從容器的角度,主要拓展的是索引部分,兩者的分為index和values兩部分,其中index是索引,有復(fù)雜的各種實現(xiàn)類。values仍是ndarray類型。
2. Series
Series是對數(shù)組的封裝,比普通數(shù)組新增index的屬性。不考慮MultIndex的場景該圖是準(zhǔn)確的,考慮MultiIndex,書簽信息可以有無數(shù)列數(shù)據(jù)。
2.1 數(shù)據(jù)初始化
Series的兩列位置信息,頁碼信息是系統(tǒng)自動編碼,無法人工介入。書簽信息是手動編碼,可以指定也可以不指定。
索引列和對象可以單獨起名字。value沒有名字
2.2 通過Index定位值
數(shù)組支持按位置訪問,比如s[1]
Series支持按位置和按index訪問兩種方式。
- Series傳入的標(biāo)簽參數(shù)可以換算為位置信息。
- loc和iloc返回值是向量
- at和iat返回值為標(biāo)量
位置信息的使用,用SQL表達就是:from 原表 where index.loc in() or index.lable in()
2.3 通過值定位Index
- 函數(shù)返回值為bool類型的Series
- 要得到index值或者數(shù)據(jù)向量,需要再調(diào)用一次se.loc[]
此處函數(shù)的使用,用SQL表達就是:from 原表 y left join BoolSeries yi where y.index = yi.index and yi.value =True
2.4 MultiIndex構(gòu)建
Index和MultiIndex都是數(shù)組,數(shù)組的個數(shù)=數(shù)據(jù)的行數(shù)。Index數(shù)組的元素是標(biāo)量數(shù)值。MultiIndex的數(shù)組元素是元組,可以是二元組、三元組、四元組等。
這里的目錄操作,也是人工智能算法打標(biāo)簽的地方,打好標(biāo)簽就可以分群,就可以推薦了。
對于Series由于只有一列數(shù)據(jù),所有列的層級就沒有建目錄的功能,DataFrame有此功能。
2.5 時間構(gòu)建目錄
時間可以按年、月、日、時、分這五個維度構(gòu)成一個目錄層級結(jié)構(gòu),可以用目錄實現(xiàn)。直接使用DatetimeIndex對象構(gòu)建:
3. DataFrame
DataFrame是有多個Series或數(shù)組聯(lián)表而成的組裝表。
Series和數(shù)組的組裝方式分為三種場景,每種場景有幾種存在的組合,如圖,綠色的組合場景是合法的,白色的組合場景是非法的。
3.1 多個數(shù)組合并
數(shù)組和DataFrame的維度信息對照:
- 數(shù)組是有序的,所以有位置信息,位置信息是隱含的。隱式對應(yīng)于DataFrame的index屬性。
- 數(shù)組是有值的,所以有數(shù)值信息,數(shù)值信息是顯式的。顯式對應(yīng)DataFrame的value屬性。
數(shù)組和DataFrame的存儲值對照:
- 數(shù)組的值存儲的是地址,所以數(shù)組可容納數(shù)值、字符串、對象等任意類型。
- DataFrame每列存儲的類型是固定的,所以DataFrame組裝時,會自動轉(zhuǎn)換數(shù)據(jù)類型。
組裝關(guān)系用SQL表示為:
原則猜測:
之所以數(shù)組組裝要求嚴(yán)格,是因為數(shù)組本身很靈活,數(shù)據(jù)清洗程度低,數(shù)據(jù)臟亂差的概率更大,所以此處嚴(yán)格校驗,可以降低數(shù)據(jù)錯誤的風(fēng)險。
3.2 多個Series合并
多個series組成DataFrame實際執(zhí)行的是連表操作,效果等同于Sql語句的全連接。
3.3 Series和數(shù)組合并
只要有數(shù)組存在,就必須完全對齊,索引列使用Series的索引列。系統(tǒng)默認(rèn)Series和數(shù)組的索引列按照所在順序建立聯(lián)表關(guān)系。
當(dāng)Series和數(shù)組組成DataFrame時,按照從嚴(yán)法則,必須上下對齊。
4. 數(shù)據(jù)分組
分組是根據(jù)索引將數(shù)據(jù)聚合,兩種方法:
- 顯式聲明索引,可以直接使用索引分組
- 不聲明索引,調(diào)用groupby后自動創(chuàng)建索引
分組有三個維度:
- 行維度分組:groupby
- 行維度分組+列維度分組:數(shù)據(jù)透視表 pivot
- 按順序,固定行數(shù)組成窗口分組:rolling、expanding
4.1 顯式聲明索引后分組
4.2 分組后自動創(chuàng)建索引
4.3 行維度分組
4.4 行列兩維度分組
4.4.1 單行單列寫法
4.4.2 多行單列寫法
4.4.3 多行多列寫法
4.5 窗口滾動分組
滾動分組是按照位置數(shù)量分組,實際工作中常說的過去1年,過去一個月,過去一周,以及時間函數(shù)都使用滾動計算的理念。
窗口函數(shù)與窗口累計函數(shù)都可以使用apply函數(shù)拿到窗口的值數(shù)組,可以使用該值,做任意匹配的運算。
4.6 窗口累計分組
5. 改變數(shù)據(jù)形狀
Pandas中,處理的數(shù)據(jù)基本都是按表格組織,數(shù)據(jù)輸入有兩種方式,按行輸入,按列輸入。為了輸入方便基本會按長軸維度輸入數(shù)據(jù)。
比如8行兩列的數(shù)據(jù),可以按照行的順序?qū)懀部梢园凑樟械捻樞驅(qū)?。對于該?shù)據(jù),肯定是按列的順序書寫,需要輸入的中括號最少。數(shù)據(jù)輸入后再處理即可。
圖中可知,數(shù)據(jù)調(diào)用zip分組后,從數(shù)據(jù)分組的角度看:zip和數(shù)據(jù)轉(zhuǎn)置的效果是一致的。
6. 數(shù)據(jù)查詢邏輯
Series和DataFrame作為數(shù)據(jù)容器,數(shù)據(jù)查詢是很重要的邏輯,此處再系統(tǒng)梳理一下流程。
6.1 按索引取值
按索引取值,類比于select的按照主鍵取值。Pandas接受到入?yún)⑺饕?,會?gòu)建一個與被查詢數(shù)據(jù),相同索引的Series,其中被查詢的索引對應(yīng)值為True,未被查詢的索引對應(yīng)值為False,將該Series作為入?yún)?,查詢效果與直接輸入索引查詢效果相同。
代碼如下:
6.2 按值取值
按照值取值時,每個運算符對應(yīng)一個Bool。如果Bool之間是and關(guān)系,就執(zhí)行b1*b2如果Bool之間是or關(guān)系,就執(zhí)行b1+b2
7. 不同數(shù)據(jù)類型之間的轉(zhuǎn)換邏輯
8. Index展開詳解
8.1 概述
index是比數(shù)組更大的容器,數(shù)組內(nèi)的元素可以是不同的類型,index統(tǒng)一定義了數(shù)組的類型,必須是obj、Datetime、int、Period等其中的一種。index會猜測數(shù)組內(nèi)存儲的數(shù)據(jù)類型,如果是數(shù)值,會自動轉(zhuǎn)換為對應(yīng)的類型,否則統(tǒng)一定義為object類型。
- 定義object類型的好處是:可以存儲任意類型的數(shù)據(jù)。
- 定義object類型的缺點是:大而全,就沒有操作數(shù)據(jù)的方法。小而精,才可以使用對應(yīng)的操作方法。
- 為了調(diào)用int、Datetime類型數(shù)據(jù)對應(yīng)的操作方法,需要顯式的轉(zhuǎn)換為對應(yīng)的類型。
8.2 DatetimeIndex
DatetimeIndex就是Datetime格式的index。日期是一組連續(xù)的數(shù)字,默認(rèn)可以按照年、月、日、時、分、秒分組,也可以自定義時間段分組。如果某Series或者DataFrame需要使用年月日時分秒做分組依據(jù),有兩個方案:
8.2.1 年月日時分組成5列數(shù)組,通過MultiIndex賦值
將字符數(shù)組轉(zhuǎn)為
8.2.2 直接將日期轉(zhuǎn)為Datetimeindex賦值,用方法取值
兩個對比,顯然第二個方案更簡單靈活。
9 .常用函數(shù)說明
9.1 map與replace的等價寫法
map可以將任意值改名其他值,此處主要介紹將Bool轉(zhuǎn)成文本。因為在查詢函數(shù)返回的值都為bool類型,所以此場景使用map函數(shù)的頻率更高。
map的傳參是集合,是因為這里傳值是映射關(guān)系。
調(diào)用多次replace函數(shù)的效果與調(diào)用map函數(shù)的結(jié)果相同。
9.2 isna與isin的等價寫法
isna與isin(pd.NA)是等價的。fillna與replace(pd.Na)是等價的。
9.3 notna與notin的等價寫法
pandas沒有not in函數(shù)。但是有波浪線表示取反,即True取反后是False,F(xiàn)alse取反后是True
9.4 列拆分函數(shù)split
Series分列,默認(rèn)是將內(nèi)容分成,數(shù)組,不會展開。
9.4.1 默認(rèn)為Series格式
9.4.2 數(shù)據(jù)自動變成DataFrame格式
本文由 @我是產(chǎn)品張 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
該文觀點僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)。
- 目前還沒評論,等你發(fā)揮!