python毕设选题 - 大数据工作岗位数据分析与可视化 - python flask

文章目录

  • 0 前言
  • 1 课题背景
  • 2 实现效果
  • 3 项目实现
    • 3.1 概括
  • 3.2 Flask实现
    • 3.3 HTML页面交互及Jinja2
  • 4 **完整代码**
  • 5 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于大数据的工作岗位数据分析与可视化

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

1 课题背景

基于python+flask的python岗大数据可视化web系统,可以进行数据交互可视化,主题为python岗位相关大数据分析。

2 实现效果

📗Web_App动作描述

用户点击导航栏四个选项,跳转到想了解的页面

  • 平均月薪
  • 岗位数量
  • 工作经验
  • 最低学历

在这里插入图片描述
用户通过选择器点击想要了解的城市,可显示该城市的相关岗位数量

在这里插入图片描述

鼠标下拉可看文字结论分析

在这里插入图片描述

3 项目实现

3.1 概括

  • 主运行文件为 app.py 文件。
  • static 文件为网页样式。
  • templates 里的map.html系列文件为生成可视化图表的离线文件,作为引用文件。
  • data1.csv 等csv文件为引用的数据文档。csv档 为数据源。

在这里插入图片描述

  • 在flask环境下导入pandaspyecharts实现数据图表交互展示。
  • 写出四个@route,分别呈现为各省python相关岗位平均月薪、各省python相关岗位数量、工作经验与最低要求学历的职位分布数量、最低学历-工作经验与平 均月薪的相关图表展示。
  • df = pd.read_csv('xxx.csv',encoding = 'utf8', index_col="xxx")英文采用单字节编码,部分中文采用双字节编码。
  • 利用.renter/with open导入和打开文件。
  • 调用pyecharts模块作图传输到HTML页面。
  • 使用list字典循环。
  • 使用列表推导式进行取值。

3.2 Flask实现

数据循环

在这里插入图片描述
数据嵌套

在这里插入图片描述
推导式

在这里插入图片描述

条件判断

在这里插入图片描述
数据交互在这里插入图片描述

3.3 HTML页面交互及Jinja2

Jinja2介绍

jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2的优点

jinja2之所以被广泛使用是因为它具有以下优点:

  • 相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
  • 相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
  • 相对于Django模板,jinja2性能更好。
  • Jinja2模板的可读性很棒。

项目代码

在这里插入图片描述

4 完整代码

import random
from calendar import c
from tkinter import Grid

from flask import Flask,render_template,request
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, EffectScatter, HeatMap, Line,Grid
from pyecharts.faker import Faker
from pyecharts.globals import SymbolType
from pyecharts.charts import Pie,Bar

df = pd.read_csv('data1.csv')
app = Flask(__name__)


@app.route('/')
def map() -> 'html':
    a = (
        Map()
            .add("平均月薪", list(zip(df., df.平均月薪)), "china")
            .set_global_opts(
            title_opts=opts.TitleOpts(title="各省python相关岗位平均月薪"),
            visualmap_opts=opts.VisualMapOpts(min_=7164.08, max_=17096.07),
        )
    )
    a.render("./templates/map.html")
    with open("./templates/map.html", encoding="utf8", mode="r") as f:
        map = "".join(f.readlines())
        the_select_province = {'北京':'4924',
                               '上海':'3114',
                               '广东':'3164',
                               '浙江':'1244',
                               '南京':'701',
                               '湖北':'412',
                               '江苏':'450',
                               '福建':'359',
                               '四川':'985',
                               '辽宁':'227',
                               '安徽':'236',
                               '湖南':'239',
                               '山东':'360',
                               '吉林':'88',
                               '江西':'60',
                               '天津':'355',
                               '山西':'417',
                               '陕西':'60',
                               '重庆':'179',
                               '黑龙江':'60',
                               '河南':'477',
                               '贵州':'60',
                               '河北':'60',}

    return render_template('python_map.html',
                           the_map=map,
                           the_province=the_select_province
                           )


element = list(set(most['分类']))



@app.route('/effectscatter_symbol')
def effectscattere_symbol() -> 'html':
    df = pd.read_csv('data2.csv',encoding = 'utf8', index_col="名称")= list(df.loc["省"].values)[-24:]
    数量 = list(df.loc["数量"].values)[-24:]
    value = [[i, j, random.randint(0, 80)] for i in range(24) for j in range(24)]
    c = (
        HeatMap()
            .add_xaxis()
            .add_yaxis("数量", 数量, value)
            .set_global_opts(
            title_opts=opts.TitleOpts(title="各省Python相关岗位数量"),
            visualmap_opts=opts.VisualMapOpts(),
        )
    )
    c.render("./templates/effectscatter_symbol.html")
    with open("./templates/effectscatter_symbol.html", encoding="utf8", mode="r") as f:
        sym = "".join(f.readlines())
        return render_template('python_effectscatter_symbol.html',
                               the_sym=sym,
                               )

        1

        data_pie1 = data_pie.T.to_html()

        pie1_list = [num for num in data_pie['分类']]

        labels = [index for index in data_pie.index]


