class_docstr: A class for managing Neptune experiment.
  
  Each time User creates new experiment instance of this class is created.
  It lets you manage experiment, :meth:`~neptune.experiments.Experiment.log_metric`,
  :meth:`~neptune.experiments.Experiment.log_text`,
  :meth:`~neptune.experiments.Experiment.log_image`,
  :meth:`~neptune.experiments.Experiment.set_property`,
  and much more.
  
  
  Args:
      backend (:obj:`neptune.ApiClient`): A ApiClient object
      project (:obj:`neptune.Project`): The project this experiment belongs to
      _id (:obj:`str`): Experiment id
      internal_id (:obj:`str`): internal ID
  
  Example:
      Assuming that `project` is an instance of :class:`~neptune.projects.Project`.
  
      .. code:: python3
  
          experiment = project.create_experiment()
  
  Warning:
      User should never create instances of this class manually.
      Always use: :meth:`~neptune.projects.Project.create_experiment`.
class_docstr_tok: ["A","class","for","managing","Neptune","experiment",".","Each","time","User","creates","new","experiment","instance","of","this","class","is","created",".","It","lets","you","manage","experiment",",",":","meth",":","`","~neptune.experiments.Experiment.log_metric","`",",",":","meth",":","`","~neptune.experiments.Experiment.log_text","`",",",":","meth",":","`","~neptune.experiments.Experiment.log_image","`",",",":","meth",":","`","~neptune.experiments.Experiment.set_property","`",",","and","much","more",".","Args",":","backend","(",":","obj",":","`","neptune.ApiClient","`",")",":","A","ApiClient","object","project","(",":","obj",":","`","neptune.Project","`",")",":","The","project","this","experiment","belongs","to","_id","(",":","obj",":","`","str","`",")",":","Experiment","id","internal_id","(",":","obj",":","`","str","`",")",":","internal","ID","Example",":","Assuming","that","`","project","`","is","an","instance","of",":","class",":","`","~neptune.projects.Project","`",".","..","code",":",":","python3","experiment","=","project.create_experiment","(",")","Warning",":","User","should","never","create","instances","of","this","class","manually",".","Always","use",":",":","meth",":","`","~neptune.projects.Project.create_experiment","`","."]
docstr: Retrieve values of specified metrics (numeric logs).
  
  The returned
  `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_
  contains 1 additional column `x` along with the requested metrics.
  
  Args:
      *channel_names (one or more :obj:`str`): comma-separated metric names.
  
  Returns:
      :obj:`pandas.DataFrame` - DataFrame containing values for the requested metrics.
  
      | The returned DataFrame may contain ``NaN`` s if one of the metrics has more values than others.
  
  Example:
      Invoking ``get_numeric_channels_values('loss', 'auc')`` returns DataFrame with columns
      `x`, `loss`, `auc`.
  
      Assuming that `experiment` is an instance of :class:`~neptune.experiments.Experiment`:
  
      .. code:: python3
  
          batch_channels = experiment.get_numeric_channels_values('batch-1-loss', 'batch-2-metric')
          epoch_channels = experiment.get_numeric_channels_values('epoch-1-loss', 'epoch-2-metric')
  
  Note:
      It's good idea to get metrics with common temporal pattern (like iteration or batch/epoch number).
      Thanks to this each row of returned DataFrame has metrics from the same moment in experiment.
      For example, combine epoch metrics to one DataFrame and batch metrics to the other.
docstr_tok: ["Retrieve","values","of","specified","metrics","(","numeric","logs",")",".","The","returned","`","pandas.DataFrame","<","https",":","\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.html",">","`","_","contains","1","additional","column","`","x","`","along","with","the","requested","metrics",".","Args",":","*","channel_names","(","one","or","more",":","obj",":","`","str","`",")",":","comma-separated","metric","names",".","Returns",":",":","obj",":","`","pandas.DataFrame","`","-","DataFrame","containing","values","for","the","requested","metrics",".","|","The","returned","DataFrame","may","contain","``","NaN","``","s","if","one","of","the","metrics","has","more","values","than","others",".","Example",":","Invoking","``","get_numeric_channels_values","(","'loss","'",",","'auc","'",")","``","returns","DataFrame","with","columns","`","x","`",",","`","loss","`",",","`","auc","`",".","Assuming","that","`","experiment","`","is","an","instance","of",":","class",":","`","~neptune.experiments.Experiment","`",":","..","code",":",":","python3","batch_channels","=","experiment.get_numeric_channels_values","(","'batch-1-loss","'",",","'batch-2-metric","'",")","epoch_channels","=","experiment.get_numeric_channels_values","(","'epoch-1-loss","'",",","'epoch-2-metric","'",")","Note",":","It","'s","good","idea","to","get","metrics","with","common","temporal","pattern","(","like","iteration","or","batch\/epoch","number",")",".","Thanks","to","this","each","row","of","returned","DataFrame","has","metrics","from","the","same","moment","in","experiment",".","For","example",",","combine","epoch","metrics","to","one","DataFrame","and","batch","metrics","to","the","other","."]
code: def get_numeric_channels_values(self, *channel_names):
      """Retrieve values of specified metrics (numeric logs).
  
      The returned
      `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_
      contains 1 additional column `x` along with the requested metrics.
  
      Args:
          *channel_names (one or more :obj:`str`): comma-separated metric names.
  
      Returns:
          :obj:`pandas.DataFrame` - DataFrame containing values for the requested metrics.
  
          | The returned DataFrame may contain ``NaN`` s if one of the metrics has more values than others.
  
      Example:
          Invoking ``get_numeric_channels_values('loss', 'auc')`` returns DataFrame with columns
          `x`, `loss`, `auc`.
  
          Assuming that `experiment` is an instance of :class:`~neptune.experiments.Experiment`:
  
          .. code:: python3
  
              batch_channels = experiment.get_numeric_channels_values('batch-1-loss', 'batch-2-metric')
              epoch_channels = experiment.get_numeric_channels_values('epoch-1-loss', 'epoch-2-metric')
  
      Note:
          It's good idea to get metrics with common temporal pattern (like iteration or batch/epoch number).
          Thanks to this each row of returned DataFrame has metrics from the same moment in experiment.
          For example, combine epoch metrics to one DataFrame and batch metrics to the other.
      """
  
      channels_data = {}
      channels_by_name = self._backend.get_channels(self)
      for channel_name in channel_names:
          channel_id = channels_by_name[channel_name].id
          try:
              channels_data[channel_name] = pd.read_csv(
                  self._backend.get_channel_points_csv(
                      self, channel_id, channel_name
                  ),
                  header=None,
                  names=[
                      "x_{}".format(channel_name),
                      "y_{}".format(channel_name),
                  ],
                  dtype=float,
              )
          except EmptyDataError:
              channels_data[channel_name] = pd.DataFrame(
                  columns=[
                      "x_{}".format(channel_name),
                      "y_{}".format(channel_name),
                  ],
                  dtype=float,
              )
  
      return align_channels_on_x(
          pd.concat(channels_data.values(), axis=1, sort=False)
      )
  
imports: import base64
  import logging
  import traceback
  import pandas
  import six
  from pandas.errors import EmptyDataError
  from neptune.common.experiments import LegacyExperiment
  from neptune.common.utils import align_channels_on_x, is_float, is_nan_or_inf
  from neptune.legacy.api_exceptions import ChannelDoesNotExist, ExperimentAlreadyFinished
  from neptune.legacy.exceptions import InvalidChannelValue, NeptuneIncorrectImportException, NoChannelValue
  from neptune.legacy.internal.channels.channels import ChannelNamespace, ChannelType, ChannelValue
  from neptune.legacy.internal.channels.channels_values_sender import ChannelsValuesSender
  from neptune.legacy.internal.execution.execution_context import ExecutionContext
  from neptune.legacy.internal.utils.deprecation import legacy_client_deprecation
  from neptune.legacy.internal.utils.image import get_image_content
label_desc: Use image node_id 37 for calling the Experiment obj's underlying member method code with example usage: obj.get_numeric_channels_values() and returns: align_channels_on_x