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

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


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

还是先导入包

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

爬虫获取房价

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

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

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

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

# 小区列表
xqs = [1111027377595, 1111027382589,
       1111027378611, 1111027374569,
       1111027378069, 1111027374228,
       116964627385853]

# 构造数据
df = pd.DataFrame(xqs, columns=['小区'])

# 爬取小区名
df['小区名'] = df.小区.apply(lambda x: pa_name(x))
# 爬取房价
df['房价'] = df.小区.apply(lambda x: pa_price(x))

# 查看结果
df

Pandas数据分析31——全国城市房价分析及样式可视化_第1张图片

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

# 爬虫类
class PaChong(object):
    def __init__(self, x):
        self.s = requests.session()
        self.xq = self.s.get(f'https://bj.lianjia.com/xiaoqu/{x}/')
        self.name = self.xq.text.split('detailTitle">')[1].split('')[0]
        self.price = self.xq.text.split('xiaoquUnitPrice">')[1].split('')[0]

# 爬取数据
(
    df
    .assign(小区名=df.小区.apply(lambda x: PaChong(x).name))
    .assign(房价=df.小区.apply(lambda x: PaChong(x).price))
)

Pandas数据分析31——全国城市房价分析及样式可视化_第2张图片

 


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

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

(先先去复制)

dfr = pd.read_clipboard()
dfr

Pandas数据分析31——全国城市房价分析及样式可视化_第3张图片

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

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

Pandas数据分析31——全国城市房价分析及样式可视化_第4张图片

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


(
    df.set_index('城市名称')
    .平均单价
    .plot
    .bar()
)

Pandas数据分析31——全国城市房价分析及样式可视化_第5张图片

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

(
    df.set_index('城市名称')
    .loc[:, '同比':'环比']
    .plot
    .bar()
)

Pandas数据分析31——全国城市房价分析及样式可视化_第6张图片

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

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

Pandas数据分析31——全国城市房价分析及样式可视化_第7张图片

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

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

Pandas数据分析31——全国城市房价分析及样式可视化_第8张图片

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


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

Pandas数据分析31——全国城市房价分析及样式可视化_第9张图片

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

你可能感兴趣的:(pandas数据分析,pandas,数据分析,python,数据挖掘,numpy)