累计确诊病例走势

这章将使用交互图表工具 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-2239357417NaNNaNNaN
2020-01-23107283525679.0261.08.0
2020-01-241965129741893.0462.016.0
2020-01-252684198556719.0688.015.0
2020-01-2657942761803110.0776.024.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-2239357417NaNNaNNaNNaN
2020-01-23107283525679.0261.08.00.455
2020-01-241965129741893.0462.016.00.553
2020-01-252684198556719.0688.015.00.530
2020-01-2657942761803110.0776.024.00.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种情况:axisitemnone.

绘制累确诊病例增长率动态图表

我们基于确诊病例增长率字段,绘制累计确诊病例增长率动态图表,代码如下:

# 绘制累确诊病例增长率动态图表
# 创建折线图对象
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_showdatazoom_rangetooltip_trigger
合并图表需要调用 pe.Overlap对象,然后用 pe.Overlap.add分别添加几个图表

  • 如果需要新增y轴,需要同时设置yaxis_index=1,is_add_yaxis=True两个参数

PANDAS与PYECHARTS的绘图区别

pandas的内置方法,绘图会更快;而pyecharts由于更偏向数据展示,并且有交互功能,所以参数设置上会更复杂。

实际场景下的复杂数据分析需求,数据分析阶段尽可能的用pandas,在最后结果已定的情况下,再用pyecharts绘制可交互图表!

最后修改:2021 年 01 月 17 日 06 : 27 PM
如果觉得我的文章对你有用,请随意赞赏