docstr: This is the forecast function which can be used to forecast.
  It accepts extra regressors (``extra_pred_cols``) originally in
  ``df`` via ``new_external_regressor_df``.
  
  Parameters
  ----------
  fut_time_num : `int`
      number of needed future values
  trained_model : `dict`
      A fitted silverkite model which is the output of ``self.forecast``
  freq : `str`
      Frequency of future predictions.
      Accepts any valid frequency for ``pd.date_range``.
  new_external_regressor_df : `pandas.DataFrame` or None
      Contains the extra regressors if specified.
  time_features_ready : `bool`
      Boolean to denote if time features are already given in df or not.
  regressors_ready : `bool`
      Boolean to denote if regressors are already added to data (``fut_df``).
  
  Returns
  -------
  result: `dict`
      A dictionary with following items
  
      - "fut_df": `pandas.DataFrame`
          The same as input dataframe with an added column for the response.
          If value_col already appears in ``fut_df``, it will be over-written.
          If ``uncertainty_dict`` is provided as input,
          it will also contain a ``QUANTILE_SUMMARY_COL`` column.
      - "x_mat": `pandas.DataFrame`
          Design matrix of the predictive machine-learning model
code: def predict_n_no_sim(
      self,
      fut_time_num,
      trained_model,
      freq,
      new_external_regressor_df=None,
      time_features_ready=False,
      regressors_ready=False,
  ):
      """This is the forecast function which can be used to forecast.
      It accepts extra regressors (``extra_pred_cols``) originally in
      ``df`` via ``new_external_regressor_df``.
  
      Parameters
      ----------
      fut_time_num : `int`
          number of needed future values
      trained_model : `dict`
          A fitted silverkite model which is the output of ``self.forecast``
      freq : `str`
          Frequency of future predictions.
          Accepts any valid frequency for ``pd.date_range``.
      new_external_regressor_df : `pandas.DataFrame` or None
          Contains the extra regressors if specified.
      time_features_ready : `bool`
          Boolean to denote if time features are already given in df or not.
      regressors_ready : `bool`
          Boolean to denote if regressors are already added to data (``fut_df``).
  
      Returns
      -------
      result: `dict`
          A dictionary with following items
  
          - "fut_df": `pandas.DataFrame`
              The same as input dataframe with an added column for the response.
              If value_col already appears in ``fut_df``, it will be over-written.
              If ``uncertainty_dict`` is provided as input,
              it will also contain a ``QUANTILE_SUMMARY_COL`` column.
          - "x_mat": `pandas.DataFrame`
              Design matrix of the predictive machine-learning model
  
      """
      # creates the future time grid
      dates = pd.date_range(
          start=trained_model["last_date_for_fit"],
          periods=fut_time_num + 1,
          freq=freq,
      )
      dates = dates[
          dates > trained_model["last_date_for_fit"]
      ]  # drops values up to last_date_for_fit
      fut_df = pd.DataFrame({trained_model["time_col"]: dates.tolist()})
  
      return self.predict_no_sim(
          fut_df=fut_df,
          trained_model=trained_model,
          past_df=trained_model[
              "df"
          ].copy(),  # observed data used for training the model
          new_external_regressor_df=new_external_regressor_df,
          time_features_ready=time_features_ready,
          regressors_ready=regressors_ready,
      )
  
imports: import re
  import warnings
  from typing import Type
  import numpy
  import pandas
  from pandas.plotting import register_matplotlib_converters
  from pandas.tseries.frequencies import to_offset
  from greykite.algo.changepoint.adalasso.changepoint_detector import get_changepoints_dict
  from greykite.algo.changepoint.adalasso.changepoint_detector import get_seasonality_changepoints
  from greykite.algo.changepoint.adalasso.changepoints_utils import build_seasonality_feature_df_from_detection_result
  from greykite.algo.changepoint.adalasso.changepoints_utils import get_seasonality_changepoint_df_cols
  from greykite.algo.common.ml_models import fit_ml_model_with_evaluation
  from greykite.algo.common.ml_models import predict_ml
  from greykite.algo.common.ml_models import predict_ml_with_uncertainty
  from greykite.algo.forecast.silverkite.constants.silverkite_constant import default_silverkite_constant
  from greykite.algo.forecast.silverkite.constants.silverkite_seasonality import SilverkiteSeasonalityEnum
  from greykite.algo.forecast.silverkite.constants.silverkite_seasonality import SilverkiteSeasonalityEnumMixin
  from greykite.algo.forecast.silverkite.forecast_silverkite_helper import get_fourier_feature_col_names
  from greykite.algo.forecast.silverkite.forecast_silverkite_helper import get_similar_lag
  from greykite.common.constants import CHANGEPOINT_COL_PREFIX
  from greykite.common.constants import ERR_STD_COL
  from greykite.common.constants import QUANTILE_SUMMARY_COL
  from greykite.common.constants import SEASONALITY_REGEX
  from greykite.common.constants import TimeFeaturesEnum
  from greykite.common.enums import TimeEnum
  from greykite.common.features.timeseries_features import add_daily_events
  from greykite.common.features.timeseries_features import add_time_features_df
  from greykite.common.features.timeseries_features import fourier_series_multi_fcn
  from greykite.common.features.timeseries_features import get_changepoint_dates_from_changepoints_dict
  from greykite.common.features.timeseries_features import get_changepoint_features
  from greykite.common.features.timeseries_features import get_changepoint_features_and_values_from_config
  from greykite.common.features.timeseries_features import get_default_origin_for_time_vars
  from greykite.common.features.timeseries_lags import build_autoreg_df
  from greykite.common.features.timeseries_lags import build_autoreg_df_multi
  from greykite.common.logging import LoggingLevelEnum
  from greykite.common.logging import log_message
  from greykite.common.python_utils import get_pattern_cols
  from greykite.common.python_utils import unique_elements_in_list
  from greykite.common.time_properties import describe_timeseries
  from greykite.common.time_properties import fill_missing_dates
  from greykite.common.time_properties import min_gap_in_seconds
  from greykite.common.time_properties_forecast import get_default_horizon_from_period
label_desc: Use image node_id 4 for calling the SilverkiteForecast obj's underlying member method code with example usage: obj.predict_n_no_sim(fut_time_num, trained_model, freq, new_external_regressor_df, time_features_ready, regressors_ready) and returns: self