Skip to main content

Command Palette

Search for a command to run...

总结项目:covid-19实时动态

Updated
4 min read

研究背景及意义

背景

没有一个春天不会到来,春天的美好都会如约而至

当前,新型冠状病毒感染导致的肺炎疫情依旧牵动着国人的心。 朋友见面、微信聊天、朋友圈分享,几乎三句不离最新疫情的进展。 讨论的背后是人们对疫情对关注,也是对自身、家人健康的担忧..........



研究意义

信息缺乏,丁香出道!

记得去年新型冠状病毒疫情的信息刚出现在互联网上时,家乡的老人对其更不了解,大部分老人都以为只是普通流感而已。

之所以这样,其根本原因就在于不是每个人都能有充足的信息去了解,但没过几天,出现了一个叫“丁香医生”的平台,在那上面我可以看到所有的疫情数据,看到地图上的地区渐渐变“红”,大家就都知道必须做到少出门,戴口罩,注卫生了



重要说明

该项目以更新至 v2.0 该文章主要总结 v1.0

本着共同开发和学习的原则,该项目已开源至 Github

开源协议:GNU General Public License v2.0

为避免报告冗余文字太多,该报告介绍的均为核心实现,全部代码还请见: ⬇️

star 链接Go!



项目简介

实现方式

后端:Mysql + Java

前端:Javascript + HTML + CSS

系统服务:shell



开发环境

系统 :Ubuntu 18.04.5 LTS (Bionic Beaver)

编辑器:Vim & Vscode

Java 环境:JDK15

JDBC 驱动:mysql-connector-java-5.1.39

Mysql 环境:Mysql8.0



部署环境

系统 :Centos7.4

编辑器:Vim

Java 环境:JDK8

Mysql 环境:Mysql5.1



需求分析

用户角度分析

疫情数据准确

疫情数据实时性高

能直观看到现在疫情的情况

能多角度的学习到疫情的现状

技术角度分析

疫情数据需要来源

要有精确且有效数据

数据需要存储到安全的地方

存储的数据需要能被高效获取

有效数据需要再分类成独立数据集

数据集需要制作图表进行可视化



架构设计

总结构设计

整体分成四个模块

monitor 模块: 负责监听疫情动态数据,实现数据实时更新,保证数据的实时性,降低系统资源利用率

Data mining 模块: 负责抓取所有与疫情相关的数据 并 挖掘出有用的数据,实现数据的“无中生有”,保证数据的准确性与有效性,降低数据冗余

Database 模块: 负责存储 Data mining 模块生成的数据,实现数据的存储,保证数据的安全性、高可用性,降低数据的不稳定性

Data visuallzation 模块: 负责将存储在 Databases 模块的有效数据 变成直观的数据,实现数据可视化,保证数据的可读性,降低某些数据被当作多余的可能

monitor模块与其他模块区别存储/使用

monitor模块负责其它模块整体的使用及调度



数据挖掘模块设计

Data mining 模块分成三个功能区

Data collection:负责数据的收集,收集疫情相关的数据

Data cleaning: 负责数据的清洗,清洗出有效数据

Data storage: 负责数据的存储,将数据存储到数据库



数据库模型设计

对 Data mining 模块存储的数据进行简单分类



数据可视化模块设计

Data visualization 模块分成三个功能区

Data Extraction:负责数据的提取,从数据库中提取出数据,并进行简单处理

Data Classification:负责数据的分类处理,这是对疫情数据最后的一步处理

Generate Webpage code: 负责将分类过的数据,并生成 web 页面



监听模块设计

Data mining 模块分成两个组件,三个功能区

data collection: 负责数据的收集

Data monitoring: 负责监听 data collectiong 收集的数据,如果监听到数据发生变化,立即作出反应

Process monitoring: 负责监听 Data monitoring 组件,如果监听到该组件有所变化,立即执行整个项目,将上述架构实现



具体实现

项目文件一览

使用的语言和文件分布、代码工程量:

文件目录: 所有文件将会被打包成: 两个 jar 包: > COVID19.jar 文件: index.java 目录:Datamining DATA_visualization > Data_monitoring.jar 文件:Data_monitoring.java 一套 Linux Shell 脚本: > Main: Monitor_process.sh 分支文件: runcovid.sh COVID19UPDATE.sh 一个 Web 访问目录: > 目下分支两个目录 /Log _/Run

