Numpy、Pandas和Matplotlib包基礎知識

一. Python常用擴展包

        參考張良均的《Python數據分析與挖掘實戰》,下圖展示了常見的Python擴展包。



        常用的包主要包括:
        1.Numpy
        Python沒有提供數組,列表(List)可以完成數組,但不是真正的數據,當數據量增大時,,它的速度很慢。所以Numpy擴展包提供了數組支持,同時很多高級擴展包依賴它。例如:Scipy、Matplotlib、Pandas。

        2.Scipy
        該包提供矩陣支持,以及矩陣相關的數值計算模塊。如果說Numpy讓Python有了Matlab的味道,那麼Scipy就讓Python真正地成爲二半個Matlib。因爲涉及到矩陣內容,而課程中主要使用數組,所以不再介紹。

        3.Pandas
        Pandas是面板數據(Panel Data)的簡寫。它是Python最強大的數據分析和探索工具,因金融數據分析工具而開發,支持類似SQL的數據增刪改查,支持時間序列分析,靈活處理缺失數據,後面詳細介紹。

        4.Scikit-Learn
        Scikit-Learn是一個基於python的用於數據挖掘和數據分析的簡單且有效的工具,它的基本功能主要被分爲六個部分:分類(Classification)、迴歸(Regression)、聚類(Clustering)、數據降維(Dimensionality Reduction)、模型選擇(Model Selection)、數據預處理(Preprocessing),前面寫的很多文章算法都是出自該擴展包。
        詳見官網:http://scikit-learn.org/stable/

        5.Matplotlib
        該包主要用於繪圖和繪表,強大的數據可視化工具,做圖庫,語法類似MATLAB。同時,Seaborn也是數據可視化的工具包。
        注意:這些包在Anaconda集成環境中已經存在,可以直接使用,最早我是通過Python2.7來編寫代碼的,安裝過程通過pip install numpy,而且安裝順序非常講究,容易出錯,所以推薦大家使用該集成包。


二. Numpy科學計算包

        NumPy(Numeric Python)系統是Python的一種開源的數值計算擴展,一個用python實現的科學計算包。它提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專爲進行嚴格的數字處理而產生。
        推薦學習:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html
        下面通過這段代碼詳細講解這個包在數據分析中的常見用法:

        1.一維數組處理

[python] view plain copy
  1. #導入包並重命名  
  2. import numpy as np  
  3.   
  4. #定義一維數組  
  5. a = np.array([201583])  
  6. print u'原始數據:', a  
  7.   
  8. #輸出最大、最小值及形狀  
  9. print u'最小值:', a.min()  
  10. print u'最大值:', a.max()  
  11. print u'形狀', a.shape  
  12.   
  13. #數據切片  
  14. print u'切片操作:'  
  15. print a[:-2]  
  16. print a[-2:]  
  17. print a[:1]  
  18.   
  19. #排序  
  20. print type(a)  
  21. a.sort()  
  22. print u'排序後:', a  
        輸出結果如下所示:
[html] view plain copy
  1. 原始數據: [2 0 1 5 8 3]  
  2. 最小值: 0  
  3. 最大值: 8  
  4. 形狀 (6L,)  
  5. 切片操作:  
  6. [2 0 1 5]  
  7. [8 3]  
  8. [2]  
  9. <type 'numpy.ndarray'>  
  10. 排序後: [0 1 2 3 5 8]  
        核心代碼:
        代碼通過np.array定義了一個數組[2, 0, 1, 5, 8, 3],其中min計算最小值,max計算最大值,shape表示數組的形狀,因爲是一維數組,故6L(6個數字)。
        最重要的一個知識點是數組的切片操作,因爲在數據分析過程中,通常會對數據集進行"80%-20%"或"70%-30%"的訓練集和測試集劃分,通常採用的方法就是切片。
        a[:-2]表示從頭開始獲取,"-2"表示後面兩個值不取,結果:[2 0 1 5]
        a[-2:]表示後往前數兩個數字,獲取數字至結尾,即獲取最後兩個值[8 3]
        a[:1]表示從頭開始獲取,獲取1個數字,即[2]

        2.二維數組處理
        注意的是定義二維數組括號不要弄錯,正確的應該是:[[1,2,3],[4,5,6]]
        同時計算機的存儲下標都是從0開始計算的。

        代碼如下:
