最近,新冠疫情又有反复,想要看一下全国范围内疫情情况。想起了2020年初的时候做过的疫情可视化(学习资料来自AI studio提供7日机器学习内容)
我们会请求丁香医生获取全国疫情情况,所以需要request库。pip install request
我们需要制作疫情地图,需要pyecharts库。pip install pyecharts
我们需要处理数据,所以需要numpy库。pip install numpy
import json
import re
import requests
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts
import numpy as np
from pyecharts.charts import Line
我们会用到jjson
解析在丁香医生网站上读取到的内容,然后用numpy
去整合数据并用pyecharts
去展示出来(python有很多第三方包可以进行画图展示,pyecharts是其中一个挺方便的包)
'''获取当前日期'''
today = datetime.date.today().strftime('%Y%m%d')
def crawl_dxy_data():
"""
爬取丁香园实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件
"""
response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia')
print(response.status_code)
try:
url_text = response.content.decode()
url_content = re.search(r'window.getAreaStat = (.*?)}]}catch', url_text, re.S)
texts = url_content.group()
content = texts.replace('window.getAreaStat = ', '').replace('}catch', '')
json_data = json.loads(content)
with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:
# data/是我定义文件夹目录,在文件夹目录下生成 日期.json的文件,如20210117.json
json.dump(json_data, f, ensure_ascii=False)
except:
print('' % response.status_code)
def crawl_statistics_data():
"""
获取各个省份历史统计数据,保存到data目录下,存JSON文件
"""
with open('data/'+ today + '.json', 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
statistics_data = {}
for province in json_array:
response = requests.get(province['statisticsData'])
try:
statistics_data[province['provinceShortName']] = json.loads(response.content.decode())['data']
except:
print(' for url: [%s]' % (response.status_code, province['statisticsData']))
with open("data/statistics_data.json", "w", encoding='UTF-8') as f:
json.dump(statistics_data, f, ensure_ascii=False)
if __name__ == '__main__':
crawl_dxy_data()
crawl_statistics_data()
这里是一个简单的爬虫,爬取了丁香医生上的公开数据,获取全国每日疫情情况、各个省份统计的历史数据,并保存在data文件夹下用于后续使用
20210117.json是全国当前疫情确诊人数
statistics_data.json是全国各省累计详情
today = datetime.date.today().strftime('%Y%m%d')
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
# 读取当前全国疫情确诊人数
china_data = []
for province in json_array:
china_data.append((province['provinceShortName'], province['currentConfirmedCount']))
# 取出json文件里的字段,provinceShortName(城市名称)和provinceShortName(当前确诊人数),可以根据需要,改成别的字段
china_data = sorted(china_data, key=lambda x: x[1], reverse=True)
print(china_data)
# 设置当前新冠人数范围对应的颜色
pieces = [
{'min': 10000, 'color': '#540d0d'},
{'max': 9999, 'min': 1000, 'color': '#9c1414'},
{'max': 999, 'min': 500, 'color': '#d92727'},
{'max': 499, 'min': 100, 'color': '#ed3232'},
{'max': 99, 'min': 10, 'color': '#f27777'},
{'max': 9, 'min': 1, 'color': '#f7adad'},
{'max': 0, 'color': '#f7e4e4'},
]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
m = Map()
m.add("当前确诊", [list(z) for z in zip(labels, counts)], 'china')
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12),
is_show=False)
m.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据',
subtitle='数据来源:丁香园'),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(pieces=pieces,
is_piecewise=True, #是否为分段型
is_show=True)) #是否显示视觉映射配置
m.render(path='/home/aistudio/data/全国实时确诊数据.html')
# 生成全国确诊人数的HTML
做成的HTML效果如下,可以点击城市,会弹出对应的城市当前确诊人数
import numpy as np
import json
from pyecharts.charts import Line
from pyecharts import options as opts
# 读原始数据文件
datafile = 'data/statistics_data.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_dict = json.loads(file.read())
dateId = [str(da['dateId'])[4:6] + '-' + str(da['dateId'])[6:8] for da in json_dict['湖北'] if
da['dateId'] >= 20200201]
statistics__data = {}
for province in json_dict:
statistics__data[province] = []
for da in json_dict[province]:
if da['dateId'] >= 20200201:
statistics__data[province].append(da['confirmedIncr'])
#若当天该省数据没有更新,则默认为0
if(len(statistics__data[province])!=len(dateId)):
statistics__data[province].append(0)
# 全国新增趋势
all_statis = np.array([0] * len(dateId))
for province in statistics__data:
all_statis = all_statis + np.array(statistics__data[province])
all_statis = all_statis.tolist()
# 湖北新增趋势
hubei_statis = statistics__data['湖北']
# 湖北以外的新增趋势
other_statis = [all_statis[i] - hubei_statis[i] for i in range(len(dateId))]
shanghai_statis = statistics__data['上海']
line = Line()
line.add_xaxis(dateId)
line.add_yaxis("全国新增确诊病例", #图例
all_statis, #数据
is_smooth=True, #是否平滑曲线
linestyle_opts=opts.LineStyleOpts(width=4, color='#B44038'),#线样式配置项
itemstyle_opts=opts.ItemStyleOpts(color='#B44038', #图元样式配置项
border_color="#B44038", #颜色
border_width=10)) #图元的大小
line.add_yaxis("湖北新增确诊病例", hubei_statis, is_smooth=True,
linestyle_opts=opts.LineStyleOpts(width=2, color='#4E87ED'),
label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部
itemstyle_opts=opts.ItemStyleOpts(color='#4E87ED',
border_color="#4E87ED",
border_width=3))
line.add_yaxis("其他省份新增病例", other_statis, is_smooth=True,
linestyle_opts=opts.LineStyleOpts(width=2, color='#F1A846'),
label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部
itemstyle_opts=opts.ItemStyleOpts(color='#F1A846',
border_color="#F1A846",
border_width=3))
line.add_yaxis("上海", shanghai_statis, is_smooth=True,
linestyle_opts=opts.LineStyleOpts(width=3, color='#f7adad'),
label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部
itemstyle_opts=opts.ItemStyleOpts(color='#f7adad',
border_color="#f7adad",
border_width=5))
line.set_global_opts(title_opts=opts.TitleOpts(title="新增确诊病例", subtitle='数据来源:丁香园'),
yaxis_opts=opts.AxisOpts(max_=16000, min_=1, type_="log", #坐标轴配置项
splitline_opts=opts.SplitLineOpts(is_show=True),#分割线配置项
axisline_opts=opts.AxisLineOpts(is_show=True)))#坐标轴刻度线配置项
line.render(path='/home/aistudio/data/新增确诊趋势图.html')
这是用pyecharts画的趋势图,虽然不太好看,但是能用。大家可以尝试着用其他的包来画趋势图
python还是一个比较简单的脚本语言,对于数据处理、分析非常友好。
这是一个简单的使用例子希望给大家参考。
同时感谢百度的AI studio提供的学习平台