diff --git a/speeds3.ipynb b/speeds3.ipynb new file mode 100644 index 0000000..54163fe --- /dev/null +++ b/speeds3.ipynb @@ -0,0 +1,978 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualizing Public Transportation Speeds with Python\n", + "When people choose between driving and public transportation for urban trips, travel time (and public transportation frequency) is the most influential factor in their decision. Here we use Python to evaluate public transportation timetable speed between stops to look for slow spots. First we load some libraries:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import requests\n", + "import pandas\n", + "import tempfile\n", + "import datetime\n", + "import gtfstk\n", + "import folium\n", + "import haversine\n", + "from functools import reduce\n", + "from multiprocessing import Pool" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we create some helper functions. We make a function url2gtfs to extend the gtfstk library so it can load a library directly without downloading it first. We create parseTime to deal with date fields that go past 24 hours in timetables. Next we make tripToSegments to split up each public transportation vehicle's \"trip\" into \"segments\" between stops. And last we create function to plot each segment." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def url2gtfs(url):\n", + " r = requests.get(url)\n", + " with tempfile.NamedTemporaryFile() as f:\n", + " f.write(r._content)\n", + " return gtfstk.read_gtfs(f.name, dist_units='mi')\n", + "\n", + "\n", + "def parseTime(time): # to deal with times after midnight\n", + " if int(time.split(':')[0]) > 23:\n", + " return datetime.datetime.strptime('2:' + str(int(time.split(':')[0]) - 24) + ':'\n", + " + time.split(':')[1] + ':' + time.split(':')[2], '%d:%H:%M:%S')\n", + " else:\n", + " return datetime.datetime.strptime('1:' + time, '%d:%H:%M:%S')\n", + "\n", + "\n", + "def tripToSegments(trip_id):\n", + " stop_times = gtfs.stop_times[gtfs.stop_times['trip_id'] == trip_id]\n", + " segments = []\n", + " for i in range(len(stop_times)-1):\n", + " origin = gtfs.stops[gtfs.stops['stop_id'] == stop_times['stop_id'].iloc[i]]\n", + " destination = gtfs.stops[gtfs.stops['stop_id'] == stop_times['stop_id'].iloc[i+1]]\n", + " distance = haversine.haversine((origin['stop_lat'], origin['stop_lon']),\n", + " (destination['stop_lat'], destination['stop_lon']),\n", + " miles=True)\n", + " startTime = parseTime(stop_times['departure_time'].iloc[i])\n", + " stopTime = parseTime(stop_times['arrival_time'].iloc[i+1])\n", + " duration = (stopTime - startTime).seconds\n", + " if duration == 0:\n", + " speed = 0 # when the laws of physics do not apply\n", + " else:\n", + " speed = distance / duration * 60 * 60\n", + " segments.append({'origin_id': origin['stop_id'].iloc[0],\n", + " 'destination_id': destination['stop_id'].iloc[0],\n", + " 'distance': distance,\n", + " 'duration': duration,\n", + " 'speed': speed})\n", + " return(segments)\n", + "\n", + "def plotSegment(segment):\n", + " origin = gtfs.stops[gtfs.stops['stop_id'] == segment.name[0]]\n", + " destination = gtfs.stops[gtfs.stops['stop_id'] == segment.name[1]]\n", + " folium.PolyLine(locations=[(origin.stop_lat.iloc[0], origin.stop_lon.iloc[0]),\n", + " (destination.stop_lat.iloc[0], destination.stop_lon.iloc[0])],\n", + " popup=str(segment.speed['min']),\n", + " weight=segment.speed['min']\n", + " ).add_to(foliumMap)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we specify the General Transit Feed Specification (GTFS) feed for the public transportation agency we want to analyse. Then we can look at the routes in that feed." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "url = 'https://gitlab.com/LACMTA/gtfs_rail/raw/master/gtfs_rail.zip' # Los Angeles County Metro\n", + "# url = 'http://github.com/transitland/gtfs-archives-not-hosted-elsewhere/raw/master/amtrak.zip' # Amtrak\n", + "gtfs = url2gtfs(url)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": 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", + "
route_idroute_short_nameroute_long_nameroute_descroute_typeroute_colorroute_text_colorroute_url
0801NaNMetro Blue Line (801)NaN0004DACFFFFFFhttp://www.metro.net/around/rail/blue-line/
1802NaNMetro Red Line (802)NaN1EE3A43FFFFFFhttp://www.metro.net/around/rail/red-line/
2803NaNMetro Green Line (803)NaN02EAB00FFFFFFhttp://www.metro.net/around/rail/green-line/
3804NaNMetro Gold Line (804)NaN0DA7C20FFFFFFhttp://www.metro.net/around/rail/gold-line/
4806NaNMetro Expo Line (806)NaN00177A5FFFFFFhttp://www.metro.net/around/rail/expo-line/
5805NaNMetro Purple Line (805)NaN19561A9FFFFFFhttp://www.metro.net/around/rail/purple-line/
\n", + "
" + ], + "text/plain": [ + " route_id route_short_name route_long_name route_desc route_type \\\n", + "0 801 NaN Metro Blue Line (801) NaN 0 \n", + "1 802 NaN Metro Red Line (802) NaN 1 \n", + "2 803 NaN Metro Green Line (803) NaN 0 \n", + "3 804 NaN Metro Gold Line (804) NaN 0 \n", + "4 806 NaN Metro Expo Line (806) NaN 0 \n", + "5 805 NaN Metro Purple Line (805) NaN 1 \n", + "\n", + " route_color route_text_color route_url \n", + "0 004DAC FFFFFF http://www.metro.net/around/rail/blue-line/ \n", + "1 EE3A43 FFFFFF http://www.metro.net/around/rail/red-line/ \n", + "2 2EAB00 FFFFFF http://www.metro.net/around/rail/green-line/ \n", + "3 DA7C20 FFFFFF http://www.metro.net/around/rail/gold-line/ \n", + "4 0177A5 FFFFFF http://www.metro.net/around/rail/expo-line/ \n", + "5 9561A9 FFFFFF http://www.metro.net/around/rail/purple-line/ " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gtfs.routes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we pick the route we want to analyse and the direction (0.0 or 1.0). We filter the GTFS data for the route and direction, and split the trips into segments. Here we have the min, max, mean speed between each stop pair." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
distancedurationspeed
countmeanstdmin25%50%75%maxcountmean...75%maxcountmeanstdmin25%50%75%max
origin_iddestination_id
80121801231021.00.9102732.221534e-160.9102730.9102730.9102730.9102730.9102731021.0230.401567...240.0240.01021.014.2498166.204441e-0113.65409813.65409813.65409814.89538014.895380
80122801211021.00.6859521.110767e-160.6859520.6859520.6859520.6859520.6859521021.0177.747307...180.0240.01021.014.1221481.640630e+0010.28928113.71904213.71904215.43392215.433922
80123801241021.00.5477511.110767e-160.5477510.5477510.5477510.5477510.5477511021.0170.401567...180.0180.01021.011.6122206.844721e-0110.95502610.95502610.95502612.32440412.324404
80124801251021.00.5125301.110767e-160.5125300.5125300.5125300.5125300.5125301021.0110.401567...120.0120.01021.016.8517461.537103e+0015.37590015.37590015.37590018.45108118.451081
80125801261021.00.3325045.553836e-170.3325040.3325040.3325040.3325040.3325041021.0110.401567...120.0120.01021.010.9325789.971961e-019.9751229.9751229.97512211.97014711.970147
80126801271021.00.9947734.443068e-160.9947730.9947730.9947730.9947730.9947731021.0170.401567...180.0180.01021.021.0890031.243073e+0019.89547019.89547019.89547022.38240322.382403
80127801281021.01.5263402.221534e-161.5263401.5263401.5263401.5263401.5263401021.0230.401567...240.0240.01021.023.8939991.040357e+0022.89510322.89510322.89510324.97647624.976476
80128801291021.00.6388510.000000e+000.6388510.6388510.6388510.6388510.6388511021.0110.401567...120.0120.01021.021.0051141.915945e+0019.16552419.16552419.16552422.99862822.998628
80129801301021.00.5221430.000000e+000.5221430.5221430.5221430.5221430.5221431021.0110.401567...120.0120.01021.017.1678291.565934e+0015.66430115.66430115.66430118.79716118.797161
80130801311021.00.9771512.221534e-160.9771510.9771510.9771510.9771510.9771511021.0110.401567...120.0120.01021.032.1282702.930524e+0029.31453429.31453429.31453435.17744135.177441
80131801321021.00.9716432.221534e-160.9716430.9716430.9716430.9716430.9716431021.0139.196866...160.0160.01021.025.6519483.642507e+0021.86196921.86196929.14929229.14929229.149292
80132801331021.00.8798703.332301e-160.8798700.8798700.8798700.8798700.8798701021.0110.401567...120.0120.01021.028.9297032.638773e+0026.39609226.39609226.39609231.67531031.675310
80133801341021.01.2735322.221534e-161.2735321.2735321.2735321.2735321.2735321021.0230.401567...240.0240.01021.019.9364358.680424e-0119.10298719.10298719.10298720.83962220.839622
80134801351021.00.5614762.221534e-160.5614760.5614760.5614760.5614760.5614761021.0110.401567...120.0120.01021.018.4610711.683894e+0016.84428316.84428316.84428320.21314020.213140
80135801361021.01.0987582.221534e-161.0987581.0987581.0987581.0987581.0987581021.0170.401567...180.0180.01021.023.2934551.373012e+0021.97516121.97516121.97516124.72205624.722056
8013680137999.00.9637161.110779e-160.9637160.9637160.9637160.9637160.963716999.0110.390390...120.0120.0999.031.6897512.890390e+0028.91147228.91147228.91147234.69376634.693766
8013780138999.00.7259431.110779e-160.7259430.7259430.7259430.7259430.725943999.050.390390...60.060.0999.054.0206431.088630e+0143.55659643.55659643.55659665.33489465.334894
8013880139999.00.8927210.000000e+000.8927210.8927210.8927210.8927210.892721999.0240.000000...240.0240.0999.013.3908203.554493e-1513.39082013.39082013.39082013.39082013.390820
\n", + "

