如何使用 Python 识别和去除时间序列数据中的季节性

时间序列数据集可能包含季节性成分。

这是随时间重复的周期,例如每月或每年。这种重复的周期可能会掩盖我们在进行预测时希望建模的信号,反过来又可能为我们的预测模型提供强大的信号。

在本教程中,您将了解如何使用 Python 识别和修正时间序列数据中的季节性。

完成本教程后,您将了解:

  • 时间序列中季节性的定义以及它为机器学习预测提供的机会。
  • 如何使用差分法创建每日温度数据的季节性调整时间序列。
  • 如何直接对季节性成分进行建模并将其明确地从观测值中减去。

开始您的项目,阅读我的新书《Python 时间序列预测》,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

  • 2019 年 4 月更新:更新了数据集链接。
  • 2019年8月更新:更新了数据加载以使用新的API。
How to Identify and Remove Seasonality from Time Series Data with Python

如何使用 Python 识别和去除时间序列数据中的季节性
图片由 naturalflow 提供,部分权利保留。

时间序列中的季节性

时间序列数据可能包含季节性变化。

季节性变化,或称季节性,是指随时间规律性重复的周期。

一年内重复的模式称为季节性变化,尽管该术语更广泛地应用于任何固定周期内的重复模式。

— 第 6 页,《R 语言时间序列入门》

时间序列中的周期结构可能包含季节性,也可能不包含。如果它在相同的频率下持续重复,则具有季节性,否则则不具有季节性,称为周期。

对机器学习的好处

理解时间序列中的季节性成分可以提高机器学习建模的性能。

这可以通过两种主要方式发生:

  • 更清晰的信号:识别并去除时间序列中的季节性成分可以使输入变量和输出变量之间的关系更清晰。
  • 更多信息:关于时间序列季节性成分的附加信息可以提供新信息以提高模型性能。

这两种方法都可能在项目中很有用。在数据清理和准备过程中,可能会对季节性进行建模并将其从时间序列中去除。

提取季节性信息并将其作为输入特征,直接或以摘要形式提供,可能发生在特征提取和特征工程活动中。

季节性类型

季节性有很多种;例如:

  • 一天中的时间。
  • 每日。
  • 每周。
  • 每月。
  • 每年。

因此,确定您的时间序列问题中是否存在季节性成分是主观的。

确定是否存在季节性方面最简单的方法是绘制数据并进行审查,可能在不同的尺度上并添加趋势线。

去除季节性

一旦确定了季节性,就可以对其进行建模。

季节性模型可以从时间序列中移除。这个过程称为季节性调整,或去季节化。

季节性成分已被移除的时间序列称为季节性平稳。具有明显季节性成分的时间序列称为非平稳。

在时间序列分析领域,有许多复杂的方法可以研究和提取时间序列中的季节性。由于我们主要对预测建模和时间序列预测感兴趣,因此我们仅限于那些可以在历史数据上开发并在预测新数据时可用的方法。

在本教程中,我们将研究两种对具有强加性季节性成分的经典气象类问题(每日温度)进行季节性调整的方法。接下来,让我们看看本教程将使用的数据集。

停止以**慢速**学习时间序列预测!

参加我的免费7天电子邮件课程,了解如何入门(附带示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

日最低气温数据集

此数据集描述了墨尔本市 10 年(1981-1990 年)的每日最低气温。

单位是摄氏度,共有3650个观测值。数据来源归功于澳大利亚气象局。

以下是数据的前 5 行样本,包括标题行。

下面是对整个数据集的图示,您可以在此处下载数据集并了解更多关于它的信息。

Minimum Daily Temperatures

日最低气温

该数据集显示了强大的季节性成分,并且具有良好的、精细的细节可供处理。

加载每日最低温度数据集

下载每日最低温度数据集,并将其保存在当前工作目录中,文件名为“daily-minimum-temperatures.csv”。

下面的代码将加载并绘制数据集。

运行示例将创建以下数据集的图。

Minimum Daily Temperature Dataset

每日最低温度数据集

差分季节性调整

修正季节性成分的一种简单方法是使用差分。

如果存在一个以一周为周期的季节性成分,那么我们可以通过减去上一周的值来消除今天的观测值。

对于每日最低温度数据集,看起来我们每年都有一个季节性成分,从夏天到冬天都有波动。

我们可以从同一天去年的每日最低温度中减去该值来纠正季节性。这需要特殊处理闰年中的 2 月 29 日,并且意味着第一年的数据将无法用于建模。

下面是一个在 Python 中对每日数据使用差分法的示例。

运行此示例将创建一个新的季节性调整数据集并绘制结果。

Differencing Sesaonal Adjusted Minimum Daily Temperature

差分季节性调整的每日最低温度

我们的数据集中有两个闰年(1984 年和 1988 年)。它们没有得到明确处理;这意味着从 1984 年 3 月开始的观测值的偏移量是错误的,而在 1988 年 3 月之后,偏移量则错误了两次。

一种选择是更新代码示例以考虑闰日。

另一种选择是考虑到一年中任何给定时间段内的温度可能都是稳定的。也许是几周。我们可以通过考虑日历月份内的所有温度都是稳定的来简化此过程。

一个改进的模型可能是减去去年同一日历月份的平均温度,而不是同一天的温度。

我们可以先对数据集进行重采样,得到月平均最低温度。

运行此示例将打印出前 13 个月的月平均最低温度。

它还绘制了月度数据,清楚地显示了数据集的季节性。

Minimum Monthly Temperature Dataset

每月最低温度数据集

我们可以对月度数据测试相同的差分方法,并确认季节性调整后的数据集确实消除了年度周期。

运行示例将创建一个新的季节性调整的月平均最低温度数据集,跳过第一年的数据以进行调整。然后绘制调整后的数据集。

Seasonal Adjusted Minimum Monthly Temperature Dataset

季节性调整的每月最低温度数据集

接下来,我们可以使用去年同一月份的月平均最低温度来调整每日最低温度数据集。

同样,我们只跳过第一年的数据,但使用月度数据而不是每日数据进行校正可能是一种更稳定的方法。

再次运行示例将创建季节性调整后的数据集并绘制结果。

此示例对于上一年的每日波动和因闰年 2 月 29 日而产生的偏移错误是稳健的。

More Stable Seasonal Adjusted Minimum Monthly Temperature Dataset With

更稳定的季节性调整后的每月最低温度数据集

日历月份的边缘提供了一个硬边界,这对于温度数据可能没有意义。

更灵活的方法,例如采用去年同一日期前后一周的平均值,可能又是更好的方法。

此外,温度数据在多个尺度上很可能存在季节性,这些季节性可以通过直接或间接的方式进行校正,例如:

  • 日级别。
  • 多日级别,如一周或几周。
  • 多周级别,如一个月。
  • 多月级别,如一个季度或季节。

通过建模进行季节性调整

我们可以直接对季节性成分进行建模,然后将其从观测值中减去。

特定时间序列中的季节性成分很可能是一个具有固定周期和幅度的正弦波。这可以使用曲线拟合方法轻松近似。

可以构建一个数据集,将正弦波的时间索引作为输入(x 轴),并将观测值作为输出(y 轴)。

例如

拟合完成后,模型就可以用来计算任何时间索引的季节性成分。

在温度数据的情况下,时间索引将是这一年的第几天。然后,我们可以估计任何历史观测值或未来任何新观测值的这一年第几天的季节性成分。

然后,该曲线可以作为新的输入用于使用监督学习算法进行建模,或者从观测值中减去以创建季节性调整后的序列。

让我们开始拟合每日最低温度数据集的曲线。NumPy 库提供了 polyfit() 函数,可用于将选定阶数的多项式拟合到数据集中。

首先,我们可以创建一个时间索引(在本例中为天)到观测值的数据集。我们可以采用一年的数据或所有年份的数据。理想情况下,我们会尝试这两种方法,看看哪种模型能获得更好的拟合。我们也可以使用以每个值为中心的移动平均来平滑观测值。这也可能导致模型获得更好的拟合。

准备好数据集后,我们可以通过调用 polyfit() 函数来创建拟合,将 x 轴值(整数年天数)、y 轴值(温度观测值)和多项式阶数传递进去。阶数控制项的数量,进而控制用于拟合数据的曲线的复杂性。

理想情况下,我们希望找到描述数据集季节性的最简单曲线。对于一致的正弦波状季节性,4 阶或 5 阶多项式就足够了。

在这种情况下,我通过反复试验选择了 4 阶。结果模型的形式为:

其中 *y* 是拟合值,*x* 是时间索引(年第几天),*b1* 到 *b5* 是曲线拟合优化算法找到的系数。

拟合完成后,我们将有一组系数来表示我们的模型。然后,我们可以使用该模型来计算单个观测值、一年的观测值或整个数据集的曲线。

完整的示例如下所示。

运行示例将创建数据集、拟合曲线、预测数据集中每一天的值,然后绘制结果季节性模型(红色)与原始数据集(蓝色)的对比图。

此模型的一个限制是它没有考虑闰日,这会产生小的偏移噪声,可以通过更新方法轻松纠正。

例如,在创建季节性模型时,我们可以直接从数据集中删除两个 2 月 29 日的观测值。

Curve Fit Seasonal Model of Daily Minimum Temperature

每日最低温度的曲线拟合季节性模型

该曲线似乎很好地拟合了数据集中季节性结构。

现在,我们可以使用此模型来创建该数据集的季节性调整版本。

完整的示例如下所示。

运行示例将季节性模型预测的值从原始观测值中减去。该

然后绘制季节性调整后的数据集。

Curve Fit Seasonal Adjusted Daily Minimum Temperature

曲线拟合的每日最低温度季节性调整

总结

在本教程中,您学习了如何使用 Python 创建季节性调整的时间序列数据集。

具体来说,你学到了:

  • 时间序列中季节性的重要性以及它提供的数据准备和特征工程机会。
  • 如何使用差分法创建季节性调整的时间序列。
  • 如何直接对季节性成分进行建模并将其从观测值中减去。

您对时间序列去季节化或本帖子有什么疑问吗?
在下面的评论中提出你的问题,我会尽力回答。

想用Python开发时间序列预测吗?

Introduction to Time Series Forecasting With Python

几分钟内开发您自己的预测

...只需几行python代码

在我的新电子书中探索如何实现
Python 时间序列预测入门

它涵盖了**自学教程**和**端到端项目**,主题包括:*数据加载、可视化、建模、算法调优*等等。

最终将时间序列预测带入
您自己的项目

跳过学术理论。只看结果。

查看内容

104 条对《如何使用 Python 识别和去除时间序列数据中的季节性》的回复

  1. augmentale 2016 年 12 月 23 日,上午 9:10 #

    减去代表年度周期影响的正弦波后,我们得到每日温度与其平均值之间偏差的值,这是否正确?我只是想理解这个结果值意味着什么。喜欢您的帖子!

    • Jason Brownlee 2016 年 12 月 23 日,上午 10:17 #

      没错。

      这些第一阶差分值可用于拟合模型。然后可以使用该模型进行预测,并将季节性成分加回到预测值中,以获得最终可用的值。

      这有帮助吗?

      • augmentale 2016 年 12 月 23 日,下午 5:36 #

        当然!谢谢。我认为另一种可能的特征工程方法是使用经验模式分解算法来提取不同的信号成分以用于拟合模型,我会测试一下。

      • Jisun Kang 2017 年 9 月 8 日,上午 7:05 #

        您能否更具体地说明如何将季节性成分加回去?我没看到如何在去季节化过程中保留这种季节性成分……或者我遗漏了什么……如果遗漏了,请指出在哪里。谢谢!

        • Jason Brownlee 2017 年 9 月 9 日,上午 11:47 #

          如果您通过减去一年前的数据来进行季节性调整,您可以通过再次添加减去的值来反转它。

  2. augmentale 2016 年 12 月 23 日,晚上 7:59 #

    顺便说一句,在 GitHub 上有一个有用的 EMD 库:https://github.com/jaidevd/pyhht

  3. Amit 2016 年 12 月 28 日,上午 9:32 #

    我见过人们使用分解并取误差/残差部分来去除趋势和季节性。如何选择使用哪种方法/技术来去除季节性/趋势?

    • Jason Brownlee 2016 年 12 月 29 日,上午 7:13 #

      你好 Amit,

      分解对于时间序列分析很有用,但通常不能用于时间序列预测。至少据我所知。

      我建议尝试一套方法,看看哪种效果最好——即产生预测最准确的模型。

  4. Mrs David 2017 年 7 月 6 日,下午 12:26 #

    如何对部分数据具有季节性效应,而部分数据没有季节性效应的时间序列进行去季节化?

    • Jason Brownlee 2017 年 7 月 9 日,上午 10:22 #

      单独准备每个序列。

      • Varun 2017 年 7 月 21 日,晚上 8:39 #

        嗨,Jason,

        我需要预测每 12 小时的家庭电力需求,为期 3 天(6 个数据点)。我有大约 3 年的数据,间隔为 12 小时。表面上看,似乎可能存在多个季节性模式。如何识别复杂的季节性周期?在这种情况下哪种方法最好?

        • Jason Brownlee 2017 年 7 月 22 日,上午 8:34 #

          听起来很有趣。

          试试拟合一些多项式?

        • balamuralikrishnan 2019 年 4 月 5 日,晚上 10:58 #

          你好,
          我有一个具有多个季节性的数据。有没有办法识别所有季节性?我尝试了季节性分解,但我们需要为每月、每周或每年传递参数。我的情况是,我需要识别数据中出现的所有季节性。
          提前感谢。
          此致,
          BMK

          • Jason Brownlee 2019年4月6日 上午6:49 #

            也许可以看一张图,然后使用季节性差分逐个去除。

          • Ragon 2019年12月12日 下午10:41 #

            嘿,你可以使用傅里叶变换来找到季节性频率。祝你好运!

          • Jason Brownlee 2019年12月13日 上午6:03 #

            好建议。

  5. marta 2017年8月4日 下午9:51 #

    如果我想预测某个值,我看不出季节性调整的好处。我错过了这些信息。

    • Jason Brownlee 2017年8月5日 上午5:46 #

      季节性的模型很简单,所以我们对其进行建模并去除它。然后,我们想在其之上添加更多价值。

  6. Bawza 2017年8月21日 上午1:07 #

    如果我有一个季节性时间序列及其一般趋势。它可以是 AR、MA、ARMA 或 ARIMA 吗?如果我能给您看数据,谢谢。

    • Jason Brownlee 2017年8月21日 上午6:09 #

      抱歉,我不明白你的问题。也许你可以重述一下?

      • Uzma 2019年8月16日 上午5:48 #

        如何检查数据中的半年季节性变化??
        请简要说明。
        谢谢

  7. JT90 2017年12月6日 下午9:49 #

    嗨 Jason。很棒的文章!非常容易跟上:)

    我对 python 很陌生,所以请原谅我这个基本的问题。如何“保留”季节性调整后的值。例如写入 ascii 或其他技术,以便我可以在其他脚本中使用这些数据。非常感谢!

  8. Arunraj 2017年12月13日 下午6:56 #

    我们可以使用这种技术来比较不同长度的信号吗?例如,信号 A 记录 5 秒,信号 B 记录 1 分钟。如果我们想比较这两个信号,我可以使用你的想法来去除较长信号的季节性分量吗?

    • Jason Brownlee 2017年12月14日 上午5:35 #

      抱歉,我不确定我是否理解。也许你可以试试看。

  9. sophie 2018年1月18日 上午7:53 #

    很棒的文章。非常感谢 Jason。我也关注了你的 ARIMA 文章,并且想知道 ARIMA 是否可以处理所有问题(包括季节性),因此我们不必分离处理季节性并将 ARIMA 应用于季节性调整后的数据。因为从技术上讲,季节性是一种特殊的自相关形式,可以通过差分来处理。我这样想对吗?

    • Jason Brownlee 2018年1月18日 上午10:14 #

      移除趋势和季节性等系统性模式将提高模型的性能。

  10. Ian Ashpole 2018年1月26日 上午11:52 #

    非常感谢 Jason 的这篇文章!我需要分析一个具有非常强的季节性的气候数据集中的极端值——这个方法是我完成这项任务所需要的!:)

    像您这样花时间发布方法和示例的人,让我们这些需要使用我们不一定经过训练的技术从数据集中提取有价值信息的人的生活变得更加轻松(且不那么令人沮丧)!因此,您为我们创造了一个更美好的世界!

    再次感谢

  11. neha 2018年3月7日 上午12:07 #

    我如何将其用于每周和每年的季节性?

  12. neha 2018年3月7日 上午12:07 #

    同一数据序列中的多个季节性?

  13. Edward 2018年3月23日 上午12:59 #

    这是一个很棒的例子——非常感谢。

    这些例子非常机械——因此适合广大受众。

    只是想知道是否/为什么不考虑使用 pandas.groupby 和 .transform 方法?

    • Jason Brownlee 2018年3月23日 上午6:09 #

      谢谢 Edward。

      你认为我应该如何在上述教程中使用这些方法?

  14. Venu 2018年3月27日 下午5:07 #

    你好 Jason,
    这是一篇很棒的文章,谢谢。

    我有一些疑问。

    1) 在应用 SARIMAX(季节性 ARIMA)模型之前,是否已经有必要从时间序列数据中移除趋势和/或季节性?

    2) 我如何统计上知道时间序列数据是否平稳?是使用 adf.test,如果 p 值 >0.05,我是否可以认为数据不平稳?

    3) 最后一个问题;在使用 HoltsWinter 或指数平滑等其他模型时,是否有必要使数据平稳?

    请指教。

  15. Fati 2018年3月29日 下午11:43 #

    你好,

    在执行深度学习方法(如 MLP 或 LSTM)之前,我们需要去除季节性吗?

    提前感谢。

    • Jason Brownlee 2018年3月30日 上午6:39 #

      任何能让模型更容易解决的问题都是个好主意。

  16. smitty 2018年4月25日 下午5:52 #

    你好,

    我将第一个窗口中的代码直接复制到 Ubuntu 上运行的 Jupyter notebook 中,但遇到了 2 个错误。

    1. 关于 from_csv 被弃用的使用。

    2. 我还得到了一个索引错误。

    —————————————————————————
    IndexError Traceback (最近一次调用)
    in ()
    1 from pandas import Series
    2 from matplotlib import pyplot
    —-> 3 series = Series.from_csv(‘daily-minimum-temperatures.csv’, header=0)
    4 series.plot()
    5 pyplot.show()

    ~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in from_csv(cls, path, sep, parse_dates, header, index_col, encoding, infer_datetime_format)
    2888 sep=sep, parse_dates=parse_dates,
    2889 encoding=encoding,
    -> 2890 infer_datetime_format=infer_datetime_format)
    2891 result = df.iloc[:, 0]
    2892 if header is None

    .
    .
    .
    .

    IndexError: 列表索引超出范围

  17. Nosrat 2018年10月27日 上午7:52 #

    嗨,我想知道你是否可以建议任何方法来预测季节性的开始日期。例如,夏季或冬季的开始日期。

    谢谢你

    • Jason Brownlee 2018年10月28日 上午6:03 #

      这真的取决于“开始”对你的问题意味着什么。你必须定义开始,然后你就可以预测它。

  18. maria elena nor 2018年11月1日 下午1:39 #

    你好,

    如何使用 Minitab 在我的模型中定义每周季节性?它是定义为 S=4 吗?

    提前感谢。

  19. Litu 2018年11月11日 上午1:35 #

    嗨,Jason,
    非常感谢这篇文章!

    “对于具有季节性成分的时间序列,滞后可能期望是季节性的周期(宽度)。”

    我的季节性是每年八月到二月。例如。

    2016-08 12.84M
    2016-09 21.43M
    2016-10 24.74M
    2016-11 21.46M
    2016-12 20.21M
    2017-01 16.75M
    2017-02 13.46M
    M = 百万
    我应该考虑滞后 6 还是 7 吗?请建议。
    此外,在差分数据集之上,我们需要进行趋势去除,然后将其输入 ARIMA 模型吗?

    请确认。非常感谢。:)

    • Jason Brownlee 2018年11月11日 上午6:10 #

      抱歉,我无法为您分析数据的季节性。

  20. Magnus 2019年2月28日 下午11:46 #

    嗨,Jason,

    如果“季节性”成分不是固定的,即每个周期的长度都会改变,那该怎么办?例如太阳黑子数量,它不是正好 11 年,而是从一个周期到另一个周期会变化。如何去除周期性成分?

  21. pavan 2019年3月5日 下午9:23 #

    你好,
    有什么方法可以对磁盘可用空间、CPU 使用率、网络和基础设施监控进行建模吗?请告知我资源。

  22. Henry 2019年3月21日 下午4:41 #

    感谢你的文章!
    这是我见过的很棒的文章:)

    我可以问你一个快速问题吗?
    我对于确定性趋势/季节性和随机性趋势/季节性感到困惑。
    我的问题是

    先去除确定性趋势/季节性,然后进行乘法 SARIMAX 建模过程,这样可以吗?
    我不确定数据是否同时具有确定性和随机性趋势/季节性。

    谢谢。

  23. Rodrigo 2019年8月16日 上午12:57 #

    你好 Jason,非常感谢你的文章。

    我正在尝试将你的方法应用于另一种类型的问题,但我有一些我无法解决的疑问。

    这种方法是否适用于“消费者消费”的季节性分析?也就是说,了解消费者一年的行为(按月)。如果适用,模型如何处理年度变化?例如,新店在分析年份开业(导致分析数据中的销售额激增)。是否更方便剔除这些新开店的影响?

    提前感谢!

    • Jason Brownlee 2019年8月16日 上午7:56 #

      也许可以尝试一下,看看是否合适。

      使用能更好地捕捉季节性的模型可能会更容易,例如 SARIMA 或 ETS。

  24. Sanket 2019年9月2日 下午2:05 #

    好文!

    两个问题——

    为什么在应用 ARIMA 之前需要去除季节性,如果我们无论如何都要在 ARIMA 中提供“d”的值(p,d,q)?

    为什么我们需要 SARIMA,如果我们已经有了 ARIMA,我们可以给“d”一个值来处理季节性?

    谢谢。

    • Jason Brownlee 2019年9月3日 上午6:12 #

      好问题。

      差分会使其平稳,显式去除季节性也会使其平稳。这是一个选择,可能更喜欢更多的控制。

      对季节性进行建模可以提高模型性能。

      • Sanket 2019年9月3日 上午10:39 #

        感谢您的回复,Jason。
        我偶然发现 OTexts 第 12.8 章中的一个例子。(希望你了解 otexts)

        陈述如下:

        cafe<-Arima(training, order=c(2,1,1), seasonal=c(0,1,2), lambda=0)

        现在,这让我感到非常困惑。这里提供了 d =1 的值,这意味着季节性已被去除,序列现在是平稳的,但随后又提供了 D = 1 的季节性分量。

        您能向我解释一下这里发生了什么吗?

        我有一个工作面试,在这个问题上卡住了,这个问题与 ARIMA 中的季节性有关。

        再次感谢您的时间。

        • Jason Brownlee 2019年9月3日 下午2:07 #

          这里的第一个 d 去除了趋势(趋势调整),第二个 D 去除了季节性(季节性调整)。

          这有帮助吗?

          • Sanket 2019年9月4日 上午5:15 #

            是的,它确实可以。非常感谢,Jason。

  25. Ali 2019年10月17日 上午2:47 #

    嗨,Jason,

    我需要对 LSTMs 进行季节性调整吗?似乎文学界对此没有共识。

    • Jason Brownlee 2019年10月17日 上午6:40 #

      这可能非常有帮助!例如,它使问题更容易建模。

  26. biborno 2019年11月19日 下午8:24 #

    代码中有一个错误,你基于月平均值分解了时间序列。“x = series.values”应该是“monthly_mean = monthly_mean.values”。如果我错了,请纠正我。

    • Jason Brownlee 2019年11月20日 上午6:12 #

      我认为不行。

      • biborno 2019年11月20日 上午9:56 #

        看看第四个代码片段。代码行:X = series.values 的目的是什么?你在代码中没有使用 X。此外,当 monthly_mean = resample.mean() 时,无法通过 monthly_mean[i] 访问 monthly_mean;

        from pandas import read_csv
        from matplotlib import pyplot
        series = read_csv(‘daily-minimum-temperatures.csv’, header=0, index_col=0)
        resample = series.resample(‘M’)
        monthly_mean = resample.mean()
        X = series.values
        diff = list()
        months_in_year = 12
        for i in range(months_in_year, len(monthly_mean))
        value = monthly_mean[i] – monthly_mean[i – months_in_year]
        diff.append(value)
        pyplot.plot(diff)
        pyplot.show()

        • Jason Brownlee 2019年11月20日 下午1:53 #

          是的,你可以忽略它。

        • Rahul Kumar 2020年10月9日 下午10:53 #

          你可以这样访问 monthly_mean

          value = monthly_mean.iloc[i][‘Temp’] – monthly_mean.iloc[i – months_in_year][‘Temp’]

  27. Naven 2019年11月23日 下午7:29 #

    我需要从给定的时间序列中推断季节性。我的目的是找出给定的序列在哪个时间范围内达到了给定的阈值。
    例如,给定一个月的 CPU 百分比系列,粒度为 1 小时。我需要得到这样的陈述:
    每天的第 3 小时和第 7 小时达到阈值。
    每周日,第 5 小时和第 8 小时达到阈值。
    隔天,第 16 小时达到阈值。

  28. sana 2019年11月24日 下午5:38 #

    我正在使用 R 软件中的 Kendall 包进行每日和每月降雨数据的趋势分析。但是,每次尝试进行 MannKendall 分析时,我都会收到此错误。
    > MannKendall(data)
    错误在 Kendall(1:length(x), x) : length(x)<3
    如果您可以,请帮助我解决此错误?

    • Jason Brownlee 2019年11月25日 上午6:24 #

      抱歉,我对该软件包不熟悉,也许可以发布到 Cross Validated?

  29. Elenoor 2020年2月5日 下午10:21 #

    你好,

    我正在处理过去 30 年的甲烷排放数据。我想知道气候变化是否对我的甲烷数据中的季节性方差/宽度/幅度产生了影响。我该如何量化这一点?

    • Jason Brownlee 2020年2月6日 上午8:26 #

      也许可以研究因果模型?
      也许可以研究时间序列数据的统计相关性?

  30. Brett 2020年2月16日 上午11:24 #

    我很确定在“每日最低温度曲线拟合季节性模型”的循环中存在一个错误。
    我的绘图结果全错了。
    将循环替换为 polyval(coef, X) 可以解决问题(注意 polyval 需要从 numpy 导入)。

  31. Kashif Javed 2020年6月18日 上午12:47 #

    本教程非常有帮助!

    您能否指导我,季节性调整/去季节化时间序列数据有什么好处?

    • Jason Brownlee 2020年6月18日 上午6:27 #

      它移除了一个简单的结构,以便模型可以专注于学习更复杂的结构。

  32. Umesh Davey 2020年8月15日 上午1:26 #

    有没有办法在不绘制图表的情况下检测数据中的平稳性、季节性和噪声?请告知。

  33. MED 2020年9月16日上午7:25 #

    Jason,我正在尝试使用四年的每日数据进行预测,这些数据是关于杂货销售的。当我查看分解图时,我观察到趋势可以忽略不计,为了寻找季节性,我将数据转换为每周数据,并观察到了季节性模式。
    1)我使用了每日数据进行预测,首先我检查了adf检验,结果看起来还可以,所以为了捕捉季节性,我使用了SARIMA模型进行预测,这是一种可以接受的方法吗?
    2)我将使用随机森林和其他树模型以及LSTM进行预测,我应该在拟合模型之前去除季节性,然后将其恢复到我的预测中吗?或者简单地添加另一个特征,即窗口为7天的滚动平均值?
    3)最后,在进行任何差分/去季节化之前,我应该将样本分成训练集和测试集,对吗?我可以对整个样本执行此类操作吗?

    • Jason Brownlee 2020年9月16日上午7:39 #

      干得不错。

      是的,SARIMA 是一个不错的开始。也可以尝试 ETS。

      是的,尝试在原始数据上使用机器学习模型,然后尝试去除季节性并比较结果。

      差分后可以分成训练/测试集,这很少会导致数据泄露。

  34. Iraj Koohi 2021年3月23日下午1:07 #

    嗨,Jason,
    非常棒的演示,尤其是建模方法。
    您是否尝试过使用 FFT 方法去除季节性?如果尝试过,请提供链接。
    网上的例子不如您的作品清晰有力!

  35. Ksusha 2021年4月8日下午8:06 #

    你好,Jason!

    我只是复制了“建模”章节的代码,结果与文章中的结果完全不同。是什么原因造成的?

  36. AL 2021年7月8日下午5:59 #

    我从这篇帖子中学到了很多,谢谢 Jason。

    但是我有一个问题:如果我们的季节性数据通过差分进行了调整,我们只需要将减去的值加回去即可获得原始值。

    如果我们用建模调整了季节性数据,我们该怎么做才能再次获得原始预测值?因为我们没有 t+1 的曲线值,只有预测值(yhat)。

    • Jason Brownlee 2021年7月9日上午5:06 #

      您将从一个周期前的值添加到输入数据或训练数据中。

  37. Al-Batool 2021年8月24日下午7:04 #

    嗨,Jason,

    感谢您的帖子。
    我阅读了这篇文章,也阅读了题为(如何使用 Python 检查时间序列数据是否平稳)的文章。然后我应用了相同的数据集来使用“增强迪基-富勒检验”来检查平稳性。结果表明时间序列是平稳的。为什么会这样?因为我有一个类似的数据集,我的结果也表明时间序列是平稳的,但我知道从折线图上看它是具有季节性的。

    谢谢你。

    • Adrian Tam
      Adrian Tam 2021年8月25日上午6:01 #

      平稳的时间序列也可以是季节性的。例如,正弦波就是平稳的。

  38. JD 2021年9月14日上午3:28 #

    帖子写得很好,非常棒。我正在应用季节性差分,之前进行了一个简单的差分,您知道如何恢复它吗?我的数据是月度数据。非常感谢。

    • Adrian Tam
      Adrian Tam 2021年9月14日下午1:36 #

      您是指如何反转差分?该操作称为累积和(cumsum() 函数)。

      • JD 2021年9月15日上午3:27 #

        我可以用 cumsum() 来反转季节性差分吗?

        • Adrian Tam
          Adrian Tam 2021年9月15日晚上11:54 #

          cumsum() 是将序列中的相邻数字相加。如果您能以某种方式将季节性数据表示为一个序列(例如,对数据进行重采样),那么它应该可以工作。

  39. Fatimah 2021年10月23日上午5:13 #

    你好 Adrian Tam

    我有一个两年的天气时间序列数据集,我想使用相同的方法来去除季节性,但是第一年将被赋值为 Null 值,而我需要这些值,因为一年的数据不足以让我的模型进行预测,所以是否有其他方法可以保留第一年的值?

  40. soumitra 2022年2月10日下午6:26 #

    如何对新的测试数据点进行去季节化?例如,我有一个在去季节化数据上训练的时间序列模型,我如何使用它来预测新的未来测试数据点?

    • James Carmichael 2022年2月11日上午8:35 #

      Hi Soumitra…对于时间序列预测应用,您将始终拥有数据直到您开始进行预测的点。因此,您将能够按照教程中的讨论去除季节性。

  41. P. 2022年3月10日上午10:50 #

    你好,Jason

    我正在使用 LSTM 模型进行序列预测。我的一些输入序列同时具有线性趋势和季节性。

    我想先去除线性趋势,然后去除季节性。

    我的问题如下:应该在将数据集拆分为训练集和测试集之前这样做吗?如果答案是肯定的,我应该如何处理我想要进行预测的新数据?我的意思是,我应该从这些新数据中去除什么趋势和季节性?

    提前非常感谢!

  42. Ajay Sharma 2022年8月30日下午5:34 #

    你好 Jason,

    我是一名天文学家,我正在做一个项目。在该项目中,我有一些时间序列数据。为了检查时间序列的平稳性,我做了一些测试,如“增强迪基-富勒”和“KPSS”测试,发现我的时间序列是平稳的。现在我想检查时间序列中的季节性成分,这我无法通过目视检查来完成。为此,我需要依赖其他方法。为此,我生成了模型的各种可能的阶数组合(p,d,q)*(P,D,Q,S),其中(p,q,d 分别代表非季节性 AR、MA 模型和非季节性差分的阶数参数,P、Q、D、S 分别代表季节性 AR、MA 模型、季节性差分和季节性成分),并使用“SARIMAX”模型进行拟合,尝试确定最低的 AIC 值。正如我们所知,最低的 AIC 值代表了我们时间序列的最佳最优模型。当我这样做时,我发现最低 AIC 值对应的阶数参数例如是 (1,1,1)*(2,0,0,58)。非季节性成分中不应该有差分参数=1。为什么我会得到这样的结果?你能解释一下吗?

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。