為什麼說 Python 是數據科學的發動機(二)工具篇(附視頻中字)
CDA字幕組 編譯整理
本文為 CDA 數據分析師原創作品,轉載需授權
毋庸置疑,Python是用於數據分析的最佳編程語言,因為它的庫在存儲、操作和獲取數據方面有出眾的能力。
在PyData Seattle 2017中,Jake Vanderplas介紹了Python的發展歷程以及最新動態。在這裡我們把內容分成上下兩篇,在上篇給大家帶來了Python的發展歷程( 為什麼說Python是數據科學的發動機(一)發展歷程)。下篇將給大家介紹Python中的一些重要工具。
主講人:
Jake Vanderplas是華盛頓大學eScience研究所物理科學研究的負責人。該研究所負責跨學科項目,旨在支持科學領域在數據方面發現。Jake的研究領域包括天文學、天體物理學、機器學習以及可伸縮計算。此外,他是許多開源Python項目的維護者和頻繁貢獻者,包括scikit-learn、scipy、altair等。
CDA字幕組該講座視頻進行了漢化,附有中文字幕的視頻如下:
針對不方面開視頻的小夥伴,CDA字幕組也貼心的整理了文字版本,如下:
Python是如何成為了數據科學的發動機?_騰訊視頻
下面我想快速瀏覽一下PyData社區的發展過程。
當中有些工具可能你使用過。如果你剛接觸這個社區,你可能沒用過這些工具。我將簡單的總結一下我認為在PyData中,如今十分重要的工具。
安裝
安裝方面我推薦使用Conda。
基本上Conda是一個跨平台的軟體包管理系統,類似於apt-get、yum、homebrew或者MAC埠。但工作方式類似在Linux、OSX或Windows上運行。你能夠安裝類似的軟體包,只需輕輕一點或者一個命令行參數。
它有兩種形式,一個是只包括安裝程序的Mini Conda。另一個是Conda,包括安裝程序以及數百個包。
我推薦Mini Conda,更容易上手,下載下來為25M。首先進行安裝,然後通過命令行運行,也可以通過圖形用戶界面運行。之後Python與Conda連接,你已經完全從自己系統的Python,或任何其他Python安裝中脫離出來。可以運行如Conda安裝等命令,只需輸入你需要包的名字。
這是一個很棒的系統。在2012年之前Conda還未問世,那時使用Python要痛苦的多。特別是當你試圖讓在座的人,從各自的筆記本電腦中拿出工具。他們使用的操作系統各不相同,有Mac、OS X和Windows系統。很慶幸我們不處在那個環境中了,那是黑暗的時代。
Conda另一個驚人之處是可以創建環境,可以在沙箱環境中嘗試新的東西。如果你執行創建-n,指名字。我將這個命名為py2.7,這表明我需要的Python版本。一旦激活該環境,你將有一個全新的可執行的Python,以及全新的一組核心包可執行。
我常常使用,在我的計算機上大概有70或80個類似項目。每當我開發一個scikit-learn包,我會切換到scikit-learn開發,然後在master中安裝。接著在那兒進行開發工作。一旦讓我需要運行代碼進行工作,我會切換回Python3.6環境。你可以在不同Python版本中來回無縫切換,Conda是很強大的。
如果你知道pip的話,一定聽過pip vs Conda的說法。pip是另一個安裝Python包的程序,它連接到Python包索引。兩者的區別在於,pip僅用於在任何環境中安裝Python包;而Conda可以安裝任何包,你可以安裝node或R語言包,你可以安裝任何東西,但只能在Conda環境中安裝。
編程環境
關於編程環境,安裝好了Conda之後, 你可以再安裝Jupyter和Jupyter Notebook。這個是很強大的,於2012年推出。
我第一次聽說該Notebook是在2012年的PyData會議上,當時我在講解scikit-learn。我演講的時Fernando Perez在觀眾席中,他把我的整個演講輸入到Notebook中。演講結束後他向我走過來說」嗨,我是Fernando。你知道Notebook嗎?"之後他給了我演講的IPython Notebook版本,從此之後我每次演講都會錄入Notebook,這太棒了。
你能夠做的是運行Jupyter Notebook,然後得到基於Web的平台,類似一個通過瀏覽器訪問的系統文件。你創建一個新的Notebook,然後獲得一個可以運行代碼介面。在這兒你可以嘗試不同的東西,可以嵌入圖形內聯,可以利用Notebook做很多事情。
最近我出版了《Python的數據科學手冊》。整個是用Jupyter Notebook的形式編寫的,這幾乎相當於一個發布平台。如果你不想買書的話,可以去我的github主頁,所有的Notebook都在那兒。如果為我孩子的大學基金盡一份力,你也可以去買書。(全場笑)
有一個JupyterLab項目,類似Jupyter Notebook的迭代。這相當於把Notebook帶到未來,當中包括完整的IDE文本編輯器和文件瀏覽器。我很期待JupyterLab給我們社區帶來的成果。這幾個月,我所有的工作都會在JupyterLab中進行,這是一個非常酷的項目。
數值計算
什麼是數值計算(numerical computation)?
如果你想快速的進行numerical和Python,一切都取決於NumPy。
如果你使用pandas使用scikit-learn,如果使用任何這些庫,它們往往是在Numpy的基礎上。你可以安裝Numpy,在Numpy中可以創建數組,可以有效的進行互動。因此你能夠創建數組,並進行元素操作。
如果進行X乘以2,實際上該數組上的每個元素均要乘以2。如果把一個Python列表乘以2,那麼整個列表的長度都乘以2,然後加上所有多餘的元素。
Python的初衷不是用來進行數據科學的,而是出於其他目的。因此我們在Python上添加了很多數據科學工具。
你可以處理線性代數,取隨機矩陣的奇異值分解,還可以進行隨機數生成,這邊還有一些正態隨機數,我們還可以求快速傅立葉變換。
這種類型的核心數值運算很多都是在Numpy中實現的,而且完成的很高效。
其中的一個例子是,如果你之前使用如 C、Fortran或者C#等編譯式語言,你可能會習慣手動完成。如果要把數組的數字乘以2,再加1,你可能會寫一個這樣的循環,如果你寫C代碼的話你會這麼做。
但在Python中這非常慢,對1千萬個值進行基礎算術需要6秒。這歸結與很多原因,基本原因在於Python是解釋和動態型的。
但如果使用Numpy,你可以使其更為簡潔。從而完成的更快,只需60毫秒而不是6秒。原理在於Numpy數組了解值的類型,因此它推動這些循環分解成編譯代碼,當中類型推斷不需要進行多次,而只需進行一次。
因此每次你想進行快速numerical和Python,考慮一下向量化。如果在大型數據數組上編寫循環,存在更快的方法來實現代碼。
標註數據
我們說過了pandas是如何開創了PyData時代,pandas庫基本上在Python上實現了數據框和關係運算符。
這類似於Numpy的數組,在這些密集數組你有類型數據,但數據框具有標記列和標記指數。你可以用Python的索引語法在數據框中添加列,你還可以用無縫的方式從磁碟中載入數據,從而自動推斷所有列的類型。如果你在磁碟上有數據 想把數據載入Python空間,那麼pandas是不二之選。
Numpy中還有loadtxt以及genfromtxt,有人用過genfromtxt嗎?那太可怕了,你絕對不會想用。pandas基本上可以取代這些。
你還可以進行有趣的SQL操作,比如分組操作,著很快速。在這兒我們有許多ID,還有許多值。我想對ID進行分組,取相同ID對相同ID的值進行求和。你會得到一個數據框,獲得想要的答案。這些你無法在SciPy時代的工具中實現,這是pandas提供的是2010年的新事物,所以是pandas是很棒的。
可視化領域
如果在Python中看可視化,你可能會想到matplotlib。
這是因為matplotlib久經考驗,從2002年人們就在用它。使用哈勃太空望遠鏡的空間望遠鏡科學研究所,在2004、2005年在當中投入了大量資源。你可以用它做任何事情。
看起來很像MATLAB,如果用過你可能很熟悉,如今很多人把它視為bug,當時它被創造出來絕對是一個特徵。
SciPy生態系統得以發展的原因在於,它能夠在MATLAB和Python之間無縫切換。人們很容易出於API或其他原因抨擊matplotlib。但是我們應該從歷史的角度來看,如果沒有matplotlib的API,我們是不會走到今天的。
如果你想要做一些更複雜的事情,那我會越過matplotlib。如果想做數據框的數據可視化,pandas有很好的繪圖程序。你可以生成matplotlib繪圖,但是不需要matplotlib API。取一個數據框,比如data.plot.scatter,制定想進行散點的兩個列名,則能夠得出你想要的圖,而不需要調整軸的標籤。
Seaborn是一個類似的包,這是用於統計可視化的包。你可以做很複雜的圖和一些代碼,這是值得一試的庫。
除了matplotlib還有Bokeh。它有很多互動功能,可以做很多不同類型的圖。這裡不做過多的介紹。
類似Bokeh的還有Plotly。它在瀏覽器中呈現圖,能夠進行互動的可視化。
對於R語言使用者來說,我們正處於Python取代R的時代。R語言中超越Python的是ggplot庫。我認為目前在Python中沒有什麼能超越這個,有個類似的是plotnie庫。基本上是給你ggplot的API從而得出matplotlib的圖。如果你是ggplot的粉,而且想繼續用Python,這值得一試。雖然這還不是很成熟和完備,當這很有前景。
還有Altair庫,在這裡我不會介紹。可以在我其他關於可視化的演講中看到。
在Python中進行可視化很複雜,這個幻燈片來自幾周前我在PyCon上的演講。
當中的每個節點都是Python中用於可視化的庫。如果你想看我花40分鐘講這個圖,可以去YouTube看相關視頻。
數值演算法
SciPy是用於這方面的包。一開始SciPy是net-lib的添加,net-lib是進行整合和插值優化的一系列Fortran庫,而且非常迅速高效。因此SciPy包括許多不同的子模塊,基本上Fortran操作的包裝、運行迅速。但基本上任何數值運算SciPy都可以完成。
這裡有一個例子,我們在導入特殊的庫,這裡是特殊的函數,並且導入優化的庫。我們可以看到第一個貝塞爾函數的最小值,這就是SciPy做的。
特別是如果你是一個物理學家SciPy是很出色的,它擁有所有需要的程序。
如果你想進行機器學習,scikit-learn值得一提。
由於其API,這是個很棒的庫。想像你有一些2D數據,需要放入機器學習模型中。機器學習模型是線性擬合的一種高大上的方式。
如果你使用機器學習駕駛汽車,你手上有龐大的參數空間,需要擬合給數據的直線從而避免撞車。
如果想通過scikit-learn把數據擬合到直線上,你可以使用該模型API。你創建一個模型擬合到數據,然後在新的數據和圖上預測模型。相當於這個數據的隨機森林。
如果你想使用不同模型,只需改變模型的實現。所以這裡,我從一個隨機森林換成了支持向量機的回歸元。你只需要改變上面的模型定義,其餘部分的代碼保持不變,這是scikit-learn的優點。
給你一個單一的API從而探索重要的機器學習演算法,而不必寫一大堆的樣板。這是scikit-learn的優勢所在。我們實際上寫了關於scikit-learn API的論文。
如果你想用parallel的話,有一個問世一兩年的庫稱為Dask。
Dask很有意思,如果你使用Numpy的話,這是你會使用的工具。取一個數組a,乘以4,記住把所有的元素乘以4。取最小值,然後輸出。
Dask所做的是,能夠讓你做相同的事情,但不需進行實際的計算。保存了定義計算的任務圖。當你將數組乘以4時,它會保存起來構建出類似這樣的圖。
因此在底部我們得到數據和數組,在五個不同的核心 我們將數據乘以4,取當中的最小值。當然最小值中的最小值,即為最小的。Dask知道這些操作和聚合的關聯性,最後你得到該任務圖,但沒有進行任何計算。
然後你可以把任務圖轉換成任何內容,可能是你計算機上的在多個內核,可能是簇上的多個機器上,可能亞馬遜雲或者Azure雲上的內容,最後你可以進行計算。
在數據科學領域使用Dask可以實現很多有趣的內容。可以把Dask放到scikit-learn的後端,你可以關注一下,這很棒,
如果你想優化代碼的話,有一個有趣的項目問世五六年了,稱為Numba。
將Python代碼編譯成LLVM位元組碼,運行的非常快而且是真正無縫隙的。當你在寫一個演算法,當中有for循環。我說過for循環不太好,你應該儘可能用Numpy。但有一些演算法沒辦法簡單的轉換矢量化代碼。
如果有這樣的代碼,每個人都使用斐波拉契。這需要2.7毫秒獲得1萬個斐波拉契數。只需將數據添加到即時編譯器,然後給代碼提供500倍的加速。實際上它經過並分析所有的Python代碼,迅速的編譯成LLVM。之後你需要該函數可以獲取它的快速版本。
在此基礎上有很多很棒的項目,比如datashader項目。這是一個連接Bokeh的可視化項目,在後端採用Numba,能夠對數十億點進行快速的可視化。
我們來看看這些演示,datashader對十億個計程車上客情況進行可視化。實時進行滾動、縮放、以及渲染
這都基於後端的Numba。
另一種優化代碼的方式是Cython。
Cython不太一樣,它是Python的超集合。它能讓你將Python編譯的到快速C代碼中。
這裡有個例子,我們拿出相同的fib函數2.73毫秒。如果我們在Cython中運行,當中的%可以在Jupyter notebook中進行。你會得到約10%的加速,這稍微快一些。
它所做的是把Python代碼編譯到C語言代碼中,然後運行C語言代碼,而不是Python代碼。
但要真正獲得Cython的優勢,你需要做的是增加些類型。看看這裡的區別,我所做的是頂部為int n 比起a,b=0,1,我輸入的是cdef int a=0 b=1。現在編譯器知道這些是整數,它會優化這些代碼。然後僅通過在Cython中運行該代碼,加之一些格外的語法糖。你會得到500倍的加速。
Cython是一個很出色的項目,如果看到NumPy、SciPy、pandas、scikit-learn、astropy、SymPy的源代碼。基本上PyData生態系統中的所有numerical代碼,
其核心均使用Cython。所有這些工具都是建立Cython之上的。
這就是你如何在這些庫中獲得快速numerix,這就是你如何包裝其他的C語言庫。
比如Lib、SVM和scikit-learn,你使用Cython連接這些。如果你使用任何超出基本Python的部分,試試Cython,因為這很有意思。
這就是我對所有包的介紹,希望能有所幫助。我試圖在整個幻燈片加入引用,如果你想深入了解的話,大部分的包都有很棒的網站,並附有相關教程。
結語
在使用Python時請記住,Python並不是數據科學語言。
有時候這會導致事情變得複雜,有時這意味著存在完成任務的許多不同方法。因為每個人都在這個他們喜愛的語言上創建自己的API,但我認為這也是最大的優勢。因為我們可以從很多不同的社區中吸取優勢,從而讓我們可以使用Python完成眾多超越數據,數據科學的內容。
回顧這些Python的不同發展階段是很有意思的,但更有意思的是在於未來,2020年又會出現什麼呢?
雖然在數據時代中,Python的獨立性仍存在很多挑戰。但我很確信,在未來的10年內Python還是很有前景的。
因為社區中,人們與時俱進的把其他地方學到的內容
帶入到Python中。因此我認為直到2029年我們還會在使用Python,我們走著瞧吧。
非常感謝大家!
推薦閱讀:
※久等了,一小時後BitTiger Pro公開發售!順便說說我們開發它的故事
※Kaggle 入門指南
※文章商品分類之數據標註
※《數據科學中的R語言》之字元串處理入門
※數據科學家的自我修養