一. 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]
-
-
-
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.常見用法:讀寫文件
這裏讀文件最常用的是兩種方法:
-
-
df.to_excel('foo.xlsx', sheet_name='Sheet1')
-
-
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
-
-
df.to_csv('foo.csv')
-
-
pd.read_csv('foo.csv')
-
-
df.to_hdf('foo.h5','df')
-
-
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文件數據截圖如下所示:
具體代碼如下所示:
-
-
import pandas as pd
-
data = pd.read_excel("missing_data.xls", header=None)
-
print data
-
-
-
print u'行數', len(data)
-
-
-
print data.sum()
-
-
-
mm = data.sum()
-
print mm
-
-
-
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
-
-
-
a = Series([4, 7, -5, 3])
-
print u'創建Series:'
-
print a
-
-
-
b = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
-
print u'創建帶有索引的Series:'
-
print b
-
-
-
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.繪製柱狀圖
-
-
-
-
-
-
-
-
-
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
-
-
ind = np.arange(N)
-
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)
-
plt.show()
輸出如下所示:
2.繪製餅圖
-
import matplotlib.pyplot as plt
-
-
fracs = [45, 30, 25]
-
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"))
-
-
-
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()