2. 时序数据基础:时间序列的定义、平稳性与非平稳性、自相关与偏自相关、时序数据的可视化方法

2.1 时间序列到底是什么?

说实话,我入行那会儿,对「时间序列」的理解特别朴素——不就是按时间排好的数据嘛。后来做轨迹预测项目,才真正体会到,这玩意儿远没那么简单。

时间序列,严格来说,是一组按时间顺序排列的观测值。比如你每天记录的股票收盘价、每小时采集的传感器温度、每帧捕捉的车辆位置坐标。这些数据点之间,不是独立的。

我习惯把时间序列拆成三个核心要素:

  • 时间戳:观测发生的时刻,可以是等间隔的,也可以是不等间隔的
  • 观测值:在特定时刻记录到的数值
  • 顺序关系:这是最关键的——前后数据点之间存在依赖

你想想看,如果我把今天的气温和昨天的气温交换一下,这个序列就完全变味了。这就是时序数据跟普通表格数据最大的区别:顺序本身携带信息

重要提醒:在轨迹预测中,每一帧的车辆位置就是典型的时间序列。前一帧的位置会直接影响下一帧的预测。忽略这个顺序关系,模型基本就废了。

2.2 平稳性与非平稳性——别被名字吓到

平稳性这个概念,我当年学的时候觉得特别抽象。后来做项目踩了坑,才真正理解它的重要性。

平稳时间序列,说白了就是:统计性质不随时间变化。具体来说:

  • 均值是常数,不随时间漂移
  • 方差是常数,波动幅度不随时间变化
  • 自协方差只跟时间间隔有关,跟具体时刻无关

举个例子,白噪声就是最典型的平稳序列。你取任何一段,它的均值都是0,方差都一样。

非平稳序列就相反了。比如一只股票的价格,长期看是上涨趋势的,均值一直在变。再比如交通流量,早晚高峰的波动幅度明显比半夜大,方差也在变。

我的经验:我在做高速公路车辆轨迹预测时,发现原始速度序列明显非平稳——堵车时方差大,畅通时方差小。直接拿原始数据建模,效果很差。后来做了差分处理,才把序列变得相对平稳。

为什么我们这么在意平稳性?因为大多数经典时序模型(ARIMA、GARCH等)都假设数据是平稳的。Transformer虽然没那么严格,但处理非平稳数据时,注意力机制容易「跑偏」——模型会花大量精力去拟合趋势,反而忽略了局部模式。

2.3 自相关与偏自相关——时序数据的「记忆」

自相关(ACF)这个概念,我习惯这么理解:今天的自己和昨天的自己有多像

数学上,自相关就是计算时间序列与其滞后版本之间的相关系数。滞后1阶的自相关,就是看t时刻和t-1时刻的相关性。滞后k阶,就是看相隔k个时间步的两个点之间的相关性。

偏自相关(PACF)稍微绕一点。它是在剔除了中间变量的影响后,两个时间点之间的「纯」相关性。比如,t和t-2的相关性,可能完全是由t-1这个中间变量传递过来的。偏自相关就是要去掉这个传递效应。

指标 含义 应用场景
ACF(自相关函数) 包含所有中间路径的相关性 判断序列是否有周期性、趋势
PACF(偏自相关函数) 剔除中间变量后的「直接」相关性 确定AR模型的阶数

我曾经踩过的坑:有一次做交通流量预测,ACF图显示滞后24阶的相关性很高,我以为是日周期。后来仔细一看,其实是数据预处理时没去掉异常值,导致虚假相关。所以看ACF/PACF之前,一定要先做数据清洗。

2.4 时序数据的可视化——先看再建模

我个人有个习惯:拿到任何时序数据,第一件事不是建模,而是画图。你想想看,模型再厉害,也架不住数据本身有问题。

常用的可视化方法,我列几个:

2.4.1 时间序列折线图

最基础也最直观。横轴是时间,纵轴是数值。一眼就能看出趋势、季节性、异常点。

import matplotlib.pyplot as plt
import pandas as pd

# 假设df是包含时间戳和数值的DataFrame
plt.figure(figsize=(12, 4))
plt.plot(df['timestamp'], df['value'])
plt.title('时间序列折线图')
plt.xlabel('时间')
plt.ylabel('数值')
plt.show()

2.4.2 自相关图(ACF Plot)

画出自相关函数随滞后阶数的变化。如果ACF衰减很慢,说明序列非平稳。如果ACF在某个滞后处突然截断,那可能是MA过程的特征。

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(df['value'], lags=40)
plt.title('自相关函数图')
plt.show()

2.4.3 偏自相关图(PACF Plot)

跟ACF图类似,但显示的是偏自相关。在确定AR模型的阶数时特别有用。

from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(df['value'], lags=40)
plt.title('偏自相关函数图')
plt.show()

2.4.4 季节性分解图

把时间序列拆成趋势、季节性和残差三部分。这样能看清数据的底层结构。

from statsmodels.tsa.seasonal import seasonal_decompose

result = seasonal_decompose(df['value'], model='additive', period=24)
result.plot()
plt.show()

我的建议:在轨迹预测项目中,我习惯把车辆轨迹画成二维路径图,同时叠加速度或加速度的时间序列。这样既能看空间路径,又能看运动状态的变化,比单看一个维度有效得多。

2.5 小结

这一章我们聊了时间序列的基础概念。说白了,就是三件事:

  1. 定义:按时间顺序排列的观测值,顺序本身携带信息
  2. 平稳性:统计性质不随时间变化,是很多模型的前提假设
  3. 自相关与偏自相关:衡量时序数据「记忆」的工具,帮助理解数据的内在结构

可视化是理解数据的第一步。我见过太多人上来就调模型,结果数据本身就有问题。记住:先画图,再建模。这个习惯能帮你省掉至少一半的调试时间。

下一章,我们会深入Transformer的核心机制——自注意力。到时候你会发现,自注意力其实就是在学习时序数据中的自相关结构。嗯,基础打牢了,后面就顺了。