class_docstr: Implements an ML preprocessing operation.
  
  Preprocessors are stateful objects that can be fitted against a Dataset and used
  to transform both local data batches and distributed data. For example, a
  Normalization preprocessor may calculate the mean and stdev of a field during
  fitting, and uses these attributes to implement its normalization transform.
  
  Preprocessors can also be stateless and transform data without needed to be fitted.
  For example, a preprocessor may simply remove a column, which does not require
  any state to be fitted.
  
  If you are implementing your own Preprocessor sub-class, you should override the
  following:
  
  * ``_fit`` if your preprocessor is stateful. Otherwise, set
    ``_is_fittable=False``.
  * ``_transform_pandas`` and/or ``_transform_numpy`` for best performance,
    implement both. Otherwise, the data will be converted to the match the
    implemented method.
docstr: Determine which batch format to use based on Preprocessor implementation.
  
  * If only `_transform_pandas` is implemented, then use ``pandas`` batch format.
  * If only `_transform_numpy` is implemented, then use ``numpy`` batch format.
  * If both are implemented, then use the Preprocessor defined preferred batch
  format.
docstr_tok: ["Determine","which","batch","format","to","use","based","on","Preprocessor","implementation",".","*","If","only","`","_transform_pandas","`","is","implemented",",","then","use","``","pandas","``","batch","format",".","*","If","only","`","_transform_numpy","`","is","implemented",",","then","use","``","numpy","``","batch","format",".","*","If","both","are","implemented",",","then","use","the","Preprocessor","defined","preferred","batch","format","."]
code: def _determine_transform_to_use(self) -> BatchFormat:
      """Determine which batch format to use based on Preprocessor implementation.
  
      * If only `_transform_pandas` is implemented, then use ``pandas`` batch format.
      * If only `_transform_numpy` is implemented, then use ``numpy`` batch format.
      * If both are implemented, then use the Preprocessor defined preferred batch
      format.
      """
  
      has_transform_pandas = (
          self.__class__._transform_pandas
          != Preprocessor._transform_pandas
      )
      has_transform_numpy = (
          self.__class__._transform_numpy
          != Preprocessor._transform_numpy
      )
  
      if has_transform_numpy and has_transform_pandas:
          return self.preferred_batch_format()
      elif has_transform_numpy:
          return BatchFormat.NUMPY
      elif has_transform_pandas:
          return BatchFormat.PANDAS
      else:
          raise NotImplementedError(
              "None of `_transform_numpy` or `_transform_pandas` are implemented. "
              "At least one of these transform functions must be implemented "
              "for Preprocessor transforms."
          )
  
imports: import abc
  import base64
  import collections
  import pickle
  import warnings
  from enum import Enum
  from typing import TYPE_CHECKING, Any, Dict, Optional, Union
  from ray.air.util.data_batch_conversion import BatchFormat
  from ray.util.annotations import Deprecated, DeveloperAPI, PublicAPI
label_desc: Use image node_id 9 for calling the Preprocessor obj's underlying member method code with example usage: obj._determine_transform_to_use() and returns: self, BatchFormat, BatchFormat