code: def compute_multicol_stats(data, colnames, whis, precision):
      # Computes mean, median, Q1 and Q3 with approx_percentile and precision
      scol = []
      for colname in colnames:
          scol.append(
              F.percentile_approx(
                  "`%s`" % colname,
                  [0.25, 0.50, 0.75],
                  int(1.0 / precision),
              ).alias("{}_percentiles%".format(colname))
          )
          scol.append(
              F.mean("`%s`" % colname).alias("{}_mean".format(colname))
          )
  
      #      a_percentiles  a_mean    b_percentiles  b_mean
      # 0  [3.0, 3.2, 3.2]    3.18  [5.1, 5.9, 6.4]    5.86
      pdf = data._internal.resolved_copy.spark_frame.select(
          *scol
      ).toPandas()
  
      i = 0
      multicol_stats = {}
      for colname in colnames:
          q1, med, q3 = pdf.iloc[0, i]
          iqr = q3 - q1
          lfence = q1 - whis * iqr
          ufence = q3 + whis * iqr
          i += 1
  
          mean = pdf.iloc[0, i]
          i += 1
  
          multicol_stats[colname] = {
              "mean": mean,
              "med": med,
              "q1": q1,
              "q3": q3,
              "lfence": lfence,
              "ufence": ufence,
          }
  
      return multicol_stats
  
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 1 for calling the BoxPlotBase obj's underlying member method code with example usage: obj.compute_multicol_stats(data, colnames, whis, precision) and returns: multicol_stats