目的:使用python的numpy、pandas、matplotlib库来分析成都二手房的房价信息。

原始数据来源:贝壳找房网站上的数据https://cd.ke.com/ershoufang

环境:win10  python 3.7.3

参考链接:入门Python数据分析最好的实战项目(一)

环境:win10  python 3.7.3  vscode编辑器

(1)第一部分:使用python爬取贝壳网上的数据

爬取的数据是:锦江、青羊、武侯、高新、成华、金牛、天府新区、双流、温江、郫都、龙泉驿、新都等区的两室的二手房价信息,每个地区爬取了300个条目。

由于爬取的是静态页面,所以很容易,我就直接放代码了,不熟悉的网友可以参考一下这篇文章:https://www.cnblogs.com/mrlayfolk/p/12319414.html

  1 # encoding:utf-8
2
3 '''
4 目的:从贝壳找房中爬取房价信息。网址:https://cd.ke.com/ershoufang/qingyang/l2/
5 分别是:锦江、青羊、武侯、高新、成华、金牛、天府新区、双流、温江、郫都、龙泉驿、新都等区的房价信息
6 环境:python 3.7.3
7 所需的库:requests、BeautifulSoup、xlwt
8 '''
9
10 import requests
11 import string
12 import csv
13 import re
14 from bs4 import BeautifulSoup
15
16 headers = {
17 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',\
18 "Host": "cd.ke.com",
19 }
20
21 # 将获取的信息保存到表格中
22 def save_info(content, title):
23 head = ('position', 'floor', 'builtYear', 'layout', 'size', 'orientation', 'totalPrice', 'perPrice')
24 with open('%s.csv' % title, 'w', newline='', encoding='utf-8-sig') as f:
25 writer = csv.writer(f)
26 writer.writerow(head)
27 for i in range(len(content)):
28 row = content[i]
29 writer.writerow(row)
30
31
32
33 # 获取房屋相关的信息
34 # 主要包括:'position', 'floor', 'builtYear', 'layout', 'size', 'orientation', 'totalPrice', 'perPrice'
35 def get_info(place):
36
37 all_info = []
38 position_list = []
39 floor_list = []
40 builtYear_list = []
41 layout_list = []
42 size_list = []
43 orientation_list= []
44 totalPrice_list = []
45 unitPrice_list = []
46
47 for i in range(10):
48 link = 'https://cd.ke.com/ershoufang/%s/pg%dl2/' % (place, i)
49 r = requests.get(link, headers=headers, timeout=10)
50 print (str(i+1), 'status_code: ', r.status_code)
51 soup = BeautifulSoup(r.text, 'lxml')
52 positionInfo = soup.findAll('div', {'class': 'positionInfo'})
53 houseInfo = soup.findAll('div', {'class': 'houseInfo'})
54 totalPrice = soup.findAll('div', {'class': 'totalPrice'})
55 unitPrice = soup.findAll('div', {'class': 'unitPrice'})
56 for item in positionInfo:
57 postion = item.a.text.strip()
58 position_list.append(postion)
59 for item in houseInfo:
60 house_info = item.text.strip().replace('\n', ' ').replace(' ', '')
61 floor = re.search('.楼层\(共[\d]+层\)', house_info).group()
62 s = re.search('[\d]*年建', house_info)
63 if s is not None: builtYear = s.group().replace("年建", '')
64 else: builtYear = None
65 layout = re.search('.室.厅', house_info).group()
66 size = re.search('([\d]*\.[\d]*|[\d]*)平米', house_info).group().replace('平米', '')
67 orientation = re.search('东南|东北|西南|西北|东|西|南|北', house_info).group()
68 floor_list.append(floor)
69 builtYear_list.append(builtYear)
70 layout_list.append(layout)
71 size_list.append(size)
72 orientation_list.append(orientation)
73 for item in totalPrice:
74 total_price = item.span.text.strip()
75 totalPrice_list.append(total_price)
76 for item in unitPrice:
77 unit_price = item.span.text.strip().replace('单价', '').replace('元/平米', '')
78 unitPrice_list.append(unit_price)
79 print (len(position_list))
80 print (len(floor_list))
81 print (len(builtYear_list))
82 print (len(layout_list))
83 print (len(size_list))
84 print (len(orientation_list))
85 print (len(totalPrice_list))
86 print (len(totalPrice_list))
87 for i in range(len(position_list)):
88 item = [position_list[i], floor_list[i], builtYear_list[i], layout_list[i], \
89 size_list[i], orientation_list[i], totalPrice_list[i], unitPrice_list[i]]
90 all_info.append(item)
91
92 return all_info
93
94
95 if __name__ == "__main__":
96
97 area_list = ['jinjiang', 'qinyang', 'wuhou', 'gaoxin', 'chenghua', 'jinniu', \
98 'tianfuxinqu', 'shuangliu', 'wenjiang', 'pidu', 'longquanyi', 'xindu']
99
100 for place in area_list:
101 all_info = get_info(place)
102 save_info(all_info, place)

