code: def unifrac(self, weighted=True, rank="auto"):
          
          # needs read counts, not relative abundances
          if self._guess_normalized():
              raise OneCodexException("UniFrac requires unnormalized read counts.")
  
          df = self.to_df(rank=rank, normalize=False)
  
          counts = []
          for c_id in df.index:
              counts.append(df.loc[c_id].tolist())
  
          tax_ids = df.keys().tolist()
  
          tree = self.tree_build()
          tree = self.tree_prune_rank(tree, rank=df.ocx_rank)
  
          # there's a bug (?) in skbio where it expects the root to only have
          # one child, so we do a little faking here
          from skbio.tree import TreeNode
  
          new_tree = TreeNode(name="fake root")
          new_tree.rank = "no rank"
          new_tree.append(tree)
  
          # then finally run the calculation and return
          if weighted:
              return skbio.diversity.beta_diversity(
                  "weighted_unifrac", counts, df.index.tolist(), tree=new_tree, otu_ids=tax_ids
              )
          else:
              return skbio.diversity.beta_diversity(
                  "unweighted_unifrac", counts, df.index.tolist(), tree=new_tree, otu_ids=tax_ids
              )
docs: A beta diversity metric that takes into account the relative relatedness of community
          members. Weighted UniFrac looks at abundances, unweighted UniFrac looks at presence.
  
          Parameters
          ----------
          weighted : `bool`
              Calculate the weighted (True) or unweighted (False) distance metric.
          rank : {'auto', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species'}, optional
              Analysis will be restricted to abundances of taxa at the specified level.
  
          Returns
          -------
          skbio.stats.distance.DistanceMatrix, a distance matrix.