首页 > 其他分享 >深圳链家房价数据分析与可视化

深圳链家房价数据分析与可视化

时间:2023-03-20 17:46:11浏览次数:47  
标签:数据分析 房价 链家 html 可视化 csv data opts

  1. 项目概述

1.1目的和意义

随着经济的发展,北、上、广、深这四大都市迅速发展,在经济、政治等方面有突出的表现,而且工作机会多,生活质量较高,是大多数人所向往的地方。想要在这些城市定居,购买房子是一个可以选择的方案,说到这我们一定会想了解这些地区的房源大概情况。所以本项目是对深圳链家房源进行的分析,希望可以帮助部分人解决购房问题,从多维度出发分析,帮助买家拿定主意,实现合理的购房。而本项目主要是利用Python语言对深圳链家房源数据进行分析,通过数据可视化了解深圳的房源情况,对人们购房做出指导。

1.2项目概述

本项目主要实现了在深圳链家所有房价面积数据分析与可视化和户型分布分析与可视化,并依据深圳各区房价进行了均价地图绘制,可以直观的了解房源信息,而且对房价做了小区房价排名Top10,依据这些可以了解圳房源的大体情况,并通过对不同行政区、不同户型、不同朝向进行分析来了解,直观的了解优质房源有哪些,来选择选择合适的房源。对于本项目运用的核心技术有pyecharts、pandas、bs4、request。

  1. 需求分析

2.1数据需求分析

本项目为深圳房价数据的可视化与需求分析,数据主要需求为:深圳的房价信息对的获取与整理。为了对深圳的房价获取到有时效性以及准确的房价信息,我们采取的项目数据为深圳链家房价的全部数据。包括房源的地址信息,楼盘的销售信息,楼盘户型、价格及面积信息,对以上内容都进行了数据的有效整合。完善数据的结构,及整合。

2.2可视化需求分析

在需求分析方面已提取到足量的信息,对于以获得的信息,进行可视化操作。可视化需求为根据已有的房价、面积、户型及地区房价均价为切入口。项目设此四项为可视化需求:

(1)链家房价面积数据分析与可视化;

(2)深圳各行政区均价地图绘制;

(3)深圳小区房价Top10榜;

(4)户型分布分析与可视化。

  1. 方案设计

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

相关文章

  • 可视化面板
    应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。一、使用技术完成该......
  • 数据分析5
    importpandasaspdimportmatplotlib.pyplotaspltinputfile=r"C:\Users\admin\Documents\WeChatFiles\wxid_b0fz4hqogenr22\FileStorage\File\2023-03\original_data.......
  • 智慧大棚数据可视化物联网系统 构建高效农业
    农业的发展离不开农作物的生长,而农作物的生长会受到多方面的限制,主要是外界因素,因此,智慧农业便将传统农业与科技结合起来,衍生出智慧大棚,从而让农业得以快速发展。建设背景我......
  • 数字农业:智慧农业三维可视化物联网系统
    农业的发展离不开农作物的生长,而农作物的生长会受到多方面的限制,主要是外界因素,因此,智慧农业便将传统农业与科技结合起来,衍生出智慧大棚,从而让农业得以快速发展。建设背景......
  • 数据分析-商品零售购物篮关联规则模型
    查看数据特征importnumpyasnpimportpandasaspdinputfile='D:/人工智能&软件工程/数据挖掘与分析/data/GoodsOrder.csv'#输入的数据文件data=pd.read_......
  • 第四周——商品数据分析
    importpandasaspdinputfile1=r"D:\Weixin\WeChatFiles\wxid_cg9y4qd0yxhb22\FileStorage\File\2023-03\GoodsOrder.csv"inputfile2=r"D:\Weixin\WeChatFiles\w......
  • 数据分析第八章
    商品零售购物篮分析#%%查看数据特征importnumpyasnpimportpandasaspdinputfile=r"D:\py_project\a_三下\GoodsOrder.csv"#输入的数据文件data=pd.r......
  • 第四周数据分析
    importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltinputfile='E:/桌面/data/GoodsOrder.csv'data=pd.read_csv(inputfile,encoding='gbk',engi......
  • 商品数据分析
    importnumpyasnpimportpandasaspdinputfile='D://人工智能//GoodsOrder.csv'data=pd.read_csv(inputfile,encoding='gbk')data.info()data=data['id'......
  • 商品数据分析
    importnumpyasnpimportpandasaspdinputfile=r'C:\Users\admin\Desktop\新建文件夹\GoodsOrder.csv'#输入的数据文件data=pd.read_csv(inputfile,encodi......