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

为何Darts库中ARIMA模型的historical_forecast方法运行缓慢?

问题:Darts ARIMA滚动窗口回测耗时远高于手动实现的AR(7)

我用Darts库实现AR(7)模型,采用滚动窗口技术测试模型效果。数据集规模为1825天(5年),滚动窗口大小设为365,预测步长为1。使用ARIMA模型的historical_forecasts方法时,运行耗时长达约3分钟。

出于好奇,我手动实现了该回测逻辑:构建滞后数据集,用sklearn的LinearRegression(),每次迭代滑动训练窗口并预测次日数据,总耗时仅约5秒,且预测结果与Darts的ARIMA模型几乎一致。

以下是基于Darts自带数据集的可复现代码,能直观展示耗时差异:手动实现的AR(7)耗时0.3秒,而Darts的ARIMA耗时9秒。测试使用的参数为start=48, train_length=48, forecast_horizon=1, retrain=False。

# Dependendencies
import numpy as np
import time
from darts.datasets import AirPassengersDataset
from darts.models import ARIMA
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_percentage_error

# Load dataset as a Darts TimeSeries
series = AirPassengersDataset().load()

# Convert it to a pandas dataframe
data = series.pd_dataframe()

# Take first time
time1 = time.time()

# Create the lagged columns to perform AR(7)
for i in range(1, 8):
    curr_col = "#Passengers_lag_" + str(i)
    data[curr_col] = data["#Passengers"].shift(i)

# Remove first 7 rows
data.dropna(inplace=True)

# Perform rolling_window LinearRegression()
window_size = 48
predictions_ar7_by_hand = []

for t in range(window_size, data.shape[0]):

    # Take the corresponding window of size 48 for training
    X_train, Y_train = data.iloc[(t - window_size) : t, 1:], data.iloc[(t - window_size) : t, 0]

    # Take the corresponding testing values
    X_test, Y_test = data.iloc[t: t+1, 1:], data.iloc[t: t+1, 0].values[0]

    # Fit model
    lr = LinearRegression().fit(X_train, Y_train)

    # Predict using X_test
    prediction = lr.predict(X_test)[0]

    print('------------------------------')
    print(f"Test value: {Y_test}")
    print(f"Predicted value: {prediction}")
    
    predictions_ar7_by_hand.append(prediction)


print('**************** Finished ARIMA by hand **********************')
print(f"Time: {time.time()-time1}")

# Take second time
time2 = time.time()

# Forecast using ARIMA by Darts
ar7 = ARIMA(p=7, d=0, q=0)

predictions_ar7 = ar7.historical_forecasts(series, start=48, train_length=48, forecast_horizon=1, retrain=False)

print('**************** Finished ARIMA by DARTS **********************')
print(f"Time: {time.time()-time2}")

# Convert it to a pandas dataframe
predictions_ar7 = predictions_ar7.pd_dataframe()

# Insert the results in the same df
predictions_ar7['#Passengers_arima_by_hand'] = [np.nan for x in range(7)] + predictions_ar7_by_hand

# Rename some columns
predictions_ar7.rename(columns={'#Passengers': '#Passengers_arima_by_darts'}, inplace=True)

# Add original data 
predictions_ar7['#Passengers'] = data['#Passengers']

# Remove NaN, only 7 rows
predictions_ar7.dropna(inplace=True)

# Print the results

print("*********** RESULTS **********")

mape1 = mean_absolute_percentage_error(predictions_ar7['#Passengers'], predictions_ar7['#Passengers_arima_by_darts'])
mape2 = mean_absolute_percentage_error(predictions_ar7['#Passengers'], predictions_ar7['#Passengers_arima_by_hand'])
mape3 = mean_absolute_percentage_error(predictions_ar7['#Passengers_arima_by_darts'], predictions_ar7['#Passengers_arima_by_hand'])
print(f"MAPE by Darts: {mape1}, MAPE by hand: {mape2}, MAPE between two arima: {mape3}")

想了解这种耗时差异的具体原因,小数据集上的差异尚可接受,但原数据集上的3分钟耗时相比简易实现过于夸张。

内容的提问来源于stack exchange,提问作者paolopazzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:09:54