docs: def fit_transform(self, data):
          """Fit the model and transform data or load already processed data.
  
          Loads cached or persisted output or adapts data for the current transformer and
          executes ``transformer.fit_transform``.
  
          Args:
              data (dict): data dictionary with keys as input names and values as dictionaries of
                  key-value pairs that can be passed to the ``self.transformer.fit_transform`` method.
                  Example:
  
                  .. code-block:: python
  
                      data = {'input_1': {'X': X,
                                          'y': y},
                              'input_2': {'X': X,
                                          'y': y}
                              }
  
          Returns:
              dict: Step output from the ``self.transformer.fit_transform`` method
          """
          if data:
              assert isinstance(data, dict), 'Step {}, "data" argument in the "fit_transform()" method must be dict, ' \
                                             'got {} instead.'.format(self.name, type(data))
          logger.info('Step {}, working in "{}" mode'.format(self.name, self._mode))
  
          if self._mode == 'inference':
              ValueError('Step {}, you are in "{}" mode, where you cannot run "fit".'
                         'Please change mode to "train" to enable fitting.'
                         'Use: "step.set_mode_train()" then "step.fit_transform()"'.format(self.name, self._mode))
  
          if self.output_is_cached and not self.force_fitting:
              logger.info('Step {} using cached output'.format(self.name))
              step_output_data = self.output
          elif self.output_is_persisted and self.load_persisted_output and not self.force_fitting:
              logger.info('Step {} loading persisted output from {}'.format(self.name,
                                                                            self.experiment_directory_output_step))
              step_output_data = self._load_output(self.experiment_directory_output_step)
          else:
              step_inputs = {}
              if self.input_data is not None:
                  for input_data_part in self.input_data:
                      step_inputs[input_data_part] = data[input_data_part]
  
              for input_step in self.input_steps:
                  step_inputs[input_step.name] = input_step.fit_transform(data)
  
              if self.adapter:
                  step_inputs = self._adapt(step_inputs)
              else:
                  step_inputs = self._unpack(step_inputs)
              step_output_data = self._fit_transform_operation(step_inputs)
          logger.info('Step {}, fit and transform completed'.format(self.name))
          return step_output_data