code: def define_column_types(table: Optional[np.ndarray]) -> pd.DataFrame:
      """Prepare information about types per columns. For each column store unique
      types, which column contains.
      """
      table_of_types = pd.DataFrame(table, copy=True)
      table_of_types = table_of_types.replace({np.nan: None}).applymap(
          lambda el: TYPE_TO_ID[type(el)]
      )
  
      # Build dataframe with unique types for each column
      uniques = (
          table_of_types.apply(pd.unique, result_type="reduce")
          .to_frame(_TYPES)
          .T
      )
  
      # Build dataframe with amount of each type
      counts_index_mapper = {
          TYPE_TO_ID[float]: _FLOAT_NUMBER,
          TYPE_TO_ID[int]: _INT_NUMBER,
          TYPE_TO_ID[str]: _STR_NUMBER,
          TYPE_TO_ID[type(None)]: _NAN_NUMBER,
      }
      types_counts = (
          table_of_types.apply(pd.value_counts, dropna=False)
          .reindex(
              counts_index_mapper.keys(), copy=False
          )  # Sets all type ids
          .replace(np.nan, 0)
          .rename(
              index=counts_index_mapper, copy=False
          )  # Renames all type ids to strs
          .astype(int)
      )
  
      # Build dataframe with nans indices
      nans_ids = (
          (table_of_types == TYPE_TO_ID[type(None)])
          .apply(np.flatnonzero, result_type="reduce")
          .to_frame(_NAN_IDS)
          .T
      )
  
      # Combine all dataframes
      return pd.concat([uniques, types_counts, nans_ids])
  
imports: from __future__ import annotations
  from collections.abc import Sequence
  from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
  import numpy
  import pandas
  from golem.core.log import LoggerAdapter, default_log
  from fedot.core.repository.tasks import Task, TaskTypesEnum
label_desc: Use image node_id 1 for calling a global function with example usage: define_column_types(table) and returns: pd