class_docstr: Convert data from a columnar representation like Pandas and Numpy into values appropriate for
  element_data.py types.
  
  Args:
      name (str): the name of the argument for error messages
      default_type (hashable): the default type to use for data without a type
      type_column (hashable, optional): the name of the type column, if one is being used
      column_defaults (dict of hashable to any): any default values for columns (using names before renaming!)
      selected_columns (dict of hashable to hashable): renamings for columns, mapping original name to new name
      dtype (str or numpy dtype): the data type to use for the feature matrices
      transform_columns (dict of hashable to callable): column transformations, maps column name to transform
class_docstr_tok: ["Convert","data","from","a","columnar","representation","like","Pandas","and","Numpy","into","values","appropriate","for","element_data.py","types",".","Args",":","name","(","str",")",":","the","name","of","the","argument","for","error","messages","default_type","(","hashable",")",":","the","default","type","to","use","for","data","without","a","type","type_column","(","hashable",",","optional",")",":","the","name","of","the","type","column",",","if","one","is","being","used","column_defaults","(","dict","of","hashable","to","any",")",":","any","default","values","for","columns","(","using","names","before","renaming","!",")","selected_columns","(","dict","of","hashable","to","hashable",")",":","renamings","for","columns",",","mapping","original","name","to","new","name","dtype","(","str","or","numpy","dtype",")",":","the","data","type","to","use","for","the","feature","matrices","transform_columns","(","dict","of","hashable","to","callable",")",":","column","transformations",",","maps","column","name","to","transform"]
code: def _ids_columns_and_type_info_from_singles(self, singles):
      type_info = []
      type_ids = []
      type_columns = defaultdict(list)
  
      for type_name in sorted(singles.keys()):
          ids, columns, data = singles[type_name]
  
          type_info.append((type_name, data))
          type_ids.append(ids)
          for col_name, col_array in columns.items():
              type_columns[col_name].append(col_array)
  
      if type_ids:
          ids = smart_array_concatenate(type_ids)
          columns = {
              col_name: smart_array_concatenate(col_arrays)
              for col_name, col_arrays in type_columns.items()
          }
      else:
          # there was no input types and thus no input elements, so create a dummy set of columns,
          # that is maximally flexible by using a "minimal"/highly-promotable type
          ids = []
          columns = {
              name: zero_sized_array((0,), dtype=np.uint8)
              for name in self.selected_columns.values()
          }
  
      return ids, columns, type_info
  
imports: from collections import defaultdict, namedtuple
  from typing import Iterable
  import warnings
  import numpy
  import pandas
  from ..globalvar import SOURCE, TARGET, WEIGHT, TYPE_ATTR_NAME
  from .element_data import NodeData, EdgeData
  from .indexed_array import IndexedArray
  from .validation import comma_sep, require_dataframe_has_columns
  from .utils import is_real_iterable, zero_sized_array, smart_array_concatenate, smart_array_index
label_desc: Use image node_id 6 for calling the ColumnarConverter obj's underlying member method code with example usage: obj._ids_columns_and_type_info_from_singles(singles) and returns: ids,  columns,  type_info