天天看點

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

本節書摘來自華章出版社《python資料分析與挖掘實戰》一書中的第2章,第2.3節,作者 張良均 王路 譚立雲 蘇劍林,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

python本身的資料分析功能不強,需要安裝一些第三方擴充庫來增強它的能力。本書用到的庫有numpy、scipy、matplotlib、pandas、scikit-learn、keras和gensim等,下面将對這些庫的安裝和使用進行簡單的介紹。

如果讀者安裝的是anaconda發行版,那麼它已經自帶了以下庫:numpy、scipy、mat-plotlib、pandas和scikit-learn。

本章主要是對這些庫進行簡單的介紹,在後面的章節中,會通過各種案例對這些庫的使用進行更加深入的說明。本書的介紹是有所側重的,讀者可以到官網閱讀更加詳細的使用教程。值得一提的是,本書所介紹的擴充庫,它們的官網上的幫助文檔都相當詳細。

用python進行科學計算是很豐富的學問,本書隻是用到了它的資料分析和挖掘相關的部分功能,所涉及的一些庫如表2-4所示。讀者可以參考書籍《用python做科學計算》了解更多資訊。

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

限于篇幅,我們僅僅介紹本書的案例中會用到的一些庫,還有一些很實用的庫并沒有介紹,如涉及圖檔處理可以用pillow(舊版為pil,目前已經被pillow代替)、涉及視訊處理可以用opencv、涉及高精度運算可以用gmpy2等,而對于這些額外的知識,建議讀者在遇到相應的問題時,自行到網上搜尋相關資料。相信通過對本書的學習後,讀者解決python相關問題的能力一定會大大提高的。

python并沒有提供數組功能。雖然清單可以完成基本的數組功能,但它不是真正的數組,而且在資料量較大時,使用清單的速度就會慢得讓人難以接受。為此,numpy提供了真正的數組功能,以及對資料進行快速處理的函數。numpy還是很多更進階的擴充庫的依賴庫,後面章節介紹的scipy、matplotlib、pandas等庫都依賴于它。值得強調的是,numpy内置函數處理資料的速度是c語言級别的,是以在編寫程式的時候,應當盡量使用它們内置的函數,避免出現效率瓶頸的現象(尤其是涉及循環的問題)。

在windows中,numpy安裝跟普通的第三方庫安裝一樣,可以通過pip安裝:

也可以自行下載下傳源代碼,然後用

安裝。在linux下上述方面也是可行的。此外,很多linux發行版的軟體源中都有python常見的庫,是以還可以通過linux自帶的軟體管理器進行安裝,如在ubuntu下可以用

sudo apt-get install python-numpy

安裝。安裝完成後,可以使用以下指令進行測試。

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

numpy是python中相當成熟和常用的庫,是以關于它的教程有很多,最值得一看的是它官網的幫助文檔,還有很多中英文教程,讀者遇到相應的問題時,可以自行搜尋對應的内容。

參考連結:

如果說numpy讓python有了matlab的味道,那麼scipy就讓python真正地成為了半個matlab了。numpy提供了多元數組功能,但它隻是一般的數組,并不是矩陣。例如,當兩個數組相乘時,隻是對應元素相乘,而不是矩陣乘法。scipy提供了真正的矩陣,以及大量基于矩陣運算的對象與函數。

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

scipy依賴于numpy,是以安裝它之前得先安裝numpy。安裝scipy的方式與安裝numpy的方法大同小異,需要提及的是,在ubuntu下也可以用類似的

安裝scipy。安裝好scipy後,可以通過以下指令簡單試用。

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

不論是資料挖掘還是數學模組化,都免不了資料可視化的問題。對于python來說,matplotlib是最著名的繪圖庫,它主要用于二維繪圖,當然它也可以進行簡單的三維繪圖。它不但提供了一整套和matlab相似但更為豐富的指令,讓我們可以非常快捷地用python可視化資料,而且允許輸出達到出版品質的多種圖像格式。

matplotlib的安裝并沒有什麼特别之處,可以通過pip install matplotlib安裝或者自行下載下傳源代碼安裝,在ubuntu下也可以用類似的。

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

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具
《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

如果讀者使用的是中文标簽,就會發現中文标簽無法正常顯示。這是由于matplotlib的預設字型是英文字型所緻,解決它的辦法是在作圖之前手動指定預設字型為中文字型,如黑體(simhei)。

另外,儲存作圖圖像時,負号有可能顯示不正常,可以通過以下代碼解決:

終于談到本書的主力工具—pandas了。pandas是python下最強大的資料分析和探索工具(貌似沒有之一)。它包含進階的資料結構和精巧的工具,使得在python中處理資料非常快速和簡單。pandas建構在numpy之上,它使得以numpy為中心的應用很容易使用。pandas的名稱來自于面闆資料(panel data)和python資料分析(data analysis),它最初被作為金融資料分析工具而開發出來,由aqr capital management公司于2008年4月開發出來,并于2009年底開源。

pandas的功能非常強大,支援類似于sql的資料增、删、查、改,并且帶有豐富的資料處理函數;支援時間序列分析功能;支援靈活處理缺失資料等。事實上,單純pandas工具就足以寫一本書,讀者可以閱讀pandas的主要作者之一wes mckinney寫的《利用python進行資料分析》一書,學習更詳細的内容。