[python] view plain copy
  1. #定義二維數組  
  2. import numpy as np  
  3. c = np.array([[1234],[4567], [78910]])  
  4.   
  5. #獲取值  
  6. print u'形狀:', c.shape  
  7. print u'獲取值:', c[1][0]  
  8. print u'獲取某行:'  
  9. print c[1][:]  
  10. print u'獲取某行並切片:'  
  11. print c[0][:-1]  
  12. print c[0][-1:]  
  13.   
  14. #獲取具體某列值  
  15. print u'獲取第3列:'  
  16. print c[:,np.newaxis, 2]  
  17.   
  18. #調用sin函數  
  19. print np.sin(np.pi/6)  
  20. print type(np.sin(0.5))  
  21.   
  22. #範圍定義  
  23. print np.arange(0,4)  
  24. print type(np.arange(0,4))  

        代碼輸出結果如下所示:

[python] view plain copy
  1. 形狀: (3L4L)  
  2. 獲取值: 4  
  3. 獲取某行:  
  4. [4 5 6 7]  
  5. 獲取某行並切片:  
  6. [1 2 3]  
  7. [4]  
  8. 獲取第3列:  
  9. [[3]  
  10.  [6]  
  11.  [9]]  
  12. 0.5  
  13. <type 'numpy.float64'>  
  14. [0 1 2 3]  
  15. <type 'numpy.ndarray'>  
        需要注意:
       (1)獲取二維數組中的某行,如第2行數據[4,5,6,7],採用方法是:c[1][:];
       (2)獲取二維數組中的某列,如第2列數據[[3] [6] [9]],c[:,np.newaxis, 2]。因爲通常在數據可視化中採用獲取某列數據作爲x或y座標,同時多維數據也可以採用PCA降低成兩維數據,再進行顯示。
        最後希望讀者自己去閱讀該段代碼。



三. Pandas數據分析包

        Pandas是面板數據(Panel Data)的簡寫。它是Python最強大的數據分析和探索工具,因金融數據分析工具而開發,支持類似SQL的數據增刪改查,支持時間序列分析,靈活處理缺失數據。
        注意:首先聲明改包功能非常強大,我只是學習了它的非常小的一部分,後面隨着學習深入會寫更多它的用法,同時建議讀者自行學習,不喜勿噴。

        約定俗成的導入慣例:
        from pandas import Series, DataFrame
        import pandas as pd

        1.常見用法:讀寫文件
        這裏讀文件最常用的是兩種方法:

[python] view plain copy
  1. #寫入excel文件:  
  2. df.to_excel('foo.xlsx', sheet_name='Sheet1')  
  3. #從excel文件中讀取:  
  4. pd.read_excel('foo.xlsx''Sheet1', index_col=None, na_values=['NA'])  
  5. #寫入csv文件:  
  6. df.to_csv('foo.csv')  
  7. #從csv文件中讀取:  
  8. pd.read_csv('foo.csv')  
  9. #寫入HDF5存儲:  
  10. df.to_hdf('foo.h5','df')  
  11. #從HDF5存儲中讀取:  
  12. pd.read_hdf('foo.h5','df')  
        下面通過一個具體的案例來講解該包,這裏讀取的數據是張良均的《Python數據分析與挖掘實戰》的第六章的電力用戶數據集,missing_data.xls文件。內容如下,共3列數據,分別是用戶A、用戶B、用戶C,共21行,對應21天的用電量,其中包含缺失值。
