Skip to content

Instantly share code, notes, and snippets.

@michellemho
Created September 17, 2018 21:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michellemho/7e6b5d5e35d2d85ff02a0546ccf40c8b to your computer and use it in GitHub Desktop.
Save michellemho/7e6b5d5e35d2d85ff02a0546ccf40c8b to your computer and use it in GitHub Desktop.
Generating Emergency Call Data
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import geopandas as gpd\n",
"import cartoframes\n",
"from cartoframes import Layer\n",
"from faker import Faker\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import datetime\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"cc = cartoframes.CartoContext()\n",
"faker = Faker()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ambulance Synthetic Data\n",
"\n",
"This notebook:\n",
"- Generate fake locations of 911 calls as a percentage of population in an area\n",
"- Snaps the fake locations to a road network (for the purpose of routing)\n",
"- Generates time of day received for each 911 call based on a distribution\n",
"- Generates the amount of time from call received to incident resolved based on distribution"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Required: A table of geographies with population \n",
"# Here I'm using a census blocks around Richmond, VA\n",
"# I'm generating fake locations based on 0.2% of populations\n",
"\n",
"fake_911_locations = cc.query('''SELECT\n",
" row_number() OVER() AS cartodb_id,\n",
" geom as the_geom, \n",
" ST_Transform(geom, 3857) AS the_geom_webmercator\n",
"FROM\n",
" (SELECT\n",
" (ST_Dump(ST_GeneratePoints(the_geom, pop10 * 0.002))).geom\n",
" FROM tabblock2010_51_pophu_copy\n",
") sq''', table_name='fake_911_locations', decode_geom=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1183d77b8>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQwAAAD8CAYAAACCaZo+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztnX+QXNWV37+ne56kHmHUwozXMCBke2OwhWBmmQXZimJLWQMbBe3YxsgKVGKnWOLdytZKxkoJm1gSkdeDtQRS2VRtCJvEjikysgRjQMYSa4k1li3wKDMjkC3Wiw3CLZfRFmpsaVpSz8zJH/1e6/Xr9+Pe96tf95xP1ZQ0/X70vT19zzv3/CRmhiAIggq5Vg9AEIT2QQSGIAjKiMAQBEEZERiCICgjAkMQBGVEYAiCoIwIDEEQlBGBIQiCMoECg4jmEdGLRDRBREeIaKv5+vNENG7+HCeiEY/r7yeil82ftXFPQBCE9OhSOOcsgFXMfIqIDAA/IKJnmHmFdQIR7QLwbeeFRLQawO8B6AMwF8Bz5rW/8Xqziy++mBcvXqw5DUEQonDo0KF/ZOaeoPMCBQbXYsdPmb8a5k89npyILgSwCsBnXS7/IIDvM/MUgCkiOgzgZgA7vN5v8eLFGB0dDRqWIAgxQkSvq5ynZMMgojwRjQN4E8CzzPyC7fAggO95aA0TAG4mom4iuhjASgCXq7ynIAjZQ0lgMPM0M/cBuAzA9UR0te3wOgCPeVy3F8B3APzQPOdHAKad5xHRXUQ0SkSjJ06c0JyCIAhpoeUlYeYygP2obStgag3XA9jtc81XmLmPmT8GgAD8vcs5DzPzADMP9PQEbqMEQWgRKl6SHiIqmv8vAPgYgKPm4VsBPM3MZzyuzRPRO83/XwPgGgB74xi4IAjpo+IluQTA14koj5qA2cHMT5vHPg1gyH4yEQ0A+Bwz34magfR5IgKA3wC4wzSACoLQhqh4SQ4D6Pc49lGX10YB3Gn+/wxqnhJBEDoAifQUBEEZERiCICgjAkMQBGVUjJ5CixgZK2H7nldwvFzBpcUCNt50JQb7e1s9LGEWIwIjZVSFwMhYCfc8/hIq1VqcW6lcwT2PvwQAIjSEliFbkhSxhECpXAHjvBAYGSs1nbt9zyt1YWFRqU5j+55XUhqtIDQjAiNFdITA8XLF9R5erwtCGojASBEdIXBpseB6rtfrgpAGIjBSREcIbLzpShSMfMNrBSOPjTddmcjYBEEFERgpoiMEBvt78dVPLEVvsQAC0Fss4KufWCoGT6GliJckRazFruoqHezvFQEhZAoRGCkjQkBoZ2RLIgiCMiIwBEFQRgSGIAjKiMAQBEEZERiCICgjAkMQBGVEYAiCoIwIDEEQlBGBIQiCMoGRnkQ0D8D3UWum3AVgJzNvJqLnAbzDPO1dAF5k5kGX678GYDVqwulZAH9u9msVfJBqW0IWSbp7+4cBLEetgREA/ADARwA8F3XgnYxU2xKySuCWhGuodG8fcbscwDwAc1DTUAwAv4445o4nzmpbI2MlLB/ah/ds2o3lQ/tcq3sJgiqJdm9n5h+h1ov1V+bPHmb+afRhdzZxVdvSKQkoCCok2r2diH4XwAfM63oBrCKiFS7ntW339iSe4HFV25K6oELcJN29/eMADjLzKXNb8wyAD7ncty27tyf1BI+r2pbUBRXiJtHu7QCOAfgIEXWZBtOPAOiYLUlST/C4qm1JXVAhbpLu3r4TNYPoS6gZQL/LzE/FNfhWk+QTPI5COxtvurLB2wJIXVAhGkl3b58G8O+iDTG7XFosoKRR8TttdEsCCkIQUqIvAu3wBJeSgEKciMCIgDzBhdmGCIyIzOYnuD18vdhtgBl4u1IVwdnBiMAQQuEMXz85Wa0fk1D2zkWyVQVtRsZKuHvHRJNL2Y4EiHUmomEIWliaxbRCwnErA8Qk2zcZRGAIWrgFq3nRKveyZPsmh2xJBC1UtYZWupclhyY5RGAIWhS7jcBzFnYbLW0cLTk0ySFbkjYjrb251/uo1Epbfc0lvmNKeg5Zj8BtZ0TDaCPSqm/h9z5vV6qB1z/2whuh7h0XcWX7Cs2IwGgj0tqb+72PylPaz4OSxhziyvYVmpEtSRuR1t7c730eXNvXlD/jJE8U6t5xMpsjcJOkrQXGbPO1p7U393sfe/6M2zkAsO6Gy0PdW8g+bbslmY31KtPamwe9z2B/Lw5sWoXXhlbjjmWL6hpFngh3LFuEbYNLWz4HIRkoay1CBgYGeHR0NPC85UP7XJ9UvcUCDmxa1bHaR6u9JFm/txAOIjrEzAOB57WrwHjPpt1wGzkBrvvsgpEXw5cgeKAqMNp2S+JXr1Ii/QQhGdpWYPjthSXSLxhpcCSEoW0Fhp+vXapl+zMbDcZCPLS1W9XL194OtTZbid+WLW0bT6sMoGJ4DYdKX5J5RPQiEU0Q0REi2mq+/jwRjZs/x4moqbcqEa20nTNORGeIqKnDe9y0Y6RfmluErGzZ3DSd9cPj6L9vb6LzFw0rPIl2b2fm/QD6zHMuAvAPAPbGMvIA2inSb2SshI07J1Cdrvl9SuUKNu6cqB/f+tSRegm8YsHAljVLIs0tK8FTXrU1Tk5WE61fkSUNq91Q6UvCAFS6t3824Fa3AniGmSfDDbVz2frUkbqwsKhOMzYMjyOXI0zPnD9WrlSxfngco6+/5Rsg5UertmzObYBXpCiQ7ALOiobVjiTavd3Bp+HRtHm2Yy+ga4eBBmFh55sHj2FxyO1LK7ZsbtuAIJJawGIUD4+S0dPsYNZn9lh9goiuZuaXzcPrADzidz0RXQJgKYA9HsfvAnAXACxatEhx6J1B1H1z2PJzSW3ZvIyJOqX9LJJawGIUD4+Wl4SZy0RkdW9/2da9/eMBl94G4Almdn2UMvPDAB4GapGeOmNqd+IIJqtUp7F+eBzb97wSi7U/rAfBr5amrraQz1FiC1gaUIUnUGAQUQ+AqiksrO7t95uHg7q3W6wDcE+kkXYoKqq5zr3WD49jy5NHlA2jTuGw8qoe7DpU0i6ga7UecNbCqFSncfeOCRSMHCarM8pz8dqKxUU7GcWzhIoN4xIA+4noMIAfo2bDsHdvb7BLENEAET1i+30xgMsB/F0cA+4E7C7UJChXqkpuQje7wjcPHtMOqw9qPTDNrCUsLCSUP3sk2r3d/P01ACLKTZxqe1JYT3bAWzPQsSuUyhWMjJVc7xXGPqH6nnYk2Kr1tHWkZzuS1OJyY5rZdzuha1ew7gVA2T0aBQLqQkp6jWQDERgpk7av3x7P4HxCLygYKCsU9bXfa+tTR3CmOtOwcJOCgfrYJdgqG7Rt8lm74uUq9KuDGZXj5nbCaa84fW4KRk7vfU9OVlPTkIDzAlaCrbKBCIyU8UrLf+C2a7FQoUmQFwXD+0+ZI8L64fGmhV6dZkzNMIqF8O/rB5k/vcVC6LlZAlaCrbKBCIyU8Yuy9Ir4VKHi44XwK/vPAE6fm1Je0DqKULHbwC+GVuPAplXYfMuSJkFJAObPybtfjMZgqo03XQkj3/jmRj65WA3BnbYt0ddpjIyVsH54vGXvTwC68tSU02LkgBAe0fo9fzG0uv67m5cDgKvXqGDkMM/IozxZrceHDL/4BqqO+IwcATNcE7w6AWbibWlEtUSfGD1TwvqSlsoVEKHecrBYMPAvr70Euw61NrXaK28lrLAAmvuw+gVL2TNygZrGZGlNpXIFjx485lrD1Rqyn9fELiCK3QZOnZmqCx7xtughAiMFnC5Bu1JXrlTxzYPHWjSyRuIOrjx1ZsozdsPtXD9UhmbFnmwYHq9rDqOvv9UgbNy2feJtUUcERgqkGXuRFoTgRVyd4cDgMaD2+Ti3GmGx7DWlcgWfHx6HqoIk3hY1xOiZAp32ZSwYeczz8crYsYLH/MLUk/p8dHZT4m1RQzSMFNANkMoylnFxg4aB1gr4stsRmIG3K9VQAWRxI6nt6oiGkQIJxmSlhpGrtUEEUKsEpjmpk5PVetDYyckqypVqPYDst2entL+I9vaMUcgTZb7ea5YQDSMFyhHiK7KCkaeGtHe/2A5dpmcY8+fkYeRzdU1jYbeBzbcs8XQ1zzDjNZvLtv++vaHiWGaYG4SFuFz9EYGRAkkmaIVBxWDpJEx6ug6nz03jtaGbG14bGSt5jtVpc9h8yxLc/a0J7Toa9vtIglswsiVJgZVX9bR6CHXmduWQ1g7JimQNG3q+fc8rnv1znTaHwf5evGOu/vPvrdNn0X/fXrxn027cvWNCWmwGIAIjBXYf/lWrh1Dn7NSMlvcAqBkFvULHvWwIVlPsA5tWYcua5rBwJ25Cxct7wnB/4r8dwnBaqc7g5GTNnuK1zeo0L1cURGCkQJQckVazsNvAVz+x1DMXZNl7F7pqLFZqOtCYP+OGkSNsWbOk6XUvV6eXxpKUa7TVLtcs9cEVG4bgy5nqdP1p7oyaZAA/fPUtT3tIqVzB8qF9dcOhdR+vnJLlQ/saXlt5VY9rFOxvz07h3pGXsP/oiYbz3aqBRyVHzdufNMmaXUU0jIRp9/Z7leoM7h2pfUH3Hz3RJByCTIxubQgH+3txYNOqeiYrANfWhV5buekZxqMHjzWdD8BXkwlDwrWIA/ErHNQKRMNImE4wmFlP+bCeHqsNwpYnj4AI9QxUv54lleq0r6bgXMfWIjqwaZVrSb8otDLPJGuFg0RgJEynGMziSJCzR3NaLRE27BhHXCEd9s/a3nukVK6EciVbWIKyFTEaWemDayFbkoRptcHMQrcUX1rEWY7F+VlbW5/XhlbjwbV99aJFutGheaKWdXz3qtDWKrtKoMAgonlE9CIRTRDRESLaar7+PBGNmz/HiWjE4/pFRLSXiH5KRD8x+5TMGtz+4K0grmxQP1opkgj+8S6W8HhwbZ92lOo0c8tsCa3og+uHypbkLIBVzHyKiAwAPyCiZ5h5hXUCEe0C8G2P678B4CvM/CwRXQC9JMK2x60tn5f1v1VYRsIwNgpL1e+NIZq1t1jAcfMJrgsD2HWohIErLvIM9V5QMHD6nH/dDb9xuZHGllO1S1saWyaVRkYM4JT5q2H+1P+mRHQhgFUAPuu8log+CKCLmZ8173XKec5swO0P/vTEr1wzNAtGzrc+Z9zYoyZVjYR5IswwN30p37Npd2g7AYB6JmvZDKRyYpXj86JSncY9jx9ucN/a5+SXEUsAPvy+i/D/jr3t2qTZsoU40d1yJrWo03K/KtkwiChPROMA3kStVeILtsODAL7HzL9xufT9AMpE9DgRjRHRdiJq0s+J6C4iGiWi0RMnToSZR9uxZc2SJruCkSN88rrLEm054MSKmnSqvn5DeOC2a+suUcsjsXxoXyRhYY3lpIewKBh5/KsbFjUVAnZidwPrFC66fdkiPPrHH/JU/+OwJSRpB0lry6TkJWHmaQB9RFQE8AQRXc3ML5uH1wF4xOPSLgArUGu1eAzAMIDPAPgbx/1nXfd2r63KrkOlWDNBLbw0F3vMgl0TWuzT99Wp8m/81kSiNpI8ET55XS/2Hz2B6jQjT+T7GT32whvYNrhUa7uw/2jtQeWl/sfR8T3JZkxpbZm03KpmB/f9AG4G8DIRXQzgegAf97jklwDGmfnnAGAaRpfBITBmK84v5/KhfYmU8jPyNc3Fnp4O+D8hvRalU/vZ8uSRxA2q08xNqfVGjjzf1xp3sdtQDstXWVhRO74nuajTcr+qeEl6TM0CRFQA8DEAR83DtwJ4mpnPeFz+YwBFIrLM16sA/CTakDuXpAxo1WnG/qMn8NVPLG3Iw/Ars+fXid1OGpWy8kTNTZh8hJQl1HQUtaTc3/Y8EK+iQ3G8d1ruVxUbxiUA9hPRYdQEwLPM/LR57NMAHrOfTEQDRPQIUN/KfAHA94joJdRsS/8jrsF3GknGbJTKFWx96kjDAj85WfXcQ3uFV8cZdq1Cwchrb9HW3XA5AHVhllRcg9Nm4TaPuN47LferipfkMGo2CLdjH3V5bRTAnbbfnwVwTfghzh50kqcKRr6+r1d1Z+qU2Hcbi9uXe6GH2m/vvaKC5Xlx1vtceVWPZ0+SpvdEzXi5bXBp/Z5ui5RQE85JR2x6GV29vExRibplUkFCwzPGPCNX/5IVCwa2rFni2nnd+UW7d+Sl0LEdbgLHz8jnjG3I56ih0pWRJ6z9/cuVFzpQ87y4fdl1vC+XFgt1YQF4b6sYqCe9hUHVNeq1xZxhbugI106IwMgIbslSZ6fOezWcC9heawIAtg0uxe7DvwpVe8PLjev2xLp35KUGQVCuVGHkCBea8RP2BaQqwBZ2G56p7zrBYM4F6hdMZk+710En3iFreSBxILkkGSHIj67iw998y5JQ4dnTzEpFWkbGSq5aQ3WG0T2nqyk2QyWepGDksfmWJZ5z1JmPcyH6heWHjYHQiXfIWh5IHIiGkRGCXG4qPvzB/t6mIjcqLOw2fJ+a9r6wfuNXOc/IE+bP6arbKOxPebc5MtSKFrstRGfGqpMwMRA6rtE4YjeyhgiMlLAvJssYZ+84HqS+qn5Rtw0uxcAVFzXYGH57dsqzmjahZpz0e2qqGGIXFIzA83IEbL+12VYRJGhUhJ9XMq61rfIKW9d1ZetuM9IwRKaJCIwUcO577f0/rSd5kFdC54vq/JKOjJXwxccPN7UKsLwKj3rYGkrlCrY8eSRQWFih5EHnzTCwfni83mvEaowUpBGpaBinz01j407vPq5x2RNUvUedCnECYchRGBgY4NHR0VYPI1aWD+3zVdN7iwUc2LTK1/ruZhQtGHktX7vX/YPG54cldLKWfbvyqp6Gmp9W2H2Uz8+iE5sdEdEhZh4IPE8ERvKoZHFaXbyChIZb8dyoX96w5ezsW6r33fOdRHJg4sIetxL359cJqAoM2ZKkQJB7kHC+WLCf8dFtqxFHSrNlLFXVEtyezFkWFkBtu7T/6ImG+IusVeRuB0RgxITf0z+opqS9h4dONqOX52T98Di273lF62lpZWu6sbDbQPecLt+ncBwFdJKmVK40tCfIuUSCVqrT9c70IjSakS1JREbGStj61JGmgCkjRwDVEr9UsIz8Xmdb4cw6BWtU9+gjYyXPpscA8NDavsj3aDfyOcIDn3KPPu1EZEuSAn57f92Ub8ta7+dadKrMQVsdp3Zi14KsnI1ypeobHGWPwvRDd1uTdaZnuKXtBbKKRHpGQKeiUxArr+pBefJc4Hn2+AiVAsNWnIEzivLkZLWezekn2pjVmzFtG1xad5V2AqVyJRPtCbOECIwIxFm/YtehEk6fUxM+1vsG9SwFzmsuYYVbuVLF+uFx9N+3V2nRbBtciuXvu0j7fQCgK0ehO70TgG6f+h5hiVJKL0s9UeNCtiQRWFAwPGsu5KBeHn3+nLyysABqQVJ9W/c2hFcDzRGZ9oCiqMLNqp0BBBsDPzWwCD9+7STOudhv5uTJ9XUA+J0L59W9GB/8j880BZr5wQAmqzN1oaFzrQq6YeSd6oERDSMCfrlVXl/X+XPy9aSsPBHuWLYIkxrCAqhFTJYr1frTb4MZPTm3K4eF3YZrAZU4MiStReP35LQWilMoLOw28NDaPl8jsH37FHbBT1ZnPKuuFwsG7li2KHQRIB2hm7WeqHEhAiMC5RCp5KfPTePdC+aBALx7wTwMXHFR5MVsTzU/dWYKD67tqz+prYV9+uxUYMVtFawnpVfWrNfWp3tOV91Q68WlxUJd4ETBSyTNn9uFbYNLcWDTKjy0tk87s1fn75S1nqhxIQIjJCNjJc8ajX4Q0LDYNgyPY/E7C7F1R6vOMLY8eaTJyFmuVAFGXQNZ2B3OVgC4x4psfeoIgOCFsvGmK10Fl5Gjev+PJAohO8c22N+L25ctUhYauvkiXsKlnWthACIwQmEtxjDRjc4rGMCBV98CwPVFbG1ZigUj1MK2DJVuhXO753ThwbV96J4Tr/nq5GQVI2OlwIUy2N+L7bde2zCvYsHAdjPmIcknsHNs2waXNvRc9eOT1+llnXZiLQxAArdCESZZSyXj0i3Yy8qBcCZORSFKJ3M/rNySKEly/fftDVU1LAgC8GBAAJrf39VKENTBGf3rTIjLUt6KauCWaBgh0H0KLuw2lBZodYabjIJWDoS9InTURuxJPSKsxeZVvXpkrIS+rXuxeNNuLN6029VVq/L8MvKkpXlZGbVBi9Pv6R8mJsNqAP2LodXYeNOV2HWolHr397hJo3v7tO28J+OeQCvQ3YeGMY7aOV6uNHQfv3BeePtD0lgGS2uh2Ev2bfzWRFObg407JxoWzdsqrQEYWH3NJZ52HyNfi+ewBNaDa/saigN7Mdjf6xsHEmWhd4rXREXDsLq3XwugD8DNRLSMmVcwcx8z9wH4EYDHPa6vWOcx85qYxt1S3PanXg99Qi1eIwqW96D/vr1YPzweqnlQWt1avRbB9j2vuIbLV6e54fyiguZQneEGrQs4b/fpLRaw/dZrMb75xgaBpcqWNUsCDdBhFnqneE0S7d7e7njVpvDqi+pWOYoBvH1GbYF72TBWXtUTql6Fcxxp4bYI/BaGPf7i1Jkp5fdIovyd82/r9bklXdovqyiZys2O64cA/C6A/6bRvR0A5hHRKIApAEPM7Lp1yRpBkXpuX1avxCuVfXlv0bugS5KuxiQodhtNwnaeRzNooDF8XTVpL8mFZv/behlCZ2tpPy0vidW9HcCfWd3biegZAI8w8y6Pa3qZuURE7wWwD8A/Z+ZXHefcBeAuAFi0aNF1r7/+eqjJxInXF8XPWq7rPbG8Fb0BFnOVil1Zw8iTUmq/kad6YWDdeQZ9bnEQR2lE+71UvSZplwFMJL09RPd2MHPJ/PfnRPQcam0XX3Wc8zCAh4GaW1VnTEkRZs+p0+oQOL9N8MozsL40mfhANFERFs4q4rqNi9LIz4izVYBdc/HTYAH/ymutJFBgmJ3Xq6awsLq3328e9u3eTkQLAUwy81lTuCwH8LV4hp4sYfecc7tyobYPleo07t4xUf99y5NHUumM3kqYGxeArsAFwvUW0SUJW0mQ10Sn8lqaqGgYlwD4umnHyAHY4ejePmQ/mYgGAHyOme8E8AEA/52IZsxrh5j5J7GNPkGC9pxu6mXU4KppZqwfHtfKdG1nnMJ3sL8X3xo9Zka+qpP10oBuhNFgs+BRSbR7OzP/EECwAzyDBDUjdqqMut3G/Gh3YaESSUpwD5Q6+POTod5zZKwU+embpt0gSIPNqkdF6mH44KWKerX0ayVGngBWKw1YMHIAKDnPi4LEYLjvx8NWH4+qrqddvyJIg82qR0UERgiyoBrasbtkVQrxfvK6y+rtFJNQ51XdyG7kXSp5qxD1b6LSuzZOVIypWeyXIgIjBLrW/CRxunlVjKX7j57AtsGlkbuehcXvabnuhstDFRKOqq63IhLTz5ia1Z6sknwWApXiu2lg1dawJ0RtWbMk8I9qXwRpzcUKTXdWAnNiFRLOa9QaiUNdj6t+RSfW8bQjGkYIrC+7n/qfVAq5pbLb7+/cb7v1SbFjXwTWXD6/YxxB5o9/8q75+Ic3T2vPSzfAatvg0nqymFvglJEjXDCvC+XJamzqehyRmJ1ax9OOCIyQBC3MpIygM8yuXcbs+22/7FgjT66uYZXx/uzN07hj2SLsP3pCaxsTZUHHGTiV9PukbQdpBVJARwOn2+2t02c98yN00NFGeosFzwVOAH4xtNrXLrGw20B5sopit4FTZ6a0Gy7ZO82rBlmFKT6TBXTdrH6h7Vaz7awiBXRixlkjs1SuRBYWVtXwXwytVmoAZGkHQfttN7uEkSMYecLJyWq9kZGusADOxwfYe6IE1QjNmldJBbe/t18dDL8ar/Zm2+2OCAxFksgYnWbGrkMljIyVsG1waWAVqflm5W23Qrr2rYZzMfcWC7hgXpdyn1c/7F9+e0WpsS/f6NlISKXGRdbQKXgTVOPV3my73RGBoUhST0n7lzCoMle5UsXyoX1YPzzevPgdv1qCpdhtoFSuxFYn0+vLPzJW8hRIJyeryp3T4iAOT4WOm1XlYdKOWpYbYvR0wW3vmmTshfVlUnkPr+NVR/PgkbESNu6ciEWrcOK1aPy2OCcnq/WGS0mmpXt5KkZff0urAK9O8qGKMMhCWHcciIbhwG3vumF4HKVypanMXVxl7/xsDzqUypWGhkJJCAsAyBE1PbVVFo3TDZyExuG1lXj04DGtArw6bQKChEFWwrrjQASGA788EUZjAFIcy9H5ZZrbdf5PEqJPUn0hJKkCTzNjw/A47h05X79B9wmaVAFcr3k7/1ZBbR/d7EBeAWd+NV6DAtXaDdmS2BgZKwVuCRg178bKq3rw2AtvuBq68kR44LZrPXM18kSYYfbNgAVq3cx1tQRrISQdvs4AHj14DANXXFS3l6jksdhJQqjpzNvSNHTKMLqRVqxIFpA4DBOduIIgFnYb2HzLEgDuWYduT5w4czqspj26Czgslk1C9/2SiM9w+zt6xbl4Jbq1a9xIFCQOQ5M43aZWvw3Au6mPkziftpcWCxjs71WK7YgDZ3k5N5y7q7j29c4tBdD8md++bJGrPcLLDdopHo0kkC2JSdxfkuo0Y+tTRzD25RubCrtuGB5vUlvj2kJYC3FkrIT9R09Evp8qleo0Ch6Vwe9YtqieTh+nyu7lEfnqJ5Y2aQhu7++1ZewUj0YSyJbExG9LECWR7CGzn6fXlqdYMLBljfv2RRfLdhLHvcJgtSS0bDt5Iqy74XKlrmNhCFPZ3U6cFcHbHdUtiQgMk5GxEjYMj8eeNGZ9Af2K1VjnjL7+VuRSf7Xeq+GK0EQl7b2/V+6GlVOjQtrl/LNKIm0GOpnB/t5EjISW18Jvy1OpTmPLk0dw+txUZIHFCF/mLgqtiDWIo5tYVgvVZBUxetrwKhsXlZL59PKjXKkmFmhloVOURoeCkWvo0J5WARmd4CohHhLv3m6eeyER/ZKI/irOwcdNUl80ArDyqp7YIkONnP6dCkYe62643DOL1fO98rWMWsvr4J5fVrteN8MzKjrBVUI8BNowiIgAzGfmU0RkAPgBgD9n5oO2c3YB+DYzf8PjHv8FQA+At5j53/u9X6vrYfTftze2RC07bkVvwvLQ2r6GfffkuSnXMXsFiDmf/HAQAAAOT0lEQVT37MD5oKOCkUNlagbMaDJaBtl5JK6hfYnNhhG1ezsRXQfgdwB8F0DggFrN5luWNJeE8yjhPydPmD+3q16QhhmeBXjjEha9ZoyFs6WiqrXfa88+2N+Le0deajC6Wun3VjRnUNtGL9tJVgomC9FRsmEQUZ6IxgG8CeBZ1e7tRJQD8ACAL8Qx2DSw1Fx7bYr5c7pw/XsWNm0p8rkcNt+ypF4PYnzzjSgWkqv94LU/j0M1HxkruXpo7DkfYWNVOqmAzGxHyUvCzNMA+qzu7UR0tdW9HcA6AI94XPqnAL7DzL8kH4Obo3u76tgT5YwtAKlcqeKHr77luZjsCzMJuyIBgS6/IGt/kPvQT3uwBMWCghGq36tVQ0NsC+1P0t3bPwRgBRH9KYALAMwholPMvMlx30x0b7cWlZsKHbSYLOK2f1h5IUl39fLbNiwwtaYowlDCrTsDFS9Jj6lZwNa9/ah52Ld7OzPfzsyLmHkxatuSbziFRVawW/h1sLtLR8ZKsXlCLOIo76ZSbs7P5Xr63BRGxkqBFcH8sD6nTu/b0emo2DAuAbCfiA4D+DFqNgx79/bH7CcT0QAReW1RMotK8llQAlWQUdANldiPqE9nlXJzfsFe1Wmup8yHwZ7fkqbbVYifQIHBzIeZuZ+Zr2Hmq5n5PtuxjzLzdx3njzLznS73+d9BLtVWErQoC0Yety9b1GDUnOcISgizsFWqbEVNhlLp6hVkrC2VK1h5VY/2excLRt0Au+XJI8qFdaMgWkxySKSnid+itLwOA1dchNPnpuqvn5ysYv3wOBZv2o333fMdbe3C0lgsD4f9NYs4IhdVIiJV7BO7DpU8K4M76S0W8NDaPoxvvrEe/+FlMI3TviFaTLJILomJV6s8u3uy/769nuHbYfI3GGhKx04iGUqlIpSKfcJKYffD+ZndO/KSZ2UyizjTyWdD97FWIgLDRGVRJREB6vwyx5UM5SZ47NGWltpuHS92G0rzC2reNM/IYcPwOLbveQWL31nAgVffCrxnnCH5XtqKVSBZhEY0RGDYaFXmotWBPS6tIsiN6nbcyimJmgBnCZ1SuRI6wjOKluUn+DqtMXIrEBuGBklFcRIQ6547yI3qdrw6w5g/p6tuSwmR3xYau9Ezig1iZKyEU2emPI8nVal8NiEahgZb1izBxm9NhOpJ6oVbNa+oe+4gN6rX8bcrVYxvvrH+e1KJeE7sGpZb8Z+gz8Mv4M6JBJBFQzQMDQb7e7H9U9cqNSBWIU/k6VmxFlEYTSPIjariZgVqiXgqjZUKRj6y9mVpFH4JbG6fh27AndTrjIYIDE2cDYijFN2ZYfa9Puz2JMiNqlp4xp7U5scnr+vFljVLfOtqxIHb56Fb7V2K60RDBEZE3BafkSeluAbLoOf3FA+z7w7KXtXJbrUEpN906tXJU8gCcn4eOluMhd2GGDwjIjYMTdws+FaRX2dRGr/K3dYT3e7O9VKrw+y7gzw+uh4hvzYIx8uVwGbMFkRA1JKj9s9DtT1DwcjXm0sJ4RENQwMvC/7o682xBs6n+MJuA8WC4fnEP7Bplafqn4V998abrvTUMi4tFpSFWqErF6nhtPV+9nEF3c8eni5EQ9oMaODVB8Pp6Qjb26JVfTL84h7sx+a5NCpSaaNgx0rX1znf67PV8Y5Y5QN7Y4hz6USkzUAC6HYG1/1StqKpr1+QF9C4rapUZ2DkCBfMq5UldI5PpXmSqrZkNUXy6pg2MlbCxp0TyoFmlvfFrRaIoI5oGBroNEzWaabjR9y5Jc77eRUQXthtoHtOl1ZnMfu9FxQMnD431bCgjTyhK0eB4eUWltBw65wWNUZEChM3IhpGArglqHm1UbQXjAm74FUqZengdj8vTk5WPRekl6blVpzYmnux28CpM1PKwgKofa6PHjxWL0Jsv2fUgDIJ4AqHGD01cHNHenUGj6NgjEqlLB10Yxa8qnCpbivsMSvdc7pCRcjaK47pBGkFNW3KgiG5HRENQxM3d6TXPnv50L5IqdYqlbJ00L1umhkFI99khFUNfrJrGFE2vlaU5+mzU0oCzzJsetlUpDtaeERgxIBXTEPUBR9H71CV+3lhLbwwWyqvbvVhUR23kSPX+BbxksSDCIwEibrgvYr6hH06ut3PyBFmAEw7tgv2hRdmceluf+KgWDCwZc2S2GuLCOcRgZEgURd83G5Wr/sBwNanjtQNic6FZ0fViJuWUTGNOBXhPOJWTZgkSu61Cp3Asr6te0M1PdJBthfxEZtblYjmAfg+gLnm+TuZeTMRPQ/gHeZp7wLwIjMPOq69AsATqHljDAD/lZn/WmsmbU4nqcU69TKT6ADXcH9A4ihagMqW5CyAVfbu7UT0DDOvsE6wure7XPsrAB9i5rNEdAFq3dKeZObjsYxeqJOGJqNjxI3S9EgFcYu2BpW+JMzMKt3bR1yuPcfMZ81f56q8n6BPWqX1VQvv+J2bIwRWHrfoLRZwx7JFibReEMKRaPd289rLza5pbwC4X7SL+Ik7wMsL1cI7fuf+59v68NP/9IeB70XmPbYNLsWDa/sidaYX4iPp7u1g5jcAXENElwIYIaKdzPxr+zlZ7N7eTsQd4OWFjtfGzyOzfGhf4Hux7R6dZAdqd5Lu3m6/9jgRvQxgBYCdjmOZ6N7ersQd4OWHzuJ1yy1RDeaKUvpQSI5Eu7cT0WXmNSCihQD+KQCp8x4zOluFVqIazJXFsQs1ku7e/gEALxDRBIC/A/CXzPwShFjRqdHZSvy2SFkfu1BDAreE1PCqJyK1KVqPauCWuDmF1GiXrZPgjeSSCKnRihKEQryIwBBSRVyk7Y0IDCESnZRcJwQjAkMIjW7NUREu7Y8YPYXQ6ISkp5XvIiSLaBhtQhafzjoh6V7C5e4dEwCkR0i7IBpGG5DVp7NO9qqXcJlmzsRcBDVEYLQBaWWj6qITV+GX15KFuQhqiMBoA9LKRtVFJyQ9qGlyq+ciqCE2jDYgSjZq0rYPv7gK53v/3qIFOPBqc6d7oJbOvnxoXyZsM4I3IjDagLDVx+NutaiCvaO6vY1kqVwJ7C1SKlfw+R3jiY5PiIYIjDYgbEi1TtFeJ6qaiVv/VKslYpi0xhkGvvj4YREYGUUERpsQJqQ6rO1DVTNxnhe1QbLFpEbDZiFdxOjZwei4Pe2oemVa0d1MaC0iMDqYsOnkqppJUp6NpHuaCOERgdHBhK3EpaqZqHhprLWf15ACt98ghaCzitgwOpwwtg9Vr4xrc+c8Yf6cLrxdqTYYS1ULAC9/30XYNrhUa7xCeojAEJpQ9cpEbTuw8qoe7D96IlP5MYI/UtNTEASp6SkIQvyIwBAEQRmVRkbziOhFIpogoiNEtNV8/XkiGjd/jhNRUzNmIuojoh+Z1x0morVJTEIQhHRQMXqeBbCKmU8RkQHgB0T0DDOvsE4gol0Avu1y7SSAf83MPzN7qx4ioj3MXI5l9IIgpEqgwOCaVfSU+ath/tQtpUR0IYBVAD7rcu3f2/5/nIjeBNADQASGILQhSjYMIsoT0TiAN1FrlfiC7fAggO8x828C7nE9gDkAXnU5dhcRjRLR6IkTJ9RHLwhCqigJDGaeZuY+AJcBuJ6IrrYdXgdHf1UnRHQJgP8D4LPM3JRZxMwPM/MAMw/09PSoj14QhFTR8pKYtof9AG4GACK6GMD1AHZ7XWNuWXYD+BIzHww/VEEQWo2Kl6SHiIrm/wsAPgbgqHn4VgBPM/MZj2vnAHgCwDeYeWc8QxYEoVUERnoS0TUAvg4gj5qA2cHM95nHngMwxMzftZ0/AOBzzHwnEd0B4H8BOGK75WeYedzn/U4AeF1h7BcD+EeF8zqJ2Tbn2TZfoHVzvoKZA+0BmQsNV4WIRlVCWTuJ2Tbn2TZfIPtzlkhPQRCUEYEhCIIy7SwwHm71AFrAbJvzbJsvkPE5t60NQxCE9GlnDUMQhJTJtMAgomFbRuxrZng6iOh22+vjRDRDRH0u1/cR0UHznFEzPD2zRJ2vee6fEdFRM0P4a+nOQJ845myefzcRsRlMmGli+F5vN//Gh4noCStOKhWYuS1+ADwA4Msury8F8KrHNXsB/KH5/38B4LlWzyPh+a4E8LcA5pq/v6vV80h6zubxywHsQS1+5+JWzyOFv/ONALrM/98P4P60xptpDcOCiAjAbXDPWVkH4P96XMoALjT/vwDA8fhHFz8R5vsnqAXSnQUAZn4zmRHGT4Q5A8CDAP4DwjVbaxlh58zMe5l5yvz1IGo5XqnQLkWAVwD4NTP/zOXYWgB/5HHdegB7iOgvUdt+fTih8cVN2Pm+H8AKIvoKgDMAvsDMP05ojHETas5E9EcASsw8Qe3X0CTs39nOvwUwHOuofGi5wCCivwXwbpdDX2JmqyiPa0YsEd0AYJKZX/a4/Z8A2MDMu4joNgB/A+APYhh2aBKebxeAiwAsA/D7AHYQ0XvZ1F1bRVJzJqJuAF9ETUXPFAn/na3zvgRgCsCjEYerTqv3cAp7vC4AvwZwmcuxBwF80efat3HedUwAftPq+SQ83+8CWGn7/VUAPa2eU1JzRm2f/yaA18yfKQDHALy71XNK8u9snvMZAD8C0J3muFuuYSjwBwCOMvMv7S8SUQ61/d8K16tqHAfwEQDPoVYVzE31yxpR5juCmuFzPxG9H7WCRe2QvBVqzsz8EoB32c5/DcAAM3fsnM1zbkbNZvMRZp5MdJQO2sHo+Wm4G4X+GYA3mPnn9heJ6BEzYxYA/hjAA0Q0AeAvANyV6EjjIcp8/yeA9xLRy6gZzP4Nm4+jjBNlzu1KlDn/FYB3AHjWdL/+dbJDtY2jPb5PgiBkgXbQMARByAgiMARBUEYEhiAIyojAEARBGREYgiAoIwJDEARlRGAIgqCMCAxBEJT5/y1jf+ZfXs0vAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gpd.GeoDataFrame(fake_911_locations).plot()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"# To do Valhalla routing, I need these points close to the road network\n",
"# So you need to have a table of the road network in your CARTO account.\n",
"# The road network needs to be comprised of LineStings (NOT MultiLinestrings)\n",
"# If you have MultiLinestrings, you can use ST_Dump()\n",
"\n",
"make_linestring = '''\n",
"DROP TABLE IF EXISTS virginia_linestrings;\n",
"CREATE TABLE virginia_linestrings AS\n",
"SELECT (ST_DUMP(the_geom)).geom FROM va_extract_nofields;\n",
"SELECT cdb_cartodbfytable('michellemho-carto','virginia_linestrings')\n",
"'''\n",
"\n",
"snap_to_road = '''\n",
"SELECT DISTINCT ON (pt_id)\n",
" pt_id as cartodb_id,\n",
" ln_id, \n",
" ST_line_interpolate_point(\n",
" ln_geom, \n",
" ST_line_locate_point(ln_geom, pt_geom)\n",
" ) as the_geom,\n",
" ST_Transform(ST_line_interpolate_point(ln_geom, \n",
" ST_line_locate_point(ln_geom, pt_geom)\n",
" ),3857) as the_geom_webmercator\n",
"FROM\n",
"(\n",
" SELECT \n",
" \tDISTINCT ON (pt_id)\n",
" ST_LineMerge(ln.the_geom) AS ln_geom,\n",
" pt.the_geom AS pt_geom, \n",
" ln.cartodb_id AS ln_id, \n",
" pt.cartodb_id AS pt_id, \n",
" ST_Distance(ln.the_geom, pt.the_geom) AS d\n",
" FROM \n",
" fake_911_locations pt, \n",
" virginia_linestrings ln \n",
" WHERE \n",
" ST_DWithin(pt.the_geom, ln.the_geom, 0.001) \n",
" ORDER BY pt_id, d) as subquery\n",
"'''"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cdb_cartodbfytable</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>virginia_linestrings</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cdb_cartodbfytable\n",
"0 virginia_linestrings"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cc.query(make_linestring)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"fake_911_locations_snapped = cc.query(snap_to_road, table_name='snapped_fake_911', decode_geom=True)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"fake_911_locations = cc.read('fake_911_locations', decode_geom=True)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11d8beb00>"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Inspect results, looks good!\n",
"gpd.GeoDataFrame(fake_911_locations).plot(markersize=2, color='red')\n",
"gpd.GeoDataFrame(fake_911_locations_snapped).plot(ax=plt.gca(), markersize=3)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"fake_911_locations_snapped = gpd.GeoDataFrame(fake_911_locations_snapped, geometry='geometry')"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"# separate out latitude and longitude\n",
"fake_911_locations_snapped = fake_911_locations_snapped.assign(longitude = lambda x: x.geometry.x, latitude = lambda x: x.geometry.y)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"# export to csv for running in Valhalla at a later step\n",
"fake_911_locations_snapped[['latitude', 'longitude']].to_csv('fake_911_locations', index_label='id')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Fake date-time of 911 calls"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"def hour_prob(h):\n",
" # 10 AM and PM are peak\n",
" hour_prob = np.exp(-(h - 10)**2/(2*4)) + 0.7*np.exp(-(h - 16)**2/(2*4)) + 0.05\n",
" return hour_prob\n",
"\n",
"def calc_cpd(prob, domain):\n",
" norm_prob = [prob(a) for a in range(domain)] / np.sum([prob(a) for a in range(domain)])\n",
" cpd = np.cumsum(norm_prob)\n",
" return cpd\n",
"\n",
"def sample_cpd(cpd, n_samples):\n",
" samples = np.random.uniform(size=n_samples)\n",
" return np.digitize(samples,cpd)\n",
"\n",
"def random_minute():\n",
" return faker.time(pattern=\"%M\", end_datetime=None)\n"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"# Here I'm faking the date-time of the 911 calls\n",
"\n",
"norm_prob = [hour_prob(a) for a in range(24)] / np.sum([hour_prob(a) for a in range(24)])\n",
"cpd = np.cumsum(norm_prob)\n",
"\n",
"# Draw sample hours from hour probability distribution\n",
"hours = sample_cpd(calc_cpd(hour_prob,24), fake_911_locations_snapped.shape[0])\n",
"# Convert to string\n",
"hours = [str(i) for i in hours]\n",
"\n",
"# Draw random minutes from Faker\n",
"minutes = [random_minute() for i in range(fake_911_locations_snapped.shape[0])]\n",
"ziplist = zip(hours, minutes)\n",
"times = []\n",
"# The date of all these 911 calls will be August 1, 2018\n",
"for a,b in ziplist:\n",
" times.append('2018-1-1 '+a+':'+b)\n",
" \n",
"# We strip out the time again, just because we want time of day.\n",
"times_list = [datetime.datetime.strptime(time, '%Y-%m-%d %H:%M') for time in times]\n",
"fake_911_locations_snapped['received'] = times_list\n",
"\n",
"minutes_to_receive = []\n",
"for i,n in enumerate(times_list):\n",
" received = times_list[i]\n",
" midnight = received.replace(hour=0, minute=0, second=0, microsecond=0)\n",
" seconds = (received - midnight).seconds\n",
" minutes_to_receive.append(seconds/60)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Now we fake the minutes it takes to deal with each call\n",
"# we have sample real-world data on this variable in a table called va_runs\n",
"# we'll create a distribution from this data and sample from it\n",
"\n",
"va_runs = cc.read('va_all_runs_101_1022', decode_geom=True)\n",
"minutes_to_deal = (va_runs['available']-va_runs['received']).apply(lambda x: x.seconds/60)\n",
"bins = plt.hist(minutes_to_deal)[1]\n",
"counts = plt.hist(minutes_to_deal)[0]\n",
"cdf= counts/counts.sum()\n",
"minutes_to_deal = bins[sample_cpd(np.cumsum(cdf),fake_911_locations_snapped.shape[0])] + np.random.randint(low=-30, high=30)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"minutes_to_deal = bins[sample_cpd(np.cumsum(cdf),fake_911_locations_snapped.shape[0])] + np.random.randint(low=-30, high=30)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"fake_911_locations_snapped['minutes_to_deal'] = minutes_to_deal\n",
"fake_911_locations_snapped['minutes_to_deal'] = fake_911_locations_snapped['minutes_to_deal'].apply(lambda x: int(x + np.random.randint(low=-(x/2), high=30)))"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 748.000000\n",
"mean 198.296791\n",
"std 251.483662\n",
"min 11.000000\n",
"25% 35.000000\n",
"50% 113.500000\n",
"75% 215.000000\n",
"max 1328.000000\n",
"Name: minutes_to_deal, dtype: float64"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check that it's realistic\n",
"fake_911_locations_snapped['minutes_to_deal'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"# Save to file or write to CARTO\n",
"fake_911_locations_snapped.to_csv('fake_911_locations_snapped.csv')"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"# Plot ambulance call over time"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Inspect visually... looks good!\n",
"\n",
"fake_911_locations_snapped['minutes_to_deal'] = pd.to_timedelta(fake_911_locations_snapped['minutes_to_deal'], unit='m')\n",
"fake_911_locations_snapped['available']=fake_911_locations_snapped.received + fake_911_locations_snapped.minutes_to_deal\n",
"\n",
"fig, ax = plt.subplots()\n",
"\n",
"fake_911_locations_snapped.sort_values(by='received', inplace=True)\n",
"\n",
"received = fake_911_locations_snapped['received']\n",
"available = fake_911_locations_snapped['available']\n",
"\n",
"line1 = plt.barh(range(len(received)), available-received, left=received.astype(int), color='red')\n",
"\n",
"# time = pd.date_range(start='2018-01-01 00:00:00', end='2018-02-01 23:59:59',freq='4H')\n",
"# time_x = [dt.strftime('%Y-%m-%d %H:%M') for dt in time]\n",
"# ax.set_xticklabels(time_x)\n",
"# fig.autofmt_xdate()\n",
"\n",
"plt.title('Example of Ambulance Call Timelines')\n",
"\n",
"# plt.legend(line1, 'Occupied')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment