新冠肺炎疫情是新中国成立以来发生的传播速度最快、感染范围最广、防控难度最大的一次重大突发公共卫生事件。2020年3月11日,世界卫生组织总干事谭德塞宣布,根据评估,世界卫生组织认为当前新冠肺炎疫情可被称为全球大流行(pandemic)。根据Corona Tracker在线平台最新的数据,截至北京时间12月2日0时,全球确诊病例达到263,916,990例;死亡病例达到5,245,545例;康复病例达到238,237,688例。2020年初开始,全世界报告的新冠(COVID-19)感染病例急剧增加。病例的累积速度与2003年SARS疫情、2009年甲型H1N1流感的历史数字形成鲜明对比。疫情不仅威胁到全国人民的生命健康安全,还对社会经济生产活动产生了严重的负面效应。这种世界范围内大流行病的模式和影响表明,全世界对流行性病毒感染的反应存在缺陷,这其中包括一些自然因素及政策因素。本次报告首先根据已有数据进行可视化分析来展示疫情传播特点,然后通过建立传染病动力学模型以及一些数学模型,评估疫情防控措施,评估过程分全国宏观疫情分析和国内内部细微分析,以此提出建议,给疫情防控决策和大众行为作为参考。
对于科研工作者,最重要的研究材料之一就是历史数据,权威的数据来自各级卫健委每日发布的疫情报告,然而数据以文本方式呈现,收集的成本较高。目前,在R和Python上通过一些开源的API可以直接提取数据,在GitHub上也有可以直接下载的全量历史数据,还有Wind等付费数据平台(现在Wind Quant平台支持免费调用了Wind疫情数据了),本文采用了R语言的nCov2019包获取疫情分析数据,目前从该库中可以方便地获取全球各国以及精确到我国省、市级的历史数据,数据更新从2020年1月11日起
在RStudio中执行remotes::install_github("GuangchuangYu/nCov2019")命令安装nCov2019包。加载成功之后可以使用get_nCov2019函数获取当日疫情数据,nCov2019包并内置了time方法,返回数据更新时间。成功获取数据之后,打印一下你拿到的数据,它会显示中国确诊的人数,以及这个数据的更新时间。数据源来自于腾讯新闻的疫情频道,想在线访问,使用open(data),它会打开浏览器,直接到达腾讯新闻页面。
load_nCov2019()命令返回疫情的历史数据,疫情的历史数据只更新至2021年3月19日。使用write.csv命令将历史数据保存于本地,疫情的历史数据只更新至2021年3月19日。
爬虫技术爬取腾讯新闻公布的最新疫情数据,疫情数据API: api.inews.qq.com/newsqa/v1/q…=浙江,需要其他省份的数据将省份参数修改即可。获取数据可以借助Excel、Powerbi等软件进行操作,也可以使用python代码进行自动获取。使用软件的方式就不进行展示,网上的资料很全,这里给出一段python代码,爬取的数据分为三类,一、显示全国每日变化情况的部分数据,每次最多爬取60天的历史数据,二、显示当日的全国各市级疫情较前一天变化量的部分数据,三、显示当日全国各省疫情汇总较前一天的变化情况的部分数据。
`#导入库 import requests import json import time import pandas as pd
请求的URL
url = 'view.inews.qq.com/g2/getOnsIn…'
伪装请求头
Headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'referer': 'news.qq.com/zt2020/page…' }
抓取数据
Data = requests.get(url % time.time(), Headers=Headers)
data = json.loads(Data.text)
print (Data.text)
data = json.loads(data['data'])
lastUpdateTime = data['lastUpdateTime'] print('数据更新时间 ' + str(lastUpdateTime))
part 1. 采集当日数据
areaTree = data['areaTree']
print('采集当日省市数据...')
创建空 dataframes
col_names = ['省', '市', '新增确诊','累计确诊', '死亡', '治愈','死亡率','治愈率'] col_names_p = ['省', '新增确诊', '累计确诊', '死亡', '治愈', '死亡率', '治愈率']
my_df = pd.DataFrame(columns = col_names) my_df_p = pd.DataFrame(columns = col_names_p)
for item in areaTree: if item['name'] == '中国': item_ps = item['children']
# 遍历省级数据
for item_p in item_ps:
province = item_p['name']
# print(province)
# print(item_p['total'])
confirm = item_p['total']['confirm']
death = item_p['total']['dead']
heal = item_p['total']['heal']
new_confirm = item_p['today']['confirm']
deadRate =item_p['total']['deadRate']
healRate =item_p['total']['healRate']
# 向df添加数据
data_dict = {'省': province,'新增确诊':new_confirm,'累计确诊': confirm,
'死亡': death, '治愈': heal, '死亡率': deadRate, '治愈率': healRate}
# print (data_dict)
my_df_p.loc[len(my_df_p)] = data_dict
# 遍历地级数据
item_cs = item_p['children']
for item_c in item_cs:
prefecture = item_c['name']
# print(' ' + prefecture)
# print(' ' + str(item_c['total']))
new_confirm = item_c['today']['confirm']
confirm = item_c['total']['confirm']
# suspect = item_c['total']['suspect']
death = item_c['total']['dead']
heal = item_c['total']['heal']
deadRate = item_c['total']['deadRate']
healRate = item_c['total']['healRate']
# 向df添加数据
data_dict = {'省': province, '市':prefecture, '新增确诊':new_confirm,'累计确诊': confirm,
'死亡': death, '治愈': heal, '死亡率': deadRate, '治愈率': healRate}
my_df.loc[len(my_df)] = data_dict
保存数据
my_df.index += 1 # 使index从1开始 my_df_p.index += 1 my_df.to_csv(r'./china_prefecture_status_{}.csv'.format(str(lastUpdateTime).split()[0]), encoding='utf_8_sig', header='true') my_df_p.to_csv(r'./china_province_status_{}.csv'.format(str(lastUpdateTime).split()[0]), encoding='utf_8_sig', header='true')
part 2. 采集中国历史数据
print('采集中国历史数据...')
请求的URL
url = 'view.inews.qq.com/g2/getOnsIn…'
抓取数据
r = requests.get(url, Headers=Headers)
print (r.text)
data = json.loads(r.text) data = json.loads(data['data'])
china_day_list = data['chinaDayList']
col_names_cd = ['日期','累计确诊','疑似','死亡', '治愈', '现有确诊', '现有重症','死亡率','治愈率']
my_df_cd = pd.DataFrame(columns = col_names_cd)
for day_item in china_day_list: date = day_item['date'] + '.2021' confirm = day_item['confirm'] suspect = day_item['suspect'] dead = day_item['dead'] heal = day_item['heal'] nowConfirm = day_item['nowConfirm'] nowSevere = day_item['nowSevere'] deadRate = day_item['deadRate'] healRate = day_item['healRate']
# 向df添加数据
data_dict = {'日期': date,'累计确诊': confirm,'疑似': suspect,'死亡': dead, '治愈': heal, '现有确诊': nowConfirm,
'现有重症':nowSevere,'死亡率': deadRate,'治愈率':healRate}
my_df_cd.loc[len(my_df_cd)] = data_dict
my_df_cd.index += 1 my_df_cd.to_csv(r'./china_daily_status_{}.csv'.format(str(lastUpdateTime).split()[0]), encoding='utf_8_sig', header='true')
print('Success')
#输出路径
import sys print(sys.path[0])`