import pandas as pd import numpy as np import matplotlib.pyplot as plt from datasetsforecast.long_horizon import LongHorizon from neuralforecast.core import NeuralForecast from neuralforecast.models import NHITS, PatchTST, iTransformer, TSMixer from utilsforecast.losses import mae, mse from utilsforecast.evaluation import evaluate def load_data(name): if name == "ettm1": Y_df, *_ = LongHorizon.load(directory='./ETT-small/', group='ETTm1') Y_df = Y_df[Y_df['unique_id'] == 'OT'] Y_df['ds'] = pd.to_datetime(Y_df['ds']) val_size = 11520 test_size = 11520 freq = '15T' elif name == "ettm2": Y_df, *_ = LongHorizon.load(directory='./ETT-small/', group='ETTm2') Y_df = Y_df[Y_df['unique_id'] == 'OT'] Y_df['ds'] = pd.to_datetime(Y_df['ds']) val_size = 11520 test_size = 11520 freq = '15T' elif name == 'etth1': Y_df, *_ = LongHorizon.load(directory='./ETT-small/', group='ETTh1') Y_df['ds'] = pd.to_datetime(Y_df['ds']) val_size = 2880 test_size = 2880 freq = 'H' elif name == "etth2": Y_df, *_ = LongHorizon.load(directory='./ETT-small/', group='ETTh2') Y_df['ds'] = pd.to_datetime(Y_df['ds']) val_size = 2880 test_size = 2880 freq = 'H' return Y_df, val_size, test_size, freq horizon = 96 iTransformer(h=horizon, input_size=3*horizon, n_series=1, max_steps=1000, early_stop_patience_steps=3) datasets = ['ettm1', 'ettm2', 'etth1', 'etth2'] for dataset in datasets: Y_df, val_size, test_size, freq = load_data(dataset) horizon = 96 models = [ iTransformer(h=horizon, input_size=3*horizon, n_series=1, max_steps=1000, early_stop_patience_steps=3), TSMixer(h=horizon, input_size=3*horizon, n_series=1, max_steps=1000, early_stop_patience_steps=3), NHITS(h=horizon, input_size=3*horizon, max_steps=1000, early_stop_patience_steps=3), PatchTST(h=horizon, input_size=3*horizon, max_steps=1000, early_stop_patience_steps=3) ] # n_series:features num nf = NeuralForecast(models=models, freq=freq) nf_preds = nf.cross_validation(df=Y_df, val_size=val_size, test_size=test_size, n_windows=None) nf_preds = nf_preds.reset_index() evaluation = evaluate(df=nf_preds, metrics=[mae, mse], models=['iTransformer', 'TSMixer', 'NHITS', 'PatchTST']) evaluation.to_csv(f'{dataset}_results.csv', index=False, header=True) files = ['etth1_results.csv', 'etth2_results.csv', 'ettm1_results.csv', 'ettm2_results.csv'] dataframes = [] for file, dataset in zip(files, datasets): df = pd.read_csv(file) df['dataset'] = dataset dataframes.append(df) full_df = pd.concat(dataframes, ignore_index=True) full_df = full_df.drop(['unique_id'], axis=1) dataset_names = full_df['dataset'].unique() model_names = ['iTransformer', 'TSMixer', 'NHITS', 'PatchTST'] fig, axs = plt.subplots(2, 2, figsize=(15, 15)) bar_width = 0.35 axs = axs.flatten() for i, dataset_name in enumerate(dataset_names): df_subset = full_df[(full_df['dataset'] == dataset_name) & (full_df['metric'] == 'mae')] mae_vals = df_subset[model_names].values.flatten() df_subset = full_df[(full_df['dataset'] == dataset_name) & (full_df['metric'] == 'mse')] mse_vals = df_subset[model_names].values.flatten() indices = np.arange(len(model_names)) bars_mae = axs[i].bar(indices - bar_width / 2, mae_vals, bar_width, color='skyblue', label='MAE') bars_mse = axs[i].bar(indices + bar_width / 2, mse_vals, bar_width, color='orange', label='MSE') for bars in [bars_mae, bars_mse]: for bar in bars: height = bar.get_height() axs[i].annotate(f'{height:.2f}', xy=(bar.get_x() + bar.get_width() / 2, height), xytext=(0, 3), textcoords="offset points", ha='center', va='bottom') axs[i].set_xticks(indices) axs[i].set_xticklabels(model_names, rotation=45) axs[i].set_title(dataset_name) axs[i].legend(loc='best') plt.tight_layout() plt.savefig("bars.png")