NumPy、pandas、Matplotlib…8個Python庫從安裝到應用(附代碼)

導讀:Python本身的數據分析功能並不強,需要安裝一些第三方擴展庫來增強其相應的功能。本文將對NumPy、SciPy、Matplotlib、pandas、StatsModels、scikit-learn、Keras、Gensim等庫的安裝和使用進行簡單的介紹。

作者:張良均 譚立雲 劉名軍 江建明

NumPy、pandas、Matplotlib…8個Python庫從安裝到應用(附代碼)

如果讀者安裝的是Anaconda發行版,那麼它已經自帶了以下庫:NumPy、SciPy、Matplotlib、pandas、scikit-learn。

本文主要是對這些庫進行簡單的介紹,讀者也可以到官網閱讀更加詳細的使用教程。

  • NumPy:提供數組支持以及相應的高效的處理函數
  • SciPy:提供矩陣支持以及矩陣相關的數值計算模塊
  • Matplotlib:強大的數據可視化工具、作圖庫
  • pandas:強大、靈活的數據分析和探索工具
  • StatsModels:統計建模和計量經濟學,包括描述統計、統計模型估計和推斷
  • scikit-learn:支持迴歸、分類、聚類等強大的機器學習庫
  • Keras:深度學習庫,用於建立神經網絡以及深度學習模型
  • Gensim:用來做文本主題模型的庫,文本挖掘可能會用到

01 NumPy

Python並沒有提供數組功能。雖然列表可以完成基本的數組功能,但它不是真正的數組,而且在數據量較大時,使用列表的速度就會很慢。為此,NumPy提供了真正的數組功能以及對數據進行快速處理的函數。

NumPy還是很多更高級的擴展庫的依賴庫,我們後面介紹的SciPy、Matplotlib、pandas等庫都依賴於它。值得強調的是,NumPy內置函數處理數據的速度是C語言級別的,因此在編寫程序的時候,應當儘量使用其內置函數,避免效率瓶頸的(尤其是涉及循環的問題)出現。

在Windows操作系統中,NumPy的安裝跟普通第三方庫的安裝一樣,可以通過pip命令進行,命令如下:

<code>pip install numpy/<code>

也可以自行下載源代碼,然後使用如下命令安裝:

<code>python setup.py install/<code>

在Linux操作系統下,上述方法也是可行的。此外,很多Linux發行版的軟件源中都有Python常見的庫,因此還可以通過Linux系統自帶的軟件管理器安裝,如在Ubuntu下可以用如下命令安裝:

<code>sudo apt-get install python-numpy/<code>

安裝完成後,可以使用NumPy對數據進行操作,如代碼清單2-27所示。

  • 代碼清單2-27 使用NumPy操作數組
<code># -*- coding: utf-8 -*
import numpy as np                     # 一般以np作為NumPy庫的別名
a = np.array([2, 0, 1, 5])             # 創建數組
print(a)                               # 輸出數組
print(a[:3])                           # 引用前三個數字(切片)
print(a.min())                         # 輸出a的最小值
a.sort()                               # 將a的元素從小到大排序,此操作直接修改a,因此這時候a為[0, 1, 2, 5]
b= np.array([[1, 2, 3], [4, 5, 6]])    # 創建二維數組
print(b*b)                             # 輸出數組的平方陣,即[[1, 4, 9], [16, 25, 36]]/<code>

NumPy是Python中相當成熟和常用的庫,因此關於它的教程有很多,最值得一看的是其官網的幫助文檔,其次還有很多中英文教程,讀者遇到相應的問題時,可以查閱相關資料。

參考鏈接:

http://www.numpy.org

http://reverland.org/python/2012/08/22/numpy

02 SciPy

如果說NumPy讓Python有了MATLAB的味道,那麼SciPy就讓Python真正成為半個MATLAB了。NumPy提供了多維數組功能,但它只是一般的數組,並不是矩陣,比如當兩個數組相乘時,只是對應元素相乘,而不是矩陣乘法。SciPy提供了真正的矩陣以及大量基於矩陣運算的對象與函數。

SciPy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算,顯然,這些功能都是挖掘與建模必需的。

SciPy依賴於NumPy,因此安裝之前得先安裝好NumPy。安裝SciPy的方式與安裝NumPy的方法大同小異,需要提及的是,在Ubuntu下也可以用類似的命令安裝SciPy,安裝命令如下:

<code>sudo apt-get install python-scipy/<code>

