时序数据基础:时间序列的定义、平稳性与非平稳性、自相关与偏自相关、趋势与季节性分解
各位同学好,我是你们这门课的主讲。今天咱们来聊聊时序数据的基础。说实话,这部分内容看着有点理论,但你要是真搞懂了,后面做预测模型会顺手很多。我当年刚入行时,就是没重视这些基础,结果模型跑出来一塌糊涂,后来回头补课才明白——地基不牢,房子盖不高。
1. 时间序列到底是什么?
先问个问题:你手机里每天记录的步数,算不算时间序列?当然算。时间序列,说白了就是按照时间顺序排列的一组数据点。比如股票价格、每小时的气温、工厂里传感器的电流值——这些都是。
我个人习惯把时间序列分成两类:
- 连续时间序列:理论上每个时刻都有值,比如模拟信号。
- 离散时间序列:只在特定时间点采样,比如每5分钟记录一次功率。
咱们做超短期功率预测,绝大多数情况处理的是离散时间序列。采样间隔可能是1分钟、5分钟或者15分钟。嗯,这里要注意:采样间隔的选择会直接影响模型效果,我后面会专门讲。
2. 平稳性与非平稳性——这俩到底啥意思?
平稳性这个概念,我刚开始学的时候也觉得抽象。其实你想想看:如果一个时间序列的统计性质(比如均值、方差)不随时间变化,那它就是平稳的。反过来,如果均值忽高忽低,方差忽大忽小,那就是非平稳。
举个例子:
- 平稳序列:白噪声,比如收音机里的沙沙声。均值始终为0,方差恒定。
- 非平稳序列:股票价格。长期看是上涨趋势,均值一直在变。
我在项目中遇到过最典型的非平稳情况——光伏功率数据。白天有太阳时功率高,晚上为零,均值一天之内波动巨大。这种数据如果不做处理直接建模,预测结果会非常糟糕。
为什么平稳性这么重要?
因为大多数时间序列模型(比如ARIMA)都假设数据是平稳的。非平稳数据会导致模型参数估计不准,预测结果不可靠。说白了,模型会“学歪”。
3. 自相关与偏自相关——数据自己跟自己“聊天”
自相关,就是当前时刻的值与过去某个时刻的值之间的相关性。比如今天下午3点的功率,跟昨天下午3点的功率有没有关系?如果有,那就是存在自相关。
偏自相关呢?它更“纯粹”一些——它衡量的是,在排除了中间时刻的影响之后,当前值与过去某个时刻值的直接相关性。
我画个图帮大家理解:
在实际项目中,我经常用ACF和PACF图来判断模型阶数。比如:
- 如果ACF拖尾、PACF截尾——适合用AR模型
- 如果ACF截尾、PACF拖尾——适合用MA模型
- 如果两者都拖尾——可能需要ARMA模型
小技巧:用Python的statsmodels.graphics.tsaplots库可以快速画出ACF和PACF图。我一般会先看ACF图,如果自相关衰减很慢,那数据大概率是非平稳的,需要先做差分。
4. 趋势与季节性分解——把复杂数据拆开看
时间序列通常可以拆成三部分:
- 趋势(Trend):长期上升或下降的方向。比如某个地区用电量逐年增长。
- 季节性(Seasonal):固定周期内的规律波动。比如一天之内用电高峰在晚上。
- 残差(Residual):去掉趋势和季节性后剩下的随机波动。
我常用的分解方法是STL(Seasonal-Trend decomposition using LOESS)。它比经典分解法更鲁棒,能处理非线性趋势。
来看一段代码示例:
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL
# 假设df是包含功率数据的DataFrame,索引为时间
stl = STL(df['power'], period=96) # 96个点一天(15分钟间隔)
result = stl.fit()
# 提取各分量
trend = result.trend
seasonal = result.seasonal
residual = result.resid
# 可视化
fig, axes = plt.subplots(4, 1, figsize=(12, 8))
df['power'].plot(ax=axes[0], title='原始数据')
trend.plot(ax=axes[1], title='趋势')
seasonal.plot(ax=axes[2], title='季节性')
residual.plot(ax=axes[3], title='残差')
plt.tight_layout()
plt.show()
避坑指南:我曾经在分解风电功率数据时,把周期设错了。风电的日周期性其实不如光伏明显,因为风速受天气影响更大。如果你发现残差里还有明显的规律,那说明周期参数没选对,或者数据里还有别的周期成分。
5. 知识体系总览
下面这张图总结了本章的核心内容,方便你回顾:
好了,这一章的内容就到这里。记住:平稳性判断是第一步,自相关分析帮你选模型,分解让你看清数据结构。这三板斧练好了,后面建模会轻松很多。