(1)安裝

pandas的安裝相對來說比較容易,安裝好numpy之後,就可以直接安裝了,通過pip install pandas或下載下傳源碼後python setup.py install安裝均可。由于我們頻繁用到讀取和寫入excel,但預設的pandas還不能讀寫excel檔案,需要安裝xlrd(讀)和xlwt(寫)庫才能支援excel的讀寫,方法如下。

pip install xlrd #為python添加讀取excel的功能

pip install xlwt #為python添加寫入excel的功能

(2)使用

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

pandas基本的資料結構是series和dataframe。顧名思義,series就是序列,類似一維數組;dataframe則是相當于一張二維的表格,類似二維數組,它的每一列都是一個series。為了定位series中的元素,pandas提供了index對象,每個series都會帶有一個對應的index,用來标記不同的元素,index的内容不一定是數字,也可以是字母、中文等,它類似于sql中的主鍵。

類似地,dataframe相當于多個帶有同樣index的series的組合(本質是series的容器),每個seiries都帶有唯一的表頭,用來辨別不同的series。

《Python資料分析與挖掘實戰》一2.3 Python資料分析工具

由于pandas是本書的主力工具,在後面将會頻繁使用它,是以在這裡就不進行詳細介紹了,在後面的使用過程中将會更加詳盡地講解pandas的使用方法。

pandas着眼于資料的讀取、處理和探索,而statsmodels則更加注重資料的統計模組化分析,它使得python有了r語言的味道。statsmodels支援與pandas進行資料互動,是以,它與pandas結合,成為了python下強大的資料挖掘組合。

安裝statsmodels相當簡單,既可以通過pip安裝,又可以通過源碼安裝。對于windows使用者來說,官網上甚至已經有編譯好的exe檔案以供下載下傳。如果手動安裝的話,需要自行解決好依賴問題,statmodel依賴于pandas(當然也依賴于pandas所依賴的),同時還依賴于pasty(一個描述統計的庫)。

下面是一個用statsmodels來進行adf平穩性檢驗的例子。

adf(np.random.rand(100)) #傳回的結果有adf值、p值等

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

scikit-learn依賴于numpy、scipy和 matplotlib,是以,隻需要提前安裝好這幾個庫,然後安裝scikit-learn就基本上沒有什麼問題了,安裝方法和前幾節一樣,要不就是pip install scikit-learn安裝,要不就是下載下傳源碼自己安裝。

建立一個機器學習的模型很簡單:

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本身提供了一些執行個體資料,比較常見的有安德森鸢尾花卉資料集、手寫圖像資料集等。我們有一百五十個鸢尾花的一些尺寸的觀測值:萼片長度、寬度,花瓣長度和寬度。還有它們的亞屬:山鸢尾(iris setosa)、變色鸢尾(iris versicolor)和維吉尼亞鸢尾(iris virginica)。

雖然scikit-learn足夠強大,但是它并沒有包含一種強大的模型—人工神經網絡。人工神經網絡是功能相當強大的、但是原理又相當簡單的模型,在語言處理、圖像識别等領域有着重要的作用。近年來逐漸火起來的“深度學習”算法,本質上也就是一種神經網絡,可見在python中實作神經網絡是非常必要的。

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

有必要介紹一下theano,它也是python的一個庫,它是由深度學習專家yoshua bengio帶領的實驗室開發出來的,用來定義、優化和高效地解決多元數組資料對應數學表達式的模拟估計問題。它具有高效地實作符号分解、高度優化的速度和穩定性等特點,最重要的是它還實作了gpu加速,使得密集型資料的處理速度是cpu的數十倍。

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

安裝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下theano和keras的安裝配置方法。

值得一提的是,在windows下keras的速度會大打折扣,是以,想要在神經網絡和深度學習方面進行深入研究的讀者,請在linux下搭建相應的環境。

用keras搭建神經網絡模型的過程相當簡潔,也相當直覺,就像搭積木一般。通過短短幾十行代碼,我們就可以搭建起一個非常強大的神經網絡模型,甚至是深度學習模型。簡單搭建一個mlp(多層感覺器),如下:

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

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

gensim是用來處理語言方面的任務,如文本相似度計算、lda、word2vec等,這些領域的任務往往需要比較多的背景知識,通常的情況是:研究這方面的讀者,已經不需要我再多說什麼;不研究這方面的讀者,在這裡也說不清楚。(是以gensim的介紹隻有一句話也就不奇怪了。)

是以,在這一節中,隻是提醒讀者有這麼一個庫的存在,而且這個庫很強大,如果用得到這個庫,請讀者去閱讀官方幫助文檔或參考連結。

需要一提的是,gensim把google公司在2013年開源的著名的詞向量構造工具word2vec編譯好了作為它的子庫,是以需要用到word2vec的讀者也可以直接用gensim而無需自行編譯了。據說gensim的作者對word2vec的代碼進行了優化,據說它在gensim下的表現比原生的word2vec還要快。(為了實作加速,需要準備c++編譯器環境,是以,建議用到gensim的word2vec的讀者在linux下環境運作。)

下面是一個gensim使用word2vec的簡單例子。