class_docstr: Preprocess one multimodal pd.DataFrame including image paths, image bytearrays, texts, numerical features,
  and categorical features. Each modality may have multiple columns.
  The preprocessor is designed to output model-agnostic features.
class_docstr_tok: ["Preprocess","one","multimodal","pd.DataFrame","including","image","paths",",","image","bytearrays",",","texts",",","numerical","features",",","and","categorical","features",".","Each","modality","may","have","multiple","columns",".","The","preprocessor","is","designed","to","output","model-agnostic","features","."]
docstr: Preprocess categorical data by using CategoryFeatureGenerator to generate
  categorical encodings, i.e., integers. This function needs to be called
  preceding the categorical processor in "process_categorical.py".
  
  Parameters
  ----------
  df
      The multimodal pd.DataFrame.
  
  Returns
  -------
  categorical_features
      All the categorical encodings (a dictionary of np.ndarray).
  None
      The column types of categorical data, which is None currently since only one categorical type exists.
code: def transform_categorical(
      self,
      df: pd.DataFrame,
  ) -> Tuple[Dict[str, NDArray], None]:
      """
      Preprocess categorical data by using CategoryFeatureGenerator to generate
      categorical encodings, i.e., integers. This function needs to be called
      preceding the categorical processor in "process_categorical.py".
  
      Parameters
      ----------
      df
          The multimodal pd.DataFrame.
  
      Returns
      -------
      categorical_features
          All the categorical encodings (a dictionary of np.ndarray).
      None
          The column types of categorical data, which is None currently since only one categorical type exists.
      """
      assert (
          self._fit_called or self._fit_x_called
      ), "You will need to first call preprocessor.fit before calling preprocessor.transform_categorical."
      categorical_features = {}
      for col_name, num_category in zip(
          self._categorical_feature_names,
          self._categorical_num_categories,
      ):
          col_value = df[col_name]
          processed_data = col_value.astype("category")
          generator = self._feature_generators[col_name]
          processed_data = generator.transform(
              pd.DataFrame({col_name: processed_data})
          )[col_name].cat.codes.to_numpy(np.int32, copy=True)
          processed_data[processed_data < 0] = num_category - 1
          categorical_features[col_name] = processed_data
  
      return categorical_features, None
  
imports: import logging
  from typing import Any, Dict, List, Optional, Tuple, Union
  import numpy
  import pandas
  from nptyping import NDArray
  from omegaconf import DictConfig, OmegaConf
  from sklearn.base import BaseEstimator, TransformerMixin
  from sklearn.impute import SimpleImputer
  from sklearn.pipeline import Pipeline
  from sklearn.preprocessing import MinMaxScaler, StandardScaler
  from autogluon.features import CategoryFeatureGenerator
  from ..constants import AUTOMM, CATEGORICAL, DOCUMENT, DOCUMENT_IMAGE, IDENTIFIER, IMAGE, IMAGE_BYTEARRAY, IMAGE_PATH, LABEL, NER, NER_ANNOTATION, NULL, NUMERICAL, OVD, ROIS, SEMANTIC_SEGMENTATION, SEMANTIC_SEGMENTATION_GT, SEMANTIC_SEGMENTATION_IMG, TEXT, TEXT_NER
  from .label_encoder import CustomLabelEncoder
label_desc: Use image node_id 35 for calling the MultiModalFeaturePreprocessor obj's underlying member method code with example usage: obj.transform_categorical(df) and returns: categorical_features,  None