class_docstr: Takes care of preprocessing for static_features and past/known covariates.
  
  Covariates are all converted to float dtype. Static features, if present, are all converted to categorical & float
  dtypes.
class_docstr_tok: ["Takes","care","of","preprocessing","for","static_features","and","past\/known","covariates",".","Covariates","are","all","converted","to","float","dtype",".","Static","features",",","if","present",",","are","all","converted","to","categorical","&","float","dtypes","."]
code: def fit(self, data: TimeSeriesDataFrame) -> None:
      assert (
          not self._is_fit
      ), f"{self.__class__.__name__} has already been fit"
  
      self.past_covariates_names = []
      for column in data.columns:
          if (
              column != self.target
              and column not in self.known_covariates_names
          ):
              self.past_covariates_names.append(column)
  
      logger.info("\nProvided dataset contains following columns:")
      logger.info(f"\ttarget:           '{self.target}'")
      if len(self.known_covariates_names) > 0:
          logger.info(
              f"\tknown covariates: {self.known_covariates_names}"
          )
      if len(self.past_covariates_names) > 0:
          logger.info(
              f"\tpast covariates:  {self.past_covariates_names}"
          )
  
      static_features_cat = []
      static_features_real = []
      if data.static_features is not None:
          static = self.static_feature_pipeline.fit_transform(
              data.static_features
          )
          static = self._convert_numerical_features_to_float(static)
  
          unused = []
          for col_name in data.static_features.columns:
              if (
                  col_name in static.columns
                  and static[col_name].dtype == "category"
              ):
                  static_features_cat.append(col_name)
              elif (
                  col_name in static.columns
                  and static[col_name].dtype == np.float64
              ):
                  static_features_real.append(col_name)
              else:
                  unused.append(col_name)
  
          logger.info(
              "Following types of static features have been inferred:"
          )
          logger.info(f"\tcategorical:        {static_features_cat}")
          logger.info(f"\tcontinuous (float): {static_features_real}")
          if len(unused) > 0:
              logger.info(
                  f"\tremoved (uninformative columns): {unused}"
              )
          logger.info(
              "To learn how to fix incorrectly inferred types, please see documentation for TimeSeriesPredictor.fit "
          )
  
      self.covariate_metadata = CovariateMetadata(
          static_features_cat=static_features_cat,
          static_features_real=static_features_real,
          known_covariates_real=self.known_covariates_names,
          past_covariates_real=self.past_covariates_names,
          # TODO: Categorical time-varying covariates are not yet supported
          known_covariates_cat=[],
          past_covariates_cat=[],
      )
      self._is_fit = True
  
imports: import logging
  import reprlib
  from dataclasses import dataclass, field
  from typing import List, Optional
  import numpy
  import pandas
  from autogluon.common.features.types import R_FLOAT, R_INT
  from autogluon.features.generators import AsTypeFeatureGenerator, CategoryFeatureGenerator, IdentityFeatureGenerator, PipelineFeatureGenerator
  from autogluon.timeseries import TimeSeriesDataFrame
label_desc: Use image node_id 4 for calling the TimeSeriesFeatureGenerator obj's underlying member method code with example usage: obj.fit(data) without return types