def _project_CP(self,side):
"""
Builds the projection of the bipartite network on to the chosen side.
The projection is done using 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
net = self.edges(as_df=True)[[side,aside]]
dis = merge(net,net,how='inner',left_on=aside,right_on=aside).groupby([side+'_x',side+'_y']).count().reset_index().rename(columns={aside:'n_both'})
nodes = merge(self.nodes(side,as_df=True)[[side]].reset_index().rename(columns={'index':side+'_index'}),DataFrame(self.degree(side).items(),columns=[side,'n']))
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['n_both']/dis['n_x'].astype(float)
dis['p_y'] = dis['n_both']/dis['n_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)
评论列表
文章目录