首页 > 编程语言 >时间序列的STL分解Python代码——以验潮站数据为例

时间序列的STL分解Python代码——以验潮站数据为例

时间:2023-05-08 18:57:25浏览次数:40  
标签:以验潮 为例 STL df 分解 序列 resid trend

1.时间序列分解的作用和意义

时间序列通常包括如下几种成分:

一个时间序列包含三种影响因素:

 

长期趋势:在一个相当长的时间内表现为一种近似直线的持续向上、向下或平稳的趋势。

季节变动:受季节变化影响所形成的一种长度和幅度固定的短期周期波动

周期变动:与季节变动类似,但是波动的时间频率不是固定的,通常在时间序列分解中与长期趋势结合成为趋势周期项

不规则变动:受偶然因素的影响所形成的不规则波动,如股票市场受利好或者利空信息的影响,使得股票价格产生的波动

在进行时间序列预测时,时间序列分解可以更直观地查看时间序列的成分,将时间序列数据分解为趋势项、季节项和残差项,后续则可以单独对各项进行时间序列预测并合并。

2.时间序列分解的方法

目前时间序列分解的方法主要包括经典分解法、X11分解法、SEATS分解法、STL分解法、fbprophet分解法等,本文选择STL分解法进行分解。

STL分解法:STL是一种多功能、鲁棒的方法。全称“Seasonal and Trend decomposition using Loess”,其中Loess是一种鲁棒的回归算法。

特点:

  • 与SEATS与X11不同,STL可以处理任意季节性数据,而非局限于月度或季度数据
  • 季节部分可以随时间变化,变化率可以由用户控制。STL的一大特点便是提供对季节性的单独乘法趋势,可以在采用加法型模型时,使加上去的趋势的幅度不断扩大。且该变化率是自动检测的。
  • 趋势周期的平滑度可以由用户控制
  • 可以对异常值鲁棒(使异常值不影响季节部分与趋势部分,但是影响残差),代码中一般有robust=True/False控制。

缺点:

  • 不能自动处理节假日
  • 只能进行加性分解

3.STL分解

在进行分解前,你需要知道的部分参数包括:

period:表示季节性的周期,也就是时间索引的周期,如果原始数据是pandas的series 或dataframe形式代码能够自行判断此参数,但建议自行设置。
season: 表示季节性平滑器的长度,它必须是一个奇数,通常要>=7(默认)。
trend:表示趋势平滑器的长度,通常要>period(或season)的1-1.5倍,并且它必须是一个奇数。默认值是最小的1-1.5倍的period,比如period=7则trend默认值是9,如果period=12则trend默认值是13
使用的库:statsmodels、pandas、seaborn、matplotlib、pylab

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL
import statsmodels.api as sm
import pylab
from pylab import mpl
#导入包的时候比较乱,请见谅.... mpl.rcParams['font.sans-serif'] = ['SimHei']#此步骤是为了解决字体问题 plt.rcParams['axes.unicode_minus']=False#此步骤是为了解决字体问题 plt.rc("figure", figsize=(10, 6))#设置绘图区尺寸 for x in []:#在中括号中输入的是季节平滑器的长度,输入多个则分别导出不同参数下的结果,也可相应修改,添加其他参数 df=pd.read_csv('C:/Users/Administrator/Desktop/STL.csv',encoding='ANSI',usecols=['time', 'value'],index_col='time') #读取原始数据,这里的time,value是原始数据中的列标签名,此外encoding参数需要根据csv的编码确认,usecols选择使用的列,index_col参数选择索引列 print(df)#查看读取好的文件 stl=STL(df,period=12,seasonal=x,robust=False)#因为原始数据是月度数据,这里手动设置了period=12,robust为True时会用一种更严格的方法来约束trend和season,同时也会导致更大的resid res=stl.fit() res.plot() plt.savefig("D:/figures2/{}.png".format(x))#保存STL分解结果图 plt.clf()#清空绘图区防止重复绘图 df['trend']=res.trend#保存分解后数据 df['seasonal']=res.seasonal df['resid']=res.resid dataframe = pd.DataFrame({'trend':df['trend'],'season':df['seasonal'],'resid':df['resid']})#将分解结果按照列导入csv文件 dataframe.to_csv("D:/figures2/{}table.csv".format(x),sep=',') print('residual mean:',df.resid.mean())#查看残差正态性检验的均值 mean=df.resid.mean() sns.distplot(df.resid)#绘制带正态曲线的概率密度直方图 plt.savefig("D:/figures2/{}mean={}.png".format(x,mean)) plt.clf() sm.qqplot(df.resid, line='s')#绘制正态检验QQ图 plt.savefig("D:/figures2/{}QQ.png".format(x))

