Source code for micom.algorithms

"""Implements additional analysis algorithms for communities."""

import pandas as pd
import numpy as np
from micom.util import load_model
from micom.logger import logger


[docs] def jaccard(inclusion): """Calculate jaccard distances for a community.""" logger.info( "calculating jaccard distance for {}x{} input matrix".format(*inclusion.shape) ) jaccard = np.apply_along_axis(lambda a: (a & inclusion).sum(1), 1, inclusion) jaccard = jaccard / np.apply_along_axis( lambda a: (a | inclusion).sum(1), 1, inclusion ) return 1 - jaccard
[docs] def euclidean(inclusion): """Calculate euclidean distances for a community.""" logger.info( "calculating euclidean distance for {}x{} input matrix".format(*inclusion.shape) ) euclidean = np.apply_along_axis( lambda a: ((a - inclusion) ** 2).sum(1), 1, inclusion ) return np.sqrt(euclidean)
[docs] def reaction_matrix(files): """Create a matrix of reactions x models.""" ids = [] for f in files: model = load_model(f) ids.extend([(r.id, model.name) for r in model.reactions]) rlist = pd.DataFrame(ids, columns=["reaction", "id"]) rlist["value"] = 1 rlist = rlist.pivot_table(values="value", index="id", columns="reaction") return rlist.fillna(0).astype(int)
[docs] def metabolic_dist(reactions, metric=jaccard): """Calculate the metabolic distances between all members.""" rids = [(r.global_id, r.community_id) for r in reactions] rlist = pd.DataFrame(rids, columns=["reaction", "id"]) rlist["value"] = 1 rlist = rlist.pivot_table(values="value", index="id", columns="reaction") inclusion = rlist.fillna(0).astype(int).values dists = metric(inclusion) return pd.DataFrame(dists, index=rlist.index, columns=rlist.index)