[python] view plain copy
  1. 235.8333    324.0343    478.3231  
  2. 236.2708    325.6379    515.4564  
  3. 238.0521    328.0897    517.0909  
  4. 235.9063        514.89  
  5. 236.7604    268.8324      
  6.     404.048 486.0912  
  7. 237.4167    391.2652    516.233  
  8. 238.6563    380.8241      
  9. 237.6042    388.023 435.3508  
  10. 238.0313    206.4349    487.675  
  11. 235.0729          
  12. 235.5313    400.0787    660.2347  
  13.     411.2069    621.2346  
  14. 234.4688    395.2343    611.3408  
  15. 235.5   344.8221    643.0863  
  16. 235.6354    385.6432    642.3482  
  17. 234.5521    401.6234      
  18. 236 409.6489    602.9347  
  19. 235.2396    416.8795    589.3457  
  20. 235.4896        556.3452  
  21. 236.9688        538.347  

        部分Excel文件數據截圖如下所示:



        具體代碼如下所示:
[python] view plain copy
  1. #讀取數據 header設置Excel無標題頭  
  2. import pandas as pd  
  3. data = pd.read_excel("missing_data.xls", header=None)   
  4. print data  
  5.   
  6. #計算數據長度  
  7. print u'行數', len(data)  
  8.   
  9. #計算用戶A\B\C用電總和  
  10. print data.sum()  
  11.   
  12. #計算用戶A\B\C用點量算術平均數  
  13. mm = data.sum()  
  14. print mm  
  15.   
  16. #輸出預覽前5行數據  
  17. print u'預覽前5行數據'  
  18. print data.head()  
  19.   
  20. #輸出數據基本統計量  
  21. print u'輸出數據基本統計量'  
  22. print data.describe()  

        輸出結果如下所示:

[python] view plain copy
  1.            0         1         2  
  2. 0   235.8333  324.0343  478.3231  
  3. 1   236.2708  325.6379  515.4564  
  4. 2   238.0521  328.0897  517.0909  
  5. 3   235.9063       NaN  514.8900  
  6. 4   236.7604  268.8324       NaN  
  7. 5        NaN  404.0480  486.0912  
  8. 6   237.4167  391.2652  516.2330  
  9. 7   238.6563  380.8241       NaN  
  10. 8   237.6042  388.0230  435.3508  
  11. ...  
  12. 行數 21  
  13. 0    4488.9899  
  14. 1    6182.3265  
  15. 2    9416.3276  
  16. dtype: float64  
  17. 0    4488.9899  
  18. 1    6182.3265  
  19. 2    9416.3276  
  20. dtype: float64  
  21. 預覽前5行數據  
  22.           0         1         2  
  23. 0  235.8333  324.0343  478.3231  
  24. 1  236.2708  325.6379  515.4564  
  25. 2  238.0521  328.0897  517.0909  
  26. 3  235.9063       NaN  514.8900  
  27. 4  236.7604  268.8324       NaN  
  28. 輸出數據基本統計量  
  29.                 0           1           2  
  30. count   19.000000   17.000000   17.000000  
  31. mean   236.262626  363.666265  553.901624  
  32. std      1.225465   57.600529   67.707729  
  33. min    234.468800  206.434900  435.350800  
  34. 25%           NaN         NaN         NaN  
  35. 50%           NaN         NaN         NaN  
  36. 75%           NaN         NaN         NaN  
  37. max    238.656300  416.879500  660.234700  

        其中data.describe()輸出數據的基本信息統計,其方法參考前面的圖,包括count計數、std、max等函數。同時因爲Excel表格中存在空值,故Python顯示爲NaN(Not a Number)表示空。

        2.Series
        Series是一維標記數組,可以存儲任意數據類型,如整型、字符串、浮點型和Python對象等,軸標一般指索引。
        Series、Numpy中的一維array 、Python基本數據結構List區別:List中的元素可以是不同的數據類型,而Array和Series中則只允許存儲相同的數據類型,這樣可以更有效的使用內存,提高運算效率。

