forked from concatto/ttc-univali
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommunity_detection.py
54 lines (40 loc) · 1.44 KB
/
community_detection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import networkx as nx
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from modularitydensity import metrics
from modularitydensity.fine_tuned_modularity import fine_tuned_clustering_q
from modularitydensity.fine_tuned_modularity_density import fine_tuned_clustering_qds
def detect(rel_df, resolution=0.0):
df = rel_df.copy(deep=True)
df = df.rename(mapper=lambda name: name.lower(), axis='columns')
G_original = nx.from_pandas_edgelist(df, edge_attr=['weight', 'change'])
G = nx.relabel.convert_node_labels_to_integers(G_original)
# Ensure everyone is present, even if no edge points towards them
# if nodes is not None:
# for node in nodes:
# if G.has_node(node) == False:
# G.add_node(node)
adj = nx.to_scipy_sparse_matrix(G)
density = False
c = None
if density:
c = fine_tuned_clustering_qds(G)
else :
c = fine_tuned_clustering_q(G, r=resolution)
Q = metrics.modularity_r(adj, c, np.unique(c), r=resolution)
D = metrics.modularity_density(adj, c, np.unique(c))
print("Communities:", c)
print("#comms: ", len(np.unique(c)), 'given by', np.unique(c))
print("Modularity Q:", Q)
print("Modularity D:", D)
print("Mode: ", 'D' if density else 'Q')
for i, node in enumerate(G_original.nodes()):
G_original.add_node(node, modularity_class=str(c[i]))
# print(G_original.nodes())
return {
'graph': G_original,
'communities': c,
'Q': Q,
'D': D,
}