diff --git a/doc/Prediction_Times.ipynb b/doc/Prediction_Times.ipynb new file mode 100644 index 0000000..a70d08b --- /dev/null +++ b/doc/Prediction_Times.ipynb @@ -0,0 +1,429 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "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", + "
requestidtiminttimediff
027010.18510110.185101
12267.3952387.395238
22233.8608493.860849
32215.6611695.661169
42121.6260361.626036
\n", + "
" + ], + "text/plain": [ + " requestid timint timediff\n", + "0 270 10.185101 10.185101\n", + "1 226 7.395238 7.395238\n", + "2 223 3.860849 3.860849\n", + "3 221 5.661169 5.661169\n", + "4 212 1.626036 1.626036" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import psycopg2\n", + "import configparser\n", + "import pandas as pd\n", + "\n", + "CONFIG = configparser.ConfigParser(interpolation=None)\n", + "CONFIG.read('../db.cfg')\n", + "dbset = CONFIG['DBSETTINGS']\n", + "conn = psycopg2.connect(**dbset)\n", + "\n", + "df = pd.read_sql(\"select a.requestid, a.timint, (a.timint - COALESCE(b.timint, 0)) as timediff from ntas_data as a inner join ntas_data as b on a.id = b.id+1 and a.station_char = b.station_char and a.train_message in ('Arriving', 'Delayed') and b.train_message = 'AtStation' limit 100000;\", conn)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we have a truncated dataset. The dataset is limited to 10k entries, as the number of possible entries is ~35MM. Regardless, this will serve as a nice proof of concept, and we'll plot a histogram of it." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n2mtmRchJ8ttJ7gHuB84H/qANKotpgsjGvl/Z2PYBLAIeaMPPjmoWAz/r7ayqh4E7+2q2tx16aiRJ\n0hwxWw7D3AQ8m2bV5D8Dn02yfLRDkiRJc9msCDlV9RDwk/bt9e25NKcAZwKhWa3pXWVZBEwdetoA\nHJBkft9qzqK2b6qm/2qrxwCP76t5Xt/QFvX07dTKlStZsGABAJs3b25br6A5n1qSpH3bxMQEExMT\n27Q9+n05M2ZFyNmO/YB5VXVzkg00V0R9Hx450fhI4Ly29jrgobbmC23N4cAS4Jq25hrgkCTP6Tkv\n51iaAHVtT817kizsOS/nOGAzcOOuBnz22WezbFkTaNasWcPY2Bjw4p3/kiRJ+4jx8XHGx8e3aXv0\n+3JmjDzkJPlL4Cs0Jwr/CvAq4Pk0AQOay8Pfm+RHwE+B04FbgS9CcyJykk8CZyXZBNwDfAS4qqpW\ntzU3JVkFfDzJW4ADgI8CE1U1tUrzVZowc2F72fqT2m2dW1UPzuAUSJKkGTDykENzGOkzNKFiM82K\nzXFV9Q2AqjozyUE097Q5BPg28JKqeqDnM1YCDwOXAvNojhO9rW87rwTOpbmqamtbe8pUZ1VtTXIi\n8DHgapr78XwaeP8Q91WSJO0lIw85VfWG3ag5FTh1J/3309z35uSd1NwFrNjFdm4BTtzVeCRJ0uw3\nKy4hlyRJGjZDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRD\njiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ\n6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRD\njiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6iRDjiRJ6qSRh5wk706yOsndSTYm+UKS3+yr+VSS\nrX2vy/tq5iU5L8lkknuSXJrk0L6axyW5OMnmJJuSfCLJwX01T01yWZJ7k2xIcmaSkc+TJEmantnw\n5X0M8FHgSOBFwGOBryb5pb66rwCLgMXta7yv/xzgBODlwHLgycDn+2ouAZYCx7a1y4ELpjrbMHM5\nsD9wFPAa4LXAaXuwf5IkaQT2H/UAquqlve+TvBb4GTAGfKen6/6q+vn2PiPJfOD1wElV9a227XXA\n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\nSZ30/wPIJK2DkRCTtAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df['timediff'].plot.hist(bins=100)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Now we will want to normalize the dataframe to the time difference. For more accuracy, we should grab data from request times, and figure out the time difference there, but we want to use this as a proof of concept first. We will subtract 1 to just normalize, because that's more or less the time difference. First, let's look at the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "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", + "
requestidtiminttimediff
count100000.000000100000.000000100000.000000
mean118968.8075203.3257183.325718
std66945.3405352.8063002.806300
min206.0000000.1741710.174171
25%58098.7500001.7969071.796907
50%130164.0000002.7015812.701581
75%173903.0000004.0970504.097050
max230123.000000114.850683114.850683
\n", + "
" + ], + "text/plain": [ + " requestid timint timediff\n", + "count 100000.000000 100000.000000 100000.000000\n", + "mean 118968.807520 3.325718 3.325718\n", + "std 66945.340535 2.806300 2.806300\n", + "min 206.000000 0.174171 0.174171\n", + "25% 58098.750000 1.796907 1.796907\n", + "50% 130164.000000 2.701581 2.701581\n", + "75% 173903.000000 4.097050 4.097050\n", + "max 230123.000000 114.850683 114.850683" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're only going to look at data within the 20 minute mark." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "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", + "
requestidtiminttimediff
count99749.00000099749.00000099749.000000
mean119001.5436753.2438453.243845
std66959.8013062.0914552.091455
min206.0000000.1741710.174171
25%58079.0000001.7925031.792503
50%130299.0000002.6944002.694400
75%173948.0000004.0787244.078724
max230123.00000019.99910819.999108
\n", + "
" + ], + "text/plain": [ + " requestid timint timediff\n", + "count 99749.000000 99749.000000 99749.000000\n", + "mean 119001.543675 3.243845 3.243845\n", + "std 66959.801306 2.091455 2.091455\n", + "min 206.000000 0.174171 0.174171\n", + "25% 58079.000000 1.792503 1.792503\n", + "50% 130299.000000 2.694400 2.694400\n", + "75% 173948.000000 4.078724 4.078724\n", + "max 230123.000000 19.999108 19.999108" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.loc[df['timint'] < 20]\n", + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "normalized_timediff = df['timediff'].apply(lambda x: x - 1)\n", + "normalized_timediff.plot.hist(bins=100)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So the distribution roughly shows that a significant portion of the time the estimation does end up being longer than a minute. Let's see the proportion of times that the estimate is less than the time advertised." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5.642812509928935" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beat_expectations = normalized_timediff[normalized_timediff <= 0]\n", + "disappointments = normalized_timediff[normalized_timediff > 0]\n", + "len(beat_expectations) / len(disappointments) * 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, we beat estimates roughly 5.6% of the time. That...sucks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "TODO: What should we investigate?\n", + "- specific stations: what if the ends are skewing our results a little bit\n", + "- look at delayed status: what threshold do they start notifications?\n", + "- should adjust query to make sure it's the same train + direction that we're tracking...\n", + "- " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [conda root]", + "language": "python", + "name": "conda-root-py" + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}