class_docstr: Creates a heterogeneous graph from multiple pandas dataframes.
  
  Examples
  --------
  Let's say we have the following three pandas dataframes:
  
  User table ``users``:
  
  ===========  ===========  =======
  ``user_id``  ``country``  ``age``
  ===========  ===========  =======
  XYZZY        U.S.         25
  FOO          China        24
  BAR          China        23
  ===========  ===========  =======
  
  Game table ``games``:
  
  ===========  =========  ==============  ==================
  ``game_id``  ``title``  ``is_sandbox``  ``is_multiplayer``
  ===========  =========  ==============  ==================
  1            Minecraft  True            True
  2            Tetris 99  False           True
  ===========  =========  ==============  ==================
  
  Play relationship table ``plays``:
  
  ===========  ===========  =========
  ``user_id``  ``game_id``  ``hours``
  ===========  ===========  =========
  XYZZY        1            24
  FOO          1            20
  FOO          2            16
  BAR          2            28
  ===========  ===========  =========
  
  One could then create a bidirectional bipartite graph as follows:
  >>> builder = PandasGraphBuilder()
  >>> builder.add_entities(users, 'user_id', 'user')
  >>> builder.add_entities(games, 'game_id', 'game')
  >>> builder.add_binary_relations(plays, 'user_id', 'game_id', 'plays')
  >>> builder.add_binary_relations(plays, 'game_id', 'user_id', 'played-by')
  >>> g = builder.build()
  >>> g.num_nodes('user')
  3
  >>> g.num_edges('plays')
  4
code: def add_entities(self, entity_table, primary_key, name):
      entities = entity_table[primary_key].astype("category")
      if not (entities.value_counts() == 1).all():
          raise ValueError(
              "Different entity with the same primary key detected."
          )
      # preserve the category order in the original entity table
      entities = entities.cat.reorder_categories(
          entity_table[primary_key].values
      )
  
      self.entity_pk_to_name[primary_key] = name
      self.entity_pk[name] = primary_key
      self.num_nodes_per_type[name] = entity_table.shape[0]
      self.entity_key_map[name] = entities
      self.entity_tables[name] = entity_table
  
file_path: dgl/examples/pytorch/pinsage/builder.py
imports: from collections import namedtuple
  import dgl
  from pandas.api.types import is_categorical, is_categorical_dtype, is_numeric_dtype
label_desc: Use image node_id 2 for calling the PandasGraphBuilder obj's underlying member method code with example usage: obj.add_entities(entity_table, primary_key, name) without return types