安裝好SciPy後,使用SciPy求解非線性方程組和數值積分,如代碼清單2-28所示。

  • 代碼清單2-28 使用SciPy求解非線性方程組和數值積分
<code># -*- coding: utf-8 -*
# 求解非線性方程組2x1-x2^2=1,x1^2-x2=2
from scipy.optimize import fsolve      # 導入求解方程組的函數
def f(x):               # 定義要求解的方程組
    x1 = x[0]
    x2 = x[1]
    return [2*x1 - x2**2 - 1, x1**2 - x2 -2]

result = fsolve(f, [1,1])       # 輸入初值[1, 1]並求解
print(result)               # 輸出結果,為array([ 1.91963957,  1.68501606])

# 數值積分
from scipy import integrate       # 導入積分函數
def g(x):               # 定義被積函數
    return (1-x**2)**0.5

pi_2, err = integrate.quad(g, -1, 1)    # 積分結果和誤差
print(pi_2 * 2)               # 由微積分知識知道積分結果為圓周率pi的一半/<code>

參考鏈接:

http://www.scipy.org

http://reverland.org/python/2012/08/24/scipy

03 Matplotlib

不論是數據挖掘還是數學建模,都要面對數據可視化的問題。對於Python來說,Matplotlib是最著名的繪圖庫,主要用於二維繪圖,當然也可以進行簡單的三維繪圖。

它不僅提供了一整套和MATLAB相似但更為豐富的命令,讓我們可以非常快捷地用Python可視化數據,而且允許輸出達到出版質量的多種圖像格式。

Matplotlib的安裝並沒有什麼特別之處,可以通過“pip install matplotlib”命令安裝或者自行下載源代碼安裝,在Ubuntu下也可以用類似的命令安裝,命令如下:

<code>sudo apt-get install python-matplotlib/<code>

需要注意的是,Matplotlib的上級依賴庫相對較多,手動安裝的時候,需要逐一把這些依賴庫都安裝好。安裝完成後就可以牛刀小試了。下面是一個簡單的作圖例子,如代碼清單2-29所示,它基本包含了Matplotlib作圖的關鍵要素,作圖效果如圖2-5所示。

  • 代碼清單2-29 Matplotlib作圖示例
<code># -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt             # 導入Matplotlib

x = np.linspace(0, 10, 1000)             # 作圖的變量自變量
y = np.sin(x) + 1                      # 因變量y
z = np.cos(x**2) + 1                   # 因變量z

plt.figure(figsize = (8, 4))               # 設置圖像大小
plt.plot(x,y,label = '$\\sin x+1$', color = 'red', linewidth = 2)
                             # 作圖,設置標籤、線條顏色、線條大小

plt.plot(x, z, 'b--', label = '$\\cos x^2+1$')      # 作圖,設置標籤、線條類型
plt.xlabel('Time(s) ')                 # x軸名稱
plt.ylabel('Volt')                   # y軸名稱
plt.title('A Simple Example')               # 標題
plt.ylim(0, 2.2)                      # 顯示的y軸範圍
plt.legend()                       # 顯示圖例
plt.show()                       # 顯示作圖結果/<code>
NumPy、pandas、Matplotlib…8個Python庫從安裝到應用(附代碼)

▲圖2-5 Matplotlib的作圖效果展示

如果讀者使用的是中文標籤,就會發現中文標籤無法正常顯示,這是因為Matplotlib的默認字體是英文字體,解決方法是在作圖之前手動指定默認字體為中文字體,如黑體(Sim-Hei),命令如下:

<code>plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤/<code>

其次,保存作圖圖像時,負號有可能不能顯示,對此可以通過以下代碼解決:

<code>plt.rcParams['axes.unicode_minus'] = False    # 解決保存圖像是負號'-'顯示為方塊的問題/<code>

這裡有一個小建議:有時間多去Matplotlib提供的“畫廊”欣賞用它做出的漂亮圖片,也許你就會慢慢愛上Matplotlib作圖了。

畫廊網址:

http://matplotlib.org/gallery.html

參考鏈接:

http://matplotlib.org

http://reverland.org/python/2012/09/07/matplotlib-tutorial

04 pandas

pandas是Python下最強大的數據分析和探索工具。

它包含高級的數據結構和精巧的工具,使得用戶在Python中處理數據非常快速和簡單。

pandas建造在NumPy之上,它使得以NumPy為中心的應用使用起來更容易。pandas的名稱來自於面板數據(Panel Data)和Python數據分析(Data Analysis),它最初作為金融數據分析工具被開發,由AQR Capital Management於2008年4月開發問世,並於2009年底開源出來。

