-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhomofilia.py
69 lines (59 loc) · 2.18 KB
/
homofilia.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import networkx as nx
def contar_aristas(grafo):
contador = 0
for v in grafo:
contador += len(list(grafo.neighbors(v)))
return contador if nx.is_directed(grafo) else contador // 2
def proporcion_cruzan_campo(grafo, mapper=None):
"""
:param grafo:
:param mapper: un mapper de vertice a un tipo (por defecto, grafo[v])
:return: devuelve la proporcion real que se obtiene de cruces respecto del total de aristas
"""
aristas_totales = contar_aristas(grafo)
cruzan_bloque = 0
visitados = set()
mapper = mapper if mapper is not None else (lambda k: grafo[k]["type"])
for v in grafo:
for w in grafo.neighbors(v):
if not nx.is_directed(grafo) and w in visitados:
continue
if mapper(v) != mapper(w):
cruzan_bloque += 1
visitados.add(v)
return cruzan_bloque / aristas_totales
def proporcion_cruzan_campo_de_tipo(grafo, tipo, mapper=None):
"""
:param grafo:
:param tipo: por el cual se quiere calcular especificamente
:param mapper: un mapper de vertice a un tipo (por defecto, grafo[v])
:return: devuelve la proporcion real que se obtiene de cruces respecto del total de aristas,
de un tipo en particular (para ver si hay homofilia/segregacion por parte de un grupo en particular)
"""
cruzan_bloque = 0
visitados = set()
aristas = 0
mapper = mapper if mapper is not None else (lambda k: grafo[k]["type"])
for v in grafo:
if mapper(v) != tipo:
continue
for w in grafo.neighbors(v):
aristas += 1
if mapper(v) != mapper(w):
cruzan_bloque += 1
visitados.add(v)
return cruzan_bloque / aristas
def proporcion_por_tipo(grafo, mapper=None):
"""
:param grafo:
:param mapper: un mapper de vertice a un tipo (por defecto, grafo[v])
:return: la proporcion que hay de cada tipo
"""
mapper = mapper if mapper is not None else (lambda k: grafo[k]["type"])
cantidades = {}
for v in grafo:
cantidades[mapper(v)] = cantidades.get(mapper(v), 0) + 1
props = {}
for c in cantidades:
props[c] = cantidades[c] / len(grafo)
return props