code: def is_dtype_union_equal(source, target):
      """
      Check whether two arrays have compatible dtypes to do a union.
      numpy types are checked with ``is_dtype_equal``. Extension types are
      checked separately.
  
      Parameters
      ----------
      source : The first dtype to compare
      target : The second dtype to compare
  
      Returns
      ----------
      boolean : Whether or not the two dtypes are equal.
  
      >>> is_dtype_equal("int", int)
      True
  
      >>> is_dtype_equal(CategoricalDtype(['a', 'b'],
      ...                CategoricalDtype(['b', 'c']))
      True
  
      >>> is_dtype_equal(CategoricalDtype(['a', 'b'],
      ...                CategoricalDtype(['b', 'c'], ordered=True))
      False
      """
      source = _get_dtype(source)
      target = _get_dtype(target)
      if is_categorical_dtype(source) and is_categorical_dtype(target):
          # ordered False for both
          return source.ordered is target.ordered
      return is_dtype_equal(source, target)
  
imports: import warnings
  import numpy
  from pandas._libs import algos, lib
  from pandas._libs.tslibs import conversion
  from pandas.compat import PY3, PY36, string_types
  from pandas.core.dtypes.dtypes import CategoricalDtype, DatetimeTZDtype, ExtensionDtype, IntervalDtype, PandasExtensionDtype, PeriodDtype, registry
  from pandas.core.dtypes.generic import ABCCategorical, ABCDateOffset, ABCDatetimeIndex, ABCIndexClass, ABCPeriodArray, ABCPeriodIndex, ABCSeries
  from pandas.core.dtypes.inference import is_array_like, is_bool, is_complex, is_decimal, is_dict_like, is_file_like, is_float, is_hashable, is_integer, is_interval, is_iterator, is_list_like, is_named_tuple, is_nested_list_like, is_number, is_re, is_re_compilable, is_scalar, is_sequence, is_string_like
label_desc: Use image node_id 24 for calling a global function with example usage: is_dtype_union_equal(source, target) and returns: is_dtype_equal, unknown