小白也能学会的python疫情可视化
- 用python做疫情可视化
- 准备内容
- 导入需要用包
- 获取第三方(丁**生)实时统计数据
- 制作疫情全国地图
- 用statistics_data.json文件作出趋势图
- 总结
用python做疫情可视化
最近,新冠疫情又有反复,想要看一下全国范围内疫情情况。想起了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是其中一个挺方便的包)
获取第三方(丁**生)实时统计数据
由于csdn审核问题,不能涉及第三方的版权问题,需要的话自己去丁**生官方截取host替换
'''获取当前日期'''
today = datetime.date.today().strftime('%Y%m%d')
def crawl_dxy_data():
"""
获取丁**生实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件
"""
host = '丁**生官网地址'
response = requests.get(host + '/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 [%s]>' % 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('<Response [%s]> 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效果如下,可以点击城市,会弹出对应的城市当前确诊人数
用statistics_data.json文件作出趋势图
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还是一个比较简单的脚本语言,对于数据处理、分析非常友好。
这是一个简单的使用例子希望给大家参考。
附上jupyter notebook的源码:https://github.com/boyisterry/yqksh.git