计算时间序列周期的三种方法

这篇具有很好参考价值的文章主要介绍了计算时间序列周期的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

周期是数据中出现重复模式所需的时间长度。更具体地说,它是模式的一个完整周期的持续时间。在这篇文章中,将介绍计算时间序列周期的三种不同方法。

计算时间序列周期的三种方法

我们使用City of Ottawa 数据集,主要关注的是每天的服务呼叫数量。所以不需要对病房名称进行初始数据处理。Ottawa 数据集在渥太华市提供的数据门户网站上免费提供。

让我们加载2019-2022年的这些数据,并将它们连接起来得到一个df。

 fromgoogle.colabimportdrive
 drive.mount('/content/gdrive')
 importpandasaspd
 importmatplotlib.pyplotasplt
 importseabornassns
 importnumpyasnp
 
 file_path='/content/gdrive/My Drive/Colab Notebooks/Data/SR-2019.xlsx'
 records2019=pd.read_excel(file_path)#,encoding='utf16')
 
 file_path='/content/gdrive/My Drive/Colab Notebooks/Data/SR-2020.xlsx'
 records2020=pd.read_excel(file_path)#,encoding='utf16')
 
 file_path='/content/gdrive/My Drive/Colab Notebooks/Data/2021_Monthly_Service_Requests_EN.xlsx'
 records2021=pd.read_excel(file_path)#,encoding='utf16')
 
 file_path='/content/gdrive/My Drive/Colab Notebooks/Data/2022_Monthly_Service_Requests.csv'
 records2022=pd.read_csv(file_path)
 
 records=pd.concat([records2019,records2020,records2021,records2022],axis=0)

让我们根据服务调用日期聚合这些数据,并得到一个简单的图。

 records["DATE_RAISED"]=pd.to_datetime(records.DATE_RAISED)
 record_by_date=records.groupby("DATE_RAISED")["TYPE"].count().sort_index()
 record_by_date.plot(figsize= (25, 10))
 plt.ylabel('Number of requests')
 plt.grid(visible=True,which='both')
 plt.figure()
 
 record_by_date.iloc[100:130].plot(figsize= (25, 10))
 plt.ylabel('Number of requests')
 plt.grid(visible=True,which='both')

计算时间序列周期的三种方法

填充缺失

让我们检查一下我们的数据是否包含了所有的日期。

 start_date=record_by_date.index.min()
 end_date=record_by_date.index.max()
 
 # create a complete date range for the period of interest
 date_range=pd.date_range(start=start_date, end=end_date, freq='D')
 
 # compare the date range to the index of the time series
 missing_dates=date_range[~date_range.isin(record_by_date.index)]
 
 iflen(missing_dates) >0:
     print("Missing dates:", missing_dates)
 else:
     print("No missing dates")

正如所预期的那样,数据缺少一些日期的值。让我们用相邻日期的平均值填充这些值。

 # Reindex to fill missing dates
 idx=pd.date_range(start=record_by_date.index.min(), end=record_by_date.index.max(), freq='D')
 record_by_date=record_by_date.reindex(idx, fill_value=0)
 
 # Add missing dates with average of surrounding values
 fordateinmissing_dates:
     prev_date=date-pd.DateOffset(days=1)
     next_date=date+pd.DateOffset(days=1)
     prev_val=record_by_date.loc[prev_date] ifprev_dateinrecord_by_date.indexelsenp.nan
     next_val=record_by_date.loc[next_date] ifnext_dateinrecord_by_date.indexelsenp.nan
     avg_val=np.nanmean([prev_val, next_val])
     record_by_date.loc[date] =avg_val

这就是我们要做的所有预处理了,在所有这些步骤之后,我们尝试检测这个时间序列的周期。一般来说,基于假日模式和一般的人类习惯,我们希望在数据中看到七天的周期,我们来看看是不是有这样的结果。

0、目测

最简单的方法就是目测。这是一种主观的方法,而不是一种正式的或统计的方法,所以我把它作为我们列表中的原始方法。

计算时间序列周期的三种方法

如果我们看一下这张图的放大部分,我们可以看到7天的周期。最低值出现在5月14日、21日和28日。但最高点似乎不遵循这个模式。但在更大的范围内,我们仍然可以说这个数据集的周期是7天。

下面我们来正式的进行分析:

1、自相关分析

我们将绘制时间序列的自相关值。查看acf图中各种滞后值的峰值。与第一个显著峰值对应的滞后可以给出周期的估计。

对于这种情况,我们看看50个滞后值,并使用statmodels包中的方法绘制acf。

 fromstatsmodels.graphics.tsaplotsimportplot_acf
 
 fig, ax=plt.subplots(figsize=(14,7))
 plot_acf(record_by_date.values.squeeze(), lags=50,ax=ax,title='Autocorrelation', use_vlines=True);
 lags=list(range(51))
 ax.set_xticks(lags);
 ax.set_xticklabels(lags);

计算时间序列周期的三种方法

从上图可以看出,在7、1、21等处有峰值。这证实了我们的时间序列有7天的周期。

2、快速傅里叶变换

对时间序列进行傅里叶变换,寻找主频分量。主频率的倒数可以作为周期的估计值。

