目的:使用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. ASP.NET MVC 性能优化和调试

    学习 .NET Core 应用程序的调试技术可以分为以下步骤: 理解基础概念:首先,你需要理解什么是调试以及为什么我们需要调试.理解断点.单步执行.变量监视等基本调试概念. 学习 Visual Stu ...

  2. javascript:eval()的用法

    eval() 是 JavaScript 中的一个全局函数,它可以计算或执行参数.如果参数是表达式,则 eval() 计算表达式:如果参数是一个或多个 JavaScript 语句,则 eval() 执行 ...

  3. LLM开源小工具(基于代码库快速学习/纯shell调用LLM灵活管理系统)

    随着AI的各种信息的发展,LLM各种模型不断涌现,作为一名IT人员不得不向前走,不断探索学习发现新知识. 随着学习,也了解到一些对于模型的调用,从而解决一些问题,或者对已有工具或应用的重写.如下是两个 ...

  4. 如何使用 Serverless Devs 部署静态网站到函数计算(上)

    简介:部署个静态网站到函数计算~ ​ 前言 公司经常有一些网站需要发布上线,对比了几款不同的产品后,决定使用阿里云的函数计算(FC)来托管构建出来的静态网站. FC 弹性实例自带的500 Mb 存储空 ...

  5. [Go] Viper 加载项目配置,go build 打包配置文件进二进制

    Viper 的传统用法局部,加载到某个 package 下的全局变量后,其它 package 可以继续使用. var Conf *viper.Viper func init() { // File n ...

  6. WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况

    本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件将获取不到 Hwnd ...

  7. 不只有 Spring,这四款 Java 基础开发框架同样值得关注! 审核中

    Java 开发不只有 Spring ,今天给大家推荐几个同样优秀的 Java 基础开发框架,为日常项目开发提供更多的选择.答应我,请不要再叫我 Spring 小子了,​好吗? 项目概览: Guice: ...

  8. Listener监听器,实现一个显示在线用户人数

    Listener监听器,实现一个显示在线用户人数 每博一文案 关于后半身,脾气越温,福报越深. 师傅说:惜命最好的方式不是养生,而是管好自己的情绪. 坏毛病都是惯出来的,但好脾气都是磨出来的,与人生气 ...

  9. 11、操作系统安全加固-Windows 加固

    1.账号管理与认证授权 1.1.按用户类型分配账号 目的:根据系统要求,设定不同账户和组,管理员.数据库sa.审计用户.来宾用户等 实施方法: 打开本地用户和计算机管理器 或 打开运行,输入 lusr ...

  10. 安装pyenv-win(windows 环境)支持多个python环境管理

    安装pyenv-win(windows 环境)支持多个python环境管理 https://blog.csdn.net/dair6/article/details/129128240