<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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