diff --git a/notebooks/data_cyril.ipynb b/notebooks/data_cyril.ipynb index b83daf0..a734be7 100644 --- a/notebooks/data_cyril.ipynb +++ b/notebooks/data_cyril.ipynb @@ -1,4042 +1,4236 @@ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Current session configs: {'conf': {'spark.app.name': 'lgptguys_final'}, 'kind': 'pyspark'}
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", - "
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
7611application_1589299642358_2106pysparkidleLinkLink
7632application_1589299642358_2126pysparkidleLinkLink
7633application_1589299642358_2127pysparkbusyLinkLink
7635application_1589299642358_2129pysparkidleLinkLink
7640application_1589299642358_2135pysparkidleLinkLink
7642application_1589299642358_2138pysparkidleLinkLink
7644application_1589299642358_2140pysparkbusyLinkLink
7651application_1589299642358_2147pysparkidleLinkLink
7653application_1589299642358_2149pysparkidleLinkLink
7664application_1589299642358_2160pysparkidleLinkLink
7665application_1589299642358_2161pysparkidleLinkLink
7667application_1589299642358_2163pysparkidleLinkLink
7670application_1589299642358_2166pysparkidleLinkLink
7674application_1589299642358_2170pysparkidleLinkLink
7675application_1589299642358_2171pysparkidleLinkLink
7676application_1589299642358_2172pysparkbusyLinkLink
7677application_1589299642358_2173pysparkbusyLinkLink
7678application_1589299642358_2174pysparkidleLinkLink
7680application_1589299642358_2176pysparkidleLinkLink
7681application_1589299642358_2177pysparkidleLinkLink
7683application_1589299642358_2179pysparkidleLinkLink
7684application_1589299642358_2180pysparkbusyLinkLink
" + "IDYARN Application IDKindStateSpark UIDriver logCurrent session?7676application_1589299642358_2172pysparkidleLinkLink7684application_1589299642358_2180pysparkidleLinkLink7686application_1589299642358_2182pysparkidleLinkLink7691application_1589299642358_2187pysparkidleLinkLink7694application_1589299642358_2190pysparkidleLinkLink7699application_1589299642358_2195pysparkbusyLinkLink7700application_1589299642358_2196pysparkidleLinkLink7701application_1589299642358_2197pysparkidleLinkLink7704application_1589299642358_2200pysparkidleLinkLink7705application_1589299642358_2201pysparkidleLinkLink7711application_1589299642358_2207pysparkidleLinkLink7718application_1589299642358_2214pysparkidleLinkLink7719application_1589299642358_2215pysparkidleLinkLink7720application_1589299642358_2216pysparkidleLinkLink7721application_1589299642358_2217pysparkidleLinkLink7722application_1589299642358_2218pysparkbusyLinkLink7724application_1589299642358_2220pysparkidleLinkLink7725application_1589299642358_2221pysparkbusyLinkLink7727application_1589299642358_2223pysparkidleLinkLink7728application_1589299642358_2224pysparkbusyLinkLink" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%configure\n", "{\"conf\": {\n", " \"spark.app.name\": \"lgptguys_final\"\n", "}}" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting Spark application\n" ] }, { "data": { "text/html": [ "\n", - "
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
7685application_1589299642358_2181pysparkidleLinkLink
" + "IDYARN Application IDKindStateSpark UIDriver logCurrent session?7729application_1589299642358_2225pysparkidleLinkLink✔" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "SparkSession available as 'spark'.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "An error was encountered:\n", "unknown magic command '%spark'\n", "UnknownMagic: unknown magic command '%spark'\n", "\n" ] } ], "source": [ "# Initialization\n", "%%spark" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below, we pre-process the data to generate the files required to run RAPTOR.\n", "\n", "The main reasoning behind this way of cleaning the data is the following:\n", "**Given a cleaned stop_times.txt file, it is possible to reconstruct everything required to run RAPTOR** to the exception of footpaths. In particular, routes are reconstructed from the cleaned stop_times.txt and not from routes.txt.\n", "\n", "We use the following strategy:\n", "\n", "- 1) Filter out stops out of 15km of ZH HB\n", " - Done on stops\n", "- 2) Merge stops that share a parent stop to the first 7 characters of the stop name\n", " - Done on stops (add a general_stop column)\n", " - Used as an input for stopTimes (add a general_stop column). At this point, stop_times contains only stops within 15km of ZH HB\n", " \n", "- 3) keep only services that run each day of the business week:\n", " - Obtain the list of services from calendar\n", " - Serves as an input to filter trips\n", " - Serves as an input to filter stop_times\n", "- 4) keep only stop times between 7am and 7pm\n", " - Do that on stop_times\n", " \n", "- 5) Find unique trips, based on the stops sequence and the departure times sequence\n", " - sort by trip, arrival_time (which is the same as stop_sequence)\n", " - build a (sorted) all_stops column for each trip\n", " - build a (sorted) all_departure_times column for each trip\n", " - keep only one trip that has the same all_stops and all_departure_times column\n", "- 6) building routes based on unique trips\n", " - order unique_trips by stop_sequence, earliest departure time\n", " - each window with the same stop_sequence gets a unique routeID\n", " \n", "- 7) giving unique integer indices to stops\n", " - get unique general (parent) stop names from stop times\n", " - assign an index with zipWithIndex\n", " - stop_times -> inner join on result\n", "- 8) indicating transport type from the route\n", " - inner join stop_times with routes.txt on route_id" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from geopy.distance import great_circle\n", "from pyspark.sql.functions import *\n", "import numpy as np\n", "import pandas as pd\n", "from geopy.distance import great_circle\n", "from pyspark.sql.types import DoubleType\n", "from pyspark.sql.types import DateType" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1) Filtering out stops not within 15km of ZH HB" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-------+--------------------+----------------+-----------------+-------------+--------------+\n", "|stop_id| stop_name| stop_lat| stop_lon|location_type|parent_station|\n", "+-------+--------------------+----------------+-----------------+-------------+--------------+\n", "|1322000| Altoggio|46.1672513851495| 8.345807131427| null| null|\n", "|1322001| Antronapiana| 46.060121674738| 8.11361957990831| null| null|\n", "|1322002| Anzola|45.9898698225697| 8.34571729989858| null| null|\n", "|1322003| Baceno|46.2614983591677| 8.31925293162473| null| null|\n", "|1322004|Beura Cardezza, c...|46.0790618438814| 8.29927439970313| null| null|\n", "|1322005|Bognanco, T. Vill...|46.1222963432243| 8.21077237789936| null| null|\n", "|1322006| Boschetto|46.0656504576122| 8.26113193273411| null| null|\n", "|1322007| Cadarese|46.2978807772998| 8.3626325767009| null| null|\n", "|1322010| Campioli|45.9695691829797| 8.04585965801774| null| null|\n", "|1322011| Cascate del Toce|46.4091810825782| 8.4117524564434| null| null|\n", "|1322012| Castiglione|46.0205875326422| 8.2148866619012| null| null|\n", "|1322013| Ceppo Morelli|45.9710364221151| 8.06992552448265| null| null|\n", "|1322014|Chiesa (Val Forma...|46.3530849443472| 8.42787721579558| null| null|\n", "|1322015| Cosasca di Trontano|46.0967496675661| 8.31182386422403| null| null|\n", "|1322016| Cresti|46.0664046229574| 8.2328978833503| null| null|\n", "|1322017| Crevoladossola|46.1562758593614| 8.30343359946918| null| null|\n", "|1322018| Crodo, Bagni|46.2141837457637| 8.32131905677849| null| null|\n", "|1322019| Crodo, paese| 46.224016613202| 8.3235648449891| null| null|\n", "|1322021| Croppo di Trontano|46.1103590121829| 8.31194064521098| null| null|\n", "|1322022| Crusinallo|45.6945937446539|0.595870494345107| null| null|\n", "+-------+--------------------+----------------+-----------------+-------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "stops = spark.read.csv(\"/data/sbb/timetables/csv/stops/2019/05/14/stops.txt\", header=True, sep = \",\")\n", "stops.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "30631" ] } ], "source": [ "stops.count()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#defining udf function\n", "@udf(\"float\")\n", "def great_circle_udf(x, y):\n", " return great_circle(x, y).kilometers" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "| stop_id| stop_name| stop_lat| stop_lon|location_type|parent_station|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "| 8500926|Oetwil a.d.L., Sc...|47.4236270123012| 8.4031825286317| null| null|\n", "| 8502186|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| null| 8502186P|\n", "|8502186:0:1|Dietikon Stoffelbach|47.3934666445388|8.39894248049007| null| 8502186P|\n", "|8502186:0:2|Dietikon Stoffelbach|47.3935274568464|8.39894248049007| null| 8502186P|\n", "| 8502186P|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| 1| null|\n", "| 8502187|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| null| 8502187P|\n", "|8502187:0:1|Rudolfstetten Hof...|47.3647554015789|8.37709545277724| null| 8502187P|\n", "|8502187:0:2|Rudolfstetten Hof...|47.3648162470108|8.37709545277724| null| 8502187P|\n", "| 8502187P|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| 1| null|\n", "| 8502188| Zufikon Hammergut|47.3558347019549|8.35472740219955| null| 8502188P|\n", "|8502188:0:1| Zufikon Hammergut|47.3558955576756|8.35472740219955| null| 8502188P|\n", "|8502188:0:2| Zufikon Hammergut|47.3559564133261|8.35472740219955| null| 8502188P|\n", "| 8502188P| Zufikon Hammergut|47.3558347019549|8.35472740219955| 1| null|\n", "| 8502208| Horgen Oberdorf|47.2587475534877|8.58979854578067| null| 8502208P|\n", "|8502208:0:2| Horgen Oberdorf|47.2589304560815|8.58979854578067| null| 8502208P|\n", "|8502208:0:3| Horgen Oberdorf|47.2588085210892|8.58979854578067| null| 8502208P|\n", "|8502208:0:4| Horgen Oberdorf|47.2588694886204|8.58979854578067| null| 8502208P|\n", "| 8502208P| Horgen Oberdorf|47.2587475534877|8.58979854578067| 1| null|\n", "| 8502209| Oberrieden Dorf|47.2767238569466| 8.577635356832| null| 8502209P|\n", "|8502209:0:1| Oberrieden Dorf|47.2768457506749| 8.577635356832| null| 8502209P|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "# Zurich HB coordinates\n", "zurich_geo = (47.378177, 8.540192)\n", "\n", "#transforming Zurich HB coordinates in a spark dataframe column object\n", "zurich_geo_col = struct(lit(zurich_geo[0]), lit(zurich_geo[1]))\n", "\n", "#applying filter function based on distance\n", "stops_15km = stops.filter(great_circle_udf(zurich_geo_col, struct(stops.stop_lat, stops.stop_lon)) < 15)\n", "stops_15km.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1883" ] } ], "source": [ "stops_15km.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2) Merging stops that share a parent stop" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+------------+--------------------+----------------+----------------+-------------+--------------+\n", "| stop_id| stop_name| stop_lat| stop_lon|location_type|parent_station|\n", "+------------+--------------------+----------------+----------------+-------------+--------------+\n", "| 8502186|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| null| 8502186P|\n", "| 8502186:0:1|Dietikon Stoffelbach|47.3934666445388|8.39894248049007| null| 8502186P|\n", "| 8502186:0:2|Dietikon Stoffelbach|47.3935274568464|8.39894248049007| null| 8502186P|\n", "| 8502187|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| null| 8502187P|\n", "| 8502187:0:1|Rudolfstetten Hof...|47.3647554015789|8.37709545277724| null| 8502187P|\n", "| 8502187:0:2|Rudolfstetten Hof...|47.3648162470108|8.37709545277724| null| 8502187P|\n", "| 8502188| Zufikon Hammergut|47.3558347019549|8.35472740219955| null| 8502188P|\n", "| 8502188:0:1| Zufikon Hammergut|47.3558955576756|8.35472740219955| null| 8502188P|\n", "| 8502188:0:2| Zufikon Hammergut|47.3559564133261|8.35472740219955| null| 8502188P|\n", "| 8502208| Horgen Oberdorf|47.2587475534877|8.58979854578067| null| 8502208P|\n", "| 8502208:0:2| Horgen Oberdorf|47.2589304560815|8.58979854578067| null| 8502208P|\n", "| 8502208:0:3| Horgen Oberdorf|47.2588085210892|8.58979854578067| null| 8502208P|\n", "| 8502208:0:4| Horgen Oberdorf|47.2588694886204|8.58979854578067| null| 8502208P|\n", "| 8502209| Oberrieden Dorf|47.2767238569466| 8.577635356832| null| 8502209P|\n", "| 8502209:0:1| Oberrieden Dorf|47.2768457506749| 8.577635356832| null| 8502209P|\n", "| 8502209:0:2| Oberrieden Dorf|47.2767848038458| 8.577635356832| null| 8502209P|\n", "| 8502220| Urdorf|47.3908820565997|8.43471339510869| null| 8502220P|\n", "| 8502220:0:1| Urdorf|47.3909428718897|8.43471339510869| null| 8502220P|\n", "| 8502220:0:2| Urdorf|47.3910036871096|8.43471339510869| null| 8502220P|\n", "| 8502221| Birmensdorf ZH|47.3574351840587|8.43754308825406| null| 8502221P|\n", "| 8502221:0:1| Birmensdorf ZH|47.3575568917382|8.43754308825406| null| 8502221P|\n", "| 8502221:0:2| Birmensdorf ZH|47.3574960379336|8.43754308825406| null| 8502221P|\n", "| 8502222| Bonstetten-Wettswil|47.3258973534906|8.46817563944679| null| 8502222P|\n", "| 8502222:0:2| Bonstetten-Wettswil| 47.325958243729|8.46817563944679| null| 8502222P|\n", "| 8502222:0:3| Bonstetten-Wettswil|47.3260191338971|8.46817563944679| null| 8502222P|\n", "| 8502223| Hedingen|47.2987820476816|8.44595131931459| null| 8502223P|\n", "| 8502223:0:1| Hedingen|47.2988429691695|8.44595131931459| null| 8502223P|\n", "| 8502223:0:2| Hedingen|47.2989038905872|8.44595131931459| null| 8502223P|\n", "| 8502224| Affoltern am Albis|47.2760656259617|8.44658014001356| null| 8502224P|\n", "| 8502224:0:1| Affoltern am Albis|47.2761875212063|8.44658014001356| null| 8502224P|\n", "| 8502224:0:2| Affoltern am Albis|47.2762484687233|8.44658014001356| null| 8502224P|\n", "| 8502224:0:3| Affoltern am Albis|47.2761265736191|8.44658014001356| null| 8502224P|\n", "| 8502229:0:1| Urdorf Weihermatt|47.3810351357388|8.43032961652157| null| 8502229P|\n", "| 8502229:0:2| Urdorf Weihermatt|47.3810959623905|8.43032961652157| null| 8502229P|\n", "| 8502273:0:1| Bremgarten|47.3519945640447| 8.3474779978557| null| 8502273P|\n", "| 8502273:0:2| Bremgarten|47.3519337038252| 8.3474779978557| null| 8502273P|\n", "| 8502276:0:1| Berikon-Widen|47.3622485087742|8.36679177646695| null| 8502276P|\n", "| 8502276:0:2| Berikon-Widen|47.3623093570976|8.36679177646695| null| 8502276P|\n", "| 8502758:0:A|Hausen am Albis, ...|47.2448085174147| 8.5329801040522| null| 8502758P|\n", "| 8502758:0:B|Hausen am Albis, ...|47.2448695010648| 8.5329801040522| null| 8502758P|\n", "| 8502758:0:C|Hausen am Albis, ...|47.2449304846447| 8.5329801040522| null| 8502758P|\n", "| 8503000| Zürich HB|47.3781762039461|8.54019357578468| null| 8503000P|\n", "|8503000:0:10| Zürich HB|47.3794536181612|8.54019357578468| null| 8503000P|\n", "|8503000:0:11| Zürich HB|47.3795144466376|8.54019357578468| null| 8503000P|\n", "|8503000:0:12| Zürich HB|47.3786020121232|8.54019357578468| null| 8503000P|\n", "|8503000:0:13| Zürich HB|47.3785411825942|8.54019357578468| null| 8503000P|\n", "|8503000:0:14| Zürich HB|47.3783586935859|8.54019357578468| null| 8503000P|\n", "|8503000:0:15| Zürich HB|47.3784803529949|8.54019357578468| null| 8503000P|\n", "|8503000:0:16| Zürich HB|47.3784195233255|8.54019357578468| null| 8503000P|\n", "|8503000:0:17| Zürich HB| 47.379271132311|8.54019357578468| null| 8503000P|\n", "+------------+--------------------+----------------+----------------+-------------+--------------+\n", "only showing top 50 rows" ] } ], "source": [ "stops_15km.filter(stops_15km.parent_station.isNotNull()).show(50)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "| stop_id| stop_name| stop_lat| stop_lon|location_type|parent_station|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "| 8500926|Oetwil a.d.L., Sc...|47.4236270123012| 8.4031825286317| null| null|\n", "| 8502186P|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| 1| null|\n", "| 8502187P|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| 1| null|\n", "| 8502188P| Zufikon Hammergut|47.3558347019549|8.35472740219955| 1| null|\n", "| 8502208P| Horgen Oberdorf|47.2587475534877|8.58979854578067| 1| null|\n", "| 8502209P| Oberrieden Dorf|47.2767238569466| 8.577635356832| 1| null|\n", "| 8502220P| Urdorf|47.3908820565997|8.43471339510869| 1| null|\n", "| 8502221P| Birmensdorf ZH|47.3574351840587|8.43754308825406| 1| null|\n", "| 8502222P| Bonstetten-Wettswil|47.3258973534906|8.46817563944679| 1| null|\n", "| 8502223P| Hedingen|47.2987820476816|8.44595131931459| 1| null|\n", "| 8502224P| Affoltern am Albis|47.2760656259617|8.44658014001356| 1| null|\n", "| 8502229P| Urdorf Weihermatt|47.3809743090169|8.43032961652157| 1| null|\n", "| 8502268| Zufikon Belvédère|47.3575812332404|8.35923694492646| null| null|\n", "|8502268:0:1| Zufikon Belvédère|47.3576420869468|8.35923694492646| null| null|\n", "| 8502270| Bergfrieden|47.3977111751049|8.39908621093555| null| null|\n", "|8502270:0:1| Bergfrieden|47.3977719825142|8.39908621093555| null| null|\n", "| 8502273P| Bremgarten|47.3518728435356| 8.3474779978557| 1| null|\n", "| 8502274| Zufikon|47.3525240449924|8.35470943589386| null| null|\n", "|8502274:0:1| Zufikon|47.3525849045311|8.35470943589386| null| null|\n", "| 8502275| Widen Heinrüti|47.3620598785256|8.35486214949218| null| null|\n", "|8502275:0:1| Widen Heinrüti|47.3621207270666|8.35486214949218| null| null|\n", "| 8502276P| Berikon-Widen|47.3621876603806|8.36679177646695| 1| null|\n", "| 8502277| Rudolfstetten|47.3700243558558|8.38180262486668| null| null|\n", "|8502277:0:1| Rudolfstetten| 47.37008519521|8.38180262486668| null| null|\n", "| 8502278| Reppischhof|47.3847211041004| 8.3963463493186| null| null|\n", "|8502278:0:1| Reppischhof|47.3847819264993| 8.3963463493186| null| null|\n", "| 8502495|Zürich Wollishofe...|47.3476976601166|8.53331248070737| null| null|\n", "| 8502508|Spreitenbach, Rai...|47.4154457211288|8.37718528430566| null| null|\n", "| 8502553|Unterlunkhofen, B...|47.3221585583935| 8.380473118246| null| null|\n", "| 8502559|Waldegg, Birmensd...|47.3683025730349|8.46346846735736| null| null|\n", "| 8502560| Berikon, Kirche|47.3510512227562|8.37141810018081| null| null|\n", "| 8502570| Rottenschwil, Hecht|47.3190589331876| 8.372091836644| null| null|\n", "| 8502572|Zürich, Goldbrunn...|47.3702920484894|8.51391785372053| null| null|\n", "| 8502574|Affoltern a. A., ...|47.2784669105587|8.45910265507593| null| null|\n", "| 8502575| Widen, Dorf|47.3675724714769|8.36359377405504| null| null|\n", "| 8502750| Bellikon, Post|47.3895076123306| 8.3433726970067| null| null|\n", "| 8502758P|Hausen am Albis, ...|47.2447475336943| 8.5329801040522| 1| null|\n", "| 8502762|Langnau a.A., Alb...|47.2761509526624|8.52069115096373| null| null|\n", "| 8502763|Hausen am Albis, ...|47.2629785384073|8.51724162027223| null| null|\n", "| 8502764|Hausen am Albis, ...|47.2590158104091| 8.5220386238901| null| null|\n", "| 8502771|Aeugst am Albis, ...|47.2678309520619|8.48534244452871| null| null|\n", "| 8502776|Gattikon, Obstgarten|47.2847255843239| 8.5511170896411| null| null|\n", "| 8502779| Ottenbach, Post|47.2816481400898|8.40452101840523| null| null|\n", "| 8502876|Aesch ZH, Gemeind...|47.3382079319594|8.43870191497073| null| null|\n", "| 8502879| Jonen, Post|47.2961806346557|8.39551091610425| null| null|\n", "| 8502883|Zwillikon, Gemein...|47.2873945890065|8.43218912915996| null| null|\n", "| 8502885|Bonstetten, Dorfp...|47.3150882242354|8.46778038072173| null| null|\n", "| 8502894|Oberwil-Lieli, Ob...|47.3371669407057|8.38639301596917| null| null|\n", "| 8502950|Birmensdorf ZH, Z...|47.3539359682156|8.43717477898752| null| null|\n", "| 8502953|Affoltern a. A., ...|47.2812215495339|8.45441344929217| null| null|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+\n", "only showing top 50 rows" ] } ], "source": [ "stops_15km.filter(stops_15km.parent_station.isNull()).show(50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is clear that parent stops were not properly assigned for all stops (e.g Zufikon Belvédère where there is a platform stop, but no parent stop). Thus, we create a new column `stop_id_general` that contains only the 7 first characters of `stop_id`" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+--------------------+----------------+----------------+-------------+--------------+---------------+\n", "| stop_id| stop_name| stop_lat| stop_lon|location_type|parent_station|stop_id_general|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+---------------+\n", "| 8500926|Oetwil a.d.L., Sc...|47.4236270123012| 8.4031825286317| null| null| 8500926|\n", "| 8502186|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| null| 8502186P| 8502186|\n", "|8502186:0:1|Dietikon Stoffelbach|47.3934666445388|8.39894248049007| null| 8502186P| 8502186|\n", "|8502186:0:2|Dietikon Stoffelbach|47.3935274568464|8.39894248049007| null| 8502186P| 8502186|\n", "| 8502186P|Dietikon Stoffelbach|47.3934058321612|8.39894248049007| 1| null| 8502186|\n", "| 8502187|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| null| 8502187P| 8502187|\n", "|8502187:0:1|Rudolfstetten Hof...|47.3647554015789|8.37709545277724| null| 8502187P| 8502187|\n", "|8502187:0:2|Rudolfstetten Hof...|47.3648162470108|8.37709545277724| null| 8502187P| 8502187|\n", "| 8502187P|Rudolfstetten Hof...|47.3646945560768|8.37709545277724| 1| null| 8502187|\n", "| 8502188| Zufikon Hammergut|47.3558347019549|8.35472740219955| null| 8502188P| 8502188|\n", "|8502188:0:1| Zufikon Hammergut|47.3558955576756|8.35472740219955| null| 8502188P| 8502188|\n", "|8502188:0:2| Zufikon Hammergut|47.3559564133261|8.35472740219955| null| 8502188P| 8502188|\n", "| 8502188P| Zufikon Hammergut|47.3558347019549|8.35472740219955| 1| null| 8502188|\n", "| 8502208| Horgen Oberdorf|47.2587475534877|8.58979854578067| null| 8502208P| 8502208|\n", "|8502208:0:2| Horgen Oberdorf|47.2589304560815|8.58979854578067| null| 8502208P| 8502208|\n", "|8502208:0:3| Horgen Oberdorf|47.2588085210892|8.58979854578067| null| 8502208P| 8502208|\n", "|8502208:0:4| Horgen Oberdorf|47.2588694886204|8.58979854578067| null| 8502208P| 8502208|\n", "| 8502208P| Horgen Oberdorf|47.2587475534877|8.58979854578067| 1| null| 8502208|\n", "| 8502209| Oberrieden Dorf|47.2767238569466| 8.577635356832| null| 8502209P| 8502209|\n", "|8502209:0:1| Oberrieden Dorf|47.2768457506749| 8.577635356832| null| 8502209P| 8502209|\n", "+-----------+--------------------+----------------+----------------+-------------+--------------+---------------+\n", "only showing top 20 rows" ] } ], "source": [ "stops_15km = stops_15km.withColumn('stop_id_general',col('stop_id').substr(1, 7))\n", "stops_15km.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we filter stop_times with the 15km radius, and add the stop_id_general column" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+-----------+---------------+--------------------+\n", - "| stop_id|stop_id_general| stop_name|\n", - "+-----------+---------------+--------------------+\n", - "| 8500926| 8500926|Oetwil a.d.L., Sc...|\n", - "| 8502186| 8502186|Dietikon Stoffelbach|\n", - "|8502186:0:1| 8502186|Dietikon Stoffelbach|\n", - "|8502186:0:2| 8502186|Dietikon Stoffelbach|\n", - "| 8502186P| 8502186|Dietikon Stoffelbach|\n", - "| 8502187| 8502187|Rudolfstetten Hof...|\n", - "|8502187:0:1| 8502187|Rudolfstetten Hof...|\n", - "|8502187:0:2| 8502187|Rudolfstetten Hof...|\n", - "| 8502187P| 8502187|Rudolfstetten Hof...|\n", - "| 8502188| 8502188| Zufikon Hammergut|\n", - "|8502188:0:1| 8502188| Zufikon Hammergut|\n", - "|8502188:0:2| 8502188| Zufikon Hammergut|\n", - "| 8502188P| 8502188| Zufikon Hammergut|\n", - "| 8502208| 8502208| Horgen Oberdorf|\n", - "|8502208:0:2| 8502208| Horgen Oberdorf|\n", - "|8502208:0:3| 8502208| Horgen Oberdorf|\n", - "|8502208:0:4| 8502208| Horgen Oberdorf|\n", - "| 8502208P| 8502208| Horgen Oberdorf|\n", - "| 8502209| 8502209| Oberrieden Dorf|\n", - "|8502209:0:1| 8502209| Oberrieden Dorf|\n", - "+-----------+---------------+--------------------+\n", + "+-----------+---------------+--------------------+----------------+----------------+\n", + "| stop_id|stop_id_general| stop_name| stop_lat| stop_lon|\n", + "+-----------+---------------+--------------------+----------------+----------------+\n", + "| 8500926| 8500926|Oetwil a.d.L., Sc...|47.4236270123012| 8.4031825286317|\n", + "| 8502186| 8502186|Dietikon Stoffelbach|47.3934058321612|8.39894248049007|\n", + "|8502186:0:1| 8502186|Dietikon Stoffelbach|47.3934666445388|8.39894248049007|\n", + "|8502186:0:2| 8502186|Dietikon Stoffelbach|47.3935274568464|8.39894248049007|\n", + "| 8502186P| 8502186|Dietikon Stoffelbach|47.3934058321612|8.39894248049007|\n", + "| 8502187| 8502187|Rudolfstetten Hof...|47.3646945560768|8.37709545277724|\n", + "|8502187:0:1| 8502187|Rudolfstetten Hof...|47.3647554015789|8.37709545277724|\n", + "|8502187:0:2| 8502187|Rudolfstetten Hof...|47.3648162470108|8.37709545277724|\n", + "| 8502187P| 8502187|Rudolfstetten Hof...|47.3646945560768|8.37709545277724|\n", + "| 8502188| 8502188| Zufikon Hammergut|47.3558347019549|8.35472740219955|\n", + "|8502188:0:1| 8502188| Zufikon Hammergut|47.3558955576756|8.35472740219955|\n", + "|8502188:0:2| 8502188| Zufikon Hammergut|47.3559564133261|8.35472740219955|\n", + "| 8502188P| 8502188| Zufikon Hammergut|47.3558347019549|8.35472740219955|\n", + "| 8502208| 8502208| Horgen Oberdorf|47.2587475534877|8.58979854578067|\n", + "|8502208:0:2| 8502208| Horgen Oberdorf|47.2589304560815|8.58979854578067|\n", + "|8502208:0:3| 8502208| Horgen Oberdorf|47.2588085210892|8.58979854578067|\n", + "|8502208:0:4| 8502208| Horgen Oberdorf|47.2588694886204|8.58979854578067|\n", + "| 8502208P| 8502208| Horgen Oberdorf|47.2587475534877|8.58979854578067|\n", + "| 8502209| 8502209| Oberrieden Dorf|47.2767238569466| 8.577635356832|\n", + "|8502209:0:1| 8502209| Oberrieden Dorf|47.2768457506749| 8.577635356832|\n", + "+-----------+---------------+--------------------+----------------+----------------+\n", "only showing top 20 rows" ] } ], "source": [ - "stops_15km_for_join = stops_15km.select(stops_15km.stop_id, stops_15km.stop_id_general, stops.stop_name)\n", + "stops_15km_for_join = stops_15km.select(stops_15km.stop_id, \n", + " stops_15km.stop_id_general, \n", + " stops.stop_name, \n", + " stops.stop_lat, \n", + " stops.stop_lon)\n", "stops_15km_for_join.show()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+------------+--------------+-----------+-------------+-----------+-------------+\n", "| trip_id|arrival_time|departure_time| stop_id|stop_sequence|pickup_type|drop_off_type|\n", "+--------------------+------------+--------------+-----------+-------------+-----------+-------------+\n", "|1.TA.1-1-B-j19-1.1.R| 04:20:00| 04:20:00|8500010:0:3| 1| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:24:00| 04:24:00|8500020:0:3| 2| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:28:00| 04:28:00|8500021:0:5| 3| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:30:00| 04:30:00|8517131:0:2| 4| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:32:00| 04:32:00|8500300:0:5| 5| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:35:00| 04:35:00|8500313:0:2| 6| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:37:00| 04:38:00|8500301:0:3| 7| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:40:00| 04:41:00|8500302:0:3| 8| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:45:00| 04:45:00|8500303:0:2| 9| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:48:00| 04:49:00|8500320:0:3| 10| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:52:00| 04:52:00|8500304:0:2| 11| 0| 0|\n", "|1.TA.1-1-B-j19-1.1.R| 04:56:00| 04:56:00|8500305:0:1| 12| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 05:50:00| 05:50:00|8500010:0:3| 1| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 05:54:00| 05:54:00|8500020:0:3| 2| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 05:58:00| 05:58:00|8500021:0:5| 3| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 06:00:00| 06:00:00|8517131:0:2| 4| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 06:02:00| 06:02:00|8500300:0:5| 5| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 06:05:00| 06:05:00|8500313:0:2| 6| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 06:07:00| 06:08:00|8500301:0:3| 7| 0| 0|\n", "|25.TA.1-1-B-j19-1...| 06:10:00| 06:11:00|8500302:0:3| 8| 0| 0|\n", "+--------------------+------------+--------------+-----------+-------------+-----------+-------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times = spark.read.csv(\"/data/sbb/timetables/csv/stop_times/2019/05/14/stop_times.txt\", header=True, sep = \",\")\n", "stop_times.show()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "11128930" ] } ], "source": [ "stop_times.count()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+\n", - "| stop_id| trip_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name|\n", - "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+\n", - "|8503202:0:4|8.TA.25-70-j19-1.1.H| 14:13:00| 14:14:00| 3| 0| 0| 8503202| Thalwil|\n", - "|8503000:0:8|14.TA.25-70-j19-1...| 20:04:00| 20:04:00| 1| 0| 0| 8503000| Zürich HB|\n", - "|8503202:0:5|108.TA.25-75-j19-...| 21:12:00| 21:14:00| 5| 0| 0| 8503202| Thalwil|\n", - "|8503000:0:7|263.TA.25-75-j19-...| 16:35:00| 16:35:00| 1| 0| 0| 8503000| Zürich HB|\n", - "| 8588051|3.TA.26-811-j19-1...| 17:31:00| 17:31:00| 2| 0| 0| 8588051| Uster, Dammstrasse|\n", - "| 8573504|45.TA.26-811-j19-...| 06:41:00| 06:41:00| 11| 0| 0| 8573504| Uster, Bahnhof|\n", - "| 8588052|63.TA.26-811-j19-...| 10:18:00| 10:18:00| 4| 0| 0| 8588052| Uster, Gschwader|\n", - "| 8503152|69.TA.26-811-j19-...| 16:51:00| 16:51:00| 7| 0| 0| 8503152| Uster, Brandschenke|\n", - "| 8503152|71.TA.26-811-j19-...| 09:51:00| 09:51:00| 7| 0| 0| 8503152| Uster, Brandschenke|\n", - "| 8587860|81.TA.26-811-j19-...| 16:08:00| 16:08:00| 9| 0| 0| 8587860| Uster, Strick|\n", - "| 8587860|85.TA.26-811-j19-...| 16:32:00| 16:32:00| 3| 0| 0| 8587860| Uster, Strick|\n", - "| 8588053|104.TA.26-811-j19...| 23:50:00| 23:50:00| 6| 0| 0| 8588053| Uster, Haberweid|\n", - "| 8503152|127.TA.26-811-j19...| 13:51:00| 13:51:00| 7| 0| 0| 8503152| Uster, Brandschenke|\n", - "| 8573504|150.TA.26-811-j19...| 07:45:00| 07:45:00| 1| 0| 0| 8573504| Uster, Bahnhof|\n", - "| 8588055|165.TA.26-811-j19...| 20:24:00| 20:24:00| 10| 0| 0| 8588055|Uster, Oberlandst...|\n", - "| 8591857|180.TA.26-811-j19...| 11:52:00| 11:52:00| 8| 0| 0| 8591857| Uster, Loren-Allee|\n", - "| 8503152|184.TA.26-811-j19...| 11:51:00| 11:51:00| 7| 0| 0| 8503152| Uster, Brandschenke|\n", - "| 8588058|2.TA.26-812-j19-1...| 24:23:00| 24:23:00| 10| 1| 0| 8588058| Uster, Wageren|\n", - "| 8588056|6.TA.26-812-j19-1...| 17:52:00| 17:52:00| 9| 0| 0| 8588056| Uster, Talweg|\n", - "| 8588059|44.TA.26-812-j19-...| 18:19:00| 18:19:00| 6| 0| 0| 8588059| Uster, Weidli|\n", - "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+\n", + "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+-------------------+----------------+----------------+\n", + "| stop_id| trip_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon|\n", + "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+-------------------+----------------+----------------+\n", + "|8503202:0:5|61.TA.25-75-j19-1...| 15:12:00| 15:14:00| 5| 0| 0| 8503202| Thalwil|47.2962171893553|8.56475351565593|\n", + "|8503202:0:5|99.TA.25-75-j19-1...| 19:14:00| 19:15:00| 5| 0| 0| 8503202| Thalwil|47.2962171893553|8.56475351565593|\n", + "|8503202:0:5|137.TA.25-75-j19-...| 23:12:00| 23:14:00| 5| 0| 0| 8503202| Thalwil|47.2962171893553|8.56475351565593|\n", + "|8503000:0:6|287.TA.25-75-j19-...| 19:35:00| 19:35:00| 1| 0| 0| 8503000| Zürich HB|47.3786628415821|8.54019357578468|\n", + "|8503000:0:7|337.TA.25-75-j19-...| 22:35:00| 22:35:00| 1| 0| 0| 8503000| Zürich HB|47.3787236709708|8.54019357578468|\n", + "| 8587860|8.TA.26-811-j19-1...| 23:38:00| 23:38:00| 9| 0| 0| 8587860| Uster, Strick|47.3564493415083|8.71275994188806|\n", + "| 8588052|35.TA.26-811-j19-...| 06:48:00| 06:48:00| 4| 0| 0| 8588052| Uster, Gschwader|47.3582688760385|8.71277790819375|\n", + "| 8588052|38.TA.26-811-j19-...| 18:33:00| 18:33:00| 4| 0| 0| 8588052| Uster, Gschwader|47.3582688760385|8.71277790819375|\n", + "| 8573504|42.TA.26-811-j19-...| 06:30:00| 06:30:00| 1| 0| 0| 8573504| Uster, Bahnhof|47.3511851173852|8.71683829327853|\n", + "| 8573504|98.TA.26-811-j19-...| 15:15:00| 15:15:00| 1| 0| 0| 8573504| Uster, Bahnhof|47.3511851173852|8.71683829327853|\n", + "| 8503152|133.TA.26-811-j19...| 17:51:00| 17:51:00| 7| 0| 0| 8503152|Uster, Brandschenke|47.3611410570261|8.71073873249851|\n", + "| 8588050|27.TA.26-812-j19-...| 20:05:00| 20:05:00| 7| 0| 0| 8588050| Uster, Bordacker|47.3519945640447|8.72933385888238|\n", + "| 8588051|35.TA.26-812-j19-...| 09:30:00| 09:30:00| 2| 0| 0| 8588051| Uster, Dammstrasse|47.3534491024058|8.71567946656186|\n", + "| 8588059|61.TA.26-812-j19-...| 06:04:00| 06:04:00| 6| 0| 0| 8588059| Uster, Weidli| 47.353996826126|8.73063641604453|\n", + "| 8503567|66.TA.26-812-j19-...| 06:17:00| 06:17:00| 3| 0| 0| 8503567| Uster, Spital|47.3538507670231|8.72349480953479|\n", + "| 8503567|105.TA.26-812-j19...| 08:32:00| 08:32:00| 3| 0| 0| 8503567| Uster, Spital|47.3538507670231|8.72349480953479|\n", + "| 8588056|116.TA.26-812-j19...| 20:07:00| 20:07:00| 9| 0| 0| 8588056| Uster, Talweg|47.3485132466833|8.73078014649001|\n", + "| 8503872|166.TA.26-812-j19...| 12:18:00| 12:18:00| 4| 0| 0| 8503872| Uster, Reithalle|47.3562972036718|8.72678264347512|\n", + "| 8588056|182.TA.26-812-j19...| 13:37:00| 13:37:00| 9| 0| 0| 8588056| Uster, Talweg|47.3485132466833|8.73078014649001|\n", + "| 8573504|12.TA.26-813-j19-...| 17:57:00| 17:57:00| 8| 0| 0| 8573504| Uster, Bahnhof|47.3511851173852|8.71683829327853|\n", + "+-----------+--------------------+------------+--------------+-------------+-----------+-------------+---------------+-------------------+----------------+----------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times_15km = stop_times.join(stops_15km_for_join, how=\"inner\", on = \"stop_id\").dropDuplicates()\n", "stop_times_15km.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times_15km.write.csv('data/lgpt_guys/stop_times_15km.csv', header=True, mode='overwrite')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3) Keep only services that run each day of the week" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "2322109" ] } ], "source": [ "stop_times_15km = spark.read.csv('data/lgpt_guys/stop_times_15km.csv', header=True)\n", "stop_times_15km.count()" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "calendar = spark.read.csv(\"/data/sbb/timetables/csv/calendar/2019/05/14/calendar.txt\", header=True, sep = \",\")" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "|service_id|monday|tuesday|wednesday|thursday|friday|saturday|sunday|start_date|end_date|\n", "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "| TA+b0nx9| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b03bf| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0008| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxg| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b08k4| 1| 0| 0| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b06hs| 0| 0| 0| 0| 1| 0| 0| 20181209|20191214|\n", "| TA+b09de| 0| 0| 0| 0| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxn| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b05qx| 1| 1| 1| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b0nxa| 0| 0| 0| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b05k1| 1| 0| 0| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b01pq| 0| 0| 0| 0| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxb| 0| 0| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b04l2| 0| 1| 0| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b063g| 1| 0| 0| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b08xi| 1| 0| 0| 0| 0| 0| 0| 20181209|20191214|\n", "| TA+b0nxd| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxe| 0| 0| 0| 0| 0| 1| 1| 20181209|20191214|\n", "| TA+b0nxf| 0| 0| 0| 0| 0| 1| 1| 20181209|20191214|\n", "| TA+b08zi| 0| 0| 0| 0| 0| 0| 1| 20181209|20191214|\n", "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "only showing top 20 rows" ] } ], "source": [ "calendar.show()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "|service_id|monday|tuesday|wednesday|thursday|friday|saturday|sunday|start_date|end_date|\n", "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "| TA+b0nx9| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b03bf| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0008| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxg| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxn| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxd| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxh| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxi| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxl| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0f63| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0f6a| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0ap6| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b03c1| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nke| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b09su| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b00bo| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxc| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxq| 1| 1| 1| 1| 1| 1| 1| 20181209|20191214|\n", "| TA+b0nuo| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "| TA+b0nxv| 1| 1| 1| 1| 1| 0| 0| 20181209|20191214|\n", "+----------+------+-------+---------+--------+------+--------+------+----------+--------+\n", "only showing top 20 rows" ] } ], "source": [ "calendar_business_days = calendar.filter((calendar.monday==1) & \\\n", " (calendar.tuesday==1) & \\\n", " (calendar.wednesday==1) & \\\n", " (calendar.thursday==1) & \\\n", " (calendar.friday==1))\n", "calendar_business_days.show()" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+----------+--------------------+------------------+---------------+------------+\n", "| route_id|service_id| trip_id| trip_headsign|trip_short_name|direction_id|\n", "+-----------+----------+--------------------+------------------+---------------+------------+\n", "|1-1-C-j19-1| TA+b0001|5.TA.1-1-C-j19-1.3.R|Zofingen, Altachen| 108| 1|\n", "|1-1-C-j19-1| TA+b0001|7.TA.1-1-C-j19-1.3.R|Zofingen, Altachen| 112| 1|\n", "|1-1-C-j19-1| TA+b0001|9.TA.1-1-C-j19-1.3.R|Zofingen, Altachen| 116| 1|\n", "|1-1-C-j19-1| TA+b0001|11.TA.1-1-C-j19-1...|Zofingen, Altachen| 120| 1|\n", "|1-1-C-j19-1| TA+b0001|13.TA.1-1-C-j19-1...|Zofingen, Altachen| 124| 1|\n", "|1-1-C-j19-1| TA+b0001|15.TA.1-1-C-j19-1...|Zofingen, Altachen| 128| 1|\n", "|1-1-C-j19-1| TA+b0001|17.TA.1-1-C-j19-1...|Zofingen, Altachen| 132| 1|\n", "|1-1-C-j19-1| TA+b0001|18.TA.1-1-C-j19-1...|Zofingen, Altachen| 134| 1|\n", "|1-1-C-j19-1| TA+b0001|19.TA.1-1-C-j19-1...|Zofingen, Altachen| 136| 1|\n", "|1-1-C-j19-1| TA+b0001|20.TA.1-1-C-j19-1...|Zofingen, Altachen| 138| 1|\n", "|1-1-C-j19-1| TA+b0001|21.TA.1-1-C-j19-1...|Zofingen, Altachen| 140| 1|\n", "|1-1-C-j19-1| TA+b0001|22.TA.1-1-C-j19-1...|Zofingen, Altachen| 142| 1|\n", "|1-1-C-j19-1| TA+b0001|23.TA.1-1-C-j19-1...|Zofingen, Altachen| 144| 1|\n", "|1-1-C-j19-1| TA+b0001|24.TA.1-1-C-j19-1...|Zofingen, Altachen| 146| 1|\n", "|1-1-C-j19-1| TA+b0001|25.TA.1-1-C-j19-1...|Zofingen, Altachen| 148| 1|\n", "|1-1-C-j19-1| TA+b0001|26.TA.1-1-C-j19-1...|Zofingen, Altachen| 150| 1|\n", "|1-1-C-j19-1| TA+b0001|27.TA.1-1-C-j19-1...|Zofingen, Altachen| 152| 1|\n", "|1-1-C-j19-1| TA+b0001|30.TA.1-1-C-j19-1...|Zofingen, Altachen| 156| 1|\n", "|1-1-C-j19-1| TA+b0001|37.TA.1-1-C-j19-1...|Zofingen, Altachen| 168| 1|\n", "|1-1-C-j19-1| TA+b0001|38.TA.1-1-C-j19-1...|Zofingen, Altachen| 172| 1|\n", "+-----------+----------+--------------------+------------------+---------------+------------+\n", "only showing top 20 rows" ] } ], "source": [ "trips = spark.read.csv(\"/data/sbb/timetables/csv/trips/2019/05/14/trips.txt\", header=True, sep = \",\")\n", "trips.show()" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1017413" ] } ], "source": [ "trips.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Is there any useful information contained in `start_date` and `end_date` ?" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+----------+--------+\n", "|start_date|end_date|\n", "+----------+--------+\n", "| 20181209|20191214|\n", "+----------+--------+" ] } ], "source": [ "calendar_business_days.select(calendar_business_days.start_date, calendar_business_days.end_date).dropDuplicates().show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`start_date` and `end_date` will not provide us with useful information as their values are the same for all services." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+----------+\n", "|service_id|\n", "+----------+\n", "| TA+b0nx9|\n", "| TA+b03bf|\n", "| TA+b0008|\n", "| TA+b0nxg|\n", "| TA+b0nxn|\n", "| TA+b0nxd|\n", "| TA+b0nxh|\n", "| TA+b0nxi|\n", "| TA+b0nxl|\n", "| TA+b0f63|\n", "| TA+b0f6a|\n", "| TA+b0ap6|\n", "| TA+b03c1|\n", "| TA+b0nke|\n", "| TA+b09su|\n", "| TA+b00bo|\n", "| TA+b0nxc|\n", "| TA+b0nxq|\n", "| TA+b0nuo|\n", "| TA+b0nxv|\n", "+----------+\n", "only showing top 20 rows" ] } ], "source": [ "calendar_business_days_for_join = calendar_business_days.select(calendar_business_days.service_id) \n", "calendar_business_days_for_join.show()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+----------+--------------+--------------------+--------------------+---------------+------------+\n", - "|service_id| route_id| trip_id| trip_headsign|trip_short_name|direction_id|\n", - "+----------+--------------+--------------------+--------------------+---------------+------------+\n", - "| TA+b0b6f| 61-14-Y-j19-1|70.TA.61-14-Y-j19...| Betten Dorf| 6060| 0|\n", - "| TA+b0b8s| 26-40-j19-1|655.TA.26-40-j19-...|Zürich, Bucheggplatz| 4329| 0|\n", - "| TA+b0b90| 4-108-j19-1|185.TA.4-108-j19-...| Sissach, Bahnhof| 28008| 1|\n", - "| TA+b0ba6| 24-571-j19-1|25.TA.24-571-j19-...| Zermatt, Spiss| 71142| 0|\n", - "| TA+b0bkz| 25-1-A-j19-1|192.TA.25-1-A-j19...| Zug, Bahnhofplatz| 1517| 1|\n", - "| TA+b0bpj| 24-142-j19-1|7.TA.24-142-j19-1...| Lax, Bahnhof| 525| 1|\n", - "| TA+b0bpj| 24-142-j19-1|73.TA.24-142-j19-...| Lax, Bahnhof| 767| 1|\n", - "| TA+b0bq1|61-382-Y-j19-1|67.TA.61-382-Y-j1...| Pfingstegg| 201| 0|\n", - "| TA+b0bq4|61-527-Y-j19-1|321.TA.61-527-Y-j...| Pros da Darlux| 1| 0|\n", - "| TA+b0bq4|61-528-Y-j19-1|41.TA.61-528-Y-j1...|Bergün/Bravuogn SBAD| 51| 0|\n", - "| TA+b0bq4|61-528-Y-j19-1|293.TA.61-528-Y-j...|Bergün/Bravuogn SBAD| 51| 0|\n", - "| TA+b0bq4|61-529-Y-j19-1|188.TA.61-529-Y-j...| Alp Darlux| 201| 0|\n", - "| TA+b0bq4|61-558-Y-j19-1|40.TA.61-558-Y-j1...| Pros da Darlux| 251| 0|\n", - "| TA+b0bq4|61-558-Y-j19-1|151.TA.61-558-Y-j...| Pros da Darlux| 251| 0|\n", - "| TA+b0bq4|61-558-Y-j19-1|365.TA.61-558-Y-j...| Pros da Darlux| 251| 0|\n", - "| TA+b0bq9| 61-46-Y-j19-1|34.TA.61-46-Y-j19...| Mittelallalin| 5101| 0|\n", - "| TA+b0bq9| 61-46-Y-j19-1|141.TA.61-46-Y-j1...| Mittelallalin| 5101| 0|\n", - "| TA+b0bq9| 61-47-Y-j19-1|686.TA.61-47-Y-j1...|Saas-Fee (Alpin E...| 3002| 0|\n", - "| TA+b0bq9|61-575-Y-j19-1|596.TA.61-575-Y-j...| Felskinn| 3001| 0|\n", - "| TA+b0bq9|61-575-Y-j19-1|676.TA.61-575-Y-j...| Felskinn| 3001| 0|\n", - "+----------+--------------+--------------------+--------------------+---------------+------------+\n", + "+----------+------------+--------------------+--------------------+---------------+------------+\n", + "|service_id| route_id| trip_id| trip_headsign|trip_short_name|direction_id|\n", + "+----------+------------+--------------------+--------------------+---------------+------------+\n", + "| TA+b0001| 1-1-C-j19-1|46.TA.1-1-C-j19-1...|Aarburg-Oftringen...| 113| 0|\n", + "| TA+b0001| 1-1-C-j19-1|59.TA.1-1-C-j19-1...|Aarburg-Oftringen...| 139| 0|\n", + "| TA+b0001| 1-340-j19-1|2.TA.1-340-j19-1.1.H| Wohlen AG, Bahnhof| 105| 0|\n", + "| TA+b0001| 1-354-j19-1|36.TA.1-354-j19-1...|Kaiserstuhl AG, B...| 35435| 0|\n", + "| TA+b0001| 1-354-j19-1|47.TA.1-354-j19-1...|Kaiserstuhl AG, B...| 35467| 0|\n", + "| TA+b0001| 1-393-j19-1|70.TA.1-393-j19-1...|Othmarsingen, Bah...| 14060| 0|\n", + "| TA+b0001| 1-508-j19-1|87.TA.1-508-j19-1...|Aarburg-Oftringen...| 8178| 1|\n", + "| TA+b0001| 2-230-j19-1|28.TA.2-230-j19-1...| Trogen, Bahnhof| 23023| 0|\n", + "| TA+b0001| 3-193-j19-1|221.TA.3-193-j19-...| Appenzell, Bahnhof| 1040| 1|\n", + "| TA+b0001| 4-76-j19-1|54.TA.4-76-j19-1.2.H| Lausen, Furlen| 76049| 0|\n", + "| TA+b0001| 6-101-j19-1|645.TA.6-101-j19-...| Beatenberg, Station| 10103| 0|\n", + "| TA+b0001|6-11-A-j19-1|188.TA.6-11-A-j19...| Bern, Holligen| 11596| 1|\n", + "| TA+b0001|6-11-B-j19-1|123.TA.6-11-B-j19...|Biel/Bienne, Bahn...| 11045| 1|\n", + "| TA+b0001| 6-151-j19-1|54.TA.6-151-j19-1...| Brienz BE, Bahnhof| 236| 1|\n", + "| TA+b0001| 6-21-j19-1|106.TA.6-21-j19-1...| Thun, Bahnhof| 21199| 1|\n", + "| TA+b0001| 6-210-j19-1|23.TA.6-210-j19-1...| Frutigen, Bahnhof| 21025| 0|\n", + "| TA+b0001| 6-27-j19-1|195.TA.6-27-j19-1...|Bern, Weyermannsh...| 17667| 1|\n", + "| TA+b0001| 6-871-j19-1|43.TA.6-871-j19-1...| Waltwil| 71031| 0|\n", + "| TA+b0001| 6-9-B-j19-1|28.TA.6-9-B-j19-1...| Bern| 9110| 1|\n", + "| TA+b0001| 6-9-B-j19-1|43.TA.6-9-B-j19-1...| Bern| 9146| 1|\n", + "+----------+------------+--------------------+--------------------+---------------+------------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_business_week = trips.join(calendar_business_days_for_join, how=\"inner\", on = \"service_id\").dropDuplicates()\n", "trips_business_week.show()" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "528368" ] } ], "source": [ "trips_business_week.count()" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------+--------------------+--------------------+---------------+------------+\n", - "| route_id| trip_id| trip_headsign|trip_short_name|direction_id|\n", - "+--------------+--------------------+--------------------+---------------+------------+\n", - "| 61-14-Y-j19-1|70.TA.61-14-Y-j19...| Betten Dorf| 6060| 0|\n", - "| 26-40-j19-1|655.TA.26-40-j19-...|Zürich, Bucheggplatz| 4329| 0|\n", - "| 4-108-j19-1|185.TA.4-108-j19-...| Sissach, Bahnhof| 28008| 1|\n", - "| 24-571-j19-1|25.TA.24-571-j19-...| Zermatt, Spiss| 71142| 0|\n", - "| 25-1-A-j19-1|192.TA.25-1-A-j19...| Zug, Bahnhofplatz| 1517| 1|\n", - "| 24-142-j19-1|7.TA.24-142-j19-1...| Lax, Bahnhof| 525| 1|\n", - "| 24-142-j19-1|73.TA.24-142-j19-...| Lax, Bahnhof| 767| 1|\n", - "|61-382-Y-j19-1|67.TA.61-382-Y-j1...| Pfingstegg| 201| 0|\n", - "|61-527-Y-j19-1|321.TA.61-527-Y-j...| Pros da Darlux| 1| 0|\n", - "|61-528-Y-j19-1|41.TA.61-528-Y-j1...|Bergün/Bravuogn SBAD| 51| 0|\n", - "|61-528-Y-j19-1|293.TA.61-528-Y-j...|Bergün/Bravuogn SBAD| 51| 0|\n", - "|61-529-Y-j19-1|188.TA.61-529-Y-j...| Alp Darlux| 201| 0|\n", - "|61-558-Y-j19-1|40.TA.61-558-Y-j1...| Pros da Darlux| 251| 0|\n", - "|61-558-Y-j19-1|151.TA.61-558-Y-j...| Pros da Darlux| 251| 0|\n", - "|61-558-Y-j19-1|365.TA.61-558-Y-j...| Pros da Darlux| 251| 0|\n", - "| 61-46-Y-j19-1|34.TA.61-46-Y-j19...| Mittelallalin| 5101| 0|\n", - "| 61-46-Y-j19-1|141.TA.61-46-Y-j1...| Mittelallalin| 5101| 0|\n", - "| 61-47-Y-j19-1|686.TA.61-47-Y-j1...|Saas-Fee (Alpin E...| 3002| 0|\n", - "|61-575-Y-j19-1|596.TA.61-575-Y-j...| Felskinn| 3001| 0|\n", - "|61-575-Y-j19-1|676.TA.61-575-Y-j...| Felskinn| 3001| 0|\n", - "+--------------+--------------------+--------------------+---------------+------------+\n", + "+------------+--------------------+--------------------+---------------+------------+\n", + "| route_id| trip_id| trip_headsign|trip_short_name|direction_id|\n", + "+------------+--------------------+--------------------+---------------+------------+\n", + "| 1-1-C-j19-1|46.TA.1-1-C-j19-1...|Aarburg-Oftringen...| 113| 0|\n", + "| 1-1-C-j19-1|59.TA.1-1-C-j19-1...|Aarburg-Oftringen...| 139| 0|\n", + "| 1-340-j19-1|2.TA.1-340-j19-1.1.H| Wohlen AG, Bahnhof| 105| 0|\n", + "| 1-354-j19-1|36.TA.1-354-j19-1...|Kaiserstuhl AG, B...| 35435| 0|\n", + "| 1-354-j19-1|47.TA.1-354-j19-1...|Kaiserstuhl AG, B...| 35467| 0|\n", + "| 1-393-j19-1|70.TA.1-393-j19-1...|Othmarsingen, Bah...| 14060| 0|\n", + "| 1-508-j19-1|87.TA.1-508-j19-1...|Aarburg-Oftringen...| 8178| 1|\n", + "| 2-230-j19-1|28.TA.2-230-j19-1...| Trogen, Bahnhof| 23023| 0|\n", + "| 3-193-j19-1|221.TA.3-193-j19-...| Appenzell, Bahnhof| 1040| 1|\n", + "| 4-76-j19-1|54.TA.4-76-j19-1.2.H| Lausen, Furlen| 76049| 0|\n", + "| 6-101-j19-1|645.TA.6-101-j19-...| Beatenberg, Station| 10103| 0|\n", + "|6-11-A-j19-1|188.TA.6-11-A-j19...| Bern, Holligen| 11596| 1|\n", + "|6-11-B-j19-1|123.TA.6-11-B-j19...|Biel/Bienne, Bahn...| 11045| 1|\n", + "| 6-151-j19-1|54.TA.6-151-j19-1...| Brienz BE, Bahnhof| 236| 1|\n", + "| 6-21-j19-1|106.TA.6-21-j19-1...| Thun, Bahnhof| 21199| 1|\n", + "| 6-210-j19-1|23.TA.6-210-j19-1...| Frutigen, Bahnhof| 21025| 0|\n", + "| 6-27-j19-1|195.TA.6-27-j19-1...|Bern, Weyermannsh...| 17667| 1|\n", + "| 6-871-j19-1|43.TA.6-871-j19-1...| Waltwil| 71031| 0|\n", + "| 6-9-B-j19-1|28.TA.6-9-B-j19-1...| Bern| 9110| 1|\n", + "| 6-9-B-j19-1|43.TA.6-9-B-j19-1...| Bern| 9146| 1|\n", + "+------------+--------------------+--------------------+---------------+------------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_business_week_for_join = trips_business_week.drop('service_id')\n", "trips_business_week_for_join.show()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+------------+--------------------+---------------+------------+\n", - "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+------------+--------------------+---------------+------------+\n", - "|1005.TA.26-131-j1...| 8573555| 16:19:00| 16:19:00| 5| 0| 0| 8573555| Horgen, Bergli|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...|8503855:0:F| 16:14:00| 16:14:00| 1| 0| 0| 8503855| Horgen, Bahnhof|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...| 8588984| 16:21:00| 16:21:00| 7| 0| 0| 8588984| Horgen, Gehren|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...| 8573554| 16:18:00| 16:18:00| 4| 0| 0| 8573554|Horgen Oberdorf, ...|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...| 8588985| 16:20:00| 16:20:00| 6| 0| 0| 8588985| Horgen, Heubach|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...| 8573553| 16:16:00| 16:16:00| 3| 0| 0| 8573553| Horgen, Stocker|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|1005.TA.26-131-j1...| 8589111| 16:15:00| 16:15:00| 2| 0| 0| 8589111|Horgen, Gumelenst...|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", - "|103.TA.26-925-j19...| 8576082| 07:38:00| 07:38:00| 20| 0| 0| 8576082| Meilen, Beugen|26-925-j19-1| Meilen, Bahnhof| 571| 0|\n", - "|103.TA.26-925-j19...| 8576080| 07:42:00| 07:42:00| 21| 0| 0| 8576080| Meilen, Bahnhof|26-925-j19-1| Meilen, Bahnhof| 571| 0|\n", - "|104.TA.26-733-j19...| 8587420| 07:40:00| 07:40:00| 6| 0| 0| 8587420| Kloten, Bahnhof|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8588553| 07:34:00| 07:34:00| 3| 0| 0| 8588553|Zürich Flughafen,...|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8580301| 07:33:00| 07:33:00| 2| 0| 0| 8580301|Zürich Flughafen,...|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...|8573205:0:D| 07:33:00| 07:33:00| 1| 0| 0| 8573205|Zürich Flughafen,...|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8580434| 07:41:00| 07:41:00| 7| 0| 0| 8580434|Kloten, Lindenstr...|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8573211| 07:36:00| 07:36:00| 4| 0| 0| 8573211|Kloten, Zum Wilde...|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8580433| 07:44:00| 07:44:00| 9| 0| 0| 8580433| Kloten, Graswinkel|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8590699| 07:37:00| 07:37:00| 5| 0| 0| 8590699| Kloten, Stadthaus|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|104.TA.26-733-j19...| 8576153| 07:42:00| 07:42:00| 8| 0| 0| 8576153| Kloten, Rankstrasse|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", - "|1087.TA.26-5-B-j1...| 8591239| 15:57:00| 15:57:00| 10| 0| 0| 8591239| Zürich, Kunsthaus|26-5-B-j19-1|Zürich, Kirche Fl...| 3194| 1|\n", - "|1087.TA.26-5-B-j1...| 8591303| 16:00:00| 16:00:00| 12| 0| 0| 8591303| Zürich, Platte|26-5-B-j19-1|Zürich, Kirche Fl...| 3194| 1|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+------------+--------------------+---------------+------------+\n", + "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+------------+--------------------+---------------+------------+\n", + "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|\n", + "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+------------+--------------------+---------------+------------+\n", + "|1005.TA.26-131-j1...| 8589111| 16:15:00| 16:15:00| 2| 0| 0| 8589111|Horgen, Gumelenst...| 47.260856991692|8.59230484542371|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...| 8588984| 16:21:00| 16:21:00| 7| 0| 0| 8588984| Horgen, Gehren| 47.252107761586|8.60141376240595|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...| 8588985| 16:20:00| 16:20:00| 6| 0| 0| 8588985| Horgen, Heubach| 47.254772314364|8.59791931595024|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...| 8573554| 16:18:00| 16:18:00| 4| 0| 0| 8573554|Horgen Oberdorf, ...|47.2586804890449|8.59024770342279|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...| 8573553| 16:16:00| 16:16:00| 3| 0| 0| 8573553| Horgen, Stocker|47.2615154118397|8.58892717995495|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...| 8573555| 16:19:00| 16:19:00| 5| 0| 0| 8573555| Horgen, Bergli|47.2576623184348| 8.5932121438608|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|1005.TA.26-131-j1...|8503855:0:F| 16:14:00| 16:14:00| 1| 0| 0| 8503855| Horgen, Bahnhof|47.2618568116556|8.59697608490178|26-131-j19-1| Horgen, Aamüli| 636| 0|\n", + "|103.TA.26-925-j19...| 8576080| 07:42:00| 07:42:00| 21| 0| 0| 8576080| Meilen, Bahnhof|47.2694401970586|8.64488323901054|26-925-j19-1| Meilen, Bahnhof| 571| 0|\n", + "|103.TA.26-925-j19...| 8576082| 07:38:00| 07:38:00| 20| 0| 0| 8576082| Meilen, Beugen|47.2672701430669|8.65071330520529|26-925-j19-1| Meilen, Bahnhof| 571| 0|\n", + "|104.TA.26-733-j19...| 8587420| 07:40:00| 07:40:00| 6| 0| 0| 8587420| Kloten, Bahnhof| 47.448965141581|8.58388763121034|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8573211| 07:36:00| 07:36:00| 4| 0| 0| 8573211|Kloten, Zum Wilde...| 47.453545361717|8.58019555539209|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8588553| 07:34:00| 07:34:00| 3| 0| 0| 8588553|Zürich Flughafen,...|47.4524944976638|8.57205681891684|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...|8573205:0:D| 07:33:00| 07:33:00| 1| 0| 0| 8573205|Zürich Flughafen,...|47.4506842895344|8.56372943623189|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8580433| 07:44:00| 07:44:00| 9| 0| 0| 8580433| Kloten, Graswinkel|47.4509394233112|8.59648201149545|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8580434| 07:41:00| 07:41:00| 7| 0| 0| 8580434|Kloten, Lindenstr...|47.4522454458795|8.58714851569215|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8590699| 07:37:00| 07:37:00| 5| 0| 0| 8590699| Kloten, Stadthaus| 47.450745035784|8.58126455058034|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8580301| 07:33:00| 07:33:00| 2| 0| 0| 8580301|Zürich Flughafen,...|47.4526524323306|8.56566081409302|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|104.TA.26-733-j19...| 8576153| 07:42:00| 07:42:00| 8| 0| 0| 8576153| Kloten, Rankstrasse|47.4511884812805|8.59205331714412|26-733-j19-1| Kloten, Graswinkel| 4723| 1|\n", + "|1087.TA.26-5-B-j1...| 8591058| 15:49:00| 15:49:00| 6| 0| 0| 8591058|Zürich Enge, Bahnhof|47.3641286895461|8.53156974905593|26-5-B-j19-1|Zürich, Kirche Fl...| 3194| 1|\n", + "|1087.TA.26-5-B-j1...| 8591317| 15:51:00| 15:51:00| 7| 0| 0| 8591317|Zürich, Rentenans...|47.3633863608069|8.53503724605312|26-5-B-j19-1|Zürich, Kirche Fl...| 3194| 1|\n", + "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+------------+--------------------+---------------+------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times_15km_business_week = stop_times_15km.join(trips_business_week_for_join, how=\"inner\", on = \"trip_id\").dropDuplicates()\n", "stop_times_15km_business_week.show()" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times_15km_business_week.write.csv('data/lgpt_guys/stop_times_15km_business_week.csv', header=True, mode='overwrite')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4) Keeping only departure times between a certain time of the day (7am, 8pm)" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+\n", - "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+\n", - "|1.TA.26-925-j19-1...| 8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen| 26-925-j19-1| Meilen, Bahnhof| 280| 0|\n", - "|1.TA.26-925-j19-1...| 8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof| 26-925-j19-1| Meilen, Bahnhof| 280| 0|\n", - "|1014.TA.26-70-A-j...| 8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|1014.TA.26-70-A-j...| 8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", - "|102.TA.26-765-j19...| 8576154| 19:21:00| 19:21:00| 14| 0| 0| 8576154| Kloten, Oberfeld| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", - "|102.TA.26-765-j19...| 8576158| 19:17:00| 19:17:00| 10| 0| 0| 8576158|Bassersdorf, Talg...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", - "|102.TA.26-765-j19...| 8576152| 19:24:00| 19:24:00| 16| 0| 0| 8576152| Kloten, Kirchgasse| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", - "|102.TA.26-765-j19...|8573205:0:F| 19:29:00| 19:29:00| 20| 0| 0| 8573205|Zürich Flughafen,...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", - "|102.TA.26-765-j19...| 8588316| 19:11:00| 19:11:00| 6| 0| 0| 8588316|Bassersdorf, Diet...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+\n", + "|1.TA.26-925-j19-1...|8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof|47.2694401970586|8.64488323901054| 26-925-j19-1| Meilen, Bahnhof| 280| 0|\n", + "|1.TA.26-925-j19-1...|8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen|47.2672701430669|8.65071330520529| 26-925-j19-1| Meilen, Bahnhof| 280| 0|\n", + "|1014.TA.26-70-A-j...|8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|47.3444717091534|8.53296213774651|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|47.3231389520848|8.51428616298707|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|47.3414099167461|8.53031210765799|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|47.3303482449491|8.51537312448101|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|47.3408255385719|8.52538035674749|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|47.3264149182794|8.51466345540645|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|47.3351336003511|8.51914604867483|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|47.3282354882425|8.51269614493396|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|47.3470342259279| 8.5329172219823|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|47.3332523864039|8.51859807635144|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|47.3476976601166|8.53331248070737|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|47.3439482343686|8.53014142775399|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|1014.TA.26-70-A-j...|8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|47.3369660452942|8.52034979115572|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0|\n", + "|102.TA.26-765-j19...|8573211| 19:26:00| 19:26:00| 17| 0| 0| 8573211|Kloten, Zum Wilde...| 47.453545361717|8.58019555539209| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", + "|102.TA.26-765-j19...|8503700| 19:12:00| 19:13:00| 7| 0| 0| 8503700|Bassersdorf, Bahnhof|47.4387159099396|8.62613539902836| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", + "|102.TA.26-765-j19...|8590539| 19:03:00| 19:03:00| 1| 0| 0| 8590539|Dietlikon, Bahnho...|47.4219616816404|8.62080838939279| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", + "|102.TA.26-765-j19...|8576153| 19:23:00| 19:23:00| 15| 0| 0| 8576153| Kloten, Rankstrasse|47.4511884812805|8.59205331714412| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", + "|102.TA.26-765-j19...|8590503| 19:16:00| 19:16:00| 9| 0| 0| 8590503|Bassersdorf, Chlu...|47.4446275362315|8.62462622935083| 26-765-j19-1|Zürich Flughafen,...| 1648| 1|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times_15km_business_week = spark.read.csv('data/lgpt_guys/stop_times_15km_business_week.csv', header=True)\n", "stop_times_15km_business_week.show()" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "398630" ] } ], "source": [ "stop_times_15km_business_week.count()" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "|1.TA.26-925-j19-1...| 8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1.TA.26-925-j19-1...| 8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1014.TA.26-70-A-j...| 8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|102.TA.26-765-j19...| 8576154| 19:21:00| 19:21:00| 14| 0| 0| 8576154| Kloten, Oberfeld| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576158| 19:17:00| 19:17:00| 10| 0| 0| 8576158|Bassersdorf, Talg...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576152| 19:24:00| 19:24:00| 16| 0| 0| 8576152| Kloten, Kirchgasse| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...|8573205:0:F| 19:29:00| 19:29:00| 20| 0| 0| 8573205|Zürich Flughafen,...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8588316| 19:11:00| 19:11:00| 6| 0| 0| 8588316|Bassersdorf, Diet...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "|1.TA.26-925-j19-1...|8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof|47.2694401970586|8.64488323901054| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1.TA.26-925-j19-1...|8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen|47.2672701430669|8.65071330520529| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1014.TA.26-70-A-j...|8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|47.3444717091534|8.53296213774651|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|47.3231389520848|8.51428616298707|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|47.3414099167461|8.53031210765799|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|47.3303482449491|8.51537312448101|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|47.3408255385719|8.52538035674749|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|47.3264149182794|8.51466345540645|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|47.3351336003511|8.51914604867483|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|47.3282354882425|8.51269614493396|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|47.3470342259279| 8.5329172219823|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|47.3332523864039|8.51859807635144|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|47.3476976601166|8.53331248070737|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|47.3439482343686|8.53014142775399|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|47.3369660452942|8.52034979115572|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|102.TA.26-765-j19...|8573211| 19:26:00| 19:26:00| 17| 0| 0| 8573211|Kloten, Zum Wilde...| 47.453545361717|8.58019555539209| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8503700| 19:12:00| 19:13:00| 7| 0| 0| 8503700|Bassersdorf, Bahnhof|47.4387159099396|8.62613539902836| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590539| 19:03:00| 19:03:00| 1| 0| 0| 8590539|Dietlikon, Bahnho...|47.4219616816404|8.62080838939279| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8576153| 19:23:00| 19:23:00| 15| 0| 0| 8576153| Kloten, Rankstrasse|47.4511884812805|8.59205331714412| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590503| 19:16:00| 19:16:00| 9| 0| 0| 8590503|Bassersdorf, Chlu...|47.4446275362315|8.62462622935083| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times_15km_business_week = stop_times_15km_business_week.withColumn(\"departure_hour\", stop_times_15km_business_week.departure_time.substr(0, 2).cast('int'))\n", "stop_times_15km_business_week.show()" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "|1.TA.26-925-j19-1...| 8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1.TA.26-925-j19-1...| 8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1014.TA.26-70-A-j...| 8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|102.TA.26-765-j19...| 8576154| 19:21:00| 19:21:00| 14| 0| 0| 8576154| Kloten, Oberfeld| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576158| 19:17:00| 19:17:00| 10| 0| 0| 8576158|Bassersdorf, Talg...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576152| 19:24:00| 19:24:00| 16| 0| 0| 8576152| Kloten, Kirchgasse| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...|8573205:0:F| 19:29:00| 19:29:00| 20| 0| 0| 8573205|Zürich Flughafen,...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8588316| 19:11:00| 19:11:00| 6| 0| 0| 8588316|Bassersdorf, Diet...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "|1.TA.26-925-j19-1...|8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof|47.2694401970586|8.64488323901054| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1.TA.26-925-j19-1...|8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen|47.2672701430669|8.65071330520529| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1014.TA.26-70-A-j...|8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|47.3444717091534|8.53296213774651|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|47.3231389520848|8.51428616298707|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|47.3414099167461|8.53031210765799|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|47.3303482449491|8.51537312448101|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|47.3408255385719|8.52538035674749|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|47.3264149182794|8.51466345540645|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|47.3351336003511|8.51914604867483|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|47.3282354882425|8.51269614493396|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|47.3470342259279| 8.5329172219823|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|47.3332523864039|8.51859807635144|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|47.3476976601166|8.53331248070737|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|47.3439482343686|8.53014142775399|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|47.3369660452942|8.52034979115572|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|102.TA.26-765-j19...|8573211| 19:26:00| 19:26:00| 17| 0| 0| 8573211|Kloten, Zum Wilde...| 47.453545361717|8.58019555539209| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8503700| 19:12:00| 19:13:00| 7| 0| 0| 8503700|Bassersdorf, Bahnhof|47.4387159099396|8.62613539902836| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590539| 19:03:00| 19:03:00| 1| 0| 0| 8590539|Dietlikon, Bahnho...|47.4219616816404|8.62080838939279| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8576153| 19:23:00| 19:23:00| 15| 0| 0| 8576153| Kloten, Rankstrasse|47.4511884812805|8.59205331714412| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590503| 19:16:00| 19:16:00| 9| 0| 0| 8590503|Bassersdorf, Chlu...|47.4446275362315|8.62462622935083| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "departure_earliest = 7\n", "departure_latest = 19\n", "stop_times_15km_business_week_standard_hours = stop_times_15km_business_week.filter((stop_times_15km_business_week.departure_hour>=departure_earliest) & \\\n", " (stop_times_15km_business_week.departure_hour<= departure_latest))\n", "stop_times_15km_business_week_standard_hours.show()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# intermediate saving point\n", "stop_times_15km_business_week_standard_hours.write.csv('data/lgpt_guys/stop_times_15km_business_week_standard_hours.csv', header = True, mode=\"overwrite\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5) Order stop_times as to reconstruct routes for RAPTOR" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building a list of unique trips according to 1) the stop sequence and 2) the departure time sequence" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "304085" ] } ], "source": [ "# we start fresh from here, where stop_times is in fact stop_times_15km_business_week_standard_hours loaded from the server\n", "stop_times = spark.read.csv('data/lgpt_guys/stop_times_15km_business_week_standard_hours.csv', header = True)\n", "stop_times.count()" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "| trip_id| stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", - "|1.TA.26-925-j19-1...| 8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1.TA.26-925-j19-1...| 8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", - "|1014.TA.26-70-A-j...| 8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|1014.TA.26-70-A-j...| 8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", - "|1014.TA.26-70-A-j...| 8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", - "|102.TA.26-765-j19...| 8576154| 19:21:00| 19:21:00| 14| 0| 0| 8576154| Kloten, Oberfeld| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576158| 19:17:00| 19:17:00| 10| 0| 0| 8576158|Bassersdorf, Talg...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8576152| 19:24:00| 19:24:00| 16| 0| 0| 8576152| Kloten, Kirchgasse| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...|8573205:0:F| 19:29:00| 19:29:00| 20| 0| 0| 8573205|Zürich Flughafen,...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "|102.TA.26-765-j19...| 8588316| 19:11:00| 19:11:00| 6| 0| 0| 8588316|Bassersdorf, Diet...| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", - "+--------------------+-----------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", + "|1.TA.26-925-j19-1...|8576080| 15:27:00| 15:27:00| 23| 0| 0| 8576080| Meilen, Bahnhof|47.2694401970586|8.64488323901054| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1.TA.26-925-j19-1...|8576082| 15:22:00| 15:22:00| 22| 0| 0| 8576082| Meilen, Beugen|47.2672701430669|8.65071330520529| 26-925-j19-1| Meilen, Bahnhof| 280| 0| 15|\n", + "|1014.TA.26-70-A-j...|8591304| 11:54:00| 11:54:00| 3| 0| 0| 8591304|Zürich, Post Woll...|47.3444717091534|8.53296213774651|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591278| 12:05:00| 12:05:00| 13| 0| 0| 8591278|Zürich, Mittellei...|47.3231389520848|8.51428616298707|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591106| 11:56:00| 11:56:00| 5| 0| 0| 8591106|Zürich, Butzenstr...|47.3414099167461|8.53031210765799|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591270| 12:02:00| 12:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|47.3303482449491|8.51537312448101|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591410| 11:57:00| 11:57:00| 6| 0| 0| 8591410|Zürich, Verenastr...|47.3408255385719|8.52538035674749|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591370| 12:04:00| 12:04:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|47.3264149182794|8.51466345540645|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591154| 11:59:00| 11:59:00| 8| 0| 0| 8591154|Zürich, Frymannst...|47.3351336003511|8.51914604867483|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591210| 12:03:00| 12:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|47.3282354882425|8.51269614493396|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8591081| 11:53:00| 11:53:00| 2| 0| 0| 8591081|Zürich Wollishofe...|47.3470342259279| 8.5329172219823|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591061| 12:00:00| 12:01:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|47.3332523864039|8.51859807635144|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 12|\n", + "|1014.TA.26-70-A-j...|8502495| 11:51:00| 11:51:00| 1| 0| 0| 8502495|Zürich Wollishofe...|47.3476976601166|8.53331248070737|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591279| 11:55:00| 11:55:00| 4| 0| 0| 8591279| Zürich, Morgental|47.3439482343686|8.53014142775399|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|1014.TA.26-70-A-j...|8591268| 11:58:00| 11:58:00| 7| 0| 0| 8591268| Zürich, Manegg|47.3369660452942|8.52034979115572|26-70-A-j19-1|Zürich, Mittellei...| 3400| 0| 11|\n", + "|102.TA.26-765-j19...|8573211| 19:26:00| 19:26:00| 17| 0| 0| 8573211|Kloten, Zum Wilde...| 47.453545361717|8.58019555539209| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8503700| 19:12:00| 19:13:00| 7| 0| 0| 8503700|Bassersdorf, Bahnhof|47.4387159099396|8.62613539902836| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590539| 19:03:00| 19:03:00| 1| 0| 0| 8590539|Dietlikon, Bahnho...|47.4219616816404|8.62080838939279| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8576153| 19:23:00| 19:23:00| 15| 0| 0| 8576153| Kloten, Rankstrasse|47.4511884812805|8.59205331714412| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "|102.TA.26-765-j19...|8590503| 19:16:00| 19:16:00| 9| 0| 0| 8590503|Bassersdorf, Chlu...|47.4446275362315|8.62462622935083| 26-765-j19-1|Zürich Flughafen,...| 1648| 1| 19|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times.show()" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-----------+--------------------+---------------+------------+--------------+\n", - "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-----------+--------------------+---------------+------------+--------------+\n", - "|1.TA.1-231-j19-1.1.H|8572747| 09:37:00| 09:37:00| 1| 0| 0| 8572747|Bremgarten AG, Ba...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8582462| 09:38:00| 09:38:00| 3| 0| 0| 8582462|Bremgarten AG, Ze...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8572600| 09:39:00| 09:39:00| 4| 0| 0| 8572600| Zufikon, Emaus|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8572601| 09:39:00| 09:39:00| 5| 0| 0| 8572601| Zufikon, Algier|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8502553| 09:43:00| 09:43:00| 6| 0| 0| 8502553|Unterlunkhofen, B...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8572602| 09:45:00| 09:45:00| 7| 0| 0| 8572602|Oberlunkhofen, Ke...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8502955| 09:46:00| 09:47:00| 8| 0| 0| 8502955| Oberlunkhofen, Post|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8573722| 09:48:00| 09:48:00| 9| 0| 0| 8573722|Oberlunkhofen, Ob...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8573721| 09:50:00| 09:50:00| 10| 0| 0| 8573721|Oberlunkhofen, Wa...|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8503598| 09:53:00| 09:53:00| 11| 0| 0| 8503598| Arni AG, Dorf|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8573720| 09:55:00| 09:59:00| 12| 0| 0| 8573720| Arni AG, Stockacker|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", - "|1.TA.1-231-j19-1.1.H|8503598| 10:00:00| 10:00:00| 13| 0| 0| 8503598| Arni AG, Dorf|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8573721| 10:02:00| 10:02:00| 14| 0| 0| 8573721|Oberlunkhofen, Wa...|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8573722| 10:03:00| 10:03:00| 15| 0| 0| 8573722|Oberlunkhofen, Ob...|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8573723| 10:04:00| 10:04:00| 16| 0| 0| 8573723|Oberlunkhofen, Do...|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8583071| 10:05:00| 10:05:00| 17| 0| 0| 8583071| Jonen, Radmühle|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8572603| 10:06:00| 10:06:00| 18| 0| 0| 8572603| Jonen, Käppeli|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "|1.TA.1-231-j19-1.1.H|8502879| 10:07:00| 10:07:00| 19| 0| 0| 8502879| Jonen, Post|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", - "| 1.TA.1-44-j19-1.1.R|8590275| 08:31:00| 08:31:00| 1| 0| 0| 8590275| Spreitenbach, IKEA| 1-44-j19-1|Spreitenbach, Sho...| 2001| 1| 8|\n", - "| 1.TA.1-44-j19-1.1.R|8591891| 08:34:00| 08:34:00| 2| 0| 0| 8591891|Spreitenbach, Alt...| 1-44-j19-1|Spreitenbach, Sho...| 2001| 1| 8|\n", - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-----------+--------------------+---------------+------------+--------------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-----------+--------------------+---------------+------------+--------------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-----------+--------------------+---------------+------------+--------------+\n", + "|1.TA.1-231-j19-1.1.H|8572747| 09:37:00| 09:37:00| 1| 0| 0| 8572747|Bremgarten AG, Ba...|47.3516902622456|8.34617544069354|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8582462| 09:38:00| 09:38:00| 3| 0| 0| 8582462|Bremgarten AG, Ze...|47.3475576701104|8.34819665008309|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8572600| 09:39:00| 09:39:00| 4| 0| 0| 8572600| Zufikon, Emaus| 47.34464822855| 8.3519875405826|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8572601| 09:39:00| 09:39:00| 5| 0| 0| 8572601| Zufikon, Algier|47.3417386266265|8.35463757067112|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8502553| 09:43:00| 09:43:00| 6| 0| 0| 8502553|Unterlunkhofen, B...|47.3221585583935| 8.380473118246|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8572602| 09:45:00| 09:45:00| 7| 0| 0| 8572602|Oberlunkhofen, Ke...|47.3133646488037| 8.3889172819179|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8502955| 09:46:00| 09:47:00| 8| 0| 0| 8502955| Oberlunkhofen, Post|47.3133829202162|8.38868371994399|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8573722| 09:48:00| 09:48:00| 9| 0| 0| 8573722|Oberlunkhofen, Ob...|47.3123840737352|8.39276207133446|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8573721| 09:50:00| 09:50:00| 10| 0| 0| 8573721|Oberlunkhofen, Wa...|47.3134255534873|8.39881671635027|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8503598| 09:53:00| 09:53:00| 11| 0| 0| 8503598| Arni AG, Dorf|47.3183951391194| 8.4197115298618|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8573720| 09:55:00| 09:59:00| 12| 0| 0| 8573720| Arni AG, Stockacker|47.3200332946963|8.42388869593354|1-231-j19-1| Jonen, Post| 23127| 0| 9|\n", + "|1.TA.1-231-j19-1.1.H|8503598| 10:00:00| 10:00:00| 13| 0| 0| 8503598| Arni AG, Dorf|47.3183951391194| 8.4197115298618|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8573721| 10:02:00| 10:02:00| 14| 0| 0| 8573721|Oberlunkhofen, Wa...|47.3134255534873|8.39881671635027|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8573722| 10:03:00| 10:03:00| 15| 0| 0| 8573722|Oberlunkhofen, Ob...|47.3123840737352|8.39276207133446|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8573723| 10:04:00| 10:04:00| 16| 0| 0| 8573723|Oberlunkhofen, Do...|47.3113973897738|8.39072289563923|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8583071| 10:05:00| 10:05:00| 17| 0| 0| 8583071| Jonen, Radmühle|47.3019681473342|8.39299563330837|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8572603| 10:06:00| 10:06:00| 18| 0| 0| 8572603| Jonen, Käppeli|47.2994704564101|8.39385801598124|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "|1.TA.1-231-j19-1.1.H|8502879| 10:07:00| 10:07:00| 19| 0| 0| 8502879| Jonen, Post|47.2961806346557|8.39551091610425|1-231-j19-1| Jonen, Post| 23127| 0| 10|\n", + "| 1.TA.1-44-j19-1.1.R|8590275| 08:31:00| 08:31:00| 1| 0| 0| 8590275| Spreitenbach, IKEA|47.4200714067302| 8.3754784852656| 1-44-j19-1|Spreitenbach, Sho...| 2001| 1| 8|\n", + "| 1.TA.1-44-j19-1.1.R|8591891| 08:34:00| 08:34:00| 2| 0| 0| 8591891|Spreitenbach, Alt...|47.4188375250837|8.36858840703544| 1-44-j19-1|Spreitenbach, Sho...| 2001| 1| 8|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-----------+--------------------+---------------+------------+--------------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times = stop_times.sort(stop_times.trip_id, stop_times.stop_sequence.cast('int'))\n", "stop_times.show()" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyspark.sql.window import Window\n", "w= (\n", " Window.partitionBy(\"trip_id\")\n", " .orderBy(stop_times.stop_sequence.cast('int'))\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This step is a bit technical. We aim at identifying trips that are identical, although they may bear a different `trip_id`. Indeed, we used data from services running every day of a standard business week. But we do not take days of the week into account, only departure and arrival **hours**. Therefore, we must find a way to identify and merge identical trips in terms of stops served and arrival and departure times. \n", "\n", "To do so, we use window functions on each trip to build a stop sequence and a list of departure times. When departure times are identical, arrival times are considered identical." ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-------------------------+---------------+--------------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------+\n", "|trip_id |stop_id_general|departure_time|stop_sequence|departure_hour|all_stops |\n", "+-------------------------+---------------+--------------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------+\n", "|1005.TA.26-131-j19-1.9.H |8503855 |16:14:00 |1 |16 |[8503855] |\n", "|1005.TA.26-131-j19-1.9.H |8589111 |16:15:00 |2 |16 |[8503855, 8589111] |\n", "|1005.TA.26-131-j19-1.9.H |8573553 |16:16:00 |3 |16 |[8503855, 8589111, 8573553] |\n", "|1005.TA.26-131-j19-1.9.H |8573554 |16:18:00 |4 |16 |[8503855, 8589111, 8573553, 8573554] |\n", "|1005.TA.26-131-j19-1.9.H |8573555 |16:19:00 |5 |16 |[8503855, 8589111, 8573553, 8573554, 8573555] |\n", "|1005.TA.26-131-j19-1.9.H |8588985 |16:20:00 |6 |16 |[8503855, 8589111, 8573553, 8573554, 8573555, 8588985] |\n", "|1005.TA.26-131-j19-1.9.H |8588984 |16:21:00 |7 |16 |[8503855, 8589111, 8573553, 8573554, 8573555, 8588985, 8588984] |\n", "|103.TA.26-925-j19-1.4.H |8576082 |07:38:00 |20 |7 |[8576082] |\n", "|103.TA.26-925-j19-1.4.H |8576080 |07:42:00 |21 |7 |[8576082, 8576080] |\n", "|104.TA.26-733-j19-1.2.R |8573205 |07:33:00 |1 |7 |[8573205] |\n", "|104.TA.26-733-j19-1.2.R |8580301 |07:33:00 |2 |7 |[8573205, 8580301] |\n", "|104.TA.26-733-j19-1.2.R |8588553 |07:34:00 |3 |7 |[8573205, 8580301, 8588553] |\n", "|104.TA.26-733-j19-1.2.R |8573211 |07:36:00 |4 |7 |[8573205, 8580301, 8588553, 8573211] |\n", "|104.TA.26-733-j19-1.2.R |8590699 |07:37:00 |5 |7 |[8573205, 8580301, 8588553, 8573211, 8590699] |\n", "|104.TA.26-733-j19-1.2.R |8587420 |07:40:00 |6 |7 |[8573205, 8580301, 8588553, 8573211, 8590699, 8587420] |\n", "|104.TA.26-733-j19-1.2.R |8580434 |07:41:00 |7 |7 |[8573205, 8580301, 8588553, 8573211, 8590699, 8587420, 8580434] |\n", "|104.TA.26-733-j19-1.2.R |8576153 |07:42:00 |8 |7 |[8573205, 8580301, 8588553, 8573211, 8590699, 8587420, 8580434, 8576153] |\n", "|104.TA.26-733-j19-1.2.R |8580433 |07:44:00 |9 |7 |[8573205, 8580301, 8588553, 8573211, 8590699, 8587420, 8580434, 8576153, 8580433] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591245 |15:42:00 |1 |15 |[8591245] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591329 |15:43:00 |2 |15 |[8591245, 8591329] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591366 |15:45:00 |3 |15 |[8591245, 8591329, 8591366] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591415 |15:46:00 |4 |15 |[8591245, 8591329, 8591366, 8591415] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591059 |15:47:00 |5 |15 |[8591245, 8591329, 8591366, 8591415, 8591059] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591058 |15:49:00 |6 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591317 |15:51:00 |7 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591105 |15:53:00 |8 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105] |\n", "|1087.TA.26-5-B-j19-1.23.R|8576193 |15:55:00 |9 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591239 |15:57:00 |10 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591220 |15:58:00 |11 |15 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591303 |16:00:00 |12 |16 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591412 |16:02:00 |13 |16 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303, 8591412] |\n", "|1087.TA.26-5-B-j19-1.23.R|8591230 |16:04:00 |14 |16 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303, 8591412, 8591230]|\n", "|109.TA.1-1-E-j19-1.12.R |8578679 |11:04:00 |1 |11 |[8578679] |\n", "|109.TA.1-1-E-j19-1.12.R |8590314 |11:05:00 |2 |11 |[8578679, 8590314] |\n", "|109.TA.1-1-E-j19-1.12.R |8590317 |11:06:00 |3 |11 |[8578679, 8590314, 8590317] |\n", "|109.TA.79-24-j19-1.1.R |8503500 |16:50:00 |1 |16 |[8503500] |\n", "|109.TA.79-24-j19-1.1.R |8503499 |16:53:00 |2 |16 |[8503500, 8503499] |\n", "|1099.TA.26-142-j19-1.2.R |8590815 |17:31:00 |1 |17 |[8590815] |\n", "|1099.TA.26-142-j19-1.2.R |8590817 |17:32:00 |2 |17 |[8590815, 8590817] |\n", "|1099.TA.26-142-j19-1.2.R |8590812 |17:33:00 |3 |17 |[8590815, 8590817, 8590812] |\n", "|1099.TA.26-142-j19-1.2.R |8590825 |17:35:00 |4 |17 |[8590815, 8590817, 8590812, 8590825] |\n", "|1099.TA.26-142-j19-1.2.R |8590830 |17:36:00 |5 |17 |[8590815, 8590817, 8590812, 8590825, 8590830] |\n", "|1099.TA.26-142-j19-1.2.R |8590818 |17:37:00 |6 |17 |[8590815, 8590817, 8590812, 8590825, 8590830, 8590818] |\n", "|1099.TA.26-142-j19-1.2.R |8573167 |17:40:00 |7 |17 |[8590815, 8590817, 8590812, 8590825, 8590830, 8590818, 8573167] |\n", "|11.TA.1-444-j19-1.1.H |8572747 |18:35:00 |2 |18 |[8572747] |\n", "|11.TA.1-444-j19-1.1.H |8580847 |18:36:00 |3 |18 |[8572747, 8580847] |\n", "|11.TA.1-444-j19-1.1.H |8581346 |18:41:00 |4 |18 |[8572747, 8580847, 8581346] |\n", "|11.TA.1-444-j19-1.1.H |8502894 |18:42:00 |5 |18 |[8572747, 8580847, 8581346, 8502894] |\n", "|11.TA.1-444-j19-1.1.H |8502979 |18:43:00 |6 |18 |[8572747, 8580847, 8581346, 8502894, 8502979] |\n", "|11.TA.1-444-j19-1.1.H |8572596 |18:44:00 |7 |18 |[8572747, 8580847, 8581346, 8502894, 8502979, 8572596] |\n", "|11.TA.1-444-j19-1.1.H |8591365 |18:59:00 |8 |18 |[8572747, 8580847, 8581346, 8502894, 8502979, 8572596, 8591365] |\n", "|11.TA.1-444-j19-1.1.H |8591366 |19:01:00 |9 |19 |[8572747, 8580847, 8581346, 8502894, 8502979, 8572596, 8591365, 8591366] |\n", "|11.TA.1-444-j19-1.1.H |8591059 |19:03:00 |10 |19 |[8572747, 8580847, 8581346, 8502894, 8502979, 8572596, 8591365, 8591366, 8591059] |\n", "|111.TA.79-736-j19-1.5.H |8591031 |18:39:00 |1 |18 |[8591031] |\n", "|111.TA.79-736-j19-1.5.H |8588553 |18:41:00 |2 |18 |[8591031, 8588553] |\n", "|111.TA.79-736-j19-1.5.H |8580301 |18:42:00 |3 |18 |[8591031, 8588553, 8580301] |\n", "|111.TA.79-736-j19-1.5.H |8573205 |18:44:00 |4 |18 |[8591031, 8588553, 8580301, 8573205] |\n", "|111.TA.79-736-j19-1.5.H |8573213 |18:45:00 |5 |18 |[8591031, 8588553, 8580301, 8573205, 8573213] |\n", "|111.TA.79-736-j19-1.5.H |8587799 |18:46:00 |6 |18 |[8591031, 8588553, 8580301, 8573205, 8573213, 8587799] |\n", "|111.TA.79-736-j19-1.5.H |8591032 |18:49:00 |7 |18 |[8591031, 8588553, 8580301, 8573205, 8573213, 8587799, 8591032] |\n", "|111.TA.79-736-j19-1.5.H |8593523 |18:51:00 |8 |18 |[8591031, 8588553, 8580301, 8573205, 8573213, 8587799, 8591032, 8593523] |\n", "|1139.TA.26-156-j19-1.4.R |8573167 |11:57:00 |1 |11 |[8573167] |\n", "|1139.TA.26-156-j19-1.4.R |8590824 |11:58:00 |2 |11 |[8573167, 8590824] |\n", "|1139.TA.26-156-j19-1.4.R |8590822 |11:59:00 |3 |11 |[8573167, 8590824, 8590822] |\n", "|1139.TA.26-156-j19-1.4.R |8590811 |12:00:00 |4 |12 |[8573167, 8590824, 8590822, 8590811] |\n", "|1139.TA.26-156-j19-1.4.R |8590826 |12:01:00 |5 |12 |[8573167, 8590824, 8590822, 8590811, 8590826] |\n", "|1139.TA.26-156-j19-1.4.R |8595406 |12:02:00 |6 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406] |\n", "|1139.TA.26-156-j19-1.4.R |8590828 |12:03:00 |7 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828] |\n", "|1139.TA.26-156-j19-1.4.R |8590780 |12:04:00 |8 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780] |\n", "|1139.TA.26-156-j19-1.4.R |8590779 |12:06:00 |9 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779] |\n", "|1139.TA.26-156-j19-1.4.R |8590775 |12:06:00 |10 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779, 8590775] |\n", "|1139.TA.26-156-j19-1.4.R |8590777 |12:07:00 |11 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779, 8590775, 8590777] |\n", "|1139.TA.26-156-j19-1.4.R |8590482 |12:09:00 |12 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779, 8590775, 8590777, 8590482] |\n", "|1139.TA.26-156-j19-1.4.R |8590464 |12:11:00 |13 |12 |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779, 8590775, 8590777, 8590482, 8590464] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591245 |10:35:00 |1 |10 |[8591245] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591329 |10:36:00 |2 |10 |[8591245, 8591329] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591366 |10:37:00 |3 |10 |[8591245, 8591329, 8591366] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591415 |10:39:00 |4 |10 |[8591245, 8591329, 8591366, 8591415] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591059 |10:40:00 |5 |10 |[8591245, 8591329, 8591366, 8591415, 8591059] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591058 |10:41:00 |6 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591317 |10:43:00 |7 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591105 |10:45:00 |8 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105] |\n", "|1141.TA.26-5-B-j19-1.23.R|8576193 |10:48:00 |9 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591239 |10:50:00 |10 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591220 |10:51:00 |11 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591303 |10:53:00 |12 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591412 |10:55:00 |13 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303, 8591412] |\n", "|1141.TA.26-5-B-j19-1.23.R|8591230 |10:56:00 |14 |10 |[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303, 8591412, 8591230]|\n", "|1158.TA.26-69-j19-1.4.H |8591122 |14:30:00 |1 |14 |[8591122] |\n", "|1158.TA.26-69-j19-1.4.H |8591201 |14:31:00 |2 |14 |[8591122, 8591201] |\n", "|1158.TA.26-69-j19-1.4.H |8591213 |14:32:00 |3 |14 |[8591122, 8591201, 8591213] |\n", "|1158.TA.26-69-j19-1.4.H |8591416 |14:33:00 |4 |14 |[8591122, 8591201, 8591213, 8591416] |\n", "|1158.TA.26-69-j19-1.4.H |8591302 |14:34:00 |5 |14 |[8591122, 8591201, 8591213, 8591416, 8591302] |\n", "|1158.TA.26-69-j19-1.4.H |8591419 |14:35:00 |6 |14 |[8591122, 8591201, 8591213, 8591416, 8591302, 8591419] |\n", "|1158.TA.26-69-j19-1.4.H |8591425 |14:36:00 |7 |14 |[8591122, 8591201, 8591213, 8591416, 8591302, 8591419, 8591425] |\n", "|1158.TA.26-69-j19-1.4.H |8591101 |14:38:00 |8 |14 |[8591122, 8591201, 8591213, 8591416, 8591302, 8591419, 8591425, 8591101] |\n", "|1158.TA.26-69-j19-1.4.H |8591276 |14:41:00 |9 |14 |[8591122, 8591201, 8591213, 8591416, 8591302, 8591419, 8591425, 8591101, 8591276] |\n", "|1164.TA.26-5-B-j19-1.23.R|8591245 |19:58:00 |1 |19 |[8591245] |\n", "|1164.TA.26-5-B-j19-1.23.R|8591329 |19:59:00 |2 |19 |[8591245, 8591329] |\n", "|1186.TA.26-69-j19-1.4.H |8591122 |11:00:00 |1 |11 |[8591122] |\n", "+-------------------------+---------------+--------------+-------------+--------------+------------------------------------------------------------------------------------------------------------------------------+\n", "only showing top 100 rows" ] } ], "source": [ "# code from https://stackoverflow.com/questions/56763946/concat-multiple-string-rows-for-each-unique-id-by-a-particular-order\n", "from pyspark.sql import functions as F\n", "stop_times.withColumn(\"all_stops\",F.collect_list(\"stop_id_general\").over(w))\\\n", ".withColumn(\"all_departures\",F.collect_list(\"departure_time\").over(w))\\\n", ".select(F.col('trip_id'), F.col('stop_id_general'), F.col('departure_time'), \n", " F.col('stop_sequence'), F.col('departure_hour'), F.col('all_stops'))\\\n", ".show(100, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We successfully built incremental lists of departure times and stop_id sequences. We now need to select for the longest list for each `trip_id`. The `groupBy` line below does exactly that." ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-------------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+\n", "|trip_id |all_stops |all_departures |all_arrivals |\n", "+-------------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+\n", "|1005.TA.26-131-j19-1.9.H |[8503855, 8589111, 8573553, 8573554, 8573555, 8588985, 8588984] |[16:14:00, 16:15:00, 16:16:00, 16:18:00, 16:19:00, 16:20:00, 16:21:00] |[16:14:00, 16:15:00, 16:16:00, 16:18:00, 16:19:00, 16:20:00, 16:21:00] |\n", "|103.TA.26-925-j19-1.4.H |[8576082, 8576080] |[07:38:00, 07:42:00] |[07:38:00, 07:42:00] |\n", "|104.TA.26-733-j19-1.2.R |[8573205, 8580301, 8588553, 8573211, 8590699, 8587420, 8580434, 8576153, 8580433] |[07:33:00, 07:33:00, 07:34:00, 07:36:00, 07:37:00, 07:40:00, 07:41:00, 07:42:00, 07:44:00] |[07:33:00, 07:33:00, 07:34:00, 07:36:00, 07:37:00, 07:40:00, 07:41:00, 07:42:00, 07:44:00] |\n", "|1087.TA.26-5-B-j19-1.23.R|[8591245, 8591329, 8591366, 8591415, 8591059, 8591058, 8591317, 8591105, 8576193, 8591239, 8591220, 8591303, 8591412, 8591230]|[15:42:00, 15:43:00, 15:45:00, 15:46:00, 15:47:00, 15:49:00, 15:51:00, 15:53:00, 15:55:00, 15:57:00, 15:58:00, 16:00:00, 16:02:00, 16:04:00]|[15:42:00, 15:43:00, 15:45:00, 15:46:00, 15:47:00, 15:49:00, 15:51:00, 15:53:00, 15:55:00, 15:57:00, 15:58:00, 16:00:00, 16:02:00, 16:04:00]|\n", "|109.TA.1-1-E-j19-1.12.R |[8578679, 8590314, 8590317] |[11:04:00, 11:05:00, 11:06:00] |[11:04:00, 11:05:00, 11:06:00] |\n", "|109.TA.79-24-j19-1.1.R |[8503500, 8503499] |[16:50:00, 16:53:00] |[16:50:00, 16:53:00] |\n", "|1099.TA.26-142-j19-1.2.R |[8590815, 8590817, 8590812, 8590825, 8590830, 8590818, 8573167] |[17:31:00, 17:32:00, 17:33:00, 17:35:00, 17:36:00, 17:37:00, 17:40:00] |[17:31:00, 17:32:00, 17:33:00, 17:35:00, 17:36:00, 17:37:00, 17:40:00] |\n", "|11.TA.1-444-j19-1.1.H |[8572747, 8580847, 8581346, 8502894, 8502979, 8572596, 8591365, 8591366, 8591059] |[18:35:00, 18:36:00, 18:41:00, 18:42:00, 18:43:00, 18:44:00, 18:59:00, 19:01:00, 19:03:00] |[18:35:00, 18:36:00, 18:41:00, 18:42:00, 18:43:00, 18:44:00, 18:59:00, 19:01:00, 19:03:00] |\n", "|111.TA.79-736-j19-1.5.H |[8591031, 8588553, 8580301, 8573205, 8573213, 8587799, 8591032, 8593523] |[18:39:00, 18:41:00, 18:42:00, 18:44:00, 18:45:00, 18:46:00, 18:49:00, 18:51:00] |[18:39:00, 18:41:00, 18:42:00, 18:43:00, 18:45:00, 18:46:00, 18:49:00, 18:51:00] |\n", "|1139.TA.26-156-j19-1.4.R |[8573167, 8590824, 8590822, 8590811, 8590826, 8595406, 8590828, 8590780, 8590779, 8590775, 8590777, 8590482, 8590464] |[11:57:00, 11:58:00, 11:59:00, 12:00:00, 12:01:00, 12:02:00, 12:03:00, 12:04:00, 12:06:00, 12:06:00, 12:07:00, 12:09:00, 12:11:00] |[11:57:00, 11:58:00, 11:59:00, 12:00:00, 12:01:00, 12:02:00, 12:03:00, 12:04:00, 12:06:00, 12:06:00, 12:07:00, 12:09:00, 12:11:00] |\n", "+-------------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+\n", "only showing top 10 rows" ] } ], "source": [ "trips_with_duplicates= stop_times.withColumn(\"all_stops\",F.collect_list(\"stop_id_general\").over(w))\\\n", ".withColumn(\"all_departures\",F.collect_list(\"departure_time\").over(w))\\\n", ".withColumn(\"all_arrivals\",F.collect_list(\"arrival_time\").over(w))\\\n", ".groupBy(\"trip_id\")\\\n", ".agg(F.max(\"all_stops\").alias(\"all_stops\"), F.max(\"all_departures\").alias(\"all_departures\"), F.max(\"all_arrivals\").alias(\"all_arrivals\"))\\\n", "\n", "trips_with_duplicates.show(10, 0)" ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "25127" ] } ], "source": [ "trips_with_duplicates.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Are there many trips with a single stop ?" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+---------+--------------+----------+\n", - "| trip_id|all_stops|all_departures|stop_count|\n", - "+--------------------+---------+--------------+----------+\n", - "|366.TA.11-3-j19-1...|[8503000]| [15:23:00]| 1|\n", - "|457.TA.26-24-j19-...|[8502208]| [16:45:00]| 1|\n", - "|99.TA.1-321-j19-1...|[8502750]| [16:07:00]| 1|\n", - "|31.TA.80-158-Y-j1...|[8503000]| [14:38:00]| 1|\n", - "|423.TA.1-36-j19-1...|[8503000]| [09:36:00]| 1|\n", - "|808.TA.26-24-j19-...|[8502208]| [17:15:00]| 1|\n", - "|1.TA.20-E03-j19-1...|[8596126]| [19:15:00]| 1|\n", - "|103.TA.1-321-j19-...|[8502750]| [18:07:00]| 1|\n", - "|123.TA.1-321-j19-...|[8502750]| [12:07:00]| 1|\n", - "|141.TA.20-2-j19-1...|[8503000]| [08:10:00]| 1|\n", - "|17.TA.17-4-j19-1.5.H|[8503000]| [12:37:00]| 1|\n", - "|17.TA.80-158-Y-j1...|[8503000]| [10:38:00]| 1|\n", - "|346.TA.1-37-j19-1...|[8503000]| [11:08:00]| 1|\n", - "|399.TA.11-3-j19-1...|[8503000]| [11:37:00]| 1|\n", - "| 4.TA.17-4-j19-1.4.H|[8503000]| [18:37:00]| 1|\n", - "|450.TA.1-16-j19-1...|[8503000]| [15:54:00]| 1|\n", - "|611.TA.26-8-A-j19...|[8503204]| [07:00:00]| 1|\n", - "|178.TA.20-2-j19-1...|[8503000]| [19:18:00]| 1|\n", - "|410.TA.26-24-j19-...|[8502208]| [10:45:00]| 1|\n", - "|1.TA.57-2-Y-j19-1...|[8503000]| [09:34:00]| 1|\n", - "+--------------------+---------+--------------+----------+\n", + "+--------------------+---------+--------------+------------+----------+\n", + "| trip_id|all_stops|all_departures|all_arrivals|stop_count|\n", + "+--------------------+---------+--------------+------------+----------+\n", + "|366.TA.11-3-j19-1...|[8503000]| [15:23:00]| [15:23:00]| 1|\n", + "|457.TA.26-24-j19-...|[8502208]| [16:45:00]| [16:45:00]| 1|\n", + "|99.TA.1-321-j19-1...|[8502750]| [16:07:00]| [16:07:00]| 1|\n", + "|31.TA.80-158-Y-j1...|[8503000]| [14:38:00]| [14:38:00]| 1|\n", + "|423.TA.1-36-j19-1...|[8503000]| [09:36:00]| [09:36:00]| 1|\n", + "|808.TA.26-24-j19-...|[8502208]| [17:15:00]| [17:15:00]| 1|\n", + "|1.TA.20-E03-j19-1...|[8596126]| [19:15:00]| [19:10:00]| 1|\n", + "|103.TA.1-321-j19-...|[8502750]| [18:07:00]| [18:07:00]| 1|\n", + "|123.TA.1-321-j19-...|[8502750]| [12:07:00]| [12:07:00]| 1|\n", + "|141.TA.20-2-j19-1...|[8503000]| [08:10:00]| [08:10:00]| 1|\n", + "|17.TA.17-4-j19-1.5.H|[8503000]| [12:37:00]| [12:37:00]| 1|\n", + "|17.TA.80-158-Y-j1...|[8503000]| [10:38:00]| [10:38:00]| 1|\n", + "|346.TA.1-37-j19-1...|[8503000]| [11:08:00]| [11:08:00]| 1|\n", + "|399.TA.11-3-j19-1...|[8503000]| [11:37:00]| [11:37:00]| 1|\n", + "| 4.TA.17-4-j19-1.4.H|[8503000]| [18:37:00]| [18:37:00]| 1|\n", + "|450.TA.1-16-j19-1...|[8503000]| [15:54:00]| [15:54:00]| 1|\n", + "|611.TA.26-8-A-j19...|[8503204]| [07:00:00]| [06:59:00]| 1|\n", + "|178.TA.20-2-j19-1...|[8503000]| [19:18:00]| [19:18:00]| 1|\n", + "|410.TA.26-24-j19-...|[8502208]| [10:45:00]| [10:45:00]| 1|\n", + "|1.TA.57-2-Y-j19-1...|[8503000]| [09:34:00]| [09:34:00]| 1|\n", + "+--------------------+---------+--------------+------------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "from pyspark.sql.types import IntegerType\n", "slen = udf(lambda s: len(s), IntegerType())\n", "\n", "trips_with_duplicates.withColumn(\"stop_count\", slen(trips_with_duplicates.all_stops)).filter(F.col('stop_count')==1).show()" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "714" ] } ], "source": [ "trips_with_duplicates.withColumn(\"stop_count\", slen(trips_with_duplicates.all_stops)).filter(F.col('stop_count')==1).count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many trips share exactly the same departure **and** arrival times at all stops ?" ] }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+\n", "| trip_id| all_stops| all_departures| all_arrivals|\n", "+--------------------+--------------------+--------------------+--------------------+\n", "|382.TA.11-3-j19-1...| [8503000]| [15:53:00]| [15:53:00]|\n", "|87.TA.6-8-j19-1.64.R| [8503016, 8503000]|[08:46:00, 09:02:00]|[08:44:00, 08:55:00]|\n", "|32.TA.79-10-B-j19...|[8503054, 8503053...|[17:57:00, 17:59:...|[17:57:00, 17:59:...|\n", "|448.TA.26-LAF-j19...| [8503082, 8503081]|[19:20:00, 19:25:00]|[19:20:00, 19:25:00]|\n", "|294.TA.26-5-A-j19...|[8503125, 8503003...|[17:21:00, 17:32:...|[17:20:00, 17:32:...|\n", "|996.TA.26-12-j19-...|[8503147, 8503003...|[14:34:00, 14:39:...|[14:33:00, 14:38:...|\n", "|10.TA.30-170-Y-j1...|[8503202, 8502209...|[10:30:00, 10:35:...|[10:30:00, 10:35:...|\n", "|43.TA.26-2-j19-1....|[8503204, 8503202...|[09:24:00, 09:29:...|[09:23:00, 09:28:...|\n", "|580.TA.26-8-A-j19...|[8503204, 8503203...|[18:00:00, 18:02:...|[17:59:00, 18:02:...|\n", "|585.TA.26-24-j19-...|[8503305, 8503307...|[17:53:00, 17:57:...|[17:52:00, 17:57:...|\n", "|246.TA.26-9-A-j19...|[8503313, 8503312...|[10:02:00, 10:05:...|[10:02:00, 10:05:...|\n", "|158.TA.26-9-A-j19...|[8503313, 8503312...|[15:32:00, 15:35:...|[15:32:00, 15:35:...|\n", "|137.TA.26-15-j19-...|[8503316, 8503315...|[10:11:00, 10:14:...|[10:11:00, 10:14:...|\n", "|293.TA.26-640-j19...|[8503382, 8594339...|[08:26:00, 08:27:...|[08:26:00, 08:27:...|\n", "|278.TA.79-24-j19-...| [8503499, 8503500]|[12:25:00, 12:28:00]|[12:25:00, 12:28:00]|\n", "|127.TA.1-17-A-j19...|[8503508, 8517376...|[14:33:00, 14:34:...|[14:33:00, 14:34:...|\n", "|1859.TA.26-9-B-j1...|[8503610, 8580912...|[08:29:00, 08:30:...|[08:29:00, 08:30:...|\n", "|476.TA.26-768-j19...|[8573205, 8573213...|[14:37:00, 14:38:...|[14:37:00, 14:38:...|\n", "|40.TA.26-733-j19-...|[8573205, 8580301...|[14:33:00, 14:33:...|[14:33:00, 14:33:...|\n", "|120.TA.26-731-j19...|[8573205, 8580301...|[12:03:00, 12:03:...|[12:03:00, 12:03:...|\n", "+--------------------+--------------------+--------------------+--------------------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_with_duplicates.dropDuplicates(['all_stops', 'all_departures', 'all_arrivals']).show()" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "20086" ] } ], "source": [ "trips_with_duplicates.dropDuplicates(['all_stops', 'all_departures', 'all_arrivals']).count()" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "20041" ] } ], "source": [ "trips_with_duplicates.dropDuplicates(['all_stops', 'all_departures']).count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There seem to be a fraction of trips (less 0.2%) that share the exact same departure times at all stops, but not the same arrival times at all stops. To be on the safe side, we define identical trips based on the sequence of stops and the sequence of departure times.\n", "\n", "All in all, we remove ~5000 duplicated trips from all trips." ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "trips_unique = trips_with_duplicates.dropDuplicates(['all_stops', 'all_departures'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, we remove trips that only serve a single stop (most likely due to the pruning of stops ouside the 15km radius of Zürich HB)" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# removing trips with a single stop only:\n", "trips_unique = trips_unique.withColumn(\"stop_count\", slen(trips_with_duplicates.all_stops)).filter(F.col('stop_count')>1)" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+\n", "| trip_id| all_stops| all_departures| all_arrivals|stop_count|\n", "+--------------------+--------------------+--------------------+--------------------+----------+\n", "|168.TA.1-17-A-j19...|[8502273, 8517377...|[17:51:00, 17:52:...|[17:51:00, 17:52:...| 7|\n", "|15.TA.80-53-Y-j19...| [8503000, 8503202]|[09:12:00, 09:21:00]|[09:12:00, 09:21:00]| 2|\n", "|80.TA.16-5-j19-1....|[8503016, 8503006...|[19:09:00, 19:15:...|[19:07:00, 19:13:...| 3|\n", "|136.TA.26-10-B-j1...|[8503057, 8503056...|[12:54:00, 12:59:...|[12:54:00, 12:59:...| 8|\n", "|73.TA.26-4-B-j19-...|[8503088, 8503090...|[11:38:00, 11:39:...|[11:38:00, 11:39:...| 12|\n", "|55.TA.26-7-A-j19-...|[8503104, 8503003...|[14:03:00, 14:15:...|[14:02:00, 14:14:...| 11|\n", "|551.TA.26-11-j19-...|[8503147, 8503003...|[18:20:00, 18:25:...|[18:20:00, 18:25:...| 8|\n", "|216.TA.26-24-j19-...|[8503204, 8503203...|[19:15:00, 19:17:...|[19:15:00, 19:17:...| 12|\n", "|154.TA.26-9-A-j19...|[8503313, 8503312...|[13:32:00, 13:35:...|[13:32:00, 13:35:...| 13|\n", "|460.TA.79-24-j19-...| [8503499, 8503500]|[16:25:00, 16:28:00]|[16:25:00, 16:28:00]| 2|\n", "|159.TA.79-24-j19-...| [8503500, 8503499]|[12:40:00, 12:43:00]|[12:40:00, 12:43:00]| 2|\n", "|99.TA.79-24-j19-1...| [8503500, 8503499]|[17:40:00, 17:43:00]|[17:40:00, 17:43:00]| 2|\n", "|80.TA.26-36-j19-1...|[8503508, 8503001...|[11:38:00, 11:44:...|[11:36:00, 11:43:...| 5|\n", "|123.TA.1-350-j19-...|[8503610, 8573711...|[07:41:00, 07:43:...|[07:41:00, 07:43:...| 19|\n", "|4.TA.26-769-j19-1...|[8503700, 8576161...|[17:35:00, 17:37:...|[17:35:00, 17:37:...| 10|\n", "|281.TA.26-660-j19...|[8503700, 8588316...|[09:15:00, 09:16:...|[09:15:00, 09:16:...| 14|\n", "|269.TA.26-660-j19...|[8503700, 8588316...|[09:45:00, 09:46:...|[09:45:00, 09:46:...| 14|\n", "|983.TA.26-136-j19...|[8503855, 8594182...|[07:50:00, 07:51:...|[07:50:00, 07:51:...| 6|\n", "|7.TA.90-71-Y-j19-...|[8530645, 8530646...|[14:07:00, 14:15:...|[14:07:00, 14:11:...| 3|\n", "|138.TA.1-350-j19-...|[8572560, 8572599...|[17:49:00, 17:50:...|[17:49:00, 17:50:...| 20|\n", "+--------------------+--------------------+--------------------+--------------------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_unique.show()" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "19614" ] } ], "source": [ "trips_unique.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 6) building routes\n", "\n", "- 6) building routes based on unique trips\n", " - order unique_trips by stop_sequence, earliest departure time\n", " - each window with the same stop_sequence gets a unique routeID\n", " \n", "- 7) generate a RAPTOR compatible stop_times\n", " - filter with unique_trips\n", " - sort by routeID, earliest departure time\n", " \n", "We start by getting the first departure time for each unique trip, to be able to order them by route and first departure time for RAPTOR's `stopTimes` data structure." ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "| trip_id| all_stops| all_departures| all_arrivals|stop_count|departure_first_stop|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "|168.TA.1-17-A-j19...|[8502273, 8517377...|[17:51:00, 17:52:...|[17:51:00, 17:52:...| 7| 17:51:00|\n", "|15.TA.80-53-Y-j19...| [8503000, 8503202]|[09:12:00, 09:21:00]|[09:12:00, 09:21:00]| 2| 09:12:00|\n", - "|429.TA.16-5-j19-1...|[8503016, 8503006...|[19:09:00, 19:15:...|[19:07:00, 19:13:...| 3| 19:09:00|\n", + "|80.TA.16-5-j19-1....|[8503016, 8503006...|[19:09:00, 19:15:...|[19:07:00, 19:13:...| 3| 19:09:00|\n", "|136.TA.26-10-B-j1...|[8503057, 8503056...|[12:54:00, 12:59:...|[12:54:00, 12:59:...| 8| 12:54:00|\n", "|73.TA.26-4-B-j19-...|[8503088, 8503090...|[11:38:00, 11:39:...|[11:38:00, 11:39:...| 12| 11:38:00|\n", "|55.TA.26-7-A-j19-...|[8503104, 8503003...|[14:03:00, 14:15:...|[14:02:00, 14:14:...| 11| 14:03:00|\n", "|551.TA.26-11-j19-...|[8503147, 8503003...|[18:20:00, 18:25:...|[18:20:00, 18:25:...| 8| 18:20:00|\n", "|216.TA.26-24-j19-...|[8503204, 8503203...|[19:15:00, 19:17:...|[19:15:00, 19:17:...| 12| 19:15:00|\n", "|154.TA.26-9-A-j19...|[8503313, 8503312...|[13:32:00, 13:35:...|[13:32:00, 13:35:...| 13| 13:32:00|\n", "|460.TA.79-24-j19-...| [8503499, 8503500]|[16:25:00, 16:28:00]|[16:25:00, 16:28:00]| 2| 16:25:00|\n", "|159.TA.79-24-j19-...| [8503500, 8503499]|[12:40:00, 12:43:00]|[12:40:00, 12:43:00]| 2| 12:40:00|\n", "|99.TA.79-24-j19-1...| [8503500, 8503499]|[17:40:00, 17:43:00]|[17:40:00, 17:43:00]| 2| 17:40:00|\n", "|80.TA.26-36-j19-1...|[8503508, 8503001...|[11:38:00, 11:44:...|[11:36:00, 11:43:...| 5| 11:38:00|\n", "|123.TA.1-350-j19-...|[8503610, 8573711...|[07:41:00, 07:43:...|[07:41:00, 07:43:...| 19| 07:41:00|\n", "|4.TA.26-769-j19-1...|[8503700, 8576161...|[17:35:00, 17:37:...|[17:35:00, 17:37:...| 10| 17:35:00|\n", - "|280.TA.26-660-j19...|[8503700, 8588316...|[09:15:00, 09:16:...|[09:15:00, 09:16:...| 14| 09:15:00|\n", + "|281.TA.26-660-j19...|[8503700, 8588316...|[09:15:00, 09:16:...|[09:15:00, 09:16:...| 14| 09:15:00|\n", "|269.TA.26-660-j19...|[8503700, 8588316...|[09:45:00, 09:46:...|[09:45:00, 09:46:...| 14| 09:45:00|\n", "|983.TA.26-136-j19...|[8503855, 8594182...|[07:50:00, 07:51:...|[07:50:00, 07:51:...| 6| 07:50:00|\n", "|7.TA.90-71-Y-j19-...|[8530645, 8530646...|[14:07:00, 14:15:...|[14:07:00, 14:11:...| 3| 14:07:00|\n", "|138.TA.1-350-j19-...|[8572560, 8572599...|[17:49:00, 17:50:...|[17:49:00, 17:50:...| 20| 17:49:00|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "only showing top 20 rows" ] } ], "source": [ "# code from https://stackoverflow.com/questions/52975567/get-first-n-elements-from-dataframe-arraytype-column-in-pyspark\n", "\n", "trips_unique = trips_unique.withColumn('departure_first_stop', F.col(\"all_departures\")[0])\n", "trips_unique.show()" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "| trip_id| all_stops| all_departures| all_arrivals|stop_count|departure_first_stop|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "|203.TA.1-17-A-j19...|[8502187, 8502277...|[07:01:00, 07:02:...|[07:01:00, 07:02:...| 7| 07:01:00|\n", "|4.TA.30-57-Y-j19-...|[8502208, 8502209...|[07:18:00, 07:23:...|[07:18:00, 07:23:...| 3| 07:18:00|\n", "|5.TA.30-57-Y-j19-...|[8502208, 8502209...|[07:48:00, 07:53:...|[07:48:00, 07:53:...| 3| 07:48:00|\n", "|6.TA.30-57-Y-j19-...|[8502208, 8502209...|[08:18:00, 08:23:...|[08:18:00, 08:23:...| 3| 08:18:00|\n", "|7.TA.30-57-Y-j19-...|[8502208, 8502209...|[08:48:00, 08:53:...|[08:48:00, 08:53:...| 3| 08:48:00|\n", "|8.TA.30-57-Y-j19-...|[8502208, 8502209...|[09:18:00, 09:23:...|[09:18:00, 09:23:...| 3| 09:18:00|\n", "|9.TA.30-57-Y-j19-...|[8502208, 8502209...|[09:48:00, 09:53:...|[09:48:00, 09:53:...| 3| 09:48:00|\n", "|10.TA.30-57-Y-j19...|[8502208, 8502209...|[10:18:00, 10:23:...|[10:18:00, 10:23:...| 3| 10:18:00|\n", "|11.TA.30-57-Y-j19...|[8502208, 8502209...|[10:48:00, 10:53:...|[10:48:00, 10:53:...| 3| 10:48:00|\n", "|12.TA.30-57-Y-j19...|[8502208, 8502209...|[11:18:00, 11:23:...|[11:18:00, 11:23:...| 3| 11:18:00|\n", "|13.TA.30-57-Y-j19...|[8502208, 8502209...|[11:48:00, 11:53:...|[11:48:00, 11:53:...| 3| 11:48:00|\n", "|14.TA.30-57-Y-j19...|[8502208, 8502209...|[12:18:00, 12:23:...|[12:18:00, 12:23:...| 3| 12:18:00|\n", "|15.TA.30-57-Y-j19...|[8502208, 8502209...|[12:48:00, 12:53:...|[12:48:00, 12:53:...| 3| 12:48:00|\n", "|16.TA.30-57-Y-j19...|[8502208, 8502209...|[13:18:00, 13:23:...|[13:18:00, 13:23:...| 3| 13:18:00|\n", "|17.TA.30-57-Y-j19...|[8502208, 8502209...|[13:48:00, 13:53:...|[13:48:00, 13:53:...| 3| 13:48:00|\n", "|18.TA.30-57-Y-j19...|[8502208, 8502209...|[14:18:00, 14:23:...|[14:18:00, 14:23:...| 3| 14:18:00|\n", "|19.TA.30-57-Y-j19...|[8502208, 8502209...|[14:48:00, 14:53:...|[14:48:00, 14:53:...| 3| 14:48:00|\n", "|20.TA.30-57-Y-j19...|[8502208, 8502209...|[15:18:00, 15:23:...|[15:18:00, 15:23:...| 3| 15:18:00|\n", "|21.TA.30-57-Y-j19...|[8502208, 8502209...|[15:48:00, 15:53:...|[15:48:00, 15:53:...| 3| 15:48:00|\n", "|22.TA.30-57-Y-j19...|[8502208, 8502209...|[16:18:00, 16:23:...|[16:18:00, 16:23:...| 3| 16:18:00|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+\n", "only showing top 20 rows" ] } ], "source": [ "#ordering by stop_sequence (arbitrary order) and departure at the first stop (ascending)\n", "trips_unique = trips_unique.sort(trips_unique.all_stops, trips_unique.departure_first_stop)\n", "trips_unique.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In RAPTOR, routes are defined as collections of unique trips serving the same stop sequences at different times. Therefore, there is one route per sequence of stops, i.e unique entry in column `all_stops`. However, there is no specific rule to order routes depending on the stops they serve. We simply subset unique sequences of stops and index them from 0 to n-1 routes." ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+\n", "| all_stops|\n", "+--------------------+\n", + "| [8573205, 8588553]|\n", "|[8576240, 8591353...|\n", + "|[8591049, 8591128...|\n", + "|[8591057, 8591402...|\n", "|[8591061, 8591270...|\n", "| [8591281, 8591046]|\n", "|[8591825, 8590504...|\n", - "| [8573205, 8588553]|\n", - "|[8591049, 8591128...|\n", - "|[8591057, 8591402...|\n", "|[8575921, 8575920...|\n", "|[8591035, 8591134...|\n", "|[8595129, 8590543...|\n", - "|[8591031, 8588553...|\n", "|[8503010, 8503011...|\n", "| [8575927, 8594339]|\n", "|[8576127, 8576139...|\n", + "|[8591031, 8588553...|\n", "|[8502208, 8502209...|\n", "|[8503674, 8503659...|\n", "|[8576171, 8576172...|\n", - "|[8591110, 8591306...|\n", "|[8576276, 8576277...|\n", "|[8590805, 8590794...|\n", + "|[8591110, 8591306...|\n", "+--------------------+\n", "only showing top 20 rows" ] } ], "source": [ "routes = trips_unique.select(trips_unique.all_stops).distinct()\n", "routes.show()" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#building an index from 0 to n_routes\n", "# code from https://stackoverflow.com/questions/39057766/spark-equivelant-of-zipwithindex-in-dataframe\n", "from pyspark.sql.types import StructType, StructField, LongType\n", "def dfZipWithIndex (df, offset=0, colName=\"rowId\"):\n", " '''\n", " Enumerates dataframe rows is native order, like rdd.ZipWithIndex(), but on a dataframe \n", " and preserves a schema\n", "\n", " :param df: source dataframe\n", " :param offset: adjustment to zipWithIndex()'s index\n", " :param colName: name of the index column\n", " '''\n", "\n", " new_schema = StructType(\n", " [StructField(colName,LongType(),True)] # new added field in front\n", " + df.schema.fields # previous schema\n", " )\n", "\n", " zipped_rdd = df.rdd.zipWithIndex()\n", "\n", " new_rdd = zipped_rdd.map(lambda args: ([args[1] + offset] + list(args[0])))\n", "\n", " return spark.createDataFrame(new_rdd, new_schema)" ] }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+---------+--------------------+\n", "|route_int| all_stops|\n", "+---------+--------------------+\n", - "| 0|[8576240, 8591353...|\n", - "| 1|[8591061, 8591270...|\n", - "| 2|[8591825, 8590504...|\n", - "| 3| [8573205, 8588553]|\n", - "| 4|[8591049, 8591128...|\n", - "| 5|[8591057, 8591402...|\n", - "| 6| [8591281, 8591046]|\n", + "| 0| [8573205, 8588553]|\n", + "| 1|[8576240, 8591353...|\n", + "| 2|[8591049, 8591128...|\n", + "| 3|[8591057, 8591402...|\n", + "| 4|[8591061, 8591270...|\n", + "| 5| [8591281, 8591046]|\n", + "| 6|[8591825, 8590504...|\n", "| 7|[8575921, 8575920...|\n", "| 8|[8591035, 8591134...|\n", "| 9|[8595129, 8590543...|\n", - "| 10|[8576127, 8576139...|\n", - "| 11|[8503010, 8503011...|\n", - "| 12| [8575927, 8594339]|\n", + "| 10|[8503010, 8503011...|\n", + "| 11| [8575927, 8594339]|\n", + "| 12|[8576127, 8576139...|\n", "| 13|[8591031, 8588553...|\n", "| 14|[8502208, 8502209...|\n", "| 15|[8503674, 8503659...|\n", - "| 16|[8590805, 8590794...|\n", - "| 17|[8576171, 8576172...|\n", - "| 18|[8576276, 8576277...|\n", + "| 16|[8576171, 8576172...|\n", + "| 17|[8576276, 8576277...|\n", + "| 18|[8590805, 8590794...|\n", "| 19|[8591110, 8591306...|\n", "+---------+--------------------+\n", "only showing top 20 rows" ] } ], "source": [ "routes_indexed = dfZipWithIndex(routes, 0, 'route_int')\n", "routes_indexed.show()" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "| all_stops| trip_id| all_departures| all_arrivals|stop_count|departure_first_stop|route_int|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", - "|[8572747, 8580847...|59.TA.1-322-j19-1...|[16:27:00, 16:27:...|[16:27:00, 16:27:...| 3| 16:27:00| 30|\n", "|[8503064, 8503065...|483.TA.26-18-j19-...|[10:41:00, 10:45:...|[10:41:00, 10:45:...| 14| 10:41:00| 41|\n", - "|[8591355, 8591354...|1144.TA.26-75-A-j...|[11:52:00, 11:53:...|[11:52:00, 11:53:...| 21| 11:52:00| 76|\n", - "|[8591355, 8591354...|1187.TA.26-75-A-j...|[08:36:00, 08:37:...|[08:36:00, 08:37:...| 21| 08:36:00| 76|\n", + "|[8591355, 8591354...|1107.TA.26-75-A-j...|[15:59:00, 16:00:...|[15:59:00, 16:00:...| 21| 15:59:00| 80|\n", + "|[8595899, 8591206...|110.TA.26-40-j19-...|[08:23:00, 08:23:...|[08:23:00, 08:23:...| 8| 08:23:00| 87|\n", "|[8591276, 8591101...|613.TA.26-69-j19-...|[18:20:00, 18:23:...|[18:20:00, 18:23:...| 9| 18:20:00| 105|\n", - "|[8591123, 8591174...|59.TA.26-E-j19-1.4.R|[15:14:00, 15:17:...|[15:14:00, 15:17:...| 3| 15:14:00| 119|\n", - "|[8502495, 8591081...|58.TA.26-185-j19-...|[19:19:00, 19:21:...|[19:19:00, 19:21:...| 16| 19:19:00| 177|\n", + "|[8591401, 8503610...|1230.TA.26-80-j19...|[16:03:00, 16:04:...|[16:03:00, 16:04:...| 29| 16:03:00| 110|\n", + "|[8591401, 8503610...|1316.TA.26-80-j19...|[13:22:00, 13:23:...|[13:22:00, 13:23:...| 29| 13:22:00| 110|\n", + "|[8591401, 8503610...|1358.TA.26-80-j19...|[08:30:00, 08:31:...|[08:30:00, 08:31:...| 29| 08:30:00| 110|\n", + "|[8502208, 8502209...|677.TA.26-24-j19-...|[15:15:00, 15:17:...|[15:15:00, 15:17:...| 14| 15:15:00| 111|\n", + "|[8503150, 8576140...|107.TA.26-726-j19...|[19:02:00, 19:02:...|[19:02:00, 19:02:...| 11| 19:02:00| 122|\n", + "|[8580449, 8591063...|1892.TA.26-781-j1...|[15:17:00, 15:18:...|[15:17:00, 15:18:...| 12| 15:17:00| 136|\n", + "|[8590269, 8590276...|270.TA.26-303-j19...|[09:06:00, 09:07:...|[09:06:00, 09:07:...| 23| 09:06:00| 146|\n", + "|[8590269, 8590276...|276.TA.26-303-j19...|[08:06:00, 08:07:...|[08:06:00, 08:07:...| 23| 08:06:00| 146|\n", "| [8503081, 8503082]|1373.TA.26-LAF-j1...|[17:20:00, 17:25:00]|[17:20:00, 17:25:00]| 2| 17:20:00| 212|\n", - "|[8590878, 8576280...|15.TA.26-453-j19-...|[18:53:00, 18:53:...|[18:53:00, 18:53:...| 6| 18:53:00| 268|\n", - "|[8503202, 8502209...|14.TA.30-170-Y-j1...|[12:30:00, 12:35:...|[12:30:00, 12:35:...| 3| 12:30:00| 285|\n", - "|[8587653, 8590575...|75.TA.26-748-j19-...|[19:00:00, 19:00:...|[19:00:00, 19:00:...| 13| 19:00:00| 398|\n", - "|[8591122, 8591201...|1133.TA.26-69-j19...|[17:37:00, 17:38:...|[17:37:00, 17:38:...| 9| 17:37:00| 400|\n", - "| [8503001, 8503000]|282.TA.6-17-j19-1...|[15:00:00, 15:06:00]|[15:00:00, 15:06:00]| 2| 15:00:00| 452|\n", - "|[8502224, 8502223...|105.TA.26-5-A-j19...|[18:22:00, 18:25:...|[18:22:00, 18:25:...| 11| 18:22:00| 480|\n", - "|[8503610, 8580912...|990.TA.26-14-A-j1...|[07:10:00, 07:11:...|[07:10:00, 07:11:...| 27| 07:10:00| 513|\n", - "| [8575918, 8576176]|6.TA.26-662-j19-1...|[07:37:00, 07:47:00]|[07:37:00, 07:47:00]| 2| 07:37:00| 530|\n", - "|[8575944, 8503374...|138.TA.26-650-j19...|[15:44:00, 15:46:...|[15:44:00, 15:46:...| 14| 15:44:00| 615|\n", - "|[8576182, 8576200...|522.TA.26-4-j19-1...|[16:01:00, 16:02:...|[16:01:00, 16:02:...| 26| 16:01:00| 630|\n", - "|[8576182, 8576200...|626.TA.26-4-j19-1...|[08:55:00, 08:56:...|[08:55:00, 08:56:...| 26| 08:55:00| 630|\n", - "|[8576182, 8576200...|639.TA.26-4-j19-1...|[08:17:00, 08:18:...|[08:17:00, 08:18:...| 26| 08:17:00| 630|\n", + "|[8591067, 8587349...|1647.TA.26-17-j19...|[16:03:00, 16:06:...|[16:03:00, 16:06:...| 17| 16:03:00| 221|\n", + "|[8591276, 8591101...|270.TA.26-83-j19-...|[19:35:00, 19:38:...|[19:35:00, 19:38:...| 16| 19:35:00| 231|\n", + "|[8591276, 8591101...|225.TA.26-83-j19-...|[18:20:00, 18:22:...|[18:20:00, 18:22:...| 16| 18:20:00| 231|\n", + "|[8591122, 8591249...|31.TA.26-37-A-j19...|[11:02:00, 11:03:...|[11:02:00, 11:03:...| 6| 11:02:00| 265|\n", + "|[8591233, 8591107...|212.TA.26-704-j19...|[18:38:00, 18:42:...|[18:38:00, 18:42:...| 15| 18:38:00| 266|\n", + "| [8596126, 8573205]|4.TA.6-E02-j19-1.4.R|[14:50:00, 15:10:00]|[14:45:00, 15:10:00]| 2| 14:50:00| 283|\n", + "|[8580449, 8591063...|645.TA.26-768-j19...|[07:41:00, 07:42:...|[07:41:00, 07:42:...| 13| 07:41:00| 297|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_unique = trips_unique.join(routes_indexed, how='inner', on='all_stops').dropDuplicates()\n", "trips_unique.show()" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "| all_stops| trip_id| all_departures| all_arrivals|stop_count|departure_first_stop|route_int|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", - "|8572747 8580847 8...|59.TA.1-322-j19-1...|16:27:00 16:27:00...|16:27:00 16:27:00...| 3| 16:27:00| 30|\n", "|8503064 8503065 8...|483.TA.26-18-j19-...|10:41:00 10:45:00...|10:41:00 10:45:00...| 14| 10:41:00| 41|\n", - "|8573504 8580879 8...|122.TA.26-845-j19...|11:45:00 11:47:00...|11:45:00 11:47:00...| 4| 11:45:00| 52|\n", - "|8591355 8591354 8...|1144.TA.26-75-A-j...|11:52:00 11:53:00...|11:52:00 11:53:00...| 21| 11:52:00| 76|\n", - "|8591355 8591354 8...|1187.TA.26-75-A-j...|08:36:00 08:37:00...|08:36:00 08:37:00...| 21| 08:36:00| 76|\n", + "|8591355 8591354 8...|1107.TA.26-75-A-j...|15:59:00 16:00:00...|15:59:00 16:00:00...| 21| 15:59:00| 80|\n", + "|8595899 8591206 8...|110.TA.26-40-j19-...|08:23:00 08:23:00...|08:23:00 08:23:00...| 8| 08:23:00| 87|\n", "|8591276 8591101 8...|613.TA.26-69-j19-...|18:20:00 18:23:00...|18:20:00 18:23:00...| 9| 18:20:00| 105|\n", + "|8591401 8503610 8...|1230.TA.26-80-j19...|16:03:00 16:04:00...|16:03:00 16:04:00...| 29| 16:03:00| 110|\n", + "|8591401 8503610 8...|1316.TA.26-80-j19...|13:22:00 13:23:00...|13:22:00 13:23:00...| 29| 13:22:00| 110|\n", + "|8591401 8503610 8...|1358.TA.26-80-j19...|08:30:00 08:31:00...|08:30:00 08:31:00...| 29| 08:30:00| 110|\n", + "|8502208 8502209 8...|677.TA.26-24-j19-...|15:15:00 15:17:00...|15:15:00 15:17:00...| 14| 15:15:00| 111|\n", "|8503150 8576140 8...|107.TA.26-726-j19...|19:02:00 19:02:00...|19:02:00 19:02:00...| 11| 19:02:00| 122|\n", - "|8502495 8591081 8...|132.TA.26-185-j19...|14:19:00 14:21:00...|14:19:00 14:21:00...| 16| 14:19:00| 177|\n", + "|8580449 8591063 8...|1892.TA.26-781-j1...|15:17:00 15:18:00...|15:17:00 15:18:00...| 12| 15:17:00| 136|\n", + "|8590269 8590276 8...|270.TA.26-303-j19...|09:06:00 09:07:00...|09:06:00 09:07:00...| 23| 09:06:00| 146|\n", + "|8590269 8590276 8...|276.TA.26-303-j19...|08:06:00 08:07:00...|08:06:00 08:07:00...| 23| 08:06:00| 146|\n", "| 8503081 8503082|1373.TA.26-LAF-j1...| 17:20:00 17:25:00| 17:20:00 17:25:00| 2| 17:20:00| 212|\n", "|8591067 8587349 8...|1647.TA.26-17-j19...|16:03:00 16:06:00...|16:03:00 16:06:00...| 17| 16:03:00| 221|\n", - "|8591349 8591188 8...|30.TA.26-79-j19-1...|17:38:00 17:39:00...|17:38:00 17:39:00...| 6| 17:38:00| 222|\n", - "|8580433 8580438 8...|194.TA.26-733-j19...|15:15:00 15:16:00...|15:15:00 15:16:00...| 10| 15:15:00| 240|\n", - "|8590878 8576280 8...|15.TA.26-453-j19-...|18:53:00 18:53:00...|18:53:00 18:53:00...| 6| 18:53:00| 268|\n", - "|8590716 8590714 8...|364.TA.26-743-j19...|15:30:00 15:30:00...|15:30:00 15:30:00...| 17| 15:30:00| 278|\n", - "|8590804 8590805 8...|689.TA.26-31-j19-...|17:36:00 17:37:00...|17:36:00 17:37:00...| 9| 17:36:00| 279|\n", + "|8591276 8591101 8...|270.TA.26-83-j19-...|19:35:00 19:38:00...|19:35:00 19:38:00...| 16| 19:35:00| 231|\n", + "|8591276 8591101 8...|225.TA.26-83-j19-...|18:20:00 18:22:00...|18:20:00 18:22:00...| 16| 18:20:00| 231|\n", + "|8591122 8591249 8...|31.TA.26-37-A-j19...|11:02:00 11:03:00...|11:02:00 11:03:00...| 6| 11:02:00| 265|\n", + "|8591233 8591107 8...|212.TA.26-704-j19...|18:38:00 18:42:00...|18:38:00 18:42:00...| 15| 18:38:00| 266|\n", "| 8596126 8573205|4.TA.6-E02-j19-1.4.R| 14:50:00 15:10:00| 14:45:00 15:10:00| 2| 14:50:00| 283|\n", - "|8587653 8590575 8...|75.TA.26-748-j19-...|19:00:00 19:00:00...|19:00:00 19:00:00...| 13| 19:00:00| 398|\n", - "|8591122 8591201 8...|1133.TA.26-69-j19...|17:37:00 17:38:00...|17:37:00 17:38:00...| 9| 17:37:00| 400|\n", - "|8503059 8530813 8...|427.TA.26-18-j19-...|14:33:00 14:34:00...|14:33:00 14:34:00...| 13| 14:33:00| 432|\n", - "|8502224 8502223 8...|105.TA.26-5-A-j19...|18:22:00 18:25:00...|18:22:00 18:25:00...| 11| 18:22:00| 480|\n", + "|8580449 8591063 8...|645.TA.26-768-j19...|07:41:00 07:42:00...|07:41:00 07:42:00...| 13| 07:41:00| 297|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "only showing top 20 rows" ] } ], "source": [ "# converting arrays to strings to be able to store the data as csv\n", "trips_unique_string_lists = trips_unique.withColumn(\"all_stops\", F.concat_ws(\" \", \"all_stops\"))\\\n", ".withColumn(\"all_departures\", F.concat_ws(\" \", \"all_departures\"))\\\n", ".withColumn(\"all_arrivals\", F.concat_ws(\" \", \"all_arrivals\"))\n", "trips_unique_string_lists.show()" ] }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "trips_unique_string_lists.write.csv('data/lgpt_guys/trips_unique_string_lists.csv', header = True, mode=\"overwrite\")" ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "| all_stops| trip_id| all_departures| all_arrivals|stop_count|departure_first_stop|route_int|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", - "|8591057 8591402 8...|159.TA.26-304-j19...|19:39:00 19:41:00...|19:39:00 19:41:00...| 17| 19:39:00| 2|\n", - "|8591355 8591354 8...|1171.TA.26-75-A-j...|09:37:00 09:38:00...|09:37:00 09:38:00...| 21| 09:37:00| 77|\n", - "|8591401 8503610 8...|1282.TA.26-80-j19...|18:44:00 18:46:00...|18:44:00 18:46:00...| 29| 18:44:00| 110|\n", - "|8591401 8503610 8...|1258.TA.26-80-j19...|09:29:00 09:31:00...|09:29:00 09:31:00...| 29| 09:29:00| 110|\n", - "|8503157 8587858 8...|176.TA.26-725-j19...|15:17:00 15:19:00...|15:17:00 15:19:00...| 10| 15:17:00| 292|\n", - "|8587653 8590575 8...|73.TA.26-752-j19-...|08:25:00 08:26:00...|08:25:00 08:26:00...| 8| 08:25:00| 310|\n", - "|8591439 8591106 8...|1353.TA.26-7-B-j1...|16:42:00 16:44:00...|16:42:00 16:44:00...| 31| 16:42:00| 321|\n", - "|8591439 8591106 8...|1366.TA.26-7-B-j1...|16:35:00 16:36:00...|16:35:00 16:36:00...| 31| 16:35:00| 321|\n", - "|8590600 8579968 8...|49.TA.26-732-j19-...|11:39:00 11:40:00...|11:39:00 11:40:00...| 14| 11:39:00| 349|\n", - "|8590275 8590279 8...|412.TA.1-4-B-j19-...|18:05:00 18:07:00...|18:05:00 18:07:00...| 6| 18:05:00| 369|\n", - "|8590464 8590474 8...|642.TA.26-184-j19...|12:11:00 12:12:00...|12:11:00 12:12:00...| 9| 12:11:00| 384|\n", - "|8591122 8591201 8...|1180.TA.26-69-j19...|11:45:00 11:46:00...|11:45:00 11:46:00...| 9| 11:45:00| 401|\n", - "|8591122 8591201 8...|1201.TA.26-69-j19...|09:08:00 09:09:00...|09:08:00 09:09:00...| 9| 09:08:00| 401|\n", - "|8591122 8591201 8...|1208.TA.26-69-j19...|08:15:00 08:16:00...|08:15:00 08:16:00...| 9| 08:15:00| 401|\n", - "|8591230 8591087 8...|238.TA.26-751-j19...|11:16:00 11:17:00...|11:16:00 11:17:00...| 9| 11:16:00| 406|\n", - "|8591349 8591403 8...|636.TA.26-62-j19-...|14:47:00 14:47:00...|14:47:00 14:47:00...| 20| 14:47:00| 430|\n", - "|8503855 8589111 8...|863.TA.26-131-j19...|10:14:00 10:15:00...|10:14:00 10:15:00...| 7| 10:14:00| 528|\n", - "|8594304 8594310 8...|26.TA.1-11-B-j19-...|18:46:00 18:47:00...|18:46:00 18:47:00...| 5| 18:46:00| 544|\n", - "|8575918 8576135 8...|119.TA.26-720-j19...|07:23:00 07:25:00...|07:23:00 07:25:00...| 13| 07:23:00| 581|\n", - "|8576182 8576200 8...|648.TA.26-4-j19-1...|08:02:00 08:03:00...|08:02:00 08:03:00...| 26| 08:02:00| 629|\n", + "|8590898 8590900 8...|130.TA.26-772-j19...|08:45:00 08:46:00...|08:45:00 08:46:00...| 12| 08:45:00| 47|\n", + "|8575977 8575976 8...|275.TA.26-845-j19...|14:08:00 14:09:00...|14:08:00 14:09:00...| 4| 14:08:00| 69|\n", + "|8581546 8581543 8...|157.TA.26-813-j19...|12:37:00 12:37:00...|12:37:00 12:37:00...| 8| 12:37:00| 71|\n", + "|8573504 8588051 8...|37.TA.26-811-j19-...|11:30:00 11:31:00...|11:30:00 11:31:00...| 11| 11:30:00| 75|\n", + "|8576127 8503154 8...|18.TA.26-726-j19-...|12:50:00 12:52:00...|12:50:00 12:52:00...| 10| 12:50:00| 77|\n", + "|8576127 8503154 8...|30.TA.26-726-j19-...|10:20:00 10:22:00...|10:20:00 10:22:00...| 10| 10:20:00| 77|\n", + "|8591355 8591354 8...|1111.TA.26-75-A-j...|15:29:00 15:30:00...|15:29:00 15:30:00...| 21| 15:29:00| 80|\n", + "|8591276 8591101 8...|607.TA.26-69-j19-...|14:06:00 14:08:00...|14:06:00 14:08:00...| 9| 14:06:00| 105|\n", + "|8591401 8503610 8...|1325.TA.26-80-j19...|17:15:00 17:17:00...|17:15:00 17:16:00...| 29| 17:15:00| 110|\n", + "|8591401 8503610 8...|1351.TA.26-80-j19...|16:35:00 16:37:00...|16:35:00 16:36:00...| 29| 16:35:00| 110|\n", + "|8591028 8591023 8...|37.TA.26-91-j19-1...|17:24:00 17:25:00...|17:24:00 17:25:00...| 13| 17:24:00| 116|\n", + "|8591123 8591174 8...|17.TA.26-E-j19-1.4.R|11:04:00 11:07:00...|11:04:00 11:07:00...| 3| 11:04:00| 118|\n", + "|8591123 8591174 8...|63.TA.26-E-j19-1.4.R|09:34:00 09:37:00...|09:34:00 09:37:00...| 3| 09:34:00| 118|\n", + "|8503061 8590601 8...|51.TA.79-18-A-j19...|12:20:00 12:21:00...|12:20:00 12:21:00...| 5| 12:20:00| 121|\n", + "|8530812 8591094 8...|199.TA.26-77-j19-...|16:24:00 16:26:00...|16:24:00 16:26:00...| 7| 16:24:00| 124|\n", + "|8591365 8591329 8...|742.TA.26-89-j19-...|17:03:00 17:04:00...|17:03:00 17:04:00...| 27| 17:03:00| 135|\n", + "|8591365 8591329 8...|603.TA.26-89-j19-...|10:35:00 10:37:00...|10:35:00 10:37:00...| 27| 10:35:00| 135|\n", + "|8591065 8590566 8...|62.TA.26-743-j19-...|11:09:00 11:10:00...|11:09:00 11:10:00...| 18| 11:09:00| 147|\n", + "|8591349 8591403 8...|408.TA.26-61-j19-...|12:09:00 12:10:00...|12:09:00 12:10:00...| 19| 12:09:00| 150|\n", + "|8591349 8591403 8...|415.TA.26-61-j19-...|07:18:00 07:19:00...|07:18:00 07:19:00...| 19| 07:18:00| 150|\n", "+--------------------+--------------------+--------------------+--------------------+----------+--------------------+---------+\n", "only showing top 20 rows" ] } ], "source": [ "# we prepare an inner join on trips from trips_unique with stopTimes.\n", "\n", "trips_unique_string_lists = spark.read.csv('data/lgpt_guys/trips_unique_string_lists.csv', header = True)\n", "trips_unique_string_lists.show()" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------------------+--------------------+---------+----------+\n", "| trip_id|departure_first_stop|route_int|stop_count|\n", "+--------------------+--------------------+---------+----------+\n", - "|159.TA.26-304-j19...| 19:39:00| 2| 17|\n", - "|1171.TA.26-75-A-j...| 09:37:00| 77| 21|\n", - "|1282.TA.26-80-j19...| 18:44:00| 110| 29|\n", - "|1258.TA.26-80-j19...| 09:29:00| 110| 29|\n", - "|176.TA.26-725-j19...| 15:17:00| 292| 10|\n", - "|73.TA.26-752-j19-...| 08:25:00| 310| 8|\n", - "|1353.TA.26-7-B-j1...| 16:42:00| 321| 31|\n", - "|1366.TA.26-7-B-j1...| 16:35:00| 321| 31|\n", - "|49.TA.26-732-j19-...| 11:39:00| 349| 14|\n", - "|412.TA.1-4-B-j19-...| 18:05:00| 369| 6|\n", - "|642.TA.26-184-j19...| 12:11:00| 384| 9|\n", - "|1180.TA.26-69-j19...| 11:45:00| 401| 9|\n", - "|1201.TA.26-69-j19...| 09:08:00| 401| 9|\n", - "|1208.TA.26-69-j19...| 08:15:00| 401| 9|\n", - "|238.TA.26-751-j19...| 11:16:00| 406| 9|\n", - "|636.TA.26-62-j19-...| 14:47:00| 430| 20|\n", - "|863.TA.26-131-j19...| 10:14:00| 528| 7|\n", - "|26.TA.1-11-B-j19-...| 18:46:00| 544| 5|\n", - "|119.TA.26-720-j19...| 07:23:00| 581| 13|\n", - "|648.TA.26-4-j19-1...| 08:02:00| 629| 26|\n", + "|130.TA.26-772-j19...| 08:45:00| 47| 12|\n", + "|275.TA.26-845-j19...| 14:08:00| 69| 4|\n", + "|157.TA.26-813-j19...| 12:37:00| 71| 8|\n", + "|37.TA.26-811-j19-...| 11:30:00| 75| 11|\n", + "|18.TA.26-726-j19-...| 12:50:00| 77| 10|\n", + "|30.TA.26-726-j19-...| 10:20:00| 77| 10|\n", + "|1111.TA.26-75-A-j...| 15:29:00| 80| 21|\n", + "|607.TA.26-69-j19-...| 14:06:00| 105| 9|\n", + "|1325.TA.26-80-j19...| 17:15:00| 110| 29|\n", + "|1351.TA.26-80-j19...| 16:35:00| 110| 29|\n", + "|37.TA.26-91-j19-1...| 17:24:00| 116| 13|\n", + "|17.TA.26-E-j19-1.4.R| 11:04:00| 118| 3|\n", + "|63.TA.26-E-j19-1.4.R| 09:34:00| 118| 3|\n", + "|51.TA.79-18-A-j19...| 12:20:00| 121| 5|\n", + "|199.TA.26-77-j19-...| 16:24:00| 124| 7|\n", + "|742.TA.26-89-j19-...| 17:03:00| 135| 27|\n", + "|603.TA.26-89-j19-...| 10:35:00| 135| 27|\n", + "|62.TA.26-743-j19-...| 11:09:00| 147| 18|\n", + "|408.TA.26-61-j19-...| 12:09:00| 150| 19|\n", + "|415.TA.26-61-j19-...| 07:18:00| 150| 19|\n", "+--------------------+--------------------+---------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "trips_unique_for_join = trips_unique_string_lists.select(trips_unique_string_lists.trip_id, \\\n", " trips_unique_string_lists.departure_first_stop, \\\n", " trips_unique_string_lists.route_int, \\\n", " trips_unique_string_lists.stop_count)\n", "trips_unique_for_join.show()" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "260459" ] } ], "source": [ "stop_times = stop_times.join(trips_unique_for_join, how='inner', on='trip_id')\n", "stop_times.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this step, we sort `stop_times` in the same order as RAPTOR's `stopTimes` data structure, that is:\n", "- By route\n", "- By trip (starting with the one that leaves the first stop of the route at the earliest departure time)\n", "- By stop in the sequence of stops defining the route\n" ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", - "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|departure_first_stop|route_int|stop_count|\n", - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", - "|1672.TA.26-10-j19...|8573205| 07:00:00| 07:01:00| 27| 0| 0| 8573205|Zürich Flughafen,...| 26-10-j19-1|Zürich Flughafen,...| 4096| 1| 7| 07:01:00| 0| 2|\n", - "|1672.TA.26-10-j19...|8588553| 07:02:00| 07:02:00| 28| 0| 0| 8588553|Zürich Flughafen,...| 26-10-j19-1|Zürich Flughafen,...| 4096| 1| 7| 07:01:00| 0| 2|\n", - "|791.TA.26-11-A-j1...|8591049| 19:49:00| 19:49:00| 1| 0| 0| 8591049| Zürich, Auzelg|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591128| 19:51:00| 19:51:00| 2| 0| 0| 8591128|Zürich, Fernsehst...|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591830| 19:52:00| 19:52:00| 3| 0| 0| 8591830|Glattpark, Glattpark|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591294| 19:53:00| 19:53:00| 4| 0| 0| 8591294| Zürich, Oerlikerhus|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591256| 19:54:00| 19:54:00| 5| 0| 0| 8591256|Zürich, Leutschen...|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591273| 19:55:00| 19:55:00| 6| 0| 0| 8591273|Zürich, Messe/Hal...|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8591382| 19:57:00| 19:57:00| 7| 0| 0| 8591382|Zürich, Sternen O...|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|791.TA.26-11-A-j1...|8580449| 19:59:00| 19:59:00| 8| 0| 0| 8580449|Zürich Oerlikon, ...|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 1| 8|\n", - "|159.TA.26-304-j19...|8591057| 19:39:00| 19:39:00| 1| 0| 0| 8591057|Zürich Altstetten...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8591402| 19:41:00| 19:41:00| 2| 0| 0| 8591402| Zürich, Tüffenwies| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8591434| 19:41:00| 19:41:00| 3| 0| 0| 8591434| Zürich, Winzerhalde| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8591197| 19:42:00| 19:42:00| 4| 0| 0| 8591197|Zürich, Hohenklin...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8591436| 19:43:00| 19:43:00| 5| 0| 0| 8591436|Zürich, Winzerstr...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8591136| 19:46:00| 19:46:00| 6| 0| 0| 8591136| Zürich, Frankental| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590725| 19:47:00| 19:47:00| 7| 0| 0| 8590725|Oberengstringen, ...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590726| 19:48:00| 19:48:00| 8| 0| 0| 8590726|Oberengstringen, ...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590728| 19:49:00| 19:49:00| 9| 0| 0| 8590728|Oberengstringen, ...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590727| 19:50:00| 19:50:00| 10| 0| 0| 8590727|Oberengstringen, ...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590833| 19:51:00| 19:51:00| 11| 0| 0| 8590833|Unterengstringen,...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8594732| 19:53:00| 19:53:00| 12| 0| 0| 8594732|Unterengstringen,...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590831| 19:53:00| 19:53:00| 13| 0| 0| 8590831|Unterengstringen,...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590911| 19:55:00| 19:55:00| 14| 0| 0| 8590911|Weiningen ZH, Aus...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590913| 19:56:00| 19:56:00| 15| 0| 0| 8590913|Weiningen ZH, Lin...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590914| 19:57:00| 19:57:00| 16| 0| 0| 8590914|Weiningen ZH, Sch...| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|159.TA.26-304-j19...|8590617| 19:59:00| 19:59:00| 17| 0| 0| 8590617| Geroldswil, Welbrig| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 2| 17|\n", - "|269.TA.26-61-j19-...|8591281| 19:57:00| 19:57:00| 1| 0| 0| 8591281| Zürich, Mühlacker| 26-61-j19-1|Zürich, Schwamend...| 2076| 0| 19| 19:57:00| 3| 2|\n", - "|269.TA.26-61-j19-...|8591046| 19:58:00| 19:58:00| 2| 0| 0| 8591046| Zürich, Aspholz| 26-61-j19-1|Zürich, Schwamend...| 2076| 0| 19| 19:57:00| 3| 2|\n", - "|2064.TA.26-13-j19...|8576240| 07:00:00| 07:00:00| 5| 0| 0| 8576240|Zürich, Meierhofp...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591353| 07:01:00| 07:01:00| 6| 0| 0| 8591353| Zürich, Schwert| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591039| 07:02:00| 07:02:00| 7| 0| 0| 8591039| Zürich, Alte Trotte| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591121| 07:03:00| 07:03:00| 8| 0| 0| 8591121|Zürich, Eschergutweg| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591417| 07:05:00| 07:05:00| 9| 0| 0| 8591417| Zürich, Waidfussweg| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591437| 07:06:00| 07:06:00| 10| 0| 0| 8591437|Zürich, Wipkinger...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8580522| 07:08:00| 07:08:00| 11| 0| 0| 8580522|Zürich, Escher-Wy...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591110| 07:09:00| 07:09:00| 12| 0| 0| 8591110| Zürich, Dammweg| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591306| 07:10:00| 07:10:00| 13| 0| 0| 8591306|Zürich, Quellenst...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591257| 07:11:00| 07:11:00| 14| 0| 0| 8591257| Zürich, Limmatplatz| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591282| 07:12:00| 07:12:00| 15| 0| 0| 8591282|Zürich, Museum fü...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591368| 07:14:00| 07:14:00| 16| 0| 0| 8591368| Zürich, Sihlquai/HB| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8587349| 07:16:00| 07:16:00| 17| 0| 0| 8587349|Zürich, Bahnhofqu...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591067| 07:18:00| 07:18:00| 18| 0| 0| 8591067|Zürich, Bahnhofst...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591316| 07:20:00| 07:20:00| 19| 0| 0| 8591316| Zürich, Rennweg| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591299| 07:22:00| 07:22:00| 20| 0| 0| 8591299| Zürich, Paradeplatz| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591384| 07:23:00| 07:23:00| 21| 0| 0| 8591384|Zürich, Stockerst...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591404| 07:24:00| 07:24:00| 22| 0| 0| 8591404|Zürich, Tunnelstr...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591059| 07:25:00| 07:25:00| 23| 0| 0| 8591059|Zürich Enge, Bahn...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591415| 07:27:00| 07:27:00| 24| 0| 0| 8591415|Zürich, Waffenpla...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591366| 07:28:00| 07:28:00| 25| 0| 0| 8591366|Zürich, Sihlcity ...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591329| 07:29:00| 07:29:00| 26| 0| 0| 8591329|Zürich, Saalsport...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591245| 07:30:00| 07:30:00| 27| 0| 0| 8591245| Zürich, Laubegg| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591405| 07:32:00| 07:32:00| 28| 0| 0| 8591405| Zürich, Uetlihof| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591385| 07:33:00| 07:33:00| 29| 0| 0| 8591385|Zürich, Strassenv...| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|2064.TA.26-13-j19...|8591034| 07:34:00| 07:34:00| 30| 0| 0| 8591034| Zürich, Albisgütli| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 4| 26|\n", - "|966.TA.26-70-A-j1...|8591061| 07:00:00| 07:00:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 5| 5|\n", - "|966.TA.26-70-A-j1...|8591270| 07:02:00| 07:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 5| 5|\n", - "|966.TA.26-70-A-j1...|8591210| 07:03:00| 07:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 5| 5|\n", - "|966.TA.26-70-A-j1...|8591370| 07:03:00| 07:03:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 5| 5|\n", - "|966.TA.26-70-A-j1...|8591278| 07:04:00| 07:04:00| 13| 0| 0| 8591278|Zürich, Mittellei...|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 5| 5|\n", - "|179.TA.26-703-j19...|8591825| 07:10:00| 07:10:00| 1| 0| 0| 8591825| Benglen, Bodenacher| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8590504| 07:11:00| 07:11:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8596005| 07:14:00| 07:14:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591832| 07:14:00| 07:14:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591147| 07:16:00| 07:16:00| 5| 0| 0| 8591147|Zürich, Friedhof ...| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591162| 07:17:00| 07:17:00| 6| 0| 0| 8591162|Zürich, Glockenacker| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591261| 07:18:00| 07:18:00| 7| 0| 0| 8591261|Zürich, Loorenstr...| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591107| 07:19:00| 07:19:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|179.TA.26-703-j19...|8591233| 07:25:00| 07:25:00| 9| 0| 0| 8591233| Zürich, Klusplatz| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591825| 07:12:00| 07:12:00| 1| 0| 0| 8591825| Benglen, Bodenacher| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8590504| 07:13:00| 07:13:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8596005| 07:16:00| 07:16:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591832| 07:16:00| 07:16:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591147| 07:18:00| 07:18:00| 5| 0| 0| 8591147|Zürich, Friedhof ...| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591162| 07:19:00| 07:19:00| 6| 0| 0| 8591162|Zürich, Glockenacker| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591261| 07:20:00| 07:20:00| 7| 0| 0| 8591261|Zürich, Loorenstr...| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591107| 07:21:00| 07:21:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|171.TA.26-703-j19...|8591233| 07:27:00| 07:27:00| 9| 0| 0| 8591233| Zürich, Klusplatz| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591825| 07:25:00| 07:25:00| 1| 0| 0| 8591825| Benglen, Bodenacher| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8590504| 07:26:00| 07:26:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8596005| 07:29:00| 07:29:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591832| 07:29:00| 07:29:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591147| 07:31:00| 07:31:00| 5| 0| 0| 8591147|Zürich, Friedhof ...| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591162| 07:32:00| 07:32:00| 6| 0| 0| 8591162|Zürich, Glockenacker| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591261| 07:33:00| 07:33:00| 7| 0| 0| 8591261|Zürich, Loorenstr...| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591107| 07:34:00| 07:34:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|155.TA.26-703-j19...|8591233| 07:40:00| 07:40:00| 9| 0| 0| 8591233| Zürich, Klusplatz| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591825| 07:27:00| 07:27:00| 1| 0| 0| 8591825| Benglen, Bodenacher| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8590504| 07:28:00| 07:28:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8596005| 07:31:00| 07:31:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591832| 07:31:00| 07:31:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591147| 07:33:00| 07:33:00| 5| 0| 0| 8591147|Zürich, Friedhof ...| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591162| 07:34:00| 07:34:00| 6| 0| 0| 8591162|Zürich, Glockenacker| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591261| 07:35:00| 07:35:00| 7| 0| 0| 8591261|Zürich, Loorenstr...| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591107| 07:36:00| 07:36:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|144.TA.26-703-j19...|8591233| 07:42:00| 07:42:00| 9| 0| 0| 8591233| Zürich, Klusplatz| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", - "|120.TA.26-703-j19...|8591825| 07:40:00| 07:40:00| 1| 0| 0| 8591825| Benglen, Bodenacher| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", - "|120.TA.26-703-j19...|8590504| 07:41:00| 07:41:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", - "|120.TA.26-703-j19...|8596005| 07:44:00| 07:44:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", - "|120.TA.26-703-j19...|8591832| 07:44:00| 07:44:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", - "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", + "| trip_id|stop_id|arrival_time|departure_time|stop_sequence|pickup_type|drop_off_type|stop_id_general| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_hour|departure_first_stop|route_int|stop_count|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", + "|1672.TA.26-10-j19...|8573205| 07:00:00| 07:01:00| 27| 0| 0| 8573205|Zürich Flughafen,...|47.4504413038344|8.56372943623189| 26-10-j19-1|Zürich Flughafen,...| 4096| 1| 7| 07:01:00| 0| 2|\n", + "|1672.TA.26-10-j19...|8588553| 07:02:00| 07:02:00| 28| 0| 0| 8588553|Zürich Flughafen,...|47.4524944976638|8.57205681891684| 26-10-j19-1|Zürich Flughafen,...| 4096| 1| 7| 07:01:00| 0| 2|\n", + "|2064.TA.26-13-j19...|8576240| 07:00:00| 07:00:00| 5| 0| 0| 8576240|Zürich, Meierhofp...|47.4020100860391|8.49937412926861| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591353| 07:01:00| 07:01:00| 6| 0| 0| 8591353| Zürich, Schwert|47.3997299435837|8.50461130737576| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591039| 07:02:00| 07:02:00| 7| 0| 0| 8591039| Zürich, Alte Trotte|47.3977659017765|8.50725235431143| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591121| 07:03:00| 07:03:00| 8| 0| 0| 8591121|Zürich, Eschergutweg|47.3962700189648|8.51204037477646| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591417| 07:05:00| 07:05:00| 9| 0| 0| 8591417| Zürich, Waidfussweg|47.3954977376399|8.51840044698891| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591437| 07:06:00| 07:06:00| 10| 0| 0| 8591437|Zürich, Wipkinger...|47.3925909395293|8.52357474302616| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8580522| 07:08:00| 07:08:00| 11| 0| 0| 8580522|Zürich, Escher-Wy...|47.3907969150758| 8.5223979500038| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591110| 07:09:00| 07:09:00| 12| 0| 0| 8591110| Zürich, Dammweg|47.3884919601296|8.52639545301869| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591306| 07:10:00| 07:10:00| 13| 0| 0| 8591306|Zürich, Quellenst...|47.3867403702341|8.52874903906341| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591257| 07:11:00| 07:11:00| 14| 0| 0| 8591257| Zürich, Limmatplatz|47.3845994590919|8.53162364797299| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591282| 07:12:00| 07:12:00| 15| 0| 0| 8591282|Zürich, Museum fü...|47.3821239221899|8.53493843137185| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591368| 07:14:00| 07:14:00| 16| 0| 0| 8591368| Zürich, Sihlquai/HB|47.3798733332196|8.53760642776606| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8587349| 07:16:00| 07:16:00| 17| 0| 0| 8587349|Zürich, Bahnhofqu...|47.3775618175159|8.54173867807358| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591067| 07:18:00| 07:18:00| 18| 0| 0| 8591067|Zürich, Bahnhofst...|47.3765581015114|8.53994204750509| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591316| 07:20:00| 07:20:00| 19| 0| 0| 8591316| Zürich, Rennweg|47.3730662375955|8.53845982728609| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591299| 07:22:00| 07:22:00| 20| 0| 0| 8591299| Zürich, Paradeplatz|47.3693672863583|8.53876525448273| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591384| 07:23:00| 07:23:00| 21| 0| 0| 8591384|Zürich, Stockerst...|47.3677002399791|8.53501029659459| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591404| 07:24:00| 07:24:00| 22| 0| 0| 8591404|Zürich, Tunnelstr...|47.3661426599847|8.53253094641008| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591059| 07:25:00| 07:25:00| 23| 0| 0| 8591059|Zürich Enge, Bahn...|47.3645546111557|8.53045583810347| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591415| 07:27:00| 07:27:00| 24| 0| 0| 8591415|Zürich, Waffenpla...|47.3614818138862|8.52574866601403| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591366| 07:28:00| 07:28:00| 25| 0| 0| 8591366|Zürich, Sihlcity ...|47.3600640074787|8.52303575385561| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591329| 07:29:00| 07:29:00| 26| 0| 0| 8591329|Zürich, Saalsport...|47.3578611597087|8.52040369007277| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591245| 07:30:00| 07:30:00| 27| 0| 0| 8591245| Zürich, Laubegg|47.3587313564196|8.51708890667391| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591405| 07:32:00| 07:32:00| 28| 0| 0| 8591405| Zürich, Uetlihof|47.3567353594536|8.51396276948474| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591385| 07:33:00| 07:33:00| 29| 0| 0| 8591385|Zürich, Strassenv...|47.3530717783138|8.51171698127413| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|2064.TA.26-13-j19...|8591034| 07:34:00| 07:34:00| 30| 0| 0| 8591034| Zürich, Albisgütli|47.3519945640447| 8.5077104951064| 26-13-j19-1| Zürich, Albisgütli| 1831| 0| 7| 07:00:00| 1| 26|\n", + "|791.TA.26-11-A-j1...|8591049| 19:49:00| 19:49:00| 1| 0| 0| 8591049| Zürich, Auzelg|47.4166918393693| 8.568113214819|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591128| 19:51:00| 19:51:00| 2| 0| 0| 8591128|Zürich, Fernsehst...|47.4181749855684|8.56174415945371|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591830| 19:52:00| 19:52:00| 3| 0| 0| 8591830|Glattpark, Glattpark|47.4199559214972|8.55716275150406|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591294| 19:53:00| 19:53:00| 4| 0| 0| 8591294| Zürich, Oerlikerhus|47.4175853791724| 8.5542072942189|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591256| 19:54:00| 19:54:00| 5| 0| 0| 8591256|Zürich, Leutschen...|47.4146433269471|8.55130573585079|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591273| 19:55:00| 19:55:00| 6| 0| 0| 8591273|Zürich, Messe/Hal...|47.4106919651348|8.55068589830466|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8591382| 19:57:00| 19:57:00| 7| 0| 0| 8591382|Zürich, Sternen O...|47.4100718783688|8.54623025449481|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|791.TA.26-11-A-j1...|8580449| 19:59:00| 19:59:00| 8| 0| 0| 8580449|Zürich Oerlikon, ...| 47.411494419524|8.54479295004002|26-11-A-j19-1| Zürich, Rehalp| 363| 0| 19| 19:49:00| 2| 8|\n", + "|159.TA.26-304-j19...|8591057| 19:39:00| 19:39:00| 1| 0| 0| 8591057|Zürich Altstetten...| 47.392067942097|8.48990588617267| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8591402| 19:41:00| 19:41:00| 2| 0| 0| 8591402| Zürich, Tüffenwies|47.3979787271809|8.49434356367684| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8591434| 19:41:00| 19:41:00| 3| 0| 0| 8591434| Zürich, Winzerhalde|47.4000582901792| 8.4945681424979| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8591197| 19:42:00| 19:42:00| 4| 0| 0| 8591197|Zürich, Hohenklin...|47.4013473348052|8.49021131336931| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8591436| 19:43:00| 19:43:00| 5| 0| 0| 8591436|Zürich, Winzerstr...| 47.403372044054| 8.486123978826| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8591136| 19:46:00| 19:46:00| 6| 0| 0| 8591136| Zürich, Frankental|47.4057006674825|8.48137189097235| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590725| 19:47:00| 19:47:00| 7| 0| 0| 8590725|Oberengstringen, ...|47.4055243523393|8.47408655401713| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590726| 19:48:00| 19:48:00| 8| 0| 0| 8590726|Oberengstringen, ...| 47.407342193939|8.46795106062573| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590728| 19:49:00| 19:49:00| 9| 0| 0| 8590728|Oberengstringen, ...|47.4091295756792|8.46260608468448| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590727| 19:50:00| 19:50:00| 10| 0| 0| 8590727|Oberengstringen, ...|47.4104852703573|8.45874332896223| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590833| 19:51:00| 19:51:00| 11| 0| 0| 8590833|Unterengstringen,...|47.4122360710415|8.45316479104707| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8594732| 19:53:00| 19:53:00| 12| 0| 0| 8594732|Unterengstringen,...|47.4134944230824|8.44931101847766| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590831| 19:53:00| 19:53:00| 13| 0| 0| 8590831|Unterengstringen,...| 47.414977659342|8.44603216769017| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590911| 19:55:00| 19:55:00| 14| 0| 0| 8590911|Weiningen ZH, Aus...|47.4176826342903|8.43953734818508| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590913| 19:56:00| 19:56:00| 15| 0| 0| 8590913|Weiningen ZH, Lin...|47.4195547602987|8.43394084396424| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590914| 19:57:00| 19:57:00| 16| 0| 0| 8590914|Weiningen ZH, Sch...|47.4183512583635|8.42866773324572| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|159.TA.26-304-j19...|8590617| 19:59:00| 19:59:00| 17| 0| 0| 8590617| Geroldswil, Welbrig|47.4180716529658|8.41906474285715| 26-304-j19-1| Dietikon, Bahnhof| 5481| 1| 19| 19:39:00| 3| 17|\n", + "|966.TA.26-70-A-j1...|8591061| 07:00:00| 07:00:00| 9| 0| 0| 8591061|Zürich Leimbach, ...|47.3332523864039|8.51859807635144|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 4| 5|\n", + "|966.TA.26-70-A-j1...|8591270| 07:02:00| 07:02:00| 10| 0| 0| 8591270| Zürich, Marbachweg|47.3303482449491|8.51537312448101|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 4| 5|\n", + "|966.TA.26-70-A-j1...|8591210| 07:03:00| 07:03:00| 11| 0| 0| 8591210| Zürich, Im Hüsli|47.3282354882425|8.51269614493396|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 4| 5|\n", + "|966.TA.26-70-A-j1...|8591370| 07:03:00| 07:03:00| 12| 0| 0| 8591370|Zürich, Sihlweids...|47.3264149182794|8.51466345540645|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 4| 5|\n", + "|966.TA.26-70-A-j1...|8591278| 07:04:00| 07:04:00| 13| 0| 0| 8591278|Zürich, Mittellei...|47.3231389520848|8.51428616298707|26-70-A-j19-1|Zürich, Mittellei...| 3928| 0| 7| 07:00:00| 4| 5|\n", + "|269.TA.26-61-j19-...|8591281| 19:57:00| 19:57:00| 1| 0| 0| 8591281| Zürich, Mühlacker|47.4256326325821|8.49799970688372| 26-61-j19-1|Zürich, Schwamend...| 2076| 0| 19| 19:57:00| 5| 2|\n", + "|269.TA.26-61-j19-...|8591046| 19:58:00| 19:58:00| 2| 0| 0| 8591046| Zürich, Aspholz| 47.425085652811|8.50058685490234| 26-61-j19-1|Zürich, Schwamend...| 2076| 0| 19| 19:57:00| 5| 2|\n", + "|179.TA.26-703-j19...|8591825| 07:10:00| 07:10:00| 1| 0| 0| 8591825| Benglen, Bodenacher|47.3611288870976|8.63861299832652| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8590504| 07:11:00| 07:11:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...|47.3610862923255|8.63360938219328| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8596005| 07:14:00| 07:14:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...|47.3608915729295| 8.623476385787| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591832| 07:14:00| 07:14:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren|47.3626987847054|8.61754750491098| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591147| 07:16:00| 07:16:00| 5| 0| 0| 8591147|Zürich, Friedhof ...|47.3613418604422|8.60282411740221| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591162| 07:17:00| 07:17:00| 6| 0| 0| 8591162|Zürich, Glockenacker|47.3609767627537|8.59930272148798| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591261| 07:18:00| 07:18:00| 7| 0| 0| 8591261|Zürich, Loorenstr...|47.3598631991991|8.59452368417579| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591107| 07:19:00| 07:19:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...|47.3583236436636|8.58659156021591| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|179.TA.26-703-j19...|8591233| 07:25:00| 07:25:00| 9| 0| 0| 8591233| Zürich, Klusplatz|47.3640374201824|8.56649624730736| 26-703-j19-1| Zürich, Klusplatz| 9385| 1| 7| 07:10:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591825| 07:12:00| 07:12:00| 1| 0| 0| 8591825| Benglen, Bodenacher|47.3611288870976|8.63861299832652| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8590504| 07:13:00| 07:13:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...|47.3610862923255|8.63360938219328| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8596005| 07:16:00| 07:16:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...|47.3608915729295| 8.623476385787| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591832| 07:16:00| 07:16:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren|47.3626987847054|8.61754750491098| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591147| 07:18:00| 07:18:00| 5| 0| 0| 8591147|Zürich, Friedhof ...|47.3613418604422|8.60282411740221| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591162| 07:19:00| 07:19:00| 6| 0| 0| 8591162|Zürich, Glockenacker|47.3609767627537|8.59930272148798| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591261| 07:20:00| 07:20:00| 7| 0| 0| 8591261|Zürich, Loorenstr...|47.3598631991991|8.59452368417579| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591107| 07:21:00| 07:21:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...|47.3583236436636|8.58659156021591| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|171.TA.26-703-j19...|8591233| 07:27:00| 07:27:00| 9| 0| 0| 8591233| Zürich, Klusplatz|47.3640374201824|8.56649624730736| 26-703-j19-1| Zürich, Klusplatz| 9346| 1| 7| 07:12:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591825| 07:25:00| 07:25:00| 1| 0| 0| 8591825| Benglen, Bodenacher|47.3611288870976|8.63861299832652| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8590504| 07:26:00| 07:26:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...|47.3610862923255|8.63360938219328| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8596005| 07:29:00| 07:29:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...|47.3608915729295| 8.623476385787| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591832| 07:29:00| 07:29:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren|47.3626987847054|8.61754750491098| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591147| 07:31:00| 07:31:00| 5| 0| 0| 8591147|Zürich, Friedhof ...|47.3613418604422|8.60282411740221| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591162| 07:32:00| 07:32:00| 6| 0| 0| 8591162|Zürich, Glockenacker|47.3609767627537|8.59930272148798| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591261| 07:33:00| 07:33:00| 7| 0| 0| 8591261|Zürich, Loorenstr...|47.3598631991991|8.59452368417579| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591107| 07:34:00| 07:34:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...|47.3583236436636|8.58659156021591| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|155.TA.26-703-j19...|8591233| 07:40:00| 07:40:00| 9| 0| 0| 8591233| Zürich, Klusplatz|47.3640374201824|8.56649624730736| 26-703-j19-1| Zürich, Klusplatz| 9267| 1| 7| 07:25:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591825| 07:27:00| 07:27:00| 1| 0| 0| 8591825| Benglen, Bodenacher|47.3611288870976|8.63861299832652| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8590504| 07:28:00| 07:28:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...|47.3610862923255|8.63360938219328| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8596005| 07:31:00| 07:31:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...|47.3608915729295| 8.623476385787| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591832| 07:31:00| 07:31:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren|47.3626987847054|8.61754750491098| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591147| 07:33:00| 07:33:00| 5| 0| 0| 8591147|Zürich, Friedhof ...|47.3613418604422|8.60282411740221| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591162| 07:34:00| 07:34:00| 6| 0| 0| 8591162|Zürich, Glockenacker|47.3609767627537|8.59930272148798| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591261| 07:35:00| 07:35:00| 7| 0| 0| 8591261|Zürich, Loorenstr...|47.3598631991991|8.59452368417579| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591107| 07:36:00| 07:36:00| 8| 0| 0| 8591107|Zürich, Carl-Spit...|47.3583236436636|8.58659156021591| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|144.TA.26-703-j19...|8591233| 07:42:00| 07:42:00| 9| 0| 0| 8591233| Zürich, Klusplatz|47.3640374201824|8.56649624730736| 26-703-j19-1| Zürich, Klusplatz| 9231| 1| 7| 07:27:00| 6| 9|\n", + "|120.TA.26-703-j19...|8591825| 07:40:00| 07:40:00| 1| 0| 0| 8591825| Benglen, Bodenacher|47.3611288870976|8.63861299832652| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", + "|120.TA.26-703-j19...|8590504| 07:41:00| 07:41:00| 2| 0| 0| 8590504|Benglen, Gerlisbr...|47.3610862923255|8.63360938219328| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", + "|120.TA.26-703-j19...|8596005| 07:44:00| 07:44:00| 3| 0| 0| 8596005|Binz bei Maur, Tw...|47.3608915729295| 8.623476385787| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", + "|120.TA.26-703-j19...|8591832| 07:44:00| 07:44:00| 4| 0| 0| 8591832|Pfaffhausen, Müseren|47.3626987847054|8.61754750491098| 26-703-j19-1| Zürich, Klusplatz| 9159| 1| 7| 07:40:00| 6| 9|\n", + "+--------------------+-------+------------+--------------+-------------+-----------+-------------+---------------+--------------------+----------------+----------------+-------------+--------------------+---------------+------------+--------------+--------------------+---------+----------+\n", "only showing top 100 rows" ] } ], "source": [ "stop_times=stop_times.sort(stop_times.route_int.cast('int'), \n", " stop_times.departure_first_stop, \n", " stop_times.trip_id, \n", " stop_times.stop_sequence.cast('int'))\n", "stop_times.show(100)" ] }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times.write.csv('data/lgpt_guys/stop_times_with_route_int.csv', header=True, mode='overwrite')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Generating an index from 0 to n_stops-1 for stops:\n", "\n", "In RAPTOR, stops are indexed (in an arbitrary order) from 0 to the number of stops minus one. We generate this index below." ] }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times = spark.read.csv('data/lgpt_guys/stop_times_with_route_int.csv', header=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many unique routes do we find ?" ] }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "1461" ] } ], "source": [ "stop_times.select(stop_times.route_int).dropDuplicates().count()" ] }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+--------+---------------+\n", "|stop_int|stop_id_general|\n", "+--------+---------------+\n", - "| 0| 8502508|\n", - "| 1| 8503088|\n", - "| 2| 8503078|\n", - "| 3| 8591190|\n", + "| 0| 8503088|\n", + "| 1| 8502508|\n", + "| 2| 8591190|\n", + "| 3| 8591284|\n", "| 4| 8503376|\n", - "| 5| 8591284|\n", - "| 6| 8589111|\n", + "| 5| 8503078|\n", + "| 6| 8590819|\n", "| 7| 8587967|\n", - "| 8| 8590819|\n", + "| 8| 8589111|\n", "| 9| 8591362|\n", - "| 10| 8588312|\n", - "| 11| 8591149|\n", - "| 12| 8591315|\n", + "| 10| 8591149|\n", + "| 11| 8591315|\n", + "| 12| 8588312|\n", "| 13| 8590541|\n", "| 14| 8590804|\n", - "| 15| 8591053|\n", - "| 16| 8591271|\n", - "| 17| 8591085|\n", - "| 18| 8591165|\n", - "| 19| 8590273|\n", + "| 15| 8591165|\n", + "| 16| 8590273|\n", + "| 17| 8591080|\n", + "| 18| 8591271|\n", + "| 19| 8591053|\n", "+--------+---------------+\n", "only showing top 20 rows" ] } ], "source": [ "stops_general_indexed = dfZipWithIndex(stop_times.select(stop_times.stop_id_general).dropDuplicates(),\n", " 0,\n", " 'stop_int')\n", "stops_general_indexed.show()" ] }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stops_general_indexed.write.csv('data/lgpt_guys/stops_general_indexed.csv', header=True, mode='overwrite')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we add this index to `stop_times` and drop columns we won't be using anymore:\n", "- `pickup_type`\n", "- `drop_off_type`\n", "- `departure_hour`\n", "\n", "Note that spark does not maintain order after joins, therefore we will need to reorder stop_times after all the processing is done." ] }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stops_general_indexed = spark.read.csv('data/lgpt_guys/stops_general_indexed.csv', header=True)" ] }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------+-----------------+---------------+------------+--------------------+---------+----------+--------+\n", - "|stop_id_general| trip_id|stop_id|arrival_time|departure_time|stop_sequence| stop_name| route_id| trip_headsign|trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|\n", - "+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------+-----------------+---------------+------------+--------------------+---------+----------+--------+\n", - "| 8591310|535.TA.26-78-j19-...|8591310| 12:25:00| 12:25:00| 3| Zürich, Rautihalde|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 735|\n", - "| 8591345|535.TA.26-78-j19-...|8591345| 12:26:00| 12:26:00| 4|Zürich, Schulhaus...|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1248|\n", - "| 8591311|535.TA.26-78-j19-...|8591311| 12:27:00| 12:27:00| 5|Zürich, Rautistrasse|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 748|\n", - "| 8591258|535.TA.26-78-j19-...|8591258| 12:29:00| 12:29:00| 6| Zürich, Lindenplatz|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 298|\n", - "| 8591097|535.TA.26-78-j19-...|8591097| 12:30:00| 12:30:00| 7|Zürich, Bristenst...|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1373|\n", - "| 8591056|535.TA.26-78-j19-...|8591056| 12:32:00| 12:32:00| 8|Zürich Altstetten...|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 362|\n", - "| 8591167|535.TA.26-78-j19-...|8591167| 12:35:00| 12:35:00| 9|Zürich, Grünaustr...|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 766|\n", - "| 8591068|535.TA.26-78-j19-...|8591068| 12:36:00| 12:36:00| 10| Zürich, Bändliweg|26-78-j19-1|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1337|\n", - "| 8591116|534.TA.26-78-j19-...|8591116| 12:39:00| 12:39:00| 1|Zürich, Dunkelhölzli|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 30|\n", - "| 8591333|534.TA.26-78-j19-...|8591333| 12:39:00| 12:39:00| 2| Zürich, Salzweg|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 624|\n", - "| 8591310|534.TA.26-78-j19-...|8591310| 12:40:00| 12:40:00| 3| Zürich, Rautihalde|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 735|\n", - "| 8591345|534.TA.26-78-j19-...|8591345| 12:41:00| 12:41:00| 4|Zürich, Schulhaus...|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1248|\n", - "| 8591311|534.TA.26-78-j19-...|8591311| 12:42:00| 12:42:00| 5|Zürich, Rautistrasse|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 748|\n", - "| 8591258|534.TA.26-78-j19-...|8591258| 12:44:00| 12:44:00| 6| Zürich, Lindenplatz|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 298|\n", - "| 8591097|534.TA.26-78-j19-...|8591097| 12:45:00| 12:45:00| 7|Zürich, Bristenst...|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1373|\n", - "| 8591056|534.TA.26-78-j19-...|8591056| 12:47:00| 12:47:00| 8|Zürich Altstetten...|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 362|\n", - "| 8591167|534.TA.26-78-j19-...|8591167| 12:50:00| 12:50:00| 9|Zürich, Grünaustr...|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 766|\n", - "| 8591068|534.TA.26-78-j19-...|8591068| 12:51:00| 12:51:00| 10| Zürich, Bändliweg|26-78-j19-1|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1337|\n", - "| 8591116|533.TA.26-78-j19-...|8591116| 12:54:00| 12:54:00| 1|Zürich, Dunkelhölzli|26-78-j19-1|Zürich, Bändliweg| 2807| 0| 12:54:00| 826| 10| 30|\n", - "| 8591333|533.TA.26-78-j19-...|8591333| 12:54:00| 12:54:00| 2| Zürich, Salzweg|26-78-j19-1|Zürich, Bändliweg| 2807| 0| 12:54:00| 826| 10| 624|\n", - "+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------+-----------------+---------------+------------+--------------------+---------+----------+--------+\n", + "+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+------------+----------------+---------------+------------+--------------------+---------+----------+--------+\n", + "|stop_id_general| trip_id| stop_id|arrival_time|departure_time|stop_sequence| stop_name| stop_lat| stop_lon| route_id| trip_headsign|trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|\n", + "+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+------------+----------------+---------------+------------+--------------------+---------+----------+--------+\n", + "| 8503086|127.TA.26-4-B-j19...| 8503086| 08:14:00| 08:14:00| 5| Zürich Brunau| 47.352122370277|8.52623375626752|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 1373|\n", + "| 8503093|127.TA.26-4-B-j19...| 8503093| 08:17:00| 08:17:00| 6| Zürich Manegg|47.3383783847121|8.51967605469254|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 510|\n", + "| 8503094|127.TA.26-4-B-j19...| 8503094| 08:18:00| 08:18:00| 7| Zürich Leimbach|47.3346039449498| 8.5196041894698|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 533|\n", + "| 8503095|127.TA.26-4-B-j19...| 8503095| 08:21:00| 08:21:00| 8| Sood-Oberleimbach|47.3195704752201|8.52143675264966|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 1343|\n", + "| 8503096|127.TA.26-4-B-j19...| 8503096| 08:23:00| 08:24:00| 9| Adliswil|47.3123048960724|8.52416763111376|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 239|\n", + "| 8503097|127.TA.26-4-B-j19...| 8503097| 08:30:00| 08:30:00| 10| Langnau-Gattikon|47.2868766420081|8.54402039889557|26-4-B-j19-1|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 669|\n", + "| 8503088|128.TA.26-4-B-j19...|8503088:0:21| 08:28:00| 08:28:00| 1| Zürich HB SZU|47.3775557344462|8.53916949636064|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 0|\n", + "| 8503090|128.TA.26-4-B-j19...| 8503090| 08:29:00| 08:29:00| 2| Zürich Selnau|47.3729384820921|8.53203687300374|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 48|\n", + "| 8503091|128.TA.26-4-B-j19...| 8503091| 08:31:00| 08:31:00| 3| Zürich Giesshübel|47.3624553927874|8.52184997768041|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 114|\n", + "| 8503087|128.TA.26-4-B-j19...| 8503087| 08:33:00| 08:33:00| 4|Zürich Saalsporth...| 47.357404757095|8.52214642172421|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 262|\n", + "| 8503086|128.TA.26-4-B-j19...| 8503086| 08:34:00| 08:34:00| 5| Zürich Brunau| 47.352122370277|8.52623375626752|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 1373|\n", + "| 8503093|128.TA.26-4-B-j19...| 8503093| 08:37:00| 08:37:00| 6| Zürich Manegg|47.3383783847121|8.51967605469254|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 510|\n", + "| 8503094|128.TA.26-4-B-j19...| 8503094| 08:38:00| 08:38:00| 7| Zürich Leimbach|47.3346039449498| 8.5196041894698|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 533|\n", + "| 8503095|128.TA.26-4-B-j19...| 8503095| 08:41:00| 08:41:00| 8| Sood-Oberleimbach|47.3195704752201|8.52143675264966|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 1343|\n", + "| 8503096|128.TA.26-4-B-j19...| 8503096| 08:43:00| 08:44:00| 9| Adliswil|47.3123048960724|8.52416763111376|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 239|\n", + "| 8503097|128.TA.26-4-B-j19...| 8503097| 08:50:00| 08:50:00| 10| Langnau-Gattikon|47.2868766420081|8.54402039889557|26-4-B-j19-1|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 669|\n", + "| 8503855|294.TA.26-134-j19...| 8503855:0:B| 07:04:00| 07:04:00| 1| Horgen, Bahnhof|47.2619787396278|8.59697608490178|26-134-j19-1|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 49|\n", + "| 8577912|294.TA.26-134-j19...| 8577912| 07:06:00| 07:06:00| 2|Horgen, untere Mühle|47.2591865186515|8.59809897900709|26-134-j19-1|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 247|\n", + "| 8590663|294.TA.26-134-j19...| 8590663| 07:07:00| 07:07:00| 3| Horgen, Wannenthal|47.2565465760621|8.60232106084304|26-134-j19-1|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 1334|\n", + "| 8590661|294.TA.26-134-j19...| 8590661| 07:08:00| 07:08:00| 4| Horgen, Teufenbach| 47.256253918433|8.60507888876567|26-134-j19-1|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 356|\n", + "+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+------------+----------------+---------------+------------+--------------------+---------+----------+--------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times = stop_times.join(stops_general_indexed, how='inner', on='stop_id_general')\\\n", ".drop('pickup_type', 'drop_off_type', 'departure_hour')\n", "stop_times.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Adding transport types to stop_times from routes.txt" ] }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+---------+----------------+---------------+----------+----------+\n", "| route_id|agency_id|route_short_name|route_long_name|route_desc|route_type|\n", "+-----------+---------+----------------+---------------+----------+----------+\n", "|11-40-j19-1| 801| 040| null| Bus| 700|\n", "|11-61-j19-1| 7031| 061| null| Bus| 700|\n", "|11-62-j19-1| 7031| 062| null| Bus| 700|\n", "|24-64-j19-1| 801| 064| null| Bus| 700|\n", "|11-83-j19-1| 801| 083| null| Bus| 700|\n", "|1-1-B-j19-1| 11| 1| null| S-Bahn| 400|\n", "|1-1-A-j19-1| 11| 1| null| S-Bahn| 400|\n", "|1-1-C-j19-1| 723| 1| null| Bus| 700|\n", "|1-1-D-j19-1| 840| 1| null| Bus| 700|\n", "|1-1-E-j19-1| 886| 1| null| Bus| 700|\n", "| 1-1-j19-1| 11| 1| null| Intercity| 102|\n", "| 4-1-j19-1| 11| 1| null| S-Bahn| 400|\n", "| 5-1-j19-1| 823| 1| null| Tram| 900|\n", "|6-1-A-j19-1| 146| 1| null| Bus| 700|\n", "|6-1-B-j19-1| 33| 1| null| S-Bahn| 400|\n", "|6-1-C-j19-1| 801| 1| null| Bus| 700|\n", "|6-1-D-j19-1| 889| 1| null| Bus| 700|\n", "|6-1-E-j19-1| 889| 1| null| Bus| 700|\n", "| 6-1-j19-1| 11| 1| null| Intercity| 102|\n", "|8-1-A-j19-1| 834| 1| null| Bus| 700|\n", "+-----------+---------+----------------+---------------+----------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "routes = spark.read.csv(\"/data/sbb/timetables/csv/routes/2019/05/14/routes.txt\", header=True, sep = \",\")\n", "routes.show()" ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "+-----------+----------+\n", "| route_id|route_desc|\n", "+-----------+----------+\n", "|11-40-j19-1| Bus|\n", "|11-61-j19-1| Bus|\n", "|11-62-j19-1| Bus|\n", "|24-64-j19-1| Bus|\n", "|11-83-j19-1| Bus|\n", "|1-1-B-j19-1| S-Bahn|\n", "|1-1-A-j19-1| S-Bahn|\n", "|1-1-C-j19-1| Bus|\n", "|1-1-D-j19-1| Bus|\n", "|1-1-E-j19-1| Bus|\n", "| 1-1-j19-1| Intercity|\n", "| 4-1-j19-1| S-Bahn|\n", "| 5-1-j19-1| Tram|\n", "|6-1-A-j19-1| Bus|\n", "|6-1-B-j19-1| S-Bahn|\n", "|6-1-C-j19-1| Bus|\n", "|6-1-D-j19-1| Bus|\n", "|6-1-E-j19-1| Bus|\n", "| 6-1-j19-1| Intercity|\n", "|8-1-A-j19-1| Bus|\n", "+-----------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "routes_for_join = routes.select(routes.route_id, routes.route_desc)\n", "routes_for_join.show()" ] }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+-----------+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "| route_id|stop_id_general| trip_id|stop_id|arrival_time|departure_time|stop_sequence| stop_name| trip_headsign|trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", - "+-----------+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|26-78-j19-1| 8591310|535.TA.26-78-j19-...|8591310| 12:25:00| 12:25:00| 3| Zürich, Rautihalde|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 735| Bus|\n", - "|26-78-j19-1| 8591345|535.TA.26-78-j19-...|8591345| 12:26:00| 12:26:00| 4|Zürich, Schulhaus...|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1248| Bus|\n", - "|26-78-j19-1| 8591311|535.TA.26-78-j19-...|8591311| 12:27:00| 12:27:00| 5|Zürich, Rautistrasse|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 748| Bus|\n", - "|26-78-j19-1| 8591258|535.TA.26-78-j19-...|8591258| 12:29:00| 12:29:00| 6| Zürich, Lindenplatz|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 298| Bus|\n", - "|26-78-j19-1| 8591097|535.TA.26-78-j19-...|8591097| 12:30:00| 12:30:00| 7|Zürich, Bristenst...|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1373| Bus|\n", - "|26-78-j19-1| 8591056|535.TA.26-78-j19-...|8591056| 12:32:00| 12:32:00| 8|Zürich Altstetten...|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 362| Bus|\n", - "|26-78-j19-1| 8591167|535.TA.26-78-j19-...|8591167| 12:35:00| 12:35:00| 9|Zürich, Grünaustr...|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 766| Bus|\n", - "|26-78-j19-1| 8591068|535.TA.26-78-j19-...|8591068| 12:36:00| 12:36:00| 10| Zürich, Bändliweg|Zürich, Bändliweg| 2812| 0| 12:24:00| 826| 10| 1337| Bus|\n", - "|26-78-j19-1| 8591116|534.TA.26-78-j19-...|8591116| 12:39:00| 12:39:00| 1|Zürich, Dunkelhölzli|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 30| Bus|\n", - "|26-78-j19-1| 8591333|534.TA.26-78-j19-...|8591333| 12:39:00| 12:39:00| 2| Zürich, Salzweg|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 624| Bus|\n", - "|26-78-j19-1| 8591310|534.TA.26-78-j19-...|8591310| 12:40:00| 12:40:00| 3| Zürich, Rautihalde|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 735| Bus|\n", - "|26-78-j19-1| 8591345|534.TA.26-78-j19-...|8591345| 12:41:00| 12:41:00| 4|Zürich, Schulhaus...|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1248| Bus|\n", - "|26-78-j19-1| 8591311|534.TA.26-78-j19-...|8591311| 12:42:00| 12:42:00| 5|Zürich, Rautistrasse|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 748| Bus|\n", - "|26-78-j19-1| 8591258|534.TA.26-78-j19-...|8591258| 12:44:00| 12:44:00| 6| Zürich, Lindenplatz|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 298| Bus|\n", - "|26-78-j19-1| 8591097|534.TA.26-78-j19-...|8591097| 12:45:00| 12:45:00| 7|Zürich, Bristenst...|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1373| Bus|\n", - "|26-78-j19-1| 8591056|534.TA.26-78-j19-...|8591056| 12:47:00| 12:47:00| 8|Zürich Altstetten...|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 362| Bus|\n", - "|26-78-j19-1| 8591167|534.TA.26-78-j19-...|8591167| 12:50:00| 12:50:00| 9|Zürich, Grünaustr...|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 766| Bus|\n", - "|26-78-j19-1| 8591068|534.TA.26-78-j19-...|8591068| 12:51:00| 12:51:00| 10| Zürich, Bändliweg|Zürich, Bändliweg| 2811| 0| 12:39:00| 826| 10| 1337| Bus|\n", - "|26-78-j19-1| 8591116|533.TA.26-78-j19-...|8591116| 12:54:00| 12:54:00| 1|Zürich, Dunkelhölzli|Zürich, Bändliweg| 2807| 0| 12:54:00| 826| 10| 30| Bus|\n", - "|26-78-j19-1| 8591333|533.TA.26-78-j19-...|8591333| 12:54:00| 12:54:00| 2| Zürich, Salzweg|Zürich, Bändliweg| 2807| 0| 12:54:00| 826| 10| 624| Bus|\n", - "+-----------+---------------+--------------------+-------+------------+--------------+-------------+--------------------+-----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "+------------+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "| route_id|stop_id_general| trip_id| stop_id|arrival_time|departure_time|stop_sequence| stop_name| stop_lat| stop_lon| trip_headsign|trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", + "+------------+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|26-4-B-j19-1| 8503086|127.TA.26-4-B-j19...| 8503086| 08:14:00| 08:14:00| 5| Zürich Brunau| 47.352122370277|8.52623375626752|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 1373| S-Bahn|\n", + "|26-4-B-j19-1| 8503093|127.TA.26-4-B-j19...| 8503093| 08:17:00| 08:17:00| 6| Zürich Manegg|47.3383783847121|8.51967605469254|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 510| S-Bahn|\n", + "|26-4-B-j19-1| 8503094|127.TA.26-4-B-j19...| 8503094| 08:18:00| 08:18:00| 7| Zürich Leimbach|47.3346039449498| 8.5196041894698|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 533| S-Bahn|\n", + "|26-4-B-j19-1| 8503095|127.TA.26-4-B-j19...| 8503095| 08:21:00| 08:21:00| 8| Sood-Oberleimbach|47.3195704752201|8.52143675264966|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 1343| S-Bahn|\n", + "|26-4-B-j19-1| 8503096|127.TA.26-4-B-j19...| 8503096| 08:23:00| 08:24:00| 9| Adliswil|47.3123048960724|8.52416763111376|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 239| S-Bahn|\n", + "|26-4-B-j19-1| 8503097|127.TA.26-4-B-j19...| 8503097| 08:30:00| 08:30:00| 10| Langnau-Gattikon|47.2868766420081|8.54402039889557|Langnau-Gattikon| 12473| 0| 08:08:00| 1316| 10| 669| S-Bahn|\n", + "|26-4-B-j19-1| 8503088|128.TA.26-4-B-j19...|8503088:0:21| 08:28:00| 08:28:00| 1| Zürich HB SZU|47.3775557344462|8.53916949636064|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 0| S-Bahn|\n", + "|26-4-B-j19-1| 8503090|128.TA.26-4-B-j19...| 8503090| 08:29:00| 08:29:00| 2| Zürich Selnau|47.3729384820921|8.53203687300374|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 48| S-Bahn|\n", + "|26-4-B-j19-1| 8503091|128.TA.26-4-B-j19...| 8503091| 08:31:00| 08:31:00| 3| Zürich Giesshübel|47.3624553927874|8.52184997768041|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 114| S-Bahn|\n", + "|26-4-B-j19-1| 8503087|128.TA.26-4-B-j19...| 8503087| 08:33:00| 08:33:00| 4|Zürich Saalsporth...| 47.357404757095|8.52214642172421|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 262| S-Bahn|\n", + "|26-4-B-j19-1| 8503086|128.TA.26-4-B-j19...| 8503086| 08:34:00| 08:34:00| 5| Zürich Brunau| 47.352122370277|8.52623375626752|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 1373| S-Bahn|\n", + "|26-4-B-j19-1| 8503093|128.TA.26-4-B-j19...| 8503093| 08:37:00| 08:37:00| 6| Zürich Manegg|47.3383783847121|8.51967605469254|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 510| S-Bahn|\n", + "|26-4-B-j19-1| 8503094|128.TA.26-4-B-j19...| 8503094| 08:38:00| 08:38:00| 7| Zürich Leimbach|47.3346039449498| 8.5196041894698|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 533| S-Bahn|\n", + "|26-4-B-j19-1| 8503095|128.TA.26-4-B-j19...| 8503095| 08:41:00| 08:41:00| 8| Sood-Oberleimbach|47.3195704752201|8.52143675264966|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 1343| S-Bahn|\n", + "|26-4-B-j19-1| 8503096|128.TA.26-4-B-j19...| 8503096| 08:43:00| 08:44:00| 9| Adliswil|47.3123048960724|8.52416763111376|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 239| S-Bahn|\n", + "|26-4-B-j19-1| 8503097|128.TA.26-4-B-j19...| 8503097| 08:50:00| 08:50:00| 10| Langnau-Gattikon|47.2868766420081|8.54402039889557|Langnau-Gattikon| 12477| 0| 08:28:00| 1316| 10| 669| S-Bahn|\n", + "|26-134-j19-1| 8503855|294.TA.26-134-j19...| 8503855:0:B| 07:04:00| 07:04:00| 1| Horgen, Bahnhof|47.2619787396278|8.59697608490178|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 49| Bus|\n", + "|26-134-j19-1| 8577912|294.TA.26-134-j19...| 8577912| 07:06:00| 07:06:00| 2|Horgen, untere Mühle|47.2591865186515|8.59809897900709|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 247| Bus|\n", + "|26-134-j19-1| 8590663|294.TA.26-134-j19...| 8590663| 07:07:00| 07:07:00| 3| Horgen, Wannenthal|47.2565465760621|8.60232106084304|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 1334| Bus|\n", + "|26-134-j19-1| 8590661|294.TA.26-134-j19...| 8590661| 07:08:00| 07:08:00| 4| Horgen, Teufenbach| 47.256253918433|8.60507888876567|Horgen, Risi/Dow| 2960| 0| 07:04:00| 1317| 6| 356| Bus|\n", + "+------------+---------------+--------------------+------------+------------+--------------+-------------+--------------------+----------------+----------------+----------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", "only showing top 20 rows" ] } ], "source": [ "stop_times = stop_times.join(routes_for_join, how='inner', on='route_id')\n", "stop_times.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## VERY IMPORTANT: final sort before saving to csv" ] }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|route_id |stop_id_general|trip_id |stop_id|arrival_time|departure_time|stop_sequence|stop_name |trip_headsign |trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", - "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|26-10-j19-1 |8573205 |1672.TA.26-10-j19-1.11.R|8573205|07:00:00 |07:01:00 |27 |Zürich Flughafen, Bahnhof |Zürich Flughafen, Fracht |4096 |1 |07:01:00 |0 |2 |300 |Tram |\n", - "|26-10-j19-1 |8588553 |1672.TA.26-10-j19-1.11.R|8588553|07:02:00 |07:02:00 |28 |Zürich Flughafen, Fracht |Zürich Flughafen, Fracht |4096 |1 |07:01:00 |0 |2 |1294 |Tram |\n", - "|26-11-A-j19-1|8591049 |791.TA.26-11-A-j19-1.3.H|8591049|19:49:00 |19:49:00 |1 |Zürich, Auzelg |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |1117 |Tram |\n", - "|26-11-A-j19-1|8591128 |791.TA.26-11-A-j19-1.3.H|8591128|19:51:00 |19:51:00 |2 |Zürich, Fernsehstudio |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |148 |Tram |\n", - "|26-11-A-j19-1|8591830 |791.TA.26-11-A-j19-1.3.H|8591830|19:52:00 |19:52:00 |3 |Glattpark, Glattpark |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |670 |Tram |\n", - "|26-11-A-j19-1|8591294 |791.TA.26-11-A-j19-1.3.H|8591294|19:53:00 |19:53:00 |4 |Zürich, Oerlikerhus |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |569 |Tram |\n", - "|26-11-A-j19-1|8591256 |791.TA.26-11-A-j19-1.3.H|8591256|19:54:00 |19:54:00 |5 |Zürich, Leutschenbach |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |443 |Tram |\n", - "|26-11-A-j19-1|8591273 |791.TA.26-11-A-j19-1.3.H|8591273|19:55:00 |19:55:00 |6 |Zürich, Messe/Hallenstadion |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |388 |Tram |\n", - "|26-11-A-j19-1|8591382 |791.TA.26-11-A-j19-1.3.H|8591382|19:57:00 |19:57:00 |7 |Zürich, Sternen Oerlikon |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |686 |Tram |\n", - "|26-11-A-j19-1|8580449 |791.TA.26-11-A-j19-1.3.H|8580449|19:59:00 |19:59:00 |8 |Zürich Oerlikon, Bahnhof |Zürich, Rehalp |363 |0 |19:49:00 |1 |8 |767 |Tram |\n", - "|26-304-j19-1 |8591057 |159.TA.26-304-j19-1.4.R |8591057|19:39:00 |19:39:00 |1 |Zürich Altstetten, Bahnhof N |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |519 |Bus |\n", - "|26-304-j19-1 |8591402 |159.TA.26-304-j19-1.4.R |8591402|19:41:00 |19:41:00 |2 |Zürich, Tüffenwies |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |999 |Bus |\n", - "|26-304-j19-1 |8591434 |159.TA.26-304-j19-1.4.R |8591434|19:41:00 |19:41:00 |3 |Zürich, Winzerhalde |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |710 |Bus |\n", - "|26-304-j19-1 |8591197 |159.TA.26-304-j19-1.4.R |8591197|19:42:00 |19:42:00 |4 |Zürich, Hohenklingensteig |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |1124 |Bus |\n", - "|26-304-j19-1 |8591436 |159.TA.26-304-j19-1.4.R |8591436|19:43:00 |19:43:00 |5 |Zürich, Winzerstrasse Süd |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |146 |Bus |\n", - "|26-304-j19-1 |8591136 |159.TA.26-304-j19-1.4.R |8591136|19:46:00 |19:46:00 |6 |Zürich, Frankental |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |687 |Bus |\n", - "|26-304-j19-1 |8590725 |159.TA.26-304-j19-1.4.R |8590725|19:47:00 |19:47:00 |7 |Oberengstringen, Eggbühl |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |1328 |Bus |\n", - "|26-304-j19-1 |8590726 |159.TA.26-304-j19-1.4.R |8590726|19:48:00 |19:48:00 |8 |Oberengstringen, Lanzrain |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |764 |Bus |\n", - "|26-304-j19-1 |8590728 |159.TA.26-304-j19-1.4.R |8590728|19:49:00 |19:49:00 |9 |Oberengstringen, Zentrum |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |375 |Bus |\n", - "|26-304-j19-1 |8590727 |159.TA.26-304-j19-1.4.R |8590727|19:50:00 |19:50:00 |10 |Oberengstringen, Paradies |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |737 |Bus |\n", - "|26-304-j19-1 |8590833 |159.TA.26-304-j19-1.4.R |8590833|19:51:00 |19:51:00 |11 |Unterengstringen, Langacher |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |761 |Bus |\n", - "|26-304-j19-1 |8594732 |159.TA.26-304-j19-1.4.R |8594732|19:53:00 |19:53:00 |12 |Unterengstringen, Sennenbüel N|Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |990 |Bus |\n", - "|26-304-j19-1 |8590831 |159.TA.26-304-j19-1.4.R |8590831|19:53:00 |19:53:00 |13 |Unterengstringen, Aegelsee |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |502 |Bus |\n", - "|26-304-j19-1 |8590911 |159.TA.26-304-j19-1.4.R |8590911|19:55:00 |19:55:00 |14 |Weiningen ZH, Ausserdorf |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |754 |Bus |\n", - "|26-304-j19-1 |8590913 |159.TA.26-304-j19-1.4.R |8590913|19:56:00 |19:56:00 |15 |Weiningen ZH, Lindenplatz |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |932 |Bus |\n", - "|26-304-j19-1 |8590914 |159.TA.26-304-j19-1.4.R |8590914|19:57:00 |19:57:00 |16 |Weiningen ZH, Schulhaus |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |623 |Bus |\n", - "|26-304-j19-1 |8590617 |159.TA.26-304-j19-1.4.R |8590617|19:59:00 |19:59:00 |17 |Geroldswil, Welbrig |Dietikon, Bahnhof |5481 |1 |19:39:00 |2 |17 |856 |Bus |\n", - "|26-61-j19-1 |8591281 |269.TA.26-61-j19-1.1.H |8591281|19:57:00 |19:57:00 |1 |Zürich, Mühlacker |Zürich, Schwamendingerplatz|2076 |0 |19:57:00 |3 |2 |207 |Bus |\n", - "|26-61-j19-1 |8591046 |269.TA.26-61-j19-1.1.H |8591046|19:58:00 |19:58:00 |2 |Zürich, Aspholz |Zürich, Schwamendingerplatz|2076 |0 |19:57:00 |3 |2 |1000 |Bus |\n", - "|26-13-j19-1 |8576240 |2064.TA.26-13-j19-1.24.H|8576240|07:00:00 |07:00:00 |5 |Zürich, Meierhofplatz |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1222 |Tram |\n", - "|26-13-j19-1 |8591353 |2064.TA.26-13-j19-1.24.H|8591353|07:01:00 |07:01:00 |6 |Zürich, Schwert |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |814 |Tram |\n", - "|26-13-j19-1 |8591039 |2064.TA.26-13-j19-1.24.H|8591039|07:02:00 |07:02:00 |7 |Zürich, Alte Trotte |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |774 |Tram |\n", - "|26-13-j19-1 |8591121 |2064.TA.26-13-j19-1.24.H|8591121|07:03:00 |07:03:00 |8 |Zürich, Eschergutweg |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |305 |Tram |\n", - "|26-13-j19-1 |8591417 |2064.TA.26-13-j19-1.24.H|8591417|07:05:00 |07:05:00 |9 |Zürich, Waidfussweg |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |347 |Tram |\n", - "|26-13-j19-1 |8591437 |2064.TA.26-13-j19-1.24.H|8591437|07:06:00 |07:06:00 |10 |Zürich, Wipkingerplatz |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1014 |Tram |\n", - "|26-13-j19-1 |8580522 |2064.TA.26-13-j19-1.24.H|8580522|07:08:00 |07:08:00 |11 |Zürich, Escher-Wyss-Platz |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |454 |Tram |\n", - "|26-13-j19-1 |8591110 |2064.TA.26-13-j19-1.24.H|8591110|07:09:00 |07:09:00 |12 |Zürich, Dammweg |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1101 |Tram |\n", - "|26-13-j19-1 |8591306 |2064.TA.26-13-j19-1.24.H|8591306|07:10:00 |07:10:00 |13 |Zürich, Quellenstrasse |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |789 |Tram |\n", - "|26-13-j19-1 |8591257 |2064.TA.26-13-j19-1.24.H|8591257|07:11:00 |07:11:00 |14 |Zürich, Limmatplatz |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |389 |Tram |\n", - "|26-13-j19-1 |8591282 |2064.TA.26-13-j19-1.24.H|8591282|07:12:00 |07:12:00 |15 |Zürich, Museum für Gestaltung |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |138 |Tram |\n", - "|26-13-j19-1 |8591368 |2064.TA.26-13-j19-1.24.H|8591368|07:14:00 |07:14:00 |16 |Zürich, Sihlquai/HB |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |883 |Tram |\n", - "|26-13-j19-1 |8587349 |2064.TA.26-13-j19-1.24.H|8587349|07:16:00 |07:16:00 |17 |Zürich, Bahnhofquai/HB |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |602 |Tram |\n", - "|26-13-j19-1 |8591067 |2064.TA.26-13-j19-1.24.H|8591067|07:18:00 |07:18:00 |18 |Zürich, Bahnhofstrasse/HB |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |614 |Tram |\n", - "|26-13-j19-1 |8591316 |2064.TA.26-13-j19-1.24.H|8591316|07:20:00 |07:20:00 |19 |Zürich, Rennweg |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |371 |Tram |\n", - "|26-13-j19-1 |8591299 |2064.TA.26-13-j19-1.24.H|8591299|07:22:00 |07:22:00 |20 |Zürich, Paradeplatz |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1221 |Tram |\n", - "|26-13-j19-1 |8591384 |2064.TA.26-13-j19-1.24.H|8591384|07:23:00 |07:23:00 |21 |Zürich, Stockerstrasse |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |871 |Tram |\n", - "|26-13-j19-1 |8591404 |2064.TA.26-13-j19-1.24.H|8591404|07:24:00 |07:24:00 |22 |Zürich, Tunnelstrasse |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |889 |Tram |\n", - "|26-13-j19-1 |8591059 |2064.TA.26-13-j19-1.24.H|8591059|07:25:00 |07:25:00 |23 |Zürich Enge, Bahnhof/Bederstr.|Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |175 |Tram |\n", - "|26-13-j19-1 |8591415 |2064.TA.26-13-j19-1.24.H|8591415|07:27:00 |07:27:00 |24 |Zürich, Waffenplatzstrasse |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1265 |Tram |\n", - "|26-13-j19-1 |8591366 |2064.TA.26-13-j19-1.24.H|8591366|07:28:00 |07:28:00 |25 |Zürich, Sihlcity Nord |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |968 |Tram |\n", - "|26-13-j19-1 |8591329 |2064.TA.26-13-j19-1.24.H|8591329|07:29:00 |07:29:00 |26 |Zürich, Saalsporthalle |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1239 |Tram |\n", - "|26-13-j19-1 |8591245 |2064.TA.26-13-j19-1.24.H|8591245|07:30:00 |07:30:00 |27 |Zürich, Laubegg |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1215 |Tram |\n", - "|26-13-j19-1 |8591405 |2064.TA.26-13-j19-1.24.H|8591405|07:32:00 |07:32:00 |28 |Zürich, Uetlihof |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |847 |Tram |\n", - "|26-13-j19-1 |8591385 |2064.TA.26-13-j19-1.24.H|8591385|07:33:00 |07:33:00 |29 |Zürich, Strassenverkehrsamt |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |274 |Tram |\n", - "|26-13-j19-1 |8591034 |2064.TA.26-13-j19-1.24.H|8591034|07:34:00 |07:34:00 |30 |Zürich, Albisgütli |Zürich, Albisgütli |1831 |0 |07:00:00 |4 |26 |1351 |Tram |\n", - "|26-70-A-j19-1|8591061 |966.TA.26-70-A-j19-1.5.H|8591061|07:00:00 |07:00:00 |9 |Zürich Leimbach, Bahnhof |Zürich, Mittelleimbach |3928 |0 |07:00:00 |5 |5 |1207 |Bus |\n", - "|26-70-A-j19-1|8591270 |966.TA.26-70-A-j19-1.5.H|8591270|07:02:00 |07:02:00 |10 |Zürich, Marbachweg |Zürich, Mittelleimbach |3928 |0 |07:00:00 |5 |5 |1200 |Bus |\n", - "|26-70-A-j19-1|8591210 |966.TA.26-70-A-j19-1.5.H|8591210|07:03:00 |07:03:00 |11 |Zürich, Im Hüsli |Zürich, Mittelleimbach |3928 |0 |07:00:00 |5 |5 |728 |Bus |\n", - "|26-70-A-j19-1|8591370 |966.TA.26-70-A-j19-1.5.H|8591370|07:03:00 |07:03:00 |12 |Zürich, Sihlweidstrasse |Zürich, Mittelleimbach |3928 |0 |07:00:00 |5 |5 |991 |Bus |\n", - "|26-70-A-j19-1|8591278 |966.TA.26-70-A-j19-1.5.H|8591278|07:04:00 |07:04:00 |13 |Zürich, Mittelleimbach |Zürich, Mittelleimbach |3928 |0 |07:00:00 |5 |5 |141 |Bus |\n", - "|26-703-j19-1 |8591825 |179.TA.26-703-j19-1.2.R |8591825|07:10:00 |07:10:00 |1 |Benglen, Bodenacher |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |584 |Bus |\n", - "|26-703-j19-1 |8590504 |179.TA.26-703-j19-1.2.R |8590504|07:11:00 |07:11:00 |2 |Benglen, Gerlisbrunnen |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |863 |Bus |\n", - "|26-703-j19-1 |8596005 |179.TA.26-703-j19-1.2.R |8596005|07:14:00 |07:14:00 |3 |Binz bei Maur, Twäracher |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1369 |Bus |\n", - "|26-703-j19-1 |8591832 |179.TA.26-703-j19-1.2.R |8591832|07:14:00 |07:14:00 |4 |Pfaffhausen, Müseren |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1024 |Bus |\n", - "|26-703-j19-1 |8591147 |179.TA.26-703-j19-1.2.R |8591147|07:16:00 |07:16:00 |5 |Zürich, Friedhof Witikon |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1260 |Bus |\n", - "|26-703-j19-1 |8591162 |179.TA.26-703-j19-1.2.R |8591162|07:17:00 |07:17:00 |6 |Zürich, Glockenacker |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |150 |Bus |\n", - "|26-703-j19-1 |8591261 |179.TA.26-703-j19-1.2.R |8591261|07:18:00 |07:18:00 |7 |Zürich, Loorenstrasse |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1198 |Bus |\n", - "|26-703-j19-1 |8591107 |179.TA.26-703-j19-1.2.R |8591107|07:19:00 |07:19:00 |8 |Zürich, Carl-Spitteler-Strasse|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1313 |Bus |\n", - "|26-703-j19-1 |8591233 |179.TA.26-703-j19-1.2.R |8591233|07:25:00 |07:25:00 |9 |Zürich, Klusplatz |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1133 |Bus |\n", - "|26-703-j19-1 |8591825 |171.TA.26-703-j19-1.2.R |8591825|07:12:00 |07:12:00 |1 |Benglen, Bodenacher |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |584 |Bus |\n", - "|26-703-j19-1 |8590504 |171.TA.26-703-j19-1.2.R |8590504|07:13:00 |07:13:00 |2 |Benglen, Gerlisbrunnen |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |863 |Bus |\n", - "|26-703-j19-1 |8596005 |171.TA.26-703-j19-1.2.R |8596005|07:16:00 |07:16:00 |3 |Binz bei Maur, Twäracher |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1369 |Bus |\n", - "|26-703-j19-1 |8591832 |171.TA.26-703-j19-1.2.R |8591832|07:16:00 |07:16:00 |4 |Pfaffhausen, Müseren |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1024 |Bus |\n", - "|26-703-j19-1 |8591147 |171.TA.26-703-j19-1.2.R |8591147|07:18:00 |07:18:00 |5 |Zürich, Friedhof Witikon |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1260 |Bus |\n", - "|26-703-j19-1 |8591162 |171.TA.26-703-j19-1.2.R |8591162|07:19:00 |07:19:00 |6 |Zürich, Glockenacker |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |150 |Bus |\n", - "|26-703-j19-1 |8591261 |171.TA.26-703-j19-1.2.R |8591261|07:20:00 |07:20:00 |7 |Zürich, Loorenstrasse |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1198 |Bus |\n", - "|26-703-j19-1 |8591107 |171.TA.26-703-j19-1.2.R |8591107|07:21:00 |07:21:00 |8 |Zürich, Carl-Spitteler-Strasse|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1313 |Bus |\n", - "|26-703-j19-1 |8591233 |171.TA.26-703-j19-1.2.R |8591233|07:27:00 |07:27:00 |9 |Zürich, Klusplatz |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1133 |Bus |\n", - "|26-703-j19-1 |8591825 |155.TA.26-703-j19-1.2.R |8591825|07:25:00 |07:25:00 |1 |Benglen, Bodenacher |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |584 |Bus |\n", - "|26-703-j19-1 |8590504 |155.TA.26-703-j19-1.2.R |8590504|07:26:00 |07:26:00 |2 |Benglen, Gerlisbrunnen |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |863 |Bus |\n", - "|26-703-j19-1 |8596005 |155.TA.26-703-j19-1.2.R |8596005|07:29:00 |07:29:00 |3 |Binz bei Maur, Twäracher |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1369 |Bus |\n", - "|26-703-j19-1 |8591832 |155.TA.26-703-j19-1.2.R |8591832|07:29:00 |07:29:00 |4 |Pfaffhausen, Müseren |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1024 |Bus |\n", - "|26-703-j19-1 |8591147 |155.TA.26-703-j19-1.2.R |8591147|07:31:00 |07:31:00 |5 |Zürich, Friedhof Witikon |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1260 |Bus |\n", - "|26-703-j19-1 |8591162 |155.TA.26-703-j19-1.2.R |8591162|07:32:00 |07:32:00 |6 |Zürich, Glockenacker |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |150 |Bus |\n", - "|26-703-j19-1 |8591261 |155.TA.26-703-j19-1.2.R |8591261|07:33:00 |07:33:00 |7 |Zürich, Loorenstrasse |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1198 |Bus |\n", - "|26-703-j19-1 |8591107 |155.TA.26-703-j19-1.2.R |8591107|07:34:00 |07:34:00 |8 |Zürich, Carl-Spitteler-Strasse|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1313 |Bus |\n", - "|26-703-j19-1 |8591233 |155.TA.26-703-j19-1.2.R |8591233|07:40:00 |07:40:00 |9 |Zürich, Klusplatz |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1133 |Bus |\n", - "|26-703-j19-1 |8591825 |144.TA.26-703-j19-1.2.R |8591825|07:27:00 |07:27:00 |1 |Benglen, Bodenacher |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |584 |Bus |\n", - "|26-703-j19-1 |8590504 |144.TA.26-703-j19-1.2.R |8590504|07:28:00 |07:28:00 |2 |Benglen, Gerlisbrunnen |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |863 |Bus |\n", - "|26-703-j19-1 |8596005 |144.TA.26-703-j19-1.2.R |8596005|07:31:00 |07:31:00 |3 |Binz bei Maur, Twäracher |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1369 |Bus |\n", - "|26-703-j19-1 |8591832 |144.TA.26-703-j19-1.2.R |8591832|07:31:00 |07:31:00 |4 |Pfaffhausen, Müseren |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1024 |Bus |\n", - "|26-703-j19-1 |8591147 |144.TA.26-703-j19-1.2.R |8591147|07:33:00 |07:33:00 |5 |Zürich, Friedhof Witikon |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1260 |Bus |\n", - "|26-703-j19-1 |8591162 |144.TA.26-703-j19-1.2.R |8591162|07:34:00 |07:34:00 |6 |Zürich, Glockenacker |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |150 |Bus |\n", - "|26-703-j19-1 |8591261 |144.TA.26-703-j19-1.2.R |8591261|07:35:00 |07:35:00 |7 |Zürich, Loorenstrasse |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1198 |Bus |\n", - "|26-703-j19-1 |8591107 |144.TA.26-703-j19-1.2.R |8591107|07:36:00 |07:36:00 |8 |Zürich, Carl-Spitteler-Strasse|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1313 |Bus |\n", - "|26-703-j19-1 |8591233 |144.TA.26-703-j19-1.2.R |8591233|07:42:00 |07:42:00 |9 |Zürich, Klusplatz |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1133 |Bus |\n", - "|26-703-j19-1 |8591825 |120.TA.26-703-j19-1.2.R |8591825|07:40:00 |07:40:00 |1 |Benglen, Bodenacher |Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |584 |Bus |\n", - "|26-703-j19-1 |8590504 |120.TA.26-703-j19-1.2.R |8590504|07:41:00 |07:41:00 |2 |Benglen, Gerlisbrunnen |Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |863 |Bus |\n", - "|26-703-j19-1 |8596005 |120.TA.26-703-j19-1.2.R |8596005|07:44:00 |07:44:00 |3 |Binz bei Maur, Twäracher |Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |1369 |Bus |\n", - "|26-703-j19-1 |8591832 |120.TA.26-703-j19-1.2.R |8591832|07:44:00 |07:44:00 |4 |Pfaffhausen, Müseren |Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |1024 |Bus |\n", - "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|route_id |stop_id_general|trip_id |stop_id|arrival_time|departure_time|stop_sequence|stop_name |stop_lat |stop_lon |trip_headsign |trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", + "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|26-10-j19-1 |8573205 |1672.TA.26-10-j19-1.11.R|8573205|07:00:00 |07:01:00 |27 |Zürich Flughafen, Bahnhof |47.4504413038344|8.56372943623189|Zürich Flughafen, Fracht |4096 |1 |07:01:00 |0 |2 |298 |Tram |\n", + "|26-10-j19-1 |8588553 |1672.TA.26-10-j19-1.11.R|8588553|07:02:00 |07:02:00 |28 |Zürich Flughafen, Fracht |47.4524944976638|8.57205681891684|Zürich Flughafen, Fracht |4096 |1 |07:01:00 |0 |2 |1295 |Tram |\n", + "|26-13-j19-1 |8576240 |2064.TA.26-13-j19-1.24.H|8576240|07:00:00 |07:00:00 |5 |Zürich, Meierhofplatz |47.4020100860391|8.49937412926861|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1222 |Tram |\n", + "|26-13-j19-1 |8591353 |2064.TA.26-13-j19-1.24.H|8591353|07:01:00 |07:01:00 |6 |Zürich, Schwert |47.3997299435837|8.50461130737576|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |816 |Tram |\n", + "|26-13-j19-1 |8591039 |2064.TA.26-13-j19-1.24.H|8591039|07:02:00 |07:02:00 |7 |Zürich, Alte Trotte |47.3977659017765|8.50725235431143|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |778 |Tram |\n", + "|26-13-j19-1 |8591121 |2064.TA.26-13-j19-1.24.H|8591121|07:03:00 |07:03:00 |8 |Zürich, Eschergutweg |47.3962700189648|8.51204037477646|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |313 |Tram |\n", + "|26-13-j19-1 |8591417 |2064.TA.26-13-j19-1.24.H|8591417|07:05:00 |07:05:00 |9 |Zürich, Waidfussweg |47.3954977376399|8.51840044698891|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |350 |Tram |\n", + "|26-13-j19-1 |8591437 |2064.TA.26-13-j19-1.24.H|8591437|07:06:00 |07:06:00 |10 |Zürich, Wipkingerplatz |47.3925909395293|8.52357474302616|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1019 |Tram |\n", + "|26-13-j19-1 |8580522 |2064.TA.26-13-j19-1.24.H|8580522|07:08:00 |07:08:00 |11 |Zürich, Escher-Wyss-Platz |47.3907969150758|8.5223979500038 |Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |454 |Tram |\n", + "|26-13-j19-1 |8591110 |2064.TA.26-13-j19-1.24.H|8591110|07:09:00 |07:09:00 |12 |Zürich, Dammweg |47.3884919601296|8.52639545301869|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1101 |Tram |\n", + "|26-13-j19-1 |8591306 |2064.TA.26-13-j19-1.24.H|8591306|07:10:00 |07:10:00 |13 |Zürich, Quellenstrasse |47.3867403702341|8.52874903906341|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |786 |Tram |\n", + "|26-13-j19-1 |8591257 |2064.TA.26-13-j19-1.24.H|8591257|07:11:00 |07:11:00 |14 |Zürich, Limmatplatz |47.3845994590919|8.53162364797299|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |388 |Tram |\n", + "|26-13-j19-1 |8591282 |2064.TA.26-13-j19-1.24.H|8591282|07:12:00 |07:12:00 |15 |Zürich, Museum für Gestaltung |47.3821239221899|8.53493843137185|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |138 |Tram |\n", + "|26-13-j19-1 |8591368 |2064.TA.26-13-j19-1.24.H|8591368|07:14:00 |07:14:00 |16 |Zürich, Sihlquai/HB |47.3798733332196|8.53760642776606|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |880 |Tram |\n", + "|26-13-j19-1 |8587349 |2064.TA.26-13-j19-1.24.H|8587349|07:16:00 |07:16:00 |17 |Zürich, Bahnhofquai/HB |47.3775618175159|8.54173867807358|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |602 |Tram |\n", + "|26-13-j19-1 |8591067 |2064.TA.26-13-j19-1.24.H|8591067|07:18:00 |07:18:00 |18 |Zürich, Bahnhofstrasse/HB |47.3765581015114|8.53994204750509|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |616 |Tram |\n", + "|26-13-j19-1 |8591316 |2064.TA.26-13-j19-1.24.H|8591316|07:20:00 |07:20:00 |19 |Zürich, Rennweg |47.3730662375955|8.53845982728609|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |375 |Tram |\n", + "|26-13-j19-1 |8591299 |2064.TA.26-13-j19-1.24.H|8591299|07:22:00 |07:22:00 |20 |Zürich, Paradeplatz |47.3693672863583|8.53876525448273|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1221 |Tram |\n", + "|26-13-j19-1 |8591384 |2064.TA.26-13-j19-1.24.H|8591384|07:23:00 |07:23:00 |21 |Zürich, Stockerstrasse |47.3677002399791|8.53501029659459|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |871 |Tram |\n", + "|26-13-j19-1 |8591404 |2064.TA.26-13-j19-1.24.H|8591404|07:24:00 |07:24:00 |22 |Zürich, Tunnelstrasse |47.3661426599847|8.53253094641008|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |888 |Tram |\n", + "|26-13-j19-1 |8591059 |2064.TA.26-13-j19-1.24.H|8591059|07:25:00 |07:25:00 |23 |Zürich Enge, Bahnhof/Bederstr.|47.3645546111557|8.53045583810347|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |175 |Tram |\n", + "|26-13-j19-1 |8591415 |2064.TA.26-13-j19-1.24.H|8591415|07:27:00 |07:27:00 |24 |Zürich, Waffenplatzstrasse |47.3614818138862|8.52574866601403|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1267 |Tram |\n", + "|26-13-j19-1 |8591366 |2064.TA.26-13-j19-1.24.H|8591366|07:28:00 |07:28:00 |25 |Zürich, Sihlcity Nord |47.3600640074787|8.52303575385561|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |968 |Tram |\n", + "|26-13-j19-1 |8591329 |2064.TA.26-13-j19-1.24.H|8591329|07:29:00 |07:29:00 |26 |Zürich, Saalsporthalle |47.3578611597087|8.52040369007277|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1236 |Tram |\n", + "|26-13-j19-1 |8591245 |2064.TA.26-13-j19-1.24.H|8591245|07:30:00 |07:30:00 |27 |Zürich, Laubegg |47.3587313564196|8.51708890667391|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1215 |Tram |\n", + "|26-13-j19-1 |8591405 |2064.TA.26-13-j19-1.24.H|8591405|07:32:00 |07:32:00 |28 |Zürich, Uetlihof |47.3567353594536|8.51396276948474|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |847 |Tram |\n", + "|26-13-j19-1 |8591385 |2064.TA.26-13-j19-1.24.H|8591385|07:33:00 |07:33:00 |29 |Zürich, Strassenverkehrsamt |47.3530717783138|8.51171698127413|Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |272 |Tram |\n", + "|26-13-j19-1 |8591034 |2064.TA.26-13-j19-1.24.H|8591034|07:34:00 |07:34:00 |30 |Zürich, Albisgütli |47.3519945640447|8.5077104951064 |Zürich, Albisgütli |1831 |0 |07:00:00 |1 |26 |1352 |Tram |\n", + "|26-11-A-j19-1|8591049 |791.TA.26-11-A-j19-1.3.H|8591049|19:49:00 |19:49:00 |1 |Zürich, Auzelg |47.4166918393693|8.568113214819 |Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |1117 |Tram |\n", + "|26-11-A-j19-1|8591128 |791.TA.26-11-A-j19-1.3.H|8591128|19:51:00 |19:51:00 |2 |Zürich, Fernsehstudio |47.4181749855684|8.56174415945371|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |152 |Tram |\n", + "|26-11-A-j19-1|8591830 |791.TA.26-11-A-j19-1.3.H|8591830|19:52:00 |19:52:00 |3 |Glattpark, Glattpark |47.4199559214972|8.55716275150406|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |672 |Tram |\n", + "|26-11-A-j19-1|8591294 |791.TA.26-11-A-j19-1.3.H|8591294|19:53:00 |19:53:00 |4 |Zürich, Oerlikerhus |47.4175853791724|8.5542072942189 |Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |571 |Tram |\n", + "|26-11-A-j19-1|8591256 |791.TA.26-11-A-j19-1.3.H|8591256|19:54:00 |19:54:00 |5 |Zürich, Leutschenbach |47.4146433269471|8.55130573585079|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |444 |Tram |\n", + "|26-11-A-j19-1|8591273 |791.TA.26-11-A-j19-1.3.H|8591273|19:55:00 |19:55:00 |6 |Zürich, Messe/Hallenstadion |47.4106919651348|8.55068589830466|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |389 |Tram |\n", + "|26-11-A-j19-1|8591382 |791.TA.26-11-A-j19-1.3.H|8591382|19:57:00 |19:57:00 |7 |Zürich, Sternen Oerlikon |47.4100718783688|8.54623025449481|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |688 |Tram |\n", + "|26-11-A-j19-1|8580449 |791.TA.26-11-A-j19-1.3.H|8580449|19:59:00 |19:59:00 |8 |Zürich Oerlikon, Bahnhof |47.411494419524 |8.54479295004002|Zürich, Rehalp |363 |0 |19:49:00 |2 |8 |766 |Tram |\n", + "|26-304-j19-1 |8591057 |159.TA.26-304-j19-1.4.R |8591057|19:39:00 |19:39:00 |1 |Zürich Altstetten, Bahnhof N |47.392067942097 |8.48990588617267|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |520 |Bus |\n", + "|26-304-j19-1 |8591402 |159.TA.26-304-j19-1.4.R |8591402|19:41:00 |19:41:00 |2 |Zürich, Tüffenwies |47.3979787271809|8.49434356367684|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |999 |Bus |\n", + "|26-304-j19-1 |8591434 |159.TA.26-304-j19-1.4.R |8591434|19:41:00 |19:41:00 |3 |Zürich, Winzerhalde |47.4000582901792|8.4945681424979 |Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |710 |Bus |\n", + "|26-304-j19-1 |8591197 |159.TA.26-304-j19-1.4.R |8591197|19:42:00 |19:42:00 |4 |Zürich, Hohenklingensteig |47.4013473348052|8.49021131336931|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |1123 |Bus |\n", + "|26-304-j19-1 |8591436 |159.TA.26-304-j19-1.4.R |8591436|19:43:00 |19:43:00 |5 |Zürich, Winzerstrasse Süd |47.403372044054 |8.486123978826 |Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |147 |Bus |\n", + "|26-304-j19-1 |8591136 |159.TA.26-304-j19-1.4.R |8591136|19:46:00 |19:46:00 |6 |Zürich, Frankental |47.4057006674825|8.48137189097235|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |689 |Bus |\n", + "|26-304-j19-1 |8590725 |159.TA.26-304-j19-1.4.R |8590725|19:47:00 |19:47:00 |7 |Oberengstringen, Eggbühl |47.4055243523393|8.47408655401713|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |1325 |Bus |\n", + "|26-304-j19-1 |8590726 |159.TA.26-304-j19-1.4.R |8590726|19:48:00 |19:48:00 |8 |Oberengstringen, Lanzrain |47.407342193939 |8.46795106062573|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |759 |Bus |\n", + "|26-304-j19-1 |8590728 |159.TA.26-304-j19-1.4.R |8590728|19:49:00 |19:49:00 |9 |Oberengstringen, Zentrum |47.4091295756792|8.46260608468448|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |373 |Bus |\n", + "|26-304-j19-1 |8590727 |159.TA.26-304-j19-1.4.R |8590727|19:50:00 |19:50:00 |10 |Oberengstringen, Paradies |47.4104852703573|8.45874332896223|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |735 |Bus |\n", + "|26-304-j19-1 |8590833 |159.TA.26-304-j19-1.4.R |8590833|19:51:00 |19:51:00 |11 |Unterengstringen, Langacher |47.4122360710415|8.45316479104707|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |760 |Bus |\n", + "|26-304-j19-1 |8594732 |159.TA.26-304-j19-1.4.R |8594732|19:53:00 |19:53:00 |12 |Unterengstringen, Sennenbüel N|47.4134944230824|8.44931101847766|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |987 |Bus |\n", + "|26-304-j19-1 |8590831 |159.TA.26-304-j19-1.4.R |8590831|19:53:00 |19:53:00 |13 |Unterengstringen, Aegelsee |47.414977659342 |8.44603216769017|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |503 |Bus |\n", + "|26-304-j19-1 |8590911 |159.TA.26-304-j19-1.4.R |8590911|19:55:00 |19:55:00 |14 |Weiningen ZH, Ausserdorf |47.4176826342903|8.43953734818508|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |751 |Bus |\n", + "|26-304-j19-1 |8590913 |159.TA.26-304-j19-1.4.R |8590913|19:56:00 |19:56:00 |15 |Weiningen ZH, Lindenplatz |47.4195547602987|8.43394084396424|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |933 |Bus |\n", + "|26-304-j19-1 |8590914 |159.TA.26-304-j19-1.4.R |8590914|19:57:00 |19:57:00 |16 |Weiningen ZH, Schulhaus |47.4183512583635|8.42866773324572|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |623 |Bus |\n", + "|26-304-j19-1 |8590617 |159.TA.26-304-j19-1.4.R |8590617|19:59:00 |19:59:00 |17 |Geroldswil, Welbrig |47.4180716529658|8.41906474285715|Dietikon, Bahnhof |5481 |1 |19:39:00 |3 |17 |856 |Bus |\n", + "|26-70-A-j19-1|8591061 |966.TA.26-70-A-j19-1.5.H|8591061|07:00:00 |07:00:00 |9 |Zürich Leimbach, Bahnhof |47.3332523864039|8.51859807635144|Zürich, Mittelleimbach |3928 |0 |07:00:00 |4 |5 |1203 |Bus |\n", + "|26-70-A-j19-1|8591270 |966.TA.26-70-A-j19-1.5.H|8591270|07:02:00 |07:02:00 |10 |Zürich, Marbachweg |47.3303482449491|8.51537312448101|Zürich, Mittelleimbach |3928 |0 |07:00:00 |4 |5 |1197 |Bus |\n", + "|26-70-A-j19-1|8591210 |966.TA.26-70-A-j19-1.5.H|8591210|07:03:00 |07:03:00 |11 |Zürich, Im Hüsli |47.3282354882425|8.51269614493396|Zürich, Mittelleimbach |3928 |0 |07:00:00 |4 |5 |723 |Bus |\n", + "|26-70-A-j19-1|8591370 |966.TA.26-70-A-j19-1.5.H|8591370|07:03:00 |07:03:00 |12 |Zürich, Sihlweidstrasse |47.3264149182794|8.51466345540645|Zürich, Mittelleimbach |3928 |0 |07:00:00 |4 |5 |989 |Bus |\n", + "|26-70-A-j19-1|8591278 |966.TA.26-70-A-j19-1.5.H|8591278|07:04:00 |07:04:00 |13 |Zürich, Mittelleimbach |47.3231389520848|8.51428616298707|Zürich, Mittelleimbach |3928 |0 |07:00:00 |4 |5 |139 |Bus |\n", + "|26-61-j19-1 |8591281 |269.TA.26-61-j19-1.1.H |8591281|19:57:00 |19:57:00 |1 |Zürich, Mühlacker |47.4256326325821|8.49799970688372|Zürich, Schwamendingerplatz|2076 |0 |19:57:00 |5 |2 |208 |Bus |\n", + "|26-61-j19-1 |8591046 |269.TA.26-61-j19-1.1.H |8591046|19:58:00 |19:58:00 |2 |Zürich, Aspholz |47.425085652811 |8.50058685490234|Zürich, Schwamendingerplatz|2076 |0 |19:57:00 |5 |2 |1002 |Bus |\n", + "|26-703-j19-1 |8591825 |179.TA.26-703-j19-1.2.R |8591825|07:10:00 |07:10:00 |1 |Benglen, Bodenacher |47.3611288870976|8.63861299832652|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |587 |Bus |\n", + "|26-703-j19-1 |8590504 |179.TA.26-703-j19-1.2.R |8590504|07:11:00 |07:11:00 |2 |Benglen, Gerlisbrunnen |47.3610862923255|8.63360938219328|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |865 |Bus |\n", + "|26-703-j19-1 |8596005 |179.TA.26-703-j19-1.2.R |8596005|07:14:00 |07:14:00 |3 |Binz bei Maur, Twäracher |47.3608915729295|8.623476385787 |Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1370 |Bus |\n", + "|26-703-j19-1 |8591832 |179.TA.26-703-j19-1.2.R |8591832|07:14:00 |07:14:00 |4 |Pfaffhausen, Müseren |47.3626987847054|8.61754750491098|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1024 |Bus |\n", + "|26-703-j19-1 |8591147 |179.TA.26-703-j19-1.2.R |8591147|07:16:00 |07:16:00 |5 |Zürich, Friedhof Witikon |47.3613418604422|8.60282411740221|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1263 |Bus |\n", + "|26-703-j19-1 |8591162 |179.TA.26-703-j19-1.2.R |8591162|07:17:00 |07:17:00 |6 |Zürich, Glockenacker |47.3609767627537|8.59930272148798|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |153 |Bus |\n", + "|26-703-j19-1 |8591261 |179.TA.26-703-j19-1.2.R |8591261|07:18:00 |07:18:00 |7 |Zürich, Loorenstrasse |47.3598631991991|8.59452368417579|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1199 |Bus |\n", + "|26-703-j19-1 |8591107 |179.TA.26-703-j19-1.2.R |8591107|07:19:00 |07:19:00 |8 |Zürich, Carl-Spitteler-Strasse|47.3583236436636|8.58659156021591|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1313 |Bus |\n", + "|26-703-j19-1 |8591233 |179.TA.26-703-j19-1.2.R |8591233|07:25:00 |07:25:00 |9 |Zürich, Klusplatz |47.3640374201824|8.56649624730736|Zürich, Klusplatz |9385 |1 |07:10:00 |6 |9 |1134 |Bus |\n", + "|26-703-j19-1 |8591825 |171.TA.26-703-j19-1.2.R |8591825|07:12:00 |07:12:00 |1 |Benglen, Bodenacher |47.3611288870976|8.63861299832652|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |587 |Bus |\n", + "|26-703-j19-1 |8590504 |171.TA.26-703-j19-1.2.R |8590504|07:13:00 |07:13:00 |2 |Benglen, Gerlisbrunnen |47.3610862923255|8.63360938219328|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |865 |Bus |\n", + "|26-703-j19-1 |8596005 |171.TA.26-703-j19-1.2.R |8596005|07:16:00 |07:16:00 |3 |Binz bei Maur, Twäracher |47.3608915729295|8.623476385787 |Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1370 |Bus |\n", + "|26-703-j19-1 |8591832 |171.TA.26-703-j19-1.2.R |8591832|07:16:00 |07:16:00 |4 |Pfaffhausen, Müseren |47.3626987847054|8.61754750491098|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1024 |Bus |\n", + "|26-703-j19-1 |8591147 |171.TA.26-703-j19-1.2.R |8591147|07:18:00 |07:18:00 |5 |Zürich, Friedhof Witikon |47.3613418604422|8.60282411740221|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1263 |Bus |\n", + "|26-703-j19-1 |8591162 |171.TA.26-703-j19-1.2.R |8591162|07:19:00 |07:19:00 |6 |Zürich, Glockenacker |47.3609767627537|8.59930272148798|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |153 |Bus |\n", + "|26-703-j19-1 |8591261 |171.TA.26-703-j19-1.2.R |8591261|07:20:00 |07:20:00 |7 |Zürich, Loorenstrasse |47.3598631991991|8.59452368417579|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1199 |Bus |\n", + "|26-703-j19-1 |8591107 |171.TA.26-703-j19-1.2.R |8591107|07:21:00 |07:21:00 |8 |Zürich, Carl-Spitteler-Strasse|47.3583236436636|8.58659156021591|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1313 |Bus |\n", + "|26-703-j19-1 |8591233 |171.TA.26-703-j19-1.2.R |8591233|07:27:00 |07:27:00 |9 |Zürich, Klusplatz |47.3640374201824|8.56649624730736|Zürich, Klusplatz |9346 |1 |07:12:00 |6 |9 |1134 |Bus |\n", + "|26-703-j19-1 |8591825 |155.TA.26-703-j19-1.2.R |8591825|07:25:00 |07:25:00 |1 |Benglen, Bodenacher |47.3611288870976|8.63861299832652|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |587 |Bus |\n", + "|26-703-j19-1 |8590504 |155.TA.26-703-j19-1.2.R |8590504|07:26:00 |07:26:00 |2 |Benglen, Gerlisbrunnen |47.3610862923255|8.63360938219328|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |865 |Bus |\n", + "|26-703-j19-1 |8596005 |155.TA.26-703-j19-1.2.R |8596005|07:29:00 |07:29:00 |3 |Binz bei Maur, Twäracher |47.3608915729295|8.623476385787 |Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1370 |Bus |\n", + "|26-703-j19-1 |8591832 |155.TA.26-703-j19-1.2.R |8591832|07:29:00 |07:29:00 |4 |Pfaffhausen, Müseren |47.3626987847054|8.61754750491098|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1024 |Bus |\n", + "|26-703-j19-1 |8591147 |155.TA.26-703-j19-1.2.R |8591147|07:31:00 |07:31:00 |5 |Zürich, Friedhof Witikon |47.3613418604422|8.60282411740221|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1263 |Bus |\n", + "|26-703-j19-1 |8591162 |155.TA.26-703-j19-1.2.R |8591162|07:32:00 |07:32:00 |6 |Zürich, Glockenacker |47.3609767627537|8.59930272148798|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |153 |Bus |\n", + "|26-703-j19-1 |8591261 |155.TA.26-703-j19-1.2.R |8591261|07:33:00 |07:33:00 |7 |Zürich, Loorenstrasse |47.3598631991991|8.59452368417579|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1199 |Bus |\n", + "|26-703-j19-1 |8591107 |155.TA.26-703-j19-1.2.R |8591107|07:34:00 |07:34:00 |8 |Zürich, Carl-Spitteler-Strasse|47.3583236436636|8.58659156021591|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1313 |Bus |\n", + "|26-703-j19-1 |8591233 |155.TA.26-703-j19-1.2.R |8591233|07:40:00 |07:40:00 |9 |Zürich, Klusplatz |47.3640374201824|8.56649624730736|Zürich, Klusplatz |9267 |1 |07:25:00 |6 |9 |1134 |Bus |\n", + "|26-703-j19-1 |8591825 |144.TA.26-703-j19-1.2.R |8591825|07:27:00 |07:27:00 |1 |Benglen, Bodenacher |47.3611288870976|8.63861299832652|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |587 |Bus |\n", + "|26-703-j19-1 |8590504 |144.TA.26-703-j19-1.2.R |8590504|07:28:00 |07:28:00 |2 |Benglen, Gerlisbrunnen |47.3610862923255|8.63360938219328|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |865 |Bus |\n", + "|26-703-j19-1 |8596005 |144.TA.26-703-j19-1.2.R |8596005|07:31:00 |07:31:00 |3 |Binz bei Maur, Twäracher |47.3608915729295|8.623476385787 |Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1370 |Bus |\n", + "|26-703-j19-1 |8591832 |144.TA.26-703-j19-1.2.R |8591832|07:31:00 |07:31:00 |4 |Pfaffhausen, Müseren |47.3626987847054|8.61754750491098|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1024 |Bus |\n", + "|26-703-j19-1 |8591147 |144.TA.26-703-j19-1.2.R |8591147|07:33:00 |07:33:00 |5 |Zürich, Friedhof Witikon |47.3613418604422|8.60282411740221|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1263 |Bus |\n", + "|26-703-j19-1 |8591162 |144.TA.26-703-j19-1.2.R |8591162|07:34:00 |07:34:00 |6 |Zürich, Glockenacker |47.3609767627537|8.59930272148798|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |153 |Bus |\n", + "|26-703-j19-1 |8591261 |144.TA.26-703-j19-1.2.R |8591261|07:35:00 |07:35:00 |7 |Zürich, Loorenstrasse |47.3598631991991|8.59452368417579|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1199 |Bus |\n", + "|26-703-j19-1 |8591107 |144.TA.26-703-j19-1.2.R |8591107|07:36:00 |07:36:00 |8 |Zürich, Carl-Spitteler-Strasse|47.3583236436636|8.58659156021591|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1313 |Bus |\n", + "|26-703-j19-1 |8591233 |144.TA.26-703-j19-1.2.R |8591233|07:42:00 |07:42:00 |9 |Zürich, Klusplatz |47.3640374201824|8.56649624730736|Zürich, Klusplatz |9231 |1 |07:27:00 |6 |9 |1134 |Bus |\n", + "|26-703-j19-1 |8591825 |120.TA.26-703-j19-1.2.R |8591825|07:40:00 |07:40:00 |1 |Benglen, Bodenacher |47.3611288870976|8.63861299832652|Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |587 |Bus |\n", + "|26-703-j19-1 |8590504 |120.TA.26-703-j19-1.2.R |8590504|07:41:00 |07:41:00 |2 |Benglen, Gerlisbrunnen |47.3610862923255|8.63360938219328|Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |865 |Bus |\n", + "|26-703-j19-1 |8596005 |120.TA.26-703-j19-1.2.R |8596005|07:44:00 |07:44:00 |3 |Binz bei Maur, Twäracher |47.3608915729295|8.623476385787 |Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |1370 |Bus |\n", + "|26-703-j19-1 |8591832 |120.TA.26-703-j19-1.2.R |8591832|07:44:00 |07:44:00 |4 |Pfaffhausen, Müseren |47.3626987847054|8.61754750491098|Zürich, Klusplatz |9159 |1 |07:40:00 |6 |9 |1024 |Bus |\n", + "+-------------+---------------+------------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+---------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", "only showing top 100 rows" ] } ], "source": [ "stop_times = stop_times.sort(stop_times.route_int.cast('int'), \n", " stop_times.departure_first_stop, \n", " stop_times.trip_id, \n", " stop_times.stop_sequence.cast('int'))\n", "stop_times.show(100, 0)" ] }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times.write.csv('data/lgpt_guys/stop_times_final_cyril.csv', header=True, mode = 'overwrite')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Footpaths\n", + "\n", + "We make the simplifying assumption that within stops sharing the same 7 first characters (`stop_id_general`) (almost the same as grouping them by parent stations, but more robust), transfer times take 2 minutes, no matter the stop. This may break for very large stations (such as Zürich HB).\n", + "\n", + "Between different `stop_id_general`, walking time is computed as the distance (which must be max. 500m) divided by a constant walking speed of 50 meters per minute.\n", + "\n", + "We only consider stops present in the final and filtered `stop_times` table.\n", + "\n", + "- Get all unique stop_int with a single pair of coordinates (first of the groupby, doesnt need to be dead precise)\n", + "\n", + "- join two copies of this dataframe\n", + "- drop lines where general_stop_id is the same\n", + "- compute the distance with geopy for all other lines between the pairs of coordinates\n", + "- filter based on distance <=500m\n", + "- transform distance to walking time in seconds\n", + "- order by stop_int1, then stop_int2\n", + "- save" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Building lookup tables to pretty-print results after RAPTOR:" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "stop_times = spark.read.csv('data/lgpt_guys/stop_times_final_cyril.csv', header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# lookup table for routes" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+---------+--------------+-------------+--------------------+\n", + "|route_int| route_id| route_desc| trip_headsign|\n", + "+---------+--------------+-------------+--------------------+\n", + "| 0| 26-10-j19-1| Tram|Zürich Flughafen,...|\n", + "| 1| 26-13-j19-1| Tram| Zürich, Albisgütli|\n", + "| 2| 26-11-A-j19-1| Tram| Zürich, Rehalp|\n", + "| 3| 26-304-j19-1| Bus| Dietikon, Bahnhof|\n", + "| 4| 26-70-A-j19-1| Bus|Zürich, Mittellei...|\n", + "| 5| 26-61-j19-1| Bus|Zürich, Schwamend...|\n", + "| 6| 26-703-j19-1| Bus| Zürich, Klusplatz|\n", + "| 7| 26-652-j19-1| Bus| Effretikon, Bahnhof|\n", + "| 8| 26-83-j19-1| Bus|Zürich Altstetten...|\n", + "| 9| 26-749-j19-1| Bus| Dietlikon, Bahnhof|\n", + "| 10| 26-24-j19-1| S-Bahn| Weinfelden|\n", + "| 11| 26-640-j19-1| Bus| Neschwil, Post|\n", + "| 12| 26-725-j19-1| Bus| Volketswil, Dorf|\n", + "| 13| 79-736-j19-1| Bus|Zürich Flughafen,...|\n", + "| 14| 26-24-j19-1| S-Bahn| Weinfelden|\n", + "| 15|79-373-2-j19-1| Schiff| Küsnacht ZSG|\n", + "| 16| 26-658-j19-1| Bus| Effretikon, Bahnhof|\n", + "| 17| 26-449-j19-1| Bus|Buchs-Dällikon, B...|\n", + "| 18| 26-303-j19-1| Bus| Killwangen, Bahnhof|\n", + "| 19| 26-17-j19-1| Tram|Zürich, Bahnhofpl...|\n", + "| 20| 26-7-A-j19-1| S-Bahn| Winterthur|\n", + "| 21| 26-24-j19-1| S-Bahn| Zug|\n", + "| 22| 26-720-j19-1| Bus| Effretikon, Bahnhof|\n", + "| 23| 26-145-j19-1| Bus| Thalwil, Zentrum|\n", + "| 24| 26-185-j19-1| Bus|Zürich Wollishofe...|\n", + "| 25| 26-14-j19-1| S-Bahn| Hinwil|\n", + "| 26| 26-8-A-j19-1| S-Bahn| Pfäffikon SZ|\n", + "| 27| 1-322-j19-1| Bus|Baden, Postautost...|\n", + "| 28|26-962-A-j19-1| Bus|Erlenbach ZH, Bah...|\n", + "| 29| 26-301-j19-1| Bus| Dietikon, Bahnhof|\n", + "| 30| 26-533-j19-1| Taxi|Niederhasli, Nass...|\n", + "| 31| 26-78-j19-1| Bus| Zürich, Bändliweg|\n", + "| 32| 26-4-j19-1| Tram|Zürich Altstetten...|\n", + "| 33| 26-89-j19-1| Bus| Zürich, Heizenholz|\n", + "| 34| 26-15-A-j19-1| Tram|Zürich, Bucheggplatz|\n", + "| 35| 26-25-A-j19-1|Standseilbahn| Zürich, Dolder|\n", + "| 36| 26-919-j19-1| Bus|Zumikon, Dorfzentrum|\n", + "| 37| 26-302-j19-1| Bus| Urdorf, Oberurdorf|\n", + "| 38| 1-444-j19-1| Bus|Bremgarten AG, Ob...|\n", + "| 39| 26-8-C-j19-1| Tram| Zürich, Klusplatz|\n", + "| 40| 79-18-A-j19-1| Bus| Forch, Bahnhof|\n", + "| 41| 26-18-j19-1| S-Bahn|Zürich Stadelhofe...|\n", + "| 42| 26-2-j19-1| S-Bahn| Ziegelbrücke|\n", + "| 43| 26-8-A-j19-1| S-Bahn| Pfäffikon SZ|\n", + "| 44| 26-726-j19-1| Bus|Schwerzenbach ZH,...|\n", + "| 44| 26-721-j19-1| Bus|Schwerzenbach ZH,...|\n", + "| 45| 26-456-j19-1| Bus|Regensdorf-Watt, ...|\n", + "| 46| 26-311-j19-1| Bus| Dietikon, Bahnhof|\n", + "| 47| 26-772-j19-1| Bus|Wallisellen, Schu...|\n", + "| 48| 26-17-j19-1| Tram|Zürich Wiedikon, ...|\n", + "| 49| 26-21-j19-1| S-Bahn| Regensdorf-Watt|\n", + "| 50| 26-7-A-j19-1| S-Bahn| Winterthur|\n", + "| 51| 26-845-j19-1| Bus|Gossau ZH, Mittel...|\n", + "| 51| 26-845-j19-1| Bus| Grüningen, Adler|\n", + "| 52| 26-768-j19-1| Bus|Zürich Flughafen,...|\n", + "| 53| 26-13-j19-1| Tram| Zürich, Frankental|\n", + "| 54| 26-2-A-j19-1| Tram|Zürich Tiefenbrun...|\n", + "| 55| 26-36-j19-1| InterRegio| Basel SBB|\n", + "| 55| 26-19-j19-1| S-Bahn| Koblenz|\n", + "| 55| 26-19-j19-1| S-Bahn| Dietikon|\n", + "| 56| 1-445-j19-1| Bus|Zürich Enge, Bahn...|\n", + "| 57| 26-451-j19-1| Bus|Adlikon b. R., Le...|\n", + "| 58| 26-2-A-j19-1| Tram|Zürich Tiefenbrun...|\n", + "| 59| 26-304-j19-1| Bus| Dietikon, Bahnhof|\n", + "| 60| 26-14-A-j19-1| Tram| Zürich, Seebach|\n", + "| 61| 26-703-j19-1| Bus| Zürich, Klusplatz|\n", + "| 62| 26-10-B-j19-1| S-Bahn| Uetliberg|\n", + "| 63| 26-787-j19-1| Bus|Brüttisellen, Ob....|\n", + "| 64| 26-743-j19-1| Bus| Stettbach, Bahnhof|\n", + "| 65| 26-771-j19-1| Bus|Wallisellen, Bahnhof|\n", + "| 66| 26-38-j19-1| Bus| Zürich, Waidspital|\n", + "| 67| 26-14-A-j19-1| Tram| Zürich, Triemli|\n", + "| 68|79-373-2-j19-1| Schiff| Thalwil ZSG|\n", + "| 69| 26-845-j19-1| Bus| Uster, Bahnhof|\n", + "| 70| 26-452-j19-1| Bus|Regensdorf, Moosä...|\n", + "| 71| 26-813-j19-1| Bus| Uster, Bahnhof|\n", + "| 72| 26-31-j19-1| Bus| Zürich, Farbhof|\n", + "| 73| 26-6-A-j19-1| S-Bahn| Baden|\n", + "| 74| 26-14-A-j19-1| Tram| Zürich, Seebach|\n", + "| 75| 26-811-j19-1| Bus| Uster, Bahnhof|\n", + "| 76| 26-652-j19-1| Bus| Effretikon, Bahnhof|\n", + "| 77| 26-726-j19-1| Bus| Volketswil, Dorf|\n", + "| 78| 26-165-j19-1| Bus|Rüschlikon, Park ...|\n", + "| 79| 26-31-j19-1| Bus|Zürich, Kienasten...|\n", + "| 80| 26-75-A-j19-1| Bus|Zürich, Schwamend...|\n", + "| 81| 26-10-B-j19-1| S-Bahn| Zürich Selnau|\n", + "| 82| 79-10-B-j19-1| S-Bahn| Zürich Triemli|\n", + "| 83| 26-787-j19-1| Bus|Zürich Oerlikon, ...|\n", + "| 84| 26-35-B-j19-1| Bus| Zürich, Solidapark|\n", + "| 85| 26-89-j19-1| Bus|Zürich Altstetten...|\n", + "| 86| 26-6-B-j19-1| Tram| Zürich, Zoo|\n", + "| 87| 26-40-j19-1| Bus| Zürich, Seebach|\n", + "| 88| 26-19-j19-1| S-Bahn| Zürich HB|\n", + "| 88|80-160-Y-j19-1| RegioExpress| Zürich HB|\n", + "| 89| 26-24-j19-1| S-Bahn| Schaffhausen|\n", + "| 90| 26-24-j19-1| S-Bahn| Schaffhausen|\n", + "| 91| 26-31-j19-1| Bus|Zürich Altstetten...|\n", + "| 92| 26-3-A-j19-1| Tram| Zürich, Klusplatz|\n", + "| 93| 26-40-j19-1| Bus|Zürich, Glaubtens...|\n", + "| 94| 26-24-j19-1| S-Bahn| Zug|\n", + "+---------+--------------+-------------+--------------------+\n", + "only showing top 100 rows" + ] + } + ], + "source": [ + "stop_times.select(stop_times.route_int, stop_times.route_id, stop_times.route_desc, stop_times.trip_headsign)\\\n", + ".dropDuplicates()\\\n", + ".sort(F.col('route_int').cast('int'))\\\n", + ".show(100)" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Verifying a few routes and trips on real data" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "stop_times = spark.read.csv('data/lgpt_guys/stop_times_final_cyril.csv', header=True)" ] }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|route_id |stop_id_general|trip_id |stop_id|arrival_time|departure_time|stop_sequence|stop_name |trip_headsign |trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", - "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|26-660-j19-1|8576167 |486.TA.26-660-j19-1.9.R|8576167|07:16:00 |07:16:00 |1 |Nürensdorf, Chrüzstrass |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1197 |Bus |\n", - "|26-660-j19-1|8576168 |486.TA.26-660-j19-1.9.R|8576168|07:17:00 |07:17:00 |2 |Birchwil (Nürensdorf) |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |640 |Bus |\n", - "|26-660-j19-1|8576169 |486.TA.26-660-j19-1.9.R|8576169|07:19:00 |07:19:00 |3 |Nürensdorf, Oberwil |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |862 |Bus |\n", - "|26-660-j19-1|8576172 |486.TA.26-660-j19-1.9.R|8576172|07:22:00 |07:22:00 |4 |Breite b. N'dorf,Grünenwaldstr|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |42 |Bus |\n", - "|26-660-j19-1|8576174 |486.TA.26-660-j19-1.9.R|8576174|07:24:00 |07:24:00 |5 |Brütten, Hofacher |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |93 |Bus |\n", - "|26-660-j19-1|8506960 |486.TA.26-660-j19-1.9.R|8506960|07:26:00 |07:26:00 |6 |Brütten, Zentrum |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1059 |Bus |\n", - "|26-660-j19-1|8576176 |486.TA.26-660-j19-1.9.R|8576176|07:27:00 |07:27:00 |7 |Brütten, Harossen |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |775 |Bus |\n", - "|26-660-j19-1|8591835 |486.TA.26-660-j19-1.9.R|8591835|07:27:00 |07:27:00 |8 |Brütten, Steighof |Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1129 |Bus |\n", - "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+" + "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|route_id |stop_id_general|trip_id |stop_id|arrival_time|departure_time|stop_sequence|stop_name |stop_lat |stop_lon |trip_headsign |trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", + "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|26-660-j19-1|8576167 |486.TA.26-660-j19-1.9.R|8576167|07:16:00 |07:16:00 |1 |Nürensdorf, Chrüzstrass |47.4542439013472|8.63462447846447|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1198 |Bus |\n", + "|26-660-j19-1|8576168 |486.TA.26-660-j19-1.9.R|8576168|07:17:00 |07:17:00 |2 |Birchwil (Nürensdorf) |47.4577182388675|8.63876571192484|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |641 |Bus |\n", + "|26-660-j19-1|8576169 |486.TA.26-660-j19-1.9.R|8576169|07:19:00 |07:19:00 |3 |Nürensdorf, Oberwil |47.4641014319557|8.63995148810004|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |861 |Bus |\n", + "|26-660-j19-1|8576172 |486.TA.26-660-j19-1.9.R|8576172|07:22:00 |07:22:00 |4 |Breite b. N'dorf,Grünenwaldstr|47.461927224864 |8.66128647610085|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |43 |Bus |\n", + "|26-660-j19-1|8576174 |486.TA.26-660-j19-1.9.R|8576174|07:24:00 |07:24:00 |5 |Brütten, Hofacher |47.470969635094 |8.67059302244562|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |92 |Bus |\n", + "|26-660-j19-1|8506960 |486.TA.26-660-j19-1.9.R|8506960|07:26:00 |07:26:00 |6 |Brütten, Zentrum |47.472038346399 |8.67648597071027|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1059 |Bus |\n", + "|26-660-j19-1|8576176 |486.TA.26-660-j19-1.9.R|8576176|07:27:00 |07:27:00 |7 |Brütten, Harossen |47.4714675601105|8.68249569996186|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |777 |Bus |\n", + "|26-660-j19-1|8591835 |486.TA.26-660-j19-1.9.R|8591835|07:27:00 |07:27:00 |8 |Brütten, Steighof |47.469621570521 |8.68646625351823|Winterthur, Archstrasse/HB|2268 |1 |07:16:00 |500 |8 |1126 |Bus |\n", + "+------------+---------------+-----------------------+-------+------------+--------------+-------------+------------------------------+----------------+----------------+--------------------------+---------------+------------+--------------------+---------+----------+--------+----------+" ] } ], "source": [ "stop_times.where(stop_times.route_int==500).show(100, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Validated on sbb.ch" ] }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ - "+------------+---------------+----------------------+-------+------------+--------------+-------------+------------------------+---------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|route_id |stop_id_general|trip_id |stop_id|arrival_time|departure_time|stop_sequence|stop_name |trip_headsign |trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", - "+------------+---------------+----------------------+-------+------------+--------------+-------------+------------------------+---------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", - "|26-766-j19-1|8503700 |11.TA.26-766-j19-1.2.H|8503700|07:23:00 |07:23:00 |1 |Bassersdorf, Bahnhof |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |218 |Bus |\n", - "|26-766-j19-1|8576160 |11.TA.26-766-j19-1.2.H|8576160|07:25:00 |07:25:00 |2 |Bassersdorf, Löwen |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |1298 |Bus |\n", - "|26-766-j19-1|8590503 |11.TA.26-766-j19-1.2.H|8590503|07:25:00 |07:25:00 |3 |Bassersdorf, Chlupfgasse|Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |507 |Bus |\n", - "|26-766-j19-1|8576158 |11.TA.26-766-j19-1.2.H|8576158|07:26:00 |07:26:00 |4 |Bassersdorf, Talgüetli |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |913 |Bus |\n", - "|26-766-j19-1|8596100 |11.TA.26-766-j19-1.2.H|8596100|07:28:00 |07:28:00 |5 |Bassersdorf, Sportanlage|Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |1226 |Bus |\n", - "|26-766-j19-1|8588315 |11.TA.26-766-j19-1.2.H|8588315|07:29:00 |07:29:00 |6 |Kloten, Grindel |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |290 |Bus |\n", - "|26-766-j19-1|8576155 |11.TA.26-766-j19-1.2.H|8576155|07:30:00 |07:30:00 |7 |Kloten, Grubenstrasse |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |1072 |Bus |\n", - "|26-766-j19-1|8576154 |11.TA.26-766-j19-1.2.H|8576154|07:31:00 |07:31:00 |8 |Kloten, Oberfeld |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |1338 |Bus |\n", - "|26-766-j19-1|8580435 |11.TA.26-766-j19-1.2.H|8580435|07:32:00 |07:32:00 |9 |Kloten, Mühle |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |919 |Bus |\n", - "|26-766-j19-1|8587420 |11.TA.26-766-j19-1.2.H|8587420|07:34:00 |07:34:00 |10 |Kloten, Bahnhof |Kloten, Bahnhof|4946 |0 |07:23:00 |200 |10 |498 |Bus |\n", - "|26-766-j19-1|8503700 |10.TA.26-766-j19-1.2.H|8503700|07:53:00 |07:53:00 |1 |Bassersdorf, Bahnhof |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |218 |Bus |\n", - "|26-766-j19-1|8576160 |10.TA.26-766-j19-1.2.H|8576160|07:55:00 |07:55:00 |2 |Bassersdorf, Löwen |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |1298 |Bus |\n", - "|26-766-j19-1|8590503 |10.TA.26-766-j19-1.2.H|8590503|07:55:00 |07:55:00 |3 |Bassersdorf, Chlupfgasse|Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |507 |Bus |\n", - "|26-766-j19-1|8576158 |10.TA.26-766-j19-1.2.H|8576158|07:56:00 |07:56:00 |4 |Bassersdorf, Talgüetli |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |913 |Bus |\n", - "|26-766-j19-1|8596100 |10.TA.26-766-j19-1.2.H|8596100|07:58:00 |07:58:00 |5 |Bassersdorf, Sportanlage|Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |1226 |Bus |\n", - "|26-766-j19-1|8588315 |10.TA.26-766-j19-1.2.H|8588315|07:59:00 |07:59:00 |6 |Kloten, Grindel |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |290 |Bus |\n", - "|26-766-j19-1|8576155 |10.TA.26-766-j19-1.2.H|8576155|08:00:00 |08:00:00 |7 |Kloten, Grubenstrasse |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |1072 |Bus |\n", - "|26-766-j19-1|8576154 |10.TA.26-766-j19-1.2.H|8576154|08:01:00 |08:01:00 |8 |Kloten, Oberfeld |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |1338 |Bus |\n", - "|26-766-j19-1|8580435 |10.TA.26-766-j19-1.2.H|8580435|08:02:00 |08:02:00 |9 |Kloten, Mühle |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |919 |Bus |\n", - "|26-766-j19-1|8587420 |10.TA.26-766-j19-1.2.H|8587420|08:04:00 |08:04:00 |10 |Kloten, Bahnhof |Kloten, Bahnhof|4899 |0 |07:53:00 |200 |10 |498 |Bus |\n", - "|26-766-j19-1|8503700 |9.TA.26-766-j19-1.2.H |8503700|16:39:00 |16:39:00 |1 |Bassersdorf, Bahnhof |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |218 |Bus |\n", - "|26-766-j19-1|8576160 |9.TA.26-766-j19-1.2.H |8576160|16:41:00 |16:41:00 |2 |Bassersdorf, Löwen |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |1298 |Bus |\n", - "|26-766-j19-1|8590503 |9.TA.26-766-j19-1.2.H |8590503|16:42:00 |16:42:00 |3 |Bassersdorf, Chlupfgasse|Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |507 |Bus |\n", - "|26-766-j19-1|8576158 |9.TA.26-766-j19-1.2.H |8576158|16:43:00 |16:43:00 |4 |Bassersdorf, Talgüetli |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |913 |Bus |\n", - "|26-766-j19-1|8596100 |9.TA.26-766-j19-1.2.H |8596100|16:44:00 |16:44:00 |5 |Bassersdorf, Sportanlage|Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |1226 |Bus |\n", - "|26-766-j19-1|8588315 |9.TA.26-766-j19-1.2.H |8588315|16:45:00 |16:45:00 |6 |Kloten, Grindel |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |290 |Bus |\n", - "|26-766-j19-1|8576155 |9.TA.26-766-j19-1.2.H |8576155|16:46:00 |16:46:00 |7 |Kloten, Grubenstrasse |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |1072 |Bus |\n", - "|26-766-j19-1|8576154 |9.TA.26-766-j19-1.2.H |8576154|16:47:00 |16:47:00 |8 |Kloten, Oberfeld |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |1338 |Bus |\n", - "|26-766-j19-1|8580435 |9.TA.26-766-j19-1.2.H |8580435|16:49:00 |16:49:00 |9 |Kloten, Mühle |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |919 |Bus |\n", - "|26-766-j19-1|8587420 |9.TA.26-766-j19-1.2.H |8587420|16:50:00 |16:50:00 |10 |Kloten, Bahnhof |Kloten, Bahnhof|4853 |0 |16:39:00 |200 |10 |498 |Bus |\n", - "|26-766-j19-1|8503700 |8.TA.26-766-j19-1.2.H |8503700|17:09:00 |17:09:00 |1 |Bassersdorf, Bahnhof |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |218 |Bus |\n", - "|26-766-j19-1|8576160 |8.TA.26-766-j19-1.2.H |8576160|17:11:00 |17:11:00 |2 |Bassersdorf, Löwen |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |1298 |Bus |\n", - "|26-766-j19-1|8590503 |8.TA.26-766-j19-1.2.H |8590503|17:12:00 |17:12:00 |3 |Bassersdorf, Chlupfgasse|Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |507 |Bus |\n", - "|26-766-j19-1|8576158 |8.TA.26-766-j19-1.2.H |8576158|17:13:00 |17:13:00 |4 |Bassersdorf, Talgüetli |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |913 |Bus |\n", - "|26-766-j19-1|8596100 |8.TA.26-766-j19-1.2.H |8596100|17:14:00 |17:14:00 |5 |Bassersdorf, Sportanlage|Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |1226 |Bus |\n", - "|26-766-j19-1|8588315 |8.TA.26-766-j19-1.2.H |8588315|17:15:00 |17:15:00 |6 |Kloten, Grindel |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |290 |Bus |\n", - "|26-766-j19-1|8576155 |8.TA.26-766-j19-1.2.H |8576155|17:16:00 |17:16:00 |7 |Kloten, Grubenstrasse |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |1072 |Bus |\n", - "|26-766-j19-1|8576154 |8.TA.26-766-j19-1.2.H |8576154|17:17:00 |17:17:00 |8 |Kloten, Oberfeld |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |1338 |Bus |\n", - "|26-766-j19-1|8580435 |8.TA.26-766-j19-1.2.H |8580435|17:19:00 |17:19:00 |9 |Kloten, Mühle |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |919 |Bus |\n", - "|26-766-j19-1|8587420 |8.TA.26-766-j19-1.2.H |8587420|17:20:00 |17:20:00 |10 |Kloten, Bahnhof |Kloten, Bahnhof|4805 |0 |17:09:00 |200 |10 |498 |Bus |\n", - "|26-766-j19-1|8503700 |7.TA.26-766-j19-1.2.H |8503700|17:39:00 |17:39:00 |1 |Bassersdorf, Bahnhof |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |218 |Bus |\n", - "|26-766-j19-1|8576160 |7.TA.26-766-j19-1.2.H |8576160|17:41:00 |17:41:00 |2 |Bassersdorf, Löwen |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |1298 |Bus |\n", - "|26-766-j19-1|8590503 |7.TA.26-766-j19-1.2.H |8590503|17:42:00 |17:42:00 |3 |Bassersdorf, Chlupfgasse|Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |507 |Bus |\n", - "|26-766-j19-1|8576158 |7.TA.26-766-j19-1.2.H |8576158|17:43:00 |17:43:00 |4 |Bassersdorf, Talgüetli |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |913 |Bus |\n", - "|26-766-j19-1|8596100 |7.TA.26-766-j19-1.2.H |8596100|17:44:00 |17:44:00 |5 |Bassersdorf, Sportanlage|Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |1226 |Bus |\n", - "|26-766-j19-1|8588315 |7.TA.26-766-j19-1.2.H |8588315|17:45:00 |17:45:00 |6 |Kloten, Grindel |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |290 |Bus |\n", - "|26-766-j19-1|8576155 |7.TA.26-766-j19-1.2.H |8576155|17:46:00 |17:46:00 |7 |Kloten, Grubenstrasse |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |1072 |Bus |\n", - "|26-766-j19-1|8576154 |7.TA.26-766-j19-1.2.H |8576154|17:47:00 |17:47:00 |8 |Kloten, Oberfeld |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |1338 |Bus |\n", - "|26-766-j19-1|8580435 |7.TA.26-766-j19-1.2.H |8580435|17:49:00 |17:49:00 |9 |Kloten, Mühle |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |919 |Bus |\n", - "|26-766-j19-1|8587420 |7.TA.26-766-j19-1.2.H |8587420|17:50:00 |17:50:00 |10 |Kloten, Bahnhof |Kloten, Bahnhof|4758 |0 |17:39:00 |200 |10 |498 |Bus |\n", - "+------------+---------------+----------------------+-------+------------+--------------+-------------+------------------------+---------------+---------------+------------+--------------------+---------+----------+--------+----------+" + "+-----------+---------------+------------------------+-----------+------------+--------------+-------------+------------------+----------------+----------------+-------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|route_id |stop_id_general|trip_id |stop_id |arrival_time|departure_time|stop_sequence|stop_name |stop_lat |stop_lon |trip_headsign|trip_short_name|direction_id|departure_first_stop|route_int|stop_count|stop_int|route_desc|\n", + "+-----------+---------------+------------------------+-----------+------------+--------------+-------------+------------------+----------------+----------------+-------------+---------------+------------+--------------------+---------+----------+--------+----------+\n", + "|26-24-j19-1|8503016 |494.TA.26-24-j19-1.239.H|8503016:0:4|07:02:00 |07:04:00 |7 |Zürich Flughafen |47.4505627968247|8.56238196330552|Zug |20425 |0 |07:04:00 |200 |12 |1218 |S-Bahn |\n", + "|26-24-j19-1|8503006 |494.TA.26-24-j19-1.239.H|8503006:0:3|07:08:00 |07:09:00 |8 |Zürich Oerlikon |47.412017224139 |8.54411023042399|Zug |20425 |0 |07:04:00 |200 |12 |617 |S-Bahn |\n", + "|26-24-j19-1|8503015 |494.TA.26-24-j19-1.239.H|8503015:0:2|07:11:00 |07:11:00 |9 |Zürich Wipkingen |47.3931504194084|8.52935989345669|Zug |20425 |0 |07:04:00 |200 |12 |661 |S-Bahn |\n", + "|26-24-j19-1|8503000 |494.TA.26-24-j19-1.239.H|8503000:0:4|07:16:00 |07:21:00 |10 |Zürich HB |47.3793319609979|8.54019357578468|Zug |20425 |0 |07:04:00 |200 |12 |1176 |S-Bahn |\n", + "|26-24-j19-1|8503011 |494.TA.26-24-j19-1.239.H|8503011:0:1|07:24:00 |07:24:00 |11 |Zürich Wiedikon |47.3715939887424|8.52345796203921|Zug |20425 |0 |07:04:00 |200 |12 |724 |S-Bahn |\n", + "|26-24-j19-1|8503010 |494.TA.26-24-j19-1.239.H|8503010:0:1|07:26:00 |07:27:00 |12 |Zürich Enge |47.3642199587519|8.53080618106433|Zug |20425 |0 |07:04:00 |200 |12 |1138 |S-Bahn |\n", + "|26-24-j19-1|8503009 |494.TA.26-24-j19-1.239.H|8503009:0:4|07:29:00 |07:29:00 |13 |Zürich Wollishofen|47.3475028913112|8.53359095844549|Zug |20425 |0 |07:04:00 |200 |12 |921 |S-Bahn |\n", + "|26-24-j19-1|8503200 |494.TA.26-24-j19-1.239.H|8503200:0:1|07:32:00 |07:32:00 |14 |Kilchberg |47.3244907694466|8.54799993560477|Zug |20425 |0 |07:04:00 |200 |12 |1009 |S-Bahn |\n", + "|26-24-j19-1|8503201 |494.TA.26-24-j19-1.239.H|8503201:0:1|07:35:00 |07:35:00 |15 |Rüschlikon |47.3071946406515|8.55515052526735|Zug |20425 |0 |07:04:00 |200 |12 |754 |S-Bahn |\n", + "|26-24-j19-1|8503202 |494.TA.26-24-j19-1.239.H|8503202:0:4|07:37:00 |07:38:00 |16 |Thalwil |47.2961562648419|8.56475351565593|Zug |20425 |0 |07:04:00 |200 |12 |415 |S-Bahn |\n", + "|26-24-j19-1|8502209 |494.TA.26-24-j19-1.239.H|8502209:0:2|07:40:00 |07:40:00 |17 |Oberrieden Dorf |47.2767848038458|8.577635356832 |Zug |20425 |0 |07:04:00 |200 |12 |854 |S-Bahn |\n", + "|26-24-j19-1|8502208 |494.TA.26-24-j19-1.239.H|8502208:0:3|07:43:00 |07:43:00 |18 |Horgen Oberdorf |47.2588085210892|8.58979854578067|Zug |20425 |0 |07:04:00 |200 |12 |163 |S-Bahn |\n", + "|26-24-j19-1|8503016 |496.TA.26-24-j19-1.240.H|8503016:0:4|07:02:00 |07:04:00 |7 |Zürich Flughafen |47.4505627968247|8.56238196330552|Zug |20425 |0 |07:04:00 |200 |12 |1218 |S-Bahn |\n", + "|26-24-j19-1|8503006 |496.TA.26-24-j19-1.240.H|8503006:0:3|07:08:00 |07:09:00 |8 |Zürich Oerlikon |47.412017224139 |8.54411023042399|Zug |20425 |0 |07:04:00 |200 |12 |617 |S-Bahn |\n", + "|26-24-j19-1|8503015 |496.TA.26-24-j19-1.240.H|8503015:0:2|07:11:00 |07:11:00 |9 |Zürich Wipkingen |47.3931504194084|8.52935989345669|Zug |20425 |0 |07:04:00 |200 |12 |661 |S-Bahn |\n", + "|26-24-j19-1|8503000 |496.TA.26-24-j19-1.240.H|8503000:0:4|07:16:00 |07:21:00 |10 |Zürich HB |47.3793319609979|8.54019357578468|Zug |20425 |0 |07:04:00 |200 |12 |1176 |S-Bahn |\n", + "|26-24-j19-1|8503011 |496.TA.26-24-j19-1.240.H|8503011:0:1|07:24:00 |07:24:00 |11 |Zürich Wiedikon |47.3715939887424|8.52345796203921|Zug |20425 |0 |07:04:00 |200 |12 |724 |S-Bahn |\n", + "|26-24-j19-1|8503010 |496.TA.26-24-j19-1.240.H|8503010:0:1|07:26:00 |07:27:00 |12 |Zürich Enge |47.3642199587519|8.53080618106433|Zug |20425 |0 |07:04:00 |200 |12 |1138 |S-Bahn |\n", + "|26-24-j19-1|8503009 |496.TA.26-24-j19-1.240.H|8503009:0:4|07:29:00 |07:29:00 |13 |Zürich Wollishofen|47.3475028913112|8.53359095844549|Zug |20425 |0 |07:04:00 |200 |12 |921 |S-Bahn |\n", + "|26-24-j19-1|8503200 |496.TA.26-24-j19-1.240.H|8503200:0:1|07:32:00 |07:32:00 |14 |Kilchberg |47.3244907694466|8.54799993560477|Zug |20425 |0 |07:04:00 |200 |12 |1009 |S-Bahn |\n", + "|26-24-j19-1|8503201 |496.TA.26-24-j19-1.240.H|8503201:0:1|07:35:00 |07:35:00 |15 |Rüschlikon |47.3071946406515|8.55515052526735|Zug |20425 |0 |07:04:00 |200 |12 |754 |S-Bahn |\n", + "|26-24-j19-1|8503202 |496.TA.26-24-j19-1.240.H|8503202:0:4|07:38:00 |07:38:00 |16 |Thalwil |47.2961562648419|8.56475351565593|Zug |20425 |0 |07:04:00 |200 |12 |415 |S-Bahn |\n", + "|26-24-j19-1|8502209 |496.TA.26-24-j19-1.240.H|8502209:0:2|07:40:00 |07:40:00 |17 |Oberrieden Dorf |47.2767848038458|8.577635356832 |Zug |20425 |0 |07:04:00 |200 |12 |854 |S-Bahn |\n", + "|26-24-j19-1|8502208 |496.TA.26-24-j19-1.240.H|8502208:0:3|07:44:00 |07:45:00 |18 |Horgen Oberdorf |47.2588085210892|8.58979854578067|Zug |20425 |0 |07:04:00 |200 |12 |163 |S-Bahn |\n", + "+-----------+---------------+------------------------+-----------+------------+--------------+-------------+------------------+----------------+----------------+-------------+---------------+------------+--------------------+---------+----------+--------+----------+" ] } ], "source": [ "stop_times.where(stop_times.route_int==200).show(100, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verified on sbb.ch. This one is interesting: the service stops in the middle of the day. That is also what is observed on sbb.ch." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { "display_name": "PySpark", "language": "", "name": "pysparkkernel" }, "language_info": { "codemirror_mode": { "name": "python", "version": 3 }, "mimetype": "text/x-python", "name": "pyspark", "pygments_lexer": "python3" } }, "nbformat": 4, "nbformat_minor": 4 }