2019-nCoV疫情数据可视化地图效果如下:
获取数据(本文数据获取自腾讯的疫情实时追踪)
腾讯的疫情实时追踪网页: 点击查看.
这里我使用的是Google,追踪得到的数据如下图:
双击左边的 getOnsInfo?name=disease_h5&callback······ , Google 打开一个新的页面,展示最新的病情数据:
数据分析:
至此,我们就获得了需要的数据啦!
我们通过requests库来采集实时数据;由于得到的数据是json格式的,所以我们还需要json库来解析数据;链表数据可以使用pandas库方便地规范化数据(当然如果不想使用pandas照样可以,稍稍改动部分代码即可)。
话不多说,上代码:
# 腾讯的疫情实时追踪接口获取json格式疫情数据
def get_ncp_data():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
data = requests.get(url).json()['data']
return data
# 扁平化中国疫情数据
def flatten_ncp_data():
all = json.loads(get_ncp_data())
# 初始化结果链表
provinces = []
date = all['lastUpdateTime']
china = all['areaTree'][0]['children']
# 获取各省份确诊病例
for province in china:
province_ncp = province['children']
province_ncp = {
'日期': date,
'省份': province['name'],
'累计确认': province['total']['confirm']
}
provinces.append(province_ncp)
return provinces
数据可视化
这里使用的是pyecharts库(当然,也可以使用Matplotlib以及其他)
# 渲染可视化地图
def render_map_chart():
provinces = flatten_ncp_data()
df = pd.DataFrame(provinces)
map_chart = Map()
map_chart.add(
"全国NCP确诊病例分布图",
[list(z) for z in zip(list(df["省份"]), list(df['累计确认']))],
"china",
is_map_symbol_show=False
)
map_chart.set_global_opts(
title_opts=opts.TitleOpts(
title="NCP疫情地图(" + str(datetime.date.today()) + ")"
),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 1, "max": 9, "label": "1-9人", "color": "#FFE6BE"},
{"min": 10, "max": 99, "label": "10-99人", "color": "#FFB769"},
{"min": 100, "max": 499, "label": "100-499人", "color": "#FF8F66"},
{"min": 500, "max": 999, "label": "500-999人", "color": "#ED514E"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CA0D11"},
{"min": 10000, "max": 100000, "label": "10000人以上", "color": "#A52A2A"}
]))
map_chart.render('ncp_map_{}.html'.format(datetime.date.today()))
好啦,到这里也差不多结束了,是不是很简单呢!想学习的小伙伴可以动手实践实践!!
全部代码
python版本:python: 3.8(32-bit)
需要安装模块:
数据分析与处理(如果不想使用pandas就不用安装),建议下载对应,whl文件进行本地pip安装。下载地址如下:
numpy:numpy
pandas:pandas
pyecharts数据可视化分析库
pyecharts:pyecharts
此处附上网盘链接:https://pan.baidu.com/s/1cGHOxlMloDilIIK_cS8wQw
提取码:ulu0
复制这段内容后打开百度网盘手机App,操作更方便哦
import requests
import json
import pandas as pd
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts
# 腾讯数据接口获取json格式疫情数据
def get_ncp_data():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
data = requests.get(url).json()['data']
return data
# 扁平化中国疫情数据
def flatten_ncp_data():
all = json.loads(get_ncp_data())
# 初始化结果链表
provinces = []
date = all['lastUpdateTime']
# 获取各省份确诊病例
china = all['areaTree'][0]['children'] # 获得中国数据
for province in china:
province_ncp = province['children']
province_ncp = {
'日期': date,
'省份': province['name'],
'累计确认': province['total']['confirm']
}
provinces.append(province_ncp)
return provinces
# 渲染可视化地图
def render_map_chart():
provinces = flatten_ncp_data()
df = pd.DataFrame(provinces)
map_chart = Map()
map_chart.add(
"全国NCP确诊病例分布图",
[list(z) for z in zip(list(df["省份"]), list(df['累计确认']))],
"china",
is_map_symbol_show=False
)
map_chart.set_global_opts(
title_opts=opts.TitleOpts(
title="NCP疫情地图(" + str(datetime.date.today()) + ")"
),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 1, "max": 9, "label": "1-9人", "color": "#FFE6BE"},
{"min": 10, "max": 99, "label": "10-99人", "color": "#FFB769"},
{"min": 100, "max": 499, "label": "100-499人", "color": "#FF8F66"},
{"min": 500, "max": 999, "label": "500-999人", "color": "#ED514E"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CA0D11"},
{"min": 10000, "max": 100000, "label": "10000人以上", "color": "#A52A2A"}
]))
map_chart.render('ncp_map_{}.html'.format(datetime.date.today()))
if __name__ == '__main__':
render_map_chart()