"""Implements additional analysis algorithms for communities."""importpandasaspdimportnumpyasnpfrommicom.utilimportload_modelfrommicom.loggerimportlogger
[docs]defjaccard(inclusion):"""Calculate jaccard distances for a community."""logger.info("calculating jaccard distance for {}x{} input matrix".format(*inclusion.shape))jaccard=np.apply_along_axis(lambdaa:(a&inclusion).sum(1),1,inclusion)jaccard=jaccard/np.apply_along_axis(lambdaa:(a|inclusion).sum(1),1,inclusion)return1-jaccard
[docs]defeuclidean(inclusion):"""Calculate euclidean distances for a community."""logger.info("calculating euclidean distance for {}x{} input matrix".format(*inclusion.shape))euclidean=np.apply_along_axis(lambdaa:((a-inclusion)**2).sum(1),1,inclusion)returnnp.sqrt(euclidean)
[docs]defreaction_matrix(files):"""Create a matrix of reactions x models."""ids=[]forfinfiles:model=load_model(f)ids.extend([(r.id,model.name)forrinmodel.reactions])rlist=pd.DataFrame(ids,columns=["reaction","id"])rlist["value"]=1rlist=rlist.pivot_table(values="value",index="id",columns="reaction")returnrlist.fillna(0).astype(int)
[docs]defmetabolic_dist(reactions,metric=jaccard):"""Calculate the metabolic distances between all members."""rids=[(r.global_id,r.community_id)forrinreactions]rlist=pd.DataFrame(rids,columns=["reaction","id"])rlist["value"]=1rlist=rlist.pivot_table(values="value",index="id",columns="reaction")inclusion=rlist.fillna(0).astype(int).valuesdists=metric(inclusion)returnpd.DataFrame(dists,index=rlist.index,columns=rlist.index)