数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!

喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源存放在我的资源下载区啦!

数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作

目录

  • 数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作
    • 案例一:北京租房数据分析
      • 问题1:填充空值(如有,否则不处理);删除重复信息(如有,否则不处理)
      • 问题2: 更改列名:房屋类型厅室: 户型, 房屋类型精装修: 装修
      • 问题3: 删除 URL、房屋类型面积 列
      • 问题4: 区域 ‘列’ 分为三部分,请拆分成 ‘行政区域’、‘商圈’、‘小区’ 三个列
      • 问题5: 按要求格式化数据
      • 问题6:选择 '房源编号', '行政区', '商圈', '小区', '户型', '面积', '租金', '单价', '装修', '朝向', '楼层位置', '总楼层', '电梯', '车位', '用水', '用电', '燃气', '采暖', '经纪人' 列 组成新的 DataFrame 保存为lianjia_cleaned.csv
      • 问题7:画出 租金 的箱线图分布,采用 darkgrid 风格,采用boxenplot()函数
      • 问题8:画出 不同行政区域 租金 的箱线图
      • 问题9:画四个子图:分别按 行政区域、 商圈(前20)、户型(前10)、面积(自行分段)画出房源数量柱状图
      • 问题10:以 总楼层 为横坐标,画出 房源数量 柱状图
      • 问题11:房源特征绘图,画四幅子图
      • 问题12:仿照上面例子,对用水、用电、燃气、采暖 进行饼状图分析
      • 问题13:以 行政区域、商圈 两列 分组,汇聚一室的 房源数量 和 平均租金,并可视化

本次作业绘图可采用seaborn、matplotlib库或者pandas内置绘图功能

案例一:北京租房数据分析

# 加载模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # SimHei.ttf
plt.rcParams['axes.unicode_minus'] = False 
# 导入数据
df = pd.read_csv('data/lianjia.csv', encoding='gbk', index_col=False)
df.sample(1)
# 默认语言'gbk',另外要设置inex_col = False 默认原数据无行索引,不然会导致URL默认为行索引。
# header = False, 默认原数据无列索引。

在这里插入图片描述

# 查看数据总体信息,空值统计,查看重复数据信息

df.info()

在这里插入图片描述

df.isnull().sum()

在这里插入图片描述

df[df.duplicated()==True]

在这里插入图片描述

问题1:填充空值(如有,否则不处理);删除重复信息(如有,否则不处理)

# 没有空值,不处理

# 删除重复值
df.drop_duplicates(inplace=True)
df[df.duplicated()==True]

问题2: 更改列名:房屋类型厅室: 户型, 房屋类型精装修: 装修

df.rename(columns={'房屋类型厅室':'户型', '房屋类型精装修':'装修'}, inplace=True)

问题3: 删除 URL、房屋类型面积 列

df.drop(columns='URL', inplace=True)
df.drop(columns='房屋类型面积', inplace=True)

问题4: 区域 ‘列’ 分为三部分,请拆分成 ‘行政区域’、‘商圈’、‘小区’ 三个列

df['行政区域'] = df['区域'].apply(lambda x:x.split()[0])
df['商圈'] = df['区域'].apply(lambda x:x.split()[1])
df['小区'] = df['区域'].apply(lambda x:x.split()[2])
df

在这里插入图片描述

问题5: 按要求格式化数据

# 户型列 统一修改为 几室几厅几卫 格式
# 例如:‘房间’ 改为 ‘室’
# 1室1卫 改为 1室0厅1卫
df['户型'].replace('房间', '室', inplace=True)
df['户型'].replace(['1室1卫', '2室1卫', '3室1卫', '1室0卫', '2室2卫', '3室2卫', '1室2卫', '5室2卫', '4室2卫'], 
                 ['1室0厅1卫', '2室0厅1卫', '3室0厅1卫', '1室0厅0卫', '2室0厅2卫', '3室0厅2卫', '1室0厅2卫', '5室0厅2卫', '4室0厅2卫'], 
                inplace=True)