[python] view plain copy
  1. from pandas import Series, DataFrame  
  2.   
  3. #通過傳遞一個list對象來創建Series,默認創建整型索引;  
  4. a = Series([47, -53])  
  5. print u'創建Series:'  
  6. print a  
  7.   
  8. #創建一個帶有索引來確定每一個數據點的Series ;  
  9. b = Series([47, -53], index=['d''b''a''c'])  
  10. print u'創建帶有索引的Series:'  
  11. print b  
  12.   
  13. #如果你有一些數據在一個Python字典中,你可以通過傳遞字典來創建一個Series;  
  14. sdata = {'Ohio'35000'Texas'71000'Oregon'16000'Utah'5000}  
  15. c = Series(sdata)  
  16. print u'通過傳遞字典創建Series:'  
  17. print c  
  18. states = ['California''Ohio''Oregon''Texas']  
  19. d = Series(sdata, index=states)  
  20. print u'California沒有字典爲空:'  
  21. print d  
        輸出如下所示:
[python] view plain copy
  1. 創建Series:  
  2. 0    4  
  3. 1    7  
  4. 2   -5  
  5. 3    3  
  6. dtype: int64  
  7. 創建帶有索引的Series:  
  8. d    4  
  9. b    7  
  10. a   -5  
  11. c    3  
  12. dtype: int64  
  13. 通過傳遞字典創建Series:  
  14. Ohio      35000  
  15. Oregon    16000  
  16. Texas     71000  
  17. Utah       5000  
  18. dtype: int64  
  19. California沒有字典爲空:  
  20. California        NaN  
  21. Ohio          35000.0  
  22. Oregon        16000.0  
  23. Texas         71000.0  
  24. dtype: float64  
        Series的一個重要功能是在算術運算中它會自動對齊不同索引的數據。

        3.DataFrame      
        DataFrame是二維標記數據結構,列可以是不同的數據類型。它是最常用的pandas對象,像Series一樣可以接收多種輸入:lists、dicts、series和DataFrame等。初始化對象時,除了數據還可以傳index和columns這兩個參數。
        注意:
        (1) 在pandas中用函數 isnull 和 notnull 來檢測數據丟失:pd.isnull(a)、pd.notnull(b)。
        Series也提供了這些函數的實例方法:a.isnull()。
        (2) Pandas提供了大量的方法能夠輕鬆的對Series,DataFrame和Panel對象進行各種符合各種邏輯關係的合併操作。如:Concat、Merge (類似於SQL類型的合併)、Append (將一行連接到一個DataFrame上)。
        (3) DataFrame中常常會出現重複行,DataFrame的duplicated方法返回一個布爾型Series,表示各行是否是重複行;還有一個drop_duplicated方法,它返回一個移除了重複行的DataFrame。
        總之,Pandas是非常強大的一個數據分析包,很多功能都需要我自己去慢慢摸索。


