code: def test_single_model(self):
      print("-" * 80)
      logger.info("test_single_model\n" + "-" * 80 + "\n")
  
      # Create a piecewise linear time series
      values = [i for i in range(60)]
      values += [values[-1] + 2 * (i + 1) for i in range(30)]
      values += [values[-1] + 3 * (i + 1) for i in range(30)]
      values += [values[-1] + 1 * (i + 1) for i in range(30)]
      ts = UnivariateTimeSeries(
          time_stamps=None, values=values, freq="1d"
      ).to_ts()
  
      # Get train & test split
      self.train_data = ts[:30]
      self.test_data = ts[30:]
  
      # Set up a simple ARIMA model that can learn a linear relationship
      # We will be training the model on 30 day chunks (which are linear) and
      # having it forecast on 30 days chunks (which may have a different
      # slope than the model expects)
      self.model = Arima(
          ArimaConfig(order=(1, 1, 0), max_forecast_steps=30)
      )
  
      logger.info("Training model using an evaluator...")
      evaluator = ForecastEvaluator(
          model=self.model,
          config=ForecastEvaluatorConfig(
              retrain_freq="30d", train_window="30d"
          ),
      )
  
      # Get pred
      _, pred = evaluator.get_predict(
          train_vals=self.train_data, test_vals=self.test_data
      )
  
      # Calculate evaluation metric
      smape = evaluator.evaluate(
          ground_truth=self.test_data,
          predict=pred,
          metric=ForecastMetric.sMAPE,
      )
      self.assertAlmostEqual(smape, 9.9, delta=0.1)
  
file_path: merlion/tests/evaluate/test_eval_forecast.py
imports: import logging
  from os.path import abspath, dirname, join
  import sys
  import unittest
  from merlion.evaluate.forecast import ForecastEvaluator, ForecastEvaluatorConfig, ForecastMetric
  from merlion.models.ensemble.combine import MetricWeightedMean
  from merlion.models.ensemble.forecast import ForecasterEnsemble, ForecasterEnsembleConfig
  from merlion.models.forecast.arima import ArimaConfig, Arima
  from merlion.models.forecast.ets import ETSConfig, ETS
  from merlion.transform.base import Identity
  from merlion.utils.data_io import csv_to_time_series
  from merlion.utils.time_series import UnivariateTimeSeries
label_desc: Use image node_id 2 for calling the TestEvaluateForecast obj's underlying member method code with example usage: obj.test_single_model() without return types