作者:張京
來源:見文末
為什麼是Python
先來聊聊為什麼做資料分析一定要用Python
或R
語言。程式語言這麼多種,Java
, PHP
都很成熟,但是為什麼在最近熱火的資料分析領域,很多人選擇用Python
語言?
資料分析只是一個需求,理論上來講,任何語言都可以滿足任何需求,只是麻煩與簡易之別。Python
這門語言誕生也相當之早,它的第一個版本是26
年前發表的,曾經(或者說當前)也被用於web開發,但是就流行程度來說,遠遠乾不過Java
和PHP
。東方不亮西方亮,在與Java
乾仗失敗的這20幾年時光裡,Python
練就了一身獨門武藝,是Java
和PHP
遠遠不及的(當然以後是不是能追得上來,目前還不好說)。你要說做個部落格網站,Python
的特長不在這裡,PHP
和Java
也是分分鐘的事情。你要說做個BBS
網站,做個電商網站,PHP
手到擒來。Python
在這些方面和Java
或者PHP
競爭,基本就是作死的節奏,雖然也有django
這樣的框架,但流行程度遠遠不及其他語言。但在這些年默默的失敗背後,有一幫研究人員用Python
乾出了一些驚天地泣鬼神的神器,使Python
在資料研究領域做到了除了R
語言以外基本無人能及的地步。
Jupyter
首先,第一神器是Jupyter
。如果你是第一次使用,可能搞不清楚它的開發者做這麼個鬼東西出來乾什麼,說它是部落格系統也不像,說它是web伺服器也不像,但它就是有用。因為我們傳統的web開發首先想的就是面向公眾,你做一個伺服器就是要服務成千上萬瀏覽器的,當然Jupyter
也可以服務眾多瀏覽器,但它更多的還是方便研究人員,對研究人員來說簡直是太方便了,你把程式碼像寫文章一樣直接寫在輸入框裡,然後在本頁面直接就看到了這個程式碼的結果,隨時修改,隨時展現,文碼混排,是Markdown
的一個增強版,畢竟Markdown
還只能顯示文字,最多再加上一些圖片,而Jupyter
是可以直接執行Python
程式碼的。當然,也有些人試圖在Jupyter
裡執行PHP
或Java
程式碼,但顯然成不了氣候。因為Python
這個語言天生就是指令碼語言,可能將來唯一有希望往裡移植的就是Javascript
,這貨也是一個指令碼語言。指令碼語言的好處就是不用編譯,一行一個結果。縱觀計算機語言發展歷史,就是一個從繁到簡的過程,C語言需要編譯+連結才能執行,Java
只要javac
一下,把編譯和鏈接合二為一,PHP
更簡單,直接執行就行了,連編譯都省了。但是還不夠直接,因為還要編寫一個.php
檔案存檔,然後才能執行,到了Python
以及其它指令碼語言這裡,可以直接在殼裡執行,但最大的問題是執行可以執行,無法儲存,要儲存就又要跟傳統方式一樣,找個編輯器來,或者vi
,存成檔案以後才可以執行。Jupyter
最大的優點就是:它本身還是一個外殼環境,可以執行指令碼,但同時也幫你自動把這些指令碼程式碼儲存了下來,不但儲存指令碼程式碼,並且你插在指令碼程式碼當中的所有註釋不是普通註釋,而是各種格式化的Markdown
都一併幫你儲存下來,並且可以隨時修改。所以它兼具了指令碼外殼和檔案管理系統的優點,從此你開發Python
程式碼再也不用先在IDE裡寫好程式碼,然後再到終端裡去執行,而直接在一個web
頁面上就全部搞定了。Java
有這樣的工具嗎?PHP
有這樣的工具嗎?沒有,所以我們必須選擇Python
。
Pandas
第二神器是Pandas
。如果我讓你讀取一個csv
檔案,然後求每一列資料的平均值,最大值,最小值,方差,用Java
或PHP
怎麼做?你首先要fopen
一個檔案,然後一行一行讀進來,再給它整個資料結構,然後弄個迴圈計算,最後你可能還要fclose
這個檔案。總之程式碼一坨,麻煩死。而Python
語言因為有Pandas
這個神器,一行程式碼搞定:
df = pd.read_csv('a.csv')
行了,從此以後,df
就是這個DataFrame
,它本身就是一個強大的資料結構,也可以把它理解成mysql
資料庫中的一張表吧,各種增刪改查,求總和,求平均都是一行程式碼的事情。所以有這樣強大的庫,研究人員有什麼理由選擇Java
?
scikit-learn
第三神器scikit-learn
,一般縮寫為sklearn
,各種機器學習演演算法,基本上只要你能想得到的,線性回歸,邏輯回歸,SVM,隨機森林,最近鄰居等等等等,各種演演算法全部在這裡面(http://scikit-learn.org/stable/user_guide.html),簡而言之,只有你想不到,沒有它做不到,不詳述。所以這就是為什麼玩機器學習必選Python
的原因,你給我找一個Java
或者PHP
有這樣多種演演算法的庫來?
matplotlib
第四神器是matplotlib
。如果我讓你根據上面csv
檔案裡的資訊,畫一個圖,用Java
該怎麼做?你當然會去找第三方外掛庫,然後又是一通折騰,終於把圖做出來,然後編譯,然後執行。如果我要改配色呢?如果我要求畫地圖呢?如果要畫熱力圖呢?那個麻煩就不是一星半點,而對於matplotlib
來說,簡直就是小菜一碟。簡單的直方圖就不說了,下麵重點介紹如何用matplotlib
配合Basemap
畫一個中國地圖。
安裝Basemap
先安裝相應的元件。我假定你已經都安裝好了Python
以及Jupyter
等等。如果沒有安裝的話,就去嘗試一下brew install python3
和brew install jupyter
吧,網上有很多教程。
然後你需要用pip3 install
很多我們下麵可能需要用到的庫。但是因為我們要用一個叫做Basemap
的庫,而這個庫沒有辦法用簡單的pip3 install
安裝,所以稍多兩個步驟:
brew install geos
pip3 install https://github.com/matplotlib/basemap/archive/v1.1.0.tar.gz
開始畫圖
啟動Jupyter
之後,我們還是本著從最簡單的程式碼開始。先畫一個世界地圖:
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.figure(figsize=(16,8))
m = Basemap()
m.drawcoastlines()
plt.show()
前面兩行引入相應的庫,真正的程式碼就4行,夠簡單吧。第1行甚至可以不寫,它定義了圖的大小。第2行我們建立一個地圖,第3行把海岸線畫上,第4行顯示這個地圖,就是這樣:
你用Java
的4
行程式碼畫一個地圖出來?
然後我們開始畫上國家,又是1行程式碼:
m.drawcountries(linewidth=1.5)
就變成了這樣:
用Java
可能嗎?用PHP
可能嗎?
如果我們想顯示中國地圖,只需要在建立Basemap
時指定一下經緯度就行了:
m = Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=53)
然後就得到了中國地圖:
看上去有點變形,這是因為我們沒有新增任何投影的原因,Basemap
提供24
種不同的投影方式,你可以自己一個個試一下,比較常用的是蘭勃特投影
,我們新增一下:
m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
這次終於看上去比較正常了:
我們想加上省的邊界怎麼辦呢?Basemap
預設的包裡沒有中國的省區,只有美國的州,畢竟是美國人做的嘛。不過好在世界很大,有專門的國際組織乾這事,在這裡(https://gadm.org/download_country_v3.html)你可以下載全世界任何一個國家的行政區劃Shape
檔案,然後我們給它加上:
m.readshapefile(‘CHN_adm_shp/CHN_adm1’, ‘states’, drawbounds=True)
然後就得到了下圖:
再往後,你還可以往圖上改顏色啦,寫數字啦,這些就留待你研究吧。總之,我想說的是,用Python
畫地圖真的超容易。
最後再為Java
和PHP
美言幾句:大家分工不同,Java
和PHP
雖然做這樣的數字研究不是很方便,但還是非常適合web
開發的,而Python
在這方面並不適合。所以通常的做法是:首先用Python
驗證演演算法,經過一系列複雜的計算,把演演算法確定下來之後,當要應用到web
上的時候,再用Java
或者PHP
把最終形成的結論重寫一遍,這樣就能充分利用各種語言的優勢。
來源:張京
連結:https://segmentfault.com/a/1190000010871928
《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –
更多Python好文請點選【閱讀原文】哦
↓↓↓