数据分析师的自我修养——房价篇

安居客二手房房价分析(一)

最近在跟女友讨论未来是去南京还是去杭州发展,虽然两个城市都各有优势,但房价始终是绕不开房价的问题。刚好很久之前写的一个安居客房价爬虫还能用,于是便顺手爬了些数据来做下分析。这里先放几张预览图
在这里插入图片描述

在这里插入图片描述

数据来源

  文章中所用的数据为本人爬取的安居客二手房房价数据。有需要的同学可以自行下载。链接:https://pan.baidu.com/s/193zo6W1RkbOGWRoVyLXV7g 提取码:36iy

安居客二手房页面
二手房爬虫数据

 如果有同学对房价爬虫感兴趣,后期我会专门开一个爬虫专题。

数据预处理

这里我主要简单介绍下house_info、region这两个字段以及数值的处理。

house_info字段

house_info这个字段里包含了大量的信息,像户型、面积、朝向、装修、楼层、建成年代以及建筑结构,不同信息之间以|相隔开。
我这边利用了df.str.split()来处理:

data_split['room_type']=data.house_info.str.split("|").str[0].values #户型
data_split['area']=data.house_info.str.split("|").str[1].values #面积
data_split['ort']=data.house_info.str.split("|").str[2].values #朝向
data_split['decorate']=data.house_info.str.split("|").str[3].values #装修
data_split['floor']=data.house_info.str.split("|").str[4].values #楼层
data_split['built_year']=data.house_info.str.split("|").str[5].values #建成年代
data_split['structure']=data.house_info.str.split("|").str[6].values #结构

但这样处理会产生一些问题,如建成年代的缺失,会导致数据移位。
在这里插入图片描述
因此,这里的处理思路为:若structure字段为空值,则以built_year中的值来进行填充。

#处理数据移位
data_split['structure'].fillna(data_split['built_year'], inplace=True) 
data_split['built_year']=data_split.built_year.map(lambda x : x if '年' in x else np.nan)

region字段

某个房源,对于我这个外地人而言,可能更想知道它属于南京的哪个行政区,而不是什么凤凰新街这之类的地名。为此,这里我需要对房源的行政区划进行重新匹配。
这里我是借助百度地图的API接口,以小区名+region+城市名作为查询关键词,实现了行政区的匹配。这部分的脚本目前在工作机上,之后也会一并放上来。

数值处理

为了方便进行数值分析,这里利用正则来提取字符串里的数值。

#定义数值提取函数
def value_extract(string):
    pattern1=r"[1-9]\d*.\d*|0.\d*[1-9]\d*"
    pattern2=r"[1-9]\d*"
    try:
        result=float(re.findall(pattern1,string)[0])
    except:
        try:
            result=int(re.findall(pattern2,string)[0])
        except:
            result=np.nan
    return result 

#提取数值数据
data_split['total_floors']=data_split.floor.map(lambda x: value_extract(x))
data_split['area']=data_split.area.map(lambda x: value_extract(x))
data_split['built_year']=data_split.built_year.map(lambda x: value_extract(x))

其他还有一些细节上的处理,如楼层处理,这里不再一一赘述。处理之后的数据如下所示:
在这里插入图片描述
以下是数据预处理部分的完整代码:

import pandas as pd
import numpy as np
import copy
import re

data=pd.read_excel('E:\\pycharm_file\\pycharmfile\\fangjia\\南京二手房.xlsx',index_col=[0])

#处理house_info
data_split=copy.deepcopy(data)
data_split.drop(['house_info'],axis=1,inplace=True)

data_split['room_type']=data.house_info.str.split("|").str[0].values #户型
data_split['area']=data.house_info.str.split("|").str[1].values #面积
data_split['ort']=data.house_info.str.split("|").str[2].values #朝向
data_split['decorate']=data.house_info.str.split("|").str[3].values #装修
data_split['floor']=data.house_info.str.split("|").str[4].values #楼层
data_split['built_year']=data.house_info.str.split("|").str[5].values #建成年代
data_split['structure']=data.house_info.str.split("|").str[6].values #结构

#处理数据移位
data_split['structure'].fillna(data_split['built_year'], inplace=True) 
data_split['built_year']=data_split.built_year.map(lambda x : x if '年' in x else np.nan)

#处理楼层数据
data_split['floor_type']=data_split.floor.str.split("(").str[0].values
data_split['total_floors']=data_split.floor.str.split("(").str[1].values

