數據分析是一個快速發展的領域,而Python已經演變成數據科學的主要語言,廣泛應用于數據分析、可視化和機器學習等領域。本書從數據分析的基礎內容入手,比如matplotlib、NumPy和Pandas庫,介紹如何通過選擇色彩圖和調色板來創建可視化,之后深入統計數據分析,將幫助你掌握Spark和HDFS,為網絡挖掘創建可遷移腳本。本書還詳細闡述如何評價股票,檢測市場有效性,使用指標和聚類等,并且還將使用多線程實現并行性,并加速你的代碼。在本書結束時,讀者將能夠運用各種Python中的數據分析技術,并針對問題場景設計解決方案。
前言?Preface數據分析是Python的殺手锏。
——匿名本書是《PythonDataAnalysis》的后續。那么在《PythonDataAnalysis》已經足夠優秀(我愿意這么認為)的情況下,這本書有哪些新的內容嗎?本書是針對那些有一定經驗的Python程序員寫的。一年時間過去了,因此,我們將使用在《PythonDataAnalysis》中沒有用到的一些更新版本的軟件和軟件庫。另外,經過深入反思和調研,我做出了以下的總結:
為了減輕自己的負擔,同時提高代碼的可重復使用率,我需要一個工具箱,我將這個工具箱命名為dautil并將它發布到了Pypi上(可以通過pip/easy_install安裝)。
通過反省,我深信需要簡化獲取和安裝所需要的軟件的過程,因此我通過DockerHub發布了一個包含了我們需要用到的軟件的Docker容器(pydacbk),在本書的第1章和線上章節中你將了解更多關于如何安裝的細節。這個Docker容器還是不夠理想,因為它的體積已經相當大,所以我需要做出一些艱難的決定。因為這個容器并不是本書的一部分,所以如果你有任何問題可以直接與我聯系,但是請記住我不會對鏡像做很大的修改。
本書會使用IPythonNotebook,這個工具已經成為數據分析時的標準工具。在線上章節以及我寫的其他書中,我已經給出了一些和IPythonNotebook相關的建議。
除了極少數案例外,本書中我主要使用的是Python3,因為2020年后官方將不再支持Python2。
為什么需要這本書有人會說你并不需要書籍,你只需要去做一個感興趣的項目,然后在做項目的同時就會搞明白那些東西。但是盡管接觸到大量的資源,這個過程可能還是會令你感到沮喪。打個比方,如果想烹調一碗美味的湯,你可以去向朋友和家人尋求幫助,上網搜索或者收看烹飪節目,但是朋友和家人不會一直在你身邊,網絡上的內容也是良莠不齊。以我的淺見,出版社、審稿人和作者都在這本書上花費了大量的時間和精力,如果你不能從中有所收獲我會感到很詫異。
數據分析、數據科學、大數據——有什么了不起的你應該看過將數據科學用數學/統計學、計算機科學以及專業領域的知識進行描述的維恩圖(Venndiagram)。數據分析是永恒的,它出現在數據科學之前,甚至是計算機科學之前。你可以用筆和紙或者更先進的便攜計算器進行數據分析。
數據分析體現在很多方面,比如說以做出決策或提出新的假設和問題為目的進行數據分析。數據科學以及大數據的熱潮、高待遇以及經濟回報讓我想起了當數據存儲和商業智能還是時髦詞的年代。商業智能和數據存儲的終極目標是構建應用于管理的可視化圖表。這涉及很多政治和組織方面的利益,但是從技術的角度來看,這主要還是和數據庫相關。數據科學則不是以數據庫為中心,而是很大程度上依賴于機器學習。由于數據的量在不斷地變多,機器學習變得越來越不可或缺。數據大量增長的背后是人口的快速增長以及新技術的層出不窮,比如說社交媒體和移動設備的出現。事實上,數據增長可能是我們唯一可以肯定的將一直持續的趨勢。構建可視化圖表和應用機器學習的區別就類似于搜索引擎的演進。
搜索引擎(如果可以這么稱呼)最初只是手動創建的組織良好的鏈接集合。而最終,純自動的方式取代了前者。當下,更多的數據將會被創建(而不是被銷毀),我們可以預見自動化數據分析領域的增長。
Python數據分析的簡要歷程各個Python軟件庫的歷史十分有趣,但我不是一個歷史學家,所以下面的記錄主要從我的視角來寫:
1989年:GuidoVanRossum在荷蘭的CWI實現了Python的第一個版本,當時是作為一個圣誕節的“興趣”項目。
1995年:JimHugunin創建了Numeric——Numpy的前身。
1999年:PearuPeterson寫了f2py作為連接Fortran和Python的橋梁。
2000年:Python2.0發布。
2001年:SciPy庫發布,同期創建的還有與Numeric競爭的庫Numarray。FernandoPerez發布了IPython,它最初是以“午后黑客”(afternoonhack)的名義發布的。NLTK(自然語言工具包)發布且用于研究項目。
2002年:JohnHunter創建了Matplotlib庫。
2005年:TravisOliphant發布了NumPy,NumPy最初是受Numarray啟發而對Numeric進行擴展的庫。
2006年:NumPy1.0發布,第1版SQLAlchemy發布。
2007年:DavidCournapeau將scikit-learn作為GoogleSummerofCode的項目,Cy-thon在Pyrex的基礎上開始開發,Cython后來集中用在了pandas和scikit-learn上以提升性能。
2008年:WesMcKinney開始開發pandas,Python3.0發布。
2011年:IPython0.12發行版本中引入了IPythonNotebook,Packt出版社出版了《NumPy1.5BeginnersGuide》。
2012年:Packt出版社出版了《NumPyCookbook》。
2013年:Packt出版社出版了第2版的《NumPyBeginnersGuide》。
2014年:FernandoPerez宣布了Jupyter項目,致力于開發與語言無關的Notebook,Packt出版社出版了《LearningNumPyArray》和《PythonDataAnalysis》。
2015年:Packt出版社出版了第3版的《NumPyBeginnersGuide》以及第2版的《NumPyCookbook》。
Contents?目 錄
譯者序
前 言
第1章為可重復的數據分析奠定基礎 1
1.1 簡介 1
1.2 安裝Anaconda 2
1.3 安裝數據科學工具包 3
1.4 用virtualenv和virtualenvwrapper創建Python虛擬環境 5
1.5 使用Docker鏡像沙盒化Python應用 6
1.6 在IPython Notebook中記錄軟件包的版本和歷史 8
1.7 配置IPython 11
1.8 學習為魯棒性錯誤校驗記錄日志 13
1.9 為你的代碼寫單元測試 16
1.10 配置pandas 18
1.11 配置matplotlib 20
1.12為隨機數生成器和NumPy打印選項設置種子 23
1.13使報告、代碼風格和數據訪問標準化 24
第2章 創建美觀的數據可視化 28
2.1 簡介 28
2.2 圖形化安斯庫姆四重奏 28
2.3 選擇Seaborn的調色板 31
2.4 選擇matplotlib的顏色表 33
2.5 與IPython Notebook部件交互 35
2.6 查看散點圖矩陣 38
2.7通過mpld3使用d3.js進行可視化 40
2.8 創建熱圖 41
2.9把箱線圖、核密度圖和小提琴圖組合 44
2.10 使用蜂巢圖可視化網絡圖 45
2.11 顯示地圖 47
2.12 使用類ggplot2圖 49
2.13 使用影響圖高亮數據 51
第3章 統計數據分析和概率 53
3.1 簡介 53
3.2 將數據擬合到指數分布 53
3.3 將聚合數據擬合到伽馬分布 55
3.4 將聚合計數擬合到泊松分布 57
3.5 確定偏差 59
3.6 估計核密度 61
3.7確定均值、方差和標準偏差的置信區間 64
3.8 使用概率權重采樣 66
3.9 探索極值 68
3.10使用皮爾遜相關系數測量變量之間的相關性 71
3.11使用斯皮爾曼等級相關系數測量變量之間的相關性 74
3.12使用點二列相關系數測量二值變量和連續變量的相關性 77
3.13評估變量與方差分析之間的關系 78
第4章 處理數據和數值問題 81
4.1 簡介 81
4.2 剪輯和過濾異常值 81
4.3 對數據進行縮尾處理 84
4.4 測量噪聲數據的集中趨勢 85
4.5 使用Box-Cox變換進行歸一化 88
4.6 使用冪階梯轉換數據 90
4.7 使用對數轉換數據 91
4.8 重組數據 93
4.9 應用logit()來變換比例 95
4.10 擬合魯棒線性模型 97
4.11 使用加權最小二乘法考慮方差 99
4.12 使用任意精度進行優化 101
4.13 使用任意精度的線性代數 103
第5章網絡挖掘、數據庫和大數據 107
5.1 簡介 107
5.2 模擬網頁瀏覽 108
5.3 網絡數據挖掘 110
5.4處理非ASCII文本和HTML實體 112
5.5 實現關聯表 114
5.6 創建數據庫遷移腳本 117
5.7 在已經存在的表中增加一列 117
5.8 在表創建之后添加索引 118
5.9 搭建一個測試Web服務器 120
5.10實現具有事實表和維度表的星形模式 121
5.11 使用Hadoop分布式文件系統 126
5.12 安裝配置Spark 127
5.13 使用Spark聚類數據 128
第6章 信號處理和時間序列 132
6.1 簡介 132
6.2 使用周期圖做頻譜分析 132
6.3使用Welch算法估計功率譜密度 134
6.4 分析峰值 136
6.5 測量相位同步 138
6.6 指數平滑法 140
6.7 評估平滑法 142
6.8 使用Lomb-Scargle周期圖 145
6.9 分析音頻的頻譜 146
6.10 使用離散余弦變換分析信號 149
6.11 對時序數據進行塊自舉 151
6.12 對時序數據進行動態塊自舉 153
6.13 應用離散小波變換 155
第7章利用金融數據分析選擇股票 159
7.1 簡介 159
7.2 計算簡單收益率和對數收益率 159
7.3使用夏普比率和流動性對股票進行排名 161
7.4使用卡瑪和索提諾比率對股票進行排名 162
7.5 分析收益統計 164
7.6 將個股與更廣泛的市場相關聯 166
7.7 探索風險與收益 169
7.8 使用非參數運行測試檢驗市場 170
7.9 測試隨機游走 173
7.10 使用自回歸模型確定市場效率 175
7.11 為股票價格數據庫建表 177
7.12 填充股票價格數據庫 178
7.13 優化等權重雙資產組合 183
第8章 文本挖掘和社交網絡分析 186
8.1 簡介 186
8.2 創建分類的語料庫 186
8.3 以句子和單詞標記化新聞文章 189
8.4詞干提取、詞形還原、過濾和TF-IDF得分 189
8.5 識別命名實體 193
8.6 提取帶有非負矩陣分解的主題 194
8.7 實現一個基本的術語數據庫 196
8.8 計算社交網絡密度 200
8.9 計算社交網絡接近中心性 201
8.10 確定中介中心性 202
8.11 評估平均聚類系數 203
8.12 計算圖的分類系數 204
8.13 獲得一個圖的團數 205
8.14 使用余弦相似性創建文檔圖 206
第9章 集成學習和降維 209
9.1 簡介 209
9.2 遞歸特征消除 210
9.3 應用主成分分析來降維 211
9.4 應用線性判別分析來降維 213
9.5 多模型堆疊和多數投票 214
9.6 學習隨機森林 217
9.7使用RANSAC算法擬合噪聲數據 220
9.8 使用Bagging來改善結果 222
9.9 用于更好學習的Boosting算法 224
9.10 嵌套交叉驗證 227
9.11 使用joblib重用模型 229
9.12 層次聚類數據 231
9.13 Theano之旅 232
第10章評估分類器、回歸器和聚類 235
10.1 簡介 235
10.2 直接使用混淆矩陣分類 235
10.3 計算精度、召回率和F1分數 23