code: def time_features_selection(self, current_models, total_time_limit):
      model_selection_time_limit = (
          None if total_time_limit is None else 0.1 * total_time_limit
      )
      df_models, algorithms = self.df_models_algorithms(
          current_models, time_limit=model_selection_time_limit
      )
  
      time_needed = 0
      for m_type in algorithms:
          if m_type not in [
              "Xgboost",
              "LightGBM",
              "CatBoost",
              "Neural Network",
              "Random Forest",
              "Extra Trees",
          ]:
              continue
          models = df_models[df_models.model_type == m_type]["model"]
  
          for i in range(min(1, len(models))):
              m = models.iloc[i]
              if time_needed == 0:
                  # best model will be used two times
                  # one for insert random feature
                  # one for selected features
                  time_needed += 2.0 * m.get_train_time()
              else:
                  time_needed += m.get_train_time()
  
      return time_needed
  
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 28 for calling the MljarTuner obj's underlying member method code with example usage: obj.time_features_selection(current_models, total_time_limit) and returns: time_needed