- 项目概述
1.1目的和意义
随着经济的发展,北、上、广、深这四大都市迅速发展,在经济、政治等方面有突出的表现,而且工作机会多,生活质量较高,是大多数人所向往的地方。想要在这些城市定居,购买房子是一个可以选择的方案,说到这我们一定会想了解这些地区的房源大概情况。所以本项目是对深圳链家房源进行的分析,希望可以帮助部分人解决购房问题,从多维度出发分析,帮助买家拿定主意,实现合理的购房。而本项目主要是利用Python语言对深圳链家房源数据进行分析,通过数据可视化了解深圳的房源情况,对人们购房做出指导。
1.2项目概述
本项目主要实现了在深圳链家所有房价面积数据分析与可视化和户型分布分析与可视化,并依据深圳各区房价进行了均价地图绘制,可以直观的了解房源信息,而且对房价做了小区房价排名Top10,依据这些可以了解圳房源的大体情况,并通过对不同行政区、不同户型、不同朝向进行分析来了解,直观的了解优质房源有哪些,来选择选择合适的房源。对于本项目运用的核心技术有pyecharts、pandas、bs4、request。
- 需求分析
2.1数据需求分析
本项目为深圳房价数据的可视化与需求分析,数据主要需求为:深圳的房价信息对的获取与整理。为了对深圳的房价获取到有时效性以及准确的房价信息,我们采取的项目数据为深圳链家房价的全部数据。包括房源的地址信息,楼盘的销售信息,楼盘户型、价格及面积信息,对以上内容都进行了数据的有效整合。完善数据的结构,及整合。
2.2可视化需求分析
在需求分析方面已提取到足量的信息,对于以获得的信息,进行可视化操作。可视化需求为根据已有的房价、面积、户型及地区房价均价为切入口。项目设此四项为可视化需求:
(1)链家房价面积数据分析与可视化;
(2)深圳各行政区均价地图绘制;
(3)深圳小区房价Top10榜;
(4)户型分布分析与可视化。
- 方案设计
3.1总体方案设计
本次项目的实现分为两个阶段:
(1)房价数据爬取;
(2)数据可视化。
房价数据爬取实现项目的方案有:
1.urllib/requests+bs4;
2.selenium模拟爬虫
数据可视化阶段实现项目方案有:pandas、pyecharts
最终选取方案为房价数据爬取实现项目的方案:requests+bs4;数据可视化阶段实现项目方案:pandas+pyecharts。通过requests+bs4对深圳链家房源数据爬取,通过pandas进行数据分析。使用pyecharts进行可视化操作。
3.2功能设计
(1)链家房价面积数据分析与可视化。
(2)深圳各行政区均价地图绘制。
(3)深圳小区房价Top10榜。
(4)户型分布分析与可视化。
(5)一体化大屏展示
表1 项目实施计划
时间周期 |
计划 |
具体工作 |
7.18 |
链家网数据爬取与追加 |
获取所在地区名、房价、户型、面积等数据 |
7.19 |
可视化分析 |
链家房价面积数据分析与可视化,小区房价排名Top10的可视化 |
7.20 |
可视化分析 |
户型分布分析与可视化,各区均价地图绘制 |
7.21 |
测试优化 |
项目测试,整合图表,文档提交 |
7.22 |
项目答辩 |
项目答辩 |
4.2项目实施效果展示
(1)面积房价数据及可视化实现效果如图所示:
(2)各区均价地图绘制实现效果如图所示:
(3)小区房价Top10实现效果图如图所示:
(4)户型分布分析与可视化实现效果如图所示:
(5)整体实现效果如图所示:
5.项目测试
5.1测试目的
为了确保最终项目功能符合用户的需求,把尽可能多的问题在项目提交之前发现并改正。一般要达到下列目标:
1.确保产品是健壮的和适应用户环境的健壮性即稳定性,是产品质量的基本要求,尤其对于一个用于事务关键或时间关键的工作环境中。另外就是不能假设用户的环境,如:报业用户许多配置是比较低的,而且是和某些第三方产品同时使用的;
2、确保产品满足性能和效率的要求使用起来系统运行效率低、或用户界面不友好、用户操作不方便的产品不能说是一个有竞争力的产品。
5.2测试用例
将源码文件和代码运行生成的文件放至不同主机中可以正常运行与显示,运行图如图所示:
6.数据爬取:
# 数据爬取拼接
import requests
from bs4 import BeautifulSoup
import urllib.request
import csv
with open("lianjia_data(1).csv","a",encoding="utf-8",newline="") as file:
f=csv.writer(file)
text=[]
for i in range(1,36):
url="https://sz.fang.lianjia.com/loupan/pg%d/"%i
# print(url)
response=requests.get(url,headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36"})
# print(response.status_code)
soup=BeautifulSoup(response.content,"html5lib")
# print(soup)
x_title=soup.find_all("div",attrs={"class":"resblock-desc-wrapper"})
for i in x_title:
# print(i)
community=i.find("div",attrs={"class":"resblock-name"}).find("a").text
# print(community)
area=i.find("div",attrs={"class":"resblock-location"}).find_all("span")[0].text
# print(area)
position = i.find("div",attrs={"class":"resblock-location"}).find_all("span")[1].text
# print(position)
unit_price = i.find("div", attrs={"class": "main-price"}).find_all("span")[0].text
# print(unit_price)
xingxi=("",area,"",community,position,"","",unit_price)
text.append(xingxi)
f.writerows(text)
数据可视化:
from pyecharts import options as opts
import pandas as pd
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar,Scatter,Pie,Map
import random
def bar():
data = pd.read_csv("lianjia_data.csv")
temp = data.groupby("community")["unit_price"].agg(["mean", "count"]).reset_index()
# print(temp)
community_mean = [
[row["community"], round(row["mean"] / 10000, 1)]
if row["count"] >= 3
else [row["community"], 0]
for _, row in temp.iterrows()
]
result = sorted(community_mean, key=lambda x: x[1], reverse=True)[0:10]
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis([x[0] for x in result[::-1]]) # 小区名字
.add_yaxis("深圳小区房价top前10", [x[1] for x in result[::-1]]) # 单价均值
.set_global_opts(
title_opts=opts.TitleOpts(title="深圳小区房价top前10"),
# 提示框
tooltip_opts=opts.TooltipOpts(is_show=True),
)
.set_series_opts(label_opts=opts.LabelOpts(position="insideRight"))
.reversal_axis() # 反转xy轴
)
# bar.render("深圳小区房价top前10.html")
return bar
def scatter():
data=pd.read_csv("lianjia_data.csv")
scatter=(
Scatter(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(data["hourseSize"])
.add_yaxis(series_name="房价面积散点图",y_axis=data["total_price"])
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=False
),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(
type_="max",
name="最贵的房子"
),
opts.MarkPointItem(
type_="min",
name="最便宜的房子"
)
]
)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="value",
name="面积/m2"
),
yaxis_opts=opts.AxisOpts(
type_="value",
name="总价/万"
),
visualmap_opts=opts.VisualMapOpts(
is_show=True,
min_=50,
max_=3000
)
)
# .render("面积房价散点图.html")
)
return scatter
def pie():
data=pd.read_csv("lianjia_data.csv",encoding="utf-8")
#根据户型计数再排序 area表示各个户型数量区
data_repair=data.groupby("hourseType")["area"].count().reset_index()
# print(data_repair)
#筛选数据
temp=[[row["hourseType"],row["area"]] for _,row in data_repair.iterrows()]
result=sorted(temp,key=lambda x:x[1],reverse=True)[0:10]
pie=(
Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("",
result,
radius=["30%","75%"],
center=["50%","50%"],rosetype="area"
)
.set_global_opts(title_opts=opts.TitleOpts(title="户型分布"))
.set_series_opts(
label_opts=opts.LabelOpts(
formatter="{b}:{d}%"
)
)
# .render("户型分布图.html")
)
return pie
def map():
data=pd.read_csv("lianjia_data.csv")
data_repair=data.groupby("area")["unit_price"].mean().reset_index()
result=[[value["area"],round(value["unit_price"]/10000,1)] for _,value in data_repair.iterrows()]
# print(result)
map=(
Map(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add("深圳各区均价",result,"深圳")
.set_global_opts(
title_opts=opts.VisualMapOpts(
is_show=True,
min_=3,
max_=10
)
# ).render("深圳各区均价.html")
)
)
return map
def tab0(name, color):
c = (
Pie().
set_global_opts(
title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(color=color, font_size=20))
)
)
return c
from pyecharts.charts import Page
page = Page()
page.add(
bar(),
scatter(),
pie(),
map(),
tab0("房价数据可视化","#00ffcc"),
)
page.render("datacenter.html")
from bs4 import BeautifulSoup
with open("datacenter.html", "r+", encoding='utf-8') as html:
html_bf = BeautifulSoup(html, 'lxml')
divs = html_bf.select('.chart-container')
divs[0]["style"] = "width:40%;height:45%;position:absolute;top:5%;left:3%;"
divs[1]["style"] = "width:42%;height:43%;position:absolute;top:55%;left:3%;"
divs[2]["style"] = "width:62%;height:42%;position:absolute;top:5%;left:40%;"
divs[3]["style"] = "width:55%;height:50%;position:absolute;top:45%;left:45%;"
body = html_bf.find("body")
body["style"] = "background-image:url(b.jpg) "
html_new = str(html_bf)
html.seek(0, 0)
html.truncate()
html.write(html_new)
html.close()
标签:数据分析,房价,链家,html,可视化,csv,data,opts From: https://www.cnblogs.com/czc11/p/17237117.html