学的东西及时总结一下,也为了算力卡冲啊!
详细内容、项目,以及为了CPU和GPU计算资源可访问百度AI studio
作业要求,根据爬取的丁香园的实时疫情数据,用pyecharts实现饼图可视化。
1、安装pyecharts模块到externel-libraries,重启它的notebook后还能使用
`!mkdir /home/aistudio/external-libraries
!pip install pyecharts -t /home/aistudio/external-libraries
import sys
sys.path.append('/home/aistudio/external-libraries') #将路径导入才能正常import pyecharts
2、爬取数据
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()
3、Pie图
import numpy as np
import json
import datetime
from pyecharts.charts import Pie
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)
# 全国疫情地图
# 自定义的每一段的范围,以及每一段的特别的样式。
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
date = datetime.date.today().strftime('%Y-%m-%d') #设置年-月-日格式
pie = Pie(init_opts=opts.InitOpts(width='1500px',height='920px')) #指定画布大小
pie.add("累计确诊", [list(z) for z in zip(labels, counts)],radius=['0',"60%"],center=["30%", "70%"]) # 指定内外半径,圆心位置
#系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}\n",font_size=13), #换行实现标签较均匀分布
is_show=False)
#全局配置项,可配置标题、动画、坐标轴、图例等
pie.set_global_opts(title_opts=opts.TitleOpts(title=date+' 全国实时确诊数据',
subtitle='数据来源:丁香园',pos_top="35%",pos_left="60%"), # 距离画布顶部的距离为画布大小的35%
legend_opts=opts.LegendOpts(is_show=True,pos_top="40%",pos_left="60%" , orient="vertical")
)
pie.render(path='/home/aistudio/data/新增确诊各省分布饼图.html')
其中LegendOpts参数解释可以参考这篇博客pyecharts修改legend icon样式
更多全局配置和系列配置,以及更过好看好玩的图参考pyechats官网
参考:https://aistudio.baidu.com/aistudio/course/introduce/1149