Source code for metrics.nodes
import pandas as pd
import networkx as nx
from typing import Any, Dict, List, Tuple
[docs]
class NodeMetrics:
"""Handles node-level metric calculations."""
[docs]
def extract_node_metrics(dpg_model, nodes_list: List[Tuple]) -> Any:
"""Compute per-node graph metrics for a DPG model.
Args:
dpg_model: NetworkX DiGraph representing the DPG.
nodes_list: List of ``(node_id, label)`` tuples.
Returns:
DataFrame with columns ``['Node', 'Label', 'Degree', 'In degree nodes',
'Out degree nodes', 'Betweenness centrality', 'Local reaching centrality']``.
"""
in_nodes = {}
out_nodes = {}
degree = {}
for node in dpg_model.nodes():
in_nodes[node] = dpg_model.in_degree(node)
out_nodes[node] = dpg_model.out_degree(node)
degree[node] = in_nodes[node] + out_nodes[node]
sample_size = int(1 * len(dpg_model.nodes()))
betweenness_centrality = nx.betweenness_centrality(dpg_model, k=sample_size, normalized=True, weight='weight', endpoints=False)
local_reaching_centrality = {node: nx.local_reaching_centrality(dpg_model, node, weight='weight') for node in dpg_model.nodes()}
data_node = {
"Node": list(dpg_model.nodes()),
"Degree": list(degree.values()),
"In degree nodes": list(in_nodes.values()),
"Out degree nodes": list(out_nodes.values()),
"Betweenness centrality": list(betweenness_centrality.values()),
"Local reaching centrality": list(local_reaching_centrality.values()),
}
df_data_node = pd.DataFrame(data_node).set_index('Node')
df_nodes_list = pd.DataFrame(nodes_list, columns=["Node", "Label"]).set_index('Node')
return pd.concat([df_data_node, df_nodes_list], axis=1, join='inner').reset_index()