class_docstr: Dictionary with InputData as values and primary node names as keys 
class_docstr_tok: ["Dictionary","with","InputData","as","values","and","primary","node","names","as","keys"]
docstr: Import multimodal data from ``csv``.
  
  Args:
      file_path: the path to the ``CSV`` with data.
      delimiter: the delimiter to separate the columns.
      task: the :obj:`Task` to solve with the data.
      text_columns: names of columns that contain text data.
      columns_to_drop: the names of columns that should be dropped.
      target_columns: name of the target column (the last column if empty and no target if ``None``).
      index_col: name or index of the column to use as the :obj:`Data.idx`.
  
          If ``None``, then check the first column's name and use it as index if succeeded
          (see the param ``possible_idx_keywords``).
  
          Set ``False`` to skip the check and rearrange a new integer index.
      possible_idx_keywords: lowercase keys to find. If the first data column contains one of the keys,
          it is used as index. See the :const:`POSSIBLE_TABULAR_IDX_KEYWORDS` for the list of default
          keywords.
  
  Returns:
      An instance of :class:`MultiModalData` containing text and table data sources as :class:`InputData`
          instances.
docstr_tok: ["Import","multimodal","data","from","``","csv","``",".","Args",":","file_path",":","the","path","to","the","``","CSV","``","with","data",".","delimiter",":","the","delimiter","to","separate","the","columns",".","task",":","the",":","obj",":","`","Task","`","to","solve","with","the","data",".","text_columns",":","names","of","columns","that","contain","text","data",".","columns_to_drop",":","the","names","of","columns","that","should","be","dropped",".","target_columns",":","name","of","the","target","column","(","the","last","column","if","empty","and","no","target","if","``","None","``",")",".","index_col",":","name","or","index","of","the","column","to","use","as","the",":","obj",":","`","Data.idx","`",".","If","``","None","``",",","then","check","the","first","column","'s","name","and","use","it","as","index","if","succeeded","(","see","the","param","``","possible_idx_keywords","``",")",".","Set","``","False","``","to","skip","the","check","and","rearrange","a","new","integer","index",".","possible_idx_keywords",":","lowercase","keys","to","find",".","If","the","first","data","column","contains","one","of","the","keys",",","it","is","used","as","index",".","See","the",":","const",":","`","POSSIBLE_TABULAR_IDX_KEYWORDS","`","for","the","list","of","default","keywords",".","Returns",":","An","instance","of",":","class",":","`","MultiModalData","`","containing","text","and","table","data","sources","as",":","class",":","`","InputData","`","instances","."]
code: def from_csv(
      cls,
      file_path: Optional[PathType],
      delimiter=",",
      task: Union[Task, str] = "classification",
      text_columns: Optional[Union[str, List[str]]] = None,
      columns_to_drop: Optional[List[str]] = None,
      target_columns: Union[str, List[str]] = "",
      index_col: Optional[Union[str, int]] = None,
      possible_idx_keywords: Optional[List[str]] = None,
  ) -> MultiModalData:
      """Import multimodal data from ``csv``.
  
      Args:
          file_path: the path to the ``CSV`` with data.
          delimiter: the delimiter to separate the columns.
          task: the :obj:`Task` to solve with the data.
          text_columns: names of columns that contain text data.
          columns_to_drop: the names of columns that should be dropped.
          target_columns: name of the target column (the last column if empty and no target if ``None``).
          index_col: name or index of the column to use as the :obj:`Data.idx`.\n
              If ``None``, then check the first column's name and use it as index if succeeded
              (see the param ``possible_idx_keywords``).\n
              Set ``False`` to skip the check and rearrange a new integer index.
          possible_idx_keywords: lowercase keys to find. If the first data column contains one of the keys,
              it is used as index. See the :const:`POSSIBLE_TABULAR_IDX_KEYWORDS` for the list of default
              keywords.
  
      Returns:
          An instance of :class:`MultiModalData` containing text and table data sources as :class:`InputData`
              instances.
      """
      possible_idx_keywords = (
          possible_idx_keywords or POSSIBLE_TABULAR_IDX_KEYWORDS
      )
      data_frame = get_df_from_csv(
          file_path,
          delimiter,
          index_col,
          possible_idx_keywords,
          columns_to_drop=columns_to_drop,
      )
      idx = data_frame.index.to_numpy()
      if isinstance(task, str):
          task = Task(TaskTypesEnum(task))
  
      text_columns = (
          [text_columns]
          if isinstance(text_columns, str)
          else text_columns
      )
      text_data_detector = TextDataDetector()
      if not text_columns:
          text_columns = text_data_detector.define_text_columns(
              data_frame
          )
  
      data_text = text_data_detector.prepare_multimodal_data(
          data_frame, text_columns
      )
      data_frame_table = data_frame.drop(columns=text_columns)
      table_features, target = process_target_and_features(
          data_frame_table, target_columns
      )
  
      data_part_transformation_func = partial(
          array_to_input_data, idx=idx, target_array=target, task=task
      )
  
      # create labels for text data sources and remove source if there are many nans
      sources = dict(
          (
              text_data_detector.new_key_name(data_part_key),
              data_part_transformation_func(
                  features_array=data_part, data_type=DataTypesEnum.text
              ),
          )
          for (data_part_key, data_part) in data_text.items()
          if not text_data_detector.is_full_of_nans(data_part)
      )
  
      # add table features if they exist
      if table_features.size != 0:
          sources.update(
              {
                  "data_source_table": data_part_transformation_func(
                      features_array=table_features,
                      data_type=DataTypesEnum.table,
                  )
              }
          )
  
      multi_modal_data = MultiModalData(sources)
  
      return multi_modal_data
  
imports: from __future__ import annotations
  from functools import partial
  from typing import List, Optional, Union, Dict
  import numpy
  from fedot.core.data.data import InputData
  from fedot.core.data.data import process_target_and_features, array_to_input_data, get_df_from_csv, PathType, POSSIBLE_TABULAR_IDX_KEYWORDS, POSSIBLE_TS_IDX_KEYWORDS
  from fedot.core.data.data_detection import TextDataDetector, TimeSeriesDataDetector
  from fedot.core.repository.dataset_types import DataTypesEnum
  from fedot.core.repository.tasks import Task, TaskTypesEnum
label_desc: Use image node_id 14 for calling the MultiModalData obj's underlying member method code with example usage: obj.from_csv(cls, file_path, delimiter, task, text_columns, columns_to_drop, target_columns, index_col, possible_idx_keywords) and returns: multi_modal_data