18 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " distance \\\n", + " count mean std min 25% \n", + "origin_id destination_id \n", + "80121 80123 1021.0 0.910273 2.221534e-16 0.910273 0.910273 \n", + "80122 80121 1021.0 0.685952 1.110767e-16 0.685952 0.685952 \n", + "80123 80124 1021.0 0.547751 1.110767e-16 0.547751 0.547751 \n", + "80124 80125 1021.0 0.512530 1.110767e-16 0.512530 0.512530 \n", + "80125 80126 1021.0 0.332504 5.553836e-17 0.332504 0.332504 \n", + "80126 80127 1021.0 0.994773 4.443068e-16 0.994773 0.994773 \n", + "80127 80128 1021.0 1.526340 2.221534e-16 1.526340 1.526340 \n", + "80128 80129 1021.0 0.638851 0.000000e+00 0.638851 0.638851 \n", + "80129 80130 1021.0 0.522143 0.000000e+00 0.522143 0.522143 \n", + "80130 80131 1021.0 0.977151 2.221534e-16 0.977151 0.977151 \n", + "80131 80132 1021.0 0.971643 2.221534e-16 0.971643 0.971643 \n", + "80132 80133 1021.0 0.879870 3.332301e-16 0.879870 0.879870 \n", + "80133 80134 1021.0 1.273532 2.221534e-16 1.273532 1.273532 \n", + "80134 80135 1021.0 0.561476 2.221534e-16 0.561476 0.561476 \n", + "80135 80136 1021.0 1.098758 2.221534e-16 1.098758 1.098758 \n", + "80136 80137 999.0 0.963716 1.110779e-16 0.963716 0.963716 \n", + "80137 80138 999.0 0.725943 1.110779e-16 0.725943 0.725943 \n", + "80138 80139 999.0 0.892721 0.000000e+00 0.892721 0.892721 \n", + "\n", + " duration \\\n", + " 50% 75% max count mean \n", + "origin_id destination_id \n", + "80121 80123 0.910273 0.910273 0.910273 1021.0 230.401567 \n", + "80122 80121 0.685952 0.685952 0.685952 1021.0 177.747307 \n", + "80123 80124 0.547751 0.547751 0.547751 1021.0 170.401567 \n", + "80124 80125 0.512530 0.512530 0.512530 1021.0 110.401567 \n", + "80125 80126 0.332504 0.332504 0.332504 1021.0 110.401567 \n", + "80126 80127 0.994773 0.994773 0.994773 1021.0 170.401567 \n", + "80127 80128 1.526340 1.526340 1.526340 1021.0 230.401567 \n", + "80128 80129 0.638851 0.638851 0.638851 1021.0 110.401567 \n", + "80129 80130 0.522143 0.522143 0.522143 1021.0 110.401567 \n", + "80130 80131 0.977151 0.977151 0.977151 1021.0 110.401567 \n", + "80131 80132 0.971643 0.971643 0.971643 1021.0 139.196866 \n", + "80132 80133 0.879870 0.879870 0.879870 1021.0 110.401567 \n", + "80133 80134 1.273532 1.273532 1.273532 1021.0 230.401567 \n", + "80134 80135 0.561476 0.561476 0.561476 1021.0 110.401567 \n", + "80135 80136 1.098758 1.098758 1.098758 1021.0 170.401567 \n", + "80136 80137 0.963716 0.963716 0.963716 999.0 110.390390 \n", + "80137 80138 0.725943 0.725943 0.725943 999.0 50.390390 \n", + "80138 80139 0.892721 0.892721 0.892721 999.0 240.000000 \n", + "\n", + " ... speed \\\n", + " ... 75% max count mean \n", + "origin_id destination_id ... \n", + "80121 80123 ... 240.0 240.0 1021.0 14.249816 \n", + "80122 80121 ... 180.0 240.0 1021.0 14.122148 \n", + "80123 80124 ... 180.0 180.0 1021.0 11.612220 \n", + "80124 80125 ... 120.0 120.0 1021.0 16.851746 \n", + "80125 80126 ... 120.0 120.0 1021.0 10.932578 \n", + "80126 80127 ... 180.0 180.0 1021.0 21.089003 \n", + "80127 80128 ... 240.0 240.0 1021.0 23.893999 \n", + "80128 80129 ... 120.0 120.0 1021.0 21.005114 \n", + "80129 80130 ... 120.0 120.0 1021.0 17.167829 \n", + "80130 80131 ... 120.0 120.0 1021.0 32.128270 \n", + "80131 80132 ... 160.0 160.0 1021.0 25.651948 \n", + "80132 80133 ... 120.0 120.0 1021.0 28.929703 \n", + "80133 80134 ... 240.0 240.0 1021.0 19.936435 \n", + "80134 80135 ... 120.0 120.0 1021.0 18.461071 \n", + "80135 80136 ... 180.0 180.0 1021.0 23.293455 \n", + "80136 80137 ... 120.0 120.0 999.0 31.689751 \n", + "80137 80138 ... 60.0 60.0 999.0 54.020643 \n", + "80138 80139 ... 240.0 240.0 999.0 13.390820 \n", + "\n", + " \\\n", + " std min 25% 50% \n", + "origin_id destination_id \n", + "80121 80123 6.204441e-01 13.654098 13.654098 13.654098 \n", + "80122 80121 1.640630e+00 10.289281 13.719042 13.719042 \n", + "80123 80124 6.844721e-01 10.955026 10.955026 10.955026 \n", + "80124 80125 1.537103e+00 15.375900 15.375900 15.375900 \n", + "80125 80126 9.971961e-01 9.975122 9.975122 9.975122 \n", + "80126 80127 1.243073e+00 19.895470 19.895470 19.895470 \n", + "80127 80128 1.040357e+00 22.895103 22.895103 22.895103 \n", + "80128 80129 1.915945e+00 19.165524 19.165524 19.165524 \n", + "80129 80130 1.565934e+00 15.664301 15.664301 15.664301 \n", + "80130 80131 2.930524e+00 29.314534 29.314534 29.314534 \n", + "80131 80132 3.642507e+00 21.861969 21.861969 29.149292 \n", + "80132 80133 2.638773e+00 26.396092 26.396092 26.396092 \n", + "80133 80134 8.680424e-01 19.102987 19.102987 19.102987 \n", + "80134 80135 1.683894e+00 16.844283 16.844283 16.844283 \n", + "80135 80136 1.373012e+00 21.975161 21.975161 21.975161 \n", + "80136 80137 2.890390e+00 28.911472 28.911472 28.911472 \n", + "80137 80138 1.088630e+01 43.556596 43.556596 43.556596 \n", + "80138 80139 3.554493e-15 13.390820 13.390820 13.390820 \n", + "\n", + " \n", + " 75% max \n", + "origin_id destination_id \n", + "80121 80123 14.895380 14.895380 \n", + "80122 80121 15.433922 15.433922 \n", + "80123 80124 12.324404 12.324404 \n", + "80124 80125 18.451081 18.451081 \n", + "80125 80126 11.970147 11.970147 \n", + "80126 80127 22.382403 22.382403 \n", + "80127 80128 24.976476 24.976476 \n", + "80128 80129 22.998628 22.998628 \n", + "80129 80130 18.797161 18.797161 \n", + "80130 80131 35.177441 35.177441 \n", + "80131 80132 29.149292 29.149292 \n", + "80132 80133 31.675310 31.675310 \n", + "80133 80134 20.839622 20.839622 \n", + "80134 80135 20.213140 20.213140 \n", + "80135 80136 24.722056 24.722056 \n", + "80136 80137 34.693766 34.693766 \n", + "80137 80138 65.334894 65.334894 \n", + "80138 80139 13.390820 13.390820 \n", + "\n", + "[18 rows x 24 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "route_id = '806'\n", + "direction_id = 1.0\n", + "\n", + "trip_ids = gtfs.trips[(gtfs.trips['route_id'] == route_id) & (gtfs.trips['direction_id'] == direction_id)]['trip_id']\n", + "p = Pool(8)\n", + "segments = reduce(lambda x, y: x + y, p.map(tripToSegments, trip_ids))\n", + "segmentsDF = pandas.DataFrame(segments).groupby(['origin_id', 'destination_id']).describe()\n", + "segmentsDF" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And finally we plot the route where the width of the line is the speed between each stop pair. The Expo Line really is much slower into downtown than along the rest of the line." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "foliumMap = folium.Map(location=[34, -118], zoom_start=9)\n", + "segmentsDF.apply(plotSegment, axis=1)\n", + "foliumMap" + ] + } + ], + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}