class_docstr: The Joiner step joins the transformed mini batches together with
  mostly the DACT.minibatches and then DACT.extend method.
  It is used in a minibatch sequential pipeline and streaming / queued pipeline
  as a way to handle batches of previous steps in the pipeline.
  
  .. seealso::
      :class:`~neuraxle.data_container.DataContainer`,
      :func:`~neuraxle.data_container.DataContainer.batch`
class_docstr_tok: ["The","Joiner","step","joins","the","transformed","mini","batches","together","with","mostly","the","DACT.minibatches","and","then","DACT.extend","method",".","It","is","used","in","a","minibatch","sequential","pipeline","and","streaming","\/","queued","pipeline","as","a","way","to","handle","batches","of","previous","steps","in","the","pipeline",".","..","seealso",":",":",":","class",":","`","~neuraxle.data_container.DataContainer","`",",",":","func",":","`","~neuraxle.data_container.DataContainer.batch","`"]
docstr: Concatenate the pipeline fit transform output of each batch of self.batch_size together.
  :param step: pipeline to fit transform on
  :type step: Pipeline
  :param data_container: data container to fit transform on
  :type data_container: DataContainer
  :param context: execution context
  :return: fitted self, transformed data inputs
  :rtype: Tuple[Any, DataContainer]
docstr_tok: ["Concatenate","the","pipeline","fit","transform","output","of","each","batch","of","self.batch_size","together",".",":","param","step",":","pipeline","to","fit","transform","on",":","type","step",":","Pipeline",":","param","data_container",":","data","container","to","fit","transform","on",":","type","data_container",":","DataContainer",":","param","context",":","execution","context",":","return",":","fitted","self",",","transformed","data","inputs",":","rtype",":","Tuple","[","Any",",","DataContainer","]"]
code: def join_fit_transform(
      self, step: Pipeline, data_container: DACT, context: CX
  ) -> Tuple["Any", DACT]:
      """
      Concatenate the pipeline fit transform output of each batch of self.batch_size together.
      :param step: pipeline to fit transform on
      :type step: Pipeline
      :param data_container: data container to fit transform on
      :type data_container: DataContainer
      :param context: execution context
      :return: fitted self, transformed data inputs
      :rtype: Tuple[Any, DataContainer]
      """
      context = context.push(step)
      dact_batches = data_container.minibatches(
          batch_size=self.batch_size,
          keep_incomplete_batch=self.keep_incomplete_batch,
          default_value_data_inputs=self.default_value_data_inputs,
          default_value_expected_outputs=self.default_value_expected_outputs,
      )
  
      out_dact = ListDataContainer.empty()
      for dact_batch in dact_batches:
          step, dact_batch = step._fit_transform_data_container(
              dact_batch, context
          )
          out_dact.extend(dact_batch)
  
      return step, out_dact
  
imports: import warnings
  from abc import ABC, abstractmethod
  from typing import Any, List, Tuple, Union
  from neuraxle.base import BaseStep
  from neuraxle.base import ExecutionContext
  from neuraxle.base import ExecutionMode, ForceHandleMixin, Identity, NamedStepsList, TruncableSteps, _CustomHandlerMethods, _TruncableServiceWithBodyMixin
  from neuraxle.data_container import DataContainer
  from neuraxle.data_container import ListDataContainer, StripAbsentValues, ZipDataContainer
  from neuraxle.logging.warnings import warn_deprecated_arg
label_desc: Use image node_id 3 for calling the Joiner obj's underlying member method code with example usage: obj.join_fit_transform(step, data_container, context) and returns: step,  out_dact