# 面积 列去掉单位,保留数字
df['面积'].apply(lambda x:x[:-1])

# 装修 列 数据格式修改
# 精装修 改为 精装
# '#' 改为 '简装'
df['装修'].replace('精装修', '精装', inplace=True)
df['装修'].replace('#', '简装', inplace=True)

# 楼层 列 拆分为 楼层位置、总楼层 两列
df['楼层位置'] = df['楼层'].apply(lambda x: x.split('/')[0])  
df['总楼层'] = df['楼层'].apply(lambda x: x.split('/')[1]).str[:-1]
df

在这里插入图片描述

问题6:选择 ‘房源编号’, ‘行政区’, ‘商圈’, ‘小区’, ‘户型’, ‘面积’, ‘租金’, ‘单价’, ‘装修’, ‘朝向’, ‘楼层位置’, ‘总楼层’, ‘电梯’, ‘车位’, ‘用水’, ‘用电’, ‘燃气’, ‘采暖’, ‘经纪人’ 列 组成新的 DataFrame 保存为lianjia_cleaned.csv

data_cleaned = df[['房源编号', '行政区域', '商圈', '小区', '户型', 
                   '面积', '租金', '押金', '装修', '朝向', 
                   '楼层位置', '总楼层', '电梯', '车位', '用水', 
                   '用电', '燃气', '采暖', '经纪人']]
data_cleaned = data_cleaned.reset_index(drop=True)  # 重设索引
data_cleaned.to_csv('lianjia_cleaned.csv') # 导出清洗后的数据到新的csv
df = pd.read_csv('lianjia_cleaned.csv', index_col=0)
df

在这里插入图片描述

问题7:画出 租金 的箱线图分布,采用 darkgrid 风格,采用boxenplot()函数

with sns.axes_style('darkgrid'):
    plt.figure(figsize=(6, 10))
    ax = plt.subplot()
    sns.boxenplot(y='租金', data=df)
    ax.set_ylabel('租金(元/月)', fontsize=15)
    ax.set_title('房源租金分布', fontsize=18)
    
# 从箱型分布看出,全市整租房源的租金主要分布在2500-5500元/套左右。

在这里插入图片描述

问题8:画出 不同行政区域 租金 的箱线图

plt.figure(figsize=(14, 10))

sns.boxenplot(x='行政区域', y='租金', data=df)

plt.show()

在这里插入图片描述

问题9:画四个子图:分别按 行政区域、 商圈(前20)、户型(前10)、面积(自行分段)画出房源数量柱状图

fig, axes = plt.subplots(2, 2, figsize=(20, 18)) # 绘制2*2多子图
fig.subplots_adjust(hspace=0.5, wspace=0.1) # 设置子图的间距

df_ = df.copy()
df_['面积'] = df_['面积'].map(lambda x:eval(x[:-1]))

area = df_['行政区域'].value_counts()
sns.barplot(x=area.index, y=area.values, palette='Blues_d', ax=axes[0, 0])
axes[0, 0].tick_params(labelsize=15) # 设置轴刻度文字大小,两个轴同时设置
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=35) # 设置轴刻度文字方向,旋转角度
axes[0, 0].set_xlabel('行政区域', fontsize=18)
axes[0, 0].set_ylabel('房源数量', fontsize=18)

trade_top20 = df_['商圈'].value_counts()[:20]
sns.barplot(x=trade_top20.index, y=trade_top20.values, palette='Blues_d', ax=axes[0, 1])
axes[0, 1].tick_params(labelsize=15) 
axes[0, 1].set_xticklabels(axes[0, 1].get_xticklabels(), rotation=70) 
axes[0, 1].set_xlabel('Top20商圈', fontsize=18)
axes[0, 1].set_ylabel('')

type_top10 = df_['户型'].value_counts()[:10]
sns.barplot(x=type_top10.index, y=type_top10.values, palette='Blues_d', ax=axes[1, 0])
axes[1, 0].tick_params(labelsize=15)
axes[1, 0].set_xticklabels(axes[1, 0].get_xticklabels(), rotation=30)
axes[1, 0].set_xlabel('Top10户型', fontsize=18)
axes[1, 0].set_ylabel('房源数量', fontsize=18)

