【資料分享】利用Python進行數據分析·第2版 PDF

《利用Python進行數據分析》(第二版)+中文翻譯精要+配套代碼和數據python

連接:https://pan.baidu.com/s/1kz4DTlefVVkBpewtgomsjw程序員

提取碼:l8wi PDFweb


 

1.1 本書的內容算法

本書講的是利用Python進行數據控制、處理、整理、分析等方面的具體細節和基本要點。個人目標是介紹Python編程和用於數據處理的庫和工具環境,掌握這些,可讓你成爲一個數據分析專家。雖然本書的標題是「數據分析」,重點倒是Python編程、庫,以及用於數據分析的工具。這就是數據分析要用到的Python編程。shell

什麼樣的數據?數據庫

當書中出現「數據」時,究竟指的是什麼呢?主要指的是結構化數據(structured data),這個故意含糊其辭的術語代指了全部通用格式的數據,例如:編程

表格型數據,其中各列多是不一樣的類型(字符串、數值、日期等)。好比保存在關係型數據庫中或以製表符/逗號爲分隔符的文本文件中的那些數據。小程序

多維數組(矩陣)。api

經過關鍵列(對於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有完整列表) 。

做者:生活的探路者

連接:https://www.jianshu.com/p/3bcd7060700a

來源:簡書

著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索