{
 "metadata": {
  "name": "",
  "signature": "sha256:11577cacec328d42f812779445cd43f83044ddeb405cc6b299fa7aae7633df40"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Airline Data Experiments"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%matplotlib inline\n",
      "\n",
      "from scidbpy import connect\n",
      "import matplotlib.pyplot as plt\n",
      "plt.rcParams['figure.figsize'] = (20, 20)\n",
      "plt.rcParams['figure.dpi'] = 300\n",
      "plt.rcParams['font.size'] = 10\n",
      "\n",
      "sdb = connect()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This notebook follows [this analysis](https://github.com/Paradigm4/SciDBR/wiki/Airline-data-experiments-I:-Loading-and-aggregation) using the SciDBR package, to analyze flight delays in historical airline data.\n",
      "\n",
      "## Getting the data\n",
      "\n",
      "The raw data are available at http://stat-computing.org/dataexpo/2009/. The files for 1998 and 1999 were loaded\n",
      "into SciDB using the command:\n",
      "\n",
      "```bash\n",
      "\n",
      "schema=\"<Year:int64 null,Month:int64 null,DayofMonth:int64 null,DayOfWeek:int64 null,DepTime:int64 null,CRSDepTime:int64 null,ArrTime:int64 null,CRSArrTime:int64 null,UniqueCarrier:string null,FlightNum:int32 null,TailNum:string null,ActualElapsedTime:int32 null,CRSElapsedTime:int32 null,AirTime:int32 null,ArrDelay:int32 null,DepDelay:int32 null,Origin:string null,Dest:string null,Distance:int32 null,TaxiIn:int32 null,TaxiOut:int32 null,Cancelled:int32 null,CancellationCode:string null,Diverted:int32 null,CarrierDelay:int32 null,WeatherDelay:int32 null,NASDelay:int32 null,SecurityDelay:int32 null,LateAircraftDelay:int32 null>[row=0:*,1000000,0]\"\n",
      "\n",
      "types=$(echo $schema |sed -e \"s/ null//g\" | sed -e \"s/.*<//\" | sed -e \"s/>.*//\" | tr ',' '\\n' | sed -e \"s/.*://g\" | sed -e \"s/int64/N/\"  | sed -e \"s/int32/N/\" | sed -e \"s/bool/N/\" | sed -e \"s/string/s/\" | tr -d '\\n')\n",
      "\n",
      "iquery -aq \"remove(airline)\" >/dev/null 2>&1 &\n",
      "x=$(ls *.bz2)\n",
      "\n",
      "echo \"Load\"\n",
      "time bzcat $x | sed -e \"s/NA//g\" | loadcsv.py -n 1 -t $types -a \"airline\" -x -s \"$schema\" -e 1000 -w \"airline_shadow\"\n",
      "\n",
      "echo \"Total number of observations:\"\n",
      "iquery -aq \"aggregate(airline, count(*))\"\n",
      "```"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Grouped aggregates"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "a = sdb.wrap_array('airline')\n",
      "a = a[a.att_names[0:8]]  # select the first 8 columns\n",
      "a.head()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\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>DayofMonth</th>\n",
        "      <th>DayOfWeek</th>\n",
        "      <th>DepTime</th>\n",
        "      <th>CRSDepTime</th>\n",
        "      <th>ArrTime</th>\n",
        "      <th>CRSArrTime</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>0</th>\n",
        "      <td> 1998</td>\n",
        "      <td> 1</td>\n",
        "      <td> 17</td>\n",
        "      <td> 6</td>\n",
        "      <td> 715</td>\n",
        "      <td> 715</td>\n",
        "      <td> 840</td>\n",
        "      <td> 840</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td> 1998</td>\n",
        "      <td> 1</td>\n",
        "      <td> 18</td>\n",
        "      <td> 7</td>\n",
        "      <td> 715</td>\n",
        "      <td> 715</td>\n",
        "      <td> 830</td>\n",
        "      <td> 840</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td> 1998</td>\n",
        "      <td> 1</td>\n",
        "      <td> 19</td>\n",
        "      <td> 1</td>\n",
        "      <td> 715</td>\n",
        "      <td> 715</td>\n",
        "      <td> 831</td>\n",
        "      <td> 840</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td> 1998</td>\n",
        "      <td> 1</td>\n",
        "      <td> 20</td>\n",
        "      <td> 2</td>\n",
        "      <td> 715</td>\n",
        "      <td> 715</td>\n",
        "      <td> 836</td>\n",
        "      <td> 840</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td> 1998</td>\n",
        "      <td> 1</td>\n",
        "      <td> 21</td>\n",
        "      <td> 3</td>\n",
        "      <td> 715</td>\n",
        "      <td> 715</td>\n",
        "      <td> 836</td>\n",
        "      <td> 840</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 11,
       "text": [
        "   Year  Month  DayofMonth  DayOfWeek  DepTime  CRSDepTime  ArrTime  \\\n",
        "0  1998      1          17          6      715         715      840   \n",
        "1  1998      1          18          7      715         715      830   \n",
        "2  1998      1          19          1      715         715      831   \n",
        "3  1998      1          20          2      715         715      836   \n",
        "4  1998      1          21          3      715         715      836   \n",
        "\n",
        "   CRSArrTime  \n",
        "0         840  \n",
        "1         840  \n",
        "2         840  \n",
        "3         840  \n",
        "4         840  "
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we compute a new attribute, an indicator variable **late**, that is 1 if a flight is delayed by more than 15 minutes. In SciDB-Py the syntax for defining new attributes is `array[new_attribute_name] = SciDB_expression_string`."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "a['late'] = (\"iif( (ArrTime/100.0)*60 + ArrTime - 100*(ArrTime/100.0) - \"\n",
      "                  \"((CRSArrTime/100.0)*60 + CRSArrTime - 100*(CRSArrTime/100.0)) > 15,1,0)\")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's look at how often flights are delayed throughout the year. The SciDB-Py groupby operator maps a subset of Pandas groupby syntax onto SciDB Queries"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "agg = a.groupby(['DayOfWeek', 'DayofMonth', 'Month', 'Year']).aggregate({'frac':'avg(late)'})"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This line groups the array into bins with equal `(DayOfWeek, Month, Year)` values, computes the average value for the `late` attribute, and stores that as a new attribute called `frac`. Additional quantities can be computed by passing additional items into the `aggregate` dictionary. This call produces the following SciDB query:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print agg.query"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "unpack(aggregate(redimension(apply(project(airline,Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime),late,iif( (ArrTime/100.0)*60 + ArrTime - 100*(ArrTime/100.0) - ((CRSArrTime/100.0)*60 + CRSArrTime - 100*(CRSArrTime/100.0)) > 15,1,0)),<late:int64 NULL DEFAULT null> [row=0:10999999,1000000,0,DayOfWeek=1:7,1000,0,Year=1998:1999,1000,0,Month=1:12,1000,0,DayofMonth=1:31,1000,0]),avg(late) as frac,DayOfWeek,DayofMonth,Month,Year),_idx)\n"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The aggregated array is small enough to download, and examine in Python"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "results = agg.todataframe()\n",
      "results.head()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
        "<table border=\"1\" class=\"dataframe\">\n",
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>DayOfWeek</th>\n",
        "      <th>DayofMonth</th>\n",
        "      <th>Month</th>\n",
        "      <th>Year</th>\n",
        "      <th>frac</th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>0</th>\n",
        "      <td> 1</td>\n",
        "      <td> 1</td>\n",
        "      <td>  2</td>\n",
        "      <td> 1999</td>\n",
        "      <td> 0.196205</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td> 1</td>\n",
        "      <td> 1</td>\n",
        "      <td>  3</td>\n",
        "      <td> 1999</td>\n",
        "      <td> 0.323090</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td> 1</td>\n",
        "      <td> 1</td>\n",
        "      <td>  6</td>\n",
        "      <td> 1998</td>\n",
        "      <td> 0.238424</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td> 1</td>\n",
        "      <td> 1</td>\n",
        "      <td> 11</td>\n",
        "      <td> 1999</td>\n",
        "      <td> 0.255699</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td> 1</td>\n",
        "      <td> 2</td>\n",
        "      <td>  2</td>\n",
        "      <td> 1998</td>\n",
        "      <td> 0.260074</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "   DayOfWeek  DayofMonth  Month  Year      frac\n",
        "0          1           1      2  1999  0.196205\n",
        "1          1           1      3  1999  0.323090\n",
        "2          1           1      6  1998  0.238424\n",
        "3          1           1     11  1999  0.255699\n",
        "4          1           2      2  1998  0.260074"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Here's a summary graph in matplotlib"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "results['Week'] = results.DayofMonth // 7 + 1\n",
      "\n",
      "arr = results.set_index(['Year', 'Month', 'Week', 'DayOfWeek']).unstack('DayOfWeek')['frac'].T\n",
      "plt.imshow(arr, cmap='RdYlGn_r', origin='upper', aspect=1.0)\n",
      "\n",
      "plt.colorbar(orientation='horizontal', shrink=0.4, pad=.05, label='Flight Delay Fraction')\n",
      "plt.yticks(range(7), 'Mon Tue Wed Thur Fri Sat Sun'.split())\n",
      "plt.xticks(range(len(arr.columns))[::15], arr.columns.values[::15])\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nL880ZhaPMv9t+Kc+11m190jip+ZQvdJvQFXE1/K7qPFPP5m3FXuZ1bZMxnUPt8rtzzLX3q5htDFz\n179mWbW3cvVeq1xJqnxQqF69ekpJKflLrWjeoUWLFlV1swAAAAAAACiHqvunm1KkpaWpY8eOuuuu\nuxQZGak9e/YoPDxc6enpF7ppAAAAAAAAlKLKzxTKzs5WTEyMJOnSSy/VX/7yF23fvl3vv/++evXq\nJen8SaoBAAAAAABwcVX5oFDdunWLXT6WlpamSy65xD0gVJaJL5y57j5+QFfF/8Y8NwAAAAAAAABO\nK9ydocI9x62yVT4oVJL69etb5SY+e8sFrgQAAAAAAODXy6d1kHxan5nMuyBpd+nZi1EQAAAAAAAA\nPEuVDwqVNF/QucuYUwgAAAAAAKB6VfnlYydOnCj2PDw8XOvXry+2bOfOnVXdLAAAAAAAAMrB5TiO\nU91FSKfPHsqfc3eZmfzrb7LblsUJUEdz9hszBU6+VXthAfcZM1d/ersx06elee6lwkK7X9fezAJj\n5h8D3zZmnJwFVu399acvjJnbO11u3s76b63aSz1u/t2sO5RpzAxrH2TMSNL0/9trzBwZv8iYGbd0\njDHjb3n+3qafc4yZlg1qGzMFln1q38lcY+aLnj2NmZzm7azaq3Ok9Otei7iaP2TMNH7lGqv2ul8a\nbMy0Da5rtS2TNxL+YZW751+jjZmb2jcyZpbus5tk7nieuS/MWPSTMeNX2+7fG1w+5rNG64XUM2Za\nWmQkKeWOfxozYxN/a8zM2/KzMbPh7putaurw2vtWOZOj//2lVa79jOHGTGaO+fPVsfzcKMwvNGYO\n3XWrMbPNddCqvfYB3YyZtKytxkybBmONmcLVz1jV5OoUY8w8sHqxMTO5r/k7VJJu/9L8fdwy0Pzd\n0LSer1V7P1p8F8W3Mu+j42L+ZtVecoeOxkzMl/cYMydbmb+Lvt2zzKqmG9tOM2a2ZrxizKTnmI9b\nJGne9n3GzJFs83HgO1fOsGqv72zzPhrVNMCYOZFrrkmSDmbmGTO9W9jNV2ry+OsbrXKN/3KHMZM3\n61/GTO1xc63am7P9UWMmLMD8/d+1kfkzUZLqb15nzLi6xZszLrvPqcS9zxozfZr3M2ZG/+sTYyb7\nlF2/e3PgIGPmUJb574FbFiZbtdeukfmYcv6w94yZ3SftPjtbFTQwZsav/96Y2XI026q91g3rGDMP\n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\nCRMmFHu+YcOGijQLAAAAAACAKuJyKnptVxWLj4/XkiVLqrsMAAAAAACAX424uLhSJ572mEEhAAAA\nAAAAXDypcHc9AAAat0lEQVQVmmgaAAAAAAAANRuDQgAAAAAAAF6IQSEAAAAAAAAvVK5BodzcXMXF\nxaloGqLBgwcrODhYQ4cOLZb77rvv1KNHD0VGRuruu+9WQUGBJOnYsWO64YYbFBUVpdjYWG3cuNG9\nzosvvqiuXbsqMjJSt912m3Jzc8usZcuWLerTp4/q1KmjP//5z1b1v/7662rXrp18fHyUnp7uXr5g\nwQI9//zzVtuAHU/qK0VWr14tPz8/zZs3z5ilr1xcntRfXnnlFcXExCgmJkaRkZHy8/NTRkZGmevQ\nXy4sT+ofZX33fPXVV+rUqZPat2+vqVOnGn+u0raVm5ur3/zmNyosLDRuA2W7kH1n2rRpioyMVERE\nhKZNm2asheMWz+ZJfaUIxy2ey5P6C8ctnseT+gfHLbDilMPbb7/tvPTSS+7n3377rbNw4ULn2muv\ndS8rKChwWrVq5Wzbts1xHMf54x//6Lz99tuO4zjOk08+6Tz33HOO4zjOli1bnCuuuMJxHMdJTU11\n2rRp4+Tk5DiO4zg333yzM3PmzDJrOXz4sLN69Wrn2WefdV555RWr+lNSUpy0tDQnPDzcOXr0qHt5\nYWGhExUV5eTl5VltB2ae1Fccx3Hy8/OdhIQEZ8iQIc6cOXOMefrKxeVp/aXIwoUL3dsqC/3lwvKk\n/lHad09+fr7Ttm1bJzU11cnLy3OioqKcTZs2VWhbjuM4v/vd75y5c+eWuT7MLlTf2bBhgxMREeFk\nZ2c7+fn5zsCBA53t27eXWQvHLZ7Nk/qK43Dc4uk8rb8U4bjFM3hS/+C4BTbKdabQrFmzdN1117mf\nX3755QoICCiWOXr0qGrVqqV27dpJkgYOHKi5c+dKkjZv3qyEhARJUseOHZWWlqYjR46oQYMG8vf3\nV1ZWlvLz85WVlaWWLVuWWUtoaKh69uwpf39/6/qjo6N1ySWXnLfc5XKpT58+Wrx4sfW2UDZP6iuS\nNH36dI0YMUKhoaFW9dNXLi5P6y9FPvroI40cOdKYo79cWJ7UP0r77lm1apXatWun8PBw+fv769Zb\nb9X8+fMrtC1JGjZsmGbNmlXm+jC7EH3n8OHD2rx5s2JjY1WnTh35+voqLi7OeDYHxy2ezZP6isRx\n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\nYKWnp1d3GQDwq+FyHMep7iIAABXjcrnkeqj36cc+Lvf/3Y9drtJfK+H/lV6vhPXPfc3nP+eo+rpc\n8v3PMt//5H3Pfs29rCgj9/OSXjtvW2dt8/x8OV/7T9s+Zz33Kaqn6DWfMl4rcb3/vB9nZc9+b857\nraz1SqjTx50r+r9P6a+ppNd8zlm/hNd09mvn54uyZ9op/TWXe5s+7udF23S56zvz3P24zPV83eud\nt42z1nM/LqG90tZzOZKcwtNveEn/L6zYa47zn0HekjLn5gvL+VrRskLnrMdnLSt6XtKyUtZzH0aW\nuV5hycssanEKnOLL/vPcKXTcj1VQeGZZUeY/j8+sX+h+zTlnW8W3abOtM+2euy3nrGzR48JzXzvr\n53LO2bZT6KiwhGVF/z+zrNB+vbNqObe9wkLn/Le/rF9NYcnLzn2tqF+Ud70Su845+VHaKv58AYCq\nw+VjAAAAAAAAXohBIQAAAAAAAC/EoBAAAAAAAIAXYlAIAAAAAADACzEoBAAAAAAA4IUYFAIAAAAA\nAPBCDAoBAAAAAAB4IQaFAAAAAAAAvBCDQgAAAAAAAF6IQSEAAAAAAAAvxKAQAAAAAACAF2JQCAAA\nAAAAwAsxKAQAAAAAAOCFGBQCAAAAAADwQgwKAQAAAAAAeCEGhQAAAAAAALwQg0IAAAAAAABeiEEh\nAECVyNt+tLpLqLBD6w9UdwkVtnnVvuouocJW/d+O6i6hwhIT11V3CRWWuLLmvu+SlLjpYHWXUGH/\ndyCjukuosOSsrOouAQBwATAoBACoEqdq9KBQzf0jc8uq/dVdQoUxKFQ9Ev+9s7pLqJQlmw9VdwkV\n9n8Ha/CgUDaDQgDwa8SgEAAAAAAAgBdiUAgAAAAAAMALuRzHcaq7CABAxbhcruouAQCAiyY4OFjp\n6enVXQYA/Gr4VXcBAICKY1wfAAAAQEVx+RgAAAAAAIAXYlAIAAAAAADACzEoBAAAAAAA4IUYFAIA\nlOmrr75Sp06d1L59e02dOrXEzKOPPqr27dsrKipKKSkp7uUvvviiunbtqsjISN12223Kzc29WGW7\nmerfsmWL+vTpozp16ujPf/6ze/mePXuUkJCgrl27KiIiQq+99trFLFtSxWuXpIyMDI0YMUKdO3dW\nly5dtHLlyotVtiRz7R9++KGioqLUrVs39evXT+vXr7de90KrTO2SVFBQoJiYGA0dOvRilexWmdqr\ne3811T5//nxFRUUpJiZGPXr00HfffSepZuyrpdUuef6+WmT16tXy8/PT3Llzy70uAMCDOQAAlCI/\nP99p27atk5qa6uTl5TlRUVHOpk2bimUWLVrkXH311Y7jOM7KlSud2NhYx3EcJzU11WnTpo2Tk5Pj\nOI7j3Hzzzc7MmTM9rv7Dhw87q1evdp599lnnlVdecS8/cOCAk5KS4jiO45w8edLp0KHDeet6au2O\n4zh33nmn8/bbbzuO4zinTp1yMjIyPKr2pKQkd01ffvmlu9/YrOuptRf585//7Nx2223O0KFDL1rd\njlO52qt7f7WpPTMz0/14/fr1Ttu2bR3HqRn7amm1O47n76tFuYSEBGfIkCHOnDlzyrUuAMCzcaYQ\nAKBUq1atUrt27RQeHi5/f3/deuutmj9/frHMggULdNddd0mSYmNjlZGRoUOHDqlBgwby9/dXVlaW\n8vPzlZWVpZYtW3pc/aGhoerZs6f8/f2LLW/WrJmio6MlSQEBAercubP2799fI2o/fvy4li1bptGj\nR0uS/Pz81LBhQ4+qvU+fPu6aYmNjtXfvXut1PbV2Sdq7d6+++OIL/fa3v73odwesTO3Vvb/a1F6/\nfn3348zMTDVu3FhSzdhXS6u9JuyrkjR9+nSNGDFCoaGh5V4XAODZGBQCAJRq3759atWqlft5WFiY\n9u3bZ5Vp1KiRnnjiCbVu3VotWrRQUFCQBg4ceNFqL6u28kpLS1NKSopiY2OrsrwyVab21NRUhYaG\n6p577lH37t01ZswYZWVlXahSz1Pe2t9++21dc801FVq3qlWmdkkaN26cXn75Zfn4XPxDrMrUXt37\nq23tn332mTp37qyrr766xMvEPHlfLan2mrCv7tu3T/Pnz9eDDz4oSXK5XNbrAgA8H4NCAIBSFR38\nm5R0RsSOHTv06quvKi0tTfv371dmZqY+/PDDqi6xTLb1lyUzM1MjRozQtGnTFBAQUAVV2alM7fn5\n+Vq7dq0eeughrV27VvXr19eUKVOqsLqylaf277//XjNmzHDPR1IVv7PKqEztn3/+uZo0aaKYmJiL\nfpaQVLnaq3t/ta39+uuv1+bNm7Vw4ULdcccdxV7z9H21pNprwr76+OOPa8qUKXK5XHIcx923q3tf\nBQBUDQaFAAClatmypfbs2eN+vmfPHoWFhZWZ2bt3r1q2bKk1a9aob9++CgkJkZ+fn2688UYlJSVd\ntNpLqq2k+sty6tQpDR8+XLfffruuv/76C1FiqSpTe1hYmMLCwnTZZZdJkkaMGKG1a9dekDpLYlv7\n+vXrNWbMGC1YsEDBwcHlWvdCqUztSUlJWrBggdq0aaORI0fqu+++05133lkjaq/u/bW8v/cBAwYo\nPz9fR48elVSz9tWza68J+2pycrJuvfVWtWnTRnPnztVDDz2kBQsWVPu+CgCoGgwKAQBK1bNnT23b\ntk1paWnKy8vTxx9/rGHDhhXLDBs2TO+9954kaeXKlQoKClLTpk3VsWNHrVy5UtnZ2XIcR9988426\ndOnicfUXOffMDsdxdO+996pLly56/PHHL0a5xVSm9mbNmqlVq1baunWrJOmbb75R165dL3jNRWxq\n3717t2688UZ98MEHateuXbnW9dTaJ0+erD179ig1NVWzZ8/W5Zdf7t43PL32Tp06Vev+alP7jh07\n3H29aOAkJCSkRuyrpdVeE/bVnTt3KjU1VampqRoxYoTeeOMNDRs2rNr3VQBA1fCr7gIAAJ7Lz89P\nr7/+uq666ioVFBTo3nvvVefOnfXmm29Kku6//35dc801+uKLL9SuXTvVr19f77zzjiQpOjpad955\np3r27CkfHx91795d9913n8fVf/DgQV122WU6ceKEfHx8NG3aNG3atEnr1q3TBx98oG7duikmJkbS\n6Vt2Dx482ONrDwgI0PTp0zVq1Cjl5eWpbdu27t+Lp9T+3HPP6dixY+55Svz9/bVq1apS160JtZ/r\nYl9eU5nao6KiqnV/tal97ty5eu+99+Tv76+AgADNnj1bkrR8+XKP31dLq12Sx++r5V0XAFCzuJzq\nuOgdAAAAAAAA1YrLxwAAAAAAALwQg0IAAAAAAABeiEEhAAAAAAAAL8SgEAAAAAAAgBdiUAgAAAAA\nAMALMSgEAAAAAADghRgUAgAAF42vr69iYmLc/+3atUuJiYkaOnSoJGnhwoWaOnVqmds4O3+uV199\nVdnZ2SW+Fh8fr06dOikqKkqdO3fWI488ouPHjxtrDg8PV3p6ujFns51u3bq5f/aVK1dWanu7du3S\nrFmz3M+Tk5P12GOPVbZMAADgRfyquwAAAOA96tWrp5SUlGLLUlNT3Y+HDh1a6oCPjWnTpumOO+5Q\n3bp1z3vN5XLpo48+Uvfu3XXq1Ck988wzuu6665SYmFjmNl0uV4XrOXc7iYmJatSoUYmvFxYWysfH\n/t/rUlNT9dFHH2nkyJGSpB49eqhHjx5VUisAAPAOnCkEAAA8xsyZM/XII49Iknbs2KHevXurW7du\n+v3vf6/AwEB3LjMzUzfddJM6d+6s22+/XZL02muvaf/+/UpISNAVV1xR4vYdx5Ek+fv766WXXtLu\n3bu1fv16SdIHH3yg2NhYxcTE6IEHHlBhYeF5699www3q2bOnIiIi9NZbb0mSZsyYoXHjxrkzb731\nlsaPH19m+0UCAgL05JNPKjo6WitWrNDzzz+vXr16KTIyUvfff787t337dg0cOFDR0dHq2bOndu7c\nqaefflrLli1TTEyMXn311WJnUKWnp+v6669XVFSU+vTpow0bNkiSJk6cqNGjRyshIUFt27bV9OnT\nS/tVAAAAL8CgEAAAuGiys7Pdl08NHz68zOxjjz2mcePGaf369WrVqlWx11JSUjRt2jRt2rRJO3fu\nVFJSkh599FG1aNFCiYmJ+vbbb0vc5tln/fj4+CgqKkpbtmzR5s2b9c9//lNJSUlKSUmRj4+PPvzw\nw/PWnzFjhtasWaPVq1frtdde07Fjx3TLLbdo4cKFKigokHR6YOvee+89b13HcZSQkKCYmBj16dNH\nkpSVlaXevXtr3bp16tevn8aOHatVq1Zpw4YNys7O1ueffy5JGjVqlB555BGtW7dOSUlJat68uaZO\nnaoBAwYoJSVFjz/+eLG2JkyYoB49euiHH37Q5MmTdeedd7pf27p1qxYvXqxVq1Zp0qRJ7roBAID3\n4fIxAABw0dStW/e8y8dKs3LlSi1YsECSNHLkSD355JPu13r16qUWLVpIkqKjo5WWlqa+ffuWu56i\nM3e+/fZbJScnq2fPnpJOD141a9bsvPy0adP02WefSZL27Nmjbdu2qVevXrr88su1cOFCderUSadO\nnVLXrl3PW7eky8d8fX2LDY599913evnll5WVlaX09HRFREQoLi5O+/fv13XXXSdJqlWrVrHaS7J8\n+XLNmzdPkpSQkKCjR4/q5MmTcrlcGjJkiPz9/RUSEqImTZro0KFD7vcSAAB4FwaFAABAjVO7dm33\nY19fX+Xn55d7GwUFBdqwYYO6dOmiw4cP66677tLkyZNLzRedgbRy5UrVqVNHCQkJysnJkST99re/\n1QsvvKDOnTtr9OjR1jXUqVPHffZSTk6OHn74YSUnJ6tly5aaNGmScnJyKjynUWmDRkWDSlLF3zsA\nAPDrwOVjAADAI/Xu3Vtz5syRJM2ePdtqncDAQJ04caLU14sGSoommm7durUiIiJ0+eWXa86cOTpy\n5Iik03Py7N69u9i6J06cUHBwsOrUqaMtW7YUu3tYr169tHfv3mITP5dX0QBTSEiIMjMz9cknn0g6\nPe9QWFiY5s+fL0nKzc1Vdna2GjRooJMnT5a4rQEDBrgvf0tMTFRoaKgCAwPLPLsIAAB4HwaFAADA\nRVPSWS8ul8u9/OzHr776qv7yl78oOjpaO3bsUMOGDcvcjiTdd999Gjx4cKkTTY8aNUpRUVGKjIxU\ndna2e6ClS5cu+tOf/qRBgwYpKipKgwYN0sGDB4utO3jwYOXn56tLly565pln3PMCFbn55pvVv3//\nYnXa/OxFgoKCNGbMGEVERGjw4MGKjY11v/b+++/rtddeU1RUlPr166dDhw6pW7du8vX1VXR0tF59\n9dVi793EiROVnJysqKgo/e53v9O777573vsLAADgcvgnIwAA4IGys7Pdt5afPXu2Pv74Y3366afV\nXFXphg4dqvHjxyshIaG6SwEAALDCnEIAAMAjJScna+zYsXIcR8HBwZoxY0Z1l1SijIwMxcbGKjo6\nmgEhAABQo3CmEAAAAAAAgBdiTiEAAAAAAAAvxKAQAAAAAACAF2JQCAAAAAAAwAsxKAQAAAAAAOCF\nGBQCAAAAAADwQv8PBm5cRthOGpsAAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0x109685390>"
       ]
      }
     ],
     "prompt_number": 7
    }
   ],
   "metadata": {}
  }
 ]
}