#处理均价数据
data_split['av_price']=data_split.av_price.str.split("元").str[0].values

#data_split.head()

#import re

#定义数值提取函数
def value_extract(string):
    pattern1=r"[1-9]\d*.\d*|0.\d*[1-9]\d*"
    pattern2=r"[1-9]\d*"
    try:
        result=float(re.findall(pattern1,string)[0])
    except:
        try:
            result=int(re.findall(pattern2,string)[0])
        except:
            result=np.nan
    return result 

#提取数值数据
data_split['total_floors']=data_split.floor.map(lambda x: value_extract(x))
data_split['area']=data_split.area.map(lambda x: value_extract(x))
data_split['built_year']=data_split.built_year.map(lambda x: value_extract(x))

#处理均价数据
n=data_split.shape[0]
result=[]
for i in range(n):
    str_list=data_split.av_price.str.split(',').get(i)
    result.append(str_list[0]+str_list[1])

data_split['av_price']=result

#删除无用的列
data_split.drop(['floor'],axis=1,inplace=True)

#转化数据类型
data_split.av_price=data_split.av_price.astype('int')

#处理floor_type
data_split.floor_type=data_split.floor_type.astype('string')
data_split['floor_type']=data_split.floor_type.map(lambda x: x.strip())

def floor_judge(num):
    if num>=10:
        return '高楼层'
    elif num >=6:
        return '中楼层'
    else:
        return '低楼层'
    

for i in range(data_split.shape[0]):
    if '楼' in data_split.iloc[i,14]:
        continue
    else:
        data_split.iloc[i,14]=floor_judge(data_split.iloc[i,15])           

data_split.head()

未完待续——

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 安居客出租房(武汉为例)爬虫+数据分析+可视化 这个爬虫是我前段时间在淘宝上做单子的时候遇见的一个客户需求。本来以为就是一个简单的爬虫项目。但后面客户加了数据清洗和数据分析的要求。而后又加了要详细代码解释的需求等等。直到最后客户坦白说这是他们大专的毕设.......但是这个单子坐下来只有200左右,我想了一下,感觉好亏啊。在淘宝上随便找一个做毕设的都要好多钱的,而且客户本身的代码能力、数学、逻辑能力都很差,导致我每行都给注释以及看不懂,在我交付代码后又纠缠了我一个多礼拜。反正总体做下来的感觉就是烦躁。头一次感觉到了客户需求变更带来的巨大麻烦。 总之这是一次不是很愉快的爬虫经历。但是作为我写爬虫以来注释最详细的一次,以及第一次真正使用像matplotlib这种数据分析库的代码,我认为还是有必要分享出来给大家当个参考的(PS:大佬轻拍~)。爬虫本身几乎没有什么难度,写的也比较乱,敬请见谅。 **功能** 爬取安居客上的出租房信息(武汉地区的),并通过爬取的数据进行数据清洗以及数据分析。给出四个不同层面的可视化图。最终结果如下图所示: ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/1.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/2.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/3.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/4.png) **环境** 1. Windows 10 2. python3.7 **使用方法** 首先声明该爬虫由于是特定情况下写的,所以本身的通用性特别差,仅可以对安居客网站上的武汉的出租房信息进行爬取,且需要自己手动更新cookie。同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取cookie的方法可根据[此链接](https://jingyan.baidu.com/article/5d368d1ea6c6e33f60c057ef.html) 2. 在项目中找到`spider.py`的文件,将第12行的cookie换成你自己的cookie。 3. 运行`spider.py`,获取房源信息。运行后应会产生一个`武汉出租房源情况.csv`的文件。此文件为我们从安居客上爬取的房源信息,其中包含`房屋租住链接、房屋描述、房屋地址、房屋详情(户型)以及经纪人、房屋价格`五个属性。 4. 在获取了数据之后我们运行`matplotlib.py`文件。进行数据清洗,分析,可视化。运行后即可获得**功能**中展示四个图片。 **技术栈** 1. request 2. parsel 3. pandas 4. matplotlib **进步(相比之前)** 此次爬虫相比之前的技术上可以说有减无增。但其中注释相当详细,可谓是每行代码都有注释。所以对于初学者应该有一些用处。同时使用matplotlib进行了数据分析可视化等。对于数据处理的代码的注释也是几乎每行都有注释的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值