上述代码执行的结果是:输出了存储成都各地区房价信息的csv文件。

以下地方需要说明一下:

1)当我们获取到房屋信息时(如:高楼层(共6层) | 2000年建 | 2室2厅 | 78平米 | 南),由于有些条目缺少年建(前面的“2000”年建),所以用字符串的内建函数来分割出楼层、年建、布局、面积、朝向等信息不是很方便,建议使用正则表达式,这样会方便很多。

2)当我们存储数据到csv文件时,把“ encoding='utf-8-sig' ”这条语句加上,不然我们使用pandas.read_csv()函数打开csv文件时会出现编码错误的问题,具体的原因可查看这篇文章:https://www.cnblogs.com/harrymore/p/10063775.html

(2)第二部分:分析爬取到的房价信息

接下来使用numpy、pandas、matplotlib库来分析。

1)首先,先导入这些库。

1 import numpy as np
2 import pandas as pd
3 from matplotlib import pyplot as plt
4
5 # 解决绘图时中文不显示的问题
6 plt.rcParams['font.sans-serif'] = ['SimHei']
7 plt.rcParams['axes.unicode_minus'] = False

2)然后,我们将抓取到的文件使用pandas.read_csv()方法读取出来。

 1 df_jinjiang    = pd.read_csv('jinjiang.csv')
2 df_qinyang = pd.read_csv('qinyang.csv')
3 df_wuhou = pd.read_csv('wuhou.csv')
4 df_gaoxin = pd.read_csv('gaoxin.csv')
5 df_chenghua = pd.read_csv('chenghua.csv')
6 df_jinniu = pd.read_csv('jinniu.csv')
7 df_tianfuxinqu = pd.read_csv('tianfuxinqu.csv')
8 df_shuangliu = pd.read_csv('shuangliu.csv')
9 df_wenjiang = pd.read_csv('wenjiang.csv')
10 df_pidu = pd.read_csv('pidu.csv')
11 df_longquanyi = pd.read_csv('longquanyi.csv')
12 df_xindu = pd.read_csv('xindu.csv')
13
14 df = [df_jinjiang, df_qinyang, df_wuhou, df_gaoxin, df_chenghua, df_jinniu, df_tianfuxinqu, \
15 df_shuangliu, df_wenjiang, df_pidu, df_longquanyi, df_xindu]

3)接着,我们先使用DataFrame的describe()方法先分析一下各地区的统计值,包括:最大值、最小值、平均值、中位数等。

1 area_name = ['jinjiang', 'qinyang', 'wuhou', 'gaoxin', 'chenghua', 'jinniu', 'tianfuxinqu', \
2 'shuangliu', 'wenjiang', 'pidu', 'longquanyi', 'xindu']
3
4 for i, item in enumerate(df):
5 print ('%s:' % area_name[i])
6 print (item.describe())

打印的数据很多,就不全部弄出来了,锦江区的数据如下,可以看到锦江区的二手房价平均值为124.93万元、中位数为118万元;每平米的单价的平均值为17249元,中位数为16056.3元。由于抓取的数据只是两室的房屋,可以看出面积平均为71.15平方米,中位数为72平方米。

4)接着分析一下每个地区的房屋的单价信息(元/平米),并以柱状图显示出来。

