docs: def make_forecasting_frame(x, kind, max_timeshift, rolling_direction):
      """
      Takes a singular time series x and constructs a DataFrame df and target vector y that can be used for a time series
      forecasting task.
  
      The returned df will contain, for every time stamp in x, the last max_timeshift data points as a new
      time series, such can be used to fit a time series forecasting model.
  
      See :ref:`forecasting-label` for a detailed description of the rolling process and how the feature matrix and target
      vector are derived.
  
      The returned time series container df, will contain the rolled time series as a flat data frame, the first format
      from :ref:`data-formats-label`.
  
      When x is a pandas.Series, the index will be used as id.
  
      :param x: the singular time series
      :type x: np.array or pd.Series
      :param kind: the kind of the time series
      :type kind: str
      :param rolling_direction: The sign decides, if to roll backwards (if sign is positive) or forwards in "time"
      :type rolling_direction: int
      :param max_timeshift: If not None, shift only up to max_timeshift. If None, shift as often as possible.
      :type max_timeshift: int
  
      :return: time series container df, target vector y
      :rtype: (pd.DataFrame, pd.Series)
      """
      n = len(x)
  
      if isinstance(x, pd.Series):
          t = x.index
      else:
          t = range(n)
  
      df = pd.DataFrame({"id": ["id"] * n,
                         "time": t,
                         "value": x,
                         "kind": kind})
  
      df_shift = roll_time_series(df,
                                  column_id="id",
                                  column_sort="time",
                                  column_kind="kind",
                                  rolling_direction=rolling_direction,
                                  max_timeshift=max_timeshift)
  
      # drop the rows which should actually be predicted
      def mask_first(x):
          """
          this mask returns an array of 1s where the last entry is a 0
          """
          result = np.ones(len(x))
          result[-1] = 0
          return result
  
      mask = df_shift.groupby(['id'])['id'].transform(mask_first).astype(bool)
      df_shift = df_shift[mask]
  
      return df_shift, df["value"][1:]