【Python資料探勘課程】六.Numpy、Pandas和Matplotlib包基礎知識

Eastmount發表於2016-11-14

        前面幾篇文章採用的案例的方法進行介紹的,這篇文章主要介紹Python常用的擴充套件包,同時結合資料探勘相關知識介紹該包具體的用法,主要介紹Numpy、Pandas和Matplotlib三個包。目錄:
        一.Python常用擴充套件包
        二.Numpy科學計算包
        三.Pandas資料分析包
        四.Matplotlib繪圖包

        前文推薦:
       【Python資料探勘課程】一.安裝Python及爬蟲入門介紹
       【Python資料探勘課程】二.Kmeans聚類資料分析及Anaconda介紹
       【Python資料探勘課程】三.Kmeans聚類程式碼實現、作業及優化
       【Python資料探勘課程】四.決策樹DTC資料分析及鳶尾資料集分析
       【Python資料探勘課程】五.線性迴歸知識及預測糖尿病例項

        繪圖強推:http://python.jobbole.com/85106/

        希望這篇文章對你有所幫助,尤其是剛剛接觸資料探勘以及大資料的同學,這些基礎知識真的非常重要。如果文章中存在不足或錯誤的地方,還請海涵~
        部分截圖參考張良均的《Python資料分析與挖掘實戰》,推薦大家購買閱讀。



一. 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.一維陣列處理

#匯入包並重新命名
import numpy as np

#定義一維陣列
a = np.array([2, 0, 1, 5, 8, 3])
print u'原始資料:', a

#輸出最大、最小值及形狀
print u'最小值:', a.min()
print u'最大值:', a.max()
print u'形狀', a.shape

#資料切片
print u'切片操作:'
print a[:-2]
print a[-2:]
print a[:1]

#排序
print type(a)
a.sort()
print u'排序後:', a
        輸出結果如下所示:
原始資料: [2 0 1 5 8 3]
最小值: 0
最大值: 8
形狀 (6L,)
切片操作:
[2 0 1 5]
[8 3]
[2]
<type 'numpy.ndarray'>
排序後: [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開始計算的。

        程式碼如下:
#定義二維陣列
import numpy as np
c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])

#獲取值
print u'形狀:', c.shape
print u'獲取值:', c[1][0]
print u'獲取某行:'
print c[1][:]
print u'獲取某行並切片:'
print c[0][:-1]
print c[0][-1:]

#獲取具體某列值
print u'獲取第3列:'
print c[:,np.newaxis, 2]

#呼叫sin函式
print np.sin(np.pi/6)
print type(np.sin(0.5))

#範圍定義
print np.arange(0,4)
print type(np.arange(0,4))

        程式碼輸出結果如下所示:

形狀: (3L, 4L)
獲取值: 4
獲取某行:
[4 5 6 7]
獲取某行並切片:
[1 2 3]
[4]
獲取第3列:
[[3]
 [6]
 [9]]
0.5
<type 'numpy.float64'>
[0 1 2 3]
<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.常見用法:讀寫檔案
        這裡讀檔案最常用的是兩種方法:

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

        部分Excel檔案資料截圖如下所示:



        具體程式碼如下所示:
#讀取資料 header設定Excel無標題頭
import pandas as pd
data = pd.read_excel("missing_data.xls", header=None) 
print data

#計算資料長度
print u'行數', len(data)

#計算使用者A\B\C用電總和
print data.sum()

#計算使用者A\B\C用點量算術平均數
mm = data.sum()
print mm

#輸出預覽前5行資料
print u'預覽前5行資料'
print data.head()

#輸出資料基本統計量
print u'輸出資料基本統計量'
print data.describe()

        輸出結果如下所示:

           0         1         2
0   235.8333  324.0343  478.3231
1   236.2708  325.6379  515.4564
2   238.0521  328.0897  517.0909
3   235.9063       NaN  514.8900
4   236.7604  268.8324       NaN
5        NaN  404.0480  486.0912
6   237.4167  391.2652  516.2330
7   238.6563  380.8241       NaN
8   237.6042  388.0230  435.3508
...
行數 21
0    4488.9899
1    6182.3265
2    9416.3276
dtype: float64
0    4488.9899
1    6182.3265
2    9416.3276
dtype: float64
預覽前5行資料
          0         1         2
0  235.8333  324.0343  478.3231
1  236.2708  325.6379  515.4564
2  238.0521  328.0897  517.0909
3  235.9063       NaN  514.8900
4  236.7604  268.8324       NaN
輸出資料基本統計量
                0           1           2
count   19.000000   17.000000   17.000000
mean   236.262626  363.666265  553.901624
std      1.225465   57.600529   67.707729
min    234.468800  206.434900  435.350800
25%           NaN         NaN         NaN
50%           NaN         NaN         NaN
75%           NaN         NaN         NaN
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中則只允許儲存相同的資料型別,這樣可以更有效的使用記憶體,提高運算效率。