@app.route('/pie_base')
def pie_base() -> 'html':
    df = pd.read_csv('data3.csv', encoding='utf8')
    bar = (
        Bar()
            .add_xaxis(['不限', '3-5年', '1-3年', '5-10年', '无经验', '一年以下', '10年以上'])
            .add_yaxis("职位数量", [6183, 5164, 4842, 1516, 366, 111, 34])

            .set_global_opts(title_opts=opts.TitleOpts(title="工作经验-职位分布数量"))
    )

    line = (
        Line()
            .add_xaxis(['本科', '大专', '不限', '硕士', '博士', '中专'])
            .add_yaxis("职位数量", [9954, 3704, 3205, 1137, 88, 31])

            .set_global_opts(
            title_opts=opts.TitleOpts(title="最低要求学历-职位分布数量", pos_top="50%"),
            legend_opts=opts.LegendOpts(pos_top="50%"),
        )
    )

    grid = (
        Grid()
            .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%", pos_right="0", height="30%"))
            .add(line, grid_opts=opts.GridOpts(pos_top="60%", pos_right="0", height="30%"))
    )
    bar,line,grid.render("./templates/pie_base.html")
    with open("./templates/pie_base.html", encoding="utf8", mode="r") as f:
        pie_base = "".join(f.readlines())
        return render_template('python_pie_base.html',
                               the_pie_base=pie_base,
                               )

 the_element3 = request.form['the_element3_selected']
    
    print(the_element3)
    
    element3_available = element3
    
    if the_element3 =='广州':
    
    the_level = 广州
    
    elif the_element3 =='上海':
    
    the_level = 上海
    
    elif the_element3 =='北京':
    
    the_level = 北京
    
    else:
       
       the_level = 其它

        
        
        
         def python_most():

    title1 = "最低学历"

    data_pie =  pd.DataFrame(pressure2.loc['最低学历与工作经验的关系']['分类'].value_counts())

    data_pie1 = data_pie.T.to_html()

    pie1_list = [num for num in data_pie['分类']]

    labels = [index for index in data_pie.index]
    
