docstr: Add an entry row to :attr:`Leaderboard.data` (pandas.DataFrame). This method also handles
  column conflicts to an extent
  
  Parameters
  ----------
  experiment: Instance of :class:`experiments.BaseExperiment` descendant
      An Experiment instance for which a leaderboard entry row should be added
  **kwargs: Dict
      Extra keyword arguments
docstr_tok: ["Add","an","entry","row","to",":","attr",":","`","Leaderboard.data","`","(","pandas.DataFrame",")",".","This","method","also","handles","column","conflicts","to","an","extent","Parameters","--","--","--","--","--","experiment",":","Instance","of",":","class",":","`","experiments.BaseExperiment","`","descendant","An","Experiment","instance","for","which","a","leaderboard","entry","row","should","be","added","*","*","kwargs",":","Dict","Extra","keyword","arguments"]
code: def add_entry(self, experiment, **kwargs):
      """Add an entry row to :attr:`Leaderboard.data` (pandas.DataFrame). This method also handles
      column conflicts to an extent
  
      Parameters
      ----------
      experiment: Instance of :class:`experiments.BaseExperiment` descendant
          An Experiment instance for which a leaderboard entry row should be added
      **kwargs: Dict
          Extra keyword arguments"""
      final_evaluations = experiment.last_evaluation_results
      entry_columns, entry_data = [], []
      # TODO: Resolve cases where `data` contains an aliased column for a metric, but the current experiment uses the
      # TODO: ... standard metric name. EX) 'oof_roc' vs 'oof_roc_auc_score' - They should be considered the same - Use alias
      evaluation_columns, evaluation_values = list(
          zip(*evaluations_to_columns(final_evaluations))
      )
      entry_columns.extend(evaluation_columns)
      entry_data.extend(evaluation_values)
  
      identifier_cols = [
          "experiment_id",
          "hyperparameter_key",
          "cross_experiment_key",
          "algorithm_name",
      ]
      entry_columns.extend(identifier_cols)
      for id_col in identifier_cols:
          entry_data.append(str(getattr(experiment, id_col)))
  
      entry_columns.append("experiment_#")
      entry_data.append(self.data.shape[0])
      identifier_cols.append("experiment_#")
  
      entry = pd.DataFrame(data=[entry_data], columns=entry_columns)
  
      self.data = self.data.append(entry, ignore_index=True)[
          combine_column_order(
              self.data, entry, both_cols=identifier_cols
          )
      ]
  
file_path: hyperparameter_hunter/hyperparameter_hunter/i_o/leaderboards.py
imports: from abc import ABCMeta, abstractmethod
  from collections import OrderedDict
  from numbers import Number
  import numpy
  import pandas
  from typing import Dict, List, Optional, Tuple
label_desc: Use image node_id 1 for calling the GlobalLeaderboard obj's underlying member method code with example usage: obj.add_entry(experiment) without return types