code: def _collect_pdp_results(self, features, grids):
      self.n_jobs = _calc_n_jobs(
          self.df, self.n_grids, self.memory_limit, self.n_jobs
      )
      grid_results = []
      pbar = tqdm(total=len(grids))
      for i in range(0, len(grids), self.n_jobs):
          calc_args = []
          for j in range(i, i + self.n_jobs):
              if j >= len(grids):
                  break
              calc_args.append(
                  {
                      "grids": grids[j],
                      "grid_idx": j,
                      "df": self.df[self.model_features],
                      "feats": features,
                  }
              )
  
          batch_results = pqdm(
              calc_args,
              self._calc_ice_lines,
              n_jobs=self.n_jobs,
              argument_type="kwargs",
              disable=True,
          )
          pbar.update(len(batch_results))
          grid_results += batch_results
      pbar.close()
  
      grid_indices = np.arange(self.n_grids)
      self.results = []
      if self.n_classes > 2:
          for cls_idx in range(self.n_classes):
              ice_lines = pd.concat(
                  [res[cls_idx] for res in grid_results], axis=1
              )
              pdp = ice_lines[grid_indices].mean().values
              self.results.append(PDPResult(cls_idx, ice_lines, pdp))
      else:
          ice_lines = pd.concat(grid_results, axis=1)
          pdp = ice_lines[grid_indices].mean().values
          self.results.append(PDPResult(None, ice_lines, pdp))
  
imports: from .pdp_utils import PDPIsolatePlotEngine, PDPInteractPlotEngine
  from .utils import _check_frac_to_plot, _make_list, _check_classes, _calc_n_jobs, FeatureInfo, _check_model, _calc_preds, _expand_params_for_interact, _check_dataset, _check_cluster_params, _check_plot_engine, _check_pdp_interact_plot_type
  import pandas
  import numpy
  from pqdm.processes import pqdm
  from tqdm.auto import tqdm
  import warnings
label_desc: Use image node_id 4 for calling the _PDPBase obj's underlying member method code with example usage: obj._collect_pdp_results(features, grids) without return types