包含已/待生成的 Web 文件: Form_theme.js index.html */Log/诸多日志文件 > > > > index.html 文件为 COVID19.jar 将生成的文件 内包含已编写的两个远程 Javascript 文件,协助可视化的制作

数据挖掘模块

文件目录:

共分成五个类



mining_transfer 类

作用:资源池

功能:存储数据 Data_mining 模块中所有需要被使用的数据,并对外提供接口

代码:



Scraping 类

作用:数据爬虫

功能:爬取网页 JSON 数据,并进行简单处理,将 JSON 数据变成一段连续的字符串,之后将这一次处理生成的数据记录下来

因为疫情数据不能出现一点差错,所以仍和一次对数据的处理都需要存储为日志文件,提高可维护、可控性

包的使用:

重要变量:

简单正则处理去除特殊字符:

构造方法 & 爬取 JSON 数据:

生成日志文件:



Cleaning 类

作用:数据清洗

功能:按数据的不同特征,清洗出有用数据数据

包的使用:

依旧需要将每一次处理都记录下来,方便后期维护:

自编的一个正则处理的模板,能大大提高代码的整洁性,和程序的运行速度

只需要拟定好需要的正则规则使用模版即可

示范: 这一段能将国内所有地区,包括其名称、累计确诊、治愈、死亡人数都找出

再例如: 这一段能把国内整体的一个疫情数据都找出 最后就是构造方法了:

Submission 类

作用:数据存储

功能:将需要存储的数据存储到 Mysql 数据库中,并对 Mysql 数据库进行简单管理

包的使用:

重要的变量,包含 Mysql 不同版本的连接方式,以及用户名和密码:

使用 JDBC,编写 sq 语言 l,对数据库表进行管理

动态生成会变化部分的 sql 代码,使用 sql 语言将数据插入数据库中(仅示范部分)

构造方法,连接数据库,调度其它方法



Run_mining 类

作用:资源调度

功能:调度 Data_mining 模块中所有资源,包括类的使用、数据的传递

代码:



小结

如果,数据挖掘模块刚爬取到的 JSON 数据是这样: 那么,数据挖掘模块完整使用后,在 Mysql 数据库中的数据为:



数据可视化模块

文件目录:

共分成五个类



visualization_transfer 类

作用:资源池

功能:存储数据 Data_visualization 模块中所有需要被使用的数据,并对外提供接口

代码:



Extraction 类

作用:数据提取

功能:提取出 Mysql 数据库中需要的数据,存储到资源池中 和Data_mining模块的Submissionl类的许多相似功能不再赘述

包的使用:

对 Mysql 表进行最大限制,并提取其表名:

根据表名,提取出其存储的数据:



Generation_Javascript 类

作用:Javascript Code 生成

功能:根据已经设计好的数据可视化代码,生成其可能会发生变化的 Javascript 代码 为了不偏移以Java实现的核心思想,仅介绍核心功能

生成疫情在地图上的地区分布的主要数据,包括地区名称,确诊人数等关键数据 (仅为范例):

Generation_HTML 类

作用:HTML Code 生成 与 插入

功能:根据已经设计好的数据可视化代码,结合 Generation_Javascript 类生成的 Javascript 代码,生成其可能会发生变化的 HTML 代码,再将其存储为一个可被访问的 web 页面 为了不偏移以Java实现的核心思想,仅介绍核心功能

将可被浏览器所编译的 Javascript 数据,疫情地区分布图、新增人数地区分布图等。。。 (仅为范例):

生成 Web 文件:



Run_visualization 类

作用:Data_visualization 模块资源调度

功能:调度所有资源、包括资源池中的数据分配、类的使用、数据的传递

代码:



小结

如果,数据可视化模块从数据库中读取到的数据长这样: 那么数据可视化模块,可能生成的 Web 页面会是这样:



index 类

index.java 位于工程文件的根目录

作用:Data_visualization 和 Data_mining 模块的资源调度

功能:调度所有资源、包括资源池中的数据分配、类的使用、数据的传递

代码:



监听模块

文件目录:

只是为了方便展示而存放于一个目录,实际使用中应置于项目根目录 >共分成一个Java文件,三个Linux Shell脚本



Java Data_monitoring 类

作用:监控疫情数据动态

功能:利用线程休眠的方式让该程序,24 小时不间断监控疫情数据,如果发生了变化,立马返回异常给系统

包的使用:

关键变量与线程方法:

线程内进行数据爬虫和对比:

遗憾:

