重温:时间窗口与滑动步长的概念
核心概念
-
窗口大小(Window Size)
- 定义窗口包含的时间步数(如过去7天、24小时等)。
- 例如,窗口大小为5时,每个窗口包含连续的5个时间点数据。
-
滑动步长(Step/Stride)
- 窗口每次向前移动的时间步数。步长为1表示窗口每次移动一个时间单位;步长大于1时,窗口跳跃式移动。
-
窗口方向
- 前向窗口:从历史到当前时间(用于预测未来)。
- 后向窗口:从当前时间到历史(用于分析过去模式)。
典型应用场景
-
特征工程
- 在窗口内计算统计量(均值、标准差、最大值、最小值等),作为模型的输入特征。
- 示例:用过去30天的平均销售额预测未来一周的销售额。
-
时间序列预测
- 将窗口内的历史数据作为输入(X),窗口后的未来数据作为输出(Y),构建监督学习数据集。
- 例如:用过去10天的温度预测第11天的温度。
-
异常检测
- 通过窗口内的数据分布(如移动平均、标准差)识别突变点或异常值。
-
平滑处理
- 使用移动平均(Moving Average)或指数平滑(Exponential Smoothing)消除噪声。
实现示例(Python)
假设有一个时间序列数据 [1, 2, 3, 4, 5, 6, 7, 8]
,窗口大小为3,步长为1:
def sliding_window(sequence, window_size, step=1):
windows = []
for i in range(0, len(sequence) - window_size + 1, step):
windows.append(sequence[i:i+window_size])
return windows
data = [1, 2, 3, 4, 5, 6, 7, 8]
windows = sliding_window(data, window_size=3, step=1)
# 输出结果:
# [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]]
工具库支持
-
Pandas:
DataFrame.rolling()
实现滚动计算。import pandas as pd df = pd.DataFrame({'value': [1, 2, 3, 4, 5]}) df['rolling_mean'] = df['value'].rolling(window=3).mean()
-
NumPy:通过
np.lib.stride_tricks.sliding_window_view
快速生成滑动窗口视图(需NumPy 1.20+)。
注意事项
-
窗口大小选择
- 太小:可能捕捉不到长期趋势,对噪声敏感。
- 太大:可能导致滞后,丢失细节信息。
-
数据泄漏
- 在预测任务中,需确保窗口内不包含未来信息(验证时需严格划分训练集和测试集)。
-
边界处理
- 初始窗口可能不足长度时,可选择填充(padding)或忽略。