新冠病毒数据可视化

目前,腾讯的 疫情实时追踪 网页能够看到实时的新冠病毒数据,可视化展示也非常清晰。但每次打开都只能看到当天的数据,所以就想把每天的数据都保存下来。保存下来后,也用 pyecharts 做了一个疫情地图。记录下要点,供参考。pyecharts 的版本更新比较快,并且 0.5 版与 1.0 版不兼容,我使用的 1.6.2 版。

使用 Chrome 浏览器,打开 疫情实时追踪 网页,然后点击 F12,打开 Developer Tools,再次点击页面刷新按钮,追踪得到数据的 Script 如下:


image

Response 返回的是 applicatio/json 格式的数据,双击左边的 getOnsInfo**, Chrome 打开一个新的页面,展示最新的病情数据:


image

在调用参数中:


image

callback 参数应该是一个基于毫秒级别的时间戳。去掉这个 callback 参数也可以获得最新的感染人数数据。

对这个返回的 json 数据,我们可以另存为一个 json 文件,并对数据的结构进行分析。分析的过程这里就不展开了。

我根据自己的目的,使用 pandas 模块,将数据保存到 Excel,通过 pyecharts 模块,将可视化地图保存为 html 文件,代码比较直观,主要的处理过程为对含有多层次的数据进行扁平化,得到一个二维的数据。地图中显示的数据市确认病例的数据。

import requests
import json
import pandas as pd
import os
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.globals import ThemeType
cities = []
def get_ncov_data() -> str:
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    data = requests.get(url).json()['data']
    return data
def flatten_ncov_data() -> list:
    all = json.loads(get_ncov_data())
    date = all['chinaTotal']['date']
    # 第一层:国家
    china = all['areaTree'][0]['children']  # get China data
    # 第二层:省份
    for province in china:
        province_ncov = province['children']
        # 第三层:市/区
        for city in province_ncov:
            # 输出格式
            city_ncov = {
                '日期': date,
                '省份': province['name'],
                '市': city['name'],
                '新增确认': city['today']['confirm'],
                '新增治愈': city['today']['heal'],
                '新增死亡': city['today']['dead'],
                '累计确认': city['total']['confirm'],
                '累计治愈': city['total']['heal'],
                '累计死亡': city['total']['dead']
            }
            cities.append(city_ncov)
if __name__ == "__main__":
    flatten_ncov_data()
    df = pd.DataFrame(cities)
    # 导出Excel
    path = os.path.dirname(os.path.abspath(__file__))
    output_file = os.path.join(path, 'output.xlsx')
    df.to_excel(output_file)
    # 使用 pyecharts 进行地图可视化显示
    map = Map()
    map.add(
        "中国",      # map name
        [list(z) for z in zip(list(df["省份"]), list(df['累计确认']))],
        "china",
        is_map_symbol_show=False
    )
    map.set_global_opts(
        title_opts=opts.TitleOpts(
            title="nCoV疫情地图(" + str(datetime.date.today()) + ")"
        ),
        visualmap_opts=opts.VisualMapOpts(
            max_=10000,
            is_piecewise=True,
            pieces=[
                {"min": 0, "max": 10, "label": "10人以下", "color": "#FFE6BE"},
                {"min": 10, "max": 100, "label": "10-100人", "color": "#FFB769"},
                {"min": 100, "max": 1000, "label": "100-1000人", "color": "#FF8F66"},
                {"min": 1000, "max": 10000, "label": "1000人以上", "color": "#ED514E"}
            ]))
    map.render()

地图显示的效果如下,与腾讯疫情地图图例的颜色一样。


image
https://www.jianshu.com/p/b424466cc65c

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论