基于 Python 和 Pandas 的数据分析(4) --- 建立数据集

时间:2021-09-29 04:53:16

这一节我想对使用 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 就提供了很多合并数据的方法, 我们将在下一节详细讲解.

后面会持续更新, 有任何问题或者错误, 欢迎留言, 希望和大家交流学习.