def _project_NK(self,side):
"""
Builds the projection of the bipartite network on to the chosen side.
The projection is done using the NK conditional probability.
Parameters
----------
side : int or str
Tags for each side of the bipartite network.
"""
self._check_side(side)
aside = self.side if side == self.aside else self.aside
E = self.recombination_ease(aside)
net = self.edges(as_df=True)[[side,aside]]
nodes = merge(E,net).groupby(side).sum()[['E']].reset_index().reset_index().rename(columns={'index':side+'_index'})
dis = merge(E,merge(net,net,how='inner',left_on=aside,right_on=aside))
dis = dis.groupby([side+'_x',side+'_y']).sum()[['E']].reset_index().rename(columns={'E':'E_both'})
dis = merge(dis,nodes,how='left',right_on=side,left_on=side+'_x').drop(side,1)
dis = merge(dis,nodes,how='left',right_on=side,left_on=side+'_y').drop(side,1)
dis = dis[dis[side+'_index_x']>dis[side+'_index_y']].drop([side+'_index_x',side+'_index_y'],1)
dis['p_x'] = dis['E_both']/dis['E_x'].astype(float)
dis['p_y'] = dis['E_both']/dis['E_y'].astype(float)
dis['fi'] = dis[['p_x','p_y']].min(1)
dis = dis[[side+'_x',side+'_y','fi']]
self.P[side] = gGraph(node_id=side)
self.P[side].add_weighted_edges_from([val[1:] for val in dis.itertuples()])
nodes = merge(self.P[side].nodes(as_df=True),self.nodes(side,as_df=True),how='left')
properties = nodes.columns.values.tolist()
properties.remove(side)
for prop in properties:
values = dict(zip(nodes[side].values,nodes[prop].values))
set_node_attributes(self.P[side],prop,values)
评论列表
文章目录