code: def run(self, df, **launch_params):
      # Get input columns
      if isinstance(self.incols, dict):
          inputs = {
              v: df[k]._column.data_array_view(mode="read")
              for (k, v) in self.incols.items()
          }
      else:
          inputs = {
              k: df[k]._column.data_array_view(mode="read")
              for k in self.incols
          }
      # Allocate output columns
      outputs = {}
      for k, dt in self.outcols.items():
          outputs[k] = column.column_empty(
              len(df), dt, False
          ).data_array_view(mode="write")
      # Bind argument
      args = {}
      for dct in [inputs, outputs, self.kwargs]:
          args.update(dct)
      bound = self.sig.bind(**args)
      # Launch kernel
      self.launch_kernel(df, bound.args, **launch_params)
      # Prepare pessimistic nullmask
      if self.pessimistic_nulls:
          out_mask = make_aggregate_nullmask(df, columns=self.incols)
      else:
          out_mask = None
      # Prepare output frame
      outdf = df.copy()
      for k in sorted(self.outcols):
          outdf[k] = cudf.Series(
              outputs[k], index=outdf.index, nan_as_null=False
          )
          if out_mask is not None:
              outdf._data[k] = outdf[k]._column.set_mask(
                  out_mask.data_array_view(mode="write")
              )
  
      return outdf
  
imports: import functools
  from typing import Any, Dict
  import cupy
  from numba import cuda
  from numba.core.utils import pysignature
  import cudf
  from cudf import _lib
  from cudf.core.buffer import acquire_spill_lock
  from cudf.core.column import column
  from cudf.utils import utils
  from cudf.utils._numba import _CUDFNumbaConfig
  from cudf.utils.docutils import docfmt_partial
label_desc: Use image node_id 2 for calling the ApplyKernelCompilerBase obj's underlying member method code with example usage: obj.run(df) and returns: outdf