{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Demand forecasting with BigQuery and TensorFlow

\n", "\n", "In this notebook, we will develop a machine learning model to predict the demand for taxi cabs in New York.\n", "\n", "To develop the model, we will need to get historical data of taxicab usage. This data exists in BigQuery. Let's start by looking at the schema." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "import google.datalab.bigquery as bq\n", "import pandas as pd\n", "import numpy as np\n", "import shutil" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%bq tables describe --name bigquery-public-data.new_york.tlc_yellow_trips_2015" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Analyzing taxicab demand

\n", "\n", "Let's pull the number of trips for each day in the 2015 dataset using Standard SQL." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "\n", "
daynumber
301
178
308
336
150
\n", "
(rows: 5, time: 2.1s, 1GB processed, job: job_1wwNxbANH1IvI01gjbGXlkZ_lBcX)
\n", " \n", " \n", " " ], "text/plain": [ "QueryResultsTable job_1wwNxbANH1IvI01gjbGXlkZ_lBcX" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%bq query\n", "SELECT \n", " EXTRACT (DAYOFYEAR from pickup_datetime) AS daynumber\n", "FROM `bigquery-public-data.new_york.tlc_yellow_trips_2015` \n", "LIMIT 5" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Modular queries and Pandas dataframe

\n", "\n", "Let's use the total number of trips as our proxy for taxicab demand (other reasonable alternatives are total trip_distance or total fare_amount). It is possible to predict multiple variables using Tensorflow, but for simplicity, we will stick to just predicting the number of trips.\n", "\n", "We will give our query a name 'taxiquery' and have it use an input variable '$YEAR'. We can then invoke the 'taxiquery' by giving it a YEAR. The to_dataframe() converts the BigQuery result into a Pandas dataframe." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "%bq query -n taxiquery\n", "WITH trips AS (\n", " SELECT EXTRACT (DAYOFYEAR from pickup_datetime) AS daynumber \n", " FROM `bigquery-public-data.new_york.tlc_yellow_trips_*`\n", " where _TABLE_SUFFIX = @YEAR\n", ")\n", "SELECT daynumber, COUNT(1) AS numtrips FROM trips\n", "GROUP BY daynumber ORDER BY daynumber" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daynumbernumtrips
01382014
12345296
23406769
34328848
45363454
\n", "
" ], "text/plain": [ " daynumber numtrips\n", "0 1 382014\n", "1 2 345296\n", "2 3 406769\n", "3 4 328848\n", "4 5 363454" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "query_parameters = [\n", " {\n", " 'name': 'YEAR',\n", " 'parameterType': {'type': 'STRING'},\n", " 'parameterValue': {'value': 2015}\n", " }\n", "]\n", "trips = taxiquery.execute(query_params=query_parameters).result().to_dataframe()\n", "trips[:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Benchmark

\n", "\n", "Often, a reasonable estimate of something is its historical average. We can therefore benchmark our machine learning model against the historical average." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Just using average=400309.558904 has RMSE of 51613.6516905\n" ] } ], "source": [ "avg = np.mean(trips['numtrips'])\n", "print 'Just using average={0} has RMSE of {1}'.format(avg, np.sqrt(np.mean((trips['numtrips'] - avg)**2)))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The mean here is about 400,000 and the root-mean-square-error (RMSE) in this case is about 52,000. In other words, if we were to estimate that there are 400,000 taxi trips on any given day, that estimate is will be off on average by about 52,000 in either direction.\n", " \n", "Let's see if we can do better than this -- our goal is to make predictions of taxicab demand whose RMSE is lower than 52,000.\n", "\n", "What kinds of things affect people's use of taxicabs?" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Weather data

\n", "\n", "We suspect that weather influences how often people use a taxi. Perhaps someone who'd normally walk to work would take a taxi if it is very cold or rainy.\n", "\n", "One of the advantages of using a global data warehouse like BigQuery is that you get to mash up unrelated datasets quite easily." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "\n", "
usafwbannamecountrystatecalllatlonelevbeginend
72503014732LA GUARDIA AIRPORTUSNYKLGA40.779-73.88+0003.41973010120180618
\n", "
(rows: 1, time: 1.3s, 2MB processed, job: job_jZ5uuQzxmiVMZvxxPOOyKnZldCcE)
\n", " \n", " \n", " " ], "text/plain": [ "QueryResultsTable job_jZ5uuQzxmiVMZvxxPOOyKnZldCcE" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%bq query\n", "SELECT * FROM `bigquery-public-data.noaa_gsod.stations`\n", "WHERE state = 'NY' AND wban != '99999' AND name LIKE '%LA GUARDIA%'" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Variables

\n", "\n", "Let's pull out the minimum and maximum daily temperature (in Fahrenheit) as well as the amount of rain (in inches) for La Guardia airport." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "%bq query -n wxquery\n", "SELECT EXTRACT (DAYOFYEAR FROM CAST(CONCAT(@YEAR,'-',mo,'-',da) AS TIMESTAMP)) AS daynumber,\n", " MIN(EXTRACT (DAYOFWEEK FROM CAST(CONCAT(@YEAR,'-',mo,'-',da) AS TIMESTAMP))) dayofweek,\n", " MIN(min) mintemp, MAX(max) maxtemp, MAX(IF(prcp=99.99,0,prcp)) rain\n", "FROM `bigquery-public-data.noaa_gsod.gsod*`\n", "WHERE stn='725030' AND _TABLE_SUFFIX = @YEAR\n", "GROUP BY 1 ORDER BY daynumber DESC" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daynumberdayofweekmintempmaxtemprain
0365546.048.20.17
1364434.048.00.13
2363333.846.90.37
3362239.062.10.02
4361146.062.60.14
\n", "
" ], "text/plain": [ " daynumber dayofweek mintemp maxtemp rain\n", "0 365 5 46.0 48.2 0.17\n", "1 364 4 34.0 48.0 0.13\n", "2 363 3 33.8 46.9 0.37\n", "3 362 2 39.0 62.1 0.02\n", "4 361 1 46.0 62.6 0.14" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "query_parameters = [\n", " {\n", " 'name': 'YEAR',\n", " 'parameterType': {'type': 'STRING'},\n", " 'parameterValue': {'value': 2015}\n", " }\n", "]\n", "weather = wxquery.execute(query_params=query_parameters).result().to_dataframe()\n", "weather[:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Merge datasets

\n", "\n", "Let's use Pandas to merge (combine) the taxi cab and weather datasets day-by-day." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daynumberdayofweekmintempmaxtemprainnumtrips
0365546.048.20.17339939
1364434.048.00.13319649
2363333.846.90.37311730
3362239.062.10.02301398
4361146.062.60.14268841
\n", "
" ], "text/plain": [ " daynumber dayofweek mintemp maxtemp rain numtrips\n", "0 365 5 46.0 48.2 0.17 339939\n", "1 364 4 34.0 48.0 0.13 319649\n", "2 363 3 33.8 46.9 0.37 311730\n", "3 362 2 39.0 62.1 0.02 301398\n", "4 361 1 46.0 62.6 0.14 268841" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.merge(weather, trips, on='daynumber')\n", "data[:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Exploratory analysis

\n", "\n", "Is there a relationship between maximum temperature and the number of trips?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/envs/py2env/lib/python2.7/site-packages/matplotlib/font_manager.py:1320: UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sans\n", " (prop.get_family(), self.defaultFamily[fontext]))\n" ] }, { "data": { "image/png": "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\nYkSkD1atE0BE+nXjjTciPz8fe/bsQWNjI5566il8/PHH2L9/P9xuNzZt2oRhw4bh7NmzWL58OVpb\nW9He3o709HQ89thjAIDHH38ccXFxWLVqFb755hvce++9+M1vfoN33nkHAPDDH/4QERER2L59OyIi\nIvD000/j73//O9rb2zFx4kSsWrUKkZGRmDdvHkaPHo3q6mqcPn0a999/P1JSUvD666+jvr4eBQUF\nmD59ujfdjzzyCP74xz+ioaEBy5cv974pkIgCIBARSRgxYoTw+uuvC4IgCH/4wx+EcePGCR9++KEg\nCIJQVFQkrFixQhAEQbh06ZLQ0tIiCIIguFwuYd68ecK+ffsEQRCEixcvCvfcc4/wwQcfCPPnz/du\nr3P7nd8TBEF4/PHHheLiYkEQBMHj8QjLli0T3n77bUEQBOHHP/6x8POf/1zweDxCXV2dcMsttwgv\nvPCCIAiCcPToUeH2228Xbfell14SBEEQvvjiC2HChAnCN998o/jxITIrthwQkV+dtfHRo0cDAKZO\nnQoAGDNmDD744AMAHVM+P/vss/jss88gCAK++eYbHD9+HFOmTEG/fv2wceNG5ObmYvLkybjvvvsk\n97V3715UV1fj1VdfBdDx3pDOF1IBHS9qioiIQEpKCmw2G77//e970+Z0OtHe3o7o6GgAHS/LAYCh\nQ4fipptuQlVVlenmvydSC4MDIvKrs7CNiIgQzZEfERHhffveq6++iubmZuzYsQPR0dH41a9+hfb2\ndu9nv/jiC8TGxuLs2bNwu92wWn3fegRBwH/8x38gNTXVb1qAjleWdy53vkLX7XaLPtN1u0Z/dTBR\nOHG0AhGF7MKFC0hOTkZ0dDScTicqKiq8f6utrcX69evx+uuvY8iQIdi4caP3b7Gxsd63UQIdby0s\nKiqCx+MB0PH20dra2qDStGvXLgBATU0NPv/8c+9roomodwwOiChk8+bNw6effoqcnBw88cQTSEtL\nAwC4XC4sW7YMK1aswLe//W088cQT2Lt3L/bt2wcAeOCBB3D//fdj5syZaG5uxuOPP46IiAjMnDkT\nM2bMwMKFC+F0OoNKU1RUFH74wx/iJz/5CQoLCzFw4EDF8ktkdhzKSESmwyGSRKFhywERERGJsOWA\niIiIRNhyQERERCIMDoiIiEiEwQERERGJMDggIiIiEQYHREREJMLggIiIiET+Pwgosdiegm1HAAAA\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "j = data.plot(kind='scatter', x='maxtemp', y='numtrips')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The scatterplot above doesn't look very promising. There appears to be a weak downward trend, but it's also quite noisy.\n", "\n", "Is there a relationship between the day of the week and the number of trips?" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAFYCAYAAADHkV+EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8U/X9P/BXmjal9ws0DXMFRYug\nyMXvpNRCq/GRFqy1F9rpVBydl03YGKJ1MCYDZLjvwAsb0y8dm1/GQ3SAtlU6v1RaoaAg/HRdRWFY\ntFAYSaCkl7S0adLz+6Nr0hOaULQnJ+15PR8PH/I+PSfnk88jbd7nc1UJgiCAiIiI6D8C5C4AERER\n+RcmB0RERCTC5ICIiIhEmBwQERGRCJMDIiIiEmFyQERERCKBchfAX5w/3zrorxkTEwqLpX3QX3co\nYl2IsT5cWBdirA8X1oXYYNdHXFyEx5+x5UBCgYFquYvgN1gXYqwPF9aFGOvDhXUh5sv6YHJARERE\nIkwOiIiISITJAREREYkwOSAiIiIRJgdEREQkwuSAiIiIRJgcEBERkQiTAyIiIhJhckBEREQiXD6Z\niIjIj1nbbdhacQJNbTZEh2kwL2M8wkM0kt6TyQEREZEf21pxAkeOm0XHnsiZJOk92a1ARETkx843\nXfIaS4HJARERkR+Liw7xGkuByQEREZEfy029DjERwQgOCkBMeDBy066T/J5MDoiIiPxYSfXXsLR2\norOrGxZrJ0r2fS35PZkcEBER+TGOOSAiIiKRmPBgcRwR7OHMwcPkgIiIyI8JEMSxIHg4c/AwOSAi\nIvJjF1s6xHFrh4czBw+TAyIiIj/W2m73GkuByQEREZEfCw8RL2YcPkL6xY2ZHBAREfmxkVEjvMZS\nkDQ50Ov1yMrKQnZ2NvLy8gAATU1NKCwsRHp6OgoLC9Hc3AygZ4DFmjVrYDAYkJWVhc8//9z5OiUl\nJUhPT0d6ejpKSkqcx48ePYqsrCwYDAasWbPGOUjD0z2IiIiGGpVK5TWWguQtB1u2bEFZWRnefvtt\nAEBxcTGSk5NRUVGB5ORkFBcXAwCqq6tRX1+PiooKPPfcc1i5ciWAni/6jRs3Yvv27dixYwc2btzo\n/LJfuXIlVq9ejYqKCtTX16O6utrrPYiIiIYa88U2cWxp83Dm4PF5t0JlZSVycnIAADk5OdizZ4/o\nuEqlwtSpU9HS0gKz2YwDBw4gJSUF0dHRiIqKQkpKCvbv3w+z2Qyr1Ypp06ZBpVIhJycHlZWVXu9B\nRET+z9puw6ulR7Hk5X14tfQorJdschdJVqYm8ewEk0X62QqSj2p45JFHoFKpcN999+G+++5DY2Mj\ntFotAECr1eLixYsAAJPJBJ1O57xOp9PBZDJddjw+Pr7f473nA/B4DyIi8n9ybFHszxwOwWssBUmT\ngzfeeAPx8fFobGxEYWEhxo0b5/Hc/hZ1UKlUV338m4qJCUVgoPobX+9JXFzEoL/mUMW6EGN9uLAu\nxJReH01ttstiJddJQIAKjm5BFEtdH5ImB/Hx8QCAkSNHwmAwoLa2FiNHjoTZbIZWq4XZbEZsbCyA\nnid/o9HovNZoNEKr1UKn0+Hw4cPO4yaTCdOnT/d4fu/9+ruHNxZL+6C8577i4iJw/nzroL/uUMS6\nEGN9uLAuxFgfQHSY5rJYyXUSNkKNlj5rG4SNUA9KfXhLMCQbc9De3g6r1er894cffojExETo9XqU\nlpYCAEpLS3HXXXcBgPO4IAioqalBREQEtFotZs6ciQMHDqC5uRnNzc04cOAAZs6cCa1Wi7CwMNTU\n1EAQhH5fy/0eRETk/+ZljMdtE7RITIjGbRO0mJcxXu4iySoqLNhrLAXJWg4aGxuxcOFCAIDD4cA9\n99yD1NRU3HLLLVi8eDF27tyJ0aNHY8OGDQCAtLQ07Nu3DwaDASEhIVi7di0AIDo6GgsWLEB+fj4A\nYOHChYiOjgbQM1th2bJl6OjoQGpqKlJTUwEAjz/+eL/3ICIi/xceosETOZPYivIfupFhaDjfJoql\nphJ8sYPDECDFB5AfbBfWhRjrw4V1Icb6cGFd9LBesmHr7hNoarMhOkyDeRnjER6iufKFVyBLtwIR\nERENAhke4aVfoJmIiIi+MTmmdjI5ICIiv2JsbMO6N2vQ3tGF0OAgFD04FboY6fvZ/dX5pkteYymw\nW4GIiPzKujdrYGntRGdXNyzWTqzbViN3kWQVHa7xGkuByQEREfmV1rZOr7HSDMuNl4iIiK6GHF+G\n/szS2uk1lgKTAyIi8ivamFCvsdLERYd4jaXA5ICIiPzKd0aFeY2VJjf1OsREBCM4KAAxEcHITbtO\n8ntytgIRkR+wttuwtWLwF7oZinJTr0Pd2WbnbAVffBn6s5Lqr51dCZ1dnSjZ97XkUxnZckBE5Ad6\n57J/2dCEI8fN2Lr7hNxFks0b738pmq3wxvtfyl0kWRkb27zGUmByQETkB+SYy+6vvjhlEcf1Fg9n\nKoO1w+41lgKTAyIiPyDHoDN/1e225Y97rDShwYFeYylwzAERkR/o3Za475gDxXLPBZSdG6DdraWg\nvZMtB0REyqDwL8C+goMCvMZKEx4ifo4PH8GWAyIiRZBjcx1/xUWQxEZFhaDhvGsQ4iiuc0BEpAwc\nkOgS5NZS4B4rTZdd3I3Q1cVuBSIiReCARBebze41VpqvzrV6jaXAbgUiIj/AAYl9qSAehKHsboXL\n3z83XiIiUgRrexfqzjbjtLEFdWeaYe3okrtIshmhET+3jvDB1D1/dmNCtDgeE+3hzMHD5ICIyA+s\ne7NGtCrgum01chdJNpHhQeI4LMjDmcpQmDkBt03QIjEhGrdN0KLw7gmS35PJARGRH7Be6vIaK8nI\nCPF4i5GRyh1/AUCWaa7KbqshIvIT3Y5ur7GSCG7fhoLCV0gsfucojtY3OeNLHTYsuf9WSe/J5EAC\n3F2NiK6Weyqg3NQAOG9pF8dN7R7OVIZjp5q8xlJgciABLmZCRPTNmZs6xLGlw8OZyiBH4sgxBxLg\nYiZEdLWiQoO8xkpidwheY6WJCBF/FiJ88NlgciABLmZCRFfrmYduRUxEMIKDAhATEYxnHpK2T9mf\nBbgtl+weK82Y+HBxrA33cObgkTw5cDgcyMnJwY9//GMAwNKlS6HX65GdnY3s7GwcO3YMQM+AkzVr\n1sBgMCArKwuff/658zVKSkqQnp6O9PR0lJSUOI8fPXoUWVlZMBgMWLNmjXPQSlNTEwoLC5Geno7C\nwkI0NzdL/TZF5mWMF007UfZiJkT9s7bb8GrpUSx5eR9eLT0K6yWb3EWSV9+2YmU/KGPiWPE8/onX\nSj+v359ZL9m9xlKQPDn461//iuuvv1507JlnnkFZWRnKysowceJEAEB1dTXq6+tRUVGB5557DitX\nrgTQ80W/ceNGbN++HTt27MDGjRudX/YrV67E6tWrUVFRgfr6elRXVwMAiouLkZycjIqKCiQnJ6O4\nuFjqtykSHqLBEzmT8OLiNDyRM4mDEYn60Ts258uGJhw5bsbW3SfkLpKs1v71sGidg7X/e1juIsnm\ngfTxolaUB9KV/YA17LoVjEYj9u7di/z8/CueW1lZiZycHKhUKkydOhUtLS0wm804cOAAUlJSEB0d\njaioKKSkpGD//v0wm82wWq2YNm0aVCoVcnJyUFlZKXotAMjJycGePXukfJtE9A1wbI6YtVPwGitJ\nSfXXrkSptRMl+76Wu0iyOmUUt36fOid9a7ikycHatWtRVFSEgADxbV566SVkZWVh7dq1sNl6mhJN\nJhN0Op3zHJ1OB5PJdNnx+Pj4fo/3ng8AjY2N0Gq1AACtVouLFy9K9h6JroaxsQ1P/fFD5C99F09t\n/BBGS9uVLxqmODaHPDlrbvUaK01rh8NrLAXJpjJ+8MEHiI2NxaRJk/Dxxx87jy9ZsgRxcXHo6urC\ns88+i+LiYvz0pz/td5ELlUp11ce/qZiYUAQGqr/x9Z7ExUUM+msOVawL4JlXP4KltRMA0NnViRff\n/CdeW5Ehc6nk8Uj2Lfj63IdobbchIlSDR7JvQVyc9AOt/FWgWiUalR+oVin2d+Z8c8dlsVLrAugZ\nkOno850XoJL+syFZcvDpp5+iqqoK1dXV6OzshNVqxdNPP43169cDADQaDfLy8vCXv/wFQM+Tv9Fo\ndF5vNBqh1Wqh0+lw+LCr781kMmH69OkezweAkSNHwmw2Q6vVwmw2IzY29orltVgGb5ENLoJ0ubi4\nCJw/r+zsHwBa2myXxUqtlz+XHcWF/3wJdDZ34M9lnyl6PZBr48NQ92+rKFbqZ8PeLVwWK7UuACAk\nOADWSw5RPBj14S3BkKxb4amnnkJ1dTWqqqrw4osvYsaMGVi/fj3M5p7FgQRBwJ49e5CYmAgA0Ov1\nKC0thSAIqKmpQUREBLRaLWbOnIkDBw6gubkZzc3NOHDgAGbOnAmtVouwsDDU1NRAEASUlpbirrvu\nEr0WANFxX+FAK/IkbIR4IFFYiHLnsv/7QpvXWGkazrd5jZXE9xsU+7eurm6vsRR8vkLi008/DYvF\nAkEQMGHCBKxatQoAkJaWhn379sFgMCAkJARr164FAERHR2PBggXOQY0LFy5EdHTPtJaVK1di2bJl\n6OjoQGpqKlJTUwEAjz/+OBYvXoydO3di9OjR2LBhg0/fIwdakSdFD07Fum01aO/oQuiIIBQ9MFXu\nIsnG2NjmNVaazi7Ba6wkoSPUoifl0BGD3+U7lHS5taS4x1LwSXKQlJSEpKQkAD1TG/ujUqnw61//\nut+f5efn9zvj4ZZbbsGuXbsuOx4TE4MtW7Z8ixJ/O3HRIag3topiIgDQxYThhYUp7GYB4L7oncIX\nwaM+5HhS9mvuvxs++F3h3goS6F30qO+YAyIib1QqoO84ayUvCsjlk8XcGwp80HDA5EAKvYsg8emQ\niAYqAIDDLVaqoMAAOPq0FgQFKrk25MEaJyLyA+4tBUpuOZg4VjzDbOK1V55xRoOLyQERySIwQPzt\nF6hW8LchgIjQYHEcFuzhzOGvQH+9aPnkAv31V75oGJNj9gaTAwlwQxmiK3NvKg5SK/vPUdGDU0Vf\niEqeycLlk8XCglVeYylwzIEEetc56EvJi7uQi7GxDeve/M9UxuAgFD04FbqYMLmLJQ9OZhfhTBYX\nTgcXcwgq9J2i0BNLi8mBBPjBduFqkWLr3qwRLZ+8blsNXliYInOp5OHei6DwhgMmjn3EhAejHq4E\nKSZCuV0sAGCzC15jKSj811Ea3FDGhatFirW2dXqNlaTLzrnsffUmjr1bNq/bViN3kWTTZbeL4y67\nhzOVQRMU4DWWApMDCeSmXufqOwwPRm7adXIXSTZsRRFz3xzs22wWNtR1uc1dd4+Vxnqpy2usJCca\nmrzGSnP96AivsRSYHEhge1Wd6Alge2Wd3EWSDVtRxLQxoV5jUi73nWb723lWKWwO77HSqAICvMZS\n4JgDCTDrdeFqkWKxEcE422eDodhI5falyrHqmz9TqwC7W0wEACfPtniNpcDkQALuCb+CHwC4WqSb\nr8+JE8Wv/63cxJHE1Go10KevXa1W9mZD1JfvN1dgt4IEbHaH15iUy9rR7TUm5boxIVocj4n2cObw\nx1muYuPdPhvusRTYciABR7f3mIjIXWHmBATuPsEuOAARYUFoaesSxUr2o8yJ2OrjzwaTAyIfUgeo\n4OjTua4OUO4z0aRrY3C03uKKr4uRsTR+QMHdj+7CgwNFyUF4sLK/quTonlV2jUuEXwDkiSZQhUs2\nQRQr1ePZN/v8acifvfbecfzjywvO2O7oxs/mTpaxRPJp77R7jUl6HHMgAY3bmvHuMSkX1znog0/K\nIv863eQ1VpJOtwWy3GOSHlsOJMCtV8mT8QnRqKlrFMVKVfzOURytd30BXuqwYcn9t8pYIrn5fkS6\nv+KARPnxkVYCcowspaHh+/obRKtnfv+uG+QukmyOnWryGivNOLdV79xjJWFdiMmx0y9bDiQgx8hS\nf8WNl8R2fHBStPHSjqqTiu1Xdm8oVnrDcVBQoNdYSVgXYnKMR1F2jUtFua2Bl+H21WLHTl30GitJ\nRKjbdLVQZU9X600aPcVKcsFtDxb3WGnkGI/C5EACf/n7MVG/cpfdgUX5U2QskXy48ZJYh63ba6wk\nY+LCcLStSRQrWfgItddYSawddq+x8nCFxGGBeyu4cOMl8sTa4fAaK82ZC+1eYyWJCA30GisNV0gc\nJhxuSyI6upX7dMiNl8iTuOgQ1BtbRbGScctml/iYMJw2tYliJctMHovPv74Iu0NAoFqFzJSxkt+T\nyYEE3LelV/Lyydx4SSw2XI2LVocoVqrc1OtQd7YZ7R1dCB0RhNy06+Qukqzsbn843GMl4UOF2Cul\nn6PrP5+HLoeAV97+HC8sTJH0nkwOJOBw+6V2j0m5Wi91e42VZHtVnWjmxvbKOsWOzSExPlSItbm1\nIrnHUmByIIEAlbj1QMmrJ3MqoxuVCqLBRApeIYtjc8gTY2Mb1r1Z09OqFByEogenQqfgroXQ4EDY\n7K61DUJHSP/VLfmARIfDgZycHPz4xz8GADQ0NKCgoADp6elYvHgxbLaeN2yz2bB48WIYDAYUFBTg\nzJkzztfYtGkTDAYDMjIysH//fufx6upqZGRkwGAwoLi42Hnc0z18JfG7kV5jJemdyvhlQxOOHDdj\n6+4TchdJVuEjxNP1wkOUPH2P6+BR/9a9WQNLayc6u7phsXZi3bYauYskq+/GhYrjUaEezhw8kicH\nf/3rX3H99dc74/Xr12P+/PmoqKhAZGQkdu7cCQDYsWMHIiMj8f7772P+/PlYv349AKCurg7l5eUo\nLy/H5s2bsWrVKjgcDjgcDqxevRqbN29GeXk5du3ahbq6Oq/38JXAQLXXWElMF9vEsaXNw5nKsCDv\nZgSpVVABCFKrsCDvZrmLJJvrr4n0GpNytbZ1eo2VRo6ZPZImB0ajEXv37kV+fj4AQBAEHDp0CBkZ\nGQCA3NxcVFZWAgCqqqqQm5sLAMjIyMDBgwchCAIqKyuRmZkJjUaDhIQEjB07FrW1taitrcXYsWOR\nkJAAjUaDzMxMVFZWer2Hr3x5pslrrCSt7XavsdJUHD6DLocAAT0Diyo+PnPFa4Yr991KuXsp9eIG\nZWJyTAmXtONi7dq1KCoqQltbz9OixWJBZGQkAgN7bqvT6WAymQAAJpMJo0eP7ilUYCAiIiJgsVhg\nMpkwZYprkFJ8fLzzGp1OJzpeW1vr9R7exMSEDtoTfmeXcFkcF6fMtcHDw4Jgsbqy/vDQIMXWBQCY\nLO2XxUqtj7ZOx2WxUusC6H+rd6XWR/zIMJwxW0WxUusCABY/8F949a1/wnSxHfGxoXhi7hREhkk7\ndkuy5OCDDz5AbGwsJk2ahI8//tjjeb0ZoSBcPqJfpVJ5PN7dz9oBnrLLgWSdFou0C44odcRts7Xz\nslipdQEA5y60XRYrtT7CgtWXxUqtCwC46doYfPbVRVGs1Ppoa798dL5S66LXj+ZMcM7e6GzvxPn2\nb9/V4i3hkiw5+PTTT1FVVYXq6mp0dnbCarXiN7/5DVpaWmC32xEYGAij0QitVgug5wn/3Llz0Ol0\nsNvtaG1tRXR0NHQ6HYxGo/N1TSaT85r+jsfExHi8h68EqVXOOam9sVJ1dXV7jZWm2y3ZdY+VhE3H\nYvemXIvjpyzOhW7unXWt3EWSTXhIoLjF0Qej80lMsjEHTz31FKqrq1FVVYUXX3wRM2bMwAsvvICk\npCTs3r0bAFBSUgK9Xg8A0Ov1KCkpAQDs3r0bM2bMgEqlgl6vR3l5OWw2GxoaGlBfX4/Jkyfjlltu\nQX19PRoaGmCz2VBeXg69Xg+VSuXxHr4yMnKE11hJOu0Or7HSBLh9AbrHSmJ2G6xqVvhg1d6FbnrH\no7zy9udyF0k2upFhXmOSns/TsaKiIjz55JN4+eWXMXHiRBQUFAAA8vPzUVRUBIPBgKioKLz00ksA\ngMTERMyZMwd333031Go1VqxYAbW6pzlyxYoVePTRR+FwODB37lwkJiZ6vYevdHQ5vMZKInR7j5VG\nGxOKs326FrQx0k9J8lfGi+JNuIyNyt6US46FbvwVV0iUn0+Sg6SkJCQlJQEAEhIS+p1aGBwcjN//\n/vf9Xv/EE0/giSeeuOx4Wloa0tLSLjvu6R6+cqnD5jVWEt/vJebfvjMqTJQcfGeUcp+ILltmXOEf\nDk2gCrY+k3k0QcptVeIKifJjR44EOu3eY1IuPhGRJwHqAACuVsaAAG6aSz3kWGmWyQGRLyn86Zg8\nu+Q2tdM9JuX6y9+Poaau0Rl32R2S70PC5EAC0WEaNLW5uhKiwxW8lwCJvPbecfzjywvO2O7oxs/m\nTpaxRPJx22WCiye7z1xR8EwW7skiJsc+JGy3kkBh5o3OP3QqAD+650Y5iyOr8QmRXmOl+eLrRq+x\nkoSNcFvnIES5y4wDQFzUCK+xknBPFne+34eEyYEEXis/7nwiEgD85d3jchZHVj/Nm4zbJmiRmBCN\n2yZo8dM8ZT4l9+q0C15jJYlyW+HNPVaaa7QRXmMlOd90yWusNONGiz8L474j/WeD3QoSaG7r8hor\nCUcdkyetl+xeY6XJTb0OdWebndsU56ZdJ3eRZBMXHYJ6Y6soVrKgIHGrWpAPNvNjciABTt9zYd8h\neXKpQ5w0X1LwvH4A2PHBSVhae1YF7OzqxI6qk4odjyJKlEYoO1EC4PxceIqlwG4FkhT7DskT95W0\nFb6yNv51uslrrCQl1V/D0tqJzq5uWFo7UbLva7mLJKthtysjkcltiVyTwpfI5Qh98kRwa2N0j5XE\n2NjmNVYaOdZHYXJAkmppE68O2WJV7mqRALuc+gpQAX12KEaAwjOlIHUALvVZBCkoULkNu9YOu9dY\naeQYu6XcTx/5hNVt61X3mJTrprHRXmOluWz2Rqhyx+ZEhAZ6jUl6TA5IUu4z9RQ8c4/cPJ49STTN\n9fHsSXIXSVbcidAlPibMa0zSYzomgQkJkTje0CKKicgNE0UR7rvhwrqQH5MDCSzIm4ytu0/wg03k\nhRzrxfszrgniwroQ48ZLwwQ/2C4BALrdYiW7bnQ4vj5nFcVKJcd68URDUe+U8L6eyJG2G47JgQS4\n8I/LiGA12vvsLjciWNnr59ts4p32bF3K3XmP+wyJ8e8GeSLHctJMDiTAnfdcxmjDROMvxmiVPbDI\n3NQhji0dHs4c/oI1alzqkywFa5SdOBa/cxRH612tJ5c6bFhy/60ylkg+TJTE5FhOmsmBBI6ftniN\nlcTo9uXnHpNyRYQEoanPuhcRIUEylkZ+x041eY2VpPjdz3H0a9ffzUudXVhy3zQZSyQvOQZoKr0L\nWBKdbk3H7rGSWNttXmNSLk7dE3NfPVrJq0kfq2/yGiuODF1ubDmQAPtSXVQq8YLBPbFyxUWNwL8v\nXhLFSsXpamJRoRo09VlRVMlbWHe7/dF0j5WGAxKHieCgAHT02UUmOEi5DTTamFCcvdAmipVMGxsq\nSg60scqtD87qEXvmoWlYt63GuRNh0QNT5S6SbNRqFewOQRQrGQckDhMTx8biH3WuAYkTr42VsTTy\nio0IFiUHsZHBMpZGfu4tJ0puSeGgMzFdTBheWJjCZAlAfMwInL1wSRQrWUx4MOrh+kzEREj/d5TJ\ngQQKMycgkIsgAQBOmcV/5E6ZlP1HT4592f0VF0EiT74zKkKUHHxnVISMpZFfl1288VRXl/QbUQ0o\nOXjttdeQn5+PiIgIFBUV4bPPPsOvfvUrzJw5U+ryDUlsLnW51OnwGitNdLjGa6wkx09d9BqTcnE8\nithX51q9xlIYUGf422+/jYiICBw6dAgXL17E2rVr8eKLL0pdNhoOODpTxNEteI2VxP3hxwcPQzRE\n9D5gvbg4DU/kTFJ0d1MP9+5H6bsjB5QcqNU9i5N8/PHHyMrKwq233gpB4X/kaWDcR+MreXQ+AJw8\n2+I1VhKN20BdjUa5A3eJvLkxQbyd+Y1jpN/efEC/jSNGjMCrr76Kd999FykpKRAEAV1dXV6v6ezs\nRH5+Pu69915kZmbi97//PQBg6dKl0Ov1yM7ORnZ2No4dOwYAEAQBa9asgcFgQFZWFj7//HPna5WU\nlCA9PR3p6ekoKSlxHj969CiysrJgMBiwZs0aZ8LS1NSEwsJCpKeno7CwEM3NzVdXKzRo4mPdtl5V\n+Fx296RayUn2hDExXmMi6lGYOUG0vXnh3RMkv+eAxhw8//zz2LZtG5555hnExcXh9OnTyMrK8nqN\nRqPBli1bEBYWhq6uLjzwwANITU0FADzzzDOYPXu26Pzq6mrU19ejoqIC//znP7Fy5Urs2LEDTU1N\n2LhxI9566y2oVCrk5eVBr9cjKioKK1euxOrVqzF16lQ89thjqK6uRlpaGoqLi5GcnIzHH38cxcXF\nKC4uRlFR0TesIvo25BhI48+CggJESwYHKXiaKwfuEg2MHOPYBpQcXHfddVi+fDna2trQ1taGMWPG\n4Mc//rHXa1QqFcLCep4S7XY77Ha712lblZWVyMnJgUqlwtSpU9HS0gKz2YzDhw8jJSUF0dE9zSgp\nKSnYv38/pk+fDqvVimnTepbUzMnJQWVlJdLS0lBZWYmtW7c6j8+bN8+nyQGnaLmc/Her11hposM1\naGnrEsVKxYG7RP5rQI8tJ0+exNy5czFjxgwkJycjPz8fX3311RWvczgcyM7Oxu23347bb78dU6b0\nTFN66aWXkJWVhbVr18Jm61kRzGQyQafTOa/V6XQwmUyXHY+Pj+/3eO/5ANDY2AitVgsA0Gq1uHjR\nt6Ogi9/9HEeOm/FlQxOOHDej+J3Pr3zRMNXptuuge6w08TFhXmMiIn8woJaDZcuWYd68ecjOzgYA\nvPPOO1i6dCm2b9/u9Tq1Wo2ysjK0tLRg4cKFOHHiBJYsWYK4uDh0dXXh2WefRXFxMX7605/22/eq\nUqmu+vg3FRMTisDAwdkVrr8NVOLilDlP130wfrcAxdYFADySfQu+PvchWtttiAjV4JHsWxAXFy53\nsWSn5M9Ef1gfLqwLMV/Vx4CSA7vdjpycHGecnZ2NLVu2DPgmkZGRSEpKwv79+/HII48A6BmTkJeX\nh7/85S8Aep78jUaj8xqj0QizTsAEAAAgAElEQVStVgudTofDhw87j5tMJkyfPt3j+QAwcuRImM1m\naLVamM1mxMZeeYVCi6V9wO/nSvpbF5zNpi5Kros/lx3FheaenSk7mzvw57LPJF8j3d+xW0GM9cGu\nWXdS1Ye3RGNA3Qo33ngj/t//+3/O+JNPPsHUqd7X/b548SJaWnqmaXV0dOCjjz7CuHHjYDb3bB4h\nCAL27NmDxMREAIBer0dpaSkEQUBNTQ0iIiKg1Woxc+ZMHDhwAM3NzWhubsaBAwcwc+ZMaLVahIWF\noaamBoIgoLS0FHfddZfotQCIjvtKVGiQ15iUS4410omGmt6Nhnq7ZrfuPiF3kWQlR30MqOXgiy++\nQGlpKcaMGQMAOH36NCZOnIj8/HwAwM6dOy+7xmw2Y+nSpXA4HBAEAbNnz8add96Jhx9+GBaLBYIg\nYMKECVi1ahUAIC0tDfv27YPBYEBISAjWrl0LAIiOjsaCBQuc91q4cKFzcOLKlSuxbNkydHR0IDU1\n1Tkb4vHHH8fixYuxc+dOjB49Ghs2bPg2dXTVnnnoVm6gQv2Kiw5BvbFVFBORGJNoMTnqQyUMYKJ1\n32b9/kyfPn3QCiQXKZrx2DwIPL7uA9HuaoFqFYqL7pSxRPKyXrJh6242l/bF3xMx1gfwaulR0RbF\nt03QKrr7Tar68NatMKCWg+Hw5U/yiHfbsjle4Vs2c/qeC/uVxVgfLtxbQUyO+vCaHKxbtw5FRUVY\ntGhRvzMBfN1cT0OPNjpElBxoY9iMTj16+1H7UvLTIevDhUm0mN8tgvRf//VfAIA771RuM/A3wScA\nF66QSJ6wX1mM9UH+xGtyoNfr4XA40NDQgEWLFvmqTEPea+8dxz++vOCM7Y5u/GzuZBlLJB85thql\noYGDM8VYH+RPrjjmQK1W48iRI74oy7Bx/LTFa6wsvt9qlIYG9iuLsT7InwxoQOIdd9yBP//5z8jJ\nyUFoqGtAWUgIM9v+dNocXmMluTEhGv+oc7Wi+GKrURoa2K8sxvogfzKg5GDdunXO//cuXaxSqZzb\nLZOY++RQBe/Ky533iIi+JTnGsQ0oOTh+/LikhRhugoMC0NHVLYqVik9DRETfjhwzWQb0rfWb3/xm\nQMeoxw3XRInj70Z5OHP4s7bb8GrpUSx5eR9eLT0K6yWb3EUiIhpS5JjJMqCWg777KvTiIEXPgoLE\nuzsGDdJuj0MR524TEX07csxk8ZocvPfee3jvvfdw9uxZ/PznP3cet1qtGDFihOSFG6osrZ1eYyXh\n3G2igeH6KOSJ362QeN111+GOO+7AZ599hjvuuMN5PDw8HMnJyVKXbcjifGWX6HCN15iIerCVjTzx\nuxUSJ0yYgAkTJkCv1zt3QqQr43xlF7uj22tMRD3Yykb+ZEBjDhwOBzZs2IDTp0/D3mc5XO6t0D+O\n0HepO9PkNSaiHmxxJH8yoORgwYIFuOmmm5CcnAy1WrmD6+jquW+lwK0VqBf72MXY4kj+ZEDJwaVL\nl/DrX/9a6rIMG/yj56IJCsClPitEajTKXfOBxNjHLsYWR/InA/pLPWXKFPzrX/+SuizDxmvvHceR\n42Z82dCEI8fNeO3vyl1Eyn2NB/c1IEi52MdO5L8G1HJw//3346GHHoJOp0NwcLDz+M6dOyUr2FD2\nr9NNXmMlEbq7vcakXOxjJ/JfA0oOioqK8JOf/AQ33XQTxxwMiPtmCsrdXIFbNpMn7GMn8l8DSg6C\ng4PxyCOPSF2WYWN8QjRq6hpFsXJxy2bqH/vYifzXgJKDWbNmobq6GqmpqVKXZ1j4UeZEbOVOhAC4\nZbM7DlYloqFgQMnB9u3bUVxcjLCwMGg0GueWzQcPHpS6fEMSn4hcuGWzGEfoE9FQMKDk4K233pK6\nHDRMMVES4wh9IhoKBpQcXHPNNVKXg0gROEKfiIaCASUHM2bMgEp1+UAydisQXR2O0CeioeCquxU6\nOzvx7rvvIjBwQJcSUR/sZiG6Mg7cld+AVki85pprnP+NGzcOP//5z/Hxxx97vaazsxP5+fm49957\nkZmZid///vcAgIaGBhQUFCA9PR2LFy+GzWYDANhsNixevBgGgwEFBQU4c+aM87U2bdoEg8GAjIwM\n7N+/33m8uroaGRkZMBgMKC4udh73dA8iIvJ/vQN3e1eZ3br7hNxFUpxvtNB9Q0MDzp496/UcjUaD\nLVu24J133kFpaSn279+PmpoarF+/HvPnz0dFRQUiIyOdqyzu2LEDkZGReP/99zF//nysX78eAFBX\nV4fy8nKUl5dj8+bNWLVqFRwOBxwOB1avXo3NmzejvLwcu3btQl1dHQB4vIevWNtteLX0KJa8vA+v\nlh6F9ZJykxNjYxue+uOHyF/6Lp7a+CGMlja5i0REfo4Dd+U3oORgxowZSE5ORnJyMpKSkpCTk4OF\nCxd6vUalUiEsLAwAYLfbYbfboVKpcOjQIWRkZAAAcnNzUVlZCQCoqqpCbm4uACAjIwMHDx6EIAio\nrKxEZmYmNBoNEhISMHbsWNTW1qK2thZjx45FQkICNBoNMjMzUVlZCUEQPN7DV5j1uqx7swaW1k50\ndnXDYu3Eum01cheJiPyc+0BdDtz1vasecxAYGIhRo0YNaBllh8OBvLw8nD59Gg888AASEhIQGRnp\nHK+g0+lgMpkAACaTCaNHj3beIyIiAhaLBSaTCVOmTHG+Znx8vPManU4nOl5bWwuLxeLxHr7CrNel\n7VKX15iIyB0H7srvqqYy2mw2OBwOZx9+SIj3bE6tVqOsrAwtLS1YuHAhvvrqq8vO6Z0FIQiX7z+g\nUqk8Hu/uZwOf/mZUeDveV0xMKAIDB2ffiO/GR4imq303PgJxcRGD8tpDTWSYBheaO0SxUuvCHevB\nhXUBNLfZ8D9v/ROmi+2Ijw3FE3OnIDJMmYPw4gCseCxZ7mL4JV/9rgwoOaioqMCaNWtw/vx5AHCu\nkHjs2LEB3SQyMhJJSUmoqalBS0sL7HY7AgMDYTQaodVqAfQ84Z87dw46nQ52ux2tra2Ijo6GTqeD\n0Wh0vpbJZHJe09/xmJgYj/fwxmJpH9B7GYjv3zEOnZ12Z9b7/TvGKXZk+pL7p2Ddthq0d3QhdEQQ\nltw/RbF10RdnK7iwLnq8WnrUuXrmlw1N6Oy0K371TH42xAa7PrwlGgNKDtatW4eXX34ZU6dORUDA\nwMYwXrx4EYGBgYiMjERHRwc++ugjPPbYY0hKSsLu3buRmZmJkpIS6PV6AIBer0dJSQmmTZuG3bt3\nO9dW0Ov1eOqpp1BYWAiTyYT6+npMnjwZgiCgvr4eDQ0NiI+PR3l5OV544QWoVCqP9/AVTldz0cWE\n4YWFKawLoitgdyT5kwElB1FRUbj11luv6oXNZjOWLl0Kh8MBQRAwe/Zs3Hnnnbjhhhvw5JNP4uWX\nX8bEiRNRUFAAAMjPz0dRUREMBgOioqLw0ksvAQASExMxZ84c3H333VCr1VixYoVzvMOKFSvw6KOP\nwuFwYO7cuUhMTATQs8V0f/cgIvJXXD2T/IlK6K9T382mTZsQERGBu+++G8HBwc7jVxpzMJRI8VTL\np2UX1oUY68OFddHDesl22W6uSl/4h58NMV92KwwoOZgwYYLrgv8MEryaMQdDAZMDabEuxFgfLqwL\nMdaHC+tCzO/GHBw/fnzQCkNERET+7RutkEhERETDF5MDIiIiEuHWiiQp7q5GRDT0MDkgSfXuM9GX\n0hd2ISLyd+xWIElxYRcioqGHyQFJirurERENPexWIElxdzUioqGHyQFJivtMEBENPUwOJMAR+kRE\nNJQxOZAAR+gTEX1zfMCSH5MDCXCEPhHRN8cHLPlxtoIEOEKfiOib4wOW/NhyIAGO0Cci+ubiokNQ\nb2wVxeRbTA6kcMVNsImIyBM+YMmPyYEE2F9GRPTNcQq0/DjmQALsLyMioqGMyYEEOCCRiIiGMnYr\nSID9ZURENJQxOZAA+8uIiGgoY7cCERERiTA5ICIiIhEmB0RERCTC5ICIiIhEOCCRiIjIj8mxSyWT\nAyIiIj8mx6q7knUrnDt3DvPmzcOcOXOQmZmJLVu2AAD+8Ic/YNasWcjOzkZ2djb27dvnvGbTpk0w\nGAzIyMjA/v37ncerq6uRkZEBg8GA4uJi5/GGhgYUFBQgPT0dixcvhs1mAwDYbDYsXrwYBoMBBQUF\nOHPmjFRvk4iISFJyrLorWXKgVquxdOlSvPfee/jb3/6Gbdu2oa6uDgAwf/58lJWVoaysDGlpaQCA\nuro6lJeXo7y8HJs3b8aqVavgcDjgcDiwevVqbN68GeXl5di1a5fzddavX4/58+ejoqICkZGR2Llz\nJwBgx44diIyMxPvvv4/58+dj/fr1Ur1NIiIiScmx6q5kyYFWq8XNN98MAAgPD8e4ceNgMpk8nl9Z\nWYnMzExoNBokJCRg7NixqK2tRW1tLcaOHYuEhARoNBpkZmaisrISgiDg0KFDyMjIAADk5uaisrIS\nAFBVVYXc3FwAQEZGBg4ePAhB4FaJREQ09MzLGI/bJmiRmBCN2yZofbLqrk/GHJw5cwbHjh3DlClT\n8Omnn+L1119HaWkpJk2ahKVLlyIqKgomkwlTpkxxXhMfH+9MJnQ6neh4bW0tLBYLIiMjERgY6Dyn\n93yTyYTRo0f3vMHAQERERMBisSA2NtZjGWNiQhEYqB709x4XFzHorzlUsS7EWB8urAsx1ocL6wKI\nA7DisWSf3lPy5KCtrQ2LFi3CL3/5S4SHh+MHP/gBFixYAJVKhQ0bNuC3v/0tnn/++X6f7FUqFbq7\nu/s93p/e455eyxuLpX0gb+eqcPlkF9aFGOvDhXUhxvpwYV2IDXZ9eEu8JF3noKurC4sWLUJWVhbS\n09MBAKNGjYJarUZAQAAKCgrw2WefAeh58jcajc5rTSYTtFqtx+MxMTFoaWmB3W4HABiNRmi1Wudr\nnTt3DgBgt9vR2tqK6OhoKd8qERHRsCFZciAIApYvX45x48ahsLDQedxsdk3H2LNnDxITEwEAer0e\n5eXlsNlsaGhoQH19PSZPnoxbbrkF9fX1aGhogM1mQ3l5OfR6PVQqFZKSkrB7924AQElJCfR6vfO1\nSkpKAAC7d+/GjBkzrthyQERERD0k61b45JNPUFZWhvHjxyM7OxsAsGTJEuzatQvHjx8HAFxzzTVY\nvXo1ACAxMRFz5szB3XffDbVajRUrVkCt7hkDsGLFCjz66KNwOByYO3euM6EoKirCk08+iZdffhkT\nJ05EQUEBACA/Px9FRUUwGAyIiorCSy+9JNXbJCIaFHIsdEPkiUrgMH4AkKRfi/1lLqwLMdaHC+ui\nx6ulR0UL3dw2QSv5Qjf+jp8NMV+OOeAKiUREfkCOhW5oaODyyUREChUXHYJ6Y6soJgLkWT6ZyQER\nkR/oXdim79MhESBPqxKTAyIiPxAeosETOZPYz06XkaNVickBERGRH5OjVYnJARERkR+To1WJyQFJ\ninO3iYiGHiYHJCk5RtkSEdG3I+neCkScu01ENPQwOSBJuY+q5dxtIiL/x24FkhTnbhMRDT1MDkhS\nnLtNRDT0sFuBiIiIRJgcEBERkQiTAyIiIhJhckBEREQiTA6IiIhIhMkBERERiTA5ICIiIhEmB0RE\nRCTC5ICIiIhEmBwQERGRCJMDIiIiEmFyQERERCJMDoiIiEiEyQERERGJSJYcnDt3DvPmzcOcOXOQ\nmZmJLVu2AACamppQWFiI9PR0FBYWorm5GQAgCALWrFkDg8GArKwsfP75587XKikpQXp6OtLT01FS\nUuI8fvToUWRlZcFgMGDNmjUQBMHrPYiIiOjKJEsO1Go1li5divfeew9/+9vfsG3bNtTV1aG4uBjJ\nycmoqKhAcnIyiouLAQDV1dWor69HRUUFnnvuOaxcuRJAzxf9xo0bsX37duzYsQMbN250ftmvXLkS\nq1evRkVFBerr61FdXQ0AHu9BREREVyZZcqDVanHzzTcDAMLDwzFu3DiYTCZUVlYiJycHAJCTk4M9\ne/YAgPO4SqXC1KlT0dLSArPZjAMHDiAlJQXR0dGIiopCSkoK9u/fD7PZDKvVimnTpkGlUiEnJweV\nlZWi13K/BxEREV2ZT8YcnDlzBseOHcOUKVPQ2NgIrVYLoCeBuHjxIgDAZDJBp9M5r9HpdDCZTJcd\nj4+P7/d47/kAPN6DiIiIrixQ6hu0tbVh0aJF+OUvf4nw8HCP5/WOF+hLpVJd9fFvKiYmFIGB6m98\nvSdxcRGD/ppDFetCjPXhwroQY324sC7EfFUfkiYHXV1dWLRoEbKyspCeng4AGDlyJMxmM7RaLcxm\nM2JjYwH0PPkbjUbntUajEVqtFjqdDocPH3YeN5lMmD59usfzvd3DG4ulfVDec19xcRE4f7510F93\nKGJdiLE+XFgXYqwPF9aF2GDXh7dEQ7JuBUEQsHz5cowbNw6FhYXO43q9HqWlpQCA0tJS3HXXXaLj\ngiCgpqYGERER0Gq1mDlzJg4cOIDm5mY0NzfjwIEDmDlzJrRaLcLCwlBTUwNBEPp9Lfd7EBER0ZVJ\n1nLwySefoKysDOPHj0d2djYAYMmSJXj88cexePFi7Ny5E6NHj8aGDRsAAGlpadi3bx8MBgNCQkKw\ndu1aAEB0dDQWLFiA/Px8AMDChQsRHR0NoGe2wrJly9DR0YHU1FSkpqYCgMd7EBER0ZWphP467xVI\niqYrNom5sC7EWB8urAsx1ocL60JsWHQrEBER0dAk+WwFIiKiq2Ftt2FrxQk0tdkQHabBvIzxCA/R\nyF0sRWFyQEREfmVrxQkcOW4WHXsiZ5JMpVEmdisQEZFfOd90yWtM0mNyQEREfiUuOsRrTNJjtwIR\nEfmVeRnjAUA05oB8i8kBERH5lfAQDZ7ImcSpjDJitwIRERGJMDkgIiIiESYHREREJMLkgIiIiESY\nHBAREZEIkwMiIiISYXJAREREIkwOiIiISITJAREREYkwOSAiIiIRJgdEREQkwuSAiIiIRJgcEBER\nkQiTAyIiIhJhckBEREQiTA6IiIhIhMkBERERiTA5ICIiIhEmB0RERCQiWXKwbNkyJCcn45577nEe\n+8Mf/oBZs2YhOzsb2dnZ2Ldvn/NnmzZtgsFgQEZGBvbv3+88Xl1djYyMDBgMBhQXFzuPNzQ0oKCg\nAOnp6Vi8eDFsNhsAwGazYfHixTAYDCgoKMCZM2ekeotERETDkmTJQV5eHjZv3nzZ8fnz56OsrAxl\nZWVIS0sDANTV1aG8vBzl5eXYvHkzVq1aBYfDAYfDgdWrV2Pz5s0oLy/Hrl27UFdXBwBYv3495s+f\nj4qKCkRGRmLnzp0AgB07diAyMhLvv/8+5s+fj/Xr10v1FomIiIYlyZKD2267DVFRUQM6t7KyEpmZ\nmdBoNEhISMDYsWNRW1uL2tpajB07FgkJCdBoNMjMzERlZSUEQcChQ4eQkZEBAMjNzUVlZSUAoKqq\nCrm5uQCAjIwMHDx4EIIgSPMmiYiIhiGfjzl4/fXXkZWVhWXLlqG5uRkAYDKZoNPpnOfEx8fDZDJ5\nPG6xWBAZGYnAwEAAgE6ng8lkcr7W6NGjAQCBgYGIiIiAxWLx1dsjIiIa8gJ9ebMf/OAHWLBgAVQq\nFTZs2IDf/va3eP755/t9slepVOju7u73eH96j3t6rSuJiQlFYKD6iuddrbi4iEF/zaGKdSHG+nBh\nXYixPlxYF2K+qg+fJgejRo1y/rugoAA/+clPAPQ8+RuNRufPTCYTtFotAPR7PCYmBi0tLbDb7QgM\nDITRaHSer9PpcO7cOeh0OtjtdrS2tiI6OvqKZbNY2gflPfYVFxeB8+dbB/11hyLWhRjrw4V1Icb6\ncGFdiA12fXhLNHzarWA2m53/3rNnDxITEwEAer0e5eXlsNlsaGhoQH19PSZPnoxbbrkF9fX1aGho\ngM1mQ3l5OfR6PVQqFZKSkrB7924AQElJCfR6vfO1SkpKAAC7d+/GjBkzBtRyQERERD0kazlYsmQJ\nDh8+DIvFgtTUVPzsZz/D4cOHcfz4cQDANddcg9WrVwMAEhMTMWfOHNx9991Qq9VYsWIF1OqeJv4V\nK1bg0UcfhcPhwNy5c50JRVFREZ588km8/PLLmDhxIgoKCgAA+fn5KCoqgsFgQFRUFF566SWp3iIR\nEdGwpBI4lB8AJGm6YpOYC+tCjPXhwroQY324sC7Ehm23AhEREfk/JgdEREQkwuSAiIiIRHw6lZFI\n6aztNmytOIGmNhuiwzSYlzEe4SEauYtFRCTC5IDIh7ZWnMCR42bRsSdyJslUGiKi/rFbgciHzjdd\n8hoTEfkDJgdEPhQXHeI1JiLyB+xWIPKheRnjAUA05oCIyN8wOSDyofAQDZ7ImcTFXYjIr7FbgYiI\niESYHBAREZEIkwMiIiISYXJAREREIkwOiIiISITJAREREYkwOSAiIiIRJgdEREQkwuSAiIiIRJgc\nEBERkYhKEARB7kIQERGR/2DLAREREYkwOSAiIiIRJgdEREQkwuSAiIiIRJgcEBERkQiTAyIiIhIJ\nlLsAw9GyZcuwd+9ejBw5Ert27ZK7OLI6d+4cnnnmGVy4cAEBAQH4/ve/jx/+8IdyF0sWnZ2dePDB\nB2Gz2eBwOJCRkYFFixbJXSxZORwOzJ07F/Hx8di0aZPcxZGVXq9HWFgYAgICoFar8fbbb8tdJFm1\ntLTgV7/6FU6cOAGVSoW1a9di2rRpchfL57766is8+eSTzrihoQGLFi3C/PnzJb0v1zmQwJEjRxAa\nGopf/OIXik8OzGYzzp8/j5tvvhlWqxVz587FH//4R9xwww1yF83nBEFAe3s7wsLC0NXVhQceeADL\nly/H1KlT5S6abF577TUcPXoUVquVyYFej507dyI2NlbuoviFX/ziF/je976HgoIC2Gw2dHR0IDIy\nUu5iycrhcCA1NRXbt2/HNddcI+m92K0ggdtuuw1RUVFyF8MvaLVa3HzzzQCA8PBwjBs3DiaTSeZS\nyUOlUiEsLAwAYLfbYbfboVKpZC6VfIxGI/bu3Yv8/Hy5i0J+xmq14siRI87PhkajUXxiAAAHDx5E\nQkKC5IkBwOSAfOjMmTM4duwYpkyZIndRZONwOJCdnY3bb78dt99+u6LrYu3atSgqKkJAAP8M9Xrk\nkUeQl5eHv/3tb3IXRVYNDQ2IjY3FsmXLkJOTg+XLl6O9vV3uYsmuvLwc99xzj0/uxd9K8om2tjYs\nWrQIv/zlLxEeHi53cWSjVqtRVlaGffv2oba2FidOnJC7SLL44IMPEBsbi0mTJsldFL/xxhtvoKSk\nBH/605/w+uuv48iRI3IXSTZ2ux1ffPEFfvCDH6C0tBQhISEoLi6Wu1iystlsqKqqwuzZs31yPyYH\nJLmuri4sWrQIWVlZSE9Pl7s4fiEyMhJJSUnYv3+/3EWRxaeffoqqqiro9XosWbIEhw4dwtNPPy13\nsWQVHx8PABg5ciQMBgNqa2tlLpF8dDoddDqds2Vt9uzZ+OKLL2Qulbyqq6tx8803Y9SoUT65H5MD\nkpQgCFi+fDnGjRuHwsJCuYsjq4sXL6KlpQUA0NHRgY8++gjjxo2TuVTyeOqpp1BdXY2qqiq8+OKL\nmDFjBtavXy93sWTT3t4Oq9Xq/PeHH36IxMREmUsln7i4OOh0Onz11VcAevrar7/+eplLJa/y8nJk\nZmb67H6cyiiBJUuW4PDhw7BYLEhNTcXPfvYzFBQUyF0sWXzyyScoKyvD+PHjkZ2dDaCnftLS0mQu\nme+ZzWYsXboUDocDgiBg9uzZuPPOO+UuFvmBxsZGLFy4EEDPuJR77rkHqampMpdKXs8++yyefvpp\ndHV1ISEhAc8//7zcRZLNpUuX8NFHH2H16tU+uyenMhIREZEIuxWIiIhIhMkBERERiTA5ICIiIhEm\nB0RERCTC5ICIiIhEmBwQkVc33ngj2traBv119+zZgzlz5iAnJ8c5n10KH3/8MfLy8iR7faLhiOsc\nEJEs3nzzTSxatAhz5syRuyhE5IYtB0QkUlFRgdmzZ+P+++/HK6+84jz+1FNPIS8vD1lZWVi4cCGa\nm5sBAI899hj+7//+T3T9j370IwDAqVOn8MMf/hBZWVnIzc1FdXU1gJ5Nlz755BOsX78e8+bNw5tv\nvolVq1YBAGpra3HjjTc6lw9euXKlcyOif/7zn5g3bx7y8vKQl5eHvXv3Ou+7b98+3H///cjLy8N9\n992Hmpqay95bS0sLHn74Yfzv//7v4FUY0XAkEBH9x4ULF4Tp06cLJ0+eFARBEIqLi4Xx48cLVqtV\naGxsdJ734osvCuvWrRMEQRD27dsnPPTQQ86fPfzww8L7778vCIIg5OfnC9u3bxcEQRC+/PJLYfr0\n6c7Xeeihh4SqqipBEAShvr5eyMjIEARBEP7nf/5HuO+++4RNmzYJgiAI6enpwqlTp4Tm5mYhOztb\nMJlMgiAIgslkEmbNmiU0NzcLp06dEr7//e8Lra2tgiAIwokTJ4S0tDRBEATh0KFDQm5urnDmzBkh\nNzdXeO+99wa/4oiGGXYrEJFTTU0NbrrpJueeD/fdd59zz4OysjK8++676OrqQnt7O6699loAwKxZ\ns/D888/j5MmTAHq2273zzjthtVpx7NgxzJ07FwBwww03YOLEiaipqYFerxfdd+zYsejs7ITRaMTB\ngwexZMkSvPrqq8jKykJXVxfGjBmDffv24cyZM3jsscec16lUKpw6dQq1tbU4ffo0HnzwQefP7HY7\nLly4AAA4f/48Hn74Yfz3f/83vve970lTeUTDCJMDInISPKymfuzYMbzxxht48803ERsbi3fffRfb\nt28H0PMF/eCDD2Lbtm0AehIKtVrt8R4qlarf4zNmzMDevXvR2NiI6dOnY/Xq1di7dy+SkpKcZbvx\nxhvx+uuvX3ZtbW0tZs2ahd/97neX/ezkyZOIioqCTqdDdXU1kwOiAeCYAyJymjZtGr744gvU19cD\nAHbs2AGgp68+PDwc0Zd0l8UAAAGFSURBVNHRsNlseOutt0TX5eTkYM+ePfj73//u3GQsPDwcEydO\nRElJCYCeL+njx487t+F1N2PGDBQXF2PatGkAgFtvvRV/+tOfkJyc7CzbqVOncOjQIec1tbW1EAQB\nKSkp2L9/P7788kvRz3ppNBq88sorOHnyJNasWeMxCSKiHkwOiMhp5MiReO655/CTn/wE999/v7MF\nICkpCWPGjMGcOXPw6KOP4qabbhJdFx4ejlmzZiElJQWxsbHO4+vXr8c777yDrKwsPP300/jd734n\n+nlfM2bMwNmzZ53JQG88Y8YMAEBUVBReeeUV/PGPf8S9996LOXPmYOPGjRAEAddeey3WrVuH5cuX\nO3/WO4ixl0ajwYYNG9DY2Ihnn30W3d3dg1ZvRMMNd2Ukom/Nbrfj3nvvxW9/+1tMnjxZ7uIQ0bfE\nlgMi+lYqKythMBiQkpLCxIBomGDLAREREYmw5YCIiIhEmBwQERGRCJMDIiIiEmFyQERERCJMDoiI\niEiEyQERERGJ/H8s0ZM7B8srNAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "j = data.plot(kind='scatter', x='dayofweek', y='numtrips')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Hurrah, we seem to have found a predictor. It appears that people use taxis more later in the week. Perhaps New Yorkers make weekly resolutions to walk more and then lose their determination later in the week, or maybe it reflects tourism dynamics in New York City.\n", "\n", "Perhaps if we took out the confounding effect of the day of the week, maximum temperature will start to have an effect. Let's see if that's the case:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nAAAmhAMAAGBCOAAAACaEAwAAYEI4AAAAJoQDAABgQjgAAAAmhAMAAGBCOAAAACaEAwAAYEI4AAAA\nJkELB21tbcrLy9M///M/Kzs7W7/5zW8kSfX19crPz9fUqVNVUFAgj8cjSfJ4PCooKJDL5VJ+fr6+\n/PJL/2u98MILcrlcysrKUk1NjX97dXW1srKy5HK5VFxc7N/e2TEAAMD5BS0cxMfHa+PGjXr77bdV\nVlammpoa7du3T2vWrNGcOXNUUVGh5ORkbdq0SZJUUlKi5ORkbd26VXPmzNGaNWskSZ9++qnKy8tV\nXl6uF198UY8//rh8Pp98Pp9WrVqlF198UeXl5XrnnXf06aefSlKnxwAAAOcXtHBgs9mUmJgoSfJ6\nvfJ6vbLZbNq1a5eysrIkSTNnzlRlZaUkqaqqSjNnzpQkZWVlaefOnTIMQ5WVlcrOzlZ8fLwyMjI0\ncOBA1dbWqra2VgMHDlRGRobi4+OVnZ2tyspKGYbR6TEAAMD5BXXOgc/nU05OjsaPH6/x48crIyND\nycnJiouLkyQ5HA653W5JktvtVv/+/SVJcXFxSkpKUlNTk9xutxwOh/8109PT5Xa7O93e1NTU6TEA\nAMD5xQXzxWNjY7V582a1tLRowYIF+vzzz7+3j81mkyQZhnHOv+ts+7ffftvpawW6/Wx9+lyquLjY\n8+7XXdLSkkJ2rEhl9Tawev0l2oD6W7v+UuS2QVDDQYfk5GSNHTtW+/btU0tLi7xer+Li4tTQ0CC7\n3S6p/Rf+V199JYfDIa/Xq+PHjys1NVUOh0MNDQ3+13K73f7nnGt7nz59Oj1GV5qaTnRzrTuXlpak\nw4ePh+x4kcjqbWD1+ku0AfW3dv2l8LdBV8EkaMMKR48eVUtLiyTp1KlT+uCDDzR48GCNHTtWW7Zs\nkSSVlpbK6XRKkpxOp0pLSyVJW7Zs0bhx42Sz2eR0OlVeXi6Px6P6+nrV1dXp2muv1TXXXKO6ujrV\n19fL4/GovLxcTqdTNput02MAAIDzC1rPQWNjo5YuXSqfzyfDMDRt2jTdeOONuvLKK7Vo0SKtXbtW\nw4cPV35+viQpLy9PhYWFcrlcSklJ0bPPPitJGjJkiKZPn66bb75ZsbGxWrFihWJj27v/V6xYoblz\n58rn82nWrFkaMmSIJKmwsPCcxwAAAOdnM841qG9BoezaCXdXUiSwehtYvf4SbUD9rV1/KfxtEJZh\nBQAA0DMRDgAAgAnhAAAAmBAOAACACeEAAACYEA4AAIAJ4QAAAJgQDgAAgAnhAAAAmBAOAACACeEA\nAACYEA4AAIAJ4QAAAJgQDgAAgAnhAAAAmBAOAACACeEAAACYEA4AAIAJ4QAAAJgQDgAAgAnhAAAA\nmBAOAACACeEAAACYEA4AAICLRjCNAAAOf0lEQVQJ4QAAAJgQDgAAgAnhAAAAmBAOAACACeEAAACY\nEA4AAIAJ4QAAAJgQDgAAgAnhAAAAmBAOAACACeEAAACYEA4AAIAJ4QAAAJjEhbsAAABIUusJj16p\nOKjDzSeVlpqg2VlD1TshPtzFsiTCAQAgIrxScVB7DjRKkuoajkuS5ueODGeRLIthBQBARDjcfLLL\nxwidoIWDr776SrNnz9b06dOVnZ2tjRs3SpKee+453XDDDcrJyVFOTo62b9/uf84LL7wgl8ulrKws\n1dTU+LdXV1crKytLLpdLxcXF/u319fXKz8/X1KlTVVBQII/HI0nyeDwqKCiQy+VSfn6+vvzyy2BV\nEwDQTdJSE7p8jNAJ2rBCbGysli5dqhEjRqi1tVWzZs3ShAkTJElz5szRvffea9r/008/VXl5ucrL\ny+V2u3X33Xdry5YtkqRVq1Zpw4YNSk9PV15enpxOp6688kqtWbNGc+bMUXZ2tlasWKFNmzbpjjvu\nUElJiZKTk7V161aVl5drzZo1Wrt2bbCqCgDoBrOzhkqSac4BwiNoPQd2u10jRoyQJPXu3VuDBg2S\n2+3udP/KykplZ2crPj5eGRkZGjhwoGpra1VbW6uBAwcqIyND8fHxys7OVmVlpQzD0K5du5SVlSVJ\nmjlzpiorKyVJVVVVmjlzpiQpKytLO3fulGEYwaoqAKAb9E6I1/zckVoxZ4zm545kMmIYhWRC4pdf\nfqn9+/dr1KhR2rt3r1577TWVlZVp5MiRWrp0qVJSUuR2uzVq1Cj/c9LT0/1hwuFwmLbX1taqqalJ\nycnJiouL8+/Tsb/b7Vb//v3bKxgXp6SkJDU1Nalv376dlrFPn0sVFxfb7XXvTFpaUsiOFams3gZW\nr79EG1B/a9dfitw2CHo4+Oabb7Rw4UI98sgj6t27t37+85/r/vvvl81m07p16/TUU0/pySefPOcv\ne5vNpm+//fac28+lY3tnr9WVpqYTgVSnW6SlJenw4eMhO14ksnobWL3+Em1A/a1dfyn8bdBVMAnq\n1QqnT5/WwoULNWPGDE2dOlWSdNlllyk2NlYxMTHKz8/X3/72N0ntv/wbGhr8z3W73bLb7Z1u79On\nj1paWuT1eiVJDQ0Nstvt/tf66quvJEler1fHjx9XampqMKsKAEDUCFo4MAxDy5cv16BBg3T33Xf7\ntzc2Nvr/vG3bNg0ZMkSS5HQ6VV5eLo/Ho/r6etXV1enaa6/VNddco7q6OtXX18vj8ai8vFxOp1M2\nm01jx471T1osLS2V0+n0v1ZpaakkacuWLRo3btx5ew4AAEC7oA0r/OUvf9HmzZs1dOhQ5eTkSJIW\nL16sd955RwcOHJAkDRgwQKtWrZIkDRkyRNOnT9fNN9+s2NhYrVixQrGx7XMAVqxYoblz58rn82nW\nrFn+QFFYWKhFixZp7dq1Gj58uPLz8yVJeXl5KiwslMvlUkpKip599tlgVRMAgKhjM5jGL0khHfcJ\n9zhTJLB6G1i9/hJtQP2tXX8p/G0QtjkHAACg5yEcAAAAE8IBAAAwYVVGAFGHpX+Bi0M4ABB1WPoX\nuDgMKwCIOiz9C1wcwgGAqMPSv8DFYVgBQNRh6V/g4hAOAESdjqV/AVwYhhUAAIAJ4QAAAJgQDgAA\ngAnhAAAAmBAOAACACeEAAACYEA4AAIAJ4QAAAJgQDgAAgAnhAAAAmNgMwzDCXQgAABA56DkAAAAm\nhAMAAGBCOAAAACaEAwAAYEI4AAAAJoQDAABgEhfuAkS7trY23XnnnfJ4PPL5fMrKytLChQtVX1+v\nxYsX69ixY7r66qv1q1/9SvHx8eEubtD4fD7NmjVL6enpeuGFFyxXf6fTqcTERMXExCg2NlZvvfWW\nmpubtWjRIh06dEgDBgzQ2rVrlZKSEu6iBkVLS4v+9V//VQcPHpTNZlNRUZGuuOIKS9T/888/16JF\ni/yP6+vrtXDhQuXm5lqi/h1++9vfqqSkRDabTUOHDtWTTz6pxsZGy5wHNm7cqJKSEhmGofz8fM2Z\nMyeizwH0HARZfHy8Nm7cqLfffltlZWWqqanRvn37tGbNGs2ZM0cVFRVKTk7Wpk2bwl3UoHr55Zc1\nePBg/2Or1V9qPzls3rxZb731liSpuLhYmZmZqqioUGZmpoqLi8NcwuBZvXq1brjhBv33f/+3Nm/e\nrMGDB1um/oMGDdLmzZv9//YJCQlyuVyWqb8kud1uvfzyy3rzzTf1zjvvyOfzqby83DLngYMHD6qk\npEQlJSXavHmz3nvvPdXV1UX0e4BwEGQ2m02JiYmSJK/XK6/XK5vNpl27dikrK0uSNHPmTFVWVoaz\nmEHV0NCg9957T3l5eZIkwzAsVf/OVFZWKjc3V5KUm5urbdu2hblEwdHa2qo9e/b4//3j4+OVnJxs\nmfqfbefOncrIyNCAAQMsV3+fz6dTp07J6/Xq1KlTSktLs8x54LPPPtOoUaOUkJCguLg4jRkzRlu3\nbo3o9wDhIAR8Pp9ycnI0fvx4jR8/XhkZGUpOTlZcXPuojsPhkNvtDnMpg6eoqEiFhYWKiWl/uzU1\nNVmq/h3uvfde3Xrrrfr9738vSTpy5IjsdrskyW636+jRo+EsXtDU19erb9++WrZsmXJzc7V8+XKd\nOHHCMvU/W3l5uW655RZJ1vn3l6T09HTdc889uvHGGzVx4kT17t1bI0aMsMx5YOjQofrzn/+spqYm\nnTx5UtXV1WpoaIjo9wDhIARiY2O1efNmbd++XbW1tfr888+/t4/NZgtDyYLv3XffVd++fTVy5Mgu\n94vW+nd4/fXXVVpaqv/8z//Ua6+9pj179oS7SCHj9Xr1ySef6Oc//7nKysqUkJAQUd2noeLxeFRV\nVaVp06aFuyghd+zYMVVWVqqyslI1NTX+L8jvitbzwODBgzV37lzdc889mjt3rq666irFxsaGu1hd\nIhyEUHJyssaOHat9+/appaVFXq9XUnu3e0d6jDZ79+5VVVWVnE6nFi9erF27dmn16tWWqX+H9PR0\nSVK/fv3kcrlUW1urfv36qbGxUZLU2Niovn37hrOIQeNwOORwODRq1ChJ0rRp0/TJJ59Ypv4dqqur\nNWLECF122WWSZKn6f/DBB7r88svVt29f/cM//IOmTp2qv/71r5Y6D+Tn56u0tFSvvfaaUlNTNXDg\nwIh+DxAOguzo0aNqaWmRJJ06dUoffPCBBg8erLFjx2rLli2SpNLSUjmdznAWM2iWLFmi6upqVVVV\n6ZlnntG4ceP061//2jL1l6QTJ06otbXV/+f3339fQ4YMkdPpVFlZmSSprKxMN910UziLGTRpaWly\nOBz+HrOdO3dq8ODBlql/h/LycmVnZ/sfW6n+//iP/6iPPvpIJ0+elGEY2rlzp6688kpLnQeOHDki\nSfrf//1fVVRU6JZbbono9wCrMgbZgQMHtHTpUvl8PhmGoWnTpumBBx5QfX29Fi1apGPHjmn48OFa\ns2ZN1F7C02H37t166aWX/JcyWqX+9fX1WrBggaT2+Se33HKL5s+fr6amJhUUFOirr75S//79tW7d\nOqWmpoa5tMGxf/9+LV++XKdPn1ZGRoaefPJJffvtt5ap/8mTJzVlyhRt27ZNSUlJkmSpf39J+s1v\nfqM//vGPiouL0/Dhw7V69Wq53W7LnAfuuOMONTc3Ky4uTsuWLVNmZmZEvwcIBwAAwIRhBQAAYEI4\nAAAAJoQDAABgQjgAAAAmhAMAAGBCOAAQNs8995w8Hk+4iwHgO7iUEUDYXHXVVdq7d69/cTIAkSEu\n3AUAELmuuuoqFRQUaNu2bWpubtYTTzyhDz74QDU1NfJ6vVq3bp0GDx6sw4cPa/Hixfrmm2/U1tam\nyZMn6+GHH5YkPfLII0pKStKyZcv09ddf67bbbtO///u/64033pAk3X777YqJidErr7yimJgYPfnk\nk/r73/+utrY2jR07VsuWLVNsbKxmz56tESNGqLa2VocOHdJdd92l9PR0vfrqq2psbFRhYaGmT5/u\nL/cDDzyg999/X01NTVq8eLF/9T8AATAAoBNDhw41Xn31VcMwDOOPf/yjMXr0aOPdd981DMMwiouL\njSVLlhiGYRinTp0yWltbDcMwDI/HY8yePdvYvn27YRiGcfLkSeOWW24xtm7dasyZM8f/eh2v3/E8\nwzCMRx55xCgtLTUMwzB8Pp+xaNEi4/e//71hGIbxi1/8wnjwwQcNn89nNDQ0GNdee63xzDPPGIZh\nGB999JFxww03mF73ueeeMwzDMD777DPj+uuvN77++utubx8gWtFzAKBLHb/GR4wYIUmaMmWKJGnk\nyJHaunWrpPbbQv/qV7/SX//6VxmGoa+//loHDhzQpEmTdMkll2jt2rXKy8vTxIkTdeedd3Z6rKqq\nKtXW1mrDhg2S2tcj6Vi0SmpftCkmJkbp6elKTU3VP/3TP/nL5na71dbWpl69eklqX+hGkgYNGqSr\nr75a+/bti6h71wORjHAAoEsdX7YxMTGm+97HxMT4V9TbsGGDWlpaVFJSol69eunRRx9VW1ubf9/P\nPvtMiYmJOnz4sLxer+Lizn3qMQxD//Ef/6GMjIwuyyK1L4Xe8bhj+Vuv12va5+zXjdblgIFg4GoF\nABft+PHjSktLU69eveR2u1VZWen/u/r6ehUVFenVV1/VwIEDtXbtWv/fJSYm+leslNpXKiwuLpbP\n55PUvqppfX39BZXpzTfflCTV1dVp//79/iWjAZwf4QDARZs9e7b27t2r3NxcPfbYY8rMzJQkeTwe\nLVq0SEuWLNGPf/xjPfbYY6qqqtL27dslSffcc4/uuusu5eTkqKWlRY888ohiYmKUk5OjGTNmaO7c\nuXK73RdUpvj4eN1+++267777tGrVKvXr16/b6gtEOy5lBBB1uEQSuDj0HAAAABN6DgAAgAk9BwAA\nwIRwAAAATAgHAADAhHAAAABMCAcAAMCEcAAAAEz+H/lMMsHMlf4uAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "j = data[data['dayofweek'] == 7].plot(kind='scatter', x='maxtemp', y='numtrips')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Removing the confounding factor does seem to reflect an underlying trend around temperature. But ... the data are a little sparse, don't you think? This is something that you have to keep in mind -- the more predictors you start to consider (here we are using two: day of week and maximum temperature), the more rows you will need so as to avoid overfitting the model." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Adding 2014 and 2016 data

\n", "\n", "Let's add in 2014 and 2016 data to the Pandas dataframe. Note how useful it was for us to modularize our queries around the YEAR." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daynumberdayofweekmintempmaxtemprainnumtrips
count1096.0000001096.0000001096.0000001096.0000001096.0000001096.000000
mean183.1669714.00547448.19507366.1518250.117272403642.694343
std105.5109272.00044918.03122818.4840650.32083663767.524397
min1.0000001.0000001.00000021.0000000.00000078133.000000
25%92.0000002.00000035.10000051.9500000.000000363809.000000
50%183.0000004.00000048.90000068.0000000.000000402184.500000
75%274.2500006.00000064.40000082.9000000.050000447099.000000
max366.0000007.00000082.00000099.0000004.880000574530.000000
\n", "
" ], "text/plain": [ " daynumber dayofweek mintemp maxtemp rain \\\n", "count 1096.000000 1096.000000 1096.000000 1096.000000 1096.000000 \n", "mean 183.166971 4.005474 48.195073 66.151825 0.117272 \n", "std 105.510927 2.000449 18.031228 18.484065 0.320836 \n", "min 1.000000 1.000000 1.000000 21.000000 0.000000 \n", "25% 92.000000 2.000000 35.100000 51.950000 0.000000 \n", "50% 183.000000 4.000000 48.900000 68.000000 0.000000 \n", "75% 274.250000 6.000000 64.400000 82.900000 0.050000 \n", "max 366.000000 7.000000 82.000000 99.000000 4.880000 \n", "\n", " numtrips \n", "count 1096.000000 \n", "mean 403642.694343 \n", "std 63767.524397 \n", "min 78133.000000 \n", "25% 363809.000000 \n", "50% 402184.500000 \n", "75% 447099.000000 \n", "max 574530.000000 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2 = data # 2015 data\n", "for year in [2014, 2016]:\n", " query_parameters = [\n", " {\n", " 'name': 'YEAR',\n", " 'parameterType': {'type': 'STRING'},\n", " 'parameterValue': {'value': year}\n", " }\n", " ]\n", " weather = wxquery.execute(query_params=query_parameters).result().to_dataframe()\n", " trips = taxiquery.execute(query_params=query_parameters).result().to_dataframe()\n", " data_for_year = pd.merge(weather, trips, on='daynumber')\n", " data2 = pd.concat([data2, data_for_year])\n", "data2.describe()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n+FpnrkNEREQ6FrNphb/85S9s2bKFwYMHM3nyZAAWLFjAzJkzmTdvHps3b6Z///6sWbMGgDFjxrBz\n507y8vJITU1l5cqVALjdbmbPnk1hYSEAc+bMwe12A21XKyxevJiTJ08yevRoRo8eDRB0HSIiItIx\nlxFo8r4bsuKclNPnypzeP3B+H9U/+3N6H53eP7DhOQciIiJiPwoHIiIiYqJwICIiIiYKByIiImKi\ncCAiIiImCgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYKByIiImKicCAiIiImCgciIiJionAgIiIi\nJgoHIiIiYqJwICIiIiYKByIiImKicCAiIiImCgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYKByIi\nImKicCAiIiImCgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYKByIiImKicCAiIiImCgciIiJionAg\nIiIiJgoHIiIiYqJwICIiIiYKByIiImKicCAiIiImCgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYK\nByIiImKicCAiIiImCgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYKByIiImISs3CwePFicnJymDhx\non9ZXV0dM2bMID8/nxkzZlBfXw+AYRgsX76cvLw8Jk2axEcffeT/m+LiYvLz88nPz6e4uNi//MMP\nP2TSpEnk5eWxfPlyDMMIuQ4REREJT8zCwZQpU1i3bp1pWVFRETk5OZSWlpKTk0NRUREA5eXlVFZW\nUlpaygMPPMDSpUuBtoF+7dq1bNy4kU2bNrF27Vr/YL906VKWLVtGaWkplZWVlJeXh1yHiIiIhCdm\n4WD48OH07t3btKysrIyCggIACgoK2L59u2m5y+Vi2LBhNDQ0UFNTw+7duxk5ciRut5vevXszcuRI\ndu3aRU1NDY2NjVxxxRW4XC4KCgooKysLuQ4REREJT3I8V3b48GE8Hg8AHo+HI0eOAODz+fB6vf7n\neb1efD7fWcuzsrICLm9/fqh1dKRPn3NJTk7qWgdjIDMzPdFNiCmn9w+c30f1z/6c3ken9w+i38e4\nhoNg2s8XOJ3L5Yp4eVfU1h7v0t/HQmZmOocOHU10M2LG6f0D5/dR/bM/p/fR6f2DzvcxVKCI69UK\n/fr1o6amBoCamhr69u0LtH3zr66u9j+vuroaj8dz1nKfzxdwefvzQ61DREREwhPXcJCbm0tJSQkA\nJSUlXHvttablhmFQUVFBeno6Ho+HUaNGsXv3burr66mvr2f37t2MGjUKj8dDWloaFRUVGIYR8LXO\nXIeIiIiEJ2bTCgsWLOCdd96htraW0aNH84tf/IKZM2cyb948Nm/eTP/+/VmzZg0AY8aMYefOneTl\n5ZGamsrKlSsBcLvdzJ49m8LCQgDmzJmD2+0G2q5WWLx4MSdPnmT06NGMHj0aIOg6REREJDwuI9AE\nfjdkxTkpp8+VOb1/4Pw+qn/25/Q+Or1/4IBzDkRERMT6FA5ERETEROFARERETBQORERExMQSN0ES\ns8bjzWwoPUDdsWbcaSlMGzeYXqkpiW6WiIh0EwoHFrSh9AB799eYls0quDRBrRERke5G0woWdKju\nRMjHIiIisaRwYEGZ7tSQj0VERGJJ0woWNG3cYADTOQciIiLxonBgQb1SU5hVcGm3uLOXiIhYj6YV\nRERExEThQEREREwUDkRERMRE4UBERERMFA5ERETEROFARERETBQORERExEThQEREREwUDkRERMRE\n4UBERERMXIZhGIluhIiIiFiHKgciIiJionAgIiIiJgoHIiIiYqJwICIiIiYKByIiImKicCAiIiIm\nCgciIiJikpzoBkibpqYmfvazn9Hc3Exrayvjxo1j7ty5VFVVsWDBAurr67nkkkt46KGHSElJSXRz\nO621tZUbb7yRrKwsnnjiCUf1Lzc3l7S0NHr06EFSUhIvvvgidXV1zJ8/ny+//JLzzjuP1atX07t3\n70Q3tdMaGhr45S9/yYEDB3C5XKxcuZLzzz/fEX387LPPmD9/vv9xVVUVc+fOpaCgwBH9A/j973/P\npk2bcLlcDB48mAcffJCamhrHfAbXr1/Ppk2bMAyDqVOnMn36dNt/BhcvXszrr79Ov379ePnllwGC\n9skwDFasWMHOnTs555xz+M1vfsOQIUM6tV5VDiwiJSWF9evX89JLL1FSUsKuXbuoqKhg1apVTJ8+\nndLSUjIyMti8eXOim9olTz/9NIMGDfI/dlr/1q9fz5YtW3jxxRcBKCoqIicnh9LSUnJycigqKkpw\nC7tmxYoVXH311fz5z39my5YtDBo0yDF9HDhwIFu2bPFvv9TUVPLy8hzTP5/Px9NPP80LL7zAyy+/\nTGtrK1u3bnXMZ/DAgQNs2rSJTZs2sWXLFl5//XUqKyttv/2mTJnCunXrTMuC9am8vJzKykpKS0t5\n4IEHWLp0aafXq3BgES6Xi7S0NABaWlpoaWnB5XLx1ltvMW7cOABuuOEGysrKEtnMLqmurub111+n\nsLAQAMMwHNW/QMrKyigoKACgoKCA7du3J7hFndfY2MjevXv92y8lJYWMjAxH9bHdnj17yM7O5rzz\nznNU/1pbWzl58iQtLS2cPHmSzMxMx3wGP/30U4YOHUpqairJyckMHz6cV1991fbbb/jw4WdVOoL1\nqX25y+Vi2LBhNDQ0UFNT06n1KhxYSGtrK5MnT+ZHP/oRP/rRj8jOziYjI4Pk5LbZH6/Xi8/nS3Ar\nO2/lypUsWrSIHj3adrva2lpH9Q/gtttuY8qUKTz//PMAHD58GI/HA4DH4+HIkSOJbF6XVFVV0bdv\nXxYvXkxBQQFLlizh+PHjjupju61btzJx4kTAOdswKyuLW2+9lWuuuYZRo0bRq1cvhgwZ4pjP4ODB\ng3n33Xepra3lxIkTlJeXU11d7Zjtd7pgffL5fHi9Xv/zurI9FQ4sJCkpiS1btrBz50727dvHZ599\ndtZzXC5XAlrWda+99hp9+/bl0ksvDfk8u/YP4LnnnqO4uJj/+q//4g9/+AN79+5NdJOiqqWlhY8/\n/ph//ud/pqSkhNTUVNuVaMPR3NzMjh07GD9+fKKbElX19fWUlZVRVlbGrl27/APomez6GRw0aBC3\n3347t956K7fffjsXXnghSUlJiW5WXAX6qaTObk+FAwvKyMhgxIgRVFRU0NDQQEtLC9BWlm9Pi3bz\n3nvvsWPHDnJzc1mwYAFvvfUWK1ascEz/oO2bGUC/fv3Iy8tj37599OvXz1/Wq6mpoW/fvolsYpd4\nvV68Xi9Dhw4FYPz48Xz88ceO6iO0zdsOGTKEb3/72wCO6d+bb77Jd77zHfr27cu3vvUt8vPzef/9\n9x31GZw6dSrFxcX84Q9/wO12M2DAAMdsv9MF65PX66W6utr/vK5sT4UDizhy5AgNDQ0AnDx5kjff\nfJNBgwYxYsQItm3bBkBxcTG5ubmJbGanLVy4kPLycnbs2MGjjz7KVVddxSOPPOKY/h0/fpzGxkb/\nf7/xxhtccMEF5ObmUlJSAkBJSQnXXnttIpvZJZmZmXi9Xn9Fa8+ePQwaNMhRfYS2KYUJEyb4Hzul\nf//wD//ABx98wIkTJzAMgz179vD973/fMZ9BaCu3A/zv//4vpaWlTJw40THb73TB+tS+3DAMKioq\nSE9P73Q40E82W8T+/fu55557aG1txTAMxo8fz5133klVVRXz58+nvr6eiy++mFWrVtn2MqN2b7/9\nNk8++aT/UkYn9K+qqoo5c+YAbeeOTJw4kVmzZlFbW8u8efP46quv6N+/P2vWrMHtdie4tZ33ySef\nsGTJEr755huys7N58MEHOXXqlGP6eOLECcaOHcv27dtJT08HcNQ2fOyxx/jTn/5EcnIyF198MStW\nrMDn8zniMwhw8803U1dXR3JyMosXLyYnJ8f222/BggW888471NbW0q9fP37xi1/w4x//OGCfDMNg\n2bJl7Nq1i9TUVFauXMlll13WqfUqHIiIiIiJphVERETEROFARERETBQORERExEThQEREREwUDkRE\nRMRE4UBEEuZ3v/sdzc3NiW6GiJxBlzKKSMJceOGFvPfee/4fHRMRa0hOdANExLouvPBC5s2bx/bt\n26mrq2P58uW8+eab7Nq1i5aWFtasWcOgQYM4dOgQCxYs4NixYzQ1NTFmzBjuvvtuAO69917S09NZ\nvHgxX3/9NT/5yU/4j//4DzZu3AjATTfdRI8ePdiwYQM9evTgwQcf5G9/+xtNTU2MGDGCxYsXk5SU\nxLRp0xgyZAj79u3jyy+/5JZbbiErK4tnnnmGmpoaFi1axHXXXedv95133skbb7xBbW0tCxYs8P/y\noIiEwRARCWLw4MHGM888YxiGYfzpT38yhg0bZrz22muGYRhGUVGRsXDhQsMwDOPkyZNGY2OjYRiG\n0dzcbEybNs3YuXOnYRiGceLECWPixInGq6++akyfPt3/eu2v3/53hmEY9957r1FcXGwYhmG0trYa\n8+fPN55//nnDMAzj5z//uXHXXXcZra2tRnV1tXH55Zcbjz76qGEYhvHBBx8YV199tel1f/e73xmG\nYRiffvqpceWVVxpff/111N8fEadS5UBEQmr/Nj5kyBAAxo4dC8Cll17Kq6++CrTdMvqhhx7i/fff\nxzAMvv76a/bv38/o0aM555xzWL16NYWFhYwaNYqf/exnQde1Y8cO9u3bx1NPPQW0/c5I+w9aQduP\nPfXo0YOsrCzcbjc//vGP/W3z+Xw0NTXRs2dPoO1HeAAGDhzIJZdcQkVFhSPuqy8SDwoHIhJS+2Db\no0cP0z33e/To4f81v6eeeoqGhgY2bdpEz549ue+++2hqavI/99NPPyUtLY1Dhw7R0tJCcnLgQ49h\nGPznf/4n2dnZIdsCbT9x3v64/ad5W1paTM85/XXt+lPEIomgqxVEpMuOHj1KZmYmPXv2xOfzUVZW\n5v+3qqoqVq5cyTPPPMOAAQNYvXq1/9/S0tL8v2YJbb8qV1RURGtrK9D2a6VVVVWdatMLL7wAQGVl\nJZ988on/p6ZFpGMKByLSZdOmTeO9996joKCAX/3qV+Tk5ADQ3NzM/PnzWbhwId/73vf41a9+xY4d\nO9i5cycAt956K7fccguTJ0+moaGBe++9lx49ejB58mQmTZrE7bffjs/n61SbUlJSuOmmm7jjjjtY\ntmwZ/fr1i1p/RZxOlzKKiOPoEkmRrlHlQERERExUORARERETVQ5ERETEROFARERETBQORERExETh\nQEREREwUDkRERMTk/wErNKu7mrcY8AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "j = data2[data2['dayofweek'] == 7].plot(kind='scatter', x='maxtemp', y='numtrips')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The data do seem a bit more robust. If we had even more data, it would be better of course. But in this case, we only have 2014-2016 data for taxi trips, so that's what we will go with." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Machine Learning with Tensorflow

\n", "\n", "We'll use 80% of our dataset for training and 20% of the data for testing the model we have trained. Let's shuffle the rows of the Pandas dataframe so that this division is random. The predictor (or input) columns will be every column in the database other than the number-of-trips (which is our target, or what we want to predict).\n", "\n", "The machine learning models that we will use -- linear regression and neural networks -- both require that the input variables are numeric in nature.\n", "\n", "The day of the week, however, is a categorical variable (i.e. Tuesday is not really greater than Monday). So, we should create separate columns for whether it is a Monday (with values 0 or 1), Tuesday, etc.\n", "\n", "Against that, we do have limited data (remember: the more columns you use as input features, the more rows you need to have in your training dataset), and it appears that there is a clear linear trend by day of the week. So, we will opt for simplicity here and use the data as-is. Try uncommenting the code that creates separate columns for the days of the week and re-run the notebook if you are curious about the impact of this simplification." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/envs/py2env/lib/python2.7/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", " from ._conv import register_converters as _register_converters\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dayofweekmintempmaxtemprain
9232.043.00.00
279637.957.00.52
163571.191.00.00
225655.978.10.00
218655.091.90.00
\n", "
" ], "text/plain": [ " dayofweek mintemp maxtemp rain\n", "9 2 32.0 43.0 0.00\n", "279 6 37.9 57.0 0.52\n", "163 5 71.1 91.0 0.00\n", "225 6 55.9 78.1 0.00\n", "218 6 55.0 91.9 0.00" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import tensorflow as tf\n", "shuffled = data2.sample(frac=1, random_state=13)\n", "# It would be a good idea, if we had more data, to treat the days as categorical variables\n", "# with the small amount of data, we have though, the model tends to overfit\n", "#predictors = shuffled.iloc[:,2:5]\n", "#for day in xrange(1,8):\n", "# matching = shuffled['dayofweek'] == day\n", "# key = 'day_' + str(day)\n", "# predictors[key] = pd.Series(matching, index=predictors.index, dtype=float)\n", "predictors = shuffled.iloc[:,1:5]\n", "predictors[:5]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daynumberdayofweekmintempmaxtemprainnumtrips
9356232.043.00.00382112
27986637.957.00.52465493
163203571.191.00.00363728
225141655.978.10.00414711
218148655.091.90.00364951
\n", "
" ], "text/plain": [ " daynumber dayofweek mintemp maxtemp rain numtrips\n", "9 356 2 32.0 43.0 0.00 382112\n", "279 86 6 37.9 57.0 0.52 465493\n", "163 203 5 71.1 91.0 0.00 363728\n", "225 141 6 55.9 78.1 0.00 414711\n", "218 148 6 55.0 91.9 0.00 364951" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shuffled[:5]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "9 382112\n", "279 465493\n", "163 363728\n", "225 414711\n", "218 364951\n", "Name: numtrips, dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "targets = shuffled.iloc[:,5]\n", "targets[:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Let's update our benchmark based on the 80-20 split and the larger dataset." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Just using average=402667.682648 has RMSE of 62394.1123208\n" ] } ], "source": [ "trainsize = int(len(shuffled['numtrips']) * 0.8)\n", "avg = np.mean(shuffled['numtrips'][:trainsize])\n", "rmse = np.sqrt(np.mean((targets[trainsize:] - avg)**2))\n", "print 'Just using average={0} has RMSE of {1}'.format(avg, rmse)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Linear regression with tf.contrib.learn

\n", "\n", "We scale the number of taxicab rides by 400,000 so that the model can keep its predicted values in the [0-1] range. The optimization goes a lot faster when the weights are small numbers. We save the weights into ./trained_model_linear and display the root mean square error on the test dataset." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From :9: infer_real_valued_columns_from_input (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please specify feature columns explicitly.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:142: setup_train_data_feeder (from tensorflow.contrib.learn.python.learn.learn_io.data_feeder) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use tensorflow/transform or tf.data.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/learn_io/data_feeder.py:96: extract_dask_data (from tensorflow.contrib.learn.python.learn.learn_io.dask_io) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please feed input to tf.data to support dask.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/learn_io/data_feeder.py:100: extract_pandas_data (from tensorflow.contrib.learn.python.learn.learn_io.pandas_io) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please access pandas data directly.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/learn_io/data_feeder.py:159: __init__ (from tensorflow.contrib.learn.python.learn.learn_io.data_feeder) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use tensorflow/transform or tf.data.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/learn_io/data_feeder.py:340: check_array (from tensorflow.contrib.learn.python.learn.learn_io.data_feeder) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please convert numpy dtypes explicitly.\n", "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:182: infer_real_valued_columns_from_input_fn (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please specify feature columns explicitly.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py:738: regression_head (from tensorflow.contrib.learn.python.learn.estimators.head) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please switch to tf.contrib.estimator.*_head.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:1179: __init__ (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please replace uses of any Estimator from tf.contrib.learn with an Estimator from tf.estimator.*\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:427: __init__ (from tensorflow.contrib.learn.python.learn.estimators.run_config) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "When switching to tf.estimator.Estimator, use tf.estimator.RunConfig instead.\n", "starting to train ... this will take a while ... use verbosity=INFO to get more verbose output\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py:678: __new__ (from tensorflow.contrib.learn.python.learn.estimators.model_fn) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "When switching to tf.estimator.Estimator, use tf.estimator.EstimatorSpec. You can use the `estimator_spec` method to create an equivalent one.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/python/util/deprecation.py:497: calling predict (from tensorflow.contrib.learn.python.learn.estimators.linear) with outputs=None is deprecated and will be removed after 2017-03-01.\n", "Instructions for updating:\n", "Please switch to predict_scores, or set `outputs` argument.\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py:843: calling predict (from tensorflow.contrib.learn.python.learn.estimators.estimator) with x is deprecated and will be removed after 2016-12-01.\n", "Instructions for updating:\n", "Estimator is decoupled from Scikit Learn interface by moving into\n", "separate class SKCompat. Arguments x, y and batch_size are only\n", "available in the SKCompat class, Estimator will only accept input_fn.\n", "Example conversion:\n", " est = Estimator(...) -> est = SKCompat(Estimator(...))\n", "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "LinearRegression has RMSE of 56643.9536391\n" ] } ], "source": [ "SCALE_NUM_TRIPS = 600000.0\n", "trainsize = int(len(shuffled['numtrips']) * 0.8)\n", "testsize = len(shuffled['numtrips']) - trainsize\n", "npredictors = len(predictors.columns)\n", "noutputs = 1\n", "tf.logging.set_verbosity(tf.logging.WARN) # change to INFO to get output every 100 steps ...\n", "shutil.rmtree('./trained_model_linear', ignore_errors=True) # so that we don't load weights from previous runs\n", "estimator = tf.contrib.learn.LinearRegressor(model_dir='./trained_model_linear',\n", " feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(predictors.values))\n", "\n", "print \"starting to train ... this will take a while ... use verbosity=INFO to get more verbose output\"\n", "def input_fn(features, targets):\n", " return tf.constant(features.values), tf.constant(targets.values.reshape(len(targets), noutputs)/SCALE_NUM_TRIPS)\n", "estimator.fit(input_fn=lambda: input_fn(predictors[:trainsize], targets[:trainsize]), steps=10000)\n", "\n", "pred = np.multiply(list(estimator.predict(predictors[trainsize:].values)), SCALE_NUM_TRIPS )\n", "rmse = np.sqrt(np.mean(np.power((targets[trainsize:].values - pred), 2)))\n", "print 'LinearRegression has RMSE of {0}'.format(rmse)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The RMSE here (57K) is lower than the benchmark (62K) indicates that we are doing about 10% better with the machine learning model than we would be if we were to just use the historical average (our benchmark)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Neural network with tf.contrib.learn

\n", "\n", "Let's make a more complex model with a few hidden nodes." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "starting to train ... this will take a while ... use verbosity=INFO to get more verbose output\n", "WARNING:tensorflow:From /usr/local/envs/py2env/lib/python2.7/site-packages/tensorflow/python/util/deprecation.py:497: calling predict (from tensorflow.contrib.learn.python.learn.estimators.dnn) with outputs=None is deprecated and will be removed after 2017-03-01.\n", "Instructions for updating:\n", "Please switch to predict_scores, or set `outputs` argument.\n", "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "Neural Network Regression has RMSE of 61920.4869713\n" ] } ], "source": [ "SCALE_NUM_TRIPS = 600000.0\n", "trainsize = int(len(shuffled['numtrips']) * 0.8)\n", "testsize = len(shuffled['numtrips']) - trainsize\n", "npredictors = len(predictors.columns)\n", "noutputs = 1\n", "tf.logging.set_verbosity(tf.logging.WARN) # change to INFO to get output every 100 steps ...\n", "shutil.rmtree('./trained_model', ignore_errors=True) # so that we don't load weights from previous runs\n", "estimator = tf.contrib.learn.DNNRegressor(model_dir='./trained_model',\n", " hidden_units=[5, 5], \n", " feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(predictors.values))\n", "\n", "print \"starting to train ... this will take a while ... use verbosity=INFO to get more verbose output\"\n", "def input_fn(features, targets):\n", " return tf.constant(features.values), tf.constant(targets.values.reshape(len(targets), noutputs)/SCALE_NUM_TRIPS)\n", "estimator.fit(input_fn=lambda: input_fn(predictors[:trainsize], targets[:trainsize]), steps=10000)\n", "\n", "pred = np.multiply(list(estimator.predict(predictors[trainsize:].values)), SCALE_NUM_TRIPS )\n", "rmse = np.sqrt(np.mean((targets[trainsize:].values - pred)**2))\n", "print 'Neural Network Regression has RMSE of {0}'.format(rmse)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Using a neural network results in similar performance to the linear model when I ran it -- it might be because there isn't enough data for the NN to do much better. (NN training is a non-convex optimization, and you will get different results each time you run the above code)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "

Running a trained model

\n", "\n", "So, we have trained a model, and saved it to a file. Let's use this model to predict taxicab demand given the expected weather for three days.\n", "\n", "Here we make a Dataframe out of those inputs, load up the saved model (note that we have to know the model equation -- it's not saved in the model file) and use it to predict the taxicab demand." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "WARNING:tensorflow:float64 is not supported by many models, consider casting to float32.\n", "[354762.78 306764.7 387226.62]\n" ] } ], "source": [ "input = pd.DataFrame.from_dict(data = \n", " {'dayofweek' : [4, 5, 6],\n", " 'mintemp' : [60, 40, 50],\n", " 'maxtemp' : [70, 90, 60],\n", " 'rain' : [0, 0.5, 0]})\n", "# read trained model from ./trained_model\n", "estimator = tf.contrib.learn.LinearRegressor(model_dir='./trained_model_linear',\n", " feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(input.values))\n", "\n", "pred = np.multiply(list(estimator.predict(input.values)), SCALE_NUM_TRIPS )\n", "print pred" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Looks like we should tell some of our taxi drivers to take the day off on Thursday (day=5). No wonder -- the forecast calls for extreme weather fluctuations on Thursday." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Copyright 2017 Google Inc. Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 0 }