{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from collections import Counter\n", "import networkx as nx\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data-driven Business and Behaviour Analytics (DBBA)\n", "# Tutorial: 2 - Paths, directed paths and connected components" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Paths\n", "By definition, a __path__ in an undirected network is a sequence of edges connecting two nodes. Let's see in a simple plot!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.Graph()\n", "\n", "G.add_nodes_from([\"Mark\", \"John\", \"Theresa\", \"Patrick\"])\n", "\n", "G.add_edges_from([(\"Mark\",\"John\"),(\"John\",\"Theresa\"),(\"Mark\",\"Theresa\"),(\"Mark\",\"Patrick\")])\n", "\n", "nx.draw(G, with_labels=True,\n", " node_size=1000,\n", " font_size=20)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.has_path(G, \"Mark\", \"Patrick\") # we check that a path exists between Mark and Patrick" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generally speaking, the paths between nodes are not unique as we could cover the same links in cycle endlessly trying to reach the target node, that is why we are interested in more useful concepts. For instance, a __simple path__ is one without any cycles (i.e., paths that go from one node back to itself)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['Theresa', 'John', 'Mark', 'Patrick'], ['Theresa', 'Mark', 'Patrick']]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(nx.all_simple_paths(G, \"Theresa\", \"Patrick\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have just seen that more than one simple path are possible between two nodes in our network. Often, it is of interest to compute or to consider the one consisting of the smallest number of edges. In a word, we want to compute the __shortest path__." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Theresa', 'Mark', 'Patrick']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.shortest_path(G, \"Theresa\", \"Patrick\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead, if we need its length only, we can use another function, `shortest_path_length()`. Note: in network science, the path length is defined as the number of links, not of the nodes, which implies\n", "\n", " nx.shortest_path_length(G, u, v) == len(nx.shortest_path(G, u, v)) - 1\n", " \n", "for nodes ***u*** and ***v***." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.shortest_path_length(G, \"Theresa\", \"Patrick\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connectedness\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far, we considered only networks in which any pair of nodes is connected by a path. Unsurprisingly, this kind of network is called __connected__ and NetworkX provides a method to check this property." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.is_connected(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It can happen that for two nodes in a network there is no path connecting them." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G_not_connected = nx.Graph()\n", "\n", "G_not_connected.add_nodes_from((1,2,3, 7))\n", "G_not_connected.add_edge(2,3)\n", "G_not_connected.add_edge(4,5)\n", "G_not_connected.add_edge(7,5)\n", "\n", "nx.draw(G_not_connected, with_labels=True)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.is_connected(G_not_connected)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because there is no unique component, we can investigate further the number and the structure of the different components." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.number_connected_components(G_not_connected)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1} , then with dimension: 1\n", "{2, 3} , then with dimension: 2\n", "{4, 5, 7} , then with dimension: 3\n" ] } ], "source": [ "components = list(nx.connected_components(G_not_connected))\n", "for i in components:\n", " print(i, \", then with dimension:\", len(i))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the most significative analysis is usually performed by taking into account the largest component. Now, we can use the `max()` function (which thanks to `key=len` sorts with respect to the length of the components) to get the component with the largest number of nodes." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "largest_component = max(nx.connected_components(G_not_connected), key=len)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To better analyse the largest component, we can build a subgraph of the original network induced by the nodes from the first component." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "induced_subgraph = G_not_connected.subgraph(largest_component)\n", "\n", "nx.draw(induced_subgraph, with_labels=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Paths and components in directed networks\n", "\n", "Likewise, we can operate in directed networks. Here the relationships are not symmetrical and therefore any kind of path must follow the forward direction." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "D = nx.DiGraph()\n", "\n", "D.add_edges_from([\n", " (\"Frankfurt\",\"Stansted\"),\n", " (\"Stansted\",\"Madrid\"),\n", " (\"Rome\",\"Frankfurt\"), (\"Helsinki\",\"Rome\"), (\"Stansted\",\"Paris\"),\n", " (\"Rome\",\"Paris\"), (\"Helsinki\",\"Paris\"), (\"Paris\",\"Frankfurt\")\n", "])\n", "\n", "nx.draw(D, with_labels=True, \n", " node_size=1000,\n", " font_size=20)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.has_path(D, \"Paris\", \"Frankfurt\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.has_path(D, \"Frankfurt\", \"Rome\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And NetworkX will raise an error if you ask for a path between nodes where none exists:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "ename": "NetworkXNoPath", "evalue": "No path between Frankfurt and Rome.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNetworkXNoPath\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mnx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshortest_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mD\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"Frankfurt\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"Rome\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\stats\\lib\\site-packages\\networkx\\algorithms\\shortest_paths\\generic.py\u001b[0m in \u001b[0;36mshortest_path\u001b[1;34m(G, source, target, weight, method)\u001b[0m\n\u001b[0;32m 158\u001b[0m \u001b[1;31m# Find shortest source-target path.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 159\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"unweighted\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 160\u001b[1;33m \u001b[0mpaths\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbidirectional_shortest_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mG\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msource\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 161\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"dijkstra\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 162\u001b[0m \u001b[0mpaths\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdijkstra_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mG\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msource\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\stats\\lib\\site-packages\\networkx\\algorithms\\shortest_paths\\unweighted.py\u001b[0m in \u001b[0;36mbidirectional_shortest_path\u001b[1;34m(G, source, target)\u001b[0m\n\u001b[0;32m 222\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 223\u001b[0m \u001b[1;31m# call helper to do the real work\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 224\u001b[1;33m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_bidirectional_pred_succ\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mG\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msource\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 225\u001b[0m \u001b[0mpred\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msucc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mresults\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 226\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\stats\\lib\\site-packages\\networkx\\algorithms\\shortest_paths\\unweighted.py\u001b[0m in \u001b[0;36m_bidirectional_pred_succ\u001b[1;34m(G, source, target)\u001b[0m\n\u001b[0;32m 290\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mpred\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msucc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 291\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 292\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mnx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mNetworkXNoPath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"No path between {source} and {target}.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 293\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 294\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNetworkXNoPath\u001b[0m: No path between Frankfurt and Rome." ] } ], "source": [ "nx.shortest_path(D, \"Frankfurt\", \"Rome\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Moving from undirected network to __directed__ ones, the concept of connectivity becomes more sophisticated. The __strong__ version means that a directed path (i.e., a path following the edge directin) exists for any two nodes." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.is_strongly_connected(D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead, the __weak connectivity__ considers any path between nodes, regardless of edge direction." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.is_weakly_connected(D)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "import networkx as nx\n", "import pandas as pd\n", "exposuredf=pd.read_csv('/Users/valerio/Desktop/DBBA/Tutorials/Datasets/exposure_dataset.csv')\n", "G = nx.from_pandas_edgelist(exposuredf, edge_attr='weight', create_using=nx.DiGraph())" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx.is_weakly_connected(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# **EXERCISE 1**\n", "\n", "The file \"exposure_dataset.csv\" contains data on the aggregated banking exposure between countries. The weights represent the amount of money that banks from a country loaned to banks from another country.\n", "\n", "1.a Filter the network by removing edges whose weight is less than 1000. \\\n", "1.b Compute the density of the network. \\\n", "1.c Does there exist a path in the network between every possible pair of countries? \\\n", "1.d Repeat points 1.a, 1.b, and 1.c but this time remove all weights less than 100000. \\\n", "1.e Discuss these results." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# **EXERCISE 2**\n", "\n", "Answer the following questions:\n", "\n", "2.a If you are heavily invested in Australian bonds, should you worry about the economic situation in Spain? \\\n", "2.b You want to invest in the Korean economy. Which countries should you closely monitor before doing so?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.13" } }, "nbformat": 4, "nbformat_minor": 4 }