code: def _ts_add_future_target(df, target, horizon, data_dtype, mode):
      """
      Adds as many columns to the input dataframe as the forecasting horizon asks for (as determined by `TimeseriesSettings.horizon`).
  
      :param df: Input dataframe.
      :param target: target column name.
      :param horizon: value of `TimeseriesSettings.horizon` parameter.
      :param data_dtype: dictionary with types of all input columns
      :param mode: either "train" or "predict". `Train` will drop rows with incomplet target info. `Predict` has no effect, for now.
  
      :return: Dataframe with new `{target}_timestep_{i}'` columns that contains target labels at timestep `i` of a total `TimeseriesSettings.horizon`.
      """  # noqa
      if target not in df:
          return df
      if data_dtype in (
          dtype.integer,
          dtype.float,
          dtype.num_array,
          dtype.num_tsarray,
      ):
          df[target] = df[target].astype(float)
  
      for timestep_index in range(1, horizon):
          next_target_value_arr = list(df[target])
          for del_index in range(
              0, min(timestep_index, len(next_target_value_arr))
          ):
              del next_target_value_arr[0]
              next_target_value_arr.append(None)
          col_name = f"{target}_timestep_{timestep_index}"
          df[col_name] = next_target_value_arr
          df[col_name] = df[col_name].fillna(value=np.nan)
  
      return df
  
file_path: lightwood/lightwood/data/timeseries_transform.py
imports: from typing import Dict, Optional
  from functools import partial
  import multiprocessing
  import numpy
  import pandas
  from lightwood.helpers.parallelism import get_nr_procs
  from type_infer.dtype import dtype
  from lightwood.api.types import TimeseriesSettings, PredictionArguments
  from lightwood.helpers.log import log
label_desc: Use image node_id 6 for calling a global function with example usage: _ts_add_future_target(df, target, horizon, data_dtype, mode) and returns: df, df