Python 数据科学入门
http://python.jobbole.com/85394/
Python 在數據科學領域越來越流行了。它的流行不無道理。 Python 容易學,有超強數據科學庫,并且和 Hadoop 以及 Spark 等數據庫和工具整合得非常好。Python 可以從頭至尾完成一個數據科學項目,無論是讀取數據、分析數據、數據可視化還是用機器學習來做預測都可以。
本文介紹如何用 Python 上手數據科學。如果想要了解更多內容請訪問 Dataquest, 那里有使用 Python 完成數據科學任務的深入講解。
本文使用的是關于 2016 美國總統大選政治資助的數據集(鏈接 在此)。文件是 csv 格式,每行代表對一個候選人的一次捐贈。這個數據集有幾列比較值得一提,比如:
cand_nm – 接受捐贈的候選人姓名
contbr_nm – 捐贈人姓名
contbr_state – 捐贈人所在州
contbr_employer – 捐贈人所在公司
contbr_occupation – 捐贈人職業
contb_receipt_amount – 捐贈數額(美元)
contb_receipt_dt – 收到捐款的日期
安裝 Python
要分析這些數據,首先要安裝 Python。利用 Anaconda 這個工具來安裝 Python 是非常簡單的。Anaconda 在安裝 Python 的同時還會安裝一些流行的數據分析庫。點擊 這里 下載 Anaconda。建議安裝最新的 Python 3.5 版本。這個鏈接 里介紹了一些 Python 2 與 Python 3 的對比。
Anaconda 會自動安裝一些這篇文章會用到的庫,包括 Jupyter、Pandas、scikit-learn 和 matplotlib。
Jupyter 入門
都安裝好之后可以啟動 Jupyter notebook (原名 IPython notebook)。Jupyter notebook 是個強有力的數據分析工具。它能夠幫助快速查看數據、將結果可視化以及把結果分享給他人。谷歌、IBM、微軟的數據科學家都用它來分析數據以及組內協作。
在命令行里輸入 ipython notebook 來運行 Jupyter。如果遇到問題可以去它的 官方文檔 里查找答案。
啟動后會出現一個可以查看文件的瀏覽器界面,在這個頁面上可以創建新的 notebook。請創建一個叫 Python 3 的 notebook,一會兒的數據分析中會用到它。如果剛才的安裝還沒成功,這篇文章 也許有幫助。
Notebook 工作區塊
每個 Jupyter notebook 都包含多個區塊(cell),區塊可以運行代碼也可以只包含文檔。每個 notebook 開始時都自帶一個區塊,如有需要可以自行增加多個區塊,比如:
In [ ]:
Python
1
2
3
4
代碼區塊示例。產生的輸出會在下方顯示。
print(10)
b = 10
In [ ]:
Python
1
2
3
4
可以建立多個區塊,每個代碼區塊可以根據分析的需求跑任意次
Jupyter notebook 中一個很贊的功能是每個區塊跑出來的結果會被緩存起來, 這樣一個區塊可以利用另一個區塊跑出來的結果。
print(b * 10)
如果想要了解更多關于 Jupyter 的知識請閱讀作者提供的更深入的 教程。
Pandas 入門
Pandas 是 Python 上的一個數據分析庫。它能讀取包括 csv 在內的不同格式的數據,分析數據也很有效。可以通過下面的代碼來讀取數據:
In [2]:
Python
1
2
3
import pandas as pd
donations = pd.read_csv(“political_donations.csv”)
In [3]:
1
donations.shape
Out[3]:
1
(384885, 18)
In [4]:
Python
1
donations.head(2)
Out[4]:
cmte_id cand_id cand_nm contbr_nm contbr_city contbr_st contbr_zip contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt receipt_desc memo_cd memo_text form_tp file_num tran_id election_tp
C00458844 P60006723 Rubio, Marco KIBBLE, KUMAR DPO AE 092131903 U.S. DEPARTMENT OF HOMELAND SECURITY LAW ENFORCEMENT 500 27-AUG-15 NaN NaN NaN SA17A 1029457 SA17.813360 P2016 NaN
C00458844 P60006723 Rubio, Marco HEFFERNAN, MICHAEL APO AE 090960009 INFORMATION REQUESTED PER BEST EFFORTS INFORMATION REQUESTED PER BEST EFFORTS 210 27-JUN-15 NaN NaN NaN SA17A 1029436 SA17.796904 P2016 NaN
上面的區塊用 import pandas as pd 這個語句導入了 Pandas 庫,然后用 read_csv() 這個函數把 political_donations.csv 這個文件讀入了變量 donations 中。變量 donations 現在就是一個 Pandas DataFrame。Pandas DataFrame 可以被看做是加強版的矩陣,它自帶數據分析函數,并且允許不同的列包含不同的數據類型。
可以通過變量 donations 的 shape 屬性來打印它多少行多少列。每個區塊的最后一行語句或變量都會自動顯示,這個功能超贊!下一個區塊用了 DataFrames 的 head() 函數打印出了變量 donations 的頭兩行,這樣就能看里面的數據了。
如想更深入地了解 Pandas 請參閱作者提供的 課程。
每個候選人收到的捐款總額
使用Pandas 中的 groupby() 函數能計算出每個候選人的整體統計數據。根據變量 cand_nm(候選人姓名)來把變量 donations 分成不同的子集就可以針對每個候選人分別統計數據。首先要算的是捐款總額。把候選人的 contb_receipt_amount 這一列加起來就可以得到收到的捐款總額了。
In [14]:
Python
1
donations.groupby(“cand_nm”).sum().sort(“contb_receipt_amt”)
Out[14]:
contb_receipt_amt file_num
cand_nm
Pataki, George E. 365090.98 234695430
Webb, James Henry Jr. 398717.25 709419893
Lessig, Lawrence 621494.50 1378488449
Santorum, Richard J. 781401.03 822086638
Trump, Donald J. 1009730.97 2357347570
Jindal, Bobby 1013918.12 584896776
Perry, James R. (Rick) 1120362.59 925732125
Huckabee, Mike 1895549.15 2700810255
O’Malley, Martin Joseph 2921991.65 2664148850
Graham, Lindsey O. 2932402.63 3131180533
Kasich, John R. 3734242.12 2669944682
Christie, Christopher J. 3976329.13 2421473376
Paul, Rand 4376828.14 16056604577
Fiorina, Carly 4505707.06 12599637777
Walker, Scott 4654810.30 5636746962
Sanders, Bernard 9018526.00 71139864714
Rubio, Marco 10746283.24 22730139555
Carson, Benjamin S. 11746359.74 75613624360
Cruz, Rafael Edward ‘Ted’ 17008622.17 69375616591
Bush, Jeb 23243472.85 14946097673
Clinton, Hillary Rodham 61726374.09 86560202290
上面的代碼首先用donations.groupby(“cand_nm”) 根據cand_nm 把donations 分成了不同的組。這個語句返回的是 GroupBy 對象,GroupBy 類型自帶一些專門用來整合數據的函數。其中就包含sum() 函數,在這個問題中可以用來計算每組中每一列中數據的和。
Pandas 在讀取數據的時候就會自動識別每一列的數據類型,在進行求和時只會針對數字類型的列來操作。這樣就得到了一個包含每個候選人contb_receipt_amt列中所有數字之和及file_num 列中所有數字之和的 DataFrame。最后使用 DataFrames 中的 sort() 函數將contb_receipt_amt 的和從小到大排序。這樣就得到了每個候選人收到的捐款總額。
將捐款總額可視化
Python 中最主要的可視化包就是 matplotlib,可以用它來畫圖。Jupyter notebook 能夠在瀏覽器中直接渲染 matplotlib 的圖表。這個功能需要通過激活 matplotlib 的 inline 模式來開啟。可以利用 Jupyter magics 中的命令來激活它就能直接在 notebook 中看圖表了。
Magics 就是以 % 或者 %% 開頭的、能改變 Jupyter notebook 本身的命令。它們是為了讓能夠通過命令行改變 Jupyter 的設置,同時盡量不與 Python 代碼混淆而存在的。要想在瀏覽器里直接看 matplotlib 的圖表,需要在代碼區塊里運行 %matplotlib inline。更多關于用 Jupyter 畫圖的內容可以 在此 閱讀。
用下面的代碼來導入 matplotlib 庫并且開啟 inline 模式:
In [15]:
Python
1
2
3
import matplotlib.pyplot as plt
%matplotlib inline
Pandas 中的 DataFrames 自帶對可視化的支持,調用 plot() 函數就可以生成 matplotlib圖表。這么用一般會比調用 matplotlib 更方便快捷。先給之前的 DataFrame 賦值給一個變量 total_donations,再利用 indexing 來選擇 DataFrame 中的一列: contb_receipt_amt。這樣就生成了一個 Pandas 中的 Series 類型的變量。
Pandas 中的 Series 和 DataFrames 包含的函數都差不多,但是 Series 只能存一維數據,比如單一行或者單一列。調用 Series 的 plot() 函數就生成了一個顯示每個候選人收到的捐款總額的柱狀圖。
In [16]:
Python
1
total_donations = donations.groupby(“cand_nm”).sum().sort(“contb_receipt_amt”)
In [20]:
Python
1
total_donations[“contb_receipt_amt”].plot(kind=”bar”)
Out[20]:
1
總結
以上是生活随笔為你收集整理的Python 数据科学入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP源代码如何压缩?
- 下一篇: sum of two integers