flask + Pandas + echarts 使用饼状图等将二手房数据进行分析+可视化

news2024/11/18 10:29:08

目录

一、实战场景

二、知识点

python 基础语法

python 文件读写

pandas 数据处理

flask web 框架

echarts 图表

bootstrap

jinja 模版

三、菜鸟实战

初始化 Flask 框架,设置路由

各行政区房屋数量柱状图分析

区域二手房房源朝向分布情况

二手房单价最高Top10 图

echarts 渲染房屋数量柱状图

运行结果

运行截图

数据示例


一、实战场景

flask + Pandas + echarts 使用饼状图等将二手房数据进行分析+可视化

二、知识点

python 基础语法

python 文件读写

pandas 数据处理

flask web 框架

echarts 图表

bootstrap

jinja 模版

三、菜鸟实战

初始化 Flask 框架,设置路由

'''
Description: 分页读取并显示 csv 文件数据
'''
from math import ceil
import csv
import json

from flask import Flask, render_template, request, redirect, jsonify
from spiders.file_manager import FileManager

# 初始化框架
web = Flask(__name__)


@web.route('/')
def index():
    # 首页
    return redirect('/list')


@web.route('/table/<int:page_num>')
def table(page_num):
    # 分页读取并显示 csv 文件数据
    file_manager = FileManager()
    file = file_manager.get_data_file_path("tao365_detail.csv")

    # 若不指定limits默认为 5
    limits = request.args.get('limits', 5, type=int)

    def show_csv(reader, page=page_num, limits=limits):
        # 内部函数,根据limits和所在页数生成数据
        df = []
        for row in reader:
            if page_num * limits >= (reader.line_num - 1) > (page_num - 1) * limits:
                df.append(row)

        return df

    with open(file, 'r+', encoding='utf-8') as f:
        # 计算页面数
        row_length = len(f.readlines()) - 1
        pages = int(ceil(row_length / limits))

    with open(file, 'r+', encoding='utf-8') as f:
        # 计算数据
        reader = csv.reader(f)
        next(reader)
        df = show_csv(reader, page_num, limits)

    # 加载模版和模版数据
    return render_template('table.html', df=df, pages=pages, page_num=page_num, limits=limits)


@web.route('/table_detail')
def table_detail():
    # 二手房详情
    row = request.args.get('row').split(',')
    return render_template('table_detail.html', row=row)

@web.route('/list')
def list_house():
    # 二手房列表
    return render_template('list.html')

@web.route('/chart1')
def chart1():
    # 柱状图
    return render_template('chart1.html')

@web.route('/chart2')
def chart2():
    # 横向柱状图
    return render_template('chart2.html')

@web.route('/chartBie')
def chartBie():
    # 饼图
    return render_template('chartBie.html')

@web.route('/chart_data')
def chart_data():
    # 获取图标数据

    # 图标类型
    type = request.args.get("type")

    # 二手房数据
    file_name = 'chart00' + type+'.json'
    file_manager = FileManager()
    file = file_manager.get_data_file_path(file_name)
    # file = os.path.join(config.DATA_DIR,'chart00'+ type+'.json' )
    with open(file, encoding='utf8') as fp:
        data_list = json.load(fp)

    return jsonify(data_list)


# 启动 flask web 框架
web.run(debug=True)

各行政区房屋数量柱状图分析

