code: def pipeline(
      series,
      X_df,
      n_series,
      horizon,
      id_col="unique_id",
      time_col="ds",
      target_col="y",
  ):
      models = [
          ADIDA(),
          AutoARIMA(season_length=7),
          ARIMA(season_length=7, order=(0, 1, 2)),
          CrostonClassic(),
          CrostonOptimized(),
          CrostonSBA(),
          AutoETS(season_length=7),
          HistoricAverage(),
          IMAPA(),
          Naive(),
          RandomWalkWithDrift(),
          SeasonalExponentialSmoothing(season_length=7, alpha=0.1),
          SeasonalNaive(season_length=7),
          SeasonalWindowAverage(season_length=7, window_size=4),
          SimpleExponentialSmoothing(alpha=0.1),
          TSB(alpha_d=0.1, alpha_p=0.3),
          WindowAverage(window_size=4),
      ]
      sf = StatsForecast(
          models=models,
          freq="D",
      )
      forecast = fa.as_pandas(
          sf.forecast(
              df=series,
              h=horizon,
              X_df=X_df,
              id_col=id_col,
              time_col=time_col,
              target_col=target_col,
          )
      )
      print(forecast)
      assert forecast.shape == (n_series * horizon, len(models) + 2)
  
      n_windows = 2
      cv = fa.as_pandas(
          sf.cross_validation(
              df=series,
              n_windows=n_windows,
              h=horizon,
              id_col=id_col,
              time_col=time_col,
              target_col=target_col,
          )
      )
      assert cv.shape[0] == n_series * n_windows * horizon
      assert cv.columns.tolist() == [
          id_col,
          time_col,
          "cutoff",
          target_col,
      ] + [m.alias for m in models]
  
imports: import fugue.api
  import pandas
  from statsforecast.core import StatsForecast
  from statsforecast.models import ADIDA, AutoARIMA, ARIMA, CrostonClassic, CrostonOptimized, CrostonSBA, AutoETS, HistoricAverage, IMAPA, Naive, RandomWalkWithDrift, SeasonalExponentialSmoothing, SeasonalNaive, SeasonalWindowAverage, SimpleExponentialSmoothing, TSB, WindowAverage
label_desc: Use image node_id 1 for calling a global function with example usage: pipeline(series, X_df, n_series, horizon, id_col, time_col, target_col) without return types