1 perPrice_list = []
2 for item in df:
3 perPrice = item['perPrice'].mean()
4 perPrice_list.append(perPrice)
5 data = pd.Series(perPrice_list, index=area_name)
6 data.plot(kind='barh', color='g', alpha=0.7, title=u'成都各区每平米房价对比')
7 plt.ylabel('area')
8 plt.xlabel('perPrice')
9 plt.show()

从分析结果可以看出:锦江区的每平米房价最高,温江的最低。

5)接下来,分析一下面积和单价的对应关系。

为了方便后续处理,先将所有的面积,单价,总价进行一个汇总。

 1 # 将各个条目数据进行汇总
2 size_list = []
3 builtYear_list = []
4 totalPrice_list = []
5 perPrice_list = []
6 for item in df:
7 size = item['size']
8 builtYead = item['builtYear']
9 price = item['totalPrice']
10 perPrice = item['perPrice']
11 for i in range(len(size)):
12 size_list.append(size[i])
13 builtYear_list.append(builtYead)
14 totalPrice_list.append(price[i])
15 perPrice_list.append(perPrice[i])
16 print (len(size_list))
17 print (len(builtYear_list))
18 print (len(totalPrice_list))
19 print (len(perPrice_list))

6)现在获取每平米的单价和面积之间的对应关系。

1 #  将各地区的面积和单价统计起来,看一下面积和单价之间的对应关系。
2 plt.scatter(totalPrice_list, size_list, s=np.pi)
3 plt.title('面积与房屋单价的对应关系')
4 plt.xlabel('size')
5 plt.ylabel('perPrice')
6 plt.show()

可以看出,面积和单价之间基本是成正相关的,只有几个少数的地方数据点除外。

7)分析每一个地区的房价(总价)与面积之间的关系,并绘制散布图

 1 # 分析每一个地区的房价(总价)与面积之间的关系,并绘制散布图
2 totalPrice_list = []
3 size_list = []
4 for item in df:
5 totalPrice = item['totalPrice']
6 size = item['size']
7 totalPrice_list.append(totalPrice)
8 size_list.append(size)
9 fig, axes = plt.subplots(3, 4)
10 k = 0
11 for i in range(3):
12 for j in range(4):
13 axes[i, j].scatter(size_list[k], totalPrice_list[k], label=area_name[k], s=np.pi)
14 axes[i, j].legend(loc='best')
15 axes[i, j].set_xlabel('size')
16 axes[i, j].set_ylabel('price')
17 k += 1
18 plt.subplots_adjust(hspace=0.25)
19 plt.show()

可以看出,大部分地区的房屋面积和价格是呈现出正相关的关系,而天府新区的面积与房价之间没有体现出这种关系,这似乎是不正常的。

8)分析一下房屋建立的时间与单价之间的关系。

 1 # 分析房屋年限和单价的关系
2 builtYear_list = []
3 perPrice_list = []
4 for item in df:
5 perPrice = item['perPrice']
6 builtYear = item['builtYear']
7 perPrice_list.append(perPrice)
8 builtYear_list.append(builtYear)
9 fig, axes = plt.subplots(3, 4)
10 k = 0
11 for i in range(3):
12 for j in range(4):
13 axes[i, j].scatter(builtYear_list[k], perPrice_list[k], label=area_name[k], s=np.pi)
14 axes[i, j].legend(loc='best')
15 axes[i, j].set_xlabel('builtYear')
16 axes[i, j].set_ylabel('perPrice')
17 k += 1
18 plt.subplots_adjust(wspace=0.3, hspace=0.3)
19 plt.show()

可看出,郫都和新都的房屋建立时间并没有体现出与房价的相关性,2000年建立的房屋和2010年建立的房屋价格差不多,这似乎是不正常的。

(3)总结

我才开始学习python和python的数据分析没有多久,对于数据分析的模型更是不懂。我把这当作一个学习的记录过程。

