如何将ARIMA模型应用于小时级时间序列实现交通流量预测?
小时级交通流量预测的ARIMA(SARIMA)实现指南
针对小时级交通流量时间序列的ARIMA应用,核心难点在于处理时间序列连续性、季节性周期以及平稳性校验,以下是分步解决流程:
一、数据预处理(解决小时数据常见报错的关键)
小时数据的格式、连续性问题是多数报错的根源,先完成以下操作:
- 解析时间列并设置为索引
确保Datetime被正确识别为时间类型,且作为时间序列的索引:import pandas as pd # 读取数据(替换为你的文件路径) df = pd.read_csv("traffic_data.csv") # 按日/月/年 小时:分钟格式解析时间 df['Datetime'] = pd.to_datetime(df['Datetime'], format='%d/%m/%y %H:%M') # 设置时间索引 df.set_index('Datetime', inplace=True) - 补全连续时间序列
ARIMA要求序列无时间断点,需按小时重采样并填充缺失值:# 按小时频率重采样,确保时间连续 df = df.resample('H').asfreq() # 用线性插值填充缺失的流量值(可根据业务调整为均值/中位数填充) df['Traffic'] = df['Traffic'].interpolate(method='linear')
二、平稳性校验与差分处理
ARIMA仅适用于平稳序列,小时数据通常存在24小时日周期,需结合普通差分和季节性差分:
- 用ADF检验判断平稳性:
from statsmodels.tsa.stattools import adfuller adf_result = adfuller(df['Traffic']) print(f"ADF统计量: {adf_result[0]}, p值: {adf_result[1]}") # p值>0.05则序列不平稳,需要差分 - 差分操作:
对差分后的序列再次做ADF检验,直到p值<0.05确认平稳。# 1阶普通差分(消除趋势) df['diff_1'] = df['Traffic'].diff().dropna() # 24阶季节性差分(消除日周期) df['diff_seasonal'] = df['Traffic'].diff(24).dropna()
三、参数确定(优先用SARIMA而非普通ARIMA)
小时数据存在明显的24小时季节性,建议使用SARIMA(季节性ARIMA),参数包含(p,d,q)(非季节性部分)和(P,D,Q,s)(季节性部分,s=24):
- 自动选参(高效且准确):
运行后会输出最优参数组合,比如常见的from pmdarima import auto_arima # m=24对应小时数据的日周期 auto_model = auto_arima(df['Traffic'], seasonal=True, m=24, trace=True, suppress_warnings=True) print(auto_model.summary())(1,1,1)(1,1,1,24)。
四、模型训练与预测
- 拆分训练集与测试集:
train_size = int(len(df) * 0.8) train_df, test_df = df.iloc[:train_size], df.iloc[train_size:] - 训练SARIMA模型:
from statsmodels.tsa.statespace.sarimax import SARIMAX # 替换为auto_arima给出的参数 model = SARIMAX(train_df['Traffic'], order=(1,1,1), seasonal_order=(1,1,1,24)) model_fit = model.fit(disp=False) - 预测与验证:
# 预测测试集时段的流量 predictions = model_fit.predict(start=len(train_df), end=len(train_df)+len(test_df)-1, typ='levels') # 可视化对比 import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) plt.plot(test_df.index, test_df['Traffic'], label='实际流量') plt.plot(test_df.index, predictions, label='预测流量', color='red') plt.xlabel('时间') plt.ylabel('交通流量') plt.legend() plt.show()
五、常见报错排查
- 时间索引错误:检查时间列是否有重复、格式是否正确,重采样后确认无时间断点
- 未考虑季节性:普通ARIMA无法捕捉小时数据的24小时周期,必须用SARIMA
- 数据量不足:至少需要1周(168小时)以上的数据,否则模型无法学习到周期规律
- 差分不当:差分阶数过高会导致序列信息丢失,过低则无法达到平稳,需结合ADF检验调整
内容的提问来源于stack exchange,提问作者Atanasio Tembe
相关产品推荐
相关产品推荐

