class_docstr: Transform features in parallel as the union of many pipeline steps.
  
  This step is also available with true parallel processing threads or
  processes in the streaming package of Neuraxle.
  
  
  .. code-block:: python
  
      p = Pipeline([
          FeatureUnion([
              Mean(),
              Std(),
          ], joiner=NumpyConcatenateInnerFeatures())
      ])
  
      data_inputs = np.random.randint((1, 20))
  
  .. seealso::
      :class:`ModelStacking`,
      :class:`AddFeatures`,
      :class:`~neuraxle.base.ForceHandleOnlyMixin`,
      :class:`~neuraxle.base.TruncableSteps`,
      :class:`~neuraxle.base.BaseStep`
class_docstr_tok: ["Transform","features","in","parallel","as","the","union","of","many","pipeline","steps",".","This","step","is","also","available","with","true","parallel","processing","threads","or","processes","in","the","streaming","package","of","Neuraxle",".","..","code-block",":",":","python","p","=","Pipeline","(","[","FeatureUnion","(","[","Mean","(",")",",","Std","(",")",",","]",",","joiner=NumpyConcatenateInnerFeatures","(",")",")","]",")","data_inputs","=","np.random.randint","(","(","1",",","20",")",")","..","seealso",":",":",":","class",":","`","ModelStacking","`",",",":","class",":","`","AddFeatures","`",",",":","class",":","`","~neuraxle.base.ForceHandleOnlyMixin","`",",",":","class",":","`","~neuraxle.base.TruncableSteps","`",",",":","class",":","`","~neuraxle.base.BaseStep","`"]
docstr: Fit the parallel steps on the data. It will make use of some parallel processing.
  :param data_container: The input data to fit onto
  :param context: execution context
  :return: self
docstr_tok: ["Fit","the","parallel","steps","on","the","data",".","It","will","make","use","of","some","parallel","processing",".",":","param","data_container",":","The","input","data","to","fit","onto",":","param","context",":","execution","context",":","return",":","self"]
code: def _fit_data_container(self, data_container, context):
      """
      Fit the parallel steps on the data. It will make use of some parallel processing.
      :param data_container: The input data to fit onto
      :param context: execution context
      :return: self
      """
      # Actually fit:
      if self.n_jobs != 1:
          fitted_body = Parallel(
              backend=self.backend, n_jobs=self.n_jobs
          )(
              delayed(step.handle_fit)(data_container.copy(), context)
              for step in self.body
          )
      else:
          fitted_body = [
              step.handle_fit(data_container.copy(), context)
              for step in self.body
          ]
  
      self._save_fitted_body(fitted_body)
  
      return self
  
imports: from typing import Tuple
  from joblib import Parallel, delayed
  from neuraxle.base import CX, DACT, BaseStep, BaseTransformer, ForceHandleOnlyMixin, Identity, NamedStepsList, NonFittableMixin, TruncableSteps, _TruncableServiceWithBodyMixin
  from neuraxle.data_container import ZipDataContainer
  from neuraxle.steps.numpy import NumpyConcatenateInnerFeatures
label_desc: Use image node_id 2 for calling the FeatureUnion obj's underlying member method code with example usage: obj._fit_data_container(data_container, context) and returns: self