NCP | 新冠疫情的监测与趋势分析

1. 前言 🇨🇳

1.1 项目阐述

👨🏻‍💻 2020,注定是不平凡的一年,新冠疫情如晴天霹雳将沉浸在2020年春节气氛中的人们骤然推进人人自危的疫情防控中,新冠疫情的肆虐,使得我们每一个人都无法独善其身。

​ 在国内疫情最严重的二月春节期间,我每天都在关注着最新的疫情动态,看着日趋增长的确诊人数,以及「每日一千两千甚至是三千的新增确诊人数」,我总是在想,「到底什么时候才能挺过去啊?这一场艰难的抗疫,到底什么时候才能迎来转机?」很快,国家政府和全国的医护人员用最实际的行动,给了我们最肯定的答案。

​ 面对这一场突如其来的危机,幸亏有强大的国家和政府,使我们大部分人平稳度过疫情的爆发期,在从「一月初疫情爆发到二月底不到两个月」的时间里,实施了最有效的措施,「并在三月将新增确诊的数目减到了两位数」。与此同时,面对海外疫情泛滥的波涛汹涌之势,面对海外民众的束手无策和听天由命之悲,生活在中国的人都暗暗庆幸自己不在海外。那一刻,真为自己身为国人而自豪。

​ 「数据是冷冰冰的,但是,借由数据,我们可以看到这场战疫背后透露出来的温暖人情、英雄气概」,也只有亲身经历过这一场战役的我们,才深深懂得这一条「逐渐归于直线的确诊曲线」,来的有多么不容易。

chart_plt

本项目围绕疫情的几个关键特征(如确诊、治愈、死亡),绘制折线图,并在GUI图形页面进行交互与显示图表。

1.2 使用方式

  1. 使用命令source ./venv/bin/activate激活项目下的虚拟环境,即可运行
  2. 使用命令pip install -r requirements.txt安装依赖库
  3. 配置chromedriver - selenium各浏览器驱动下载地址
  4. 运行项目下的main.py文件

1.3 技术栈

  • python - PyQt5、numpy、pandas、requests、pyecharts、matplotlib

2. 需求分析 🤫

2.1 功能需求分析

ncp1/功能简介/

ncp2/图形界面组件设计/

image-20201125213231534/图形界面示意图/

2.2 技术需求分析

🐛 数据爬取 - requests(一个requests吃遍天),由于是使用API的方式获取数据,因此只需要添加简单的请求头就可以轻松获取到数据。

🔍 数据分析 - numpy、pandas,请求返回的数据为json格式,采用pd.DataFrame()将其处理并保存至csv文件。

📈 制作图表 - echarts、matplotlib,提供两种不同风格的图表,并生成网页图表(echarts)。

📃 图形页面 - PyQt5,极简风格,没有修饰。

2.3 API需求分析

数据来源这一块其实花了蛮多功夫去寻找,一开始看到「腾讯」做的还不错,问题是国内和国外的数据是不同的API,没办法一条API通吃,后来又看到「丁香园」的也很多开发者在用,再后来觉得还是正规的官方网站的数据比较靠谱,于是又去爬了「国家卫生健康委员会」的网站,而后发现与其他网站的数据出现了出入,不知道该信哪个…

​ 再到后面国外疫情开始放飞自我,便开始萌生爬取国外疫情的想法,心里的想法觉得最官方的是「世界卫生组织」,于是也去爬了,可是得到的世卫组织的疫情信息是pdf文件的,就此作罢。这时又发现很多平台的数据来源都来自「霍普金斯大学」,去看了一番,,,算了,懒得爬。

​ 另外,在GitHub也发现了「一个开发者提供的API」,使用体验一样很顺滑,只是没有国内疫情的历史数据 - https://lab.isaaclin.cn/nCoV/zh

综合下来,我选择了「腾讯」提供的API,API的获取方式大同小异,通过开发者工具即可,以腾讯为例:

image-20201125222840931/右键检查或F12进入到开发者界面,刷新一下/

image-20201125223000447/点击右边窗口的搜索图标,在输入框输入93004(左图中的数据),回车/

image-20201125223156560/即可得到这样一条请求,点开它,这就是我们想要的/

image-20201127022550318/点到header,这条请求就是我们要找的API接口,向他发送请求即可得到疫情数据/

下面是本项目用到的API:

  • 国内数据
    • 国内全局 - https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,cityStatis,nowConfirmStatis,provinceCompare
    • 国内实时 - https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5
    • 国内全局 - https://view.inews.qq.com/g2/getOnsInfo?name=disease_other
    • 国内省份及城市 - https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}&city={}&
  • 海外数据
    • 海外全局 - https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoGlobalStatis,FAutoContinentStatis,FAutoGlobalDailyList,FAutoCountryConfirmAdd
    • 海外各国 - https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={}&

3. 开发过程 💻

​ 其实在很早之前就在做疫情这个项目了,那时候还是二三月份国内形势最严峻的时候,在这个过程中,爬过很多平台的疫情数据,也因此触类旁通到很多爬取方法和思路,有了数据之后开始制作图表,各个模块之间存在比较分散的问题。

​ 一直到最近,加入了GUI图形界面,进一步提高了交互效率,也将各个功能模块、各个不同地区的爬取模块,整合到一个系统的解决方案当中,以一个个的py文件分布其职责,加上开发文档的编写,才终于算填了一个大坑,了了一桩心事。

​ 算了一下,整个开发周期长达大半年,功能架构早已完成,中间被很多事情耽搁过,近日才重新拾起,随着此篇文档的编写终于大功告成。后面会考虑加入更多丰富的echarts图表,如果还有这个精力和时间的话。

🐛 数据爬取 - 一开始爬的方法很笨拙,从页面的的网页文件中提取数据,也因此写了很多很多代码去详细设计其过程,效率较低,但锻炼了动手能力;而后善用了浏览器的开发者工具,通过分析得到其数据的API,进行数据的爬取。

🔍 数据分析 - DataFrame真的是太好用了!!!

📈 制作图表 - 老师傅matplotlib是一开始的制作图表不二选,后来觉得差点意思,不够灵动,就接触到了echarts这个神奇的库,可以制作很多效果极度炫酷的图表,后面会加入更多丰富种类的echarts图表。

📃 图形页面 - 很久开始五六月份的时候就开始有做GUI的想法了,那时使用过的图形界面相关模块如wxpython和tkinter,都不是特别满意,加上学业繁忙最终没能实现,近日帮同学做项目接触到了pyqt,让我吃一斤的是这个模块的控件竟然支持css样式进行美化,便边学边用做了个,顺便给自己这个项目加上了图形界面,才有了现在这个,不追求太多花哨的样式,但求直观简单明了,一眼就能对功能一目了然,图表的显示也符合自己的预期。

4. issue截图 🐰

image-20201127044751593/初始界面/

image-20201127032727640/查询结果界面/

image-20201127032537683/项目目录/

5. 后记 📝

在线图表(每日更新)

某hub地址 - https://github.com/chenxuefan/NCP


2397 字