目 录CONTENT

文章目录

生成时间序列特征的10个Python单行代码技巧

Administrator
2025-10-28 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/10-python-one-liners-for-generating-time-series-features/

原文作者:Iván Palomares Carrascosa


10 Python One-Liners for Generating Time Series Features

10 Python One-Liners for Generating Time Series Features

引言

时间序列数据通常需要深入的理解才能构建有效且富有洞察力的预测模型。时间序列预测中有两个关键属性至关重要:表示(Representation)和粒度(Granularity)

  • 表示涉及使用有意义的方法将原始时间数据(例如,每日或每小时的测量值)转换为信息丰富的模式。
  • 粒度是关于分析这些模式在多大程度上精确地捕捉了时间变化。

作为同一事物的两面,它们的差异很微妙,但有一点是肯定的:两者都是通过特征工程实现的。

本文介绍了10个简单的Python单行代码,用于基于原始时间序列数据底层的不同特征和属性来生成时间序列特征。这些单行代码可以单独使用,也可以组合使用,以帮助您创建更具信息量的、能揭示数据时间行为(如何演变、如何波动以及随时间展现出哪些趋势)的数据集。

请注意,我们的示例使用了PandasNumPy

1. 滞后特征(自回归表示)

使用自回归表示或滞后特征的理念比听起来要简单:它包括将前一个观测值添加为当前观测值的新预测特征。本质上,这是表示时间依赖性(例如,当前时间点与先前时间点之间的依赖性)最简单的方法。

作为此列表中第一个单行代码示例,我们更仔细地看一下这个。

此示例单行代码假设您已将原始时间序列数据集存储在一个名为 dfDataFrame 中,其中一个现有属性名为 'value'。请注意,shift() 函数中的参数可以调整,以获取比当前观测值提前 n 个时间单位或观测值的值:

df['lag_1'] = df['value'].shift(1)

对于每日时间序列数据,如果您想捕获给定星期几(例如星期一)的前一个值,使用 shift(7) 是有意义的。

2. 滚动均值(短期平滑)

为了捕捉数据中的局部趋势或平滑短期波动,通常使用前 n 个观测值的滚动均值会很方便:这是一种简单但非常有用的方法,可以在给定特征上平滑有时混乱的原始时间序列值。

此示例创建了一个新特征,其中包含当前观测值之前三个值的滚动平均值:

df['rolling_mean_3'] = df['value'].rolling(3).mean()

Smoothed time series feature with rolling mean

使用滚动均值的平滑时间序列特征

3. 滚动标准差(局部波动性)

与滚动均值类似,也可以根据滚动标准差创建新特征,这对于模拟连续观测值的波动性很有效。

此示例引入了一个特征,用于模拟在移动窗口为一周(假设为每日观测值)内最新值的变化情况。

df['rolling_std_7'] = df['value'].rolling(7).std()

4. 扩展均值(累积记忆)

扩展均值计算截至(并包括)时间序列中当前观测值的所有数据点的平均值。因此,它类似于一个窗口大小不断增大的滚动均值。它有助于分析时间序列属性中值的平均值如何随时间演变,从而更可靠地捕捉长期的上升或下降趋势。

df['expanding_mean'] = df['value'].expanding().mean()

5. 差分(趋势去除)

该技术用于去除长期趋势,突出变化率——这对于稳定非平稳时间序列非常重要。它计算目标属性的连续观测值(当前与上一个)之间的差异:

df['diff_1'] = df['value'].diff()

6. 基于时间特征(时间分量提取)

简单但对实际应用非常有用,此单行代码可用于分解和提取时间序列围绕的完整日期时间特征或索引中的相关信息:

df['month'], df['dayofweek'] = df['Date'].dt.month, df['Date'].dt.dayofweek

重要提示:请务必检查您的时间序列中的日期时间信息是包含在常规属性中还是作为数据结构的索引中。如果它在索引中,您可能需要使用以下方法:

df['hour'], df['dayofweek'] = df.index.hour, df.index.dayofweek

7. 滚动相关性(时间关系)

这种方法超越了时间窗口内的滚动统计量,用于衡量近期值与其滞后对应值之间的相关性,从而有助于发现演变中的自相关性。这在检测情景转换(regime shifts)(数据中发生突然且持续的行为变化,当滚动相关性开始减弱或在某一点反转时)中特别有用。

df['rolling_corr'] = df['value'].rolling(30).corr(df['value'].shift(1))

8. 傅里叶特征(季节性)

正弦傅里叶变换可用于原始时间序列属性中,以捕获周期性或季节性模式。例如,应用正弦(或余弦)函数可以将日期时间特征中潜在的周期性日(一年中的某一天)信息转换为有助于学习和建模年度模式的连续特征。

df['fourier_sin'] = np.sin(2 * np.pi * df['Date'].dt.dayofyear / 365) 
df['fourier_cos'] = np.cos(2 * np.pi * df['Date'].dt.dayofyear / 365)

在此示例中,我使用两行代码而不是单行代码,原因如下:正弦和余弦结合在一起更能捕捉可能出现的周期性季节模式的整体情况。

9. 指数加权均值(自适应平滑)

指数加权均值(简称 EWM)用于获得指数衰减的权重,这些权重赋予近期观测值更高的重要性,同时仍然保留长期记忆。这是一种更具适应性、更“智能”的方法,它优先考虑近期观测值而不是遥远的过去。

df['ewm_mean'] = df['value'].ewm(span=5).mean()

10. 滚动熵(信息复杂度)

最后一个需要更多数学知识!给定时间窗口上的滚动熵计算该时间窗口内值的随机性或分散程度,从而揭示其中的信息量和复杂性。较低的滚动熵值表示有序和可预测性,而值越高,则“混乱和不确定性”越大。

df['rolling_entropy'] = df['value'].rolling(10).apply(lambda x: -np.sum((p:=np.histogram(x, bins=5)[0]/len(x))*np.log(p+1e-9)))

总结

在本文中,我们考察并说明了10种策略——每种策略都只占一行代码——用于从原始时间序列数据中提取各种模式和信息,范围从更简单的趋势到更复杂的季节性和信息复杂度。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区