code: def df_models_algorithms(
      self,
      current_models,
      time_limit=None,
      exclude_golden=False,
      sort_by_worst_fairness=False,
  ):
      scores = [m.get_final_loss() for m in current_models]
      model_types = [m.get_type() for m in current_models]
      names = [m.get_name() for m in current_models]
      train_times = [m.get_train_time() for m in current_models]
  
      df_models = pd.DataFrame(
          {
              "model": current_models,
              "score": scores,
              "model_type": model_types,
              "name": names,
              "train_time": train_times,
          }
      )
      if self._fairness_metric is not None:
          worst_fairness = [
              m.get_worst_fairness() for m in current_models
          ]
          df_models["worst_fairness"] = worst_fairness
          best_fairness = [
              m.get_best_fairness() for m in current_models
          ]
          df_models["best_fairness"] = best_fairness
  
      if time_limit is not None:
          df_models = df_models[df_models.train_time < time_limit]
          df_models.reset_index(drop=True, inplace=True)
  
      if exclude_golden:
          ii = df_models["name"].apply(lambda x: "GoldenFeatures" in x)
          df_models = df_models[~ii]
          df_models.reset_index(drop=True, inplace=True)
  
      df_models.sort_values(by="score", ascending=True, inplace=True)
  
      if self._fairness_metric is not None:
          sort_by_worst_fairness = True
  
          ascending = True
          if "ratio" in self._fairness_metric.lower():
              ascending = False
          if sort_by_worst_fairness:
              df_models.sort_values(
                  by="worst_fairness", ascending=ascending, inplace=True
              )
          else:
              df_models.sort_values(
                  by="best_fairness", ascending=ascending, inplace=True
              )
  
      model_types = list(df_models.model_type)
      u, idx = np.unique(model_types, return_index=True)
      algorithms = u[np.argsort(idx)]
  
      return df_models, algorithms
  
imports: import copy
  import json
  import logging
  import os
  import numpy
  import pandas
  from sklearn.preprocessing import OneHotEncoder
  from supervised.algorithms.catboost import catboost_eval_metric
  from supervised.algorithms.lightgbm import lightgbm_eval_metric
  from supervised.algorithms.registry import BINARY_CLASSIFICATION, MULTICLASS_CLASSIFICATION, REGRESSION, AlgorithmsRegistry
  from supervised.algorithms.xgboost import xgboost_eval_metric
  from supervised.preprocessing.label_encoder import LabelEncoder
  from supervised.preprocessing.preprocessing_categorical import PreprocessingCategorical
  from supervised.tuner.hill_climbing import HillClimbing
  from supervised.tuner.preprocessing_tuner import PreprocessingTuner
  from supervised.tuner.random_parameters import RandomParameters
  from supervised.utils.config import LOG_LEVEL
  from supervised.utils.utils import dump_data, load_data
label_desc: Use image node_id 25 for calling the MljarTuner obj's underlying member method code with example usage: obj.df_models_algorithms(current_models, time_limit, exclude_golden, sort_by_worst_fairness) and returns: df_models,  algorithms