docs: def get_vartype(data):
      """Infer the type of a variable (technically a Series).
  
      The types supported are split in standard types and special types.
  
      Standard types:
          * Categorical (`TYPE_CAT`): the default type if no other one can be determined
          * Numerical (`TYPE_NUM`): if it contains numbers
          * Boolean (`TYPE_BOOL`): at this time only detected if it contains boolean values, see todo
          * Date (`TYPE_DATE`): if it contains datetime
  
      Special types:
          * Constant (`S_TYPE_CONST`): if all values in the variable are equal
          * Unique (`S_TYPE_UNIQUE`): if all values in the variable are different
          * Unsupported (`S_TYPE_UNSUPPORTED`): if the variable is unsupported
  
       The result is cached by column name in a global variable to avoid recomputing.
  
      Parameters
      ----------
      data : Series
          The data type of the Series.
  
      Returns
      -------
      str
          The data type of the Series.
  
      Notes
      ----
          * Should improve verification when a categorical or numeric field has 3 values, it could be a categorical field
          or just a boolean with NaN values
          * #72: Numeric with low Distinct count should be treated as "Categorical"
      """
      if data.name is not None and data.name in _MEMO:
          return _MEMO[data.name]
  
      vartype = None
      try:
          distinct_count = get_groupby_statistic(data)[1]
          leng = len(data)
  
          if distinct_count <= 1:
              vartype = S_TYPE_CONST
          elif pd.api.types.is_bool_dtype(data) or (distinct_count == 2 and pd.api.types.is_numeric_dtype(data)):
              vartype = TYPE_BOOL
          elif pd.api.types.is_numeric_dtype(data):
              vartype = TYPE_NUM
          elif pd.api.types.is_datetime64_dtype(data):
              vartype = TYPE_DATE
          elif distinct_count == leng:
              vartype = S_TYPE_UNIQUE
          else:
              vartype = TYPE_CAT
      except:
          vartype = S_TYPE_UNSUPPORTED
  
      if data.name is not None:
          _MEMO[data.name] = vartype
  
      return vartype