Loading... # 累计确诊病例走势 这章将使用交互图表工具 `pyechats`来制作动态图表,LETS GO! 首先依然是准备数据 ```python # 读取数据 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() ``` ## 按天计算每日新增数据 目前提取的*全国数据的确诊、疑似及死亡病例*都是累计数据,我们需要按天计算每日新增数据,计算逻辑如下: + 今日新增确诊病例 = 今日确诊病例 - 昨日确诊病例 + 今日新增疑似病例 = 今日疑似病例 - 昨日疑似病例 + 今日新增死亡病例 = 今日死亡病例 - 昨日死亡病 ```python # 举例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` --- ## 计算确诊病例增长率 *确诊病例增长率*计算逻辑如下: + 今日确诊病例增长率 = 今日新增确诊病例 / 昨日确诊病例 代码如下: ```python # 计算确诊病例增长率 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的版本 绘制代码如下: ```python # 绘制累计确诊病例动态图表 # 导入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 ``` 输出结果为(可通过鼠标点击或者拖动改变日期区间哦): <figure><iframe height="450" width="100%" src="https://cdn.erek.top/2021/01/xg4/01.html" frameborder="0" allowfullscreen="" onload="changeFrameHeight()"></iframe></figure> --- **知识点** > `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`. ## 绘制累确诊病例增长率动态图表 我们基于确诊病例增长率字段,绘制累计确诊病例增长率动态图表,代码如下: ```python # 绘制累确诊病例增长率动态图表 # 创建折线图对象 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 ``` 输出结果为: <figure><iframe height="450" width="100%" src="https://cdn.erek.top/2021/01/xg4/02.html" frameborder="0" allowfullscreen="" onload="changeFrameHeight()"></iframe></figure> --- **知识点** > `line.add()`的参数解释: > > + `is_smooth=True`用于设置折线是否平滑,是可选参数 > + `tooltip_axispointer_type = 'cross'`用于设置指示器类型,支持3种情况:`'line'、'shadow'、'cross'` --- ## 如何合并多个图表? 代码如下: ```python # 合并图表 # 设置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 ``` 输出结果为: <figure><iframe height="450" width="100%" src="https://cdn.erek.top/2021/01/xg4/03.html" frameborder="0" allowfullscreen="" onload="changeFrameHeight()"></iframe></figure> --- **知识点** > 共用的参数在第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绘制可交互图表! <hr class="content-copyright" style="margin-top:50px" /><blockquote class="content-copyright" style="font-style:normal"><p class="content-copyright">版权属于:Erek</p><p class="content-copyright">本文链接:<a class="content-copyright" href="https://erek.top/archives/86.html">https://erek.top/archives/86.html</a></p><p class="content-copyright">转载时须注明出处及本声明</p></blockquote> 最后修改:2021 年 01 月 17 日 06 : 27 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付