#首先我用爬虫获取到了链家二手房的一万多条信息,我在爬去的时候对空置进行了处理
本文主要讲述如何通过pandas对爬虫下来的链家数据进行相应的二手房数据分析,主要分析内容包括各个区,各个小区的房源信息情况
#导入主要的模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
house = pd.read_csv(r'C:\Users\cz\Desktop\fang.csv',names=['id','title','link','community','housetype','direction','floor','region','totalprice','followinfo','unitprice','acreage','frequency'])
#然后查看是否有数据
#获取总价格全五的数据
house.sort_values('totalprice',ascending=False).head(5)
#结果
| id | title | link | community | housetype | direction | floor | region | totalprice | followinfo | unitprice | acreage | frequency |
3 | 917 | 桃花岛 南北全名三居室 满五年 中间楼层 得房率93.4% | 桃花岛 | 3室2厅 | 南 北 | 6 | 通州 | 600.0 | 23 | 50113 | 119.73平米 | 0 | |
0 | 914 | 满五年唯一南北通透大2居 板楼1层2户 全天采光视野好 | 天通西苑三区 | 2室2厅 | 南 北 | 13 | 昌平 | 499.0 | 25 | 37209 | 134.11平米 | 25 | |
2 | 916 | 南北通透大3居+低楼层+落地窗户+生活方便 | 华龙小区 | 3室1厅 | 南 北 | 6 | 通州 | 466.0 | 35 | 37930 | 122.86平米 | 1 | |
1 | 915 | 满两年 南北通透 随时可看 诚心出售 | 源泉苑 | 2室1厅 | 南 北 | 6 | 通州 | 320.0 | 13 | 45205 | 70.79平米 | 4 | |
4 | 918 | 距离古城地铁口282米 满五唯一 小三居室 总价低 | 古城南路 | 3室1厅 | 东 西 | 6 | 石景山 | 275.0 | 74 | 46650 | 58.95平米 | 4 |
#字符串的处理
# 将字符串转换成数字主要用于处理面积的数据
def data_adj(area_data, str):
#判断‘平米’在不在这个数据里
if str in area_data :
#用find()函数查找字符串的索引位置,方便截取
return float(area_data[0 : area_data.find(str)])
else :
return None
#把字符串里的平米去掉
house['acreage'] = house['acreage'].apply(data_adj,str = '平米')
处理后结果如下(我只截取前五个数据太大了)
0 134.11 1 70.79 2 122.86 3 119.73 4 58.95 5 78.54
接下来我来计算所有户型的个数,然后用图像展示出来
#计算户型的所占的个数,用到value_counts(),排序也给你做好了,你可以清楚的看到所占的个数
housetype = house['housetype'].value_counts()
#结果
2室1厅 4251 3室1厅 1766 3室2厅 1268 1室1厅 1011 2室2厅 755 4室2厅 478 1室0厅 176 4室1厅 139 5室2厅 96 1房间1卫 41 2房间1卫 32 5室3厅 32 1室2厅 30 4室3厅 27 3房间1卫 25 3房间2卫 24 6室2厅 23 3室3厅 18 3室0厅 15 5室1厅 15 2室0厅 14 4房间2卫 8 6室3厅 8 5房间2卫 7 4房间1卫 5 5房间3卫 5 4房间3卫 3 2室3厅 3 5室4厅 3 7室2厅 3 1房间0卫 2 9室3厅 1 9室1厅 1 4室4厅 1 11房间3卫 1 6房间3卫 1 7室1厅 1 6房间4卫 1 6室6厅 1 6室1厅 1 7室3厅 1 8室2厅 1 6室4厅 1 Name: housetype, dtype: int64
#我们把图像话出来,有于后面的小数据比较多我就展示了前10个的信息
有于matplotlib不显示中文我在网上查了些资料,得到的解决方案就是加两行代码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
#设置画布
asd,sdf = plt.subplots(1,1,dpi=200)
#获取前10条数据
housetype.head(10).plot(kind='bar',x='housetype',y='size',title='户型数量分布',ax=sdf)
plt.legend(['数量'])
plt.show()
#图像展示结果,有图像可以清楚的看到数量分布情况
#图片的下载
#下载图片
plt.savefig(r"C:\Users\cz\Desktop\housetype.jpg")
#户型和关注人数分布
#户型和关注人数分布
type_interest_group = house['followinfo'].groupby(house['housetype']).agg([('户型', 'count'), ('关注人数', 'sum')])
#获取户型数量大于50 的数据
ti_sort = type_interest_group[type_interest_group['户型'] > 50 ].sort_values(by='户型')
#结果
5室2厅 | 96 | 5753 |
4室1厅 | 139 | 9445 |
1室0厅 | 176 | 11409 |
4室2厅 | 478 | 30824 |
2室2厅 | 755 | 38173 |
1室1厅 | 1011 | 65393 |
3室2厅 | 1268 | 71446 |
3室1厅 | 1766 | 107967 |
2室1厅 | 4251 | 273616 |
#图像展示
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
ti_sort.plot(kind='barh',alpha=0.7,grid=True,ax=sdf)
plt.title('二手房户型和关注人数分布')
plt.ylabel('户型')
plt.show()
#户型与看房次数
#户型和看房次数数分布
type_interest_num = house['frequency'].groupby(house['housetype']).agg([('户型', 'count'), ('看房次数', 'sum')])
ti_sort = type_interest_num[type_interest_num['户型'] > 50 ].sort_values(by='户型')
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
ti_sort.plot(kind='barh',alpha=0.7,grid=True,ax=sdf)
plt.title('二手房户型和看房次数')
plt.ylabel('户型')
plt.show()
在售面积分布
area_level = [0, 50, 100, 150, 200, 250, 300, 500]
label_level = ['小于50', '50-100', '100-150', '150-200', '200-250', '250-300', '300-350']
#算出所面积在哪个区间
are_cut = pd.cut(house['acreage'],area_level,label_level)
#计算面积在所设置的区间的数量
acreage = are_cut.value_counts()
acreage
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
acreage.plot(kind='bar',rot=30,alpha=0.4,grid=True,ax=sdf)
plt.title('二手房面积分布')
plt.xlabel('面积')
plt.legend(['数量'])
plt.show()
#算出个个区域的平均房价
#各个区房源均价
region =house.groupby('region').mean()['unitprice']
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
region.plot(kind='bar',x='region',y='unitprice', title='各个区域房源均价',ax=sdf)
plt.show()
#区域房源分布量
#各个区域房源数量排序
region_num = house.groupby('region').size().sort_values(ascending=False)
#画图
region_num = house.groupby('region').size().sort_values(ascending=False)
asd,sdf = plt.subplots(1,1,dpi=150)
region_num.plot(kind='bar',x='region',y='size',title='各个区域房源数量分布',ax=sdf)
plt.legend(['数量'])
plt.show()
#北京在售面积最小二手房
house.sort_values('acreage').iloc[0,:]
#结果
id 9933
title 西城区 荣丰2008小区 一起开间 满五年 总价低
link https://bj.lianjia.com/ershoufang/101102783824...
community 荣丰2008
housetype 1室0厅
direction 东
floor 26
region 西城
totalprice 290
followinfo 61
unitprice 151357
acreage 19.16
frequency 41
Name: 9019, dtype: object
#小区房源数量
# 各个区域小区房源数量
community_num =house.groupby('community').size().sort_values(ascending=False)
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
#取前十五个
community_num.head(15).plot(kind='bar',x='community',y='size',title='各个小区数量',ax=sdf)
plt.legend(['数量'])
plt.show()
各个小区房源均价
#各个小区的房源均价
community_mean = house.groupby('community').mean()['unitprice'].sort_values(ascending=False)
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
#前10 条
community_mean.head(10).plot(kind='bar',x='community',y='mean',title='各个小区房源均价',ax=sdf)
plt.legend(['均价'])
plt.show()
#各个小区的关注人数
#个个小区看房人数
community_fsum = house['frequency'].groupby(house['community']).agg([('小区', 'count'), ('看房次数', 'sum')])
commnuity_count = community_fsum[community_fsum['小区'] >30].sort_values(by='小区')
#画图
asd,sdf = plt.subplots(1,1,dpi=150)
commnuity_count.plot(kind='barh',ax=sdf)
plt.title('各个小区看房人数')
plt.show()
#如有错误请指出,谢谢!