在编写 Data_monitoring 类时有一个极大的遗憾 本打算分四个线程,三个监听线程负责多方位捕捉多方面的疫情数据,这样可以提高容错率 其中另一线程负责做数据匹配,如果疫情数据发生更新让该线程作出反映 这样才能实现真正的 24 小时,不间断监听 但奈何服务器在我的博客和我的"玩弄"之下,已没有多少资源来让其“霸占”,所以只好作罢。



Monitor_process Shell

作用:监控 Data_monitoring 类

功能:利用进程监听的方式来判断 Data_monitoring 类 的反映,如果出现异常,立即作出处理

线程监听:

注:此时的Java Data_monitoring类已被打包成Data_monitoring jar 注:脚本中的一切都要按照部署环境来编写和理解



总结

项目优缺点分析

缺点分析

数据挖掘模块,数据收集来源单一,爬取的都是二手信息,没有挖掘出更多有效数据

数据可视化模块,没有分析出更多有用的信息

数据监听模块 shell 脚本,受技术能力限制,有部分冗余命令

优点分析

数据可视化模块,通过事前编写好 Javascript/Css/HTML 代码,让 Java 来根据一定算法生成生成 Web 文件,速度极快,可扩展性高

项目整体达到了轻量化的标准,整个项目文件仅 1M,部署简单

项目模块化设计,后期维护更方便,版本迭代更方便



技术总结

JAVA 涉及的知识点:

I/O 流、多线程、正则运算、JDBC、网络爬虫、数据清洗的实现、简单算法编写、代码设计模式

数据库涉及的知识点:

Mysql 的使用;SQL 的 DDL、DML、DCL

前端涉及的知识点:

HTML、CSS 布局设计;Javascript 动态数据可视化;echart 的二次开发及使用;

Linux 涉及的知识点:

VIM 使用;编写 Shell 脚本(包括系统进程监听、Linux 命令执行);Web 平台部署



项目展示

已经不提供服务的第一代版本:

More from this blog

【两万字总结】Spark 部署与入门

Spark 介绍 核心概念 Spark 是 UC Berkeley AMP lab 开发的一个集群计算的框架,类似于 Hadoop,但有很多的区别。 最大的优化是让计算任务的中间结果可以存储在内存中,不需要每次都写入 HDFS,更适用于需要迭代的 MapReduce 算法场景中,可以获得更好的性能提升。 例如一次排序测试中,对 100TB 数据进行排序,Spark 比 Hadoop 快三倍,并且只需要十分之一的机器。 Spark 集群目前最大的可以达到 8000 节点,处理的数据达到 PB 级别...

Oct 20, 202115 min read

【引言】浙大机器学习课程记录

机器学习的定义 第一种定义 ARTHUR SAMUEL对Machine learning 的定义 Machine Learning is Fields of study that gives computers the ability to learn without being explicitly programmed 机器学习是这样的领域,它赋予计算机学习的能力,(这种学历能力)不是通过显著式编程获得的 显著式编程 提前人为指定规律的编程方式 非显著式编程 让计算机自己总结规律的...

Oct 19, 20212 min read

TensorFlow 2 Keras实现线性回归

介绍 线性回归是入门机器学习必学的算法,其也是最基础的算法之一。 接下来,我们以线性回归为例,使用 TensorFlow 2 提供的 API 和 Eager Execution 机制对其进行实现。 线性回归是一种较为简单,但十分重要的机器学习方法,它也是神经网络的基础。 如下所示,线性回归要解决的问题就是如何找到最理想的直线去拟合散点样本。 对于一个线性回归问题,一般来讲有 2 种解决方法,分别是: 最小二乘法 代数求解 矩阵求解 梯度下降法。 本次,我们将使用梯度下降方法来解决线性回...

Oct 12, 20211 min read

TensorFlow 2 基础概念语法与常用模块

TensorFlow 2 简介 TensorFlow 是由谷歌在 2015 年 11 月发布的深度学习开源工具,我们可以用它来快速构建深度神经网络,并训练深度学习模型。运用 TensorFlow 及其他开源框架的主要目的,就是为我们提供一个更利于搭建深度学习网络的模块工具箱,使开发时能够简化代码,最终呈现出的模型更加简洁易懂。 2019 年,TensorFlow 推出了 2.0 版本,也意味着 TensorFlow 从 1.x 正式过度到 2.x 时代。根据 TensorFlow 官方 介绍内...

Oct 12, 20213 min read

uiu's log

27 posts

Insist on programming & Love open source