先前有关注飞桨的公众号,然后看到有新一期的深度学习7日打卡营推出,就报名参加了。每天都有奖品,本来想冲一下小度音箱和深度学习书,可惜学艺不精,做题目没别人快,运气还没别人好,算了算还是认真做完每天的打卡任务,然后最后拿到个结业证书就好了。
第一天的内容不算难,paddle的本地安装,全部按照教程走没有什么难度,要注意的是不要在同一个环境下安装两个版本的paddle,防止以后做东西的时候冲突。
然后是新冠肺炎的可视化。首先要先从丁香园的首页爬取全国各个省份的数据,这里用到requests库,这个比较简单请求页面,响应,用re获取想要的结果,然后用json解析,最后得到各个省份对应的数据。
import json
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(r'window.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)
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()
这里画图用到了pyecharts做数据的可视化工作,参考:https://pyecharts.org/#/zh-cn/chart_api 这里面的配置还是比较详细的,如果有看不懂的百度可以解决一切。
import json
import datetime
from pyecharts.charts import Pie
from pyecharts import options as opts
import numpy as np
# 读原始数据文件
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': "red"},
# {'max': 999, 'min': 500, 'color': 'orange'},
# {'max': 499, 'min': 100, 'color': 'yellow'},
# {'max': 99, 'min': 10, 'color': 'blue'},
# {'max': 9, 'min': 1, 'color': 'pink'},
# {'max': 0, 'color': 'white'},
# ]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
m = (Pie()
.add("累计确诊", [list(z) for z in zip(labels, counts)],center=["50%","50%"],radius=["5","50"])
.set_global_opts(title_opts=opts.TitleOpts(title="全国实时确诊数据",subtitle="数据来源:丁香园"),
legend_opts=opts.LegendOpts(is_show=False))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))
)
# #系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
# 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(is_piecewise=True, #是否为分段型
# is_show=False)) #是否显示视觉映射配置
#render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html")
m.render(path='/home/aistudio/data/全国实时确诊数据.html')
如果想要好看的图还是要去理解配置项的所代表的参数意义,反复推敲,但是我觉得最快的路径还是不断的去试错,然后调节参数。