新馆疫情数据获取

253 阅读5分钟

新冠肺炎疫情是新中国成立以来发生的传播速度最快、感染范围最广、防控难度最大的一次重大突发公共卫生事件。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])`