693 lines
59 KiB
Text
693 lines
59 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Network Analysis"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import networkx as nx\n",
|
|
"from networkx.drawing.nx_agraph import graphviz_layout\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"import dzcnapy_plotlib as dzcnapy\n",
|
|
"import csv\n",
|
|
"import math\n",
|
|
"import collections as coll\n",
|
|
"from networkx.algorithms import community as com\n",
|
|
"import community as lou\n",
|
|
"\n",
|
|
"# Importazione dataset\n",
|
|
"with open(\"dataset.csv\") as infile:\n",
|
|
" csv_reader = csv.reader(infile)\n",
|
|
" G = nx.Graph(csv_reader)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Nodes, Edges, Density"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"#Nodes: 37702\n",
|
|
"#Edges: 289004\n",
|
|
"#Edges if graph was a full mesh: 710701551\n",
|
|
"Density: 0.04%\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Nodi, Archi, Densità\n",
|
|
"numNodes = G.number_of_nodes()\n",
|
|
"numEdges = G.number_of_edges()\n",
|
|
"allEdges = int(numNodes * (numNodes-1) / 2)\n",
|
|
"density = nx.density(G) * 100\n",
|
|
" \n",
|
|
"# constants\n",
|
|
"N = numNodes\n",
|
|
"M = int(numEdges / numNodes)\n",
|
|
"\n",
|
|
"print(\"#Nodes:\", numNodes)\n",
|
|
"print(\"#Edges:\", numEdges)\n",
|
|
"print(\"#Edges if graph was a full mesh:\", allEdges)\n",
|
|
"print(\"Density: %.2f%%\" % density)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Detecting and removing self-loops"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"#Self-loops: 0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"ns = G.number_of_selfloops()\n",
|
|
"print(\"#Self-loops:\", ns)\n",
|
|
"\n",
|
|
"if ns > 0:\n",
|
|
" # removing self-loops\n",
|
|
" G.remove_edges_from(G.selfloop_edges())\n",
|
|
" print(\"#Edges without self-loops:\", G.number_of_edges())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Detecting and removing isolates"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"#isolates: 0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"ni = nx.number_of_isolates(G)\n",
|
|
"print(\"#isolates:\", ni)\n",
|
|
"\n",
|
|
"if ni > 0:\n",
|
|
" # remove isolates\n",
|
|
" G.remove_nodes_from(nx.isolates(G))\n",
|
|
" print(\"#Nodes without isolates\", G.number_of_nodes())\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Degree"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Average, variance and standard deviation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Average degree: 15.33\n",
|
|
"Variance 6526.21\n",
|
|
"Standard deviation 80.78\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"avgDeg = (2*G.number_of_edges())/(G.number_of_nodes())\n",
|
|
"print(\"Average degree: %.2f\" % avgDeg)\n",
|
|
"\n",
|
|
"deg = [G.degree(n) for n in G.nodes]\n",
|
|
"var = np.var(deg)\n",
|
|
"devstd = math.sqrt(var)\n",
|
|
"\n",
|
|
"print(\"Variance {:.2f}\".format(var))\n",
|
|
"print(\"Standard deviation {:.2f}\".format(devstd))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Linear scale distribution"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"findfont: Font family ['Arial'] not found. Falling back to DejaVu Sans.\n",
|
|
"findfont: Font family ['Arial'] not found. Falling back to DejaVu Sans.\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Degree distribution\n",
|
|
"degrees = sorted([d for n, d in G.degree()], reverse=True)\n",
|
|
"degreeCount = coll.Counter(degrees)\n",
|
|
"x, y = zip(*degreeCount.items())\n",
|
|
"\n",
|
|
"plt.figure() \n",
|
|
"plt.plot(x, y, 'go-') \n",
|
|
"plt.xlabel('Degree')\n",
|
|
"plt.ylabel('Frequency')\n",
|
|
"plt.title('Degree Distribution') \n",
|
|
"plt.title('Degree Distribution with linear scale')\n",
|
|
"plt.savefig('plots/LinScaleDegreeDistr.png')\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Logarithmic scale distribution"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.scatter(x, y, s=50, c=\"green\")\n",
|
|
"plt.xlim(0.9, max(x))\n",
|
|
"plt.ylim(0.9, max(y))\n",
|
|
"plt.xscale('log')\n",
|
|
"plt.yscale('log')\n",
|
|
"plt.xlabel(\"Degree\")\n",
|
|
"plt.ylabel(\"Frequency\")\n",
|
|
"plt.title('Degree Distribution with logarithmic scale') \n",
|
|
"plt.savefig('plots/LogScaleDegreeDistr.png')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Clustering coefficient"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Transitivity coefficient of the network: 1.24%\n",
|
|
"Average clustering coefficient 0.17\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# TODO eseguire\n",
|
|
"\n",
|
|
"if False:\n",
|
|
" trans= nx.transitivity(G)*100\n",
|
|
" # fraction of triadic closures (closed triangles) found in the network\n",
|
|
" print(\"Transitivity coefficient of the network: %.2f%%\" %trans)\n",
|
|
"\n",
|
|
" # Clustering coefficient\n",
|
|
" acc = nx.average_clustering(G)\n",
|
|
" print (\"Average clustering coefficient {:.2f}\".format(acc))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Greatest Connected Component "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"numCC = nx.number_connected_components(G)\n",
|
|
"gcc = max(nx.connected_component_subgraphs(G), key=len)\n",
|
|
"\n",
|
|
"# TODO eseguire\n",
|
|
"\n",
|
|
"if False:\n",
|
|
" nodesGcc = Gcc.nodes()\n",
|
|
" edgesGcc = Gcc.edges()\n",
|
|
" nx.write_graphml(Gcc, \"graphs/GCC.graphml\");\n",
|
|
"\n",
|
|
" print(\"Numero di componenti connesse:\", numCC)\n",
|
|
" print(\"Numero nodi GCC:\", len(nodesGcc))\n",
|
|
" print(\"Numero archi GCC:\", len(edgesGcc))\n",
|
|
" print(\"Percentuale di nodi sul totale %.2f%%:\" %(len(nodesGcc)/len(G.nodes())*100))\n",
|
|
" print(\"Percentuale di archi sul totale %.2f%%:\" %(len(edgesGcc)/len(G.edges())*100))\n",
|
|
" print(\"Densità: {:.2f}\".format(nx.density(Gcc) * 100))\n",
|
|
" print(\"Distanza media: {:.2f}\".format(nx.average_shortest_path_length(Gcc)))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Distanze GCC"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-13-e177362aa0f9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mrow\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgcc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mnodeDists\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msingle_source_shortest_path_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgcc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;31m#if i%1000 == 0:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# print(i)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/shortest_paths/unweighted.py\u001b[0m in \u001b[0;36msingle_source_shortest_path_length\u001b[0;34m(G, source, cutoff)\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0mcutoff\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'inf'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0mnextlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_single_shortest_path_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnextlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcutoff\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/shortest_paths/unweighted.py\u001b[0m in \u001b[0;36m_single_shortest_path_length\u001b[0;34m(adj, firstlevel, cutoff)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mseen\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0mseen\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;31m# set the level of vertex v\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0mnextlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madj\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# add neighbors of v\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/classes/coreviews.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_atlas\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_atlas\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# TODO eseguire\n",
|
|
"\n",
|
|
"distDict = {}\n",
|
|
"#i=1\n",
|
|
"row = []\n",
|
|
"for n in gcc.nodes():\n",
|
|
" nodeDists = nx.single_source_shortest_path_length(gcc,n)\n",
|
|
" #if i%1000 == 0:\n",
|
|
" # print(i)\n",
|
|
" \n",
|
|
" for d in nodeDists:\n",
|
|
" #if (int(d) in marked):\n",
|
|
" # continue\n",
|
|
" if nodeDists[d] in distDict:\n",
|
|
" distDict[nodeDists[d]] = distDict[nodeDists[d]] + 1\n",
|
|
" else:\n",
|
|
" distDict[nodeDists[d]] = 1\n",
|
|
" row.append(nodeDists[d])\n",
|
|
" #i += 1\n",
|
|
"\n",
|
|
"distDict.pop(0)\n",
|
|
"\n",
|
|
"avgDist, cnt = zip(*distDict.items()) \n",
|
|
"\n",
|
|
"plt.bar(avgDist, cnt, width=0.3, color='b')\n",
|
|
"plt.title(\"Distance Distribution for G\")\n",
|
|
"plt.ylabel(\"Frequency\")\n",
|
|
"plt.xlabel(\"Shortest Path Distance\")\n",
|
|
"#plt.savefig('plots/DistDistributionGlobal.png')\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### GCC Eccentricity - Diameter - Radius - Center - Periphery "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-15-edc2c6347a7b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m#Eccentricity\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mecc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meccentricity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgcc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# Adding eccentricity data to gcc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mecc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/distance_measures.py\u001b[0m in \u001b[0;36meccentricity\u001b[0;34m(G, v, sp)\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnbunch_iter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msp\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 226\u001b[0;31m \u001b[0mlength\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnetworkx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msingle_source_shortest_path_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 227\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlength\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/shortest_paths/unweighted.py\u001b[0m in \u001b[0;36msingle_source_shortest_path_length\u001b[0;34m(G, source, cutoff)\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[0mcutoff\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'inf'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0mnextlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_single_shortest_path_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnextlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcutoff\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/shortest_paths/unweighted.py\u001b[0m in \u001b[0;36m_single_shortest_path_length\u001b[0;34m(adj, firstlevel, cutoff)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mseen\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0mseen\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;31m# set the level of vertex v\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0mnextlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madj\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# add neighbors of v\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/classes/coreviews.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_atlas\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_atlas\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"#Eccentricity\n",
|
|
"ecc = nx.eccentricity(gcc)\n",
|
|
"\n",
|
|
"# Adding eccentricity data to gcc\n",
|
|
"for k in ecc.keys():\n",
|
|
" Gcc.node[k]['eccentricity'] = ecc.get(k)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"diameterGcc = nx.diameter(gcc, ecc)\n",
|
|
"radiusGcc = nx.radius(gcc, ecc)\n",
|
|
"centerGcc = nx.center(gcc, e=ecc)\n",
|
|
"peripheryGcc = nx.periphery(gcc, e=ecc)\n",
|
|
"\n",
|
|
"print (\"Diameter GCC:\", diameterGcc)\n",
|
|
"print (\"Radius GCC\", radiusGcc)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#Adding data to gcc\n",
|
|
"nx.set_node_attributes(gcc, 0, 'center')\n",
|
|
"nx.set_node_attributes(gcc, 0, 'periphery')\n",
|
|
"\n",
|
|
"for v in range(len(centerGcc)):\n",
|
|
" gcc.node[centerGcc[v]][\"center\"] = 1\n",
|
|
"\n",
|
|
"for v in range(len(peripheryGcc)):\n",
|
|
" gcc.node[peripheryGcc[v]][\"periphery\"] = 1\n",
|
|
" \n",
|
|
"nx.write_graphml(gcc, \"graphs/GccEcc.graphml\");"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Distanze"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Distanza media su tutta la rete\n",
|
|
"distDict = {}\n",
|
|
"#i=1\n",
|
|
"#marked = set()\n",
|
|
"row = []\n",
|
|
"for n in G.nodes():\n",
|
|
" nodeDists = nx.single_source_shortest_path_length(G,n)\n",
|
|
" #if i%1000 == 0:\n",
|
|
" # print(i)\n",
|
|
" \n",
|
|
" for d in nodeDists:\n",
|
|
" #if (int(d) in marked):\n",
|
|
" # continue\n",
|
|
" if nodeDists[d] in distDict:\n",
|
|
" distDict[nodeDists[d]] = distDict[nodeDists[d]] + 1\n",
|
|
" else:\n",
|
|
" distDict[nodeDists[d]] = 1\n",
|
|
" row.append(nodeDists[d])\n",
|
|
" #i += 1\n",
|
|
" #marked.add(int(n))\n",
|
|
"\n",
|
|
"avgShortPathG = np.average(row)\n",
|
|
"distDict.pop(0)\n",
|
|
"\n",
|
|
"avgDist, cnt = zip(*distDict.items()) \n",
|
|
"\n",
|
|
"print(\"Average Distance {:.2f}\".format(avgShortPathG))\n",
|
|
"\n",
|
|
"plt.bar(avgDist, cnt, width=0.3, color='b')\n",
|
|
"plt.title(\"Distance Distribution for G\")\n",
|
|
"plt.ylabel(\"Frequency\")\n",
|
|
"plt.xlabel(\"Shortest Path Distance\")\n",
|
|
"plt.savefig('plots/DistDistributionGlobal.png')\n",
|
|
"plt.show()\n",
|
|
"\n",
|
|
"\n",
|
|
"#print(\"Numero componenti connesse:\", nx.number_connected_components(G))\n",
|
|
"#print(\"Distanza media:\", nx.average_shortest_path_length(G))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Degree correlation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# The following code fragment calculates the dictionary and separates the keys and values into \n",
|
|
"# two lists my_degree and their_degree:\n",
|
|
"\n",
|
|
"my_degree, their_degree = zip(*nx.average_degree_connectivity(G).items())\n",
|
|
"\n",
|
|
"plt.scatter(my_degree, their_degree, s=50, c=\"b\",)\n",
|
|
"plt.xscale('log')\n",
|
|
"plt.yscale('log')\n",
|
|
"plt.xlabel(\"k\")\n",
|
|
"plt.ylabel(\"$k_{nn}(k)$\")\n",
|
|
"plt.savefig('plots/Assortativity.png')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Communities"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### 4-Clique Communities"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Clique computed\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-5-42a7882a13fe>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Clique computed\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mlClique\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcommK\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mlClique\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/.local/lib64/python3.6/site-packages/networkx/algorithms/community/kclique.py\u001b[0m in \u001b[0;36mk_clique_communities\u001b[0;34m(G, k, cliques)\u001b[0m\n\u001b[1;32m 67\u001b[0m \u001b[0mperc_graph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_nodes_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcliques\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclique\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcliques\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 69\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0madj_clique\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_get_adjacent_cliques\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclique\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmembership_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 70\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclique\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madj_clique\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0mperc_graph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_edge\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclique\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0madj_clique\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"commK = com.k_clique_communities(G, 4)\n",
|
|
"\n",
|
|
"print(\"Clique computed\")\n",
|
|
"lClique = 0\n",
|
|
"for i,cl in enumerate(commK):\n",
|
|
" lClique += 1\n",
|
|
" for n in cl:\n",
|
|
" G.node[n][\"kClique\"] = i+1\n",
|
|
" \n",
|
|
"print(\"Numero 4-Clique communities: \", lClique)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Modularity based communities (Louvain)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"part = lou.best_partition(G)\n",
|
|
"mod = lou.modularity(part,G)\n",
|
|
"\n",
|
|
"part_as_seriesG = pd.Series(part)\n",
|
|
"part_as_seriesG.sort_values()\n",
|
|
"part_as_seriesG.value_counts() \n",
|
|
"\n",
|
|
"print(\"Numero Louvain communities: \", part_as_seriesG.value_counts().size)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#Saving Communities Attribute\n",
|
|
"nx.set_node_attributes(G, 0, 'LvnG')\n",
|
|
"for k in part.keys():\n",
|
|
" part[k]+= 1\n",
|
|
"\n",
|
|
"for i in part.keys():\n",
|
|
" G.node[i][\"LvnG\"] = part.get(i)\n",
|
|
"\n",
|
|
"nx.write_graphml(G, \"graphs/GComm.graphml\");"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Centralities"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dgr = nx.degree_centrality(G)\n",
|
|
"clo = nx.closeness_centrality(G)\n",
|
|
"har = nx.harmonic_centrality(G)\n",
|
|
"eig = nx.eigenvector_centrality(G)\n",
|
|
"bet = nx.betweenness_centrality(G)\n",
|
|
"pgr = nx.pagerank(G)\n",
|
|
"hits = nx.hits(G)\n",
|
|
"\n",
|
|
"centralities = pd.concat(\n",
|
|
" [pd.Series(c) for c in (hits[1], eig, pgr, har, clo, hits[0], dgr, bet)],\n",
|
|
" axis=1)\n",
|
|
"\n",
|
|
"centralities.columns = (\"Authorities\", \"Eigenvector\", \"PageRank\",\n",
|
|
" \"Harmonic Closeness\", \"Closeness\", \"Hubs\",\n",
|
|
" \"Degree\", \"Betweenness\")\n",
|
|
"centralities[\"Harmonic Closeness\"] /= centralities.shape[0]\n",
|
|
"\n",
|
|
"# Calculate the correlations for each pair of centralities\n",
|
|
"c_df = centralities.corr()\n",
|
|
"ll_triangle = np.tri(c_df.shape[0], k=-1)\n",
|
|
"c_df *= ll_triangle\n",
|
|
"c_series = c_df.stack().sort_values()\n",
|
|
"c_series.tail()"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.6.9"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|