西柚媛 程序媛驿站今天
当下,新型冠状病毒感染的肺炎疫情无时无刻不牵动着人们的心。面对来势汹汹的疫情,除了奋战在前线的医护人员以及防疫建设工作者们,小媛们也想尽一份绵薄之力。
这不,今天为大家带来了一份超超超简单的!生成自己的疫情地图的方法,各位想要动手的小可爱可以操练起来啦!
秘诀嘛
总结起来就八个字:
万能接口~快速上手
下面我们开始喽~
01
爬取丁香园实时统计数据
我们要爬取的是丁香园大佬的公开统计数据,这才让我们的疫情地图生成有了可能。咳咳,数据才是王道。
import re
import requests
import datetime
today = datetime.date.today().strftime(%Y%m%d) 20200315
def crawl_dxy_data():
"""
爬取丁香园实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件
"""
response = requests.get(https://ncov.dxy.cn/ncovh5/view/pneumonia) request.get()用于请求目标网站
print(response.status_code) 打印状态码
try:
url_text = response.content.decode() 更推荐使用response.content.deocde()的方式获取响应的html页面
print(url_text)
url_content = re.search(rwindow.getAreaStat = (.*?)}]}catch, re.search():扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ,然后返回相应的match对象。
url_text, re.S) 在字符串a中,包含换行符\n,在这种情况下:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始;
而使用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:
json.dump(json_data, f, ensure_ascii=False)
except:
print( % response.status_code)
if __name__ == __main__:
crawl_dxy_data()
当 print(response.status_code) 输出200即为成功状态。 从以上代码我们可以看到,我们会生成一个 data/ + today + .json 的文件,这样我们就轻松爬取到今日的疫情数据啦:data/20200331.json
02
安装可视化工具库
Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。当数据分析遇上数据可视化时,pyecharts 诞生了。
更多pyecharts api可以参考:
https://pyecharts.org//zh-cn/chart_api
安装第三方库pyecharts
pip install pyecharts
如果下载时出现断线和速度过慢的问题导致下载失败,可以尝试使用清华镜像
pip install -ihttps://pypi.tuna.tsinghua.edu.cn/simplepyecharts
以上两步是不是都超简单啦
接下来我们就可以疫情可视化啦
这里小媛选了饼状图和地图两种形式呈现给大家
可以根据喜好自行选择哦
03
绘制疫情饼状图
import datetime
from pyecharts.charts import Pie
from pyecharts import options as opts
读原始数据文件
today = datetime.date.today().strftime(%Y%m%d) 20200331
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[confirmedCount]))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True) reverse=True,表示降序,反之升序
print(china_data)
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
c = (
Pie()
.add("累计确诊", [list(z) for z in zip(labels, counts)])
.set_global_opts(
title_opts=opts.TitleOpts(title="3月31日疫情分布图"),
legend_opts=opts.LegendOpts(orient="vertical"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("3月31日疫情分布图.html")
)
以上代码 print(china_data) 会输出我国各省的今日疫情状况,输出如下:
[(湖北, 67801), (广东, 1490), (河南, 1276), (浙江, 1257), (湖南, 1018), (安徽, 990), (江西, 937), (山东, 774), (香港, 682), (江苏, 646), (北京, 580), (重庆, 579), (四川, 550), (上海, 509), (黑龙江, 484), (福建, 343), (河北, 321), (台湾, 306), (广西, 254), (陕西, 253), (云南, 181), (天津, 174), (海南, 168), (贵州, 147), (辽宁, 139), (甘肃, 138), (山西, 136), (内蒙古, 107), (吉林, 98), (新疆, 76), (宁夏, 75), (澳门, 39), (青海, 18), (西藏, 1)]
然后该代码会为我们生成一个文件:3月31日疫情分布图.html
一个简单的今日疫情饼状图就生成啦
以上的代码可以根据自己的喜好进行相应更改哦
04
绘制疫情地图
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts
读原始数据文件
today = datetime.date.today().strftime(%Y%m%d) 20200315
datafile = data/+ today + .json
with open(datafile, r, encoding=UTF-8) as file:
json_array = json.loads(file.read())
分析全国实时确诊数据:confirmedCount字段
china_data = []
for province in json_array:
china_data.append((province[provinceShortName], province[confirmedCount]))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True) 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)) 是否显示视觉映射配置
render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html")
m.render(path=全国实时确诊数据.html)
该代码会为我们生成一个文件:全国实时确诊数据.html,一个简单的今日疫情地图就生成啦
怎么样
今天的内容
是不是
超令人激动
快来领取你自己的疫情地图吧!
悄悄:一种更简单的方法,进入AISTUDIO,环境都不用本地安装哦
作者:西柚媛
编辑:西柚媛
推荐阅读:
Paper | ACL2017 对话模型之CVAE的多样性回复
面试必考 | 深度学习领域的数据增强
投稿、交流&合作 欢迎扫码加群
NLP、ML、PG、求职、Paper、实战项目、书籍
群二维码,七天后过期