Python擁有著極其豐富且穩定的數據科學工具環境。遺憾的是,對不了解的人來說這個環境猶如叢林一般(cue snake joke)。在這篇文章中,我會一步一步指導你怎么進入這個PyData叢林。
你可能會問,很多現有的PyData包推薦列表怎么樣?我覺得對新手來說提供太多的選擇可能會受不了。因此這里不會提供推薦列表,我要討論的范圍很窄,只集中于10%的工具,但它們可以完成你90%的工作。當你掌握這些必要的工具后,你就可以瀏覽PyData工具的長列表了,選擇自己接下來要使用的。
值得一提的是,我介紹的這幾個工具可以讓你完成一個數據科學家日常的絕大部分工作了(比如數據輸入輸出、數據再加工以及數據分析)。
安裝
經常會有人過來和我說“我聽說Python很擅長處理數據科學,所以我想學一下。但是安裝Python和所有其他模塊就耗費了兩天時間”。安裝Python是很合理的,因為你要用它,但是當你不知道真正需要哪些其他工具時就手動安裝所有的PyData工具,這確實是一項大工程啊。所以我強烈反對這樣做。
幸運的是,Continuum的一伙人創建了Python發行版Anaconda,它包含了大部分PyData工具包。默認沒有的模塊也可以輕松地通過GUI安裝。這個發行版適用于所有主流平臺。這樣無需耗費兩天安裝了,可以直接使用它。
IPython Notebook
Python安裝后,大部分人直接啟動并開始學習。這很合理,但遺憾的是又大錯特錯了。我沒見過直接在Python命令行中運行Python科學計算環境的(因人而異)。相反,可以使用IPython,特別是IPython Notebook,它們都是特別強大的Python shell,被廣泛地使用在PyData領域中。我強烈建議你直接使用IPython Notebook(IPyNB)而不用為其他事所煩擾,你不會后悔的。簡而言之,IPyNB是一個通過瀏覽器訪問的Python shell。它允許你混合編輯代碼、文本和圖形(甚至是交互對象)。本文就是在IPyNB中完成的。在Python的會議中,幾乎所有的演講都使用IPython Notebook。Anaconda中預裝了IPyNB,可以直接使用。下面看下它是什么樣的:
In [1]:
1
2
|
print ( 'Hello World' ) Hello World |
IPyNB發展很快——每次在會議中聽(IPyNB的)核心開發人員演講時,我總被他們想出的新功能所震撼。要了解它的一些先進功能,可以看看下面這個關于IPython小工具的簡短教程。這些小工具可以讓你使用滑動條交互地控制繪圖:
In [1]:
1
2
|
from IPython.display import YouTubeVideo YouTubeVideo( 'wxVx54ax47s' ) # 沒錯,它也可以嵌入youtube視頻 |
Out[1]:
6. IPython Widgets – IPython Notebook Tutorial
Pandas
通常,大家會建議你先學習NumPy(讀作num-pie,不是num-pee),一個支持多維數組的庫。幾年前肯定得這樣,但現在我幾乎不使用NumPy。因為NumPy越來越成為一個被其他庫所使用核心庫,這些庫通常具有更優雅的接口。因此,Pandas成為了處理數據所主要使用的庫。它可以以各種格式(包括數據庫)輸入輸出數據、執行join以及其他SQL類似的功能來重塑數據、熟練地處理缺失值、支持時間序列、擁有基本繪圖功能和統計功能,等等還有很多。對它所有的特性來說,肯定有一個學習曲線,但我強烈去建議你先看一下大部分文檔。你所投入的時間將使你的數據再加工過程更高效,這會帶來上千倍的回報。這里有一些快速技巧會讓你胃口大開的:
In [18]:
1
2
3
4
5
6
7
8
|
import pandas as pd df = pd.DataFrame({ 'A' : 1. , 'B' : pd.Timestamp( '20130102' ), 'C' : pd.Series( 1 , index = list ( range ( 4 )), dtype = 'float32' ), 'D' : pd.Series([ 1 , 2 , 1 , 2 ], dtype = 'int32' ), 'E' : pd.Categorical([ "test" , "train" , "test" , "train" ]), 'F' : 'foo' }) |
In [19]:
Out[19]:
1
2
3
4
5
|
A B C D E F 0 1 2013 - 01 - 02 1 1 test foo 1 1 2013 - 01 - 02 1 2 train foo 2 1 2013 - 01 - 02 1 1 test foo 3 1 2013 - 01 - 02 1 2 train foo |
可以通過列名來獲取某一列:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
In [ 17 ]: df.B Out[ 17 ]: 0 2013 - 01 - 02 1 2013 - 01 - 02 2 2013 - 01 - 02 3 2013 - 01 - 02 Name: B, dtype: datetime64[ns] Compute the sum of D for each category in E: 按E分類,每類對D求和: In [ 21 ]: df.groupby( 'E' ). sum ().D Out[ 21 ]: E test 2 train 4 Name: D, dtype: int32 |
使用NumPy(或者笨重的Matlab)達到同樣的目的會很麻煩。
還有非常多的用法。不相信的話可以看一下這個教程“10 minutes to pandas”。上面的例子也來自這個教程。
Seaborn
Matplotlib是Python主要的繪圖庫。但是,我不建議你直接使用它,原因與開始不推薦你使用NumPy是一樣的。雖然Matplotlib很強大,它本身就很復雜,你的圖經過大量的調整才能變精致。因此,作為替代,我推薦你一開始使用Seaborn。Seaborn本質上使用Matplotlib作為核心庫(就像Pandas對NumPy一樣)。我將簡短地描述下seaborn的優點。具體來說,它可以:
- 默認情況下就能創建賞心悅目的圖表。(只有一點,默認不是jet colormap)
- 創建具有統計意義的圖
- 能理解pandas的DataFrame類型,所以它們一起可以很好地工作。
雖然anaconda預裝了pandas,卻沒安裝seaborn。可以通過conda install seaborn輕松地安裝。
具有統計意義的圖
In [5]:
1
|
% matplotlib inline # IPython magic to create plots within cells |
In [7]:
1
2
3
4
5
6
|
import seaborn as sns # Load one of the data sets that come with seaborn tips = sns.load_dataset( "tips" ) sns.jointplot( "total_bill" , "tip" , tips, kind = 'reg' ); |
如你所見,僅通過一行代碼,我們就創建了一個漂亮復雜的統計圖,其中包含擁有置信區間的最擬合回歸直線、邊界圖,以及相關系數。使用matplotlib重新繪制這幅圖的話需要相當多的(丑陋)代碼,包括調用scipy執行線性回歸并手動利用線性回歸方程繪制直線(我甚至想不出怎么在邊界繪圖,怎么計算置信區間)。上面和下面的例子都摘自教程“the tutorial on quantitative linear models”。
與Pandas的DataFrame很好地工作
數據有自己的結構。通常我們感興趣的包含不同的組或類(這種情況下使用pandas中groupby的功能會讓人感到很神奇)。比如tips(小費)的數據集是這樣的:
In [9]:
1
2
3
4
5
6
7
8
|
tips.head() Out[ 9 ]: total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4 |
我們可能想知道吸煙者給的小費是否與不吸煙的人不同。沒有seaborn的話,這需要使用pandas的groupby功能,并通過復雜的代碼繪制線性回歸直線。使用seaborn的話,我們可以給col參數提供列名,按我們的需要劃分數據:
In [11]:
1
|
sns.lmplot( "total_bill" , "tip" , tips, col = "smoker" ); |
很整潔吧?
隨著你研究得越深,你可能想更細粒度地控制這些圖表的細節。因為seaborn只是調用了matplotlib,那時你可能會想學習這個庫。然而,對絕大部分工作來說我還是喜歡使用seaborn。
總結
這篇文章的想法是通過提供部分包來最大化新手使用Python處理數據科學的效率。