code: def update_attributes(self, column):
      if is_bool_dtype(column):
          col_type = "logical"
      elif is_numeric_dtype(column):
          col_type = "numeric"
      elif is_object_dtype(column):
          col_type = "categorical"
      else:
          raise Exception("Column type is not supported")
      if self.type is None:
          self.type = col_type
      elif self.type != col_type:
          raise Exception(
              "The same name was used for columns with different type"
          )
      if self.type == "numeric":
          self.min = min(
              column.min(), math.inf if self.min is None else self.min
          )
          self.max = max(
              column.max(), -math.inf if self.max is None else self.max
          )
          if len(column.unique()) < 20:
              self.levels = np.unique(
                  (self.levels or []) + column.unique().tolist()
              ).tolist()
          if not self.levels is None and len(self.levels) >= 20:
              self.levels = None
      else:
          self.levels = np.unique(
              (self.levels or []) + column.unique().tolist()
          ).tolist()
  
imports: from abc import ABC, abstractmethod
  import numpy
  import math
  from pandas.api.types import is_numeric_dtype, is_bool_dtype, is_object_dtype
label_desc: Use image node_id 5 for calling the VariableParam obj's underlying member method code with example usage: obj.update_attributes(column) without return types