大数据疫情分析及可视化系统 计算机竞赛

文章目录

  • 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.rhkb.cn/news/184238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web Worker:JS多线程的伪解药?

前言 在前端开发领域,JavaScript 的单线程限制一直是一个难以忽视的挑战。当谈到解决JavaScript的单线程限制时,HTML5引入的Web Worker被普遍认为是一剂解药💊。同时,业界中大量的文章也是聚焦于讨论web worker的神奇力量。然而&…

Android内存回收机制、GC算法及内存问题分析解决

Android内存回收机制、GC算法及内存问题分析解决 在Android开发中,Java内存回收和垃圾收集(GC)机制是确保应用程序高效运行的关键部分。针对不同对象存活率,Android平台采用了引用计数算法和可达性分析法来判定对象的可回收性&am…

RTC实时时钟——DS1302

DS1302目录 一、DS1302简介引脚定义与推荐电路 二、芯片手册1.操作寄存器的定义2.时序定义dc1302.cds1302.h 三、蓝桥杯实践 一、DS1302简介 RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片。现在流行的串行时钟电路很多,如…

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍

在第十四届全球移动宽带论坛上,华为高级副总裁、运营商 BG 总裁李鹏表示,大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环,拥抱更繁荣的 5.5G》的讲话中表示,「5G 已经走在商业成功的正确…

C# OpenCvSharp 去除字母后面的杂线

效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string image_path "";private void Form1_Loa…

三国志14信息查询小程序(历史武将信息一览)制作更新过程05-后台接口的编写及调用

1,创建ASP.NET Web API项目 生成完毕,项目结构如下: 运行看一下: 2,后台接口编写 (1)在Models文件夹中新建一个sandata.cs文件(就是上篇中武将信息表的model文件) u…

伦敦金开户需要多少资金,有开户条件吗?

伦敦金(London Gold)是黄金市场中备受瞩目的投资种类之一,无论是专业投资者还是新手,都对伦敦金感兴趣。但关于开户需要多少资金,以及是否有特定的开户条件,这些问题可能会让一些新手投资者感到困惑。 首先…

notepad++搜索结果窗口不见了

1、使用notepad打开一个文件文件 2、ctrlf,打开搜索窗口,随便搜索一个内容 3、按F7,然后AltF7 切换焦点到Find result. 会有一个小窗口出现,内容是:还原,移动,大小等 4,点移动,使…

[答疑]校长出轨主任流程的业务建模

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 艳阳天 2023-10-27 19:45 我有点迷糊。校长出轨主任在酒店被拍到,不属于学校的业务流程,但闹出这种事对学校有很大影响。如果学校想用一个系统抓风纪&#xff…

论文阅读—— BiFormer(cvpr2023)

论文:https://arxiv.org/abs/2303.08810 github:GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 一、介绍 1、要解决的问题:t…

OpenLayers入门,OpenLayers加载离线xyz瓦片地图并显示离线鹰眼控件

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍如何使用OpenLayers加载离线xyz瓦片地图图层,并显示离线xyz瓦片的鹰眼控件。 本章是综合案例,涉及到两块内容,一个是离线瓦片地图加载,二个是鹰眼控件,拆分的参考文章如下: OpenLayers入门,OpenLayers地图鹰眼控…

Java面试题(每天10题)-------连载(26)

目录 多线程篇 1、什么是FutureTask? 2、什么是同步容器和并发容器的实现? 3、什么是多线程的上下文切换? 4、ThreadLocal的设计理念与作用? 5、ThreadPool(线程池)用法与优势? 6、Concur…

智能文件改名:高效复制并删除冗余,简化文件管理“

在繁杂的电脑文件世界中,如何高效地管理文件成为了许多人的难题。为了解决这一难题,我们推出了一款智能文件改名工具,它能够轻松复制文件并删除目标文件夹中的冗余文件,让您的文件管理更加高效便捷。 第一步,我们要打…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题? 域名缓存问题 我们知道CND会进行域名解析,但是由于本地会进行缓存对应的域名-ip地址,所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候,需要进行…

Flink--Data Source 介绍

Data Source 简介 Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时的处理些实时数据流,实时的产生数据流结果,只要数据源源不断的过来&#xff…

Spring的缓存机制-循环依赖

群公告 Java每日大厂面试题: 1、Spring 是如何解决循环依赖? 答案:三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要…

【AICFD案例教程】进气歧管分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

CSS时间线样式

css实现时间线样式,效果如下图: 一、CSS代码 .timeline {padding-left: 5px} .timeline-item { position: relative;padding-bottom: 20px;} .timeline-axis {position: absolute;left: -5px;top: 0;z-index: 10;width: 20px;height: 20px;line-he…

Android Studio报错:connect refused

参考链接: https://blog.csdn.net/qq_43213783/article/details/113936012 参考文章中说报错主要是由于代理导致的,在文件->设置->外观与行为->系统设置->HTTP代理。 方法一: 查看打开代理(前提是代理可以通网&#x…

数据可视化PCA与t-SNE

PCA(主成分分析)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。 降维:把数据或特征的维数降低,其基本作用包括: 提高样本密度,以及使基于欧…