四. Matplotlib畫圖包

        Matplotlib是一個Python的圖形框架,類似於MATLAB和R語言。它是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行製圖。而且也可以方便地將它作爲繪圖控件,嵌入GUI應用程序中。
        補充兩張圖,原自《Python數據分析與挖掘實戰》,對大家繪圖很有幫助。


       最常用的畫圖函數是plot,同時常用的設置樣式方法見下圖。



        這裏主要使用前面第三部分Pandas讀取的電力數據繪製圖形,主要是柱狀圖和餅圖。

        1.繪製柱狀圖

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2. """ 
  3. Created on Mon Nov 14 04:06:01 2016 
  4.  
  5. @author: yxz15 
  6. """  
  7.   
  8. #導入數據集  
  9. import pandas as pd  
  10. data = pd.read_excel("missing_data.xls", header=None)   
  11. mm = data.sum()  
  12. print u'計算用電量總數:'  
  13. print mm  
  14.   
  15. #繪製圖形  
  16. import numpy as np  
  17. import matplotlib.pyplot as plt  
  18. #中文字體顯示  
  19. plt.rc('font', family='SimHei', size=13)  
  20. N = 3  
  21. #3個用戶 0 1 2  
  22. ind = np.arange(N)  # the x locations for the groups   
  23. print ind  
  24. #設置寬度  
  25. width = 0.35          
  26. x = [u'用戶A', u'用戶B', u'用戶C']  
  27. #繪圖  
  28. plt.bar(ind, mm, width, color='r', label='sum num')  
  29. plt.xlabel(u"用戶名")  
  30. plt.ylabel(u"總耗電量")  
  31. plt.title(u'電力竊漏電用戶自動識別--總耗電量')  
  32. plt.legend()  
  33. #設置底部名稱  
  34. plt.xticks(ind+width/2, x, rotation=40#旋轉40度  
  35. plt.show()  
        輸出如下所示:

        2.繪製餅圖

[python] view plain copy
  1. import matplotlib.pyplot as plt  
  2.   
  3. fracs = [453025]             #每一塊佔得比例,總和爲100  
  4. n = mm[0]+mm[1]+mm[2]  
  5. a = (mm[0]*1.0*100/n)  
  6. b = (mm[1]*1.0*100/n)  
  7. c = (mm[2]*1.0*100/n)  
  8. print a, b, c, n  
  9. fracs = [a, b, c]  
  10.   
  11. explode=(000.08)             #離開整體的距離,看效果  
  12. labels = 'A''B''C'           #對應每一塊的標誌  
  13.   
  14. plt.pie(fracs, explode=explode, labels=labels,  
  15.                 autopct='%1.1f%%', shadow=True, startangle=90, colors = ("g""r""y"))  
  16.                                  # startangle是開始的角度,默認爲0,從這裏開始按逆時針方向依次展開  
  17.   
  18. plt.title('Raining Hogs and Dogs')   #標題  
  19.   
  20. plt.show()  
        輸出如下所示:

        3.柱狀圖及比例顯示
[python] view plain copy
  1. import matplotlib.pyplot as plt  
  2. import numpy as np  
  3. plt.rc('font', family='SimHei', size=13)  
  4.   
  5. num = np.array([13325940392278651])  
  6. ratio = np.array([0.750.760.720.75])  
  7. men = num * ratio  
  8. women = num * (1-ratio)  
  9. x = [u'聊天',u'支付',u'團購\n優惠券',u'在線視頻']  
  10.   
  11. width = 0.5  
  12. idx = np.arange(len(x))  
  13. plt.bar(idx, men, width, color='red', label=u'男性用戶')  
  14. plt.bar(idx, women, width, bottom=men, color='yellow', label=u'女性用戶')  
  15. plt.xlabel(u'應用類別')  
  16. plt.ylabel(u'男女分佈')  
  17. plt.xticks(idx+width/2, x, rotation=40)  
  18. plt.legend()  
  19. plt.show()  
        輸出如下所示(PS:該部分參考百度知道,網址忘記了,望提醒)。



        當然該包可以繪製更多的圖形,希望讀者自己去學習。比如線性迴歸:




        代碼部分詳解,引用前面自己寫的第三篇文章:
        matplotlib.pyplot是用來畫圖的方法,matplotlib是可視化包。
        import matplotlib.pyplot as plt

        繪製散點圖(scatter),橫軸爲x,獲取的第1列數據;縱軸爲y,獲取的第2列數據;c=y_pred對聚類的預測結果畫出散點圖,marker='o'說明用點表示圖形。
        plt.scatter(x, y, c=y_pred, marker='o') 

        表示圖形的標題爲Kmeans-heightweight Data。
        plt.title("Kmeans-Basketball Data")

        表示圖形x軸的標題。
        plt.xlabel("assists_per_minute")

        表示圖形y軸的標題。
        plt.ylabel("points_per_minute") 

        設置右上角圖例。
        plt.legend(["Rank"]) 

        表示顯示圖形。
        plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章