code: def evaluate(model: str, dataset: str, group: str):
      y_test, horizon, freq, seasonality = get_data(
          "data/", dataset, group, False
      )
      if model != "ces-r":
          try:
              forecast = pd.read_csv(
                  f"data/{model}-forecasts-{dataset}-{group}.csv"
              )
          except:
              return None
          col = model
          y_hat = forecast[col].values.reshape(-1, horizon)
      else:
          try:
              y_hat = np.loadtxt(
                  f"data/{model}-forecasts-M4-{group}.txt"
              )
          except:
              return None
  
      y_test = y_test["y"].values.reshape(-1, horizon)
      assert np.isnan(y_hat).sum() == 0, f"{model},{dataset},{group}"
  
      evals = M4Evaluation.evaluate("data", group, y_hat)
      evals = evals.rename_axis("dataset").reset_index()
      times = pd.read_csv(f"data/{model}-time-{dataset}-{group}.csv")
      evals = pd.concat([evals, times], axis=1)
      evals["model"] = model
  
      return evals
  
imports: from itertools import product
  import numpy
  import pandas
  from neuralforecast.data.datasets.m4 import M4Evaluation
  from neuralforecast.losses.numpy import rmse, mape, smape
  from src.data import get_data
label_desc: Use image node_id 1 for calling a global function with example usage: evaluate(model, dataset, group) and returns: evals, None, None