def chart002(self):
    # 柱状图 - 展示各行政区房屋数量

    # 读取清洗后的数据文件
    result_df = self.read_clean_result_file()

    # 从字典对象导入数据
    df = pd.DataFrame(result_df)

    # 将数据根据地址分组
    g = df.groupby('地址')

    # 统计分组后的数量
    df_region = g.count()['小区']

    # 获取分组后的地址数据
    address = df_region.index.tolist()

    # 获取分组后的数量
    count = df_region.values.tolist()

    # 定义表格顶部title
    title = "各行政区房屋数量"

    # 定义表格顶部说明
    text = self.top_text

    # 定义图表title
    chart_title = '各行政区房屋数量'

    # 图表横坐标
    chart_x = '所在地区'

    # 图表纵坐标
    chart_y = '房源数量/套'

    # 图表单位
    unit = '套'

    # 图表类型
    types = 'bar'

    # 组装图表json数据
    data_json = {
        'data1': address,
        'data2': count,
        'title': title,
        'text': text,
        'chartTitle': chart_title,
        'chartX': chart_x,
        'chartY': chart_y,
        'unit': unit,
        'type': types
    }

    #  将json数据写入文件
    with open('../data/chart002.json', 'w', encoding='utf-8') as write_f:  # 打开本地文件

        json.dump(data_json, write_f, indent=4, ensure_ascii=False)  # python对象转换成json对象

区域二手房房源朝向分布情况

def chart005(self):
    # 柱状图 - 南京各区域二手房房源朝向
    
    # 读取清洗后的数据文件
    result_df = self.read_clean_result_file()

    # 从字典对象导入数据
    df = pd.DataFrame(result_df)

    # 将数据根据房屋朝向分组
    g = df.groupby('房屋朝向')

    # 统计分组后的数量
    df_region = g.count()['小区']

    # 获取分组后的房屋朝向分组数据
    address = df_region.index.tolist()

    # 获取分组后的房屋朝向数量
    count = df_region.values.tolist()

    # 定义表格顶部title
    title = "区域二手房房源朝向分布情况"

    # 定义表格顶部说明
    text = self.top_text

    # 定义图表说明
    chart_title = '各区域二手房房源朝向分布情况'

    # 定义图表横坐标
    chart_x = ''

    # 定义图表纵坐标
    chart_y = '建筑面积(㎡)'

    # 定义单位
    unit = ''

    # 定义图表类型
    types = 'bar'

    # 组装图表json数据
    data_json = {
        'data1': address,
        'data2': count,
        'title': title,
        'text': text,
        'chartTitle': chart_title,
        'chartX': chart_x,
        'chartY': chart_y,
        'unit': unit,
        'type': types
    }

    #  将json数据写入文件
    with open('../data/chart005.json', 'w', encoding='utf-8') as write_f:  # 打开本地文件

        json.dump(data_json, write_f, indent=4, ensure_ascii=False)  # python对象转换成json对象

二手房单价最高Top10 图

def chart008(self):
    # 横向柱状图 - 各面积区间房屋数量占比图
    
    # 读取清洗后的数据文件
    result_df = self.read_clean_result_file()

    # 从字典对象导入数据
    df = pd.DataFrame(result_df)

    # 取出每平方价格列前10的数据
    top_price = df.sort_values(by="每平方价格", ascending=False)[:10]
   
    # 取出每平方价格列前10的小区数据
    area0 = top_price['小区'].values.tolist()

    # 取出每平方价格列前10的价格数据
    count = top_price['每平方价格'].values.tolist()

    arr = []

    color_arr = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22",
                 "#17becf"
                 ]
    for k, i in enumerate(count):
        arr.append({'value': i, 'itemStyle': {'color': color_arr[k]}})
    # 定义表格顶部title
    title = "二手房单价最高Top10"

    # 定义表格顶部说明
    text = self.top_text

    # 图表title
    chart_title = '二手房单价最高Top10'

    # 组装图表json数据
    data_json = {
        'data1': area0,
        'data2': arr,
        'title': title,
        'text': text,
        'chartTitle': chart_title,
    }

    #  将json数据写入文件
    with open('../data/chart008.json', 'w', encoding='utf-8') as write_f:  # 打开本地文件

        json.dump(data_json, write_f, indent=4, ensure_ascii=False)  # python对象转换成json对象

echarts 渲染房屋数量柱状图