@app.route('/Bar/')
def bar_base() -> Bar:
    df = pd.read_csv('data4.csv', encoding='utf8', index_col="学历")
    最低学历 = list(df.loc["最低学历"].values)[-6:]
    无经验 = list(df.loc["无经验"].values)[-6:]
    一年以下 = list(df.loc["一年以下"].values)[-6:]
    不限 = list(df.loc["不限"].values)[-24:]
    一至三年 = list(df.loc["一至三年"].values)[-24:]
    三至五年 = list(df.loc["三至五年"].values)[-24:]
    五至十年 = list(df.loc["五至十年"].values)[-24:]
    十年以上 = list(df.loc["十年以上"].values)[-24:]
    c = (
        Line()
            .add_xaxis(最低学历)

            .add_yaxis("无经验", 无经验)
            .add_yaxis("一年以下", 一年以下)
            .add_yaxis("不限", 不限)
            .add_yaxis("一至三年", 一至三年)
            .add_yaxis("三至五年", 三至五年)
            .add_yaxis("五至十年", 五至十年)
            .add_yaxis("十年以上", 十年以上)
            .set_global_opts(title_opts=opts.TitleOpts(title="最低学历-工作经验与平均月薪",
                                                       subtitle="平均月薪(元)"))
    )
    c.render("./templates/Bar.html")
    with open("./templates/Bar.html", encoding="utf8", mode="r") as f:
        bar_base= "".join(f.readlines())
        return render_template('python_bar.html',
                               the_bar_base=bar_base,
                               )
 return render_template('first.html',

                        the_title1 = title1,
                        
                        the_select_element1 = element1_available,
                        
                        the_data_pie1 = data_pie1,
                        
                        the_pyecharts_all = plot_all,
                        
                        the_pyecharts_all1 = plot_all1,
                        
                        the_pyecharts_all3 = plot_all3,

5 最后

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】JDBC的使用

JDBC package jdbc_demo;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取…

信道复用技术码分复用 CDM(Code Division Multiplexing)

目录 一、码分复用 CDM(Code Division Multiplexing) 二、码分多址CDMA 三、码片序列的概念 四、码片序列的正交关系 五、CDMA的工作原理 一、码分复用 CDM(Code Division Multiplexing) 常用的名词是码分多址 CDMA (Code Di…

OceanBase集群部署

我认为学习一个中间件比较好的方式是,先了解它的架构和运行原理,然后动手部署一遍,加深对它的了解,再使用它,最后进行总结和分享 本篇介绍OceanBase部署前提条件和集群部署 1.使用开源免费的社区版,企业版…

JS-WebAPIS(四)

日期对象(常用) • 实例化 在代码中发现了 new 关键字时,一般将这个操作称为实例化创建一个时间对象并获取时间 获得当前时间 获得指定时间 • 时间对象方法 使用场景:因为日期对象返回的数据我们不能直接使用,所以…

Yearning存在任意文件读取漏洞

文章目录 前言声明一、Yearning简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Yearning MYSQL SQL语句审核平台。提供查询审计,SQL审核,SQL回滚,自定义工作流等多种功能。该平台存在任意文件读取漏洞。 声明 请勿利用文章内的…

ThinkPad T14/T15/P14s/P15s gen2电脑原厂Win10系统镜像 恢复笔记本出厂时预装自带OEM系统

lenovo联想原装出厂Windows10系统,适用型号: ThinkPad T14 Gen 2,ThinPad T15 Gen 2,ThinkPad P14s Gen 2,ThinkPad P15s Gen 2 (20W1,20W5,20VY,20W7,20W0,20W4,20VX,20W6) 链接&#xff1…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1)Dcm和PduR的交互2)Dcm和ComM模块的交互3)Dcm和Dem的交互4&a…

职能部门的绩效考核改革,解决方案来了

一、客户背景及现状问题 A酒店是酒店行业的龙头企业,其品牌享有很高的知名度。为了适应市场竞争及发展的需要、充分发挥每个员工的积极性,提高企业的整体业绩,该企业于前几年开始实行严格的绩效考核制度。绩效考核实行之初,管理者…

基于Django的Python应用—学习笔记—功能完善

一、让用户可以输入信息 创建forms.py 创建基于表单的页面的方法几乎与前面创建网页一样:定义一个 URL ,编写一个视图函数并编写一个模板。一个主要差别是,需要导入包含表单 的模块forms.py 。 from django import forms from .models impor…

安捷伦E8361A网络分析仪E8361C

安捷伦E8361A网络分析仪 E8361A 是 Agilent 的 67 GHz 网络分析仪。网络分析仪是一种功能强大的仪器&#xff0c;可以以无与伦比的精度测量射频设备的线性特性。许多行业使用网络分析仪来测试设备、测量材料和监控信号的完整性。附加功能&#xff1a; 94 dB 的动态范围和 <…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

Flink实时数仓同步:拉链表实战详解

一、背景 在大数据领域&#xff0c;业务数据通常最初存储在关系型数据库&#xff0c;例如MySQL。然而&#xff0c;为了满足日常分析和报表等需求&#xff0c;大数据平台会采用多种不同的存储方式来容纳这些业务数据。这些存储方式包括离线仓库、实时仓库等&#xff0c;根据不同…

github如果有别人给你的仓库提pull request,该如何验证他的代码并合并

我有一个github仓库&#xff0c;是做抖音直播数据对接的&#xff0c;有很多朋友给我点了star&#xff0c;也有朋友fork了这个仓库&#xff0c;最近接收到一个pull request的请求&#xff0c;他最直播结束的内容作了判断&#xff0c;我该如何在我本地校验它的代码并合并呢&#…

【Linux】03 GCC编译器的使用

一、编译过程 在使用gcc编译程序时&#xff0c;编译过程可以简要划分为4个阶段&#xff1a; 预处理、编译、汇编、链接 1.1 预处理&#xff08;preprocessing&#xff09; 这个阶段主要处理源文件中的#indef、#include和#define预处理命令&#xff1b; 这里主要是把一些include…

Linux 部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量 vim /etc/profile #java environment export JAVA_HOME/root/soft/…

【手撕C语言 第五集】分支和循环(下)

for循环 我们已经知道了while循环&#xff0c;但是我们为什么还要一个for循环呢&#xff1f; 首先来看看for循环的语法&#xff1a; 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判断循环时候终止。 表达式…

《仙剑4》、《仙剑6》双“空降”,这一次,网友的评论“真相了!”

“本以为《仙剑1》只是国产仙侠剧的起点&#xff0c;结果却没想到&#xff0c;它却真正意义上成为了巅峰。” 这一次&#xff0c;网友的评论“真相了&#xff01;” 先说《仙剑四》&#xff0c;这部据说耗资3.4亿的大制作&#xff0c;奈何笔者实在看不出它的“含金量”&#x…

2023 IoTDB Summit:湖南大唐先一科技有限公司主任架构师舒畅《IoTDB 在发电领域的应用实践》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Deepin_Ubuntu_查看树形目录结构(tree)

Linux系统&#xff08;Deepin、Ubuntu&#xff09;中&#xff0c;可以使用tree命令来查看树形目录结构&#xff0c;下面是一些示例&#xff1a; 查看当前目录的树形结构&#xff1a; tree查看指定目录的树形结构&#xff0c;例如/etc/X11/fonts目录&#xff1a; tree /etc/X…

PSoc62™开发板之i2c通信

实验目的 使用模拟i2c接口读取温湿度气压模块BME280数据 实验准备 PSoc62™开发板温湿度气压模块BME280公母头杜邦线 板载资源 本次实验是通过模拟i2c时序的方式来进行通信&#xff0c;理论上可以有非常多的方式配置i2c引脚&#xff0c;不像硬件i2c那样芯片出厂引脚已经固…