累计确诊病例走势
这章将使用交互图表工具 pyechats
来制作动态图表,LETS GO!
首先依然是准备数据
# 读取数据
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# 设置不弹出警告
df = pd.read_excel('*/*/data_ncov.xlsx')
#记得修改自己的文件路径
# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换
# 提取全国数据
data_china = df.groupby('date')[['疑似','确诊','死亡']].sum()
data_china.head()
按天计算每日新增数据
目前提取的全国数据的确诊、疑似及死亡病例都是累计数据,我们需要按天计算每日新增数据,计算逻辑如下:
- 今日新增确诊病例 = 今日确诊病例 - 昨日确诊病例
- 今日新增疑似病例 = 今日疑似病例 - 昨日疑似病例
- 今日新增死亡病例 = 今日死亡病例 - 昨日死亡病
# 举例1
# 按天计算每日新增数据
data_china['疑似新增'] = data_china['疑似'] - data_china['疑似'].shift()
data_china['确诊新增'] = data_china['确诊'] - data_china['确诊'].shift()
data_china['死亡新增'] = data_china['死亡'] - data_china['死亡'].shift()
data_china.head()
输出结果为:
date | 疑似 | 确诊 | 死亡 | 疑似新增 | 确诊新增 | 死亡新增 |
---|---|---|---|---|---|---|
2020-01-22 | 393 | 574 | 17 | NaN | NaN | NaN |
2020-01-23 | 1072 | 835 | 25 | 679.0 | 261.0 | 8.0 |
2020-01-24 | 1965 | 1297 | 41 | 893.0 | 462.0 | 16.0 |
2020-01-25 | 2684 | 1985 | 56 | 719.0 | 688.0 | 15.0 |
2020-01-26 | 5794 | 2761 | 80 | 3110.0 | 776.0 | 24.0 |
知识点
pandas.DataFrame.shift()
,将数据移动指定的位数,默认往前移动1位,如需移动2位则为data_china['疑似'].shift(2)
NaN
,空值结果,由于第一条数据往前无法移动,则返回空值NaN
,而任何与NaN有关的计算结果均为NaN
,所以上述代码输出结果中的第一条数据的新增字段都为NaN
计算确诊病例增长率
确诊病例增长率计算逻辑如下:
- 今日确诊病例增长率 = 今日新增确诊病例 / 昨日确诊病例
代码如下:
# 计算确诊病例增长率
data_china['确诊_增长率'] = data_china['确诊新增'] / data_china['确诊'].shift()
# 保留3位小数
data_china['确诊_增长率'] = data_china['确诊_增长率'].round(3)
data_china.head()
输出结果为:
date | 疑似 | 确诊 | 死亡 | 疑似新增 | 确诊新增 | 死亡新增 | 确诊_增长率 |
---|---|---|---|---|---|---|---|
2020-01-22 | 393 | 574 | 17 | NaN | NaN | NaN | NaN |
2020-01-23 | 1072 | 835 | 25 | 679.0 | 261.0 | 8.0 | 0.455 |
2020-01-24 | 1965 | 1297 | 41 | 893.0 | 462.0 | 16.0 | 0.553 |
2020-01-25 | 2684 | 1985 | 56 | 719.0 | 688.0 | 15.0 | 0.530 |
2020-01-26 | 5794 | 2761 | 80 | 3110.0 | 776.0 | 24.0 | 0.391 |
知识点
pandas.DataFrame.round()
,用于设置小数点位数,默认四舍五入
绘制累计确诊病例动态图表
接下来我们要用一个新的工具包来绘制动态图表了 —— pyecharts!
Echarts.js是一个由百度开源的基于JavaScript的数据可视化工具库,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时。pyecharts 诞生了。
pyecharts的特性包括:
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
这里使用的是pyechartsV0.5.X的版本,可以PIP直接安装0.5的版本
绘制代码如下:
# 绘制累计确诊病例动态图表
# 导入pyecharts工具包,用pe作为简写
import pyecharts as pe
# 创建柱状图对象
bar = pe.Bar('累计确诊病例 柱状图')
# 设置x轴 - 日期,这里由于第1条数据有空值,故从第2条开始
# 这里是绘图阶段,x尽量用字符串
x = data_china.iloc[1::].index.astype('str')
# 设置y轴 - 确诊病例
y = data_china['确诊'].iloc[1::]
# 绘制图表
bar.add('确诊病例', x, y,
is_datazoom_show = True, datazoom_range = [0,100],
tooltip_trigger = 'axis')
bar
输出结果为(可通过鼠标点击或者拖动改变日期区间哦):
知识点
data_china.iloc[1::]
,这里iloc[1::]
的写法代表从第2条开始到最后一条数据
data_china.iloc[1::].index.astype('str')
,在对数据进行groupby('date').sum()
分组计算后,会自动将date
字段设置成新数据的index
,所以这里需要将index
转化为str
用pyecharts绘图的基本节奏
- 设置绘图对象
bar = pe.Bar('累计确诊病例 柱状图')
- 设置数据
x、y
- 用绘图对象
bar.add()
的方法将数据加载进表格- 输出图表
bar.add()
的参数解释:
- '确诊病例',第1个参数是用于对应图例名称
is_datazoom_show = True
/datazoom_range = [0,100]
分别用于设置数据筛选条,这两个参数是可选的,这里由于横坐标是日期,字体内容较长,添加筛选条后方便用户和图表进行交互tooltip_trigger = 'axis'
,用于设置提示弹框触发类型,支持3种情况:axis
、item
、none
.
绘制累确诊病例增长率动态图表
我们基于确诊病例增长率字段,绘制累计确诊病例增长率动态图表,代码如下:
# 绘制累确诊病例增长率动态图表
# 创建折线图对象
line = pe.Line('累计确诊病例增长率 折线图')
# 设置x、y轴
x = data_china.iloc[1::].index.astype('str')
y = data_china['确诊_增长率'].iloc[1::]
# 绘制图表
line.add('增长率', x, y, is_smooth = True,
tooltip_trigger = 'axis', tooltip_axispointer_type = 'cross')
line
输出结果为:
知识点
line.add()
的参数解释:
is_smooth=True
用于设置折线是否平滑,是可选参数tooltip_axispointer_type = 'cross'
用于设置指示器类型,支持3种情况:'line'、'shadow'、'cross'
如何合并多个图表?
代码如下:
# 合并图表
# 设置x、y轴数据
x = data_china.iloc[1::].index.astype('str')
y1 = data_china['确诊'].iloc[1::] # 设置y1轴 - 确诊病例
y2 = data_china['确诊_增长率'].iloc[1::] # 设置y2轴 - 确诊增长率
# 绘制柱状图
bar = pe.Bar('累计确诊病例走势')
bar.add('确诊病例', x, y1,
is_datazoom_show = True, datazoom_range = [0,100],
tooltip_trigger = 'axis', tooltip_axispointer_type = 'cross')
# 绘制折线图
line = pe.Line('累计确诊病例增长率 折线图')
line.add('增长率', x, y2, is_smooth=True)
# 合并图表
overlap = pe.Overlap()
overlap.add(bar)
overlap.add(line,
yaxis_index=1, is_add_yaxis=True) # 新增y轴
overlap
输出结果为:
知识点
共用的参数在第1张图表设置即可,例如
is_datazoom_show
、datazoom_range
、tooltip_trigger
合并图表需要调用pe.Overlap
对象,然后用pe.Overlap.add
分别添加几个图表
- 如果需要新增y轴,需要同时设置
yaxis_index=1
,is_add_yaxis=True
两个参数
PANDAS与PYECHARTS的绘图区别
pandas的内置方法,绘图会更快;而pyecharts由于更偏向数据展示,并且有交互功能,所以参数设置上会更复杂。
实际场景下的复杂数据分析需求,数据分析阶段尽可能的用pandas,在最后结果已定的情况下,再用pyecharts绘制可交互图表!
版权属于:Erek
本文链接:https://erek.top/archives/86.html
转载时须注明出处及本声明