傅里叶变换是一种数学运算,它把一个复杂的信号分解成一组更简单的正弦和余弦波。傅里叶变换广泛应用于信号处理、通信、图像处理以及其他许多科学和工程领域。它允许我们在频域中分析和操作信号,这通常是一种比在时域中更自然和直观的理解和处理信号的方法。

 fromscipy.fftimportfft
 
 # Calculate the Fourier transform
 yf=np.fft.fft(record_by_date)
 xf=np.linspace(0.0, 1.0/(2.0), len(record_by_date)//2)
 
 # Find the dominant frequency
 # We have to drop the first element of the fft as it corresponds to the 
 # DC component or the average value of the signal
 idx=np.argmax(np.abs(yf[1:len(record_by_date)//2]))
 freq=xf[idx]
 
 period=(1/freq)
 print(f"The period of the time series is {period}")

输出为:The period of the time series is 7.030927835051545。这与我们使用acf和目视检查发现的每周周期相似。

3、周期图

周期图 Periodogram 是一个信号或序列的功率谱密度(PSD)图。换句话说它是一个显示信号中每个频率包含多少总功率的图表。周期图是通过计算信号的傅里叶变换的幅值平方得到的,常用于信号处理和频谱分析。在某种意义上,只是前面给出的基于fft的方法的扩展。

 fromscipy.signalimportperiodogram
 
 freq, power=periodogram(record_by_date)
 period=1/freq[np.argmax(power)]
 print(f"The period of the time series is {period}")
 
 plt.plot(freq, power)
 plt.xlabel('Frequency (Hz)')
 plt.ylabel('Power spectral density')
 plt.show()

计算时间序列周期的三种方法

周期图可以清楚地看出,信号的最高功率在0.14,对应于7天的周期。

总结

本文,我们介绍了寻找时间序列周期的三种不同方法,通过使用这三种方法,我们能够识别信号的周期性,并使用常识进行确认。

https://avoid.overfit.cn/post/2ae6a3c1b9824defbd013aecd0a70635

作者:Shashindra Silva文章来源地址https://www.toymoban.com/news/detail-496656.html

到了这里,关于计算时间序列周期的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 时间序列聚类的直观方法

            我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验,同时利用直观的可视化,让我们看看下面的时间序列:

    2024年02月06日
    浏览(38)
  • 计算机竞赛 基于LSTM的天气预测 - 时间序列预测

    🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate ​ df = pd.read_csv(‘/home/kesci/input/jena1246/jena_climate_2009_2016.csv’) df.head() 如上所示,每1

    2024年02月11日
    浏览(50)
  • 时间序列转二维图像方法及其应用研究综述

    目录 1 前言 2 方法综述 2.1 时频分析法 2.1.1 短时傅里叶变换 2.1.2 小波变换 2.1.3 希尔伯特-黄变换 2.2 图像编码方法 2.2.1 格兰姆角场 2.2.2 马尔可夫转移场 2.2.3 递归图 2.2.4 图形差分场 2.2.5 相对位置矩阵 3 应用研究现状 4 方法仿真与分析 5 总结与分析 6 参考文献 【声明:本

    2024年02月02日
    浏览(41)
  • 数学建模——确定性时间序列分析方法

    目录 介绍 确定性时间序列分析方法 1、时间序列的常见趋势 (1)长期趋势 (2)季节变动 (3)循环变动 (4)不规则变动 常见的时间序列模型有以下几类 2、时间序列预测的具体方法 2.1 移动平均法 案例1 【符号说明】  【预测模型】 2.2 一次指数平滑预测法 (1)预测模型

    2024年02月05日
    浏览(59)
  • 将时间序列转成图像——递归图方法 Matlab实现

    目录 1 方法 2 Matlab代码实现 3 结果 【若觉文章质量良好且有用,请别忘了 点赞收藏加关注 ,这将是我继续分享的动力,万分感谢!】 其他: 1. 时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时间序列转成图像——格拉姆角场方法 Matlab实现_vm-1215的博客

    2024年02月07日
    浏览(34)
  • 将时间序列转成图像——相对位置矩阵方法 Matlab实现

    目录 1 方法 2 Matlab代码实现 3.结果 【若觉文章质量良好且有用,请别忘了 点赞收藏加关注 ,这将是我继续分享的动力,万分感谢!】 其他: 1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时间序列转成图像——格拉姆角场方法 Matlab实现_vm-1215的博客

    2024年02月02日
    浏览(39)
  • PYthon 时间序列数据重采样-resample()方法(Pandas篇-23)

    PYthon 时间序列数据重采样-resample()方法(Pandas篇-23)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹

    2024年01月19日
    浏览(40)
  • 时间序列的季节性:3种模式及8种建模方法

    分析和处理季节性是时间序列分析中的一个关键工作,在本文中我们将描述三种类型的季节性以及常见的8种建模方法。 季节性是构成时间序列的关键因素之一,是指在一段时间内以相似强度重复的系统运动。 季节变化可以由各种因素引起,例如天气、日历或经济条件。各种

    2024年02月17日
    浏览(48)
  • 计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 大数据时间序列股价预测分析系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gite

    2024年02月11日
    浏览(43)
  • PYthon Pandas 时间序列数据重采样-resample()方法(第23讲)

    PYthon 时间序列数据重采样-resample()方法(Pandas篇-23)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹

    2024年02月01日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包