code: def make_future_df(
      df_columns,
      last_date,
      periods,
      freq,
      config_events: Optional[ConfigEvents] = None,
      events_df=None,
      config_regressors=None,
      regressors_df=None,
  ):
      """Extends df periods number steps into future.
  
      Parameters
      ----------
          df_columns : pd.DataFrame
              Dataframe columns
          last_date : pd.Datetime
              last history date
          periods : int
              number of future steps to predict
          freq : str
              Data step sizes. Frequency of data recording, any valid frequency
              for pd.date_range, such as ``D`` or ``M``
          config_events : configure.ConfigEvents
              User specified events configs
          events_df : pd.DataFrame
              containing column ``ds`` and ``event``
          config_regressors : configure.ConfigFutureRegressors
              configuration for user specified regressors,
          regressors_df : pd.DataFrame
              containing column ``ds`` and one column for each of the external regressors
  
      Returns
      -------
          pd.DataFrame
              input df with ``ds`` extended into future, and ``y`` set to None
      """
      future_dates = pd.date_range(
          start=last_date, periods=periods + 1, freq=freq
      )  # An extra in case we include start
      future_dates = future_dates[
          future_dates > last_date
      ]  # Drop start if equals last_date
      future_dates = future_dates[
          :periods
      ]  # Return correct number of periods
      future_df = pd.DataFrame({"ds": future_dates})
      # set the events features
      if config_events is not None:
          future_df = convert_events_to_features(
              future_df,
              config_events=config_events,
              events_df=events_df,
          )
      # set the regressors features
      if config_regressors is not None and regressors_df is not None:
          for regressor in regressors_df:
              # Todo: iterate over config_regressors instead
              future_df[regressor] = regressors_df[regressor]
      for column in df_columns:
          if column not in future_df.columns:
              if column != "t" and column != "y_scaled":
                  future_df[column] = None
      future_df.reset_index(drop=True, inplace=True)
      return future_df
  
imports: from __future__ import annotations
  import logging
  import math
  from collections import OrderedDict
  from dataclasses import dataclass
  from typing import TYPE_CHECKING, List, Optional, Tuple
  import numpy
  import pandas
label_desc: Use image node_id 20 for calling a global function with example usage: make_future_df(df_columns, last_date, periods, freq, config_events, events_df, config_regressors, regressors_df) and returns: future_df