Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个时间序列可视化神器:Plotnine

一个时间序列可视化神器:Plotnine

作者头像
数据STUDIO
发布于 2024-07-24 01:59:43
发布于 2024-07-24 01:59:43
1.2K00
代码可运行
举报
文章被收录于专栏:数据STUDIO数据STUDIO
运行总次数:0
代码可运行
一图胜千言,可视化是一种从数据中快速有效获取有效信息的方法。本文云朵君和大家一起学习使用图形探索时间序列数据。

我们将利用6种不同的图表来揭示时间序列数据的各个方面。重点介绍Python中的plotnine库,这是一种基于图形语法(Grammar of Graphics)的绘图工具。

探索性数据分析(Exploratory Data Analysis,EDA)旨在揭示数据集内在的结构和模式。这个过程几乎总是涉及使用可视化技术来呈现数据。

对于时间序列数据,使用图形进行分析可以帮助我们快速发现:

  • 基本模式,如趋势或周期性规律
  • 异常情况,包括缺失值或异常值
  • 数据分布的变化

本文需要用到的python库如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from datasetsforecast.m3 import M3
import plotnine as p9
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import acf
from sklearn.model_selection import train_test_split
from mizani.breaks import date_breaks
from mizani.formatters import date_format
from numerize import numerize
from statsmodels.tsa.seasonal import STL

探索时间序列

我们首先加载一个时间序列。这里我们将使用 M3 数据集中提供的月度时间序列。直接从datasetsforecast库中获取它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from datasetsforecast.m3 import M3
dataset, *_ = M3.load('./data', 'Monthly')
series = dataset.query(f'unique_id=="M400"')

注意,使用该方法是需要满足pandas版本要求,否则会报错。直接安装对应新版即可。

现在云朵君将和大家一起学习如何使用 plotnine 创建图形。这个库是 Python 的一种 ggplot2。

如果你还没有安装,直接安装即可。

从设置主题开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import plotnine as p9

MY_THEME = p9.theme_538(base_family='Palatino', base_size=12) + \
           p9.theme(plot_margin=.025,
                    axis_text_y=p9.element_text(size=10),
                    panel_background=p9.element_rect(fill='white'),
                    plot_background=p9.element_rect(fill='white'),
                    strip_background=p9.element_rect(fill='white'),
                    legend_background=p9.element_rect(fill='white'),
                    axis_text_x=p9.element_text(size=10))

我们将使用基于theme_538的主题并进行一些额外的修改。

时间序列图

绘制时间序列图是时间序列分析的第一步。时间序列图是一种线形图,用于展示数据值随时间的变化趋势。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import plotnine as p9

time_plot = p9.ggplot(data=series) + \
            p9.aes(x='ds', y='y') + \
            MY_THEME + \
            p9.geom_line(color='#58a63e', size=1) + \
            p9.labs(x='Datetime', y='value')

time_plot + p9.theme(figure_size=(8,3))

时间序列图

通过观察时间序列图,我们可以快速发现数据中存在的一些基本模式,如趋势、周期性等。同时,如果数据的均值或方差出现明显变化,在图上也能一目了然。

示例数据表现出一种随机趋势,数据值先是上升到一个拐点,之后开始下降。同时周期性的波动表明数据中可能存在季节性成分。

还可以使用分解数据构建时间图。首先,我们使用 STL 分解时间序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
from statsmodels.tsa.seasonal import STL

ts_decomp = STL(series['y'], period=12).fit()

components = {
    'Trend': ts_decomp.trend,
    'Seasonal': ts_decomp.seasonal,
    'Residuals': ts_decomp.resid,
}

components_df = pd.DataFrame(components).reset_index()
melted_data = components_df.melt('index')

然后,我们使用facet_grid为每个部分创建时间图,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numerize import numerize 

# 一个在图形中总结大值的好技巧
labs = lambda lst: [numerize.numerize(x) for x in lst] 