# 划分面积区间。
bins = [7, 15, 30, 60, 90, 125, 156] 
size = pd.cut(x=df_['面积'], bins=bins).value_counts()
sns.barplot(x=size.index, y=size.values, palette='Blues_d', ax=axes[1, 1])
axes[1, 1].tick_params(labelsize=15)
axes[1, 1].set_xticklabels(axes[1, 1].get_xticklabels(), rotation=0)
axes[1, 1].set_xlabel('面积区间', fontsize=18)
axes[1, 1].set_ylabel('')

plt.suptitle('房源数量分布总览', fontsize=25) # 多子图加总标题

在这里插入图片描述

问题10:以 总楼层 为横坐标,画出 房源数量 柱状图

plt.figure(figsize=(10,6))

ax = plt.subplot()
s = df.总楼层.value_counts()
sns.barplot(x=s.index, y=s.values)
ax.set_xlabel('总楼层', fontsize=18)
ax.set_ylabel('房源数量', fontsize=18)
ax.set_title('房源所在楼栋总层高', fontsize=20)

plt.show()

在这里插入图片描述

问题11:房源特征绘图,画四幅子图

  • 柱状图画出朝向(前10)分布柱状图 (朝向 列)
  • 饼图画出装修分布 (装修 列)
  • 饼图画出楼层高度分布 (楼层位置 列)
  • 饼图画出有无电梯分布 (电梯 列)
fig, axes = plt.subplots(2, 2, figsize=(12, 12))
plt.subplots_adjust(wspace=0.1, hspace=0.4)

s1 = df.朝向.value_counts()[:10]
sns.barplot(x=s1.index, y=s1.values, ax=axes[0, 0])
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=90)
axes[0, 0].set_xlabel('朝向')
axes[0, 0].set_ylabel('房源数量')
axes[0, 0].set_title('Top10 朝向', fontsize=16)

s2 = df.装修.value_counts()
axes[0, 1].pie(x=s2.values, explode=np.ones(len(s2))*0.01, 
               labels=s2.index, autopct='%.1f%%')
axes[0, 1].set_title('装修', fontsize=16)

s3 = df.楼层位置.value_counts()
axes[1, 0].pie(x=s3.values, explode=np.ones(len(s3))*0.01, 
               labels=s3.index, autopct='%.1f%%')
axes[1, 0].set_title('楼层', fontsize=16)

s4 = df.电梯.value_counts()
axes[1, 1].pie(x=s4.values, explode=np.ones(len(s4))*0.01, 
               labels=s4.index, autopct='%.1f%%')
axes[1, 1].set_title('电梯', fontsize=16)

plt.suptitle('房源特征', fontsize=20)

plt.show()

在这里插入图片描述

问题12:仿照上面例子,对用水、用电、燃气、采暖 进行饼状图分析

fig, axes = plt.subplots(2,2,figsize=(12, 12))
plt.subplots_adjust(wspace=0.1, hspace=0.4)

s1 = df.用水.value_counts()
axes[0,0].pie(x=s1.values, labels=s1.index, explode=np.ones(len(s1))*0.1, autopct='%.1f%%')

s2 = df.用电.value_counts()
axes[0,1].pie(x=s2.values, labels=s2.index, explode=np.ones(len(s2))*0.1, autopct='%.1f%%')

s3 = df.燃气.value_counts()
axes[1,0].pie(x=s3.values, labels=s3.index, explode=np.ones(len(s3))*0.1, autopct='%.1f%%')

s4 = df.采暖.value_counts()
axes[1,1].pie(x=s4.values, labels=s4.index, explode=np.ones(len(s4))*0.1, autopct='%.1f%%')

plt.show()

在这里插入图片描述

问题13:以 行政区域、商圈 两列 分组,汇聚一室的 房源数量 和 平均租金,并可视化

