docstr: Characterize the relationships between the dataset names `params`
  
  Parameters
  ----------
  params: Tuple[str]
      Dataset names requested by a feature engineering step callable. Must be a subset of
      {"train_data", "train_inputs", "train_targets", "validation_data", "validation_inputs",
      "validation_targets", "holdout_data", "holdout_inputs", "holdout_targets",
      "test_inputs", "all_data", "all_inputs", "all_targets", "non_train_data",
      "non_train_inputs", "non_train_targets"}
  stage: String in {"pre_cv", "intra_cv"}
      Feature engineering stage during which the datasets `params` are requested
  
  Attributes
  ----------
  merged_datasets: List[tuple]
      Tuples of strings denoting paths to datasets that represent a merge between multiple
      datasets. Merged datasets are those prefixed with either "all" or "non_train". These
      paths are locations in `descendants`
  coupled_datasets: List[tuple]
      Tuples of strings denoting paths to datasets that represent a coupling of "inputs" and
      "targets" datasets. Coupled datasets are those suffixed with "data". These paths are
      locations in `descendants`, and the values at each path should be a dict containing keys
      with "inputs" and "targets" suffixes
  leaves: Dict[tuple, str]
      Mapping of full path tuples in `descendants` to their leaf values. Tuple paths represent
      the steps necessary to reach the standard dataset leaf value in `descendants` by
      traversing merged and coupled datasets. Values in `leaves` should be identical to the
      last element of the corresponding tuple key
  descendants: DescendantsType
      Nested dict in which all keys are dataset name strings, and all leaf values are `None`.
      Represents the structure of the requested dataset names, traversing over merged and
      coupled datasets (if necessary) in order to reach the standard dataset leaves
code: def __init__(self, params: Tuple[str], stage: str):
      """Characterize the relationships between the dataset names `params`
  
      Parameters
      ----------
      params: Tuple[str]
          Dataset names requested by a feature engineering step callable. Must be a subset of
          {"train_data", "train_inputs", "train_targets", "validation_data", "validation_inputs",
          "validation_targets", "holdout_data", "holdout_inputs", "holdout_targets",
          "test_inputs", "all_data", "all_inputs", "all_targets", "non_train_data",
          "non_train_inputs", "non_train_targets"}
      stage: String in {"pre_cv", "intra_cv"}
          Feature engineering stage during which the datasets `params` are requested
  
      Attributes
      ----------
      merged_datasets: List[tuple]
          Tuples of strings denoting paths to datasets that represent a merge between multiple
          datasets. Merged datasets are those prefixed with either "all" or "non_train". These
          paths are locations in `descendants`
      coupled_datasets: List[tuple]
          Tuples of strings denoting paths to datasets that represent a coupling of "inputs" and
          "targets" datasets. Coupled datasets are those suffixed with "data". These paths are
          locations in `descendants`, and the values at each path should be a dict containing keys
          with "inputs" and "targets" suffixes
      leaves: Dict[tuple, str]
          Mapping of full path tuples in `descendants` to their leaf values. Tuple paths represent
          the steps necessary to reach the standard dataset leaf value in `descendants` by
          traversing merged and coupled datasets. Values in `leaves` should be identical to the
          last element of the corresponding tuple key
      descendants: DescendantsType
          Nested dict in which all keys are dataset name strings, and all leaf values are `None`.
          Represents the structure of the requested dataset names, traversing over merged and
          coupled datasets (if necessary) in order to reach the standard dataset leaves
      """
      self.params: Tuple[str] = params
      self.stage: str = stage
  
      self.merged_datasets: List[tuple] = []
      self.coupled_datasets: List[tuple] = []
      self.leaves: Dict[tuple, str] = dict()
      self.descendants: DescendantsType = remap(
          {_: _ for _ in self.params},
          visit=self._visit,
          enter=self._enter,
          use_registry=False,
      )
  
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 1 to create a new DatasetNameReport object  with example: obj = DatasetNameReport(params, stage)