pandas的功能非常強大,支持類似SQL的數據增、刪、查、改,並且帶有豐富的數據處理函數;支持時間序列分析功能;支持靈活處理缺失數據;等等。事實上,單純地用pandas這個工具就足以寫一本書,讀者可以閱讀pandas的主要作者之一Wes Mc-Kinney寫的《利用Python進行數據分析》來學習更詳細的內容。

1. 安裝

pandas的安裝相對來說比較容易一些,只要安裝好NumPy之後,就可以直接安裝了,通過pip install pandas命令或下載源碼後通過python setup.py install命令安裝均可。

由於我們頻繁用到讀取和寫入Excel,但默認的pandas還不能讀寫Excel文件,需要安裝xlrd(讀)度和xlwt(寫)庫才能支持Excel的讀寫。為Python添加讀取/寫入Excel功能的命令如下:

<code>pip install xlrd          # 為Python添加讀取Excel的功能
pip install xlwt          # 為Python添加寫入Excel的功能/<code>

2. 使用

在後面的章節中,我們會逐步展示pandas的強大功能,而在本節,我們先以簡單的例子一睹為快。

首先,pandas基本的數據結構是Series和DataFrame。Series顧名思義就是序列,類似一維數組;DataFrame則相當於一張二維的表格,類似二維數組,它的每一列都是一個Series。

為了定位Series中的元素,pandas提供了Index這一對象,每個Series都會帶有一個對應的Index,用來標記不同的元素,Index的內容不一定是數字,也可以是字母、中文等,它類似於SQL中的主鍵。

類似的,DataFrame相當於多個帶有同樣Index的Series的組合(本質是Series的容器),每個Series都帶有一個唯一的表頭,用來標識不同的Series。pandas中常用操作的示例如代碼清單2-30所示。

  • 代碼清單2-30 pandas中的常用操作
<code># -*- coding: utf-8 -*-
import numpy as np

import pandas as pd                              # 通常用pd作為pandas的別名。

s = pd.Series([1,2,3], index=['a', 'b', 'c'])    # 創建一個序列s
                                                 # 創建一個表
d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
d2 = pd.DataFrame(s)                             # 也可以用已有的序列來創建數據框

d.head()                                         # 預覽前5行數據
d.describe()                                     # 數據基本統計量

# 讀取文件,注意文件的存儲路徑不能帶有中文,否則讀取可能出錯。
pd.read_excel('data.xls')                    # 讀取Excel文件,創建DataFrame。
pd.read_csv('data.csv', encoding='utf-8')    # 讀取文本格式的數據,一般用encoding指定編碼。/<code>

由於pandas是本書的主力工具,在後面將會頻繁使用它,因此這裡不再詳細介紹,後文會更加詳盡地講解pandas的使用方法。

參考鏈接:

http://pandas.pydata.org/pandas-docs/stable/

05 StatsModels

pandas著重於數據的讀取、處理和探索,而StatsModels則更加註重數據的統計建模分析,它使得Python有了R語言的味道。StatsModels支持與pandas進行數據交互,因此,它與pandas結合成為Python下強大的數據挖掘組合。

安裝StatsModels相當簡單,既可以通過pip命令安裝,又可以通過源碼安裝。對於Windows用戶來說,官網上甚至已經有編譯好的exe文件可供下載。如果手動安裝的話,需要自行解決好依賴問題,StatsModels依賴於pandas(當然也依賴於pandas所依賴的庫),同時還依賴於Pasty(一個描述統計的庫)。

使用StatsModels進行ADF平穩性檢驗,如代碼清單2-31所示。

  • 代碼清單2-31 使用StatsModels進行ADF平穩性檢驗
<code># -*- coding: utf-8 -*-
from statsmodels.tsa.stattools import adfuller as ADF    # 導入ADF檢驗
import numpy as np

ADF(np.random.rand(100))                                 # 返回的結果有ADF值、p值等/<code>

參考鏈接:

http://statsmodels.sourceforge.net/stable/index.html

06 scikit-learn

從該庫的名字可以看出,這是一個與機器學習相關的庫。不錯,scikit-learn是Python下強大的機器學習工具包,它提供了完善的機器學習工具箱,包括數據預處理、分類、迴歸、聚類、預測、模型分析等。

scikit-learn依賴於NumPy、SciPy和Matplotlib,因此,只需要提前安裝好這幾個庫,然後安裝scikit-learn基本上就沒有什麼問題了,安裝方法跟前幾個庫的安裝一樣,可以通過pip install scikit-learn命令安裝,也可以下載源碼自行安裝。

