4. 时间序列分析基础:平稳性、自相关、滑动窗口、特征工程入门

各位好,我是老张。在风电行业摸爬滚打了十几年,今天咱们来聊聊时间序列分析。说实话,SCADA数据本质上就是一堆时间戳加传感器读数。你想想看,风速、功率、桨距角,哪个不是随时间变化的?所以,搞懂时间序列分析,是咱们做后续所有分析的基础。

我个人习惯把时间序列分析比作「听心跳」。正常人的心跳是有规律的,风机的运行数据也一样。如果心跳乱了,那肯定出问题了。咱们要做的,就是通过分析这些「心跳」数据,提前发现隐患。

4.1 平稳性:数据的基本盘

平稳性,说白了就是数据的统计特性不随时间变化。均值、方差、自协方差,这些指标在时间轴上保持稳定。为什么这么重要?因为很多时间序列模型都假设数据是平稳的。如果数据不平稳,模型预测就会像「无头苍蝇」一样乱撞。

我在项目中遇到过这样的情况:某风场SCADA数据里的风速序列,看起来忽高忽低,但均值基本稳定在6m/s左右。这就是典型的平稳序列。但功率数据就不一样了,随着风速变化,功率的均值也在变,这就是非平稳的。

平稳性的判断方法:
  • 肉眼观察法:看时序图,数据是否围绕一个常数上下波动,波动幅度是否大致相同。
  • 单位根检验(ADF检验):这是最常用的统计检验方法。p值小于0.05,通常认为数据是平稳的。
  • 自相关图(ACF):平稳序列的自相关函数会快速衰减到0附近。
我的小技巧: 别太迷信统计检验。有时候数据看起来不平稳,但做差分后就能变平稳。我一般先画图看看,再用ADF检验确认一下。

4.2 自相关:数据自己跟自己「攀亲戚」

自相关,听起来高大上,其实就是当前时刻的数据跟过去某个时刻的数据之间的相关性。比如,现在的风速跟5分钟前的风速有没有关系?肯定有啊,风不会突然从0飙到20m/s。

自相关函数(ACF)和偏自相关函数(PACF)是咱们分析自相关的两大法宝。ACF看的是所有滞后项的总相关性,PACF则剔除了中间项的影响。

我记得有一次分析某台风机的主轴温度数据,ACF图显示滞后1阶和2阶的自相关特别高,但3阶以后就掉下来了。这说明温度变化主要受前两个时刻的影响,跟更早的数据关系不大。这个信息对后面建模型很有用。

避坑指南: 我曾经犯过一个错误,看到ACF图有周期性波动,就以为数据有季节性。后来才发现,那是数据采集频率不一致导致的伪周期。所以,做自相关分析前,一定要先检查数据的时间间隔是否均匀。

4.3 滑动窗口:让数据「动」起来

滑动窗口,也叫滚动窗口,是时间序列特征工程里最常用的手法。它的核心思想是:用一个固定大小的窗口在时间轴上滑动,对窗口内的数据计算统计量(均值、标准差、最大值、最小值等)。

你想想看,原始SCADA数据是每秒一条,但风机控制系统的响应时间通常是秒级甚至分钟级。直接用原始数据做分析,噪声太大。滑动窗口能帮我们平滑数据,提取出更有意义的特征。

举个例子,计算风速的10分钟滑动平均。这能消除湍流的影响,反映真实的平均风速。我习惯用窗口大小为600个数据点(假设采样频率是1Hz),步长可以设为1或10,看具体需求。

import pandas as pd
import numpy as np

# 假设df是包含风速数据的DataFrame,时间索引为'timestamp'
# 计算10分钟滑动平均(600个数据点)
df['wind_speed_avg_10min'] = df['wind_speed'].rolling(window=600, min_periods=1).mean()

# 计算滑动标准差,反映风速波动
df['wind_speed_std_10min'] = df['wind_speed'].rolling(window=600, min_periods=1).std()

# 计算滑动最大值和最小值
df['wind_speed_max_10min'] = df['wind_speed'].rolling(window=600, min_periods=1).max()
df['wind_speed_min_10min'] = df['wind_speed'].rolling(window=600, min_periods=1).min()
经验之谈: 窗口大小的选择很关键。太小了,噪声滤不掉;太大了,会丢失细节。我一般会试几个不同的窗口大小,看看哪个对后续模型效果最好。另外,min_periods参数要设置好,避免窗口开头出现大量NaN值。

4.4 特征工程入门:从原始数据到「金矿」

特征工程,说白了就是把原始数据变成模型能听懂的语言。对于时间序列,特征工程的核心就是提取时间维度和统计维度的信息。

我总结了几个常用的时间序列特征,你可以直接拿去用:

特征类别 具体特征 说明
统计特征 均值、标准差、偏度、峰度 描述数据分布的基本形态
时序特征 滞后值(lag)、差分值 捕捉时间依赖关系
滑动窗口特征 滑动均值、滑动标准差、滑动极值 反映局部变化趋势
频域特征 FFT幅值、功率谱密度 分析周期性成分
时间编码特征 小时、星期、月份、季节 捕捉时间周期性规律

嗯,这里要注意,特征不是越多越好。我见过有人一口气提取了上百个特征,结果模型过拟合得一塌糊涂。我的原则是:先理解业务,再提取特征。比如,对于风机齿轮箱故障预测,振动信号的频域特征就比均值特征重要得多。

特征工程的核心流程:
  1. 数据清洗:处理缺失值、异常值、重复值。
  2. 特征提取:从原始数据中生成新的特征。
  3. 特征选择:用相关性分析、特征重要性等方法筛选有效特征。
  4. 特征缩放:标准化或归一化,让不同量纲的特征可比。

最后,我画了一张图,帮你理清本章的知识脉络。这张图展示了从原始SCADA数据到特征工程的完整流程,以及平稳性、自相关、滑动窗口在其中扮演的角色。

时间序列分析基础:知识体系与核心逻辑 原始SCADA数据 平稳性检验(ADF、ACF图) 自相关分析(ACF/PACF) 滑动窗口特征提取 特征工程:统计特征、时序特征、频域特征 判断数据是否可用 确定滞后阶数 平滑数据、提取局部特征 为模型提供输入

这张图很直观地展示了咱们今天讲的内容。从原始数据出发,先做平稳性检验,确保数据「靠谱」;然后做自相关分析,看看数据内部的时间依赖关系;接着用滑动窗口提取局部特征;最后汇总到特征工程,为后续的模型训练做准备。

好了,今天就聊到这儿。记住,时间序列分析不是一蹴而就的,需要多动手、多尝试。下次咱们会深入讲讲如何用这些特征来训练预测模型。

专注资料整理