{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# An Introduction to Graph Theory and Network Analysis\n",
    "\n",
    "- https://www.analyticsvidhya.com/blog/2018/04/introduction-to-graph-theory-network-analysis-python-codes/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# brew install graphviz pkg-config\n",
    "# pip install pygraphviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "from matplotlib import pyplot as plt\n",
    "import pygraphviz as pgv\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Creating a Graph \n",
    "G = nx.Graph() # Right now G is empty\n",
    "\n",
    "# Add a node\n",
    "G.add_node(1) \n",
    "node_list = [2,3]\n",
    "G.add_nodes_from(node_list) # You can also add a list of nodes by passing a list argument\n",
    "\n",
    "# Add edges \n",
    "G.add_edge(1,2)\n",
    "\n",
    "e = (2,3)\n",
    "G.add_edge(*e) # * unpacks the tuple\n",
    "edge_list = [(1,2), (1,3)]\n",
    "G.add_edges_from(edge_list) # Just like nodes we can add edges from a list"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Graph Visualization\n",
    "\n",
    "`Networkx` provides basic functionality for visualizing graphs, but its main goal is to enable **graph analysis** rather than perform graph visualization. Graph visualization is hard and we will have to use specific tools dedicated for this task. `Matplotlib` offers some convenience functions. But `GraphViz` is probably the best tool for us as it offers a Python interface in the form of `PyGraphViz` ([documentation](http://pygraphviz.github.io/))."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nx.draw(G)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "strict graph \"\" {\n",
      "\t1 -- 2;\n",
      "\t2 -- 3;\n",
      "\t3 -- 1;\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "d = {'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'1': None}}\n",
    "A = pgv.AGraph(data=d)\n",
    "print(A) # This is the 'string' or simple representation of the Graph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Methods\n",
    "\n",
    "```python\n",
    "nx.subgraph(G, nbunch)      # induced subgraph view of G on nodes in nbunch\n",
    "nx.union(G1,G2)             # graph union\n",
    "nx.disjoint_union(G1,G2)    # graph union assuming all nodes are different\n",
    "nx.cartesian_product(G1,G2) # return Cartesian product graph\n",
    "nx.compose(G1,G2)           # combine graphs identifying nodes common to both\n",
    "nx.complement(G)            # graph complement\n",
    "nx.create_empty_copy(G)     # return an empty copy of the same graph class\n",
    "nx.convert_to_undirected(G) # return an undirected representation of G\n",
    "nx.convert_to_directed(G)   # return a directed representation of G\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Accessing edges and nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NodeView((1, 2, 3))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G.nodes()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "EdgeView([(1, 2), (1, 3), (2, 3)])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G.edges()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "AtlasView({2: {}, 3: {}})"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G[1] # same as G.adj[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G[1][2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G.edges[1, 2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Analysis on a Dataset\n",
    "\n",
    "[Airlines](https://bitbucket.org/leoluyi/analyticsvidhya/src/master/Airlines.csv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>month</th>\n",
       "      <th>day</th>\n",
       "      <th>dep_time</th>\n",
       "      <th>sched_dep_time</th>\n",
       "      <th>dep_delay</th>\n",
       "      <th>arr_time</th>\n",
       "      <th>sched_arr_time</th>\n",
       "      <th>arr_delay</th>\n",
       "      <th>carrier</th>\n",
       "      <th>flight</th>\n",
       "      <th>tailnum</th>\n",
       "      <th>origin</th>\n",
       "      <th>dest</th>\n",
       "      <th>air_time</th>\n",
       "      <th>distance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2013</td>\n",
       "      <td>2</td>\n",
       "      <td>26</td>\n",
       "      <td>1807</td>\n",
       "      <td>1630</td>\n",
       "      <td>97</td>\n",
       "      <td>1956</td>\n",
       "      <td>1837</td>\n",
       "      <td>79</td>\n",
       "      <td>EV</td>\n",
       "      <td>4411</td>\n",
       "      <td>N13566</td>\n",
       "      <td>EWR</td>\n",
       "      <td>MEM</td>\n",
       "      <td>144</td>\n",
       "      <td>946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2013</td>\n",
       "      <td>8</td>\n",
       "      <td>17</td>\n",
       "      <td>1459</td>\n",
       "      <td>1445</td>\n",
       "      <td>14</td>\n",
       "      <td>1801</td>\n",
       "      <td>1747</td>\n",
       "      <td>14</td>\n",
       "      <td>B6</td>\n",
       "      <td>1171</td>\n",
       "      <td>N661JB</td>\n",
       "      <td>LGA</td>\n",
       "      <td>FLL</td>\n",
       "      <td>147</td>\n",
       "      <td>1076</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2013</td>\n",
       "      <td>2</td>\n",
       "      <td>13</td>\n",
       "      <td>1812</td>\n",
       "      <td>1815</td>\n",
       "      <td>-3</td>\n",
       "      <td>2055</td>\n",
       "      <td>2125</td>\n",
       "      <td>-30</td>\n",
       "      <td>AS</td>\n",
       "      <td>7</td>\n",
       "      <td>N403AS</td>\n",
       "      <td>EWR</td>\n",
       "      <td>SEA</td>\n",
       "      <td>315</td>\n",
       "      <td>2402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2013</td>\n",
       "      <td>4</td>\n",
       "      <td>11</td>\n",
       "      <td>2122</td>\n",
       "      <td>2115</td>\n",
       "      <td>7</td>\n",
       "      <td>2339</td>\n",
       "      <td>2353</td>\n",
       "      <td>-14</td>\n",
       "      <td>B6</td>\n",
       "      <td>97</td>\n",
       "      <td>N656JB</td>\n",
       "      <td>JFK</td>\n",
       "      <td>DEN</td>\n",
       "      <td>221</td>\n",
       "      <td>1626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2013</td>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>1832</td>\n",
       "      <td>1835</td>\n",
       "      <td>-3</td>\n",
       "      <td>2145</td>\n",
       "      <td>2155</td>\n",
       "      <td>-10</td>\n",
       "      <td>AA</td>\n",
       "      <td>269</td>\n",
       "      <td>N3EYAA</td>\n",
       "      <td>JFK</td>\n",
       "      <td>SEA</td>\n",
       "      <td>358</td>\n",
       "      <td>2422</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time  \\\n",
       "0  2013     2  26     1807           1630        97     1956           1837   \n",
       "1  2013     8  17     1459           1445        14     1801           1747   \n",
       "2  2013     2  13     1812           1815        -3     2055           2125   \n",
       "3  2013     4  11     2122           2115         7     2339           2353   \n",
       "4  2013     8   5     1832           1835        -3     2145           2155   \n",
       "\n",
       "  arr_delay carrier flight tailnum origin dest air_time distance  \n",
       "0        79      EV   4411  N13566    EWR  MEM      144      946  \n",
       "1        14      B6   1171  N661JB    LGA  FLL      147     1076  \n",
       "2       -30      AS      7  N403AS    EWR  SEA      315     2402  \n",
       "3       -14      B6     97  N656JB    JFK  DEN      221     1626  \n",
       "4       -10      AA    269  N3EYAA    JFK  SEA      358     2422  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('http://bit.ly/airline-raw', dtype=str)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 16)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "year              object\n",
       "month             object\n",
       "day               object\n",
       "dep_time          object\n",
       "sched_dep_time    object\n",
       "dep_delay         object\n",
       "arr_time          object\n",
       "sched_arr_time    object\n",
       "arr_delay         object\n",
       "carrier           object\n",
       "flight            object\n",
       "tailnum           object\n",
       "origin            object\n",
       "dest              object\n",
       "air_time          object\n",
       "distance          object\n",
       "dtype: object"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.loc[:, ['flight', 'dep_delay', 'arr_delay', 'distance', 'air_time']] = df.loc[:, ['flight', 'dep_delay', 'arr_delay', 'distance', 'air_time']].astype(float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    16:30\n",
       "1    14:45\n",
       "2    18:15\n",
       "3    21:15\n",
       "4    18:35\n",
       "Name: std, dtype: object"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# converting sched_dep_time to 'std' - Scheduled time of departure\n",
    "df['std'] = df['sched_dep_time'].astype(str).str.zfill(4).str.replace(r'^(\\d{2})(\\d{2})$', r'\\1:\\2')\n",
    "df['std'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    18:37\n",
       "1    17:47\n",
       "2    21:25\n",
       "3    23:53\n",
       "4    21:55\n",
       "Name: sta, dtype: object"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# converting sched_arr_time to 'sta' - Scheduled time of arrival\n",
    "df['sta'] = df['sched_arr_time'].astype(str).str.zfill(4).str.replace(r'^(\\d{2})(\\d{2})$', r'\\1:\\2')\n",
    "df['sta'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    18:07\n",
       "1    14:59\n",
       "2    18:12\n",
       "3    21:22\n",
       "4    18:32\n",
       "Name: atd, dtype: object"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# converting dep_time to 'atd' - Actual time of departure\n",
    "df['atd'] = df['dep_time'].fillna(0).astype(np.int64).astype(str).str.zfill(4).str.replace(r'^(\\d{2})(\\d{2})$', r'\\1:\\2')\n",
    "df['atd'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0   2013-02-26\n",
       "1   2013-08-17\n",
       "2   2013-02-13\n",
       "3   2013-04-11\n",
       "4   2013-08-05\n",
       "Name: date, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['date'] = pd.to_datetime(df[['year', 'month', 'day']])\n",
    "df['date'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dep_time</th>\n",
       "      <th>sched_dep_time</th>\n",
       "      <th>dep_delay</th>\n",
       "      <th>arr_time</th>\n",
       "      <th>sched_arr_time</th>\n",
       "      <th>arr_delay</th>\n",
       "      <th>carrier</th>\n",
       "      <th>flight</th>\n",
       "      <th>tailnum</th>\n",
       "      <th>origin</th>\n",
       "      <th>dest</th>\n",
       "      <th>air_time</th>\n",
       "      <th>distance</th>\n",
       "      <th>std</th>\n",
       "      <th>sta</th>\n",
       "      <th>atd</th>\n",
       "      <th>date</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1807</td>\n",
       "      <td>1630</td>\n",
       "      <td>97</td>\n",
       "      <td>1956</td>\n",
       "      <td>1837</td>\n",
       "      <td>79</td>\n",
       "      <td>EV</td>\n",
       "      <td>4411</td>\n",
       "      <td>N13566</td>\n",
       "      <td>EWR</td>\n",
       "      <td>MEM</td>\n",
       "      <td>144</td>\n",
       "      <td>946</td>\n",
       "      <td>16:30</td>\n",
       "      <td>18:37</td>\n",
       "      <td>18:07</td>\n",
       "      <td>2013-02-26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1459</td>\n",
       "      <td>1445</td>\n",
       "      <td>14</td>\n",
       "      <td>1801</td>\n",
       "      <td>1747</td>\n",
       "      <td>14</td>\n",
       "      <td>B6</td>\n",
       "      <td>1171</td>\n",
       "      <td>N661JB</td>\n",
       "      <td>LGA</td>\n",
       "      <td>FLL</td>\n",
       "      <td>147</td>\n",
       "      <td>1076</td>\n",
       "      <td>14:45</td>\n",
       "      <td>17:47</td>\n",
       "      <td>14:59</td>\n",
       "      <td>2013-08-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1812</td>\n",
       "      <td>1815</td>\n",
       "      <td>-3</td>\n",
       "      <td>2055</td>\n",
       "      <td>2125</td>\n",
       "      <td>-30</td>\n",
       "      <td>AS</td>\n",
       "      <td>7</td>\n",
       "      <td>N403AS</td>\n",
       "      <td>EWR</td>\n",
       "      <td>SEA</td>\n",
       "      <td>315</td>\n",
       "      <td>2402</td>\n",
       "      <td>18:15</td>\n",
       "      <td>21:25</td>\n",
       "      <td>18:12</td>\n",
       "      <td>2013-02-13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2122</td>\n",
       "      <td>2115</td>\n",
       "      <td>7</td>\n",
       "      <td>2339</td>\n",
       "      <td>2353</td>\n",
       "      <td>-14</td>\n",
       "      <td>B6</td>\n",
       "      <td>97</td>\n",
       "      <td>N656JB</td>\n",
       "      <td>JFK</td>\n",
       "      <td>DEN</td>\n",
       "      <td>221</td>\n",
       "      <td>1626</td>\n",
       "      <td>21:15</td>\n",
       "      <td>23:53</td>\n",
       "      <td>21:22</td>\n",
       "      <td>2013-04-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1832</td>\n",
       "      <td>1835</td>\n",
       "      <td>-3</td>\n",
       "      <td>2145</td>\n",
       "      <td>2155</td>\n",
       "      <td>-10</td>\n",
       "      <td>AA</td>\n",
       "      <td>269</td>\n",
       "      <td>N3EYAA</td>\n",
       "      <td>JFK</td>\n",
       "      <td>SEA</td>\n",
       "      <td>358</td>\n",
       "      <td>2422</td>\n",
       "      <td>18:35</td>\n",
       "      <td>21:55</td>\n",
       "      <td>18:32</td>\n",
       "      <td>2013-08-05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier  \\\n",
       "0     1807           1630        97     1956           1837        79      EV   \n",
       "1     1459           1445        14     1801           1747        14      B6   \n",
       "2     1812           1815        -3     2055           2125       -30      AS   \n",
       "3     2122           2115         7     2339           2353       -14      B6   \n",
       "4     1832           1835        -3     2145           2155       -10      AA   \n",
       "\n",
       "  flight tailnum origin dest air_time distance    std    sta    atd       date  \n",
       "0   4411  N13566    EWR  MEM      144      946  16:30  18:37  18:07 2013-02-26  \n",
       "1   1171  N661JB    LGA  FLL      147     1076  14:45  17:47  14:59 2013-08-17  \n",
       "2      7  N403AS    EWR  SEA      315     2402  18:15  21:25  18:12 2013-02-13  \n",
       "3     97  N656JB    JFK  DEN      221     1626  21:15  23:53  21:22 2013-04-11  \n",
       "4    269  N3EYAA    JFK  SEA      358     2422  18:35  21:55  18:32 2013-08-05  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Final DataFrame\n",
    "df.drop(columns = ['year', 'month', 'day'], inplace=True)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<networkx.classes.graph.Graph at 0x10cfb4e10>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Convert to nx object\n",
    "FG = nx.from_pandas_edgelist(df, source='origin', target='dest', edge_attr=True,)\n",
    "FG"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NodeView(('EWR', 'MEM', 'LGA', 'FLL', 'SEA', 'JFK', 'DEN', 'ORD', 'MIA', 'PBI', 'MCO', 'CMH', 'MSP', 'IAD', 'CLT', 'TPA', 'DCA', 'SJU', 'ATL', 'BHM', 'SRQ', 'MSY', 'DTW', 'LAX', 'JAX', 'RDU', 'MDW', 'DFW', 'IAH', 'SFO', 'STL', 'CVG', 'IND', 'RSW', 'BOS', 'CLE'))"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FG.nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "EdgeView([('EWR', 'MEM'), ('EWR', 'SEA'), ('EWR', 'MIA'), ('EWR', 'ORD'), ('EWR', 'MSP'), ('EWR', 'TPA'), ('EWR', 'MSY'), ('EWR', 'DFW'), ('EWR', 'IAH'), ('EWR', 'SFO'), ('EWR', 'CVG'), ('EWR', 'IND'), ('EWR', 'RDU'), ('EWR', 'IAD'), ('EWR', 'RSW'), ('EWR', 'BOS'), ('EWR', 'PBI'), ('EWR', 'LAX'), ('EWR', 'MCO'), ('EWR', 'SJU'), ('LGA', 'FLL'), ('LGA', 'ORD'), ('LGA', 'PBI'), ('LGA', 'CMH'), ('LGA', 'IAD'), ('LGA', 'CLT'), ('LGA', 'MIA'), ('LGA', 'DCA'), ('LGA', 'BHM'), ('LGA', 'RDU'), ('LGA', 'ATL'), ('LGA', 'TPA'), ('LGA', 'MDW'), ('LGA', 'DEN'), ('LGA', 'MSP'), ('LGA', 'DTW'), ('LGA', 'STL'), ('LGA', 'MCO'), ('LGA', 'CVG'), ('LGA', 'IAH'), ('FLL', 'JFK'), ('SEA', 'JFK'), ('JFK', 'DEN'), ('JFK', 'MCO'), ('JFK', 'TPA'), ('JFK', 'SJU'), ('JFK', 'ATL'), ('JFK', 'SRQ'), ('JFK', 'DCA'), ('JFK', 'DTW'), ('JFK', 'LAX'), ('JFK', 'JAX'), ('JFK', 'CLT'), ('JFK', 'PBI'), ('JFK', 'CLE'), ('JFK', 'IAD'), ('JFK', 'BOS')])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FG.edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Quick view of the Graph. As expected we see 3 very busy airports\n",
    "nx.draw_networkx(FG, with_labels=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Centrality and Connectivity**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'EWR': 0.5714285714285714,\n",
       " 'MEM': 0.02857142857142857,\n",
       " 'LGA': 0.5714285714285714,\n",
       " 'FLL': 0.05714285714285714,\n",
       " 'SEA': 0.05714285714285714,\n",
       " 'JFK': 0.4857142857142857,\n",
       " 'DEN': 0.05714285714285714,\n",
       " 'ORD': 0.05714285714285714,\n",
       " 'MIA': 0.05714285714285714,\n",
       " 'PBI': 0.08571428571428572,\n",
       " 'MCO': 0.08571428571428572,\n",
       " 'CMH': 0.02857142857142857,\n",
       " 'MSP': 0.05714285714285714,\n",
       " 'IAD': 0.08571428571428572,\n",
       " 'CLT': 0.05714285714285714,\n",
       " 'TPA': 0.08571428571428572,\n",
       " 'DCA': 0.05714285714285714,\n",
       " 'SJU': 0.05714285714285714,\n",
       " 'ATL': 0.05714285714285714,\n",
       " 'BHM': 0.02857142857142857,\n",
       " 'SRQ': 0.02857142857142857,\n",
       " 'MSY': 0.02857142857142857,\n",
       " 'DTW': 0.05714285714285714,\n",
       " 'LAX': 0.05714285714285714,\n",
       " 'JAX': 0.02857142857142857,\n",
       " 'RDU': 0.05714285714285714,\n",
       " 'MDW': 0.02857142857142857,\n",
       " 'DFW': 0.02857142857142857,\n",
       " 'IAH': 0.05714285714285714,\n",
       " 'SFO': 0.02857142857142857,\n",
       " 'STL': 0.02857142857142857,\n",
       " 'CVG': 0.05714285714285714,\n",
       " 'IND': 0.02857142857142857,\n",
       " 'RSW': 0.02857142857142857,\n",
       " 'BOS': 0.05714285714285714,\n",
       " 'CLE': 0.02857142857142857}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Notice the 3 airports from which all of our 100 rows of data originates\n",
    "nx.algorithms.degree_centrality(FG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.09047619047619047"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Average edge density of the Graphs\n",
    "nx.density(FG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{20: 1.95, 1: 19.307692307692307, 2: 19.0625, 17: 2.0588235294117645, 3: 19.0}"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # For a node of degree k - What is the average of its neighbours' degree?\n",
    "nx.average_degree_connectivity(FG)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Shortest Path Problem\n",
    "\n",
    "As is obvious from looking at the Graph visualization (way above) – There are multiple paths from some airports to others. Let us say we want to calculate the **shortest possible route** between 2 such airports. Right off the bat we can think of a couple of ways of doing it\n",
    "\n",
    "1. There is the shortest path by distance\n",
    "2. There is the shortest path by flight time\n",
    "\n",
    "What we can do is to calculate the shortest path algorithm by weighing the paths with either the distance or airtime.\n",
    "\n",
    "Let us take the example of `JAX` and `DFW` airports:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['JAX', 'JFK', 'DEN', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DEN', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'SEA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'TPA', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'SJU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'ATL', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DCA', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'DTW', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'LAX', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'FLL', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'CLT', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'ORD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'PBI', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'MIA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'RDU', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'TPA', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'MSP', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'MCO', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'CVG', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'LGA', 'IAH', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'IAD', 'EWR', 'DFW']\n",
      "['JAX', 'JFK', 'BOS', 'EWR', 'DFW']\n"
     ]
    }
   ],
   "source": [
    "# Let us find all the paths available\n",
    "for path in nx.all_simple_paths(FG, source='JAX', target='DFW'):\n",
    "    print(path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['JAX', 'JFK', 'SEA', 'EWR', 'DFW']"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let us find the dijkstra path from JAX to DFW.\n",
    "# You can read more in-depth on how dijkstra works from this resource -\n",
    "# https://courses.csail.mit.edu/6.006/fall11/lectures/lecture16.pdf\n",
    "\n",
    "dijpath = nx.dijkstra_path(FG, source='JAX', target='DFW')\n",
    "dijpath"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['JAX', 'JFK', 'BOS', 'EWR', 'DFW']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let us try to find the dijkstra path weighted by airtime (approximate case)\n",
    "shortpath = nx.dijkstra_path(FG, source='JAX', target='DFW', weight='air_time')\n",
    "shortpath"
   ]
  },
  {
   "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