python数据分析练习--分析成都的房价的更多相关文章

  1. 小猪的Python学习之旅 —— 16.再尝Python数据分析:采集拉勾网数据分析Android就业行情...

    一句话概括本文: 爬取拉钩Android职位相关数据,利用numpy,pandas和matplotlib对招人公司 情况和招聘要求进行数据分析. 引言: 在写完上一篇<浅尝Python数据分析: ...

  2. 入门Python数据分析最好的实战项目(一)分析篇

    数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seaborn,以及机器学习包sklearn. python学习交流群:660193417### import ...

  3. Python数据采集处理分析挖掘可视化应用实例

    距离上一次发Python的技术贴已经过去两年了,这两年大法初成,并在知乎谢了相关技术专栏.现在搬运如下,均为原创,转载需注明出处哦! https://zhuanlan.zhihu.com/p/2957 ...

  4. 快速入门 Python 数据分析实用指南

    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...

  5. [Python数据分析]新股破板买入,赚钱几率如何?

    这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...

  6. 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来

    最近在看<Python数据分析>这本书,而自己写代码一直用的是Pycharm,在练习的时候就碰到了plot()绘图不能显示出来的问题.网上翻了一下找到知乎上一篇回答,试了一下好像不行,而且 ...

  7. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  8. Python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

  9. Python数据分析基础PDF

    Python数据分析基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1ImzS7Sy8TLlTshxcB8RhdA 提取码:6xeu 复制这段内容后打开百度网盘手 ...

  10. 《Python数据分析与挖掘实战》读书笔记

    大致扫了一遍,具体的代码基本都没看了,毕竟我还不懂python,并且在手机端的排版,这些代码没法看. 有收获,至少了解到以下几点: 一. Python的语法挺有意思的     有一些类似于JavaSc ...

随机推荐

  1. javascript现代编程之四——数值的进制和表示方法

    在JavaScript中,数值可以以不同的进制表示: 十进制:这是我们最常用的进制系统.例如:let decimal = 123; 二进制:数值前面加上 0b 或者 0B.例如:let binary ...

  2. 力扣445(java&python)-两数相加Ⅱ(中等)

    题目: 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示 ...

  3. CCO x Hologres:实时数仓高可用架构再次升级,双11大规模落地

    ​简介:本文将会介绍今年是如何在去年基础上进行实时数仓高可用架构升级,并成功大规模落地双11. 作者 | 梅酱 来源 | 阿里技术公众号 一 2021年双11总结 2021年阿里巴巴双11期间,由CC ...

  4. 阿里云张振尧:阿里云边缘云驱动5G时代行业新价值

    ​简介:近日,以"5G融合通信趋势下的技术创新"为主题的2021中国增值电信及虚拟运营高峰论坛在北京召开,阿里云边缘云高级产品专家张振尧发表了<阿里云边缘云驱动5G时代行业新 ...

  5. Ingress-Controller高可用方案及多租户场景(21)

    一.Ingress-controller高可用 Ingress Controller 是集群流量的接入层,对它做高可用非常重要,可以基于 keepalive 实现 nginx-ingress-cont ...

  6. Django之路由层、视图层、模板层介绍

    一.Django请求生命周期 1.路由层urls.py Django 1.11版本 URLConf官方文档 1.1 urls.py配置基本格式 from django.conf.urls import ...

  7. 再聊解除HiddenApi限制

    炒冷饭,再聊聊大家都知晓的隐藏接口的限制解除. 说明 由于我们容器产品的特性,需要将应用完整的运行起来,所以必须涉及一些隐藏接口的反射调用,而突破反射限制则成为我们实现的基础.现将我们的解决方案分享给 ...

  8. SAP集成技术(十)混合集成平台

    混合集成平台hybrid integration platform (有时缩写为HIP)这个术语近年来被大量使用,但很多人可能不太清楚它的概念. 内容摘录自<SAP Interface Mana ...

  9. R1_ES知识图谱

    业务量增加,优化..优化... 学习... 学习..... 阮一鸣,eBay Pronto 平台技术负责人,管理了 eBay 内部上百个 Elasticsearch 集群,数据规模超过 4000 节点 ...

  10. 基于三菱Q系列cc-Link的立体仓库控制系统

    系统说明: 方案选择: 工艺流程: 触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了 本文章为学习记录,水平有限,望各路大佬们轻喷!!!    转载请注明出处!!!