趁着過年宅家,讀了托馬茲·卓巴斯的《數據分析實戰》,2018年6月出版,本系列爲讀書筆記。主要是爲了系統整理,加深記憶。
關於作者
托馬茲·卓巴斯(Tomasz Drabas)是微軟的數據科學家,目前工作於西雅圖。他擁有超過13年的數據分析經驗,行業領域覆蓋高新技術、航空、電信、金融以及諮詢。
2003年,Tomasz獲得戰略管理的碩士學位後,從位於波蘭華沙的LOT波蘭航空公司開啓了他的職業生涯。2007年,他前往悉尼,在新南威爾士大學航空學院攻讀運籌學博士學位;他的研究結合了離散選擇模型和航空作業。在悉尼的日子裏,他曾擔任過Beyond Analysis Australia公司的數據分析師,沃達豐和記澳大利亞公司的高級數據分析師/數據科學家,以及其他職位。他也發表過學術論文,參加過國際會議,並且擔任過學術期刊的審稿人。
2015年,他搬到西雅圖,開始在微軟工作。在這裏他致力於解決高維特徵空間的問題。
本書深入數據分析與建模的世界,使用多種方法、工具及算法,提供了豐富的技巧。
本書第 一部分會講授一些實戰技巧,用於讀取、寫入、清洗、格式化、探索與理解數據;第二部分由一些較深入的主題組成,比如分類、聚類和預測等。第三部分介紹更高深的主題,從圖論到自然語言處理,到離散選擇模型,再到模擬。
通過閱讀本書,你將學到:
- 使用Pandas與OpenRefine讀取、清洗、轉換與存儲數據
- 使用Pandas與D3.js理解數據,探索變量間的關係
- 使用Pandas、mlpy、NumPy與Statsmodels,應用多種技法,分類、聚類銀行的營銷電話
- 使用Pandas、NumPy與mlpy減少數據集的維度,提取重要的特徵
- 使用NetworkX和Gephi探索社交網絡的交互,用圖論的概念識別出欺詐行爲
- 通過加油站的例子,學習代理人基建模的模擬技術
第1章講解了利用多種數據格式與數據庫來讀取與寫入數據的過程,以及使用OpenRefine與Python對數據進行清理。
第2章描述了用於理解數據的多種技巧。我們會了解如何計算變量的分佈與相關性,並生成多種圖表。
第3章介紹了處理分類問題的種種技巧,從樸素貝葉斯分類器到複雜的神經網絡和隨機樹森林。
第4章解釋了多種聚類模型;從最常見的k均值算法開始,一直到高級的BIRCH算法和DBSCAN算法。
第5章展示了很多降維的技巧,從最知名的主成分分析出發,經由其核版本與隨機化版本,一直講到線性判別分析。
第6章涵蓋了許多回歸模型,有線性的,也有非線性的。我們還會複習隨機森林和支持向量機,它們可用來解決分類或迴歸問題。
第7章探索瞭如何處理和理解時間序列數據,並建立ARMA模型以及ARIMA模型。
第8章介紹瞭如何使用NetworkX和Gephi來對圖數據進行處理、理解、可視化和分析。
第9章描述了多種與分析文本信息流相關的技巧:詞性標註、主題抽取以及對文本數據的分類。
第10章解釋了選擇模型理論以及一些流行的模型:多項式Logit模型、嵌套Logit模型以及混合Logit模型。
第11章涵蓋了代理人基的模擬;我們模擬的場景有:加油站的加油過程,電動車耗盡電量以及狼——羊的掠食。
本文主要記錄使用python工具及第1 章內容。
(一)使用工具
1、本人使用python 3.7.5,64位,可官方下載。https://www.python.org/getit/
2、IDE書中推薦使用Anaconda
Anaconda 官方下載 https://www.anaconda.com/distribution/#download-section
注:如果想直接使用全書示例,請使用該版本。如果想學習各個組件的部署,請參照書中指示手工配置各個組件。
Anaconda 是Python的一個發行版,裏面內置了很多工具,不用單獨安裝,因爲做了優化也免去了單獨安裝帶來的一些麻煩。
Anaconda 是一種Python語言的免費增值開源發行版,用於進行大規模數據處理、預測分析,和科學計算,致力於簡化包的管理和部署。
下載安裝過程時不要添加到Path變量,Anaconda會自動搜索你本機已經安裝的python版本。
國內鏡像下載
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
Spyder是簡單高效的IDE,Spyder是Python(x,y)的作者爲它開發的一個簡單的集成開發環境。和其他的Python開發環境相比,它最大的優點就是模仿MATLAB的“工作空間”的功能,可以很方便地觀察和修改數組的值。
個人感覺:
1)普通的筆記本配置運行Anaconda有點喫力,內存專給它4G還好,主要的是硬盤和CPU,明顯聽到SATA物理硬盤嘎嘎響(後改到SSD分區好些),啓動時CPU會近60%。
2)Anaconda+spyder比通用的Eclipse+pyDev要專業的多,當然後者的項目管理功能更強。
邀月推薦:新手用Anaconda即可。畢竟集成了spyder,其中spyder建議手動升級到4.0以上或最新版本。本人鍾愛Eclipse,所以使用Eclipse2019-09版本。
3、PIP國內鏡像(主要解決域外服務器不穩定,你一定懂的。)
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
設置方法:(以清華鏡像爲例,其它鏡像同理)
(1)臨時使用:
可以在使用 pip 的時候,加上參數-i和鏡像地址(如https://pypi.tuna.tsinghua.edu.cn/simple),
例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas,這樣就會從清華鏡像安裝pandas庫。
(2)永久修改,一勞永逸:
(a)Linux下,修改 ~/.pip/pip.conf (沒有就創建一個文件夾及文件。文件夾要加“.”,表示是隱藏文件夾)
內容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
(b) windows下,直接在user目錄中創建一個pip目錄,如:C:\Users\xx\pip,然後新建文件pip.ini,即 %HOMEPATH%\pip\pip.ini,在pip.ini文件中輸入以下內容(以清華鏡像爲例):
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
4、如果不喜歡pip,可以使用conda,本文不贅述,同樣要注意設置清華鏡像站點。
本人使用win10及以上環境,編譯過了書中96%以上的代碼,其中報錯咎,後續文中詳述。本文末尾附上隨書源代碼下載地址。
(二)第1 章內容:
第1章 準備數據
本章內容涵蓋了使用Python和OpenRefine來完成讀取、存儲和清理數據這些基本任務。你將學習以下內容:
·使用Python讀寫CSV/TSV文件
·使用Python讀寫JSON文件
·使用Python讀寫Excel文件
·使用Python讀寫XML文件
·使用pandas檢索HTML頁面
·存儲並檢索關係數據庫
·存儲並檢索MongoDB
·使用OpenRefine打開並轉換數據
·使用OpenRefine探索數據
·排重
·使用正則表達式與GREL清理數據
·插補缺失值
·將特性規範化、標準化
·分級數據
·編碼分類變量
1.2使用python讀取CSV/TSV文件
獨立安裝 pandas
pip install pandas
官方文檔在這裏:
https://pandas.pydata.org/pandas-docs/stable/
/*
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
........
Installing collected packages: pytz, numpy, python-dateutil, pandas
Successfully installed numpy-1.17.4 pandas-0.25.3 python-dateutil-2.8.1 pytz-2019.3
FINISHED
*/
讀取CSV:
https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-read-csv-table
padas讀取大容量數據的速度,不得不讚一下。
Tips:
1、python3 寫CSV文件多一個空行
解決方案:打開文件的時候多指定一個參數。
#write to files
with open(w_filenameCSV,'w',newline='') as write_csv:
write_csv.write(tsv_read.to_csv(sep=',', index=False))
1.3使用python讀取JSON文件
獨立安裝 pandas 同上,略
讀取CSV:
https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-json-reader
1.4使用python讀取Excel文件
獨立安裝 pandas 同上,略
Tips:
/*
Module Not Found Error: No module named 'openpyxl'
*/
解決方案:pip install openpyxl
Tips2:
/*
Traceback (most recent call last):
File "D:\Java2018\practicalDataAnalysis\Codes\Chapter01\read_xlsx_alternative.py", line 16, in <module>
labels = [cell.value for cell in xlsx_ws.rows[0]]
TypeError: 'generator' object is not subscriptable
*/
解決方案:
1、改代碼
# name of files to read from
r_filenameXLSX = '../../Data/Chapter01/realEstate_trans.xlsx'
# open the Excel file
xlsx_wb = oxl.load_workbook(filename=r_filenameXLSX)
# extract the 'Sacramento' worksheet
xlsx_ws = xlsx_wb.active #默認第一個sheet
labels=[]
for row in xlsx_ws.iter_cols(min_row=1,max_row=1):
labels+=([cell.value for cell in row])
# extract the data and store in a list
# each element is a row from the Excel file
data = []
for row in xlsx_ws.iter_rows(min_row=1,max_col=10, max_row=10):
data.append([cell.value for cell in row])
###print the prices of the first 10 properties
print( [item[labels.index('price')] for item in data[0:10]] )
2、修改openpyxl版本
pip install -I openpyxl==2.3.3
3、採用其他插件如xlrd
# name of files to read from
r_filenameXLSX = '../../Data/Chapter01/realEstate_trans.xlsx'
try:
# 打開文件
xlsx_wb = exls.open_workbook(r_filenameXLSX)
#sheet2_name = workbook.sheet_names() # 獲取所有sheet名稱
#print(sheet2_name)
# 根據sheet索引或者名稱獲取sheet內容
xlsx_ws = xlsx_wb.sheet_by_index(0) # sheet索引從0開始
# sheet1 = workbook.sheet_by_name('sheet2')
# sheet1的名稱,行數,列數
print("sheet名:"+xlsx_ws.name, "共",str(xlsx_ws.nrows)+"行", str(xlsx_ws.ncols)+"列")
s="";
labels=xlsx_ws.row_values(0,1,10)
data=[]
# first 10 rows of xlsx_ws.nrows
for rownum in range(0, 10):
#first 10 columns of xlsx_ws.ncols
data.append(xlsx_ws.row_values(rownum,1,10))
# print(labels)
# print(data)
print( [item[labels.index('price')] for item in data[0:10]] )
except Exception as e:
print(e)
1.5使用python讀取XML文件
獨立安裝 pandas 同上,略
1.6使用python讀取html文件
獨立安裝 pandas 同上,略
獨立安裝 re 正則表達式模塊
pip install html5lib
/*
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
........
Installing collected packages: webencodings, html5lib
Successfully installed html5lib-1.0.1 webencodings-0.5.1
FINISHED
*/
Tips:ImportError: lxml not found, please install it
/*
File "D:\tools\Python37\lib\site-packages\pandas\io\html.py", line 843, in _parser_dispatch
raise ImportError("lxml not found, please install it")
ImportError: lxml not found, please install it
*/
解決方案:pip install lxml
Tips:ImportError: BeautifulSoup4 (bs4) not found, please install it
/*
File "D:\tools\Python37\lib\site-packages\pandas\io\html.py", line 837, in _parser_dispatch
raise ImportError("BeautifulSoup4 (bs4) not found, please install it")
ImportError: BeautifulSoup4 (bs4) not found, please install it
*/
解決方案:pip install BeautifulSoup4
示例:
https://programtalk.com/python-examples/pandas.read_html/
1.7存儲並檢索關係數據庫
獨立安裝 pandas 同上,略
獨立安裝 sqlalchemy,psycopg2
pip install sqlalchemy
--pip install psycopg2
sqlalchemy支持各特別是常見數據庫,比如mySQL,Oracle,SqlLite,PostgreSQL等
/*
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
........
Installing collected packages: sqlalchemy
Successfully installed sqlalchemy-1.3.11
FINISHED
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting psycopg2
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1a/85/853f11abfccfd581b099e5ae5f2dd807cc2919745b13d14e565022fd821c/psycopg2-2.8.4-cp37-cp37m-win_amd64.whl (1.1MB)
Installing collected packages: psycopg2
Successfully installed psycopg2-2.8.4
FINISHED
D:\tools\Python37\lib\site-packages\dateutil\parser\_parser.py:1218: UnknownTimezoneWarning: tzname EDT identified but not understood. Pass `tzinfos` argument in order to correctly return a timezone-aware datetime. In a future version, this will raise an exception.
category=UnknownTimezoneWarning)
index street city ... price latitude longitude
0 0 3526 HIGH ST SACRAMENTO ... 59222 38.631913 -121.434879
1 1 51 OMAHA CT SACRAMENTO ... 68212 38.478902 -121.431028
2 2 2796 BRANCH ST SACRAMENTO ... 68880 38.618305 -121.443839
3 3 2805 JANETTE WAY SACRAMENTO ... 69307 38.616835 -121.439146
4 4 6001 MCMAHON DR SACRAMENTO ... 81900 38.519470 -121.435768
[5 rows x 13 columns] */
1.8存儲並檢索MongoDB
獨立安裝 pandas 同上,略
獨立安裝 PyMongo
pip install --upgrade PyMongo
1.9使用OpenRefine打開並轉換數據
下載:https://github.com/OpenRefine/OpenRefine/releases
(substring(value,4,10)+','+substring(value,24,29)).toDate()
1.10使用OpenRefine探索數據
1.11排重
1.12使用正則表達式與GREL清理數據
--value.match(/(.*)(..)(\d{5})/)[0],注意空格
value.match(/(.*) (..) (\d{5})/)[0]--city
value.match(/(.*) (..) (\d{5})/)[1]--State
value.match(/(.*) (..) (\d{5})/)[2]--zip
1.13插補缺失值
# impute mean in place of NaNs
#估算平均數以替代空值
csv_read['price_mean'] = csv_read['price'] \
.fillna(
csv_read.groupby('zip')['price'].transform('mean')
)
# impute median in place of NaNs
#估算中位數以替代空值
csv_read['price_median'] = csv_read['price'] \
.fillna(
csv_read.groupby('zip')['price'].transform('median')
)
1.14將特徵規範化、標準化
數據規範化:讓所有的數都落在0與1的範圍內(閉區間)
數據標準化:移動其分佈,使得數據的平均數是0,標準差是1
規範化數據,即讓每個值都落在0和1之間,我們減去數據的最小值,併除以樣本的範圍。統計學上的範圍指的是最大值與最小值的差。normalize(...)方法就是做的前面描述的工作:對數據的集合,減去最小值,除以範圍。
標準化的過程類似:減去平均數,除以樣本的標準差。這樣,處理後的數據,平均數爲0而標準差爲1。standardize(...)方法做了這些處理:
def normalize(col):
#Normalize column 規範化
return (col - col.min()) / (col.max() - col.min())
def standardize(col):
#Standardize column 標準化
return (col - col.mean()) / col.std()
1.15分級數據
當我們想查看數據分佈的形狀,或將數據轉換爲有序的形式時,數據分級就派上用場了。
獨立安裝 pandas 同上,略
獨立安裝 Numpy
pip install numpy
分位數與百分位數有緊密的聯繫。區別在於百分位數返回的是給定百分數的值(即間隔均勻),而分位數返回的是給定分位點的值(即數目大致相等)。
想了解更多,可訪問https://www.stat.auckland.ac.nz/~ihaka/787/lectures-quantiles-handouts.pdf
1)以下代碼取百分位數:
# 根據線性劃分的價格的範圍,創建間隔相等的價格容器
# 示例linspace(0,6,6)==>[0,,1.2,,2.4,,3.6,,4.8,,6.0]
bins = np.linspace(
csv_read['price_mean'].min(),
csv_read['price_mean'].max(),
)
# and apply the bins to the data
# 將容器應用到數據上,digitize第一個參數是要分級的列,第二個參數是容器的數組
csv_read['b_price'] = np.digitize(
csv_read['price_mean'],
bins
)
# print out the counts for the bins
# 每個容器中的記錄計數
counts_b = csv_read['b_price'].value_counts()
print(counts_b.sort_index())
有時候我們不會用均勻間隔的值,我們會讓每個箱中擁有相同的數目。要達成這個目標,我們可以使用分位數。
我們想把列拆成十分位數,即10個(差不多)相等的容器。要做到這點,我們可以使用下面的代碼:
# create bins based on deciles
# 創建基於十分位數的箱子,即每個箱中擁有差不多相同的數目
decile = csv_read['price_mean'].quantile(np.linspace(0,1,11))
# and apply the decile bins to the data
# 對數據應用分數位
csv_read['p_price'] = np.digitize(
csv_read['price_mean'],
decile
)
# print out the counts for the percentile bins
counts_p = csv_read['p_price'].value_counts()
print(counts_p.sort_index())
.quantile(...)方法可以傳一個(0到1之間的)數字,來表明要返回的分位數(例如,0.5是中位數,0.25和0.75是上下四分位數)。它也可以傳入一個分位的列表,返回相應的值的數組。.linspace(0,1,11)方法會生成這個數組:.quantile(...)方法會以price_mean列的最小值開始,直到最大值,返回十分位數的列表。
/*
350
480
118
26
4
3
Name: b_price, dtype: int64
96
100
98
98
97
97
99
97
99
97
3
Name: p_price, dtype: int64
*/
1.16編碼數據變量
最後一步就是分類變量。
統計模型只能接受有序的數據。分類變量(有時根據上下文可表示爲數字)不能直接在模型中使用。要使用它們,我們要先進行編碼,也就是給它們一個唯一的數字編號。
Tips:
# dummy code the column
# 根據房產類型列[type]處理的簡單代碼
# prefix指定以d開頭,本例中是d_Condo,可通過prefix_sep參數修改
csv_read = pd.get_dummies(
csv_read,
prefix='d',
columns=['type']
)
結果生成4個水平列:
d_Condo、d_Multi-Family、d_Residential、d_Unkown
官方文檔:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html
第1 章完。
隨書源碼官方下載:
http://www.hzcourse.com/web/refbook/detail/7821/92
邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。
助人等於自助! [email protected]