Source code for vivainsights.network_summary
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See LICENSE.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
"""
Summarize node centrality statistics from an igraph network object.
"""
__all__ = ['network_summary']
from igraph import *
import igraph as ig
import pandas as pd
import matplotlib.pyplot as plt
[docs]
def network_summary(graph, hrvar = None, return_type = "table"):
"""
Summarise node centrality statistics from an igraph object.
Parameters
----------
graph : igraph.Graph
Graph object returned from ``network_g2g()`` or ``network_p2p()``
with ``return_type="network"``.
hrvar : str, optional
HR variable by which to split metrics. Defaults to ``None``.
return_type : str
Type of output to return. Valid values:
- ``"table"`` (default): summary DataFrame.
- ``"network"``: igraph object with centrality attributes added.
- ``"plot"``: (not yet implemented).
Returns
-------
pandas.DataFrame or igraph.Graph
DataFrame with columns ``betweenness``, ``closeness``, ``degree``,
``eigenvector``, and ``pagerank``; or the enriched igraph object.
Examples
--------
Return centrality metrics as a table:
>>> import vivainsights as vi
>>> graph = vi.network_g2g(data=vi.load_g2g_data(), return_type="network")
>>> vi.network_summary(graph, hrvar="Organization", return_type="table")
Return the enriched igraph network object:
>>> vi.network_summary(graph, hrvar="Organization", return_type="network")
"""
#calculate summary table
sum_tb = pd.DataFrame({
"node_id": graph.vs["name"],
"betweenness": graph.betweenness(),
"closeness": graph.closeness(),
"degree": graph.degree(),
"eigenvector": graph.evcent(),
"pagerank": graph.pagerank()
})
if(hrvar is not None):
sum_tb['hrvar'] = graph.vs[hrvar]
# graph = graph.simplify() # Note: NOT simplified as simplification may remove too many edges
if return_type == "table":
return sum_tb #return table
elif return_type == "network":
graph.vs["betweenness"] = sum_tb["betweenness"]
graph.vs["closeness"] = sum_tb["closeness"]
graph.vs["degree"] = sum_tb["degree"]
graph.vs["eigenvector"] = sum_tb["eigenvector"]
graph.vs["pagerank"] = sum_tb["pagerank"]
return graph #return network
elif return_type == "plot":
if hrvar is None:
raise ValueError("Visualisation options currently only available when a valid HR attribute is supplied.")
else:
return #TODO: return plot
else:
raise ValueError("Invalid input to `return`")