代码中除了对原始数据进行读取和STL分解外,还包括了如下几个步骤:

(1)将分解后的数据导入至csv文件中以便后续分析和绘图

(2)绘制残差项的直方图和QQ图,判断残差正态性(只有残差项通过正态性检验才说明分解有效)

 

标签:以验潮,为例,STL,df,分解,序列,resid,trend
From: https://www.cnblogs.com/Vicrooor/p/17382822.html

相关文章

  • 如何利用Requestly提升前端开发与测试的效率,让你事半功倍?
    痛点前端测试在进行前端页面开发或者测试的时候,我们会遇到这一类场景:在开发阶段,前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前端页面的一些异常场景或者临界值时在测试阶段,想直接通过修改接口响应来验证前端页面是否正常想验证后端服务响应比较慢的......
  • servlet 访问jstl文件出现500情况
    可能原因是导入依赖包出现的问题。<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope&g......
  • django的web项目中重定向页面时的部分信息传输——以删除含有分页的列表记录为例
    问题:在管理系统界面往往是有分页的,初次编写列表的删除功能时很可能会出现删完之后页面跳转到第一页的问题,或者筛选完之后删除某一项结果删完之后跳转到未筛选页面。与实际分页管理的效果大庭相径。解决思路:1.起初只遇到了分页的情况,解决方法很简单,在删除按钮的href中直接传值,例......
  • C++ STL容器总结
    https://www.zhihu.com/question/270017615/answer/2951304955作者:linux链接:https://www.zhihu.com/question/270017615/answer/2951304955来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。1什么是STL?STL(StandardTemplateLibrary),即标准模板库......
  • 以京东为例,分析优惠价格叠加规则
      一、平行优惠计算原则 1、什么是“平行式门槛计算规则”平行式门槛计算规则,即每一层级优惠都直接根据商品的单品基准价来计算是否符合门槛,店铺/平台促销、优惠券类优惠之间是并列关系,只要单品基准价或单品基准价总和(即各商品单品基准价的总和)满足各层级优惠门槛,则可......
  • STL源码分析读书笔记
    主要是关于标准库容器的整理空间配置器主要看SGI的实现,有两个空间配置器_malloc_alloc_template<0>__default_alloc_template<...>用户可以选择单独使用第一个分配器,或者一起使用两个分配器。当用户选择使用两个分配器时,编译器会分别将上述两个分配器typedef成malloc_a......
  • C++ STL map 【避坑】 中括号查找(map[.])导致超时
    感谢大神的博客:STLmap关于查找的坑——尽量不使用方括号[]查找_stlmap查找_sdudyl的博客-CSDN博客今天在CF补了一道题,我开了map使用中括号查找,结果第二组就T了。我百思不得其解,最后把map[x]换成map.count(x)就过了。因为这样使用中括号查找x时,如果找不到x,会向容器中插入一......
  • C++杂谈:STL
    五一快乐。终于有时间整理一点东西了,笔者这个五一过得是相当初生。大部分人都玩去了,只有我还在赶ddl的世界达成了qwq。不过我觉得还是做了自己想做的事情的。稍微记录一些前段时间OOP遇到的STL里面乱七八糟的东西。STL的一些底层实现vector这个谁都知道,是一个堆上分配的数组,......
  • 每天一个Linux命令-lastlog.
    关于lastlog命令,reportsthemostrecentloginofallusersorofagivenuser可以作为一个审计命令,可以参考笔者的另一篇文章:《关于Linux操作系统使用lastlog命令对OS账号最后一次登录时间的审计》lastlog,是读取的/var/log/lastlog这个data类型的文件,这里主要讲一下关于last......
  • C++ STL容器
    vector变长数组,倍增的思想string字符串,substr(),c_str()queue队列,push(),front(),pop()priority_queue优先队列,push(),top(),pop()stack栈,push(),top(),pop()deque双端队......