這一節我想對使用 Python 和 Pandas 的數據分析做一些擴展. 假設我們是億萬富翁, 我們會想要多元化地進行投資, 比如股票, 分紅, 金融市場等, 那么現在我們要聚焦房地產市場, 做一些這方面的調研. 首先, 決定房價的因素有哪些呢? 經濟, 利率和人口特征.這些是影響放假的主要因素. 當然還有很多細節, 比如房子的排水系統, 屋頂, 地板等等. 但是, 首先我們還是從宏觀的角度來做個大體的分析.
第一步, 就是要收集數據. Quandl 仍然是一個很好的起點, 但是這次我們要自己手動獲取數據. 我們想要拉取 50 個州的房價. 首先, 你需要創建一個賬號, 然后去我的賬號頁面, 找到自己的 API Key.
第二步, 下載 Quandl 模塊. 事實上, 我們根本不需要使用這個模塊來請求數據, 但是這個模塊實在太小了, 所以, 下載一下也無妨吧. 打開終端, 通過 pip 下載即可.
接下來, 就要開始正式拉取數據了, 新建一個文件, 並執行以下代碼:
import Quandl df = quandl.get("FMAC/HPI_TX", authtoken="HK1FqyWqrmUwLCYnWcHa") print(df.tail())
輸出:
NSA Value SA Value
Date
2018-08-31 201.663812 199.167443
2018-09-30 201.583316 199.689743
2018-10-31 200.614876 199.715965
2018-11-30 199.709925 199.856508
2018-12-31 198.954672 199.939942
通過以上代碼, 我們就得到了德克薩斯州房價清單. 大家可能看到, 我這里是用的 tail()函數, 其實我開始是用 head(), 但是發現打印出來的是 1975 年的數據. 其中:
NSA: Not Seasonally Adjusted 非季節性調整
SA: Seasonally Adjusted 季節性調整
那我們的目標是獲取美國50個州的房價, 我們需要每個都這樣手動獲取嗎? 不, 現在我們來分析一下 "FMAC/HPI_TX", 我們可以很容易地將其分解:
FMAC = Freddie Mac
HPI = House Price Index
TX 是 Texas 的簡寫
那現在我們大膽假設一下, 所有的接口都是可以通過這種形式請求的. 所以我們現在只需要一份美國所有州的簡寫清單.
https://simple.wikipedia.org/wiki/List_of_U.S._states
事實上, 我們有很多種方式來獲取數據, 但是因為這是一個 Pandas 教程, 所以能用 Pandas 的, 我們都盡量用 Pandas. 這里因為是要讀取 html 文件, 所以我們應該需要用到 Pandas 的 read_html()函數.
fiddy_states = pd.read_html('https://simple.wikipedia.org/wiki/List_of_U.S._states') print(fiddy_states)
這里會輸出很多信息, 遠遠多余我們在這里需要用到的, 但是, 大家可以有個大概的概念. 而且我們知道其中哪些信息是我們需要的, 具體在那一列. 再來試一下這樣輸出的結果:
print(fiddy_states[0])
輸出:
0 1 2 3 4 5 6 7 8 9 10 11 12
0 Name &postal abbreviation[1] Cities Established Population[upper-alpha 1][2] Total area[3] Land area[3] Water area[3] Numberof Reps. NaN NaN NaN NaN NaN
1 Capital Largest[4] mi2 km2 mi2 km2 mi2 km2 NaN NaN NaN NaN NaN
2 Alabama AL Montgomery Birmingham Dec 14, 1819 4874747 52420 135767 50645.0 131171.0 1775.0 4597.0 7.0
3 Alaska AK Juneau Anchorage Jan 3, 1959 739795 665384 1723337 570641.0 1477953.0 94743.0 245384.0 1.0
4 Arizona AZ Phoenix Feb 14, 1912 7016270 113990 295234 113594 294207.0 396.0 1026.0 9.0 NaN
5 Arkansas AR Little Rock Jun 15, 1836 3004279 53179 137732 52035 134771.0 1143.0 2961.0 4.0 NaN
6 California CA Sacramento Los Angeles Sep 9, 1850 39536653 163695 423967 155779.0 403466.0 7916.0 20501.0 53.0
7 Colorado CO Denver Aug 1, 1876 5607154 104094 269601 103642 268431.0 452.0 1170.0 7.0 NaN
8 Connecticut CT Hartford Bridgeport Jan 9, 1788 3588184 5543 14357 4842.0 12542.0 701.0 1816.0 5.0
9 Delaware DE Dover Wilmington Dec 7, 1787 961939 2489 6446 1949.0 5047.0 540.0 1399.0 1.0
10 Florida FL Tallahassee Jacksonville Mar 3, 1845 20984400 65758 170312 53625.0 138887.0 12133.0 31424.0 27.0
11 Georgia GA Atlanta Jan 2, 1788 10429379 59425 153910 57513 148959.0 1912.0 4951.0 14.0 NaN
12 Hawaii HI Honolulu Aug 21, 1959 1427538 10932 28313 6423 16635.0 4509.0 11678.0 2.0 NaN
13 Idaho ID Boise Jul 3, 1890 1716943 83569 216443 82643 214045.0 926.0 2398.0 2.0 NaN
14 Illinois IL Springfield Chicago Dec 3, 1818 12802023 57914 149995 55519.0 143793.0 2395.0 6202.0 18.0
15 Indiana IN Indianapolis Dec 11, 1816 6666818 36420 94326 35826 92789.0 593.0 1537.0 9.0 NaN
16 Iowa IA Des Moines Dec 28, 1846 3145711 56273 145746 55857 144669.0 416.0 1077.0 4.0 NaN
17 Kansas KS Topeka Wichita Jan 29, 1861 2913123 82278 213100 81759.0 211754.0 520.0 1346.0 4.0
18 Kentucky[upper-alpha 2] KY Frankfort Louisville Jun 1, 1792 4454189 40408 104656 39486.0 102269.0 921.0 2387.0 6.0
19 Louisiana LA Baton Rouge New Orleans Apr 30, 1812 4684333 52378 135659 43204.0 111898.0 9174.0 23761.0 6.0
20 Maine ME Augusta Portland Mar 15, 1820 1335907 35380 91633 30843.0 79883.0 4537.0 11750.0 2.0
21 Maryland MD Annapolis Baltimore Apr 28, 1788 6052177 12406 32131 9707.0 25142.0 2699.0 6990.0 8.0
22 Massachusetts[upper-alpha 2] MA Boston Feb 6, 1788 6859819 10554 27336 7800 20202.0 2754.0 7134.0 9.0 NaN
23 Michigan MI Lansing Detroit Jan 26, 1837 9962311 96714 250487 56539.0 146435.0 40175.0 104052.0 14.0
24 Minnesota MN St. Paul Minneapolis May 11, 1858 5576606 86936 225163 79627.0 206232.0 7309.0 18930.0 8.0
25 Mississippi MS Jackson Dec 10, 1817 2984100 48432 125438 46923 121531.0 1508.0 3907.0 4.0 NaN
26 Missouri MO Jefferson City Kansas City Aug 10, 1821 6113532 69707 180540 68742.0 178040.0 965.0 2501.0 8.0
27 Montana MT Helena Billings Nov 8, 1889 1050493 147040 380831 145546.0 376962.0 1494.0 3869.0 1.0
28 Nebraska NE Lincoln Omaha Mar 1, 1867 1920076 77348 200330 76824.0 198974.0 524.0 1356.0 3.0
29 Nevada NV Carson City Las Vegas Oct 31, 1864 2998039 110572 286380 109781.0 284332.0 791.0 2048.0 4.0
30 New Hampshire NH Concord Manchester Jun 21, 1788 1342795 9349 24214 8953.0 23187.0 397.0 1027.0 2.0
31 New Jersey NJ Trenton Newark Dec 18, 1787 9005644 8723 22591 7354.0 19047.0 1368.0 3544.0 12.0
32 New Mexico NM Santa Fe Albuquerque Jan 6, 1912 2088070 121590 314917 121298.0 314161.0 292.0 757.0 3.0
33 New York NY Albany New York Jul 26, 1788 19849399 54555 141297 47126.0 122057.0 7429.0 19240.0 27.0
34 North Carolina NC Raleigh Charlotte Nov 21, 1789 10273419 53819 139391 48618.0 125920.0 5201.0 13471.0 13.0
35 North Dakota ND Bismarck Fargo Nov 2, 1889 755393 70698 183108 69001.0 178711.0 1698.0 4397.0 1.0
36 Ohio OH Columbus Mar 1, 1803 11658609 44826 116098 40861 105829.0 3965.0 10269.0 16.0 NaN
37 Oklahoma OK Oklahoma City Nov 16, 1907 3930864 69899 181037 68595 177660.0 1304.0 3377.0 5.0 NaN
38 Oregon OR Salem Portland Feb 14, 1859 4142776 98379 254799 95988.0 248608.0 2391.0 6191.0 5.0
39 Pennsylvania[upper-alpha 2] PA Harrisburg Philadelphia Dec 12, 1787 12805537 46054 119280 44743.0 115883.0 1312.0 3397.0 18.0
40 Rhode Island[upper-alpha 3] RI Providence May 29, 1790 1059639 1545 4001 1034 2678.0 511.0 1324.0 2.0 NaN
41 South Carolina SC Columbia Charleston May 23, 1788 5024369 32020 82933 30061.0 77857.0 1960.0 5076.0 7.0
42 South Dakota SD Pierre Sioux Falls Nov 2, 1889 869666 77116 199729 75811.0 196350.0 1305.0 3379.0 1.0
43 Tennessee TN Nashville Jun 1, 1796 6715984 42144 109153 41235 106798.0 909.0 2355.0 9.0 NaN
44 Texas TX Austin Houston Dec 29, 1845 28304596 268596 695662 261232.0 676587.0 7365.0 19075.0 36.0
45 Utah UT Salt Lake City Jan 4, 1896 3101833 84897 219882 82170 212818.0 2727.0 7064.0 4.0 NaN
46 Vermont VT Montpelier Burlington Mar 4, 1791 623657 9616 24906 9217.0 23871.0 400.0 1035.0 1.0
47 Virginia[upper-alpha 2] VA Richmond Virginia Beach Jun 25, 1788 8470020 42775 110787 39490.0 102279.0 3285.0 8508.0 11.0
48 Washington WA Olympia Seattle Nov 11, 1889 7405743 71298 184661 66456.0 172119.0 4842.0 12542.0 10.0
49 West Virginia WV Charleston Jun 20, 1863 1815857 24230 62756 24038 62259.0 192.0 497.0 3.0 NaN
50 Wisconsin WI Madison Milwaukee May 29, 1848 5795483 65496 169635 54158.0 140268.0 11339.0 29367.0 8.0
51 Wyoming WY Cheyenne Jul 10, 1890 579315 97813 253335 97093 251470.0 720.0 1864.0 1.0 NaN
從上面的輸出, 可以看到, 我們想要的是列 1 的值. 我們的目標是遍歷 fiddy_states[0] 的列 1. 記住, 現在 fiddy_states 是一個包含了很多個 dataframe 的 list(目前理解的就是一維數組), 而 fiddy_states[0] 就是第一個 dataframe. 那我們想要的數據應該可以通過 fiddy_states[0][1] 來獲取. 0 是一維數組的索引, 返回一個 dataframe, 1 是 dataframe 的列名.
接下來, 我們發現列1的第0行和第1行都不是我們想要的值, 所以我們需要在遍歷的時候將它們屏蔽掉, 也就是說我們可以從第2行開始遍歷:
for abbv in fiddy_states[0][1][2:]: print(abbv)
輸出:
AL
AK
AZ
AR
CA
CO
CT
DE
FL
GA
HI
ID
IL
IN
IA
KS
KY
LA
ME
MD
MA
MI
MN
MS
MO
MT
NE
NV
NH
NJ
NM
NY
NC
ND
OH
OK
OR
PA
RI
SC
SD
TN
TX
UT
VT
VA
WA
WV
WI
WY
很好, 現在我們已經循環輸出了所有的州的簡稱. 希望大家到這里還記得我們為什么要獲取所有州的簡稱, 因為我們想要通過統一的形式來獲取所有州的房價:
for abbv in fiddy_states[0][1][2:]: #print(abbv) print("FMAC/HPI_"+str(abbv))
輸出:
FMAC/HPI_AL
FMAC/HPI_AK
FMAC/HPI_AZ
FMAC/HPI_AR
FMAC/HPI_CA
FMAC/HPI_CO
FMAC/HPI_CT
FMAC/HPI_DE
FMAC/HPI_FL
FMAC/HPI_GA
FMAC/HPI_HI
FMAC/HPI_ID
FMAC/HPI_IL
FMAC/HPI_IN
FMAC/HPI_IA
FMAC/HPI_KS
FMAC/HPI_KY
FMAC/HPI_LA
FMAC/HPI_ME
FMAC/HPI_MD
FMAC/HPI_MA
FMAC/HPI_MI
FMAC/HPI_MN
FMAC/HPI_MS
FMAC/HPI_MO
FMAC/HPI_MT
FMAC/HPI_NE
FMAC/HPI_NV
FMAC/HPI_NH
FMAC/HPI_NJ
FMAC/HPI_NM
FMAC/HPI_NY
FMAC/HPI_NC
FMAC/HPI_ND
FMAC/HPI_OH
FMAC/HPI_OK
FMAC/HPI_OR
FMAC/HPI_PA
FMAC/HPI_RI
FMAC/HPI_SC
FMAC/HPI_SD
FMAC/HPI_TN
FMAC/HPI_TX
FMAC/HPI_UT
FMAC/HPI_VT
FMAC/HPI_VA
FMAC/HPI_WA
FMAC/HPI_WV
FMAC/HPI_WI
FMAC/HPI_WY
非常好, 我們現在已經生成了每個州的單獨的取數標簽, 我們可以開始去拉取數據了. 但是當我們拿到數據之后, 要怎么處理它們呢? 難道要分別處理這51份數據嗎? 聽起來就是一件非常繁瑣的工作, 因此我們需要想辦法把它們合並. Pandas 就提供了很多合並數據的方法, 我們將在下一節詳細講解.
后面會持續更新, 有任何問題或者錯誤, 歡迎留言, 希望和大家交流學習.