竞赛选题 大数据疫情分析及可视化系统

文章目录

  • 0 前言
  • 2 开发简介
  • 3 数据集
  • 4 实现技术
    • 4.1 系统架构
    • 4.2 开发环境
    • 4.3 疫情地图
      • 4.3.1 填充图(Choropleth maps)
      • 4.3.2 气泡图
    • 4.4 全国疫情实时追踪
    • 4.6 其他页面
  • 5 关键代码
  • 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 大数据疫情分析及可视化系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

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

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

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 开发简介

学长从各省累计确诊人数随时间增长的态势以及空间分布随时间增长的态势入手,利用所收集的数据将各省累计确诊人数的时空分布用地图、折线图、堆叠条形图的形式呈现出来,从总体态势进行大致分析,然后再通过在不同粒度上展示各省疫情相关的详细信息,以发现其在不同时间段影响其态势变化的原因(境外输入、相关政策颁布等)。

同时还将疫情相关确诊、死亡等数据与各省的GDP、受教育程度、城镇化率、医疗卫生水平进行联系,以发现其与GDP、受教育程度、城镇化率之间是否存在关系。

其目标用户是政府等防控机关,通过本系统可以分析疫情时空分布模式、监控疫情发展态势、评估疫情防控措施。

3 数据集

数据源于爬虫与手动搜集:

weibo.json 新浪微博实时热搜前50的数据

在这里插入图片描述

ProvinceData.json 省市疫情详情

在这里插入图片描述
源于中国国家统计局(2018年中国统计年鉴)的数据

2020-01-10至2020-02-06数据来自国家,各省,武汉市卫健委疫情公告,2020-02-07后数据从今日头条接口采集
在这里插入图片描述
在这里插入图片描述
境外输入数据(手动从网上新闻中搜集)

在这里插入图片描述

4 实现技术

4.1 系统架构

在这里插入图片描述

4.2 开发环境

  • 1、Node.js(前端Vue和后端node都依赖该环境)
  • 2、开发工具:Git,vscode,Hbuilder,pycharm
  • 3、开发语言:Python,HTML+CSS+JavaScript
  • 4、重点依赖库:echarts,bootstrap,jQuery

4.3 疫情地图

新型冠状病毒肺炎已经开始全球蔓延,形势越来越严峻,我们除了关注国内发展疫情发展,也开始关注境外疫情的发展变化。通过地理可视化我们能够很直观的看到的各个区域的疫情严重程度。

4.3.1 填充图(Choropleth maps)

  • 填充图适合表达区域之间的差异。
  • 填充图能够很好的展现形全局差异,细微的差异很难表达。
  • 但填充图的展现效果受区域面积影响比较大,容易形成误导

在这里插入图片描述

上面的填充图,我们可以关注到亚洲,欧洲,美洲三大疫情区域,但是我们很难关注到,意大利、韩国的疫情严重程度。

4.3.2 气泡图

气泡图使用不同大小的圆圈表示区域上的数值。它在每个地理坐标上显示一个气泡,或在每个区域显示一个气泡。

下图我们以气泡图形式进行疫情地图可视化

在这里插入图片描述

通过气泡图我们可以很明确的看出世界上疫情比较严重的国家,而且不会受到区域面积的干扰,欧洲一些面积比较小的国家我们也能够清晰的识别出来。气泡图表达方式缺点在于气泡过多,过大将会产生遮盖现在。
气泡是一种比较好的展现形式,如果使用方式不当也会产生干扰,比如数据映射方法选择,颜色色带选择都会影响数据表达的结果。

关键代码:


# 作者:丹成学长 q746876041
import json
import requests
import jsonpath
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType,RenderType
# 1.目标网站
url=‘https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist’
# 2.请求资源
resp=requests.get(url)
# 3.提取数据
# 类型转换 json–>dict
data=json.loads(resp.text)
name = jsonpath.jsonpath(data,“KaTeX parse error: Expected 'EOF', got '#' at position 14: ..name") #̲ print(name) ……confirm”)
# print(confirm)
data_list = zip(name,confirm)
# print(list(data_list))
# 4.可视化 matplotlib 和 pyecharts

nameMap = {'Singapore Rep.':'新加坡','Dominican Rep.':'多米尼加','Palestine':'巴勒斯坦','Bahamas':'巴哈马','Timor-Leste':'东帝汶','Afghanistan':'阿富汗','Guinea-Bissau':'几内亚比绍',"Côte d'Ivoire":'科特迪瓦','Siachen Glacier':'锡亚琴冰川',"Br. Indian Ocean Ter.":'英属印度洋领土','Angola':'安哥拉','Albania':'阿尔巴尼亚','United Arab Emirates':'阿联酋','Argentina':'阿根廷','Armenia':'亚美尼亚','French Southern and Antarctic Lands':'法属南半球和南极领地','Australia':'澳大利亚','Austria':'奥地利','Azerbaijan':'阿塞拜疆','Burundi':'布隆迪','Belgium':'比利时','Benin':'贝宁','Burkina Faso':'布基纳法索','Bangladesh':'孟加拉国','Bulgaria':'保加利亚','The Bahamas':'巴哈马','Bosnia and Herz.':'波斯尼亚和黑塞哥维那','Belarus':'白俄罗斯','Belize':'伯利兹','Bermuda':'百慕大','Bolivia':'玻利维亚','Brazil':'巴西','Brunei':'文莱','Bhutan':'不丹','Botswana':'博茨瓦纳','Central African Rep.':'中非','Canada':'加拿大','Switzerland':'瑞士','Chile':'智利','China':'中国','Ivory Coast':'象牙海岸','Cameroon':'喀麦隆','Dem. Rep. Congo':'刚果民主共和国','Congo':'刚果','Colombia':'哥伦比亚','Costa Rica':'哥斯达黎加','Cuba':'古巴','N. Cyprus':'北塞浦路斯','Cyprus':'塞浦路斯','Czech Rep.':'捷克','Germany':'德国','Djibouti':'吉布提','Denmark':'丹麦','Algeria':'阿尔及利亚','Ecuador':'厄瓜多尔','Egypt':'埃及','Eritrea':'厄立特里亚','Spain':'西班牙','Estonia':'爱沙尼亚','Ethiopia':'埃塞俄比亚','Finland':'芬兰','Fiji':'斐','Falkland Islands':'福克兰群岛','France':'法国','Gabon':'加蓬','United Kingdom':'英国','Georgia':'格鲁吉亚','Ghana':'加纳','Guinea':'几内亚','Gambia':'冈比亚','Guinea Bissau':'几内亚比绍','Eq. Guinea':'赤道几内亚','Greece':'希腊','Greenland':'格陵兰','Guatemala':'危地马拉','French Guiana':'法属圭亚那','Guyana':'圭亚那','Honduras':'洪都拉斯','Croatia':'克罗地亚','Haiti':'海地','Hungary':'匈牙利','Indonesia':'印度尼西亚','India':'印度','Ireland':'爱尔兰','Iran':'伊朗','Iraq':'伊拉克','Iceland':'冰岛','Israel':'以色列','Italy':'意大利','Jamaica':'牙买加','Jordan':'约旦','Japan':'日本','Japan':'日本本土','Kazakhstan':'哈萨克斯坦','Kenya':'肯尼亚','Kyrgyzstan':'吉尔吉斯斯坦','Cambodia':'柬埔寨','Korea':'韩国','Kosovo':'科索沃','Kuwait':'科威特','Lao PDR':'老挝','Lebanon':'黎巴嫩','Liberia':'利比里亚','Libya':'利比亚','Sri Lanka':'斯里兰卡','Lesotho':'莱索托','Lithuania':'立陶宛','Luxembourg':'卢森堡','Latvia':'拉脱维亚','Morocco':'摩洛哥','Moldova':'摩尔多瓦','Madagascar':'马达加斯加','Mexico':'墨西哥','Macedonia':'马其顿','Mali':'马里','Myanmar':'缅甸','Montenegro':'黑山','Mongolia':'蒙古','Mozambique':'莫桑比克','Mauritania':'毛里塔尼亚','Malawi':'马拉维','Malaysia':'马来西亚','Namibia':'纳米比亚','New Caledonia':'新喀里多尼亚','Niger':'尼日尔','Nigeria':'尼日利亚','Nicaragua':'尼加拉瓜','Netherlands':'荷兰','Norway':'挪威','Nepal':'尼泊尔','New Zealand':'新西兰','Oman':'阿曼','Pakistan':'巴基斯坦','Panama':'巴拿马','Peru':'秘鲁','Philippines':'菲律宾','Papua New Guinea':'巴布亚新几内亚','Poland':'波兰','Puerto Rico':'波多黎各','Dem. Rep. Korea':'朝鲜','Portugal':'葡萄牙','Paraguay':'巴拉圭','Qatar':'卡塔尔','Romania':'罗马尼亚','Russia':'俄罗斯','Rwanda':'卢旺达','W. Sahara':'西撒哈拉','Saudi Arabia':'沙特阿拉伯','Sudan':'苏丹','S. Sudan':'南苏丹','Senegal':'塞内加尔','Solomon Is.':'所罗门群岛','Sierra Leone':'塞拉利昂','El Salvador':'萨尔瓦多','Somaliland':'索马里兰','Somalia':'索马里','Serbia':'塞尔维亚','Suriname':'苏里南','Slovakia':'斯洛伐克','Slovenia':'斯洛文尼亚','Sweden':'瑞典','Swaziland':'斯威士兰','Syria':'叙利亚','Chad':'乍得','Togo':'多哥','Thailand':'泰国','Tajikistan':'塔吉克斯坦','Turkmenistan':'土库曼斯坦','East Timor':'东帝汶','Trinidad and Tobago':'特里尼达和多巴哥','Tunisia':'突尼斯','Turkey':'土耳其','Tanzania':'坦桑尼亚','Uganda':'乌干达','Ukraine':'乌克兰','Uruguay':'乌拉圭','United States':'美国','Uzbekistan':'乌兹别克斯坦','Venezuela':'委内瑞拉','Vietnam':'越南','Vanuatu':'瓦努阿图','West Bank':'西岸','Yemen':'也门','South Africa':'南非','Zambia':'赞比亚','Zimbabwe':'津巴布韦'}
map = Map().add(series_name='世界疫情分布',data_pair=data_list,maptype='world',name_map=nameMap,is_map_symbol_show=False
)
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map.render('世界疫情分布情况3.html')# 作者:丹成学长 q746876041

4.4 全国疫情实时追踪

全国疫情实时追踪页面,支持折线图、条形图、扇形图、地图热力图展示,图表由Echarts实现,支持左上角侧边栏跳转。

在这里插入图片描述
在这里插入图片描述

4.6 其他页面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 关键代码

两个数据表

CREATE TABLE `history` (`ds` datetime NOT NULL COMMENT '日期',`confirm` int(11) DEFAULT NULL COMMENT '累计确诊',`confirm_add` int(11) DEFAULT NULL COMMENT '当日新增确诊',`suspect` int(11) DEFAULT NULL COMMENT '剩余疑似',`suspect_add` int(11) DEFAULT NULL COMMENT '当日新增疑似',`heal` int(11) DEFAULT NULL COMMENT '累计治愈',`heal_add` int(11) DEFAULT NULL COMMENT '当日新增治愈',`dead` int(11) DEFAULT NULL COMMENT '累计死亡',`dead_add` int(11) DEFAULT NULL COMMENT '当日新增死亡',PRIMARY KEY (`ds`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `details` (`id` int(11) NOT NULL AUTO_INCREMENT,`update_time` datetime DEFAULT NULL COMMENT '数据最后更新时间',`province` varchar(50) DEFAULT NULL COMMENT '省',`city` varchar(50) DEFAULT NULL COMMENT '市',`confirm` int(11) DEFAULT NULL COMMENT '累计确诊',`confirm_add` int(11) DEFAULT NULL COMMENT '新增治愈',`heal` int(11) DEFAULT NULL COMMENT '累计治愈',`dead` int(11) DEFAULT NULL COMMENT '累计死亡',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;import requestsimport jsonimport timeimport pymysql#返回历史数据和当日详细数据def get_tencent_data():url1 = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"url2 = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_other"headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}r1 = requests.get(url1, headers)r2 = requests.get(url2, headers)#json字符串转字典res1 = json.loads(r1.text)res2 = json.loads(r2.text)data_all1 = json.loads(res1["data"])data_all2 = json.loads(res2["data"])#历史数据history = {}for i in data_all2["chinaDayList"]:ds = "2020." + i["date"]tup = time.strptime(ds, "%Y.%m.%d")  # 匹配时间ds = time.strftime("%Y-%m-%d", tup)  #改变时间输入格式,不然插入数据库会报错,数据库是datatime格式confirm = i["confirm"]suspect = i["suspect"]heal = i["heal"]dead = i["dead"]history[ds] = {"confirm": confirm, "suspect": suspect, "heal": heal, "dead": dead}for i in data_all2["chinaDayAddList"]:ds = "2020." + i["date"]tup = time.strptime(ds, "%Y.%m.%d")  # 匹配时间ds = time.strftime("%Y-%m-%d", tup)  #改变时间输入格式,不然插入数据库会报错,数据库是datatime格式confirm = i["confirm"]suspect = i["suspect"]heal = i["heal"]dead = i["dead"]history[ds].update({"confirm_add": confirm, "suspect_add": suspect, "heal_add": heal, "dead_add": dead})#当日详细数据details = []update_time = data_all1["lastUpdateTime"]data_country = data_all1["areaTree"]  #list 25个国家data_province = data_country[0]["children"] #中国各省for pro_infos in data_province:province = pro_infos["name"] #省名for city_infos in pro_infos["children"]:city = city_infos["name"]confirm = city_infos["total"]["confirm"]confirm_add = city_infos["today"]["confirm"]heal = city_infos["total"]["heal"]dead = city_infos["total"]["dead"]details.append([update_time, province, city, confirm, confirm_add, heal, dead])return history, detailsdef get_conn():#建立连接conn = pymysql.connect(host="127.0.0.1", user="root", password="*", db="cov", charset="utf8")#创建游标cursor = conn.cursor()return conn,cursordef close_conn(conn,cursor):if cursor:cursor.close()if conn:conn.close()#插入details数据def update_details():cursor = Noneconn = Nonetry:li = get_tencent_data()[1] #0是历史数据,1是当日详细数据conn,cursor = get_conn()sql = "insert into details(update_time,province,city,confirm,confirm_add,heal,dead) values(%s,%s,%s,%s,%s,%s,%s)"sql_query = "select %s=(select update_time from details order by id desc limit 1)"  #对比当前最大时间戳#对比当前最大时间戳cursor.execute(sql_query,li[0][0])if not cursor.fetchone()[0]:print(f"{time.asctime()}开始更新数据")for item in li:cursor.execute(sql,item)conn.commit()print(f"{time.asctime()}更新到最新数据")else:print(f"{time.asctime()}已是最新数据!")except:traceback.print_exc()finally:close_conn(conn,cursor)#插入history数据def insert_history():cursor = Noneconn = Nonetry:dic = get_tencent_data()[0]#0代表历史数据字典print(f"{time.asctime()}开始插入历史数据")conn,cursor = get_conn()sql = "insert into history values (%s,%s,%s,%s,%s,%s,%s,%s,%s)"for k,v in dic.items():cursor.execute(sql,[k, v.get("confirm"),v.get("confirm_add"),v.get("suspect"),v.get("suspect_add"),v.get("heal"),v.get("heal_add"),v.get("dead"),v.get("dead_add")])conn.commit()print(f"{time.asctime()}插入历史数据完毕")except:traceback.print_exc()finally:close_conn(conn,cursor)#更新历史数据def update_history():cursor = Noneconn = Nonetry:dic = get_tencent_data()[0]#0代表历史数据字典print(f"{time.asctime()}开始更新历史数据")conn,cursor = get_conn()sql = "insert into history values (%s,%s,%s,%s,%s,%s,%s,%s,%s)"sql_query = "select confirm from history where ds=%s"for k,v in dic.items():if not cursor.execute(sql_query,k):cursor.execute(sql,[k, v.get("confirm"),v.get("confirm_add"),v.get("suspect"),v.get("suspect_add"),v.get("heal"),v.get("heal_add"),v.get("dead"),v.get("dead_add")])conn.commit()print(f"{time.asctime()}历史数据更新完毕")except:traceback.print_exc()finally:close_conn(conn,cursor)insert_history()update_details()

最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

十个有用的 Vue.js 自定义 Hook

Vue.js 是我使用的第一个 JavaScript 框架。 我可以说 Vue.js 是我进入 JavaScript 世界的第一扇门之一。 目前,Vue.js 仍然是一个很棒的框架。 我认为有了组合 API,Vue.js 只会增长得更多。 在本文中,我将向分享 10 个可以使用 Vue.js 制作…

2023年中国火化设备行业现状分析:随着城市化进程的推进,市场需求将持续增长[图]

火化设备行业是指生产和提供用于尸体火化处理的设备和相关服务的行业。火化设备主要用于将尸体进行高温焚烧,将尸体转化为骨灰,以达到尸体处理和殡葬的目的。 火化设备行业优点 资料来源:共研产业咨询(共研网) 我国火…

【农业生产模拟】WOFOST模型与PCSE模型实践

查看原文>>>【农业生产模拟】WOFOST模型与PCSE模型实践 WOFOST(WorldFoodStudies)和PCSE(PythonCropSimulationEnvironment)是两个用于农业生产模拟的模型:WOFOST是一个经过多年开发和验证的模型&#xff0c…

【随笔记】C++ condition_variable 陷阱

问题说明 通过 std::condition_variable 来实现超时等待,会受到系统时间变化的影响,系统时间倒退修改就会导致延后唤醒,系统时间提前将会导致提前被唤醒,返回结果仍为超时。 这种问题只有在系统时间发生变化的时候才会出现&…

LeNet网络复现

文章目录 1. LeNet历史背景1.1 早期神经网络的挑战1.2 LeNet的诞生背景 2. LeNet详细结构2.1 总览2.2 卷积层与其特点2.3 子采样层(池化层)2.4 全连接层2.5 输出层及激活函数 3. LeNet实战复现3.1 模型搭建model.py3.2 训练模型train.py3.3 测试模型test…

借助Log360实现综合可见性的增强网络安全

当今的企业对技术的依赖程度前所未有,因此强大的威胁检测和响应策略变得至关重要。在现代世界中,网络犯罪分子不断寻找新的、富有创意的方式,以侵入组织的网络并窃取敏感数据。综合性的可见性是一个关键要素,有时被忽视&#xff0…

Unity HDRP Custom Pass 实现场景雪地效果

先使用Shader Graph连一个使用模型法线添加雪地的shader,并赋给一个material。 1.1 先拿到模型世界坐标下的顶点法线,简单处理一下,赋给透明度即可。 给场景添加Custom Pass,剔除不需要的层级。 1.在Hierarchy界面中&#xff…

Wi-Fi直连分享:Android设备间的高速连接

Wi-Fi直连分享:Android设备间的高速连接 引言 随着无线局域网(Wi-Fi)的普及和发展,使用Wi-Fi直连技术(P2P)在没有中间接入点的情况下实现设备间直接互联成为可能。通过Wi-Fi直连,具备相应硬件…

【React】React组件生命周期以及触发顺序(部分与vue做比较)

最近在学习React,发现其中的生命周期跟Vue有一些共同点,但也有比较明显的区别,并且执行顺序也值得讨论一下,于是总结了一些资料在这里,作为学习记录。 v17.0.1后生命周期图片 初始化阶段 由ReactDOM.render()触发 —…

【Java 进阶篇】JDBC插入数据详解

在Java应用程序中,与数据库交互是一项常见的任务。其中,插入数据操作是一种基本的数据库操作之一。本文将详细介绍如何使用Java JDBC(Java Database Connectivity)来执行插入数据操作。无论您是初学者还是有一定经验的开发人员&am…

CSS详细基础(六)边框样式

本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …

Android studio升级Giraffe | 2022.3.1 Patch 1踩坑

这里写自定义目录标题 not "opens java.io" to unnamed module错误报错信息解决 superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner报错报错信息解决 Android studio升级Giraffe | 2022.3.1 Patch 1后,出现项目…

imgui开发笔记<1>、ubuntu环境下快速应用

去这个链接下载imgui源码(在此之前需要安装opengl glfw3等等): sudo apt-get install libglfw3-dev https://github.com/ocornut/imgui 我这里源码下载到/home/temp/imgui目录下,咱们不需要编译源码成库,而是直接将下…

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板,图表在中继器表格里填写具体的数据,调整坐标系后,就可以根据表格数据自动生成对应高度的圆柱图,鼠标移入时,可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

网络安全渗透测试工具之skipfish

网络安全渗透测试工具skipfish介绍 在数字化的时代,Web 应用程序安全成为了首要任务。想象一下,您是一位勇敢的安全冒险家,迎接着那些隐藏在 Web 应用程序中的未知风险。而在这个冒险之旅中,您需要一款强大的工具来帮助您发现漏洞,揭示弱点。而这个工具就是 Skipfish。 …

LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

点击、拖拉拽,BI系统让业务掌握数据分析主动权

在今天的商业环境中,数据分析已经成为企业获取竞争优势的关键因素之一。然而,许多企业在面对复杂的数据分析工具时,却常常感到困扰。这些工具往往需要专业的技术人员操作,而且界面复杂,难以理解和使用。对业务人员来说…

阿里云 Oss 权限控制

前言 最近公司的私有 Oss 服务满了,且 Oss 地址需要设置权限,只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着,Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去,但是紧…

picoctf_2018_shellcode

picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位,啥都没开 这个看着挺大的,直接来个ROPchain,…