decomposed_timeplot = \ 
    p9.ggplot(melted_data) + \ 
    p9.aes(x= 'index' , y= 'value' ) + \ 
    p9.facet_grid( 'variable ~.' , scales= 'free' ) + \ 
    MY_THEME + \ 
    p9.geom_line(color= '#58a63e' , size= 1 ) + \ 
    p9.labs(x= 'Datetime index' ) + \ 
    p9.scale_y_continuous(labels=labs)

时间序列分解图

此变体使检查每个组件变得更容易。在这种情况下,趋势和季节性影响变得清晰。

我们使用numerize使大数字更清晰易读。你也可以将此样式添加到任何其他绘图中。

滞后图

滞后散点图是将时间序列的当前值与前一个值(滞后值)画在平面坐标系上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = [series['y'].shift(i) for i in list(range(2, 0, -1))]
X = pd.concat(X, axis=1).dropna()
X.columns = ['t-1', 't']

lag_plot = p9.ggplot(X) + \
           p9.aes(x='t-1', y='t') + \
           MY_THEME + \
           p9.geom_point(color='#58a63e') + \
           p9.labs(x='Series at time t-1',
                   y='Series at time t') + \
           p9.scale_y_continuous(labels=labs) + \
           p9.scale_x_continuous(labels=labs)

滞后散点图可以帮助我们了解时间序列的内在结构。如果数据点沿对角线密集分布,说明该时间序列存在自相关性,点分布越集中则自相关性越强。如果数据点分散分布,则表明该序列是随机的,前值对后值没有预测作用。

时间序列滞后图

滞后散点图还可用于发现异常值,异常值点将远离数据点的密集区域。

示例数据的点倾向于沿对角线分布,但当值越大时,离散程度也越大。这种特征表明该序列可能存在自回归结构。

自相关图

自相关性是衡量时间序列在过去值(滞后)中观察到的与自身相关的程度的指标。绘制自相关系数图有助于了解时间序列的内部结构。

你可以使用statsmodels来计算自相关:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from statsmodels.tsa.stattools import acf

acf_x = acf(
    series['y'],
    nlags=24,
    alpha=0.05,
    bartlett_confint=True
)

acf_vals, acf_conf_int = acf_x[:2]

acf_df = pd.DataFrame({
    'ACF': acf_vals,
    'ACF_low': acf_conf_int[:, 0],
    'ACF_high': acf_conf_int[:, 1],
})

acf_df['Lag'] = ['t'] + [f't-{i}' for i in range(1, 25)]
acf_df['Lag'] = pd.Categorical(acf_df['Lag'], categories=acf_df['Lag'])

然后,我们使用plotnine构建一个棒棒糖图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
significance_thr = 2 / np.sqrt(len(series['y']))

acf_plot = p9.ggplot(acf_df, p9.aes(x='Lag', y='ACF')) + \
           p9.geom_hline(yintercept=significance_thr,
                         linetype='dashed',
                         color='#58a63e',
                         size=.8) + \
           p9.geom_hline(yintercept=-significance_thr,
                         linetype='dashed',
                         color='#58a63e',
                         size=.8) + \
           p9.geom_hline(yintercept=0, linetype='solid', color='black', size=1) + \
           p9.geom_segment(p9.aes(x='Lag',
                                  xend='Lag',
                                  y=0, yend='ACF'),
                           size=1.5,
                           color='#58a63e'
                           ) + \
           p9.geom_point(size=4, color='darkgreen', ) + \
           MY_THEME

自相关图

如果自相关系数随滞后阶数的增加而缓慢衰减,表明数据可能存在趋势成分;如果自相关系数呈现出明显的波动模式,峰值出现在特定的滞后阶数上,则说明数据中可能存在明显的周期性。如果自相关系数始终接近于0,则表明该序列可能是白噪声序列,即随机序列。

季节子序列图

有些图形工具专门用于探究时间序列的季节性成分,如季节子序列图。

季节子序列图的绘制方法是:根据数据的季节周期,将整个序列分组,每组包含一个完整的季节周期。然后将每个周期的数据值绘制在同一张图上,从而可视化观察序列在不同季节的表现模式。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grouped_df = series.groupby('Month')['y']
group_avg = grouped_df.mean()
group_avg = group_avg.reset_index()
series['Month'] = pd.Categorical(series['Month'], 
                                 categories=series['Month'].unique())
