code: def calc_multicol_whiskers(colnames, multicol_outliers):
      # Computes min and max values of non-outliers - the whiskers
      scols = []
      for colname in colnames:
          outlier_colname = "__{}_outlier".format(colname)
          scols.append(
              F.min(
                  F.when(
                      ~F.col(outlier_colname), F.col(colname)
                  ).otherwise(F.lit(None))
              ).alias("__{}_min".format(colname))
          )
          scols.append(
              F.max(
                  F.when(
                      ~F.col(outlier_colname), F.col(colname)
                  ).otherwise(F.lit(None))
              ).alias("__{}_max".format(colname))
          )
  
      pdf = multicol_outliers.select(*scols).toPandas()
  
      i = 0
      whiskers = {}
      for colname in colnames:
          min = pdf.iloc[0, i]
          i += 1
          max = pdf.iloc[0, i]
          i += 1
          whiskers[colname] = {
              "min": min,
              "max": max,
          }
  
      return whiskers
  
imports: import importlib
  import pandas
  import numpy
  from pandas.core.base import PandasObject
  from pandas.core.dtypes.inference import is_integer
  from pyspark.ml.feature import Bucketizer
  from pyspark.mllib.stat import KernelDensity
  from pyspark.sql import functions
  from pyspark.pandas.missing import unsupported_function
  from pyspark.pandas.config import get_option
  from pyspark.pandas.utils import name_like_string
label_desc: Use image node_id 5 for calling the BoxPlotBase obj's underlying member method code with example usage: obj.calc_multicol_whiskers(colnames, multicol_outliers) and returns: whiskers