docstr: Add an engineering step to :attr:`steps` to be executed with the other contents of
  :attr:`steps` on :meth:`FeatureEngineer.__call__`
  
  Parameters
  ----------
  step: Callable, or `EngineerStep`, or `Categorical`
      If `EngineerStep` instance, will be added directly to :attr:`steps`. Otherwise, must be
      a feature engineering step callable that requests, modifies, and returns datasets, which
      will be used to instantiate a :class:`EngineerStep` to add to :attr:`steps`. If
      `Categorical`, `categories` should contain `EngineerStep` instances or callables
  stage: String in {"pre_cv", "intra_cv"}, or None, default=None
      Feature engineering stage during which the callable `step` will be executed
  name: String, or None, default=None
      Identifier for the transformation applied by this engineering step. If None and `step`
      is not an `EngineerStep`, will be inferred during :class:`EngineerStep` instantiation
  before: String, default=EMPTY_SENTINEL
      ... Experimental...
  after: String, default=EMPTY_SENTINEL
      ... Experimental...
  number: String, default=EMPTY_SENTINEL
      ... Experimental...
code: def add_step(
      self,
      step: Union[Callable, EngineerStep, Categorical],
      stage: str = None,
      name: str = None,
      before: str = EMPTY_SENTINEL,
      after: str = EMPTY_SENTINEL,
      number: int = EMPTY_SENTINEL,
  ):
      """Add an engineering step to :attr:`steps` to be executed with the other contents of
      :attr:`steps` on :meth:`FeatureEngineer.__call__`
  
      Parameters
      ----------
      step: Callable, or `EngineerStep`, or `Categorical`
          If `EngineerStep` instance, will be added directly to :attr:`steps`. Otherwise, must be
          a feature engineering step callable that requests, modifies, and returns datasets, which
          will be used to instantiate a :class:`EngineerStep` to add to :attr:`steps`. If
          `Categorical`, `categories` should contain `EngineerStep` instances or callables
      stage: String in {"pre_cv", "intra_cv"}, or None, default=None
          Feature engineering stage during which the callable `step` will be executed
      name: String, or None, default=None
          Identifier for the transformation applied by this engineering step. If None and `step`
          is not an `EngineerStep`, will be inferred during :class:`EngineerStep` instantiation
      before: String, default=EMPTY_SENTINEL
          ... Experimental...
      after: String, default=EMPTY_SENTINEL
          ... Experimental...
      number: String, default=EMPTY_SENTINEL
          ... Experimental..."""
      if isinstance(step, Categorical):
          cat_params = step.get_params()
          cat_params["categories"] = [
              self._to_step(_) for _ in cat_params["categories"]
          ]
          self._steps.append(Categorical(**cat_params))
      else:
          self._steps.append(
              self._to_step(step, stage=stage, name=name)
          )
  
imports: from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.space.dimensions import Categorical, RejectedOptional
  from hyperparameter_hunter.utils.boltons_utils import remap, default_visit, default_enter
  from hyperparameter_hunter.utils.general_utils import subdict
  import ast
  from contextlib import suppress
  from inspect import getsource
  import numpy
  import pandas
  from typing import List, Callable, Dict, Union, Tuple
label_desc: Use image node_id 8 for calling the FeatureEngineer obj's underlying member method code with example usage: obj.add_step(step, stage, name, before, after, number) without return types