from pandas import Series, DataFrame

#通過傳遞一個list物件來建立Series,預設建立整型索引;
a = Series([4, 7, -5, 3])
print u'建立Series:'
print a

#建立一個帶有索引來確定每一個資料點的Series ;
b = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
print u'建立帶有索引的Series:'
print b

#如果你有一些資料在一個Python字典中,你可以通過傳遞字典來建立一個Series;
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
c = Series(sdata)
print u'通過傳遞字典建立Series:'
print c
states = ['California', 'Ohio', 'Oregon', 'Texas']
d = Series(sdata, index=states)
print u'California沒有字典為空:'
print d
        輸出如下所示:
建立Series:
0    4
1    7
2   -5
3    3
dtype: int64
建立帶有索引的Series:
d    4
b    7
a   -5
c    3
dtype: int64
通過傳遞字典建立Series:
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64
California沒有字典為空:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
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.繪製柱狀圖

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 14 04:06:01 2016

@author: yxz15
"""

#匯入資料集
import pandas as pd
data = pd.read_excel("missing_data.xls", header=None) 
mm = data.sum()
print u'計算用電量總數:'
print mm

#繪製圖形
import numpy as np
import matplotlib.pyplot as plt
#中文字型顯示
plt.rc('font', family='SimHei', size=13)
N = 3
#3個使用者 0 1 2
ind = np.arange(N)  # the x locations for the groups 
print ind
#設定寬度
width = 0.35        
x = [u'使用者A', u'使用者B', u'使用者C']
#繪圖
plt.bar(ind, mm, width, color='r', label='sum num')
plt.xlabel(u"使用者名稱")
plt.ylabel(u"總耗電量")
plt.title(u'電力竊漏電使用者自動識別--總耗電量')
plt.legend()
#設定底部名稱
plt.xticks(ind+width/2, x, rotation=40) #旋轉40度
plt.show()

        輸出如下所示:

        2.繪製餅圖

import matplotlib.pyplot as plt

fracs = [45, 30, 25]             #每一塊佔得比例,總和為100
n = mm[0]+mm[1]+mm[2]
a = (mm[0]*1.0*100/n)
b = (mm[1]*1.0*100/n)
c = (mm[2]*1.0*100/n)
print a, b, c, n
fracs = [a, b, c]

explode=(0, 0, 0.08)             #離開整體的距離,看效果
labels = 'A', 'B', 'C'           #對應每一塊的標誌

plt.pie(fracs, explode=explode, labels=labels,
                autopct='%1.1f%%', shadow=True, startangle=90, colors = ("g", "r", "y"))
                                 # startangle是開始的角度,預設為0,從這裡開始按逆時針方向依次展開

plt.title('Raining Hogs and Dogs')   #標題

plt.show()
        輸出如下所示:

        3.柱狀圖及比例顯示
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='SimHei', size=13)

num = np.array([13325, 9403, 9227, 8651])
ratio = np.array([0.75, 0.76, 0.72, 0.75])
men = num * ratio
women = num * (1-ratio)
x = [u'聊天',u'支付',u'團購\n優惠券',u'線上視訊']

width = 0.5
idx = np.arange(len(x))
plt.bar(idx, men, width, color='red', label=u'男性使用者')
plt.bar(idx, women, width, bottom=men, color='yellow', label=u'女性使用者')
plt.xlabel(u'應用類別')
plt.ylabel(u'男女分佈')
plt.xticks(idx+width/2, x, rotation=40)
plt.legend()
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()


        最後希望文章對你有所幫助,上課內容還需要繼續探索,但enjoy myself~
        同時週末監考兩天回來,確實挺累的,事情堆了很多,浪費15個小時,發現這份工作,賺點外塊真不容易啊!甚至比程式猿累多了。
        當老師難,當好老師更難,當貴州的好老師難上難。希望還能堅持自己的夢想,做個財大信院的掃地僧吧,但每每和學生一起還是非常享受的。同時,這次熬夜寫文到深夜4點半,旁邊也坐著一個自己的學生,在除錯Struts、Json程式碼,所以說,還真不是這邊的學生差,你懂得,但也並不是沒有好老師,只是相對較少。fighting~
        最後補充學生馮Y的一首朋友圈感言:
        把握現在,活在當下。
        不以物喜,不以己悲。
        閒看花開花落,
        靜觀雲捲雲舒。
        順其自然,隨遇而安。
        我也希望自己有朝一日能達到這種心境~
        對這份工作、事業、校園、辦公還是得看淡點。

        (By:Eastmount 2016-11-14 中午4點半 http://blog.csdn.net/eastmount/ )

相關文章