group_avg['Month'] = pd.Categorical(group_avg['Month'], 
                                    categories=series['Month'].unique())

seas_subseries_plot = \
    p9.ggplot(series) + \
    p9.aes(x='ds',
           y='y') + \
    MY_THEME + \
    p9.theme(axis_text_x=p9.element_text(size=8, angle=90),
             legend_title=p9.element_blank(),
             strip_background_x=p9.element_text(color='#58a63e'),
             strip_text_x=p9.element_text(size=11)) + \
    p9.geom_line() + \
    p9.facet_grid('. ~Month') + \
    p9.geom_hline(data=group_avg,
                  mapping=p9.aes(yintercept='y'),
                  colour='darkgreen',
                  size=1) + \
    p9.scale_y_continuous(labels=labs) + \
    p9.scale_x_datetime(breaks=date_breaks('2 years'), 
                        labels=date_format('%Y')) + \
    p9.labs(y='value')

seas_subseries_plot + p9.theme(figure_size=(10,4))

季节子序列图

此图对于揭示季节内和跨季节的模式很有用。

在示例时间序列中,我们可以看到平均值在 3 月份最低。在某些月份(例如 5 月),该序列显示出强劲的正趋势。

分组密度图

现实中的时间序列数据往往会受到各种因素的干扰和影响,导致数据模式产生变化。

我们可以利用分组密度图等可视化工具,来观察这些干扰事件对数据的影响。将数据按照干扰事件进行分组,每组对应一个不同的状态,然后分别绘制每组数据的密度曲线,从而比较不同状态下数据的分布差异。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 某些事件发生在索引 23
change_index = 23

before, after = train_test_split(series, train_size=change_index, shuffle=False)

n_bf, n_af = before.shape[0], after.shape[0]

p1_df = pd.DataFrame({'Series': before['y'], 'Id': range(n_bf)})
p1_df['Part'] = 'Before change'
p2_df = pd.DataFrame({'Series': after['y'], 'Id': range(n_af)})
p2_df['Part'] = 'After change'

df = pd.concat([p1_df, p2_df])
df['Part'] = pd.Categorical(df['Part'], categories=['Before change', 'After change'])

group_avg = df.groupby('Part').mean()['Series']

density_plot = \
    p9.ggplot(df) + \
    p9.aes(x='Series', fill='Part') + \
    MY_THEME + \
    p9.theme(legend_position='top') + \
    p9.geom_vline(xintercept=group_avg,
                  linetype='dashed',
                  color='steelblue',
                  size=1.1,
                  alpha=0.7) + \
    p9.geom_density(alpha=.2)

在这个特定的例子中,索引 23 处发生了一些事件。这里随意选择了这个特定的时间步骤。但是,你可以使用变化点检测方法来检测重要的时间步骤。

分组密度图

我们绘制了临界点前后的分布图。分布有明显的变化。

写在最后

探索性数据分析是时间序列分析和预测的基础环节。本文介绍了6种有助于探索时间序列内在模式和结构的可视化图形技术:

  • 时间序列图: 直观展示数据随时间的变化趋势,发现潜在的趋势和周期性。
  • 分解时间序列图: 将原始序列分解为趋势、周期、残差等不同成分,有助于进一步分析。
  • 滞后散点图: 将当前值与前若干滞后值绘制在散点图上,检验序列的自相关性。
  • 自相关系数图: 绘制不同滞后阶数下的自相关系数,判断序列中趋势和周期性的存在。
  • 季节子序列图: 根据季节周期对序列分组,展现不同季节下的数据模式。
  • 分组密度图: 根据干扰事件对数据进行分组,比较不同状态下数据分布的差异。本文使用Python的plotnine库进行可视化,它提供了丰富的统计绘图功能,是基于R的ggplot2设计的。实例代码可在plotnine官网查阅:https://plotnine.org/tutorials/。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据STUDIO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
