You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SARIMAX处理5分钟高频时间序列数据的性能问题及替代方案咨询

SARIMAX处理5分钟高频时间序列数据的性能问题及替代方案咨询

我最近一直在用statsmodels包里的SARIMAX来建模时间序列数据,目的是理解数据的季节性和非平稳性。我的数据是5分钟间隔的高频数据,每天有288个观测值,但过程中遇到了不小的挑战:

  • 性能问题:即使我配置了正确的参数(比如设置日季节性周期为288),SARIMAX的运行速度慢得离谱,有时候还会因为内存或计算资源不足直接崩溃。
  • 模型适配性疑问:我怀疑SARIMAX可能并不适合高频数据集,这是真的吗?如果是的话,为什么SARIMAX在处理这类数据时效率特别低?

修复方案或替代模型(重要说明)

注意:我完全不想对数据进行重采样或降采样,因为这样会丢失对我的分析至关重要的信息。

我的核心问题

  • 有没有什么技术可以在不丢失信息的前提下,优化SARIMAX处理高频数据的性能?
  • 或者,有没有专门为高频数据设计的更好的模型,同时还能让我理解季节性、趋势等时间维度的特征?

我之前写了一个可复现的示例代码,用来复现这个问题:

# !pip install pmdarima
# Import additional required libraries
import pandas as pd
import numpy as np
import pmdarima as pm
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_absolute_error, mean_squared_error
from datetime import datetime, timedelta


# Generate timestamps for 30 consecutive days with 5-minute intervals
start_time = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
timestamps = [start_time + timedelta(minutes=5 * i) for i in range(30 * 24 * 12)]  # 5-min epochs

# Generate 'avgcpu' data with seasonality
np.random.seed(42)  # For reproducibility
base_pattern = np.sin(np.linspace(0, 2 * np.pi, len(timestamps) // 30)) * 7.5 + 27.5
avgcpu = np.tile(base_pattern, 30) + np.random.normal(0, 2, len(timestamps))
avgcpu = np.clip(avgcpu, 20, 35)  # Normalize within the range [20, 35]

# Create a DataFrame
data = pd.DataFrame({
    "timestamp": timestamps,
    "avgcpu": avgcpu
}).sort_values("timestamp")


# Regenerate data and split into training and testing sets
test_size  = 2 * 24 * 12  # 2 days of data (288 * 2 observations)
train_data = data.iloc[:-test_size]
test_data  = data.iloc[-test_size:]

train_series = train_data["avgcpu"]
test_series  = test_data["avgcpu"]

我尝试用pm.auto_arima()和直接调用SARIMAX()两种方式,但都遇到了性能问题:

# Model 1: Using pm.auto_arima()
seasonal_period = 288  # Daily seasonality
model1 = pm.auto_arima(
    train_series,
    seasonal=True,
    m=seasonal_period,       # Seasonal period
    trace=True,              # Prints the model selection process
    error_action="ignore",   # Ignores non-converging models
    suppress_warnings=True,  # Suppresses warnings
    stepwise=True            # Stepwise model selection for faster computation
)

# Model 2: Using SARIMAX()
seasonal_period = 288  # Daily seasonality
model2 = SARIMAX(
    train_series,
    order=(1, 1, 1),                            # Simplified initial setup for ARIMA terms
    seasonal_order=(1, 1, 1, seasonal_period),  # Seasonal ARIMA terms
    enforce_stationarity=False,
    enforce_invertibility=False
)

# Fit SARIMAX model
sarimax_result = model2.fit(disp=False)

# Summary of models
print("Model 1 (auto_arima):")
print(model1.summary())

print("\nModel 2 (SARIMAX):")
print(sarimax_result.summary())

# Forecasting with both models for the test set period
forecast_model1, conf_int_model1 = model1.predict(n_periods=test_size, return_conf_int=True)
forecast_model2      = sarimax_result.get_forecast(steps=test_size)
forecast_mean_model2 = forecast_model2.predicted_mean
forecast_ci_model2   = forecast_model2.conf_int()

# Calculate metrics for both models
mae_model1 = mean_absolute_error(test_series, forecast_model1)
mse_model1 = mean_squared_error(test_series, forecast_model1)

mae_model2 = mean_absolute_error(test_series, forecast_mean_model2)
mse_model2 = mean_squared_error(test_series, forecast_mean_model2)

备注:内容来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:43:08