时间序列特征工程是一门专门针对时间序列数据进行特征处理和转换的技术。这类数据通常具有时间依赖性和周期性,因此在对时间序列数据进行建模之前,需要对其进行特定的特征工程处理,以便模型能够有效地捕捉到这些时间特性。
以下是几种常见的时间序列特征工程方法的详细讲解,包括差分、滑动窗口、时间滞后特征、滚动统计特征等,详细的讲解和代码以及结果如下。
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_1
和 lag_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_min
和 rolling_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
) 提供了波动性的信息。 - 周期性特征(
month
、quarter
) 提供了季节性或周期性的信息。
7. 总结
时间序列特征工程是处理时间序列数据时的关键步骤,能够帮助模型更好地捕捉时间依赖性和周期性。通过差分、滑动窗口、时间滞后特征、滚动统计特征和周期性特征等技术,我们可以构建强大的特征集,提升模型的预测能力。在实际应用中,灵活运用这些技术,并根据具体问题的需求进行调整,是成功处理时间序列数据的关键。