code: def evaluate_performace(y_hist, y_true, models):
      cutoffs = y_true["cutoff"].unique()
      eval_ = []
      for cutoff in cutoffs:
          evaluation = {}
          for model in models:
              evaluation[model] = {}
              for metric in [mase, mae, mape, rmse, smape]:
                  metric_name = metric.__name__
                  if metric_name == "mase":
                      evaluation[model][metric_name] = metric(
                          y_true.query("cutoff == @cutoff")["y"].values,
                          y_true.query("cutoff == @cutoff")[
                              model
                          ].values,
                          y_hist.query("ds <= @cutoff")["y"].values,
                          seasonality=24,
                      )
                  else:
                      evaluation[model][metric_name] = metric(
                          y_true.query("cutoff == @cutoff")["y"].values,
                          y_true.query("cutoff == @cutoff")[
                              model
                          ].values,
                      )
          eval_cutoff = pd.DataFrame(evaluation).T
          eval_cutoff.insert(0, "cutoff", cutoff)
          eval_cutoff.index = eval_cutoff.index.rename("model")
          eval_.append(eval_cutoff)
      return pd.concat(eval_)
  
file_path: statsforecast/experiments/mstl/src/main.py
imports: from time import time
  import pandas
  import numpy
  from datasetsforecast.losses import mae, mape, mase, rmse, smape
  from fire import Fire
  from neuralprophet import NeuralProphet
  from prophet import Prophet
  from prophet.diagnostics import cross_validation
  from statsforecast import StatsForecast
  from statsforecast.models import MSTL, AutoARIMA, SeasonalNaive
label_desc: Use image node_id 1 for calling a global function with example usage: evaluate_performace(y_hist, y_true, models) and returns: pd