第1章 準備工作
第2章 Python語法基礎,IPython和Jupyter Notebooks
下載本書:http://www.lxweimin.com/p/fad9e41c1a42
GitHub(歡迎提pull request,GitHub上的md文件可以用來自制電子書,pdf、mobi、epub格式的都行):
https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version
GitBook(有錨點功能):
https://seancheney.gitbook.io/python-for-data-analysis-2nd/
下載本書代碼:https://github.com/wesm/pydata-book(建議把代碼下載下來之后,安裝好Anaconda 3.6,在目錄文件夾中用Jupyter notebook打開)
本書是2017年10月20號正式出版的,和第1版的不同之處有:
包括Python教程內的所有代碼升級為Python 3.6(第1版使用的是Python 2.7)
更新了Anaconda和其它包的Python安裝方法
更新了Pandas為2017最新版
新增了一章,關于更高級的Pandas工具,外加一些tips
簡要介紹了使用StatsModels和scikit-learn
對有些內容進行了重新排版。(譯者注1:最大的改變是把第1版附錄中的Python教程,單列成了現在的第2章和第3章,并且進行了擴充。可以說,本書第2版對新手更為友好了!)
(譯者注2:毫無疑問,本書是學習Python數據分析最好的參考書(另一本不錯的是《Pandas Cookbook》)。本來想把書名直接譯為《Python數據分析》,這樣更簡短。但是為了尊重第1版的翻譯,考慮到繼承性,還是用老書名。這樣讀過第一版的老讀者可以方便的用之前的書名檢索到第二版。作者在寫第二版的時候,有些文字是照搬第一版的。所以第二版的翻譯也借鑒copy了第一版翻譯:即,如果第二版中有和第一版相同的文字,則copy第一版的中文譯本,覺得不妥的地方會稍加修改,剩下的不同的內容就自己翻譯。這樣做也是為讀過第一版的老讀者考慮——相同的內容可以直接跳過。)
1.1 本書的內容
本書講的是利用Python進行數據控制、處理、整理、分析等方面的具體細節和基本要點。我的目標是介紹Python編程和用于數據處理的庫和工具環境,掌握這些,可以讓你成為一個數據分析專家。雖然本書的標題是“數據分析”,重點卻是Python編程、庫,以及用于數據分析的工具。這就是數據分析要用到的Python編程。
什么樣的數據?
當書中出現“數據”時,究竟指的是什么呢?主要指的是結構化數據(structured data),這個故意含糊其辭的術語代指了所有通用格式的數據,例如:
表格型數據,其中各列可能是不同的類型(字符串、數值、日期等)。比如保存在關系型數據庫中或以制表符/逗號為分隔符的文本文件中的那些數據。
多維數組(矩陣)。
通過關鍵列(對于SQL用戶而言,就是主鍵和外鍵)相互聯系的多個表。
間隔平均或不平均的時間序列。
這絕不是一個完整的列表。大部分數據集都能被轉化為更加適合分析和建模的結構化形式,雖然有時這并不是很明顯。如果不行的話,也可以將數據集的特征提取為某種結構化形式。例如,一組新聞文章可以被處理為一張詞頻表,而這張詞頻表就可以用于情感分析。
大部分電子表格軟件(比如Microsoft Excel,它可能是世界上使用最廣泛的數據分析工具了)的用戶不會對此類數據感到陌生。
1.2 為什么要使用Python進行數據分析
許許多多的人(包括我自己)都很容易愛上Python這門語言。自從1991年誕生以來,Python現在已經成為最受歡迎的動態編程語言之一,其他還有Perl、Ruby等。由于擁有大量的Web框架(比如Rails(Ruby)和Django(Python)),自從2005年,使用Python和Ruby進行網站建設工作非常流行。這些語言常被稱作腳本(scripting)語言,因為它們可以用于編寫簡短而粗糙的小程序(也就是腳本)。我個人并不喜歡“腳本語言”這個術語,因為它好像在說這些語言無法用于構建嚴謹的軟件。在眾多解釋型語言中,由于各種歷史和文化的原因,Python發展出了一個巨大而活躍的科學計算(scientific computing)社區。在過去的10年,Python從一個邊緣或“自擔風險”的科學計算語言,成為了數據科學、機器學習、學界和工業界軟件開發最重要的語言之一。
在數據分析、交互式計算以及數據可視化方面,Python將不可避免地與其他開源和商業的領域特定編程語言/工具進行對比,如R、MATLAB、SAS、Stata等。近年來,由于Python的庫(例如pandas和scikit-learn)不斷改良,使其成為數據分析任務的一個優選方案。結合其在通用編程方面的強大實力,我們完全可以只使用Python這一種語言構建以數據為中心的應用。
Python作為膠水語言
Python成為成功的科學計算工具的部分原因是,它能夠輕松地集成C、C++以及Fortran代碼。大部分現代計算環境都利用了一些Fortran和C庫來實現線性代數、優選、積分、快速傅里葉變換以及其他諸如此類的算法。許多企業和國家實驗室也利用Python來“粘合”那些已經用了多年的遺留軟件系統。
大多數軟件都是由兩部分代碼組成的:少量需要占用大部分執行時間的代碼,以及大量不經常執行的“膠水代碼”。大部分情況下,膠水代碼的執行時間是微不足道的。開發人員的精力幾乎都是花在優化計算瓶頸上面,有時更是直接轉用更低級的語言(比如C)。
解決“兩種語言”問題
很多組織通常都會用一種類似于領域特定的計算語言(如SAS和R)對新想法做研究、原型構建和測試,然后再將這些想法移植到某個更大的生產系統中去(可能是用Java、C#或C++編寫的)。人們逐漸意識到,Python不僅適用于研究和原型構建,同時也適用于構建生產系統。為什么一種語言就夠了,卻要使用兩個語言的開發環境呢?我相信越來越多的企業也會這樣看,因為研究人員和工程技術人員使用同一種編程工具將會給企業帶來非常顯著的組織效益。
為什么不選Python
雖然Python非常適合構建分析應用以及通用系統,但它對不少應用場景適用性較差。
由于Python是一種解釋型編程語言,因此大部分Python代碼都要比用編譯型語言(比如Java和C++)編寫的代碼運行慢得多。由于程序員的時間通常都比CPU時間值錢,因此許多人也愿意對此做一些取舍。但是,在那些延遲要求非常小或高資源利用率的應用中(例如高頻交易系統),耗費時間使用諸如C++這樣更低級、更低生產率的語言進行編程也是值得的。
對于高并發、多線程的應用程序而言(尤其是擁有許多計算密集型線程的應用程序),Python并不是一種理想的編程語言。這是因為Python有一個叫做全局解釋器鎖(Global Interpreter Lock,GIL)的組件,這是一種防止解釋器同時執行多條Python字節碼指令的機制。有關“為什么會存在GIL”的技術性原因超出了本書的范圍。雖然很多大數據處理應用程序為了能在較短的時間內完成數據集的處理工作都需要運行在計算機集群上,但是仍然有一些情況需要用單進程多線程系統來解決。
這并不是說Python不能執行真正的多線程并行代碼。例如,Python的C插件使用原生的C或C++的多線程,可以并行運行而不被GIL影響,只要它們不頻繁地與Python對象交互。
1.3 重要的Python庫
考慮到那些還不太了解Python科學計算生態系統和庫的讀者,下面我先對各個庫做一個簡單的介紹。
NumPy
NumPy(Numerical Python的簡稱)是Python科學計算的基礎包。本書大部分內容都基于NumPy以及構建于其上的庫。它提供了以下功能(不限于此):
快速高效的多維數組對象ndarray。
用于對數組執行元素級計算以及直接對數組執行數學運算的函數。
用于讀寫硬盤上基于數組的數據集的工具。
線性代數運算、傅里葉變換,以及隨機數生成。
-成熟的C API, 用于Python插件和原生C、C++、Fortran代碼訪問NumPy的數據結構和計算工具。
除了為Python提供快速的數組處理能力,NumPy在數據分析方面還有另外一個主要作用,即作為在算法和庫之間傳遞數據的容器。對于數值型數據,NumPy數組在存儲和處理數據時要比內置的Python數據結構高效得多。此外,由低級語言(比如C和Fortran)編寫的庫可以直接操作NumPy數組中的數據,無需進行任何數據復制工作。因此,許多Python的數值計算工具要么使用NumPy數組作為主要的數據結構,要么可以與NumPy進行無縫交互操作。
pandas
pandas提供了快速便捷處理結構化數據的大量數據結構和函數。自從2010年出現以來,它助使Python成為強大而高效的數據分析環境。本書用得最多的pandas對象是DataFrame,它是一個面向列(column-oriented)的二維表結構,另一個是Series,一個一維的標簽化數組對象。
pandas兼具NumPy高性能的數組計算功能以及電子表格和關系型數據庫(如SQL)靈活的數據處理功能。它提供了復雜精細的索引功能,能更加便捷地完成重塑、切片和切塊、聚合以及選取數據子集等操作。因為數據操作、準備、清洗是數據分析最重要的技能,pandas是本書的重點。
作為背景,我是在2008年初開始開發pandas的,那時我任職于AQR Capital Management,一家量化投資管理公司,我有許多工作需求都不能用任何單一的工具解決:
有標簽軸的數據結構,支持自動或清晰的數據對齊。這可以防止由于數據不對齊,或處理來源不同的索引不同的數據,所造成的錯誤。
集成時間序列功能。
相同的數據結構用于處理時間序列數據和非時間序列數據。
保存元數據的算術運算和壓縮。
靈活處理缺失數據。
合并和其它流行數據庫(例如基于SQL的數據庫)的關系操作。
我想只用一種工具就實現所有功能,并使用通用軟件開發語言。Python是一個不錯的候選語言,但是此時沒有集成的數據結構和工具來實現。我一開始就是想把pandas設計為一款適用于金融和商業分析的工具,pandas專注于深度時間序列功能和工具,適用于時間索引化的數據。
對于使用R語言進行統計計算的用戶,肯定不會對DataFrame這個名字感到陌生,因為它源自于R的data.frame對象。但與Python不同,data frames是構建于R和它的標準庫。因此,pandas的許多功能不屬于R或它的擴展包。
pandas這個名字源于panel data(面板數據,這是多維結構化數據集在計量經濟學中的術語)以及Python data analysis(Python數據分析)。
matplotlib
matplotlib是最流行的用于繪制圖表和其它二維數據可視化的Python庫。它最初由John D.Hunter(JDH)創建,目前由一個龐大的開發團隊維護。它非常適合創建出版物上用的圖表。雖然還有其它的Python可視化庫,matplotlib卻是使用最廣泛的,并且它和其它生態工具配合也非常完美。我認為,可以使用它作為默認的可視化工具。
IPython和Jupyter
IPython項目起初是Fernando Pérez在2001年的一個用以加強和Python交互的子項目。在隨后的16年中,它成為了Python數據棧最重要的工具之一。雖然IPython本身沒有提供計算和數據分析的工具,它卻可以大大提高交互式計算和軟件開發的生產率。IPython鼓勵“執行-探索”的工作流,區別于其它編程軟件的“編輯-編譯-運行”的工作流。它還可以方便地訪問系統的shell和文件系統。因為大部分的數據分析代碼包括探索、試錯和重復,IPython可以使工作更快。
2014年,Fernando和IPython團隊宣布了Jupyter項目,一個更寬泛的多語言交互計算工具的計劃。IPython web notebook變成了Jupyter notebook,現在支持40種編程語言。IPython現在可以作為Jupyter使用Python的內核(一種編程語言模式)。
IPython變成了Jupyter龐大開源項目(一個交互和探索式計算的高效環境)中的一個組件。它最老也是最簡單的模式,現在是一個用于編寫、測試、調試Python代碼的強化shell。你還可以使用通過Jupyter Notebook,一個支持多種語言的交互式網絡代碼“筆記本”,來使用IPython。IPython shell 和Jupyter notebooks特別適合進行數據探索和可視化。
Jupyter notebooks還可以編寫Markdown和HTML內容,它提供了一種創建代碼和文本的富文本方法。其它編程語言也在Jupyter中植入了內核,好讓在Jupyter中可以使用Python以外的語言。
對我個人而言,我的大部分Python工作都要用到IPython,包括運行、調試和測試代碼。
在本書的GitHub頁面,你可以找到包含各章節所有代碼實例的Jupyter notebooks。
SciPy
SciPy是一組專門解決科學計算中各種標準問題域的包的集合,主要包括下面這些包:
scipy.integrate:數值積分例程和微分方程求解器。
scipy.linalg:擴展了由numpy.linalg提供的線性代數例程和矩陣分解功能。
scipy.optimize:函數優化器(最小化器)以及根查找算法。
scipy.signal:信號處理工具。
scipy.sparse:稀疏矩陣和稀疏線性系統求解器。
scipy.special:SPECFUN(這是一個實現了許多常用數學函數(如伽瑪函數)的Fortran庫)的包裝器。
scipy.stats:標準連續和離散概率分布(如密度函數、采樣器、連續分布函數等)、各種統計檢驗方法,以及更好的描述統計法。
NumPy和SciPy結合使用,便形成了一個相當完備和成熟的計算平臺,可以處理多種傳統的科學計算問題。
scikit-learn
2010年誕生以來,scikit-learn成為了Python的通用機器學習工具包。僅僅七年,就匯聚了全世界超過1500名貢獻者。它的子模塊包括:
分類:SVM、近鄰、隨機森林、邏輯回歸等等。
回歸:Lasso、嶺回歸等等。
聚類:k-均值、譜聚類等等。
降維:PCA、特征選擇、矩陣分解等等。
選型:網格搜索、交叉驗證、度量。
預處理:特征提取、標準化。
與pandas、statsmodels和IPython一起,scikit-learn對于Python成為高效數據科學編程語言起到了關鍵作用。雖然本書不會詳細講解scikit-learn,我會簡要介紹它的一些模型,以及用其它工具如何使用這些模型。
statsmodels
statsmodels是一個統計分析包,起源于斯坦福大學統計學教授Jonathan Taylor,他設計了多種流行于R語言的回歸分析模型。Skipper Seabold和Josef Perktold在2010年正式創建了statsmodels項目,隨后匯聚了大量的使用者和貢獻者。受到R的公式系統的啟發,Nathaniel Smith發展出了Patsy項目,它提供了statsmodels的公式或模型的規范框架。
與scikit-learn比較,statsmodels包含經典統計學和經濟計量學的算法。包括如下子模塊:
回歸模型:線性回歸,廣義線性模型,健壯線性模型,線性混合效應模型等等。
方差分析(ANOVA)。
時間序列分析:AR,ARMA,ARIMA,VAR和其它模型。
非參數方法: 核密度估計,核回歸。
統計模型結果可視化。
statsmodels更關注與統計推斷,提供不確定估計和參數p-值。相反的,scikit-learn注重預測。
同scikit-learn一樣,我也只是簡要介紹statsmodels,以及如何用NumPy和pandas使用它。
1.4 安裝和設置
由于人們用Python所做的事情不同,所以沒有一個普適的Python及其插件包的安裝方案。由于許多讀者的Python科學計算環境都不能完全滿足本書的需要,所以接下來我將詳細介紹各個操作系統上的安裝方法。我推薦免費的Anaconda安裝包。寫作本書時,Anaconda提供Python 2.7和3.6兩個版本,以后可能發生變化。本書使用的是Python 3.6,因此推薦選擇Python 3.6或更高版本。
Windows
要在Windows上運行,先下載Anaconda安裝包。推薦跟隨Anaconda下載頁面的Windows安裝指導,安裝指導在寫作本書和讀者看到此文的的這段時間內可能發生變化。
現在,來確認設置是否正確。打開命令行窗口(cmd.exe),輸入python以打開Python解釋器。可以看到類似下面的Anaconda版本的輸出:
C:\Users\wesm>pythonPython3.5.2|Anaconda 4.1.1 (64-bit)|(default, Jul52016,11:41:13)[MSC v.190064bit (AMD64)] on win32>>>
要退出shell,按Ctrl-D(Linux或macOS上),Ctrl-Z(Windows上),或輸入命令exit(),再按Enter。
Apple (OS X, macOS)
下載OS X Anaconda安裝包,它的名字類似Anaconda3-4.1.0-MacOSX-x86_64.pkg。雙擊.pkg文件,運行安裝包。安裝包運行時,會自動將Anaconda執行路徑添加到.bash_profile文件,它位于/Users/$USER/.bash_profile。
為了確認成功,在系統shell打開IPython:
$ ipython
要退出shell,按Ctrl-D,或輸入命令exit(),再按Enter。
GNU/Linux
Linux版本很多,這里給出Debian、Ubantu、CentOS和Fedora的安裝方法。安裝包是一個腳本文件,必須在shell中運行。取決于系統是32位還是64位,要么選擇x86 (32位)或x86_64 (64位)安裝包。隨后你會得到一個文件,名字類似于Anaconda3-4.1.0-Linux-x86_64.sh。用bash進行安裝:
$ bash Anaconda3-4.1.0-Linux-x86_64.sh
筆記:某些Linux版本在包管理器中有滿足需求的Python包,只需用類似apt的工具安裝就行。這里講的用Anaconda安裝,適用于不同的Linux安裝包,也很容易將包升級到最新版本。
接受許可之后,會向你詢問在哪里放置Anaconda的文件。我推薦將文件安裝到默認的home目錄,例如/home/$USER/anaconda。
Anaconda安裝包可能會詢問你是否將bin/目錄添加到$PATH變量。如果在安裝之后有任何問題,你可以修改文件.bashrc(或.zshrc,如果使用的是zsh shell)為類似以下的內容:
exportPATH=/home/$USER/anaconda/bin:$PATH
做完之后,你可以開啟一個新窗口,或再次用~/.bashrc執行.bashrc。
安裝或升級Python包
在你閱讀本書的時候,你可能想安裝另外的不在Anaconda中的Python包。通常,可以用以下命令安裝:
conda install package_name
如果這個命令不行,也可以用pip包管理工具:
pip install package_name
你可以用conda update命令升級包:
conda update package_name
pip可以用--upgrade升級:
pip install --upgrade package_name
本書中,你有許多機會嘗試這些命令。
注意:當你使用conda和pip二者安裝包時,千萬不要用pip升級conda的包,這樣會導致環境發生問題。當使用Anaconda或Miniconda時,最好首先使用conda進行升級。
Python 2 和 Python 3
第一版的Python 3.x出現于2008年。它有一系列的變化,與之前的Python 2.x代碼有不兼容的地方。因為從1991年Python出現算起,已經過了17年,Python 3 的出現被視為吸取一些列教訓的更優結果。
2012年,因為許多包還沒有完全支持Python 3,許多科學和數據分析社區還是在使用Python 2.x。因此,本書第一版使用的是Python 2.7。現在,用戶可以在Python 2.x和Python 3.x間自由選擇,二者都有良好的支持。
但是,Python 2.x在2020年就會到期(包括重要的安全補丁),因此再用Python 2.7就不是好的選擇了。因此,本書使用了Python 3.6,這一廣泛使用、支持良好的穩定版本。我們已經稱Python 2.x為“遺留版本”,簡稱Python 3.x為“Python”。我建議你也是如此。
本書基于Python 3.6。你的Python版本也許高于3.6,但是示例代碼應該是向前兼容的。一些示例代碼可能在Python 2.7上有所不同,或完全不兼容。
集成開發環境(IDEs)和文本編輯器
當被問到我的標準開發環境,我幾乎總是回答“IPython加文本編輯器”。我通常在編程時,反復在IPython或Jupyter notebooks中測試和調試每條代碼。也可以交互式操作數據,和可視化驗證數據操作中某一特殊集合。在shell中使用pandas和NumPy也很容易。
但是,當創建軟件時,一些用戶可能更想使用特點更為豐富的IDE,而不僅僅是原始的Emacs或Vim的文本編輯器。以下是一些IDE:
PyDev(免費),基于Eclipse平臺的IDE;
JetBrains的PyCharm(商業用戶需要訂閱,開源開發者免費);
Visual Studio(Windows用戶)的Python Tools;
Spyder(免費),Anaconda附帶的IDE;
Komodo IDE(商業)。
因為Python的流行,大多數文本編輯器,比如Atom和Sublime Text 3,對Python的支持也非常好。
1.5 社區和會議
除了在網上搜索,各式各樣的科學和數據相關的Python郵件列表是非常有幫助的,很容易獲得回答。包括:
pydata:一個Google群組列表,用以回答Python數據分析和pandas的問題;
pystatsmodels: statsmodels或pandas相關的問題;
scikit-learn和Python機器學習郵件列表,scikit-learn@python.org;
numpy-discussion:和NumPy相關的問題;
scipy-user:SciPy和科學計算的問題;
因為這些郵件列表的URLs可以很容易搜索到,但因為可能發生變化,所以沒有給出。
每年,世界各地會舉辦許多Python開發者大會。如果你想結識其他有相同興趣的人,如果可能的話,我建議你去參加一個。許多會議會對無力支付入場費和差旅費的人提供財力幫助。下面是一些會議:
PyCon和EuroPython:北美和歐洲的兩大Python會議;
SciPy和EuroSciPy:北美和歐洲兩大面向科學計算的會議;
PyData:世界范圍內,一些列的地區性會議,專注數據科學和數據分析;
國際和地區的PyCon會議(http://pycon.org有完整列表) 。
1.6 本書導航
如果之前從未使用過Python,那你可能需要先看看本書的第2章和第3章,我簡要介紹了Python的特點,IPython和Jupyter notebooks。這些知識是為本書后面的內容做鋪墊。如果你已經掌握Python,可以選擇跳過。
接下來,簡單地介紹了NumPy的關鍵特性,附錄A中是更高級的NumPy功能。然后,我介紹了pandas,本書剩余的內容全部是使用pandas、NumPy和matplotlib處理數據分析的問題。我已經盡量讓全書的結構循序漸進,但偶爾會有章節之間的交叉,有時用到的概念還沒有介紹過。
盡管讀者各自的工作任務不同,大體可以分為幾類:
與外部世界交互
閱讀編寫多種文件格式和數據存儲;
數據準備
清洗、修改、結合、標準化、重塑、切片、切割、轉換數據,以進行分析;
轉換數據
對舊的數據集進行數學和統計操作,生成新的數據集(例如,通過各組變量聚類成大的表);
建模和計算
將數據綁定統計模型、機器學習算法、或其他計算工具;
展示
創建交互式和靜態的圖表可視化和文本總結。
代碼示例
本書大部分代碼示例的輸入形式和輸出結果都會按照其在IPython shell或Jupyter notebooks中執行時的樣子進行排版:
In[5]:CODEEXAMPLEOut[5]:OUTPUT
但你看到類似的示例代碼,就是讓你在in的部分輸入代碼,按Enter鍵執行(Jupyter中是按Shift-Enter)。然后就可以在out看到輸出。
示例數據
各章的示例數據都存放在GitHub上:http://github.com/pydata/pydata-book。下載這些數據的方法有二:使用git版本控制命令行程序;直接從網站上下載該GitHub庫的zip文件。如果遇到了問題,可以到我的個人主頁,http://wesmckinney.com/,獲取最新的指導。
為了讓所有示例都能重現,我已經盡我所能使其包含所有必需的東西,但仍然可能會有一些錯誤或遺漏。如果出現這種情況的話,請給我發郵件:wesmckinn@gmail.com。報告本書錯誤的最好方法是O’Reilly的errata頁面,http://www.bit.ly/pyDataAnalysis_errata。
引入慣例
Python社區已經廣泛采取了一些常用模塊的命名慣例:
importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdimportseabornassnsimportstatsmodelsassm
也就是說,當你看到np.arange時,就應該想到它引用的是NumPy中的arange函數。這樣做的原因是:在Python軟件開發過程中,不建議直接引入類似NumPy這種大型庫的全部內容(from numpy import *)。
行話
由于你可能不太熟悉書中使用的一些有關編程和數據科學方面的常用術語,所以我在這里先給出其簡單定義:
數據規整(Munge/Munging/Wrangling)
指的是將非結構化和(或)散亂數據處理為結構化或整潔形式的整個過程。這幾個詞已經悄悄成為當今數據黑客們的行話了。Munge這個詞跟Lunge押韻。
偽碼(Pseudocode)
算法或過程的“代碼式”描述,而這些代碼本身并不是實際有效的源代碼。
語法糖(Syntactic sugar)
這是一種編程語法,它并不會帶來新的特性,但卻能使代碼更易讀、更易寫。
第1章 準備工作
第2章 Python語法基礎,IPython和Jupyter Notebooks
作者:SeanCheney
鏈接:http://www.lxweimin.com/p/04d180d90a3f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。