使用scikit-learn創建機器學習的模型很簡單,示例如代碼清單2-32所示。

  • 代碼清單2-32 使用scikit-learn創建機器學習模型
<code># -*- coding: utf-8 -*-
from sklearn.linear_model import LinearRegression     # 導入線性迴歸模型
model = LinearRegression()                            # 建立線性迴歸模型
print(model)/<code>

1. 所有模型提供的接口有

對於訓練模型來說是model.fit(),對於監督模型來說是fit(X, y),對於非監督模型是fit(X)。

2. 監督模型提供如下接口

  • model.predict(X_new):預測新樣本。
  • model.predict_proba(X_new):預測概率,僅對某些模型有用(比如LR)。
  • model.score():得分越高,fit越好。

3. 非監督模型提供如下接口

  • model.transform():從數據中學到新的“基空間”。
  • model.fit_transform():從數據中學到新的基並將這個數據按照這組“基”進行轉換。

Scikit-learn本身提供了一些實例數據供我們上手學習,比較常見的有安德森鳶尾花卉數據集、手寫圖像數據集等。

安德森鳶尾花卉數據集有150個鳶尾花的尺寸觀測值,如萼片長度和寬度,花瓣長度和寬度;還有它們的亞屬:山鳶尾(iris setosa)、變色鳶尾(iris versicolor)和維吉尼亞鳶尾(iris virginica)。導入iris數據集並使用該數據訓練SVM模型,如代碼清單2-33所示。

  • 代碼清單2-33 導入iris數據集並訓練SVM模型
<code># -*- coding: utf-8 -*-
from sklearn import datasets           # 導入數據集

iris = datasets.load_iris()            # 加載數據集
print(iris.data.shape)                 # 查看數據集大小

from sklearn import svm                # 導入SVM模型


clf = svm.LinearSVC()                       # 建立線性SVM分類器
clf.fit(iris.data, iris.target)             # 用數據訓練模型
clf.predict([[ 5.0,  3.6,  1.3,  0.25]])    # 訓練好模型之後,輸入新的數據進行預測
clf.coef_                                   # 查看訓練好模型的參數/<code>

參考鏈接:

http://scikit-learn.org/stable/

07 Keras

scikit-learn已經足夠強大了,然而它並沒有包含這一強大的模型—人工神經網絡。人工神經網絡是功能相當強大但是原理又相當簡單的模型,在語言處理、圖像識別等領域都有重要的作用。近年來逐漸流行的“深度學習”算法,實質上也是一種神經網絡,可見在Python中實現神經網絡是非常必要的。

本書用Keras庫來搭建神經網絡。事實上,Keras並非簡單的神經網絡庫,而是一個基於Theano的強大的深度學習庫,利用它不僅可以搭建普通的神經網絡,還可以搭建各種深度學習模型,如自編碼器、循環神經網絡、遞歸神經網絡、卷積神經網絡等。由於它是基於Theano的,因此速度也相當快。

Theano也是Python的一個庫,它是由深度學習專家Yoshua Bengio帶領的實驗室開發出來的,用來定義、優化和高效地解決多維數組數據對應數學表達式的模擬估計問題。它具有高效實現符號分解、高度優化的速度和穩定性等特點,最重要的是它還實現了GPU加速,使得密集型數據的處理速度是CPU的數十倍。

用Theano就可以搭建起高效的神經網絡模型,然而對於普通讀者來說門檻還是相當高的。Keras正是為此而生,它大大簡化了搭建各種神經網絡模型的步驟,允許普通用戶輕鬆地搭建並求解具有幾百個輸入節點的深層神經網絡,而且定製的自由度非常大,讀者甚至因此驚呼:搭建神經網絡可以如此簡單!

1. 安裝

安裝Keras之前首先需要安裝NumPy、SciPy和Theano。安裝Theano之前首先需要準備一個C++編譯器,這在Linux系統下是自帶的。因此,在Linux系統下安裝Theano和Keras都非常簡單,只需要下載源代碼,然後用python setup.py install安裝就行了,具體可以參考官方文檔。

可是在Windows系統下就沒有那麼簡單了,因為它沒有現成的編譯環境,一般而言是先安裝MinGW(Windows系統下的GCC和G++),然後再安裝Theano(提前裝好NumPy等依賴庫),最後安裝Keras,如果要實現GPU加速,還需要安裝和配置CUDA。

