Python和數(shù)據(jù)科學(xué)的起步指南 ipython notebook
Python擁有著極其豐富且穩(wěn)定的數(shù)據(jù)科學(xué)工具環(huán)境揭北。遺憾的是,對不了解的人來說這個環(huán)境猶如叢林一般(cue snake joke)千贯。在這篇文章中,我會一步一步指導(dǎo)你怎么進(jìn)入這個PyData叢林窖梁。
你可能會問瞪慧,很多現(xiàn)有的PyData包推薦列表怎么樣?我覺得對新手來說提供太多的選擇可能會受不了茅主。因此這里不會提供推薦列表舞痰,我要討論的范圍很窄,只集中于10%的工具诀姚,但它們可以完成你90%的工作响牛。當(dāng)你掌握這些必要的工具后,你就可以瀏覽PyData工具的長列表了学搜,選擇自己接下來要使用的娃善。
值得一提的是,我介紹的這幾個工具可以讓你完成一個數(shù)據(jù)科學(xué)家日常的絕大部分工作了(比如數(shù)據(jù)輸入輸出瑞佩、數(shù)據(jù)再加工以及數(shù)據(jù)分析)聚磺。
安裝
經(jīng)常會有人過來和我說“我聽說Python很擅長處理數(shù)據(jù)科學(xué),所以我想學(xué)一下炬丸。但是安裝Python和所有其他模塊就耗費了兩天時間”瘫寝。安裝Python是很合理的,因為你要用它稠炬,但是當(dāng)你不知道真正需要哪些其他工具時就手動安裝所有的PyData工具焕阿,這確實是一項大工程啊。所以我強烈反對這樣做首启。
幸運的是暮屡,Continuum的一伙人創(chuàng)建了Python發(fā)行版Anaconda,它包含了大部分PyData工具包毅桃。默認(rèn)沒有的模塊也可以輕松地通過GUI安裝褒纲。這個發(fā)行版適用于所有主流平臺准夷。這樣無需耗費兩天安裝了,可以直接使用它莺掠。
IPython Notebook
Python安裝后衫嵌,大部分人直接啟動并開始學(xué)習(xí)。這很合理彻秆,但遺憾的是又大錯特錯了楔绞。我沒見過直接在Python命令行中運行Python科學(xué)計算環(huán)境的(因人而異)。相反唇兑,可以使用IPython酒朵,特別是IPython Notebook,它們都是特別強大的Python shell幔亥,被廣泛地使用在PyData領(lǐng)域中耻讽。我強烈建議你直接使用IPython Notebook(IPyNB)而不用為其他事所煩擾,你不會后悔的帕棉。簡而言之针肥,IPyNB是一個通過瀏覽器訪問的Python shell。它允許你混合編輯代碼香伴、文本和圖形(甚至是交互對象)慰枕。本文就是在IPyNB中完成的。在Python的會議中即纲,幾乎所有的演講都使用IPython Notebook具帮。Anaconda中預(yù)裝了IPyNB,可以直接使用低斋。下面看下它是什么樣的:
In [1]:
1
2print('Hello World')
Hello World
IPyNB發(fā)展很快——每次在會議中聽(IPyNB的)核心開發(fā)人員演講時蜂厅,我總被他們想出的新功能所震撼。要了解它的一些先進(jìn)功能膊畴,可以看看下面這個關(guān)于IPython小工具的簡短教程掘猿。這些小工具可以讓你使用滑動條交互地控制繪圖:
In [1]:
1
2fromIPython.displayimportYouTubeVideo
YouTubeVideo('wxVx54ax47s')# 沒錯,它也可以嵌入youtube視頻
Out[1]:
6. IPython Widgets – IPython Notebook Tutorial
Pandas
通常唇跨,大家會建議你先學(xué)習(xí)NumPy(讀作num-pie稠通,不是num-pee),一個支持多維數(shù)組的庫买猖。幾年前肯定得這樣改橘,但現(xiàn)在我?guī)缀醪皇褂肗umPy。因為NumPy越來越成為一個被其他庫所使用核心庫玉控,這些庫通常具有更優(yōu)雅的接口飞主。因此,Pandas成為了處理數(shù)據(jù)所主要使用的庫。它可以以各種格式(包括數(shù)據(jù)庫)輸入輸出數(shù)據(jù)既棺、執(zhí)行join以及其他SQL類似的功能來重塑數(shù)據(jù)讽挟、熟練地處理缺失值、支持時間序列丸冕、擁有基本繪圖功能和統(tǒng)計功能,等等還有很多薛窥。對它所有的特性來說胖烛,肯定有一個學(xué)習(xí)曲線,但我強烈去建議你先看一下大部分文檔诅迷。你所投入的時間將使你的數(shù)據(jù)再加工過程更高效佩番,這會帶來上千倍的回報。這里有一些快速技巧會讓你胃口大開的:
In?[18]:
1
2
3
4
5
6
7
8importpandas as pd
df=pd.DataFrame({'A':1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(, index=list(range()), dtype='float32'),
'D': pd.Series([,,,], dtype='int32'),
'E': pd.Categorical(["test","train","test","train"]),
'F':'foo'})
In?[19]:
1
Out[19]:
ABCDEF
012013-01-0211testfoo
112013-01-0212trainfoo
212013-01-0211testfoo
312013-01-0212trainfoo
可以通過列名來獲取某一列:
In?[17]:
1
df.B
Out[17]:
1
2
3
4
5
6
7
8--
--
--
--
Name: B, dtype: datetime64[ns]
Compute thesumof Dforeach categoryinE:
按E分類罢杉,每類對D求和:
In?[21]:
1
df.groupby('E').sum().D
Out[21]:
1
2
3
4E
test
train
Name: D, dtype: int32
使用NumPy(或者笨重的Matlab)達(dá)到同樣的目的會很麻煩趟畏。
還有非常多的用法。不相信的話可以看一下這個教程“10 minutes to pandas”滩租。上面的例子也來自這個教程赋秀。
Seaborn
Matplotlib是Python主要的繪圖庫。但是律想,我不建議你直接使用它猎莲,原因與開始不推薦你使用NumPy是一樣的。雖然Matplotlib很強大技即,它本身就很復(fù)雜著洼,你的圖經(jīng)過大量的調(diào)整才能變精致。因此而叼,作為替代身笤,我推薦你一開始使用Seaborn。Seaborn本質(zhì)上使用Matplotlib作為核心庫(就像Pandas對NumPy一樣)葵陵。我將簡短地描述下seaborn的優(yōu)點液荸。具體來說,它可以:
默認(rèn)情況下就能創(chuàng)建賞心悅目的圖表埃难。(只有一點莹弊,默認(rèn)不是jet colormap)
創(chuàng)建具有統(tǒng)計意義的圖
能理解pandas的DataFrame類型,所以它們一起可以很好地工作涡尘。
雖然anaconda預(yù)裝了pandas忍弛,卻沒安裝seaborn】汲可以通過conda install seaborn輕松地安裝细疚。
具有統(tǒng)計意義的圖
In?[5]:
1
%matplotlib inline# IPython magic to create plots within cells
In?[7]:
1
2
3
4
5
6importseaborn as sns
tips=sns.load_dataset("tips")
sns.jointplot("total_bill","tip", tips, kind='reg');
如你所見,僅通過一行代碼川梅,我們就創(chuàng)建了一個漂亮復(fù)雜的統(tǒng)計圖疯兼,其中包含擁有置信區(qū)間的最擬合回歸直線然遏、邊界圖,以及相關(guān)系數(shù)吧彪。使用matplotlib重新繪制這幅圖的話需要相當(dāng)多的(丑陋)代碼待侵,包括調(diào)用scipy執(zhí)行線性回歸并手動利用線性回歸方程繪制直線(我甚至想不出怎么在邊界繪圖,怎么計算置信區(qū)間)姨裸。上面和下面的例子都摘自教程“the tutorial on quantitative linear models”秧倾。
與Pandas的DataFrame很好地工作
數(shù)據(jù)有自己的結(jié)構(gòu)。通常我們感興趣的包含不同的組或類(這種情況下使用pandas中g(shù)roupby的功能會讓人感到很神奇)傀缩。比如tips(小費)的數(shù)據(jù)集是這樣的:
In?[9]:
1
tips.head()
Out[9]:
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
我們可能想知道吸煙者給的小費是否與不吸煙的人不同那先。沒有seaborn的話,這需要使用pandas的groupby功能赡艰,并通過復(fù)雜的代碼繪制線性回歸直線售淡。使用seaborn的話,我們可以給col參數(shù)提供列名慷垮,按我們的需要劃分?jǐn)?shù)據(jù):
In?[11]:
1
sns.lmplot("total_bill","tip", tips, col="smoker");
很整潔吧揖闸?
隨著你研究得越深,你可能想更細(xì)粒度地控制這些圖表的細(xì)節(jié)换帜。因為seaborn只是調(diào)用了matplotlib楔壤,那時你可能會想學(xué)習(xí)這個庫。然而惯驼,對絕大部分工作來說我還是喜歡使用seaborn蹲嚣。
總結(jié)
這篇文章的想法是通過提供部分包來最大化新手使用Python處理數(shù)據(jù)科學(xué)的效率。
英文出處:twiecki.github.io