看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
中国主要城市的房价可以从 https://www.creprice.cn/rank/index.html 获取。该网页中会显示上一个月的房价排行情况,先复制前 20 个城市的数据,然后使用 pd.read_clipboard()读取。我们来分析一下该月的数据(下例中用的是 2020 年 10 月数据)。由于图形中文可能会显示乱码,可参考matplotlib 图形显示中文 中的步骤进行设置以支持中文。
# https://www.creprice.cn/rank/index.html
# 2020年10月数据
'''
序号 城市名称 平均单价(元/㎡) 环比 同比
1 深圳 78,722 +2.61% +20.44%
2 北京 63,554 -0.82% -1.2%
3 上海 58,831 +0.4% +9.7%
4 厦门 48,169 -0.61% +9.52%
5 广州 38,351 -1.64% +13.79%
6 三亚 35,981 -0.19% -3.88%
7 南京 33,301 +1.59% +8.02%
8 杭州 32,181 +3.11% +4.61%
9 天津 26,397 +2.34% +3.5%
10 福州 25,665 -1.05% -4.1%
11 宁波 24,306 -1.43% +13.13%
12 珠海 23,293 -1.42% -0.49%
13 温州 23,009 +3.01% +7.01%
14 苏州 22,540 -1.35% -2.8%
15 青岛 21,490 -1.7% +1.95%
16 东莞 21,391 +6% +34.44%
17 丽水 19,775 +2.3% -1.78%
18 武汉 19,021 -0.18% +4.51%
19 成都 17,443 -2.41% +11.84%
20 无锡 17,131 -0.27% +12.5%
'''
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8.0, 5.0) # 固定显示大小
plt.rcParams['font.family'] = ['sans-serif'] # 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 显示负号
dfr = pd.read_clipboard()
# 取到源数据
dfr.head()
'''
序号 城市名称 平均单价(元/㎡) 环比 同比
0 1 深圳 78,722 +2.61% +20.44%
1 2 北京 63,554 -0.82% -1.2%
2 3 上海 58,831 +0.4% +9.7%
3 4 厦门 48,169 -0.61% +9.52%
4 5 广州 38,351 -1.64% +13.79%
'''
查看数据类型:
dfr.dtypes
'''
序号 int64
城市名称 object
平均单价(元/㎡) object
环比 object
同比 object
dtype: object
'''
数据都是 object 类型,需要对数据进行提取和类型转换:
df = (
# 去掉千分位符并转为整型
dfr.assign(平均单价=dfr['平均单价(元/㎡)'].str.replace(',','').astype(int))
.assign(同比=dfr.同比.str[:-1].astype(float)) # 去百分号并转为浮点型
.assign(环比=dfr.环比.str[:-1].astype(float)) # 去百分号并转为浮点型
.loc[:,['城市名称','平均单价','同比','环比']] # 重命名列
)
df.head()
'''
城市名称 平均单价 同比 环比
0 深圳 78722 20.44 2.61
1 北京 63554 -1.20 -0.82
2 上海 58831 9.70 0.40
3 厦门 48169 9.52 -0.61
4 广州 38351 13.79 -1.64
'''
接下来就可以对整理好的数据进行分析了。首先看一下各城市的均价差异,数据顺序无须再调整,代码执行效果如图1所示。
(
df.set_index('城市名称')
.平均单价
.plot
.bar()
)
图1 各城市平均房价
各城市平均房价同比与环比情况如图 2 所示。
(
df.set_index('城市名称')
.loc[:, '同比':'环比']
.plot
.bar()
)
图 2 各城市平均房价同比和环比
将同比与环比的极值用样式标注,可见东莞异常突出,房价同比、环比均大幅上升,如图 3 所示。
(
df.style
.highlight_max(color='red', subset=['同比', '环比'])
.highlight_min(subset=['同比', '环比'])
.format({'平均单价':"{:,.0f}"})
.format({'同比':"{:2}%", '环比':"{:2}%"})
)
图 3 各城市平均房价变化样式图
绘制各城市平均单价条形图,如图 4 所示。
# 条形图
(
df.style
.bar(subset=['平均单价'], color='yellow')
)
图 4 各城市平均单价样式图
将数据样式进行综合可视化:将平均单价背景色设为渐变,并指定色系 BuGn ;同比、环比条形图使用不同色系,且以 0 为中点,体现正负;为比值加百分号。最终效果如图 5 所示。
(
df.style
.background_gradient(subset=['平均单价'], cmap='BuGn')
.format({'同比':"{:2}%", '环比':"{:2}%"})
.bar(subset=['同比'],
color=['#ffe4e4','#bbf9ce'], # 上涨、下降的颜色
vmin=0, vmax=15, # 范围定为以0为基准的上下15
align='zero'
)
.bar(subset=['环比'],
color=['red','green'], # 上涨、下降的颜色
vmin=0, vmax=11, # 范围定为以0为基准的上下11
align='zero'
)
)
图 5 各城市平均房价综合样式图
(完)
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.3.4 小节。
更新时间:2024-08-18 16:14:01 标签:pandas python 房价