class_docstr: DataContainer (dact) class to store IDs (ids), data inputs (di), and expected outputs (eo) together.
  In some dacts, you could have only ids and data inputs, and in other dacts you could have only expected outputs,
  or you could have all if you want, such as when your :class:`~neuraxle.pipeline.Pipeline` is used to train a model
  in a certain :class:`~neuraxle.base.ExecutionMode` within a certain :class:`~neuraxle.base.ExecutionContext`.
  
  You can use typing for your dact, and create a dact, such as:
  
  .. code-block:: python
  
      from typing import List
      from neuraxle.data_container import DataContainer as DACT
  
      dact: DACT[List[str], List[int], List[float]] = DACT(
          ids=['a', 'b', 'c'],
          data_inputs=[1, 2, 3],
          expected_outputs=[1.0, 2.0, 3.0]
      )
  
  
  This is because the DataContainer inherits from the :class:`~typing.Generic` type
  as ``class DataContainer(Generic[IDT, DIT, EOT]): ...``.
  
  The DataContainer object is passed to all of the :class:`~neuraxle.base.BaseStep` 's handle methods :
      * :func:`~neuraxle.base.BaseStep.handle_transform`
      * :func:`~neuraxle.base.BaseStep.handle_fit_transform`
      * :func:`~neuraxle.base.BaseStep.handle_fit`
  
  Most of the time, the steps will manage it in the handler methods.
  
  .. seealso::
      :class:`~neuraxle.base.BaseStep`,
      :class:`~neuraxle.data_container.StripAbsentValues`
class_docstr_tok: ["DataContainer","(","dact",")","class","to","store","IDs","(","ids",")",",","data","inputs","(","di",")",",","and","expected","outputs","(","eo",")","together",".","In","some","dacts",",","you","could","have","only","ids","and","data","inputs",",","and","in","other","dacts","you","could","have","only","expected","outputs",",","or","you","could","have","all","if","you","want",",","such","as","when","your",":","class",":","`","~neuraxle.pipeline.Pipeline","`","is","used","to","train","a","model","in","a","certain",":","class",":","`","~neuraxle.base.ExecutionMode","`","within","a","certain",":","class",":","`","~neuraxle.base.ExecutionContext","`",".","You","can","use","typing","for","your","dact",",","and","create","a","dact",",","such","as",":","..","code-block",":",":","python","from","typing","import","List","from","neuraxle.data_container","import","DataContainer","as","DACT","dact",":","DACT","[","List","[","str","]",",","List","[","int","]",",","List","[","float","]","]","=","DACT","(","ids=","[","'","a","'",",","'","b","'",",","'","c","'","]",",","data_inputs=","[","1",",","2",",","3","]",",","expected_outputs=","[","1.0",",","2.0",",","3.0","]",")","This","is","because","the","DataContainer","inherits","from","the",":","class",":","`","~typing.Generic","`","type","as","``","class","DataContainer","(","Generic","[","IDT",",","DIT",",","EOT","]",")",":","...","``",".","The","DataContainer","object","is","passed","to","all","of","the",":","class",":","`","~neuraxle.base.BaseStep","`","'s","handle","methods",":","*",":","func",":","`","~neuraxle.base.BaseStep.handle_transform","`","*",":","func",":","`","~neuraxle.base.BaseStep.handle_fit_transform","`","*",":","func",":","`","~neuraxle.base.BaseStep.handle_fit","`","Most","of","the","time",",","the","steps","will","manage","it","in","the","handler","methods",".","..","seealso",":",":",":","class",":","`","~neuraxle.base.BaseStep","`",",",":","class",":","`","~neuraxle.data_container.StripAbsentValues","`"]
docstr: If item is a string, then get then sub container with the same name as item in the list of sub data containers.
  If item is an int, then return a tuple of (id, data input, expected output) for the given item index.
  
  :param item: sub data container str, or item index as int
  :type item: Union[str, int]
  :return: data container, or tuple of ids, data inputs, expected outputs.
  :rtype: Union[DataContainer, Tuple]
docstr_tok: ["If","item","is","a","string",",","then","get","then","sub","container","with","the","same","name","as","item","in","the","list","of","sub","data","containers",".","If","item","is","an","int",",","then","return","a","tuple","of","(","id",",","data","input",",","expected","output",")","for","the","given","item","index",".",":","param","item",":","sub","data","container","str",",","or","item","index","as","int",":","type","item",":","Union","[","str",",","int","]",":","return",":","data","container",",","or","tuple","of","ids",",","data","inputs",",","expected","outputs",".",":","rtype",":","Union","[","DataContainer",",","Tuple","]"]
code: def __getitem__(
      self, item: Union[str, int]
  ) -> Union["DACT", Tuple[IDT, DIT, EOT]]:
      """
      If item is a string, then get then sub container with the same name as item in the list of sub data containers.
      If item is an int, then return a tuple of (id, data input, expected output) for the given item index.
  
      :param item: sub data container str, or item index as int
      :type item: Union[str, int]
      :return: data container, or tuple of ids, data inputs, expected outputs.
      :rtype: Union[DataContainer, Tuple]
      """
      if isinstance(item, str):
          for name, data_container in self.sub_data_containers:
              if name == item:
                  return data_container
          raise KeyError(
              "sub_data_container {} not found in data container".format(
                  item
              )
          )
      else:
          if self.ids is None:
              ids = [None] * len(self)
          else:
              ids = self.ids[item]
  
          return (
              ids,
              self.data_inputs[item],
              self.expected_outputs[item],
          )
  
imports: import copy
  import math
  from operator import attrgetter
  from typing import Any, Callable, Generic, Iterable, Iterator, List, Optional, Tuple, TypeVar, Union
  import numpy
  import pandas
label_desc: Use image node_id 27 for calling the DataContainer obj's underlying member method code with example usage: obj.__getitem__(item) and returns: ids,  self,  self, data_container