城市设计/数据分析/技术分享/摄影记录

0%

新冠病毒疫情分析学习04-累计确诊病例走势

累计确诊病例走势

这章将使用交互图表工具pyechats来制作动态图表,LETS GO!

首先依然是准备数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 读取数据
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
2
3
4
5
6
7
# 举例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


计算确诊病例增长率

确诊病例增长率计算逻辑如下:

  • 今日确诊病例增长率 = 今日新增确诊病例 / 昨日确诊病例

代码如下:

1
2
3
4
5
6
7
# 计算确诊病例增长率
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的版本

绘制代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 绘制累计确诊病例动态图表
# 导入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.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
# 绘制累确诊病例增长率动态图表
# 创建折线图对象
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'

如何合并多个图表?

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 合并图表
# 设置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两个参数

PANDA与PYECHARTS的绘图区别

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

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

吃颗糖
  • 本文作者: Erek
  • 本文链接: https://erek.top/2020/004-xg/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!