docs: def add_dataframe(df, name, pkg=None, description=''):
      """Add a dataframe to a source package. Pass in either the name of the dataframe, or the dataframe.
      If the dataframeis passed it, the name will be the dataframe's variable name. The function
      will re-write the source package with the new resource.
  
      """
      from warnings import warn
      from metapack.cli.core import alt_col_name, type_map
      import numpy as np
  
      if name is None or df is None:
          warn("Did not find dataframe for reference '{}' ".format(ref))
          return
  
      pkg = pkg or open_source_package()
  
      resource_ref = 'file:' + get_notebook_rel_path(pkg) + '#' + name
  
      t = pkg.find_first('Root.Datafile', value=resource_ref)
      col_props = {}
  
      if t:
          print("Datafile exists for url '{}', deleting".format(resource_ref))
  
          if t.schema_term:
              col_props = { c['name']:c for c in t.columns()}
              pkg.remove_term(t.schema_term)
  
          pkg.remove_term(t)
  
      t = pkg['Resources'].new_term('Root.Datafile', resource_ref, name=name, description=description)
  
      st = pkg['Schema'].new_term('Table', t.schema_name, description=description)
  
      for i, name in enumerate(df.columns):
  
          props = col_props.get(name,{})
  
          try:
              native_type = type(np.asscalar(df[name].dtype.type(0))).__name__
          except ValueError:
              native_type = df[name].dtype.name
          except AttributeError:
              native_type = type(df[name][0]).__name__
  
          for pn in 'datatype name pos header'.split():
              if pn in props:
                  del props[pn]
  
          if 'altname' in props:
              altname = props['altname']
              del props['altname']
          else:
              raw_alt_name = alt_col_name(name, i)
              altname = raw_alt_name if raw_alt_name != name else ''
  
          col = df[name]
  
          if hasattr(col, 'description'):  # custom property
              props['description'] = col.description
  
          t = st.new_child('Column', name,
                              datatype=type_map.get(native_type, native_type),
                              altname=altname,
                              **props)
  
  
      pkg.write_csv()