注意:一室分为 ‘1室1厅1卫’, ‘1室0厅1卫’, ‘1室0厅0卫’, ‘1室1厅0卫’

df1 = df[df['户型'].isin(['1室1厅1卫', '1室0厅1卫', '1室0厅0卫', '1室1厅0卫'])] # 1室的房源共1511条
df1_group = df1.groupby('商圈')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')]) # 按照商圈分类,并计算count, median
df1_price = df1_group[df1_group['房源数量']>14].sort_values(by='平均租金') # 筛选出超过15套房源的商圈,按照租金进行升序排序

# 可视化
fig, ax = plt.subplots(1, 1, figsize=(23, 10))
ax1 = ax.twinx()

df1_price['房源数量'].plot.line(ax=ax1, color='red' ,linewidth=4)
# ax1.set_ylim(0, 70)
ax1.set_yticks([0, 20, 40, 60, 80]) # 设置y轴的刻度范围及标记,默认不从0开始
ax1.legend(('房源数量',), loc='upper center', fontsize=20)

df1_price['平均租金'].plot.bar(ax=ax, color='blue', alpha=0.5)
ax.legend(('平均租金',), fontsize=20)

ax.set_xticklabels(ax.get_xticklabels(), rotation=65)
ax.set_xlabel('')
ax.set_ylabel('平均租金', fontsize=20)
ax.tick_params(labelsize=20)
ax1.set_ylabel('房源数量', fontsize=20)
ax1.tick_params(labelsize=20)

ax.set_title('1室户型的平均租金与房源数量', fontsize=25)

plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/623742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.13号模拟前端面试10问