function drawCharts(data) {
    var optionMap = {
        title: {
            text: data.chartTitle,
            left: 'center',
        },
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'shadow'
            },
        },
        toolbox: {
            feature: {
                saveAsImage: {
                    title: ''
                }
            }
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: {
            type: 'value',
            boundaryGap: [0, 0.01]
        },
        yAxis: {
            type: 'category',
            data: data.data1
        },
        series: [{
            type: 'bar',
            data: data.data2
        }, ]
    };
    //初始化echarts实例
    var myChart = echarts.init(document.getElementById('dom1'));

    //使用制定的配置项和数据显示图表
    myChart.setOption(optionMap);

}

运行结果

运行截图

* Serving Flask app 'app_tao06'

* Debug mode: on

* Running on http://127.0.0.1:5000

浏览器中打开 http://127.0.0.1:5000

数据示例

各区域房源朝向分布情况

各区域房屋数量统计

二手房户型占比统计

二手房单价最高Top10

菜鸟实战,持续学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Higress Kruise Rollout: 渐进式交付为应用发布保驾护航

作者&#xff1a;扬少 前言 在业务高速发展过程中&#xff0c;如何最大化保障功能迭代过程中业务流量无损一直是开发者比较关心的问题。通常在应用发布新功能阶段&#xff0c;我们会采用灰度发布的思想对新版本进行小流量验证&#xff0c;在符合预期之后再进行全量发布&#…

11、JS笔记-内置对象

1.内置对象 js中对象分为三种&#xff1a; 自定义对象、内置对象、浏览器对象&#xff08;js独有&#xff09; 内置对象&#xff1a; js语言自带的对象&#xff0c;供开发者使用&#xff0c;提供一些常用或基本的功能&#xff08;属性和方法&#xff09; 2.Math对象 Math中所…

【云原生】k8s配置资源管理

内容预知 1.Secret的资源配置 1.1 Secret配置的相关说明 1.2 陈述式创建Secret配置 1.3 声明式base64编码创建Secret 1.4 将secret以volume形式挂载到pod中 1.5 将Secret导入到pod中&#xff0c;充当环境变量 1.6 实战运用&#xff1a;使用secret配置免密交互拉取habor…

Qt之对话框

文章目录一、对话框的概念二、与QWidget的区别三、对话框2种显示方法四、对话框返回值的概念本节示例提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、对话框的概念 对话框是和用户简短交互的一种窗口。如&#xff1a;登录界面&#xff0c;关于界面…

知识付费图文音视频课程公众号系统开发

知识付费图文音视频课程公众号系统开发 功能特性;为你介绍音视频课程点播系统的功能特性。 微信H5;目前只支持微信公众号H5访问。 课程管理;后台可上传多个课程分类与课程。 名师推荐;后台可以维护教师列表&#xff0c;并推荐到首页显示。 分享海报;可以自定义多个分享海报。 …

Maven在项目里的具体使用方式,很简单

大家好&#xff0c;今天给大家分享一下Maven在项目里的*具体使用方式* 有关于maven这个东西&#xff0c;要知道&#xff0c;它的作用是帮助开发人员&#xff08;也就是我们&#xff09;批量的管理jar包 所谓对jar包批量管理&#xff0c;有一个很重要的点&#xff0c; 就是对于…

2022年CSDN年终总结:一个新晋研究生的遗憾与成长

目录0 遗憾1 顺利完成毕业设计2 转向垂类写作3 C站成长4 组织社区活动5 新年新flag0 遗憾 2022年有很多遗憾 其一&#xff0c;毕业的遗憾。3月疫情席卷上海&#xff0c;封校封寝、静态网格&#xff0c;每天从上床到下桌两点一线&#xff0c;5月窗口期身着防护服撤离上海&…

云原生|kubernetes|pod或容器的安全上下文配置解析

前言&#xff1a; 安全上下文&#xff08;Security Context&#xff09;定义 Pod 或 Container 的特权与访问控制设置。 安全上下文包括但不限于&#xff1a; 自主访问控制&#xff08;Discretionary Access Control&#xff09;&#xff1a; 基于用户 ID&#xff08;UID&…

【PAT甲级 - C++题解】1091 Acute Stroke

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;PAT题解集合 &#x1f4dd;原题地址&#xff1a;题目详情 - 1091 Acute Stroke (pintia.cn) &#x1f511;中文翻译&#xff1a;急性中风 &#x1f4e3;专栏…

