




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章財務數據分析利器——pandas庫Python是如何實現數據分析的呢?本章將簡單介紹Python數據分析的一大利器,也是一個基礎庫——pandas庫的使用方法。pandas庫是基于NumPy的一個開源Python庫,被廣泛用于數據快速分析,以及數據清洗和準備等工作中。某種程度上可以把pandas看作Python版的Excel。如果使用的是Anaconda,那么Anaconda自帶pandas庫,無須單獨安裝。NumPy是另一個重要的庫,是NumericalPython的簡稱(NumPy庫的相關知識點可以參考本書源代碼文件夾中的“補充知識點:NumPy庫基礎.pdf”)。相較NumPy,pandas更擅長處理二維數據。pandas主要有兩種數據結構:Series和DataFrame。Series類似于通過NumPy產生的一維數組,Series對象不僅包含數值,還包含一組索引,創建方式如下:生成結果如下所示,它是一個一維數據,并且對于每個元素都有一個行索引可以用來定位,比如可以通過s1[1]來定位第二個元素“王二”。Series單獨使用相對較少,pandas主要采用DataFrame數據結構。DataFrame是一種二維表格數據結構,直觀一點的話可以將其看作一個Excel表格。目錄DataFrame的創建文件的讀取和寫入數據的讀取與篩選數據表拼接財務數據處理杜邦分析案例實戰課后習題01Python是如何實現數據分析的呢?3.1DataFrame的創建有兩種DataFrame常見的創建方法:通過列表創建、通過字典創建。3.1.1通過列表創建DataFrame首先是通過列表創建,這個和通過Numpy創建二維數組比較類似。引入pandas庫方式通常為importpandasaspd,然后調用DataFrame功能創建二維數組。將a打印輸出,運行結果如下:和之前通過Numpy生成的二維數組進行比較:可以看到通過pandas的DataFrame功能生成的二維數組更像我們在Excel中看到二維表格數據,它也有行索引和列索引,其中這里的索引序號都是從0開始的。3.1.2通過字典創建DataFrame除了通過列表創建DataFrame,還可以通過字典來創建DataFrame并可以自定義列索引,這里默認字典鍵為列索引,代碼如下:輸出結果如下。可以看到列索引已經變成了這里字典里的鍵名了。如果想讓字典鍵變成行索引,可以通過from_dict的方式來將字典轉換成DataFrame,并同時設置orient參數為index,代碼如下:其中orient參數指定字典鍵對應的方向,默認值為columns,如果不設置成index的話,則還是默認字典鍵為列索引,輸出結果如下,此時的字典鍵已經是行索引了。除了通過from_dict()函數設置orient參數外,我們還可以通過DataFrame的.T屬性來對列表進行轉置,演示代碼如下:結果如下。可以看到通過.T同樣可以對表格進行轉置。此外注意,如果想改變原來的表格結構,需要進行重新賦值,寫成b=b.T,這樣就會改變原來b的表格結構了。02文件的讀取和寫入3.2文件的讀取和寫入3.2.1文件讀取以下代碼用于讀取Excel數據:這里的Excel工作簿文件后綴名為xlsx,如果是2003版或更早版本的Excel工作簿,其后綴則為xls。這里使用的文件路徑是相對路徑,即代碼所在的文件路徑,也可以設置成絕對路徑(相對路徑和絕對路徑的相關知識點參考3.2.2節補充知識點)。通過打印data我們便可以查看此時的表格,或者我們可以打印data.head()查看表格的前五行內容(如果寫成head(10)則可以查看前10行數據),代碼如下:打印結果如下:
datescoreprice02018-09-037023.5512018-09-047524.4322018-09-056523.4132018-09-066022.8142018-09-077023.21第2行代碼中的read_excel還可以設定參數,使用方式如下:3.2.2文件寫入以下代碼可以將數據寫入Excel工作簿。這里的文件存儲路徑使用的是相對路徑,也可以根據需要寫成絕對路徑。運行之后將在代碼所在文件夾生成一個名為“演示.xlsx”的文件,文件內容如下圖3-1所示。上圖中,行索引信息保留在工作表的第1列中,如果想在寫入數據時不保留行索引信息,可以設置to_excel的參數。to_excel的常見參數有:sheet_name用于指定工作表名稱;index指定是否寫入行索引信息,默認為True,即保存行索引信息至輸出文件的第1列,若設置為False,則忽略行索引信息;columns用于指定要寫入的的列;encoding用于指定編碼方式。例如,要將data中的第1列數據導入Excel工作簿并忽略索引信息,則代碼如下:通過類似的方式,可以將data中的數據寫入到CSV文件當中,代碼如下:和to_excel類似,to_csv也可以設置index、columns、encoding等參數。注意,如果在導出CSV文件事出現了中文亂碼現象,且encoding參數設置成“utf-8”失效,則需要將encoding參數設置成“utf_8_sig”,代碼如下:03數據讀取與篩選3.3數據讀取與篩選創建了DataFrame之后,就可以對其中的數據進行讀取與編輯操作,本節就來講解相應的方法。首先創建一個3行3列的DataFrame用于演示,行索引設定為r1、r2、r3,列索引設定為c1、c2、c3,代碼如下:打印輸出結果如下:3.3.1按照行列進行數據篩選(1)按照列來選取數據先從簡單的讀取單列數據入手,代碼如下:a的打印輸出結果如下:(2)按照行來選取數據可以根據行的序號來讀取數據,代碼如下:打印輸出結果如下:而pandas推薦使用iloc方法來根據行序號讀取數據,這樣更直觀,而且不會像data[1:3]可能會引起混淆。代碼如下:(3)按照區塊來選取如果想選取某幾行的某幾列數據,例如,獲得c1和c3列的前2行數據,代碼如下:其實就是把前面通過行和列讀取數據的方法進行了整合,打印輸出結果如下:在實戰中,通常采用iloc和列讀取混合的方式來讀取特定的區塊數據,代碼如下:3.3.2按照特定條件篩選通過在中括號里設定篩選條件可以過濾行。例如,讀取c1列中數字大于1的行,代碼如下:a的打印輸出結果如下:如果有多個篩選條件,可以通過“&”符號(表示“且”)或“|”(表示“或”)連接。例如,篩選c1列數字大于1且c2列中數字小于8的行,代碼如下,注意在篩選條件兩側要加上小括號。打印輸出結果如下:3.3.3數據整體情況查看通過表格的shape屬性,可以查看表格整體的行數和列數,在表格數據量較大的時候能快速了解表格的行數和列數運行結果如下,其中第一個數字為表格行數,第二個數字為表格列數。通過表格的describe()函數可以快速的查看表格每一列的數量、平均值、標準差、最小值、25分位數、50分位數、75分位數、最大值等信息,代碼如下:
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運行效果如下:通過value_counts()函數則可以快速的查看某一列都有什么數據,以及該數據出現的頻次,代碼如下:運行效果如下,可以看到c1列共有3種不同的數據,且每個出現的頻次為1次。3.3.4數據運算、排序與刪除(1)數據運算從已有的列中,通過數據運算創造新的一列,代碼如下:輸出結果如下:(2)數據排序使用sort_values()函數可以根據列對數據進行排序。例如,要對c2列進行降序排序,代碼如下:其中,參數by用于指定哪一列來排序;參數ascending為上升的意思,默認值為True,設置為False則表示降序排序。a的打印輸出結果如下:使用sort_index()函數則可以根據行索引進行排序。按行索引進行升序排列的代碼如下:(3)數據刪除如果要刪除數據表中的指定數據,就需要用到drop()函數。具體用法如下:drop()函數常用的幾個參數解釋如下:index用于指定要刪除的行;columns用于指定要刪除的列;inplace的默認值為False,表示該刪除操作不改變原表格,而是返回一個執行刪除操作后的新DataFrame,如果設置為True,則會直接在原表格中進行刪除操作。例如,刪除c1列的數據,代碼如下:刪除多列的數據,例如,c1和c3列,可以通過列表的方式聲明,代碼如下:如果要刪除行數據,例如,刪去第1行和第3行的數據,代碼如下04數據表拼接3.4數據表拼接Pandas庫還提供了一些高級功能,其中的數據合并與重塑為兩個數據表的拼接提供了極大的便利。主要包括merge()函數、concat()函數、append()函數,其中merge和append筆者個人用得較多。下面用一個簡單的例子進行演示。假設創建了如下兩個DataFrame數據表,需要將它們合并:上述代碼得到的df1和df2的內容如下表所示df1df2
公司分數
公司股價0萬科900萬科201阿里951阿里1802百度852京東303.4.1.merge()函數merge()函數可以根據一個或多個列將不同數據表格中的行連接起來,代碼如下:運行代碼后df3的內容如下表所示。
公司分數股價0萬科90201阿里95180可以看到,merge()函數直接根據相同的列名(“公司”列)對數據表格進行了進行合并,而且默認選取的是兩個表共有的列內容(萬科、阿里),如果相同的列名不止一個,可以通過on參數指定按照哪一列進行合并,代碼如下:默認的合并其實是取交集(inner連接),即選取兩表共有的內容,如果想取并集(outer連接),即選取兩表所有的內容,可以設置how參數,代碼如下:運行代碼后,df3的內容如下表所示,可以看到所有數據都在,原來沒有的內容則賦值為空值NaN。
公司分數股價0萬科90.020.01阿里95.0180.02百度85.0NaN3京東NaN30.0
如果想保留左表(df1)全部內容,而不太在意右表(df2),可以將how參數設置為left,代碼如下:此時df3的內容如下表所示,完整保留了df1的內容(萬科、阿里、百度)。
公司分數股價0萬科90.020.01阿里95.0180.02百度85.0NaN同理,如果想保留右表(df2)的全部內容,而不太在意左表(df1),可以將how參數設置為right。如果想根據行索引進行合并,可以設置left_index和right_index參數,代碼如下:此時df3如下表所示,兩張表按照它們的行索引進行了合并。
公司_x分數公司_y股價0萬科90萬科201阿里95阿里1802百度85京東303.4.2.concat()函數concat()函數是一種全連接(UNIONALL)方式,它不需要對齊,而是直接進行合并,即不需要兩表的某些列或者索引相同,只是把數據整合到一起。所以concat()函數沒有how和on參數,而是通過axis參數指定連接的軸向。該參數默認為0,按行方向連接,即縱向拼接,代碼如下:此時df3的內容如下表所示。
公司分數股價0萬科90.0NaN1阿里95.0NaN2百度85.0NaN0萬科NaN20.01阿里NaN180.02京東NaN30.0此時行索引為原來兩個表各自的索引,如果想重置索引,可以使用reset_index()函數將索引重置,或者在concat()函數中設置ignore_index=True,忽略原有索引,生成新的數字序列作為索引進行排序,代碼如下:如果想按列方向連接,即橫向拼接,可以設置axis參數為1,代碼如下:此時df3的內容如下表所示。
公司分數公司股價0萬科90萬科201阿里95阿里1802百度85京東303.4.3append()函數append()函數可以被認為是concat()函數的簡化版,效果和pd.concat([df1,df2])類似,實現的也是縱向拼接,代碼如下:append()函數還有個常用的功能,和列表.append()一樣,可用于新增元素,代碼如下:這里一定要設置ignore_index=True,用來忽略原索引,否則會報錯(如果拼接的是DataFrame,不加這個也沒事,只是行數字索引會使用各個拼接表的原數字索引),此時df3的內容如下表所示。
公司分數0萬科901阿里952百度853騰訊9005財務數據處理杜邦分析案例實戰3.5財務數據處理-案例實戰在2.2.1小節我們已經介紹了如何利用income接口獲取利潤表數據,這里我們結合剛剛講到的有關DataFrame的知識點介紹一下如何不通過period的選擇來篩選特定時期的數據。3.5.1獲取年度數據——以利潤表為例我們已經通過下述代碼獲取了所有貴州茅臺的利潤表數據(筆者寫下面代碼的時候是披露到了2020年年報):獲取到的數據結果以表格的形式呈現,如下圖3-2所示。結果顯示,總共獲取了88條數據,每一條/行數據對應了一張利潤表,因此88行數據對應了貴州茅臺發布過的88張季報/年報的利潤表;每行數據包括65列,對應了利潤表中65項數據。假如我們只需要獲取某一年的利潤表,比如2020年年報,相當于只獲取“end_date”列取值為“20201231”的數據,根據3.3.2小節所講,我們用如下代碼進行選擇:我們還想只選取利潤表特定項目的數據,即“營業總收入、營業總成本、凈利潤、息稅前利潤”這幾列,我們只需找到這幾個科目對應的字母代碼,然后根據3.3.1小節的知識點,進行列的選取:注意DataFrame進行列選取時要以列表形式輸入參數。通過這兩步就得到了以下結果,如下圖:此外,也可以通過如下代碼直接獲取上述結果:3.5.2獲取多年數據——以資產負債表為例假如需要獲取多年數據,例如需要獲取“貴州茅臺”2016年-2020年總計5年的資產負債表數據,一般有2種方式。第一種是用參數period指定報告期,但因為它只能指定某一年,所以需要用for循環的方式對每年的數據分別獲取,參考代碼如下:可以看到這里用到了我們在3.4.3小節提到的append函數,這個函數經常在涉及DataFrame的循環中用到,推薦讀者熟練掌握。獲取結果如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業發展戰略制定與規劃實務
- 農業灌溉水窖管理辦法
- 效率提升:關鍵指標勝任模型平衡記分卡
- 新質生產力推動無償獻血事業的高質量發展
- 化妝品市場未來發展趨勢預測與規劃
- 供銷職工餐廳管理辦法
- 醫療資質銷售管理辦法
- 土壤污染治理技術
- 古詩詞賞析教學方案
- 河南酒店采購管理辦法
- 低碳生活綠色環保演示文稿
- 過盈配合壓入力計算公式
- 第八章-材料工程-倫理問題-全
- 婚前協議(保護女方利益)
- 奉賢區教育系統師德師風建設學習測試附有答案
- 扶貧農產品購銷合同協議(農產品購銷合同模板)
- 汽車維修高級工考試試題及參考答案
- GB/T 5782-2016六角頭螺栓
- GB/T 23445-2009聚合物水泥防水涂料
- GB/T 13451.2-1992著色顏料相對著色力和白色顏料相對散射力的測定光度計法
- GB/T 11264-2012熱軋輕軌
評論
0/150
提交評論