1.介绍箭头函数和普通函数的区别 箭头函数和普通函数在JavaScript中有一些重要的区别。以下是关于这些区别的详细解释: 语法结构上的差异: 箭头函数使用更简洁的语法,它不需要使用function关键字,而是使用一个箭头(…

羊大师解析,羊奶滋养健康伴你行

羊大师解析,羊奶滋养健康伴你行 羊大师发现,羊奶在健康方面具有一定的优势,主要体现在以下几个方面。 补充营养:羊奶富含多种营养物质,包括蛋白质、钙、维生素D、维生素B12、矿物质等,这些成分有助于满足…

高考志愿系统-信息管理模块:专业信息和分数线信息分析

之前分析可知,专业和学校的关系为多对一,专业和分数线的关系为一对多。所以专业信息的管理稍微复杂一点。 其中分数线信息的管理和专业信息的业务逻辑相互联系,就是在对专业信息管理的时候,分数线信息也会随着更新。 1.获取专业…

有哪些值得买的开放式耳机推荐?2024年开放式运动耳机选购指南

开放式耳机因其独特设计,能在一定程度上保护听力。相较于传统封闭式耳机,开放式设计允许周围环境声音自然流入耳内,降低了耳内共振和声压,减少了耳道的不适感,从而减轻了对听力的潜在损害。对于追求音质与听力保护并重…

傻瓜化备份/恢复K8S集群Etcd数据

前言: 备份重要数据,简化重复操作,让一指禅、点点点也能完成运维任务。 脚本呈现界面如下: 1、查看Etcd版本 rootmaster:~# cat /etc/kubernetes/manifests/etcd.yaml | grep image: | awk {print $2} registry.aliyuncs.com/goo…

视频短信时代来临!发送前必知的四大关键要素

随着移动通信技术的迅猛发展,视频短信作为全新的沟通方式,正逐渐融入我们的日常生活。作为行业的先行者,邦之信已率先推出视频短信业务,并获得了市场的广泛认可。 那么,在发送视频短信时,我们需要注意哪些关…

口碑最好的麦克风品牌有哪些?多款高口碑无线领夹麦克风推荐

从直播、拍摄到采访,音频设备对于我们的生活越来越重要,想要拥有更清晰、真实的录音效果,一款优质的无线领夹麦克风肯定是必不可少的,其轻便小巧的特性,不仅适用于手机和相机的直播、录音需求,同时也能满足…

MATLAB支持向量机:函数或变量 ‘svmtrain‘ 无法识别解决方法

我的MATLAB版本是2020a,在运行程序时出现了一下报错 若在运行程序时出现了以下报错: 支持向量机程序在MATLAB执行代码的时候发现有错误。 试一下help,如下图所示,SVM_L和svmtrain均找不到。 打开matlab帮助文档: 可…

敦煌网(DHgate)商家一定要掌握的店铺流量提升技巧

流量是一个店铺的血液,没有流量的支撑,其他也都将成为浮云。流量能够成为成交量的一定保证,如何让店铺拥有傲人的流量成为我们共同努力的又一方向。 关于店铺的流量我们需要知道几个关键点: 一,主要流量的来源; 二&a…

untiy 为预制体动态加载光照贴图

unity版本为2021.8 预制体不能携带光照贴图信息,只能我们自己准备了 多方查找加自己摸索终于找到了适合新版本的解决方案,直接贴代码 将这个脚本挂到预制体的最上级 using System.Collections; using System.Collections.Generic; using UnityEditor; …

花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏功能介绍

1、首页仿抖音短视频 ,关注 ,我的 本地 直播 可发布短视频 可录制上传 2、商城页面 广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加…

便签字号怎么改 便签字体大小调节方法

在日常工作和生活中,便签是我形影不离的助手。每当灵感闪现或是有待办事项时,我都会随手记录在便签上,它就像我生活中的记事本,帮助我安排生活和工作。 然而,每个人都有不同的视觉需求和阅读习惯,对于便签…

【Jenkins】Pipeline流水线语法解析全集 -- 声明式流水线

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

Centos7网卡启动失败(Failed to start LSB: Bring up/down)

好雨知时节 当春乃发生 随风潜入夜 润物细无声 报错内容 启动虚拟机时,Ceotos的虚拟网卡没有一起启动,导致服务无法正常使用 查询网络启动状态 systemctl status network.service报Failed to start LSB: Bring up/down 查看网络启动日志 journalctl…

pypi发布.whl文件

Profile of liguandong PyPIThe Python Package Index (PyPI) is a repository of software for the Python programming language.https://pypi.org/user/liguandong/2024年,将Python项目发布到PyPI保姆级教程 - 知乎前几天我准备上传自己开发的项目到PyPI上的时候…

Spring MVC(五) 文件上传

1 单文件上传 在程序开发中,有时候需要上传一些文件。我们在学习Servlet的时候,也做过文件上传的操作,只不过基于Servlet的文件上传操作起来过于复杂,因此所有的MVC框架都提供了自己的文件上传操作,基本上都是基于File…

从零开始学习Linux(6)----进程控制

1.环境变量 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,我们在编写C/C代码时,链接时我们不知道我们链接的动态静态库在哪里,但可以连接成功,原因是环境变量帮助编译器进行查找,环境变量通常具有…

简单粗暴的翻译英文pdf

背景:看书的时候经常遇到英文pdf,没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。 Step 1 打开英文pdfCTRLA全选文字CTRLC复制打开记事本CTRLV复制保存为data.txt Step 2 写一个C脚本 // ToolPdf2Html.cpp : 此文件包含 "main&quo…

【HMGD】GD32/STM32 DMA接收不定长串口数据

单片机型号:GD32F303系列 CubeMX配置 配置串口参数 开启DMA 开启中断 示例代码 使用到的变量 uint8_t RX_Buff_FLAG 0; uint8_t RX_Buff[300] {0}; uint8_t TX_Buff[300] {0};串口接收空闲函数 // 串口接收空闲函数 void HAL_UARTEx_RxEventCallback(UART_H…

Redisson中分布式锁的实现原理

redisson版本:3.27.2 简介 锁归根结底就是对同一资源的竞争抢夺,不管是在单体的应用亦或者集群的服务中,上锁都是对同一资源进行修改的操作。至于分布式锁,那就是多个服务器或资源,同时抢占某一单体应用的同个资源了。…