python 时间序列分解案例——加法分解seasonal_decompose

news2024/11/16 8:49:31

文章目录

  • 一、模型简介
    • 1.1 加法分解模型
    • 1.2 乘法分解模型
    • 1.3 分析步骤
  • 二、案例
      • 2.1 背景 & 数据 & python包
      • 2.2 分析过程

一、模型简介

1.1 加法分解模型

加法分解模型适用于随着时间推移趋势和季节性变化不断累加,并且随机波动比较稳定的时间序列数据。该模型假设原始时间序列由三个组成部分相加而成:
Y t + S t + R t Y_{t}+S_{t}+R_{t} Yt+St+Rt
其中,

  • Y t Y_{t} Yt:实际观测值
  • T t T_{t} Tt:趋势(通常用指数函数来表示)
  • S t S_{t} St:季节指数(一般通过计算每个季节的平均值得到)
  • R t R_{t} Rt:残差(无法被趋势和季节性解释的部分)

1.2 乘法分解模型

乘法分解模型适用于随着时间推移趋势和季节性变化呈现出指数增长或衰减的时间序列数据。该模型假设原始时间序列由三个组成部分相乘而成:
Y t ∗ S t ∗ R t Y_{t}*S_{t}*R_{t} YtStRt

注: 在实际应用中,加法分解模型是比较常见的模型,可以使用线性回归、多项式回归等方法拟合趋势和季节性部分,而乘法分解模型则更适用于呈现出指数增长或衰减趋势的时间序列数据。

1.3 分析步骤

  • 1、观察原始数据趋势;
  • 2、确定周期;
  • 3、数据分解(趋势、季节指数、残差);
  • 4、结果解读

二、案例

2.1 背景 & 数据 & python包

  • 背景:分析某饮料产品2022.1-2023.3期间在上海的销售趋势,采用加法分解模型。
  • 数据
    在这里插入图片描述
  • statsmodels.tsa.seasonal_decompose 介绍
from statsmodels.tsa.seasonal import seasonal_decompose

result = seasonal_decompose(
	x,                  # 要分解的时间序列数据
	model='additive',   # 分解模型,可以是 'additive' (加法)或 'multiplicative'(乘法)
	filt=None,          # 最小二乘滤波器系数
	period=None,        # 时间序列的季节周期,如果未指定,则自动检测
	two_sided=True,     # 是否使用双侧滤波器
	extrapolate_trend=0 # 在不充分观察到较长时间趋势的情况下,是否应该扩展趋势组件
)

该函数返回一个 DecomposeResult 对象,其中包含分解出的趋势、季节性和残差成分等信息,可以通过下方代码来实现获取:

decomposition = seasonal_decompose(df['col_name'],freq=7)
trend = decomposition.trend 
seasonality = decomposition.seasonal 
residual = decomposition.resid

# 创建一个新的DataFrame来存储趋势、季节性和残差
decomposed_df = pd.DataFrame({'Trend': trend, 'Seasonality': seasonality, 'Residual': residual})
decomposed_df

2.2 分析过程

  • 加载相关库
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
%matplotlib inline
  • 读取数据
df = pd.read_csv('data.csv')
  • 绘制销售曲线
# 设置绘图风格
sns.set_style("whitegrid")

# 设置画布大小、精度
plt.figure(figsize = (16,4), dpi = 200)

# 绘制曲线图
ax = sns.lineplot(x='date', y='sales', data=df, color='blue', linewidth=1)

# 解决X轴密集问题:https://blog.csdn.net/small__roc/article/details/126950537?spm=1001.2014.3001.5502
ax.xaxis.set_major_locator(ticker.MultipleLocator(base=40)) 

# 添加标题和轴标签
plt.title('Sales Curve')
plt.xlabel('Date')
plt.ylabel('Sales')

# 显示图形
plt.show()

在这里插入图片描述

  • 周期确定 :饮料消费品线下销售一般会有:周末(或节假日)比工作日销量高、天气严热比冷寒销量高的特点,本文为了简化下模型,把周期设置为7天。

  • 趋势分解

df.set_index("date",inplace=True)

decomposition = seasonal_decompose(df['sales'],period=7)
trend = decomposition.trend 
seasonality = decomposition.seasonal 
residual = decomposition.resid

# 创建一个新的DataFrame来存储趋势、季节性和残差
decomposed_df = pd.DataFrame({'Trend': trend, 'Seasonality': seasonality, 'Residual': residual})

在这里插入图片描述

  • 绘制分解后的数据曲线
colors = ['red', 'orange', 'green']
linestyles = ['-', '--', ':']
linewidths = [1.5, 1.5, 1.5]
markers = [None, 's', 'o']
markersizes = [1, 1, 1]

for i, col in enumerate(decomposed_df.columns):
    decomposed_df[col].plot(
        kind='line', 
        color=colors[i], 
        linestyle=linestyles[i], 
        linewidth=linewidths[i], 
        marker=markers[i], 
        markersize = markersizes[i],
        figsize=(16, 4)
    )

# 添加标题和轴标签
plt.title('Decomposed Sales Curve')
plt.xlabel('Date')
plt.ylabel('Value')

# 添加图例
plt.legend(decomposed_df.columns)

plt.show()

在这里插入图片描述

  • 结果分析
    1、销量趋势的高点在4-7月份,但很明显去年这段时间残差波动非常大,说明存在异常情况(22年上海3-5月份口罩事件);
    2、另一处销量趋势的高点在23年1-2月份,期间残差波动也存在异常,可能的原因是春节或某产品销量猛增,具体还需进一步分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识linux之线程互斥

