综合案例
需求:
已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图
相关知识点:
json
json简介: 本质是一个特定格式的字符串 举例: '[{},{},{}]' 或者 '{}'
python中json包: import json
python数据转为json数据: 变量接收json数据 = json.dumps(python字典或者列表)
json数据转为python数据: 变量接收python字典或者列表 = json.loads(json数据)
pyecharts
pyecharts简介: python版本的echarts可视化工具
使用pyecharts包: 先安装pyecharts,再导包: import pyecharts
可以制作不同种类的图表,示例如下:
制作饼图: from pyecharts.charts import Pie
制作地图: from pyecharts.charts import Map
制作折线图: from pyecharts.charts import Line
制作柱状图: from pyecharts.charts import Bar
制作图表步骤,如下:
1.导包
2.创建对象
3.添加数据
4.设置全局选项
5.渲染成页面
代码:
前提是: 把资料中的疫情数据目录复制到项目中
自定义模块:
此模块目的是为了重复去读取各个国家疫情数据
read_json_file.py模块代码如下:
# 导包
import json
# 定义一个函数用于处理和分析各个国家的疫情数据
def get_data_2020(file_path, rep_str):
"""
此函数用于处理和分析各个国家的疫情数据
:param file_path: json文件路径
:param rep_str: 要替换的json数据开头子串
:return: 返回的是元组(日期数据,确诊数据)
"""
# 一.数据处理: 抽取 转换 加载
# 1.抽取: 读取文件中json数据
with open(file_path, 'r', encoding='utf8') as f:
json_data = f.read()
# 打印数据,测试是否成功读取,注意: 测试完可以注释或者删除
# print(json_data)
# 2.转换: 把json数据中无效的数据清洗过滤掉
# 去除开头的'jsonp_1629344292311_69436('
json_data = json_data.replace(rep_str, '')
# 去除结尾的');'
json_data = json_data[:-2]
# 3.加载: 把json数据转为python容器
dict_data = json.loads(json_data)
# 打印数据,测试是否成功读取,注意: 测试完可以注释或者删除
# print(dict_data)
# print(type(dict_data))
# 二.数据分析: 海量数据提取对自己有价值的部分数据
# 再次明确目的: 做2020年各个国家确诊人数折线图
# 分析哪些是有价值的数据? 2020年的 updateDate对应日期数据 以及 '确诊'的data数据
# 1.先分别获取国家所有的日期数据以及确诊数据
update = dict_data['data'][0]['trend']['updateDate']
data = dict_data['data'][0]['trend']['list'][0]['data']
# 2.获取2020年的日期数据: 核心就是获取到2020年的截止索引
time_2020 = update[:update.index('12.31') + 1]
# print(2020update)
# 3.获取2020年确诊数据: 核心就是获取到2020年的截止索引
data_2020 = data[:update.index('12.31') + 1]
# print(uas_2020data)
# 返回最终结果 默认放到元组容器中(a,b)
return time_2020, data_2020
测试模块:
# 下述导自定义模块模块报错,因为模块名称不能以数字开头
# import 02_自定义读取文件模块.py
# 改名后再导自定义模块正常,因为模块名符合标识符规则
import read_json_file
# 测试自定义模块是否能够使用
# 1.获取美国的2020年疫情数据
r1 = read_json_file.get_data_2020('疫情数据/美国.txt', 'jsonp_1629344292311_69436(')
print(r1)
# 2.获取日本的2020年疫情数据
r2 = read_json_file.get_data_2020('疫情数据/日本.txt', 'jsonp_1629350871167_29498(')
print(r2)
# 3.获取美国的2020年疫情数据
r3 = read_json_file.get_data_2020('疫情数据/印度.txt', 'jsonp_1629350745930_63180(')
print(r3)
数据可视化:
# 1.导包
from pyecharts.charts import Line
from read_json_file import get_data_2020
import pyecharts.options as opts
# 2.创建对象
line = Line(init_opts=opts.InitOpts(width='1500px', height='800px'))
# 3.添加数据(x和y轴)
# 先读取数据
us_all_data20 = get_data_2020('疫情数据/美国.txt', 'jsonp_1629344292311_69436(')
jp_all_data20 = get_data_2020('疫情数据/日本.txt', 'jsonp_1629350871167_29498(')
in_all_data20 = get_data_2020('疫情数据/印度.txt', 'jsonp_1629350745930_63180(')
# 再添加数据
line.add_xaxis(jp_all_data20[0])
# 由于三个数据个数不一致,会导致数据错位
# us数据列表头添加1个0元素
us_all_data20[1].insert(0, 0)
# in数据前面添加46个0元素
# 采用列表推导式快速生成多个0列表,然后和原有列表拼接成新的一个列表
zero_list = [i * 0 for i in range(46)]
in_all_data20 = zero_list + in_all_data20[1]
# 添加数据
line.add_yaxis('us数据', us_all_data20[1], symbol_size=10,linestyle_opts=opts.LineStyleOpts(width=5))
line.add_yaxis('jp数据', jp_all_data20[1], symbol_size=10)
line.add_yaxis('in数据', in_all_data20, symbol_size=10, label_opts=opts.LabelOpts(is_show=False))
# 4.设置全局选项
line.set_global_opts(
title_opts=opts.TitleOpts(title='2020印美日累计确诊人数折线图',pos_left='center',pos_bottom='1%'),
yaxis_opts=opts.AxisOpts(name='确诊人数'),
xaxis_opts=opts.AxisOpts(name='时间'),
legend_opts=opts.LegendOpts(pos_top='1%')
)
# 5.渲染成页面
line.render('2020印美日累计确诊人数折线图.html')