值得一提的是,在Windows系統下的Keras速度會大打折扣,因此,想要在神經網絡、深度學習做深入研究的讀者,請在Linux系統下搭建相應的環境。

參考鏈接:

http://deeplearning.net/software/theano/install.html#install

2. 使用

用Keras搭建神經網絡模型的過程相當簡單,也相當直觀,就像搭積木一般,通過短短几十行代碼,就可以搭建起一個非常強大的神經網絡模型,甚至是深度學習模型。簡單搭建一個MLP(多層感知器),如代碼清單2-34所示。

  • 代碼清單2-34 搭建一個MLP(多層感知器)
<code># -*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD

model = Sequential()                # 模型初始化
model.add(Dense(20, 64))            # 添加輸入層(20節點)、第一隱藏層(64節點)的連接
model.add(Activation('tanh'))       # 第一隱藏層用tanh作為激活函數
model.add(Dropout(0.5))             # 使用Dropout防止過擬合
model.add(Dense(64, 64))            # 添加第一隱藏層(64節點)、第二隱藏層(64節點)的連接
model.add(Activation('tanh'))       # 第二隱藏層用tanh作為激活函數
model.add(Dropout(0.5))             # 使用Dropout防止過擬合

model.add(Dense(64, 1))             # 添加第二隱藏層(64節點)、輸出層(1節點)的連接
model.add(Activation('sigmoid'))    # 輸出層用sigmoid作為激活函數

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)    # 定義求解算法
model.compile(loss='mean_squared_error', optimizer=sgd)       # 編譯生成模型,損失函數為平均誤差平方和

model.fit(X_train, y_train, nb_epoch=20, batch_size=16)       # 訓練模型
score = model.evaluate(X_test, y_test, batch_size=16)        # 測試模型/<code>

要注意的是,Keras的預測函數跟scikit-learn有所差別,Keras用model.predict()方法給出概率,用model.predict_classes()給出分類結果。

參考鏈接:

https://keras.io/

08 Gensim

在Gensim官網中,它對自己的簡介只有一句話:topic modelling for humans!

Gensim用來處理語言方面的任務,如文本相似度計算、LDA、Word2Vec等,這些領域的任務往往需要比較多的背景知識。

在這一節中,我們只是提醒讀者有這麼一個庫的存在,而且這個庫很強大,如果讀者想深入瞭解這個庫,可以去閱讀官方幫助文檔或參考鏈接。

值得一提的是,Gensim把Google在2013年開源的著名的詞向量構造工具Word2Vec編譯好了,作為它的子庫,因此需要用到Word2Vec的讀者也可以直接使用Gensim,而無須自行編譯了。

Gensim的作者對Word2Vec的代碼進行了優化,所以它在Gensim下的表現比原生的Word2Vec還要快。(為了實現加速,需要準備C++編譯器環境,因此,建議使用Gensim的Word2Vec的讀者在Linux系統環境下運行。)

下面是一個Gensim使用Word2Vec的簡單例子,如代碼清單2-35所示。

  • 代碼清單2-35 Gensim使用Word2Vec的簡單示例
<code># -*- coding: utf-8 -*-
import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level= logging.INFO)
# logging是用來輸出訓練日誌

# 分好詞的句子,每個句子以詞列表的形式輸入
sentences = [['first', 'sentence'], ['second', 'sentence']]

# 用以上句子訓練詞向量模型
model = gensim.models.Word2Vec(sentences, min_count=1)

print(model['sentence'])    # 輸出單詞sentence的詞向量。/<code>

參考鏈接:

http://radimrehurek.com/gensim/

關於作者:張良均,資深大數據挖掘與分析專家、模式識別專家、AI技術專家。有10餘年大數據挖掘與分析經驗,擅長Python、R、Hadoop、Matlab等技術實現的數據挖掘與分析,對機器學習等AI技術驅動的數據分析也有深入研究。

本文摘編自《Python數據分析與挖掘實戰》(第2版),經出版方授權發佈。

NumPy、pandas、Matplotlib…8個Python庫從安裝到應用(附代碼)

延伸閱讀《Python數據分析與挖掘實戰》

推薦語:暢銷書全新升級,第1版銷售超過10萬冊,被國內100餘所高等院校採用為教材,同時被廣大數據科學工作者奉為經典,是該領域公認的事實標準。作者在大數據挖掘與分析等領域有10餘年的工程實踐、教學和創辦企業的經驗,不僅掌握行業的最新技術和實踐方法,而且洞悉學生和老師的需求與痛點。


分享到:


相關文章: