用Python实现特征工程之时间序列特征工程详解

时间序列特征工程是一门专门针对时间序列数据进行特征处理和转换的技术。这类数据通常具有时间依赖性和周期性,因此在对时间序列数据进行建模之前,需要对其进行特定的特征工程处理,以便模型能够有效地捕捉到这些时间特性。

以下是几种常见的时间序列特征工程方法的详细讲解,包括差分、滑动窗口、时间滞后特征、滚动统计特征等,详细的讲解和代码以及结果如下。

1. 差分(Differencing)

1.1 什么是差分?

差分是时间序列分析中的一种基本方法,它通过计算相邻时间点之间的差值来去除时间序列中的趋势成分,从而使时间序列变得平稳。这对许多模型来说至关重要,因为它们假设输入数据是平稳的。

1.2 一阶差分

一阶差分是最简单的差分形式,即计算当前时间点的值与前一个时间点的值之间的差。

示例:一阶差分
import pandas as pd

# 创建一个简单的时间序列数据
data = {'value': [100, 102, 105, 110, 120, 130]}
df = pd.DataFrame(data)

# 计算一阶差分
df['diff_1'] = df['value'].diff(1)

print(df)

输出:

   value  diff_1
0    100     NaN
1    102     2.0
2    105     3.0
3    110     5.0
4    120    10.0
5    130    10.0

解释diff_1 列表示当前值与前一个时间点的值之差。通过一阶差分,可以消除时间序列中的线性趋势。

1.3 二阶差分

二阶差分是在一阶差分的基础上再进行一次差分,常用于去除二次趋势。

示例:二阶差分
# 计算二阶差分
df['diff_2'] = df['diff_1'].diff(1)

print(df)

输出:

   value  diff_1  diff_2
0    100     NaN     NaN
1    102     2.0     NaN
2    105     3.0     1.0
3    110     5.0     2.0
4    120    10.0     5.0
5    130    10.0     0.0

解释diff_2 列表示一阶差分后的结果与前一个时间点的差。二阶差分可以帮助我们去除二次趋势。

2. 滑动窗口(Sliding Window)

2.1 什么是滑动窗口?

滑动窗口是一种常用的时间序列特征工程技术,它通过创建一个固定大小的窗口,在时间序列数据上滑动,以捕捉局部的时间特性。滑动窗口技术特别适用于捕捉短期趋势、模式或异常。

2.2 滑动窗口特征

通过滑动窗口,我们可以生成特征,如在窗口内的最大值、最小值、平均值、标准差等。

示例:滑动窗口平均值
# 创建一个简单的时间序列数据
data = {'value': [100, 102, 105, 110, 120, 130, 140, 150]}
df = pd.DataFrame(data)

# 计算滑动窗口平均值
df['rolling_mean'] = df['value'].rolling(window=3).mean()

print(df)

输出:

   value  rolling_mean
0    100           NaN
1    102           NaN
2    105    102.333333
3    110    105.666667
4    120    111.666667
5    130    120.000000
6    140    130.000000
7    150    140.000000

解释rolling_mean 列表示每个窗口内(大小为3)的平均值。例如,第一个有效窗口包含100、102、105,平均值为102.33。

2.3 滑动窗口标准差

滑动窗口还可以用于计算标准差,捕捉数据的波动性。

示例:滑动窗口标准差
# 计算滑动窗口标准差
df['rolling_std'] = df['value'].rolling(window=3).std()

print(df)

输出:

   value  rolling_mean  rolling_std
0    100           NaN          NaN
1    102           NaN          NaN
2    105    102.333333     2.516611
3    110    105.666667     4.041452
4    120    111.666667     7.505553
5    130    120.000000    10.000000
6    140    130.000000    10.000000
7    150    140.000000    10.000000

解释rolling_std 列表示每个窗口内的标准差,捕捉了时间序列的波动性。

3. 时间滞后特征(Lag Features)

3.1 什么是时间滞后特征?

时间滞后特征是指使用前一时间点或前多个时间点的值作为当前时间点的特征。时间滞后特征是捕捉时间序列数据中自相关性的重要方法。

3.2 创建时间滞后特征
示例:创建滞后1和滞后2的特征
# 创建滞后特征
df['lag_1'] = df['value'].shift(1)
df['lag_2'] = df['value'].shift(2)

print(df)

输出:

   value  rolling_mean  rolling_std  lag_1  lag_2
0    100           NaN          NaN    NaN    NaN
1    102           NaN          NaN  100.0    NaN
2    105    102.333333     2.516611  102.0  100.0
3    110    105.666667     4.041452  105.0  102.0
4    120    111.666667     7.505553  110.0  105.0
5    130    120.000000    10.000000  120.0  110.0
6    140    130.000000    10.000000  130.0  120.0
7    150    140.000000    10.000000  140.0  130.0

解释lag_1lag_2 列表示时间序列的滞后1期和滞后2期的特征。这些滞后特征可以捕捉到时间序列中的自相关性,并用于预测未来的值。

4. 滚动统计特征(Rolling Statistics)

4.1 什么是滚动统计特征?

滚动统计特征是通过计算时间序列数据的滚动窗口内的统计量来生成的特征。这些统计量可以是平均值、标准差、最小值、最大值等。滚动统计特征用于捕捉时间序列中的局部统计特性。

4.2 创建滚动统计特征
示例:滚动窗口最小值和最大值
# 计算滚动窗口最小值
df['rolling_min'] = df['value'].rolling(window=3).min()

# 计算滚动窗口最大值
df['rolling_max'] = df['value'].rolling(window=3).max()

print(df)

输出:

   value  rolling_mean  rolling_std  lag_1  lag_2  rolling_min  rolling_max
0    100           NaN          NaN    NaN    NaN          NaN          NaN
1    102           NaN          NaN  100.0    NaN          NaN          NaN
2    105    102.333333     2.516611  102.0  100.0        100.0        105.0
3    110    105.666667     4.041452  105.0  102.0        102.0        110.0
4    120    111.666667     7.505553  110.0  105.0        105.0        120.0
5    130    120.000000    10.000000  120.0  110.0        110.0        130.0
6    140    130.000000    10.000000  130.0  120.0        120.0        140.0
7    150    140.000000    10.000000  140.0  130.0        130.0        150.0

解释rolling_minrolling_max 分别表示滚动窗口内的最小值和最大值。这些特征可以帮助我们了解时间序列在不同时间段内的波动范围。

5. 时间序列中的周期性特征(Seasonality Features)

5.1 什么是周期性特征?

时间序列数据中的周期性特征是指数据在固定时间周期内重复出现的模式。周期性特征在许多实际问题中都很重要,例如季节性销售数据、日常交通流量等。

5.2 提取周期性特征

周期性特征通常可以从时间戳中提取,比如一年中的月份、一天中的小时等。

示例:提取日期中的周期性特征
# 创建时间戳数据
df['date'] = pd.date_range(start='2023-01-01', periods=len(df), freq='M')

# 提取月份和季度作为周期性特征
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

print(df)

输出:

   value  rolling_mean  rolling_std  lag_1  lag_2  rolling_min  rolling_max       date  month  quarter
0    100           NaN          NaN    NaN    NaN          NaN          NaN 2023-01-31      1        1
1    102           NaN          NaN  100.0    NaN          NaN          NaN 2023-02-28      2        1
2    105    102.333333     2.516611  102.0  100.0        100.0        105.0 2023-03-31      3        1
3    110    105.666667     4.041452  105.0  102.0        102.0        110.0 2023-04-30      4        2
4    120    111.666667     7.505553  110.0  105.0        105.0        120.0 2023-05-31      5        2
5    130    120.000000    10.000000  120.0  110.0        110.0        130.0 2023-06-30      6        2
6    140    130.000000    10.000000  130.0  120.0        120.0        140.0 2023-07-31      7        3
7    150    140.000000    10.000000  140.0  130.0        130.0        150.0 2023-08-31      8        3

解释:通过提取月份(month)和季度(quarter)作为周期性特征,我们可以捕捉到时间序列中的周期性模式,这对预测未来的趋势非常有用。

6. 时间序列特征工程的综合应用

在实际应用中,我们通常会综合使用上述时间序列特征工程技术来构建更强大的特征集,以下是一个综合应用的示例:

import pandas as pd

# 创建时间序列数据
data = {'value': [100, 102, 105, 110, 120, 130, 140, 150]}
df = pd.DataFrame(data)

# 计算差分
df['diff_1'] = df['value'].diff(1)

# 计算滑动窗口平均值
df['rolling_mean'] = df['value'].rolling(window=3).mean()

# 创建滞后特征
df['lag_1'] = df['value'].shift(1)

# 计算滚动窗口标准差
df['rolling_std'] = df['value'].rolling(window=3).std()

# 添加时间戳数据
df['date'] = pd.date_range(start='2023-01-01', periods=len(df), freq='M')

# 提取周期性特征
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

print(df)

输出:

   value  diff_1  rolling_mean  lag_1  rolling_std       date  month  quarter
0    100     NaN           NaN    NaN          NaN 2023-01-31      1        1
1    102     2.0           NaN  100.0          NaN 2023-02-28      2        1
2    105     3.0    102.333333  102.0     2.516611 2023-03-31      3        1
3    110     5.0    105.666667  105.0     4.041452 2023-04-30      4        2
4    120    10.0    111.666667  110.0     7.505553 2023-05-31      5        2
5    130    10.0    120.000000  120.0    10.000000 2023-06-30      6        2
6    140    10.0    130.000000  130.0    10.000000 2023-07-31      7        3
7    150    10.0    140.000000  140.0    10.000000 2023-08-31      8        3

综合分析

  • 差分(diff_1 帮助消除趋势,使序列更平稳。
  • 滑动窗口平均值(rolling_mean 捕捉了短期趋势。
  • 滞后特征(lag_1 捕捉了时间序列中的自相关性。
  • 滚动窗口标准差(rolling_std 提供了波动性的信息。
  • 周期性特征(monthquarter 提供了季节性或周期性的信息。

7. 总结

时间序列特征工程是处理时间序列数据时的关键步骤,能够帮助模型更好地捕捉时间依赖性和周期性。通过差分、滑动窗口、时间滞后特征、滚动统计特征和周期性特征等技术,我们可以构建强大的特征集,提升模型的预测能力。在实际应用中,灵活运用这些技术,并根据具体问题的需求进行调整,是成功处理时间序列数据的关键。

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值