SAP灵活工作流Inbox收件箱数据展示

目录 任务说明展示流程内容 使用增强添加文本展示流程内容 自定义页面展示 任务说明展示流程内容 维护审批任务说明页签下的任务说明&#xff0c;支持多语种&#xff0c;支持使用变量&#xff1b; 变量只能使用容器中定义的变量&#xff0c;因此需要将要展示的数据绑定传输到…

【包装机】(队列+栈)

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

C++动态链接库的使用

目录一 创建Windows动态链接库二 导出和查看DLL中的函数三 隐式链接方式加载DLL四 动态库和测试程序共用一份头文件五 从DLL中导出C类六 解决名称改编七 显式加载方式加载DLL一 创建Windows动态链接库 新建项目&#xff0c;选择Windows桌面向导&#xff0c;命名项目名称为Dll1…

GPDB中gp_vmem_protect_limit参数的意义

gp_vmem_protect_limit参数的意义1、gp_vmem_protect_limit参数说明1)在启用了基于资源队列的资源管理系统时&#xff0c;gp_vmem_protect_limit参数表示每个segment分配到的内存大小。预估值计算方式&#xff1a;所有GP数据库进程可用内存大小/发生故障时最大的primary segmen…

最优控制学习笔记2----泛函

文章目录泛函泛函定义泛函的变分自变量的变分泛函相近泛函距离泛函的连续性线性泛函泛函的变分泛函的极值泛函极值的定义泛函的极值泛函极值条件泛函 泛函定义 对于某一类函数集合{x(t)}\{x(t)\}{x(t)} 中的每一个函数 x(t)x(t)x(t), 在映射关系 JJJ 下均有一个确定的数与之对…

100天精通Python(数据分析篇)——第71天:Pandas文本数据处理方法之str/object类型转换、大小写转换、文本对齐、获取长度、出现次数、编码

文章目录每篇前言1. 文本数据类型介绍1&#xff09;类型介绍2&#xff09;类型转换3&#xff09;类型区别区别1&#xff1a;统计字符串时区别2&#xff1a;检查字符串时2. Python字符串内置方法1) 大小写转换2) 文本对齐3&#xff09;获取长度4&#xff09;获取出现次数5&#…

js 右键弹出自定义菜单

演示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{margin…

Node.JS(2)--使用node执行js文件

目录 知识回顾 CommentJS规范 ECMAScript标准规范 模块化 CommonJS规范 模块化 知识回顾 I/O (Input/output) I/O操作指的是对磁盘的读写操作 Node Node是对ES标准一个实现&#xff0c;Node也是一个JS引擎通过Node可以使js代码在服务器端执行Node仅仅对ES标准进行了实…

“程序的编译+链接”,深入认识代码生成可执行程序的过程

目录 引入 编译 预编译 编译 汇编 链接 选项总结 记忆方法 运行环境 引入 博主认为学习本章内容&#xff0c;能够认识在代码跑的时候的过程。 首先&#xff0c;粗略笼统的认识程序运行过程的框架图。 编译 其次&#xff0c;再进行细化&#xff0c;细化编译的过程&…

人工智能轨道交通行业周刊-第29期(2023.1.2-1.8)

本期关键词&#xff1a;站台限界测量机器人、智慧云巴、钢轨伸缩调节器、国铁集团会议、4D毫米波雷达、车道线检测1 整理涉及公众号名单1.1 行业类RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道…

node.js+mysql博客全栈系统源码+数据库,含后台完整基础功能,小程序,web前台站点一键置灰,支持移动端适

一个 "开箱即用" 个人博客全栈系统项目&#xff01;下载地址&#xff1a;node.jsmysql博客全栈系统源码数据库 &#x1f96f; 预览 &#x1f440; 前台预览 &#x1f440; 管理端预览 &#x1f96f; v1.0.2 介绍 芒果’个人博客系统&#xff0c;包括前后台完整基…