手把手教你用Pandas分析全国城市房价

开发 后端
Pandas在配合做网络数据采集爬虫时,也能发挥其优势,可承担数据调用、数据存储的工作。将数据存入DataFrame后,可直接进入下一步分析。本例以获取某房产网站中房价为目标,来体验一下Pandas的便捷之处。

 [[414927]]

本文转载自微信公众号「数仓宝贝库」,作者李庆辉。转载本文请联系数仓宝贝库公众号。

Pandas在配合做网络数据采集爬虫时,也能发挥其优势,可承担数据调用、数据存储的工作。将数据存入DataFrame后,可直接进入下一步分析。本例以获取某房产网站中房价为目标,来体验一下Pandas的便捷之处。

首先利用requests(需要安装)库获取单个小区的平均价格:

  1. import requests # 安装:pip install requests 
  2.  
  3. # 创建一个Session 
  4.  
  5. s = requests.Session() 
  6.  
  7. # 访问小区页面 
  8.  
  9. xq = s.get('https://bj.lianjia.com/xiaoqu/1111027382589/'
  10.  
  11. # 查看页面源码 
  12.  
  13. xq.text 
  14.  
  15. # 找到价格位置附近的源码为: 
  16.  
  17. # <span class="xiaoquUnitPrice">95137</span> 
  18.  
  19. # 切分与解析 
  20.  
  21. xq.text.split('xiaoquUnitPrice">')[1].split('</span>')[0] 
  22.  
  23. '93754' 

最终得到这个小区的平均房价。这里使用了将目标信息两边的信息进行切片、形成列表再读取的方法。也可以用第三方库Beautiful Soup 4来解析。Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过解析源码来方便地获取指定信息。

我们构建获取小区名称和平均房价的函数:

  1. # 获取小区名称的函数 
  2.  
  3. def pa_name(x): 
  4.  
  5.     xq = s.get(f'https://bj.lianjia.com/xiaoqu/{x}/'
  6.  
  7.     name = xq.text.split('detailTitle">')[1].split('</h1>')[0] 
  8.  
  9.     return name 
  10.  
  11.  
  12. # 获取平均房价的函数 
  13.  
  14. def pa_price(x): 
  15.  
  16.     xq = s.get(f'https://bj.lianjia.com/xiaoqu/{x}/'
  17.  
  18.     price = xq.text.split('xiaoquUnitPrice">')[1].split('</span>')[0] 
  19.  
  20.     return price 

接下来利用Pandas执行爬虫获取信息:

  1. # 小区列表 
  2.  
  3. xqs = [1111027377595, 1111027382589, 
  4.  
  5.        1111027378611, 1111027374569, 
  6.  
  7.        1111027378069, 1111027374228, 
  8.  
  9.        116964627385853] 
  10.  
  11.  
  12. # 构造数据 
  13.  
  14. df = pd.DataFrame(xqs, columns=['小区']) 
  15.  
  16.  
  17. # 爬取小区名 
  18.  
  19. df['小区名'] = df.小区.apply(lambda x: pa_name(x)) 
  20.  
  21. # 爬取房价 
  22.  
  23. df['房价'] = df.小区.apply(lambda x: pa_price(x)) 
  24.  
  25.  
  26. # 查看结果 
  27.  
  28. df 
  29.  
  30. ''
  31.  
  32.                 小区      小区名      房价 
  33.  
  34. 0    1111027377595     瞰都国际   73361 
  35.  
  36. 1    1111027382589  棕榈泉国际公寓   93754 
  37.  
  38. 2    1111027378611     南十里居   56459 
  39.  
  40. 3    1111027374569     观湖国际   88661 
  41.  
  42. 4    1111027378069     丽水嘉园   76827 
  43.  
  44. 5    1111027374228  泛海国际碧海园   97061 
  45.  
  46. 6  116964627385853  东山condo  145965 
  47.  
  48. ''

可以先用Python的类改造函数,再用链式方法调用:

  1. # 爬虫类 
  2.  
  3. class PaChong(object): 
  4.  
  5.     def __init__(self, x): 
  6.  
  7.         self.s = requests.session() 
  8.  
  9.         self.xq = self.s.get(f'https://bj.lianjia.com/xiaoqu/{x}/'
  10.  
  11.         self.name = self.xq.text.split('detailTitle">')[1].split('</h1>')[0] 
  12.  
  13.         self.price = self.xq.text.split('xiaoquUnitPrice">')[1].split('</span>')[0] 
  14.  
  15.  
  16. # 爬取数据 
  17.  
  18.  
  19.     df 
  20.  
  21.     .assign(小区名=df.小区.apply(lambda x: PaChong(x).name)) 
  22.  
  23.     .assign(房价=df.小区.apply(lambda x: PaChong(x).price)) 
  24.  

以上网站可能会改版,代码不适用时需要调整爬虫代码。

02全国城市房价分析

中国主要城市的房价可以从https://www.creprice.cn/rank/index.html获取。该网页中会显示上一个月的房价排行情况,先复制前20个城市的数据,然后使用pd.read_clipboard()读取。我们来分析一下该月的数据(下例中用的是2020年10月数据)。

  1. import pandas as pd 
  2.  
  3. import matplotlib.pyplot as plt 
  4.  
  5. plt.rcParams['figure.figsize'] = (8.0, 5.0) # 固定显示大小 
  6.  
  7. plt.rcParams['font.family'] = ['sans-serif'] # 设置中文字体 
  8.  
  9. plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体 
  10.  
  11. plt.rcParams['axes.unicode_minus'] = False # 显示负号 
  12.  
  13. dfr = pd.read_clipboard() 
  14.  
  15.  
  16. # 取源数据 
  17.  
  18. dfr.head() 
  19.  
  20. ''
  21.  
  22.    序号 城市名称 平均单价(元/㎡)  环比 同比 
  23.  
  24. 0   1   深圳    78,722  +2.61%  +20.44% 
  25.  
  26. 1   2   北京    63,554  -0.82%    -1.2% 
  27.  
  28. 2   3   上海    58,831   +0.4%    +9.7% 
  29.  
  30. 3   4   厦门    48,169  -0.61%   +9.52% 
  31.  
  32. 4   5   广州    38,351  -1.64%  +13.79% 
  33.  
  34. ''

查看数据类型:

  1. dfr.dtypes 
  2.  
  3. ''
  4.  
  5. 序号            int64 
  6.  
  7. 城市名称         object 
  8.  
  9. 平均单价(元/㎡)    object 
  10.  
  11. 环比           object 
  12.  
  13. 同比           object 
  14.  
  15. dtype: object 
  16.  
  17. ''

数据都是object类型,需要对数据进行提取和类型转换:

  1. df = ( 
  2.  
  3.     # 去掉千分位符并转为整型 
  4.  
  5.     dfr.assign(平均单价=dfr['平均单价(元/㎡)'].str.replace(',','').astype(int)) 
  6.  
  7.     .assign(同比=dfr.同比.str[:-1].astype(float)) # 去百分号并转为浮点型 
  8.  
  9.     .assign(环比=dfr.环比.str[:-1].astype(float)) # 去百分号并转为浮点型 
  10.  
  11.     .loc[:,['城市名称','平均单价','同比','环比']] # 重命名列 
  12.  
  13.  
  14.  
  15.  
  16. df.head() 
  17.  
  18. ''
  19.  
  20.   城市名称  平均单价 同比  环比 
  21.  
  22. 0   深圳  78722  20.44  2.61 
  23.  
  24. 1   北京  63554  -1.20 -0.82 
  25.  
  26. 2   上海  58831   9.70  0.40 
  27.  
  28. 3   厦门  48169   9.52 -0.61 
  29.  
  30. 4   广州  38351  13.79 -1.64 
  31.  
  32. ''

接下来就可以对整理好的数据进行分析了。首先看一下各城市的均价差异,数据顺序无须再调整,代码执行效果如图1所示。

  1.  
  2.     df.set_index('城市名称'
  3.  
  4.     .平均单价 
  5.  
  6.     .plot 
  7.  
  8.     .bar() 
  9.  

图1 各城市平均房价

各城市平均房价同比与环比情况如图2所示。

  1.  
  2.     df.set_index('城市名称'
  3.  
  4.     .loc[:, '同比':'环比'
  5.  
  6.     .plot 
  7.  
  8.     .bar() 
  9.  

图2 各城市平均房价同比和环比

将同比与环比的极值用样式标注,可见东莞异常突出,房价同比、环比均大幅上升,如图3所示。

  1.  
  2.     df.style 
  3.  
  4.     .highlight_max(color='red', subset=['同比''环比']) 
  5.  
  6.     .highlight_min(subset=['同比''环比']) 
  7.  
  8.     .format({'平均单价':"{:,.0f}"}) 
  9.  
  10.     .format({'同比':"{:2}%"'环比':"{:2}%"}) 
  11.  

图3 各城市平均房价变化样式图

绘制各城市平均单价条形图,如图4所示。

  1. # 条形图 
  2.  
  3.  
  4.     df.style 
  5.  
  6.     .bar(subset=['平均单价'], color='yellow'
  7.  

图4 各城市平均单价样式图

将数据样式进行综合可视化:将平均单价背景色设为渐变,并指定色系BuGn;同比、环比条形图使用不同色系,且以0为中点,体现正负;为比值加百分号。最终效果如图5所示。

  1.  
  2.     df.style 
  3.  
  4.     .background_gradient(subset=['平均单价'], cmap='BuGn'
  5.  
  6.     .format({'同比':"{:2}%"'环比':"{:2}%"}) 
  7.  
  8.     .bar(subset=['同比'],  
  9.  
  10.         color=['#ffe4e4','#bbf9ce'], # 上涨、下降的颜色 
  11.  
  12.         vmin=0, vmax=15, # 范围定为以0为基准的上下15 
  13.  
  14.         align='zero' 
  15.  
  16.         ) 
  17.  
  18.     .bar(subset=['环比'],  
  19.  
  20.         color=['red','green'], # 上涨、下降的颜色 
  21.  
  22.         vmin=0, vmax=11, # 范围定为以0为基准的上下11 
  23.  
  24.         align='zero' 
  25.  
  26.         ) 
  27.  

图5 各城市平均房价综合样式图

本文摘编于《深入浅出Pandas:利用Python进行数据处理与分析》,经出版方授权发布。

作者:李庆辉,数据产品专家,某电商公司数据产品团队负责人,擅长通过数据治理、数据分析、数据化运营提升公司的数据应用水平。

 

责任编辑:武晓燕 来源: 数仓宝贝库
相关推荐

2021-02-06 14:55:05

大数据pandas数据分析

2022-04-01 20:29:26

Pandas数据存储

2021-08-09 13:31:25

PythonExcel代码

2022-10-19 14:30:59

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2022-08-04 10:39:23

Jenkins集成CD

2021-05-10 06:48:11

Python腾讯招聘

2021-01-08 10:32:24

Charts折线图数据可视化

2021-01-21 09:10:29

ECharts柱状图大数据

2022-04-24 10:33:56

大数据数据分析

2009-04-22 09:17:19

LINQSQL基础

2012-01-11 13:40:35

移动应用云服务

2021-02-02 13:31:35

Pycharm系统技巧Python

2020-03-08 22:06:16

Python数据IP

2021-12-11 20:20:19

Python算法线性

2017-10-27 10:29:35

人脸识别UbuntuPython

2021-06-05 23:51:21

ECharts气泡图散点图

2020-11-08 14:13:31

Python帕累托分析开发

2021-05-17 21:30:06

Python求均值中值
点赞
收藏

51CTO技术栈公众号