常用 7 大类型图形可视化——变化趋势图形
在进行数据分析时,免不了对结果进行可视化。那么,什么样的图形才最适合自己的数据呢?一个有效的图形应具备以下特点:
庄闪闪
2022/10/31
2.1K0
干货 | 20个教程,掌握时间序列的特征分析(附代码)
【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用 Python 对时间序列进行特征分析。
AI科技大本营
2019/07/11
6.2K0
干货 | 20个教程,掌握时间序列的特征分析(附代码)
数据可视化 | Pandas vs Plotnine
但是两者对比的还没有,今天我们尝试分别用pandas和plotnine作直方图、散点图。
数据森麟
2020/10/09
9340
数据可视化 | Pandas vs Plotnine
用python做时间序列预测九:ARIMA模型简介
c是常数项,εt是随机误差项。 对于一个AR(1)模型而言: 当 ϕ1=0 时,yt 相当于白噪声; 当 ϕ1=1 并且 c=0 时,yt 相当于随机游走模型; 当 ϕ1=1 并且 c≠0 时,yt 相当于带漂移的随机游走模型; 当 ϕ1<0 时,yt 倾向于在正负值之间上下浮动。
AI粉嫩特工队
2020/06/17
32.5K1
Matplotlib时间序列型图表(1)
在前几篇文章中,我们介绍了数据分布型图表的几种绘制方法,如下图所示(滑动以浏览),对以往的工作做个总结。目的就是简化大家代码的书写过程,拓宽绘图方法,为科研和商业绘图提供帮助。
python数据可视化之路
2023/02/23
2.6K0
Matplotlib时间序列型图表(1)
时间序列 ACF 和 PACF 理解、代码、可视化
我们说时间序列可以被预测,主要基于以下事实:我们可以部分掌握影响该时间序列的因素的变化情况。换句话说,对时间序列进行预测,其实就是利用各种理论和工具,对观察到的时间序列进行“抽丝剥茧”,以试图掌握其变化的本质,从而对未来的表现进行预测。
Python数据科学
2024/02/05
3.1K0
时间序列 ACF 和 PACF 理解、代码、可视化
创美时间序列【Python 可视化之道】
时间序列数据在许多领域中都是常见的,包括金融、气象、股票市场等。通过可视化这些时间序列数据,我们可以更直观地理解数据的趋势、周期性和异常情况。Python提供了许多强大的可视化库,如Matplotlib、Seaborn和Plotly,可以帮助我们创建漂亮的时间序列图表。本文将介绍如何使用这些库来可视化时间序列数据。
一键难忘
2024/07/08
3890
TOP50 Python可视化经典案例下(附源码,建议收藏)
昨天行哥给大家统计了数据可视化前30张图表代码和案例给大家,今天把分享Python可视化案例TOP 50下,如果想转行做数据分析,这两篇推文强烈建议收藏,对于学习有任何问题都可以点击阅读原文向行哥提问哦
行哥玩Python
2020/07/14
2.9K0
TOP50 Python可视化经典案例下(附源码,建议收藏)
用python做时间序列预测十:时间序列实践-航司乘客数预测
陆陆续续写了10篇时间序列相关的文章了,本系列主要是应用为主,包括初识概念、时间序列数据可视化、时间序列分解、平稳/非平稳时间序列、时间序列缺失值处理、相关函数图/偏相关函数图/滞后图、时间序列复杂度量化、Granger causality test(格兰杰因果检验)、ARIMA模型简介、时间序列实践-航司乘客数预测。 暂时先记录到这里,后续应该还会补充一些,比如基于深度学习的时间序列预测等。
AI粉嫩特工队
2020/06/16
4.1K0
Pandas 高级教程——高级时间序列分析
Pandas 提供了强大的时间序列处理功能,使得对时间序列数据进行高级分析变得更加灵活和方便。在本篇博客中,我们将深入介绍 Pandas 中的高级时间序列分析技术,并通过实例演示如何应用这些功能。
Echo_Wish
2023/12/29
5570
时间序列分析中的自相关
在时间序列分析中,我们经常通过对过去的理解来预测未来。为了使这个过程成功,我们必须彻底了解我们的时间序列,找到这个时间序列中包含的信息。
deephub
2023/01/18
1.4K0
打开我的收藏夹 -- Python时间序列分析篇
这两天,又接收到了不少新的讯息。我是越来越佩服“梦想橡皮檫”,檫哥了(打开周榜/总榜很好找,前排),他居然能用几年的时间来打磨一个系列。别说收39块,就是原价99我也买了,不为啥,就凭人家打磨了三年的毅力,我服!!!
看、未来
2021/09/18
8570
时间序列预测全攻略(附带Python代码)
原文作者:AARSHAY JAIN 36大数据翻译,http://www.36dsj.com/archives/43811 时间序列(简称TS)被认为是分析领域比较少人知道的技能。(我也是几天前才知道它)。但是你一定知道最近的小型编程马拉松就是基于时间序列发展起来的,我参加了这项活动去学习了解决时间序列问题的基本步骤,在这儿我要分享给大家。这绝对能帮助你在编程马拉松中获得一个合适的模型。 文章之前,我极力推荐大家阅读《基于R语言的时间序列建模完整教程》A Complete Tutorial on Ti
机器学习AI算法工程
2018/03/13
15.2K0
时间序列预测全攻略(附带Python代码)
如何在时间序列预测中检测随机游走和白噪声
无论多么强大,机器学习都无法预测一切。例如与时间序列预测有关的领域中,表现得就不是很好。
deephub
2021/07/23
2.2K0
如何在时间序列预测中检测随机游走和白噪声
最完整的时间序列分析和预测(含实例及代码)
在生产和科学研究中,对某一个或者一组变量 进行观察测量,将在一系列时刻所得到的离散数字组成的序列集合,称之为时间序列。
润森
2022/09/22
4.7K0
最完整的时间序列分析和预测(含实例及代码)
[010] R语言中酷炫可视化的ggplot2如何在Python中实现?
Plotnine is the implementation of the R package ggplot2 in Python. It replicates the syntax of R package ggplot2 and visualizes the data with the concept of the grammar of graphics. It creates a visualization based on the abstraction of layers. When we are making a bar plot, we will build the background layer, then the main layer of the bar plot, the layer that contains title and subtitle, and etc. It is like when we are working with Adobe Photoshop. The plotnine package is built on top of Matplotlib and interacts well with Pandas. If you are familiar with the ggplot2, it can be your choice to hand-on with plotnine.
Sam Gor
2020/12/02
2.2K0
[010] R语言中酷炫可视化的ggplot2如何在Python中实现?
时间序列预测的20个基本概念总结
时间序列数据是有序的。这意味着观察/数据点依赖于以前的观察/数据点。因此,在模型训练期间,数据点顺序不会被打乱。
deephub
2023/08/30
9040
时间序列预测的20个基本概念总结
机器学习和可视化还能一起这样用?Python教你全搞定
今天这篇推文,我们继续空间数据可视化的最后一个系列-类别插值(categorical-spatial-interpolation) 可视化绘制的推文教程,这期我们使用Python进行绘制,涉及的知识点如下:
DataCharm
2021/02/22
5670
机器学习和可视化还能一起这样用?Python教你全搞定
最全总结【时间序列】时间序列的预处理和特征工程
时间序列(Time Series)是按时间顺序排列的一组数据点,通常用于描述和分析随时间变化的现象。时间序列数据在许多领域中都有广泛应用,如金融市场、气象学、经济学、医学等。
机器学习司猫白
2025/01/21
1.9K0
最全总结【时间序列】时间序列的预处理和特征工程
用python做时间序列预测六:相关函数图、偏相关函数图、滞后图
对于白噪声序列,按理说不会有任何自相关性,我们期望的自相关性为0,但是由于随机扰动的存在,自相关性不会为0,而通常假设随机扰动符合标准正态分布(均值为0,标准差为1),那么这个随机扰动的95%置信区间(一般都取95%,当然也可以调整这个概率)可以通过如下算式计算
AI粉嫩特工队
2020/06/10
4.8K1
推荐阅读
相关推荐
常用 7 大类型图形可视化——变化趋势图形
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验