目录 一、线程互斥的概念 1. 多线程下全局数据的安全问题 2 线程互斥相关背景概念 二、线程加锁 1. 锁生成和销毁 2. 对一个锁加锁 3. 对一个锁解锁 三、解决多线程并发式访问临界资源问题 四、如何看待锁 1. 锁限制线程串行访问 2. 加锁和解锁的原子性 五、对锁进…

数学体操之牛顿数值法解方程的程序和图解

牛顿法是一种用来寻找函数零点的迭代方法,它基于以下思路,如果我们知道了一个函数在某个点的切线,那么函数的零点就可以通过切线与x轴的交点来近似计算。 给定一个函数,找到零点,过程如下: 选择初始点,然后使用这个点处的切线来近似,也就是…

java超详细的jvm调优

JVM调优 看这篇博客之前,可以先看我另外两篇 Java虚拟机(Jvm详解) Java垃圾回收机制(后续更新) 下面主要从以下几个方面进行展开描述: JVM实践调优主要步骤分析GC日志堆内存与元空间优化线程堆栈优化堆内存内部优化&#xff…

软件质量保证与软件测试 第五周(数据流测试)+第六周(集成测试开了个头)

数据流测试 1 定义/使用测试 一些概念的定义 例题理解概念 例子1: 定义清除的理解:就是说,如果路径上又遇到了其他定义节点,那就不是。 例子2: 第一步:先画程序图: 第二步:再…

什么是 AWS Lambda 冷启动问题?

什么是 AWS Lambda 冷启动问题? AWS Lambda 是一个无服务器计算平台,使开发人员能够快速构建和部署应用程序,而无需管理任何底层基础设施。但是,这种便利性也带来了一个缺点,即 AWS Lambda 冷启动问题。由于冷启动问题…

sgg第二天Java的语法

关键字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义  特点:关键字中所有字母都为小写  注意,关键字不能被用作标识符! 保留字 Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使 …

Qt Quick - 弹出控件综述

Qt Quick - 弹出控件综述一、概述一、抽屉控件二、菜单控件三、弹出控件四、工具提示控件一、概述 控件功能Dialog带有标准按钮和标题的弹出式对话框,用于与用户进行短期交互Drawer可以用滑动手势打开和关闭的侧面板Menu弹出式菜单,可以用作上下文菜单或…

springboot事务

对于从事 java 开发工作的同学来说,spring 的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据…

设备是如何实现延时关机的

文章目录1. 引言2. 延时关机的实现方式2.1 自建定时服务实现2.2 RocketMQ中间件实现2.2.1 生成端demo2.2.2 消费端demo3. 结尾1. 引言 在设备联动中,有些场景需要保持设备继续工作一段时间再关机。比如在厨房场景下,存在燃气灶和烟机的联动场景&#xf…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows,mac、linux服务遇到的坑做一个总结。 1、mac、linux部署: 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

HTML:彩虹按钮

彩虹按钮&#xff08;盗版按钮&#xff0c;B站仿写&#xff0c;略有不同&#xff01;&#xff09; 链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;}body{display: flex;justify-content: center;align-items: center;…

【hello Linux】Linux软件管理器yum

目录 1.Linux软件管理器yum 1.1 关于lrzsz 1.2 使用yum时的注意事项 1.3 查看软件包&#xff1a;yum list 1.4 安装软件&#xff1a;yum install 1.5 卸载软件&#xff1a;yum remove 1.6 更新yum源 1.7 实战项目 Linux&#x1f337; 1.Linux软件管理器yum 在windows系统下有应…

交友项目【查询黑名单人员,移除黑名单人员】功能实现

目录 1&#xff1a;交友项目 1.1&#xff1a;查询黑名单人员 1.1.1&#xff1a;接口地址 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;移除黑名单人员 1.2.1&#xff1a;接口地址 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&am…

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

0416 leetcode每日一题 1042. 不邻接植花

题目描述&#xff1a; 力扣 思路&#xff1a; 从题目描述中可知&#xff0c;花的种类一共有四种&#xff0c;且一定有满足题意的答案。 可以首先将所有花园中的花设置为0&#xff0c;然后遍历与其相邻的花园&#xff0c;选择没有使用过的花的种类&#xff08;1 2 3 4&#xf…

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…

LeetCode_单调栈_中等_1019.链表中的下一个更大节点

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给定一个长度为 n 的链表 head。对于列表中的每个节点&#xff0c;查找下一个更大节点的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第一个节点的值&#xff0c;这个节点的值严格大于它的值…

Vue项目创建流程

一、安装Vue和查看Vue版本 1.1安装Vue npm i -g @vue/cli1.2 查看Vue Vue -V二、新建一个Vue项目 2.1 使用命令创建项目 vue create vue-project # vue-project是项目名称Default 表示使用默认配置,默认勾选babel、eslint ,回车之后直接进入装包 Manually 自定义勾选特性…

Vector - CAPL - CAN x 总线信息获取(续2)

继续.... 目录 ErrorFrameCount -- 错误帧数量 代码示例 ErrorFrameRate -- 错误帧速率 代码示例 ExtendedFrameCount -- 扩展帧数量 代码示例 ExtendedFrameRate -- 扩展帧速率 代码示例 ExtendedRemoteFrameCount -- 远程扩展帧数量 代码示例 ExtendedRemoteFrameRa…

01背包的算法设计和代码实现以及01背包问题的复杂度计算

01背包的算法设计和代码实现以及01背包问题的复杂度计算 1.算法分析 01背包问题是一个经典的动态规划问题&#xff0c;其目标是在给定一组物品和一个背包容量的情况下&#xff0c;选择一些物品放入背包中&#xff0c;使得背包容量最大化。以下是01背包问题的算法设计和代码实…