数据可视化(九):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 inlineplt.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()

相关文章:
数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…...
ADOP带你了解:跳线与交叉电缆有何不同?
如果您想将设备连接到互联网,您可能想知道要使用的正确电缆。跳线和交叉电缆都是类型的以太网电缆,可帮助连接计算机、调制解调器、路由器和交换机等设备。那么,跳线和交叉电缆有什么区别呢?让我们讨论这两种类型的电缆࿰…...
Django 和 Spring Boot
标题 Django (Python)Django提供的组件Django 的处理逻辑 Spring Boot (Java)Spring Boot 的特点Spring Boot 的处理逻辑 MVC设计模式模型(Model)视图(View)控制器(Controller)逻辑处理过程 Django 和 Spri…...
上位机图像处理和嵌入式模块部署(树莓派4b的替代品)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 实话实说,树莓派4b的产品力还是比较优秀的,价格还算适中。但是和国产卡片电脑比起来,则逊色不少。功能差不多的…...
Springboot整合 Spring Cloud Gateway
1.Gateway介绍 1.是spring cloud官方推出的响应式的API网关框架,旨在为微服务架构提供一种简单有效的API路由的管理方式,并基于Filter的方式提供网关的基本功能,例如:安全认证,监控,限流等等。 2.功能特征…...
Rust开发工具有哪些?
目录 一、JetBrains公司的RustRover编辑 二、微软公司的Visual Studio Code 三、Rust编译工具 一、JetBrains公司的RustRover RustRover是由JetBrains开发的一款专为Rust开发量身定制的新兴IDE,目前还处于早期访问阶段。它支持Rust、Cargo、TOML、Web和数据库等…...
20240514基于深度学习的弹性超材料色散关系预测与结构逆设计
论文:Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI:https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能,保证了各种各样的具…...
SAP:FI 财务凭证行项目文本前台修改
一、问题描述 财务凭证行项目文本点击修改,但是前台有的行可以修改,有的行是灰色的不能修改,如下图所示,这个文本信息有误,必须修改怎么办? 二、思路分析 有的行可以修改,有的行不能修改&#x…...
【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍
1-4 管道 管道符号: | ,可以将前面指令的执行结果,作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入,意思就是查看ip addr 结果的后四行内容…...
Spring Cloud LoadBalancer 4.1.2
LoadBalancer位于Spring Cloud Commons 模块 Spring Cloud 提供了自己的客户端负载均衡器抽象和实现。对于负载均衡机制,添加了 ReactiveLoadBalancer 接口,并为其提供了基于Round-Robin和Random的实现。为了让实例从反应式中进行选择,使用了…...
使用Xshell工具连接ubuntu-方便快捷
使用Xshell连接ubuntu 在命令行输入 “sudo apt-get install openssh-server”安装openssh-server 开启 ssh-server,在命令行输入 “service ssh start”,然后输入密码即可...
leetcode22 括号生成-组合型回溯
题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 输入:n 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 解析 func generateParenthesis(n int) …...
mac定时任务、自启动任务
https://quail.ink/mynotes/p/mac-startup-configuration-detailed-explanation <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.d…...
重磅 | 国家标准《网络安全技术 零信任参考体系架构》正式发布
根据2024年4月25日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告(2024年第6号),其中易安联参编的国家标准GB/T 43696-2024《网络安全技术 零信任参考体系架构》正式发布,并于2024年11月1日正式施行…...
【C++】可变参数模板简单介绍
前言 可变参数模板是C11中的新特性,它能够让我们创建可以接收可变参数的函数模板和类模板,相比C98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数是一个巨大的改进,通过系统系统推演数据的类型…...
RabbitMQ--死信队列
目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者(正常消费者) 6.死信队列消费者 一、…...
微信小程序毕业设计-基于Java后端的微信小程序源码150套(附源码+数据库+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 🧡今天给大家分享150的微信小程序毕业设计,后台用Java开发,这些项目都经过精心挑选,涵盖了不同的实战主题和用例,可做毕业设…...
提前预知职业天赋!霍兰德职业兴趣测试API接口给你精准推荐
霍兰德职业倾向测验,它是美国著名职业指导专家J.霍兰德(HOLLAND)编制的,他的职业选择理论把职业分为六种不同类型,即现实型、研究型、艺术型、社会型、企业型、常规型。霍兰德认为,每个人都是这…...
js强大的运算符:??、??=
学习目标: js中强大的运算符 ?? 非空运算符 学习内容: ?? 非空运算符 注意:?? 运算符被称为非空运算符。如果第一个参数不是 null/undefined 将返回第一个参数,否则返回第二个参数 之前: 给变量设置默认值时…...
【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。
操作环境: MATLAB 2022a 1、算法描述 本文将重点分析光伏发电最大功率点跟踪(MPPT)技术和逆变器的并网控制技术,并在Simulink环境下建立模拟系统,以体现这些技术的应用与效果。文章结构如下:首先简介光伏…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
