class_docstr: A datapoint represents a single measurement of metrics - for instance a model checkpoint that is evaluated.
  It can have a parent if it originates from another one (offspring).
  
  
  :ivar uid: A unique identifier for this datapoint
  :ivar values: A dictionary with arbitrary metrics/values
  :ivar from_uid: The uid of the parent :class:`Datapoint` (tp.Optional)
  
  :Example:
  
  .. code-block:: python
  
      import hiplot as hip
      dp1 = hip.Datapoint(uid="parent", values={"loss": 0.0})
      dp2 = hip.Datapoint(uid="child", from_uid="parent", values={
          "loss": 1.0,
          "another_metric": 0.0  # Different datapoints can have different metrics
      })
      hip.Experiment(datapoints=[dp1, dp2]).display()  # Render in an ipython notebook
code: def __init__(
      self,
      values: tp.Dict[str, DisplayableType],
      *,
      uid: tp.Optional[str] = None,
      from_uid: tp.Optional[str] = None,
  ) -> None:
      self.uid = uid if uid is not None else str(uuid.uuid4())
      self.values = values
      self.from_uid = from_uid
  
imports: import csv
  import uuid
  import json
  import codecs
  import warnings
  from abc import ABCMeta, abstractmethod
  from enum import Enum
  from collections import defaultdict
  from pathlib import Path
  import typing
label_desc: Use image node_id 1 to create a new Datapoint object from inherited base classes: _DictSerializable with example: obj = Datapoint(values)