• Pandas数据分析31——全国城市房价分析及样式可视化


    参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


    本节继续pandas数据分析案例。本次是爬虫房价,并且做到可视化分析。

    还是先导入包

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. plt.rcParams ['font.sans-serif'] ='SimHei' #显示中文
    5. plt.rcParams ['axes.unicode_minus']=False #显示负号

    爬虫获取房价

    1. import requests
    2. s = requests.Session()
    3. # 访问小区页面
    4. xq = s.get('https://bj.lianjia.com/xiaoqu/1111027382589/')
    5. # 查看页面源码
    6. xq.text
    7. # 找到价格位置附近的源码为:
    8. # 95137
    9. # 切分与解析
    10. xq.text.split('xiaoquUnitPrice">')[1].split('')[0]
    '111440'
    

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

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

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

    1. # 小区列表
    2. xqs = [1111027377595, 1111027382589,
    3. 1111027378611, 1111027374569,
    4. 1111027378069, 1111027374228,
    5. 116964627385853]
    6. # 构造数据
    7. df = pd.DataFrame(xqs, columns=['小区'])
    8. # 爬取小区名
    9. df['小区名'] = df.小区.apply(lambda x: pa_name(x))
    10. # 爬取房价
    11. df['房价'] = df.小区.apply(lambda x: pa_price(x))
    12. # 查看结果
    13. df

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

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


    全国城市房价分析及样式可视化

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

    (先先去复制)

    1. dfr = pd.read_clipboard()
    2. dfr

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

    1. df = (
    2. # 去掉千分位符并转为整型
    3. dfr.assign(平均单价=dfr['平均单价(元/㎡)'].str.replace(',','').astype(int))
    4. .assign(同比=dfr.同比.str[:-1].astype(float)) # 去百分号并转为浮点型
    5. .assign(环比=dfr.环比.str[:-1].astype(float)) # 去百分号并转为浮点型
    6. .loc[:,['城市名称','平均单价','同比','环比']] # 重命名列
    7. )
    8. df.head()

     #首先看一下各城市的均价差异,数据顺序无须再调整,代码执行效果如图

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

     #各城市平均房价同比与环比情况

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

     #将同比与环比的极值用样式标注,

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

     #绘制各城市平均单价条形图,

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

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

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

     这里数据量比较少,可以找更多城市的数据在进行分析。

  • 相关阅读:
    pytorch深度学习实战lesson21
    Spring6学习技术|IoC|基于注解管理bean
    单变量微积分重点(2)
    SpringBoot学习(一)---初识SpringBoot
    【ESP32蓝牙通信】gatt_client 和 gatt_server 调试
    云原生 · Kubernetes - k8s集群搭建(kubeadm)(持续收录报错中)
    Redis如何实现持久化?详细讲解AOF触发机制及其优缺点,带你快速掌握AOF
    项目笔记-瑞吉外卖(全)
    servlet笔记
    Redis入门与实践(附项目真实案例代码)
  • 原文地址:https://blog.csdn.net/weixin_46277779/article/details/126390652