




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章財(cái)務(wù)數(shù)據(jù)分析利器——pandas庫(kù)Python是如何實(shí)現(xiàn)數(shù)據(jù)分析的呢?本章將簡(jiǎn)單介紹Python數(shù)據(jù)分析的一大利器,也是一個(gè)基礎(chǔ)庫(kù)——pandas庫(kù)的使用方法。pandas庫(kù)是基于NumPy的一個(gè)開(kāi)源Python庫(kù),被廣泛用于數(shù)據(jù)快速分析,以及數(shù)據(jù)清洗和準(zhǔn)備等工作中。某種程度上可以把pandas看作Python版的Excel。如果使用的是Anaconda,那么Anaconda自帶pandas庫(kù),無(wú)須單獨(dú)安裝。NumPy是另一個(gè)重要的庫(kù),是NumericalPython的簡(jiǎn)稱(NumPy庫(kù)的相關(guān)知識(shí)點(diǎn)可以參考本書(shū)源代碼文件夾中的“補(bǔ)充知識(shí)點(diǎn):NumPy庫(kù)基礎(chǔ).pdf”)。相較NumPy,pandas更擅長(zhǎng)處理二維數(shù)據(jù)。pandas主要有兩種數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。Series類似于通過(guò)NumPy產(chǎn)生的一維數(shù)組,Series對(duì)象不僅包含數(shù)值,還包含一組索引,創(chuàng)建方式如下:生成結(jié)果如下所示,它是一個(gè)一維數(shù)據(jù),并且對(duì)于每個(gè)元素都有一個(gè)行索引可以用來(lái)定位,比如可以通過(guò)s1[1]來(lái)定位第二個(gè)元素“王二”。Series單獨(dú)使用相對(duì)較少,pandas主要采用DataFrame數(shù)據(jù)結(jié)構(gòu)。DataFrame是一種二維表格數(shù)據(jù)結(jié)構(gòu),直觀一點(diǎn)的話可以將其看作一個(gè)Excel表格。目錄DataFrame的創(chuàng)建文件的讀取和寫入數(shù)據(jù)的讀取與篩選數(shù)據(jù)表拼接財(cái)務(wù)數(shù)據(jù)處理杜邦分析案例實(shí)戰(zhàn)課后習(xí)題01Python是如何實(shí)現(xiàn)數(shù)據(jù)分析的呢?3.1DataFrame的創(chuàng)建有兩種DataFrame常見(jiàn)的創(chuàng)建方法:通過(guò)列表創(chuàng)建、通過(guò)字典創(chuàng)建。3.1.1通過(guò)列表創(chuàng)建DataFrame首先是通過(guò)列表創(chuàng)建,這個(gè)和通過(guò)Numpy創(chuàng)建二維數(shù)組比較類似。引入pandas庫(kù)方式通常為importpandasaspd,然后調(diào)用DataFrame功能創(chuàng)建二維數(shù)組。將a打印輸出,運(yùn)行結(jié)果如下:和之前通過(guò)Numpy生成的二維數(shù)組進(jìn)行比較:可以看到通過(guò)pandas的DataFrame功能生成的二維數(shù)組更像我們?cè)贓xcel中看到二維表格數(shù)據(jù),它也有行索引和列索引,其中這里的索引序號(hào)都是從0開(kāi)始的。3.1.2通過(guò)字典創(chuàng)建DataFrame除了通過(guò)列表創(chuàng)建DataFrame,還可以通過(guò)字典來(lái)創(chuàng)建DataFrame并可以自定義列索引,這里默認(rèn)字典鍵為列索引,代碼如下:輸出結(jié)果如下??梢钥吹搅兴饕呀?jīng)變成了這里字典里的鍵名了。如果想讓字典鍵變成行索引,可以通過(guò)from_dict的方式來(lái)將字典轉(zhuǎn)換成DataFrame,并同時(shí)設(shè)置orient參數(shù)為index,代碼如下:其中orient參數(shù)指定字典鍵對(duì)應(yīng)的方向,默認(rèn)值為columns,如果不設(shè)置成index的話,則還是默認(rèn)字典鍵為列索引,輸出結(jié)果如下,此時(shí)的字典鍵已經(jīng)是行索引了。除了通過(guò)from_dict()函數(shù)設(shè)置orient參數(shù)外,我們還可以通過(guò)DataFrame的.T屬性來(lái)對(duì)列表進(jìn)行轉(zhuǎn)置,演示代碼如下:結(jié)果如下。可以看到通過(guò).T同樣可以對(duì)表格進(jìn)行轉(zhuǎn)置。此外注意,如果想改變?cè)瓉?lái)的表格結(jié)構(gòu),需要進(jìn)行重新賦值,寫成b=b.T,這樣就會(huì)改變?cè)瓉?lái)b的表格結(jié)構(gòu)了。02文件的讀取和寫入3.2文件的讀取和寫入3.2.1文件讀取以下代碼用于讀取Excel數(shù)據(jù):這里的Excel工作簿文件后綴名為xlsx,如果是2003版或更早版本的Excel工作簿,其后綴則為xls。這里使用的文件路徑是相對(duì)路徑,即代碼所在的文件路徑,也可以設(shè)置成絕對(duì)路徑(相對(duì)路徑和絕對(duì)路徑的相關(guān)知識(shí)點(diǎn)參考3.2.2節(jié)補(bǔ)充知識(shí)點(diǎn))。通過(guò)打印data我們便可以查看此時(shí)的表格,或者我們可以打印data.head()查看表格的前五行內(nèi)容(如果寫成head(10)則可以查看前10行數(shù)據(jù)),代碼如下:打印結(jié)果如下:
datescoreprice02018-09-037023.5512018-09-047524.4322018-09-056523.4132018-09-066022.8142018-09-077023.21第2行代碼中的read_excel還可以設(shè)定參數(shù),使用方式如下:3.2.2文件寫入以下代碼可以將數(shù)據(jù)寫入Excel工作簿。這里的文件存儲(chǔ)路徑使用的是相對(duì)路徑,也可以根據(jù)需要寫成絕對(duì)路徑。運(yùn)行之后將在代碼所在文件夾生成一個(gè)名為“演示.xlsx”的文件,文件內(nèi)容如下圖3-1所示。上圖中,行索引信息保留在工作表的第1列中,如果想在寫入數(shù)據(jù)時(shí)不保留行索引信息,可以設(shè)置to_excel的參數(shù)。to_excel的常見(jiàn)參數(shù)有:sheet_name用于指定工作表名稱;index指定是否寫入行索引信息,默認(rèn)為True,即保存行索引信息至輸出文件的第1列,若設(shè)置為False,則忽略行索引信息;columns用于指定要寫入的的列;encoding用于指定編碼方式。例如,要將data中的第1列數(shù)據(jù)導(dǎo)入Excel工作簿并忽略索引信息,則代碼如下:通過(guò)類似的方式,可以將data中的數(shù)據(jù)寫入到CSV文件當(dāng)中,代碼如下:和to_excel類似,to_csv也可以設(shè)置index、columns、encoding等參數(shù)。注意,如果在導(dǎo)出CSV文件事出現(xiàn)了中文亂碼現(xiàn)象,且encoding參數(shù)設(shè)置成“utf-8”失效,則需要將encoding參數(shù)設(shè)置成“utf_8_sig”,代碼如下:03數(shù)據(jù)讀取與篩選3.3數(shù)據(jù)讀取與篩選創(chuàng)建了DataFrame之后,就可以對(duì)其中的數(shù)據(jù)進(jìn)行讀取與編輯操作,本節(jié)就來(lái)講解相應(yīng)的方法。首先創(chuàng)建一個(gè)3行3列的DataFrame用于演示,行索引設(shè)定為r1、r2、r3,列索引設(shè)定為c1、c2、c3,代碼如下:打印輸出結(jié)果如下:3.3.1按照行列進(jìn)行數(shù)據(jù)篩選(1)按照列來(lái)選取數(shù)據(jù)先從簡(jiǎn)單的讀取單列數(shù)據(jù)入手,代碼如下:a的打印輸出結(jié)果如下:(2)按照行來(lái)選取數(shù)據(jù)可以根據(jù)行的序號(hào)來(lái)讀取數(shù)據(jù),代碼如下:打印輸出結(jié)果如下:而pandas推薦使用iloc方法來(lái)根據(jù)行序號(hào)讀取數(shù)據(jù),這樣更直觀,而且不會(huì)像data[1:3]可能會(huì)引起混淆。代碼如下:(3)按照區(qū)塊來(lái)選取如果想選取某幾行的某幾列數(shù)據(jù),例如,獲得c1和c3列的前2行數(shù)據(jù),代碼如下:其實(shí)就是把前面通過(guò)行和列讀取數(shù)據(jù)的方法進(jìn)行了整合,打印輸出結(jié)果如下:在實(shí)戰(zhàn)中,通常采用iloc和列讀取混合的方式來(lái)讀取特定的區(qū)塊數(shù)據(jù),代碼如下:3.3.2按照特定條件篩選通過(guò)在中括號(hào)里設(shè)定篩選條件可以過(guò)濾行。例如,讀取c1列中數(shù)字大于1的行,代碼如下:a的打印輸出結(jié)果如下:如果有多個(gè)篩選條件,可以通過(guò)“&”符號(hào)(表示“且”)或“|”(表示“或”)連接。例如,篩選c1列數(shù)字大于1且c2列中數(shù)字小于8的行,代碼如下,注意在篩選條件兩側(cè)要加上小括號(hào)。打印輸出結(jié)果如下:3.3.3數(shù)據(jù)整體情況查看通過(guò)表格的shape屬性,可以查看表格整體的行數(shù)和列數(shù),在表格數(shù)據(jù)量較大的時(shí)候能快速了解表格的行數(shù)和列數(shù)運(yùn)行結(jié)果如下,其中第一個(gè)數(shù)字為表格行數(shù),第二個(gè)數(shù)字為表格列數(shù)。通過(guò)表格的describe()函數(shù)可以快速的查看表格每一列的數(shù)量、平均值、標(biāo)準(zhǔn)差、最小值、25分位數(shù)、50分位數(shù)、75分位數(shù)、最大值等信息,代碼如下:
c1c2c3count3.03.03.0mean4.05.06.0std3.03.03.0min1.02.03.025%2.53.54.550%4.05.06.075%5.56.57.5max7.08.09.0運(yùn)行效果如下:通過(guò)value_counts()函數(shù)則可以快速的查看某一列都有什么數(shù)據(jù),以及該數(shù)據(jù)出現(xiàn)的頻次,代碼如下:運(yùn)行效果如下,可以看到c1列共有3種不同的數(shù)據(jù),且每個(gè)出現(xiàn)的頻次為1次。3.3.4數(shù)據(jù)運(yùn)算、排序與刪除(1)數(shù)據(jù)運(yùn)算從已有的列中,通過(guò)數(shù)據(jù)運(yùn)算創(chuàng)造新的一列,代碼如下:輸出結(jié)果如下:(2)數(shù)據(jù)排序使用sort_values()函數(shù)可以根據(jù)列對(duì)數(shù)據(jù)進(jìn)行排序。例如,要對(duì)c2列進(jìn)行降序排序,代碼如下:其中,參數(shù)by用于指定哪一列來(lái)排序;參數(shù)ascending為上升的意思,默認(rèn)值為True,設(shè)置為False則表示降序排序。a的打印輸出結(jié)果如下:使用sort_index()函數(shù)則可以根據(jù)行索引進(jìn)行排序。按行索引進(jìn)行升序排列的代碼如下:(3)數(shù)據(jù)刪除如果要?jiǎng)h除數(shù)據(jù)表中的指定數(shù)據(jù),就需要用到drop()函數(shù)。具體用法如下:drop()函數(shù)常用的幾個(gè)參數(shù)解釋如下:index用于指定要?jiǎng)h除的行;columns用于指定要?jiǎng)h除的列;inplace的默認(rèn)值為False,表示該刪除操作不改變?cè)砀瘢欠祷匾粋€(gè)執(zhí)行刪除操作后的新DataFrame,如果設(shè)置為True,則會(huì)直接在原表格中進(jìn)行刪除操作。例如,刪除c1列的數(shù)據(jù),代碼如下:刪除多列的數(shù)據(jù),例如,c1和c3列,可以通過(guò)列表的方式聲明,代碼如下:如果要?jiǎng)h除行數(shù)據(jù),例如,刪去第1行和第3行的數(shù)據(jù),代碼如下04數(shù)據(jù)表拼接3.4數(shù)據(jù)表拼接Pandas庫(kù)還提供了一些高級(jí)功能,其中的數(shù)據(jù)合并與重塑為兩個(gè)數(shù)據(jù)表的拼接提供了極大的便利。主要包括merge()函數(shù)、concat()函數(shù)、append()函數(shù),其中merge和append筆者個(gè)人用得較多。下面用一個(gè)簡(jiǎn)單的例子進(jìn)行演示。假設(shè)創(chuàng)建了如下兩個(gè)DataFrame數(shù)據(jù)表,需要將它們合并:上述代碼得到的df1和df2的內(nèi)容如下表所示df1df2
公司分?jǐn)?shù)
公司股價(jià)0萬(wàn)科900萬(wàn)科201阿里951阿里1802百度852京東303.4.1.merge()函數(shù)merge()函數(shù)可以根據(jù)一個(gè)或多個(gè)列將不同數(shù)據(jù)表格中的行連接起來(lái),代碼如下:運(yùn)行代碼后df3的內(nèi)容如下表所示。
公司分?jǐn)?shù)股價(jià)0萬(wàn)科90201阿里95180可以看到,merge()函數(shù)直接根據(jù)相同的列名(“公司”列)對(duì)數(shù)據(jù)表格進(jìn)行了進(jìn)行合并,而且默認(rèn)選取的是兩個(gè)表共有的列內(nèi)容(萬(wàn)科、阿里),如果相同的列名不止一個(gè),可以通過(guò)on參數(shù)指定按照哪一列進(jìn)行合并,代碼如下:默認(rèn)的合并其實(shí)是取交集(inner連接),即選取兩表共有的內(nèi)容,如果想取并集(outer連接),即選取兩表所有的內(nèi)容,可以設(shè)置how參數(shù),代碼如下:運(yùn)行代碼后,df3的內(nèi)容如下表所示,可以看到所有數(shù)據(jù)都在,原來(lái)沒(méi)有的內(nèi)容則賦值為空值NaN。
公司分?jǐn)?shù)股價(jià)0萬(wàn)科90.020.01阿里95.0180.02百度85.0NaN3京東NaN30.0
如果想保留左表(df1)全部?jī)?nèi)容,而不太在意右表(df2),可以將how參數(shù)設(shè)置為left,代碼如下:此時(shí)df3的內(nèi)容如下表所示,完整保留了df1的內(nèi)容(萬(wàn)科、阿里、百度)。
公司分?jǐn)?shù)股價(jià)0萬(wàn)科90.020.01阿里95.0180.02百度85.0NaN同理,如果想保留右表(df2)的全部?jī)?nèi)容,而不太在意左表(df1),可以將how參數(shù)設(shè)置為right。如果想根據(jù)行索引進(jìn)行合并,可以設(shè)置left_index和right_index參數(shù),代碼如下:此時(shí)df3如下表所示,兩張表按照它們的行索引進(jìn)行了合并。
公司_x分?jǐn)?shù)公司_y股價(jià)0萬(wàn)科90萬(wàn)科201阿里95阿里1802百度85京東303.4.2.concat()函數(shù)concat()函數(shù)是一種全連接(UNIONALL)方式,它不需要對(duì)齊,而是直接進(jìn)行合并,即不需要兩表的某些列或者索引相同,只是把數(shù)據(jù)整合到一起。所以concat()函數(shù)沒(méi)有how和on參數(shù),而是通過(guò)axis參數(shù)指定連接的軸向。該參數(shù)默認(rèn)為0,按行方向連接,即縱向拼接,代碼如下:此時(shí)df3的內(nèi)容如下表所示。
公司分?jǐn)?shù)股價(jià)0萬(wàn)科90.0NaN1阿里95.0NaN2百度85.0NaN0萬(wàn)科NaN20.01阿里NaN180.02京東NaN30.0此時(shí)行索引為原來(lái)兩個(gè)表各自的索引,如果想重置索引,可以使用reset_index()函數(shù)將索引重置,或者在concat()函數(shù)中設(shè)置ignore_index=True,忽略原有索引,生成新的數(shù)字序列作為索引進(jìn)行排序,代碼如下:如果想按列方向連接,即橫向拼接,可以設(shè)置axis參數(shù)為1,代碼如下:此時(shí)df3的內(nèi)容如下表所示。
公司分?jǐn)?shù)公司股價(jià)0萬(wàn)科90萬(wàn)科201阿里95阿里1802百度85京東303.4.3append()函數(shù)append()函數(shù)可以被認(rèn)為是concat()函數(shù)的簡(jiǎn)化版,效果和pd.concat([df1,df2])類似,實(shí)現(xiàn)的也是縱向拼接,代碼如下:append()函數(shù)還有個(gè)常用的功能,和列表.append()一樣,可用于新增元素,代碼如下:這里一定要設(shè)置ignore_index=True,用來(lái)忽略原索引,否則會(huì)報(bào)錯(cuò)(如果拼接的是DataFrame,不加這個(gè)也沒(méi)事,只是行數(shù)字索引會(huì)使用各個(gè)拼接表的原數(shù)字索引),此時(shí)df3的內(nèi)容如下表所示。
公司分?jǐn)?shù)0萬(wàn)科901阿里952百度853騰訊9005財(cái)務(wù)數(shù)據(jù)處理杜邦分析案例實(shí)戰(zhàn)3.5財(cái)務(wù)數(shù)據(jù)處理-案例實(shí)戰(zhàn)在2.2.1小節(jié)我們已經(jīng)介紹了如何利用income接口獲取利潤(rùn)表數(shù)據(jù),這里我們結(jié)合剛剛講到的有關(guān)DataFrame的知識(shí)點(diǎn)介紹一下如何不通過(guò)period的選擇來(lái)篩選特定時(shí)期的數(shù)據(jù)。3.5.1獲取年度數(shù)據(jù)——以利潤(rùn)表為例我們已經(jīng)通過(guò)下述代碼獲取了所有貴州茅臺(tái)的利潤(rùn)表數(shù)據(jù)(筆者寫下面代碼的時(shí)候是披露到了2020年年報(bào)):獲取到的數(shù)據(jù)結(jié)果以表格的形式呈現(xiàn),如下圖3-2所示。結(jié)果顯示,總共獲取了88條數(shù)據(jù),每一條/行數(shù)據(jù)對(duì)應(yīng)了一張利潤(rùn)表,因此88行數(shù)據(jù)對(duì)應(yīng)了貴州茅臺(tái)發(fā)布過(guò)的88張季報(bào)/年報(bào)的利潤(rùn)表;每行數(shù)據(jù)包括65列,對(duì)應(yīng)了利潤(rùn)表中65項(xiàng)數(shù)據(jù)。假如我們只需要獲取某一年的利潤(rùn)表,比如2020年年報(bào),相當(dāng)于只獲取“end_date”列取值為“20201231”的數(shù)據(jù),根據(jù)3.3.2小節(jié)所講,我們用如下代碼進(jìn)行選擇:我們還想只選取利潤(rùn)表特定項(xiàng)目的數(shù)據(jù),即“營(yíng)業(yè)總收入、營(yíng)業(yè)總成本、凈利潤(rùn)、息稅前利潤(rùn)”這幾列,我們只需找到這幾個(gè)科目對(duì)應(yīng)的字母代碼,然后根據(jù)3.3.1小節(jié)的知識(shí)點(diǎn),進(jìn)行列的選?。鹤⒁釪ataFrame進(jìn)行列選取時(shí)要以列表形式輸入?yún)?shù)。通過(guò)這兩步就得到了以下結(jié)果,如下圖:此外,也可以通過(guò)如下代碼直接獲取上述結(jié)果:3.5.2獲取多年數(shù)據(jù)——以資產(chǎn)負(fù)債表為例假如需要獲取多年數(shù)據(jù),例如需要獲取“貴州茅臺(tái)”2016年-2020年總計(jì)5年的資產(chǎn)負(fù)債表數(shù)據(jù),一般有2種方式。第一種是用參數(shù)period指定報(bào)告期,但因?yàn)樗荒苤付骋荒?,所以需要用for循環(huán)的方式對(duì)每年的數(shù)據(jù)分別獲取,參考代碼如下:可以看到這里用到了我們?cè)?.4.3小節(jié)提到的append函數(shù),這個(gè)函數(shù)經(jīng)常在涉及DataFrame的循環(huán)中用到,推薦讀者熟練掌握。獲取結(jié)果如下
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 土壤污染治理技術(shù)
- 古詩(shī)詞賞析教學(xué)方案
- 河南酒店采購(gòu)管理辦法
- 農(nóng)業(yè)貿(mào)易采購(gòu)管理辦法
- 北京自制車位管理辦法
- 區(qū)塊鏈技術(shù)在高等職業(yè)教育中的應(yīng)用與課程體系設(shè)計(jì)
- 《儒林外史》:經(jīng)典名著簡(jiǎn)介與解讀
- 電視節(jié)目制作中的角色扮演與情感表達(dá)策略
- 建筑工程數(shù)字化管理質(zhì)量提升策略研究
- 語(yǔ)文課后服務(wù)活動(dòng)方案
- 人教版小學(xué)3-6年級(jí)英語(yǔ)單詞表-已A4排版-可直接打印
- 手術(shù)室無(wú)菌概念和無(wú)菌技術(shù)課件
- 衛(wèi)生室安全管理制度
- 低碳生活綠色環(huán)保演示文稿
- 過(guò)盈配合壓入力計(jì)算公式
- 第八章-材料工程-倫理問(wèn)題-全
- 婚前協(xié)議(保護(hù)女方利益)
- 奉賢區(qū)教育系統(tǒng)師德師風(fēng)建設(shè)學(xué)習(xí)測(cè)試附有答案
- 扶貧農(nóng)產(chǎn)品購(gòu)銷合同協(xié)議(農(nóng)產(chǎn)品購(gòu)銷合同模板)
- 汽車維修高級(jí)工考試試題及參考答案
- GB/T 5782-2016六角頭螺栓
評(píng)論
0/150
提交評(píng)論