docs: def _set(self, path, value, build_dir=''):
          """Create and set a node by path
  
          This creates a node from a filename or pandas DataFrame.
  
          If `value` is a filename, it must be relative to `build_dir`.
              `value` is stored as the export path.
  
          `build_dir` defaults to the current directory, but may be any
              arbitrary directory path, including an absolute path.
  
          Example:
              # Set `pkg.graph_image` to the data in '/home/user/bin/graph.png'.
              # If exported, it would export to '<export_dir>/bin/graph.png'
              `pkg._set(['graph_image'], 'bin/fizz.bin', '/home/user')`
  
          :param path:  Path list -- I.e. ['examples', 'new_node']
          :param value:  Pandas dataframe, or a filename relative to build_dir
          :param build_dir:  Directory containing `value` if value is a filename.
          """
          assert isinstance(path, list) and len(path) > 0
  
          if isinstance(value, pd.DataFrame):
              metadata = {SYSTEM_METADATA: {'target': TargetType.PANDAS.value}}
          elif isinstance(value, np.ndarray):
              metadata = {SYSTEM_METADATA: {'target': TargetType.NUMPY.value}}
          elif isinstance(value, string_types + (bytes,)):
              # bytes -> string for consistency when retrieving metadata
              value = value.decode() if isinstance(value, bytes) else value
              if os.path.isabs(value):
                  raise ValueError("Invalid path: expected a relative path, but received {!r}".format(value))
              # Security: filepath does not and should not retain the build_dir's location!
              metadata = {SYSTEM_METADATA: {'filepath': value, 'transform': 'id'}}
              if build_dir:
                  value = os.path.join(build_dir, value)
          else:
              accepted_types = tuple(set((pd.DataFrame, np.ndarray, bytes) + string_types))
              raise TypeError("Bad value type: Expected instance of any type {!r}, but received type {!r}"
                              .format(accepted_types, type(value)), repr(value)[0:100])
  
          for key in path:
              if not is_nodename(key):
                  raise ValueError("Invalid name for node: {}".format(key))
  
          node = self
          for key in path[:-1]:
              child = node._get(key)
              if not isinstance(child, GroupNode):
                  child = GroupNode({})
                  node[key] = child
  
              node = child
  
          key = path[-1]
          node[key] = DataNode(None, None, value, metadata)