class_docstr: This ensemble acts as a mixer selector. 
  After evaluating accuracy for all internal mixers with the validation data, it sets the best mixer as the underlying model.
code: def __call__(
      self, ds: EncodedDs, args: PredictionArguments
  ) -> pd.DataFrame:
      assert self.prepared
      if args.all_mixers:
          predictions = {}
          for mixer in self.mixers:
              predictions[
                  f"__mdb_mixer_{type(mixer).__name__}"
              ] = mixer(ds, args=args)["prediction"]
          return pd.DataFrame(predictions)
      else:
          for mixer_index in self.indexes_by_accuracy:
              mixer = self.mixers[mixer_index]
              try:
                  return mixer(ds, args=args)
              except Exception as e:
                  if mixer.stable:
                      raise (e)
                  else:
                      log.warning(
                          f"Unstable mixer {type(mixer).__name__} failed with exception: {e}.\
                          Trying next best"
                      )
  
file_path: lightwood/lightwood/ensemble/best_of.py
imports: from typing import List, Optional
  import numpy
  import pandas
  from mindsdb_evaluator import evaluate_accuracies
  from lightwood.helpers.log import log
  from type_infer.helpers import is_nan_numeric
  from lightwood.mixer.base import BaseMixer
  from lightwood.ensemble.base import BaseEnsemble
  from lightwood.api.types import PredictionArguments, SubmodelData
  from lightwood.data.encoded_ds import EncodedDs
  from lightwood.mixer import GluonTSMixer
label_desc: Use image node_id 2 for calling the BestOf obj's underlying member method code with example usage: obj.__call__(ds, args) and returns: pd, mixer