利用Python对链家网北京二手房进行简单数据分析

吃可爱长大的小学妹 提交于 2019-12-08 21:25:48
#首先我用爬虫获取到了链家二手房的一万多条信息,我在爬去的时候对空置进行了处理

本文主要讲述如何通过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)

#结果

 idtitlelinkcommunityhousetypedirectionfloorregiontotalpricefollowinfounitpriceacreagefrequency
3917桃花岛 南北全名三居室 满五年 中间楼层 得房率93.4%https://bj.lianjia.com/ershoufang/101102706320...桃花岛3室2厅南 北6通州600.02350113119.73平米0
0914满五年唯一南北通透大2居 板楼1层2户 全天采光视野好https://bj.lianjia.com/ershoufang/101102810716...天通西苑三区2室2厅南 北13昌平499.02537209134.11平米25
2916南北通透大3居+低楼层+落地窗户+生活方便https://bj.lianjia.com/ershoufang/101102750110...华龙小区3室1厅南 北6通州466.03537930122.86平米1
1915满两年 南北通透 随时可看 诚心出售https://bj.lianjia.com/ershoufang/101102910958...源泉苑2室1厅南 北6通州320.0134520570.79平米4
4918距离古城地铁口282米 满五唯一 小三居室 总价低https://bj.lianjia.com/ershoufang/101102783849...古城南路3室1厅东 西6石景山275.0744665058.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厅965753
4室1厅1399445
1室0厅17611409
4室2厅47830824
2室2厅75538173
1室1厅101165393
3室2厅126871446
3室1厅1766107967
2室1厅4251273616

#图像展示

#画图
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()


#如有错误请指出,谢谢!
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!