From 935665f5cd94cd1831710552132ab9f90ca139d8 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 18 Jul 2025 18:01:31 -0700 Subject: [PATCH 01/53] initial av_trip_matching code --- src/asim/configs/resident/av_routing.yaml | 24 + .../configs/resident/av_trip_matching.csv | 5 + .../av_trip_matching_coefficients.csv | 4 + src/asim/extensions/av_routing.py | 485 ++++++++++++++++++ 4 files changed, 518 insertions(+) create mode 100644 src/asim/configs/resident/av_routing.yaml create mode 100644 src/asim/configs/resident/av_trip_matching.csv create mode 100644 src/asim/configs/resident/av_trip_matching_coefficients.csv create mode 100644 src/asim/extensions/av_routing.py diff --git a/src/asim/configs/resident/av_routing.yaml b/src/asim/configs/resident/av_routing.yaml new file mode 100644 index 000000000..6d9ee38de --- /dev/null +++ b/src/asim/configs/resident/av_routing.yaml @@ -0,0 +1,24 @@ +# spec and coefficients for AV trip matching model +AV_TRIP_MATCHING_SPEC: av_trip_matching.csv +AV_TRIP_MATCHING_COEFFICIENTS: av_trip_matching_coefficients.csv + +# spec and coefficients for AV repositioning model +AV_REPOSITIONING_SPEC: av_repositioning.csv +AV_REPOSITIONING_COEFFICIENTS: av_repositioning_coefficients.csv + +# needed to pass logit settings validation, but not used in this model +SPEC: None + +# List of modes that are eligible for routing with a household AV +DRIVING_MODES: + - DRIVEALONE + - SHARED2 + - SHARED3 + +# av_trip_matching_preprocessor: +# SPEC: av_trip_matching_preprocessor.csv +# DF: df +# TABLES: +# - land_use +# - tours +# - vehicles \ No newline at end of file diff --git a/src/asim/configs/resident/av_trip_matching.csv b/src/asim/configs/resident/av_trip_matching.csv new file mode 100644 index 000000000..77bb0938b --- /dev/null +++ b/src/asim/configs/resident/av_trip_matching.csv @@ -0,0 +1,5 @@ +Label,Description,Expression,coefficient +util_dummy_1,Dummy variable 1,1,coef_one +util_no_vehicle,Alternative unavailable if no vehicle,df.vehicle_id.isna(),coef_unavailable +util_no_trip,unavailable if no trip and alt is not idle,df.trip_id.isna() & (df.alt > 0),coef_unavailable +util_idle,Do not service any trips,df.alt == 0,coef_idle \ No newline at end of file diff --git a/src/asim/configs/resident/av_trip_matching_coefficients.csv b/src/asim/configs/resident/av_trip_matching_coefficients.csv new file mode 100644 index 000000000..386cc04b7 --- /dev/null +++ b/src/asim/configs/resident/av_trip_matching_coefficients.csv @@ -0,0 +1,4 @@ +coefficient_name,value,constrain +coef_unavailable,-999.0,F +coef_one,1.0,F +coef_idle,-10.0,F diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py new file mode 100644 index 000000000..0c8d44f15 --- /dev/null +++ b/src/asim/extensions/av_routing.py @@ -0,0 +1,485 @@ +# ActivitySim +# See full license in LICENSE.txt. +import logging + +import numpy as np +import pandas as pd +import itertools + +from activitysim.core import ( + config, + expressions, + logit, + simulate, + tracing, + workflow, + interaction_simulate, + util, +) +from activitysim.core.configuration.base import PreprocessorSettings +from activitysim.core.configuration.logit import LogitComponentSettings +logger = logging.getLogger(__name__) + + +class AVRoutingSettings(LogitComponentSettings): + """ + Settings for the `AVRouting` component. + """ + AV_TRIP_MATCHING_SPEC: str + AV_TRIP_MATCHING_COEFFICIENTS: str + + av_trip_matching_preprocessor: PreprocessorSettings | None = None + + AV_REPOSITIONING_SPEC: str + AV_REPOSITIONING_COEFFICIENTS: str + + av_repositioning_preprocessor: PreprocessorSettings | None = None + + DRIVING_MODES: list[str] + """List of modes that are eligible for routing with a household AV""" + + +def setup_skims(network_los): + """ + Setup skims for AV routing. + FIXME this should eventually be replaced with abm.models.util.logsums setup_skims function from the pnr work + """ + + skim_dict = network_los.get_default_skim_dict() + + # setup skim keys + out_time_col_name = "start" + in_time_col_name = "end" + orig_col_name = "origin" + dest_col_name = "destination" + + # creating skim wrappers + odt_skim_stack_wrapper = skim_dict.wrap_3d( + orig_key=orig_col_name, dest_key=dest_col_name, dim3_key="out_period" + ) + + dot_skim_stack_wrapper = skim_dict.wrap_3d( + orig_key=dest_col_name, dest_key=orig_col_name, dim3_key="in_period" + ) + odr_skim_stack_wrapper = skim_dict.wrap_3d( + orig_key=orig_col_name, dest_key=dest_col_name, dim3_key="in_period" + ) + dor_skim_stack_wrapper = skim_dict.wrap_3d( + orig_key=dest_col_name, dest_key=orig_col_name, dim3_key="out_period" + ) + od_skim_stack_wrapper = skim_dict.wrap(orig_col_name, dest_col_name) + do_skim_stack_wrapper = skim_dict.wrap(dest_col_name, orig_col_name) + + skims = { + "odt_skims": odt_skim_stack_wrapper, + "dot_skims": dot_skim_stack_wrapper, + "odr_skims": odr_skim_stack_wrapper, # dot return skims for e.g. TNC bridge return fare + "dor_skims": dor_skim_stack_wrapper, # odt return skims for e.g. TNC bridge return fare + "od_skims": od_skim_stack_wrapper, + "do_skims": do_skim_stack_wrapper, + "orig_col_name": orig_col_name, + "dest_col_name": dest_col_name, + "out_time_col_name": out_time_col_name, + "in_time_col_name": in_time_col_name, + } + + return skims + + +def construct_av_to_trip_alternatives(num_avs, num_trips): + """ + Construct a DataFrame of all possible AV-trips assignments. + + Each row represents a unique assignment of trips to AVs. + The first trip (trip_0) is a placeholder for no trip assigned to an AV. + The remaining trips (trip_1, trip_2, ..., trip_n) represent actual trips. + + Example for 2 AVs and 2 trips: + av_1 av_2 + 0 trip_0 trip_0 + 1 trip_0 trip_1 + 2 trip_0 trip_2 + 3 trip_1 trip_0 + 4 trip_1 trip_2 + 5 trip_2 trip_0 + 6 trip_2 trip_1 + """ + av_columns = [f'av_{i+1}' for i in range(num_avs)] + trip_labels = [f'trip_{i}' for i in range(1, num_trips+1)] + trip_labels_with_zero = ['trip_0'] + trip_labels + + # All possible assignments (with replacement) of trips (including trip_0) to AVs + all_assignments = itertools.product(trip_labels_with_zero, repeat=num_avs) + + # Filter so that each trip (except trip_0) is assigned at most once + valid_assignments = [ + assignment for assignment in all_assignments + if len(set([t for t in assignment if t != 'trip_0'])) == len([t for t in assignment if t != 'trip_0']) + ] + + alts = pd.DataFrame(valid_assignments, columns=av_columns) + alts.index.name = 'alt' + return alts + + +def build_av_to_trip_interaction_df( + vehicles: pd.DataFrame, + trips: pd.DataFrame, + alts: pd.DataFrame, + choosers: pd.DataFrame, + trace_label: str, +): + """ + Creating a table that matches a single av trip with a single trip. + This allows us to calculate the partial alternative utilities for each trip-AV combination individually. + + Example for 2 AVs and 1 trip: + household_id | vehicle_id | trip_id | alt | vehicle_info | trip_info + 1 | 1 | 0 | 0 | ... | ... + 1 | 2 | 0 | 0 | ... | ... + 1 | 1 | 1 | 1 | ... | ... + 1 | 2 | 0 | 1 | ... | ... + 1 | 1 | 0 | 2 | ... | ... + 1 | 2 | 1 | 2 | ... | ... + + + Parameters: + vehicles: DataFrame containing vehicle information. + trips: DataFrame containing trip information. + alts: DataFrame containing alternatives (AV-trip combinations). + choosers: DataFrame containing choosers (households). + trace_label: Label for tracing the interaction DataFrame. + + Returns: + interaction_df: DataFrame containing the interaction between AVs and trips. + """ + + interaction_dfs = [] + # looping through alternatives to build custom interaction_df + for row in alts.iterrows(): + for col in alts.columns: + av_number = int(col.split('_')[1]) # Extract the AV number from the column name + trip_number = int(row[1][col].split('_')[1]) # Extract the trip number from row + + av_choosers = vehicles[vehicles.household_id.isin(trips.household_id.unique()) & (vehicles.av_number == av_number)] + if trip_number == 0: + # If trip_number is 0, we consider it as no trip for the AV + trip_choosers = pd.DataFrame(columns=trips.columns, index=av_choosers.index) + trip_choosers['household_id'] = av_choosers['household_id'] + else: + trip_choosers = trips[trips.trip_number == trip_number] + + assert av_choosers.household_id.is_unique, "There should be only one AV chooser per household at this stage" + assert trip_choosers.household_id.is_unique, "There should be only one trip chooser per household at this stage" + + # want a complete set of household_ids for both choosers + # reindex to save trip / vehicle ID and then reindex to households which are making the choices + av_choosers = av_choosers.reset_index().set_index('household_id').reindex(choosers.index, fill_value=np.nan) + trip_choosers = trip_choosers.reset_index().set_index('household_id').reindex(choosers.index, fill_value=np.nan) + + # merge the tables together to create a table with columns describing the AV and the trip + interaction_df = pd.merge( + av_choosers, + trip_choosers, + on='household_id', + suffixes=('', '_trip'), + ) + interaction_df['alt'] = row[0] + + interaction_dfs.append(interaction_df) # Assign the alternative index to the interaction_df + + # Concatenate all interaction DataFrames into a single DataFrame + # and sort by household_id and alt + interaction_df = pd.concat(interaction_dfs, ignore_index=False).reset_index() + interaction_df.sort_values(by=['household_id', 'alt'], inplace=True) + + assert (interaction_df.groupby('household_id').size() == (alts.shape[0] * alts.shape[1])).all(), \ + "There should be one row per AV and trip combination per household" + + return interaction_df + + +def execute_av_trip_matches( + state, + model_settings: AVRoutingSettings, + choices: pd.DataFrame, + vehicle_trips: pd.DataFrame | None, + trips_in_period: pd.DataFrame, + av_vehicles: pd.DataFrame +): + """ + Execute the AV trip matches by updating the vehicles DataFrame with the chosen trips. + This function updates the vehicles DataFrame based on the choices made by the AV routing model. + + Parameters: + state: The current state of the simulation. + model_settings: The settings for the AV routing model. + choices: The choices made by the AV routing model. + vehicles: The vehicles DataFrame to be updated. + + Returns: + vehicles: The updated vehicles DataFrame. + """ + + if choices.empty: + # no trips to make + return vehicle_trips + + # looping through avs in the household + av_cols = choices.columns[choices.columns.str.startswith('av_')] + + all_veh_trips = [] + + for av_col in av_cols: + av_number = int(av_col.split('_')[1]) + + # drop trip_0 or na from choices since they represent the AV not doing anything + vehicle_choices = choices.loc[choices[av_col] != 'trip_0', av_col].dropna().to_frame(name='av_choice').reset_index() + vehicle_choices['trip_number'] = vehicle_choices.av_choice.str.split('_').str[1].astype(int) + vehicle_choices['av_number'] = av_number + + # merge vehicle id so we know which vehicle we are tracking + current_veh_trips = vehicle_choices.merge(av_vehicles.reset_index()[['household_id', 'vehicle_id', 'av_number']], on=['household_id', 'av_number'], how='left', validate='1:1') + # merge trip information so we know where the vehicle is going + current_veh_trips = current_veh_trips.merge(trips_in_period.reset_index()[['household_id', 'trip_id', 'depart', 'origin', 'destination', 'trip_number']], on=['household_id', 'trip_number'], how='left', validate='1:1') + + all_veh_trips.append(current_veh_trips) + + all_veh_trips = pd.concat(all_veh_trips, ignore_index=True) + if vehicle_trips is not None: + vehicle_trips = pd.concat([vehicle_trips, all_veh_trips], ignore_index=True) + else: + vehicle_trips = all_veh_trips + + assert all_veh_trips.vehicle_id.notna(), "There should be a vehicle_id for each trip made by an AV" + + return vehicle_trips + + +def update_vehicle_positions(vehicle_trips, av_vehicles): + """ + Update the vehicle positions based on the trips assigned to each AV. + + Parameters: + vehicle_trips: DataFrame containing trips made by household AVs. + av_vehicles: DataFrame containing the all AV vehicles. + + Returns: + av_vehicles: The updated AV vehicles DataFrame with vehicle_location + """ + return av_vehicles + + +def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFrame, vehicles: pd.DataFrame, trace_label: str) -> pd.DataFrame: + """ + Match trips to AVs + First, construct all possible trip-AV combinations within the household for this time period. + Then, use a utility function to select the best AV for each trip. + + Much of the utilty and choice logic is taken from activitysim.core.interaction_simulate + (Couldn't just call it because of the extra step here where we combine across alternatives) + """ + + # get the maximum number of AVs and Trips during this time period + max_number_of_avs = vehicles.groupby('household_id').size().max() + max_number_of_trips = trips.groupby('household_id').size().max() + + # the real choosers here are the households with an av that have trips in this time period + choosers = pd.DataFrame(index=trips.household_id.unique()) + choosers.index.name = 'household_id' + have_trace_targets = state.tracing.has_trace_targets(choosers) + + alts = construct_av_to_trip_alternatives(max_number_of_avs, max_number_of_trips) + + interaction_df = build_av_to_trip_interaction_df( + vehicles=vehicles, + trips=trips, + alts=alts, + choosers=choosers, + trace_label=trace_label, + ) + + model_spec_raw = state.filesystem.read_model_spec(file_name=model_settings.AV_TRIP_MATCHING_SPEC) + coefficients_df = state.filesystem.read_model_coefficients(file_name=model_settings.AV_TRIP_MATCHING_COEFFICIENTS) + model_spec = simulate.eval_coefficients( + state, model_spec_raw, coefficients_df, estimator=None + ) + constants = config.get_model_constants(model_settings) + + # setup skim wrappers + # skims = setup_skims(network_los=state.get_injectable("network_los")) + # simulate.set_skim_wrapper_targets(interaction_df, skims) + + locals_d = { + # "skims": skims, + } + if constants is not None: + locals_d.update(constants) + + # evaluate expressions from the spec multiply by coefficients and sum + # spec is df with one row per spec expression and one col with utility coefficient + # column names of model_design match spec index values + # utilities has utility value for elements in the cross product of choosers and alternatives + # interaction_utilities is a df with one utility column and one row per row in model_design + if have_trace_targets: + trace_rows, trace_ids = state.tracing.interaction_trace_rows( + interaction_df, choosers, sample_size=len(alts) + ) + + state.tracing.trace_df( + interaction_df[trace_rows], + tracing.extend_trace_label(trace_label, "interaction_df"), + slicer="NONE", + transpose=False, + ) + else: + trace_rows = trace_ids = None + + interaction_df['utility'], trace_eval_results = interaction_simulate.eval_interaction_utilities( + state, + model_spec, + interaction_df, + locals_d, + trace_label, + trace_rows, + estimator=None, + log_alt_losers=False, + compute_settings=model_settings.compute_settings, + ) + + # sum utilities across the alternatives + interaction_utilities = interaction_df.groupby(['household_id', 'alt'])['utility'].sum().reset_index().set_index('alt') + + # make choices based on the summed utilities + # reshape utilities (one utility column and one row per row in model_design) + # to a dataframe with one row per chooser and one column per alternative + utilities = pd.DataFrame( + interaction_utilities.utility.values.reshape(len(choosers), len(alts)), + index=choosers.index, + ) + + if have_trace_targets: + state.tracing.trace_df( + utilities, + tracing.extend_trace_label(trace_label, "utils"), + column_labels=["alternative", "utility"], + ) + + # convert to probabilities (utilities exponentiated and normalized to probs) + # probs is same shape as utilities, one row per chooser and one column for alternative + probs = logit.utils_to_probs( + state, utilities, trace_label=trace_label, trace_choosers=choosers + ) + + # make choices + # positions is series with the chosen alternative represented as a column index in probs + # which is an integer between zero and num alternatives in the alternative sample + positions, rands = logit.make_choices( + state, probs, trace_label=trace_label, trace_choosers=choosers + ) + + # need to get from an integer offset into the alternative sample to the alternative index + # that is, we want the index value of the row that is offset by rows into the + # tranche of this choosers alternatives created by cross join of alternatives and choosers + # offsets is the offset into model_design df of first row of chooser alternatives + offsets = np.arange(len(positions)) * len(alts) + # resulting Int64Index has one element per chooser row and is in same order as choosers + choices = interaction_utilities.index.take(positions + offsets) + + # create a series with index from choosers and the index of the chosen alternative + choices = pd.Series(choices, index=choosers.index) + + if have_trace_targets: + state.tracing.trace_df( + choices, + tracing.extend_trace_label(trace_label, "choices"), + columns=[None, trace_label], + ) + state.tracing.trace_df( + rands, + tracing.extend_trace_label(trace_label, "rands"), + columns=[None, "rand"], + ) + + choices = choices.to_frame(name="alt").reset_index().merge(alts.reset_index(), how='left', on='alt').set_index('household_id') + + return choices + + +def av_repositioning(): + """Reposition AVs based on household needs.""" + logger.info("Repositioning AVs based on household needs...") + # Implement repositioning logic here + pass + + +@workflow.step +def av_routing( + state: workflow.State, + households: pd.DataFrame, + trips: pd.DataFrame, + vehicles: pd.DataFrame, + model_settings: AVRoutingSettings | None = None, + model_settings_file_name: str = "av_routing.yaml", + trace_label: str = "av_routing", + trace_hh_id: bool = False, +) -> None: + """ + This model performs intra-household autonomous vehicle routing. + """ + if model_settings is None: + model_settings = AVRoutingSettings.read_settings_file( + state.filesystem, + model_settings_file_name, + ) + + driving_trips= trips[trips.trip_mode.isin(model_settings.DRIVING_MODES)].copy() + time_periods = driving_trips.depart.unique() + time_periods.sort() + av_vehicles = vehicles[vehicles.vehicle_type.str.contains('-AV')].copy() + + if av_vehicles.empty or driving_trips.empty: + logger.info("No AVs or trips to process, skipping AV routing.") + return + + # prepping vehicle table for models: labeling vehicles and adding init location to home + av_vehicles['av_number'] = av_vehicles.groupby('household_id').cumcount() + 1 + av_vehicles['veh_location'] = households.home_zone_id.reindex(av_vehicles.household_id).values + vehicle_trips = None + + av_trip_matching_choices = [] + + # looping through time periods + for time_period in time_periods: + + # trips in the time period + trips_in_period = driving_trips[driving_trips.depart == time_period] + if trips_in_period.empty: + continue + + trips_in_period['trip_number'] = trips_in_period.groupby('household_id').cumcount() + 1 + + choices = av_trip_matching( + state, + model_settings, + trips=trips_in_period, + vehicles=av_vehicles, + trace_label=trace_label + ) + + choices['time_period'] = time_period + av_trip_matching_choices.append(choices) + + vehicle_trips = execute_av_trip_matches( + state, + model_settings, + choices, + vehicle_trips, + trips_in_period, + av_vehicles + ) + av_vehicles = update_vehicle_positions(vehicle_trips, av_vehicles) + av_repositioning() + + av_trip_matching_choices = pd.concat(av_trip_matching_choices, ignore_index=False) + From 53f6955b24f39cca5991cc0ea42a6431472efc78 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Tue, 22 Jul 2025 14:33:03 -0700 Subject: [PATCH 02/53] blacken and correct availability conditions --- .../configs/resident/av_trip_matching.csv | 6 +- src/asim/extensions/av_routing.py | 272 ++++++++++++------ 2 files changed, 194 insertions(+), 84 deletions(-) diff --git a/src/asim/configs/resident/av_trip_matching.csv b/src/asim/configs/resident/av_trip_matching.csv index 77bb0938b..49edddbfe 100644 --- a/src/asim/configs/resident/av_trip_matching.csv +++ b/src/asim/configs/resident/av_trip_matching.csv @@ -1,5 +1,5 @@ Label,Description,Expression,coefficient util_dummy_1,Dummy variable 1,1,coef_one -util_no_vehicle,Alternative unavailable if no vehicle,df.vehicle_id.isna(),coef_unavailable -util_no_trip,unavailable if no trip and alt is not idle,df.trip_id.isna() & (df.alt > 0),coef_unavailable -util_idle,Do not service any trips,df.alt == 0,coef_idle \ No newline at end of file +util_no_vehicle,Alternative unavailable if no vehicle,df.vehicle_id.isna() & (df.trip_number > 0),coef_unavailable +util_no_trip,unavailable if no trip and alt is not idle,df.trip_id.isna() & (df.trip_number > 0),coef_unavailable +util_idle,Do not service any trips,(df.trip_number == 0) & ~df.vehicle_id.isna(),coef_idle \ No newline at end of file diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 0c8d44f15..9751db515 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -18,6 +18,7 @@ ) from activitysim.core.configuration.base import PreprocessorSettings from activitysim.core.configuration.logit import LogitComponentSettings + logger = logging.getLogger(__name__) @@ -25,9 +26,10 @@ class AVRoutingSettings(LogitComponentSettings): """ Settings for the `AVRouting` component. """ + AV_TRIP_MATCHING_SPEC: str AV_TRIP_MATCHING_COEFFICIENTS: str - + av_trip_matching_preprocessor: PreprocessorSettings | None = None AV_REPOSITIONING_SPEC: str @@ -104,25 +106,27 @@ def construct_av_to_trip_alternatives(num_avs, num_trips): 5 trip_2 trip_0 6 trip_2 trip_1 """ - av_columns = [f'av_{i+1}' for i in range(num_avs)] - trip_labels = [f'trip_{i}' for i in range(1, num_trips+1)] - trip_labels_with_zero = ['trip_0'] + trip_labels + av_columns = [f"av_{i+1}" for i in range(num_avs)] + trip_labels = [f"trip_{i}" for i in range(1, num_trips + 1)] + trip_labels_with_zero = ["trip_0"] + trip_labels # All possible assignments (with replacement) of trips (including trip_0) to AVs all_assignments = itertools.product(trip_labels_with_zero, repeat=num_avs) # Filter so that each trip (except trip_0) is assigned at most once valid_assignments = [ - assignment for assignment in all_assignments - if len(set([t for t in assignment if t != 'trip_0'])) == len([t for t in assignment if t != 'trip_0']) + assignment + for assignment in all_assignments + if len(set([t for t in assignment if t != "trip_0"])) + == len([t for t in assignment if t != "trip_0"]) ] alts = pd.DataFrame(valid_assignments, columns=av_columns) - alts.index.name = 'alt' + alts.index.name = "alt" return alts -def build_av_to_trip_interaction_df( +def build_av_to_trip_interaction_df( vehicles: pd.DataFrame, trips: pd.DataFrame, alts: pd.DataFrame, @@ -141,8 +145,8 @@ def build_av_to_trip_interaction_df( 1 | 2 | 0 | 1 | ... | ... 1 | 1 | 0 | 2 | ... | ... 1 | 2 | 1 | 2 | ... | ... - - + + Parameters: vehicles: DataFrame containing vehicle information. trips: DataFrame containing trip information. @@ -158,59 +162,80 @@ def build_av_to_trip_interaction_df( # looping through alternatives to build custom interaction_df for row in alts.iterrows(): for col in alts.columns: - av_number = int(col.split('_')[1]) # Extract the AV number from the column name - trip_number = int(row[1][col].split('_')[1]) # Extract the trip number from row - - av_choosers = vehicles[vehicles.household_id.isin(trips.household_id.unique()) & (vehicles.av_number == av_number)] - if trip_number == 0: - # If trip_number is 0, we consider it as no trip for the AV - trip_choosers = pd.DataFrame(columns=trips.columns, index=av_choosers.index) - trip_choosers['household_id'] = av_choosers['household_id'] - else: - trip_choosers = trips[trips.trip_number == trip_number] - - assert av_choosers.household_id.is_unique, "There should be only one AV chooser per household at this stage" - assert trip_choosers.household_id.is_unique, "There should be only one trip chooser per household at this stage" + av_number = int( + col.split("_")[1] + ) # Extract the AV number from the column name + trip_number = int( + row[1][col].split("_")[1] + ) # Extract the trip number from row + + av_choosers = vehicles[ + vehicles.household_id.isin(trips.household_id.unique()) + & (vehicles.av_number == av_number) + ] + trip_choosers = trips[trips.trip_number == trip_number] + + assert ( + av_choosers.household_id.is_unique + ), "There should be only one AV chooser per household at this stage" + assert ( + trip_choosers.household_id.is_unique + ), "There should be only one trip chooser per household at this stage" # want a complete set of household_ids for both choosers # reindex to save trip / vehicle ID and then reindex to households which are making the choices - av_choosers = av_choosers.reset_index().set_index('household_id').reindex(choosers.index, fill_value=np.nan) - trip_choosers = trip_choosers.reset_index().set_index('household_id').reindex(choosers.index, fill_value=np.nan) + av_choosers = ( + av_choosers.reset_index() + .set_index("household_id") + .reindex(choosers.index, fill_value=np.nan) + ) + trip_choosers = ( + trip_choosers.reset_index() + .set_index("household_id") + .reindex(choosers.index, fill_value=np.nan) + ) + + # setting alt trip and av numbers so we can use them in spec availability conditions + av_choosers["av_number"] = av_number + trip_choosers["trip_number"] = trip_number # merge the tables together to create a table with columns describing the AV and the trip interaction_df = pd.merge( av_choosers, trip_choosers, - on='household_id', - suffixes=('', '_trip'), + on="household_id", + suffixes=("", "_trip"), ) - interaction_df['alt'] = row[0] + interaction_df["alt"] = row[0] - interaction_dfs.append(interaction_df) # Assign the alternative index to the interaction_df + interaction_dfs.append( + interaction_df + ) # Assign the alternative index to the interaction_df # Concatenate all interaction DataFrames into a single DataFrame # and sort by household_id and alt interaction_df = pd.concat(interaction_dfs, ignore_index=False).reset_index() - interaction_df.sort_values(by=['household_id', 'alt'], inplace=True) + interaction_df.sort_values(by=["household_id", "alt"], inplace=True) + + assert ( + interaction_df.groupby("household_id").size() == (alts.shape[0] * alts.shape[1]) + ).all(), "There should be one row per AV and trip combination per household" - assert (interaction_df.groupby('household_id').size() == (alts.shape[0] * alts.shape[1])).all(), \ - "There should be one row per AV and trip combination per household" - return interaction_df def execute_av_trip_matches( - state, + state, model_settings: AVRoutingSettings, choices: pd.DataFrame, vehicle_trips: pd.DataFrame | None, trips_in_period: pd.DataFrame, - av_vehicles: pd.DataFrame + av_vehicles: pd.DataFrame, ): """ Execute the AV trip matches by updating the vehicles DataFrame with the chosen trips. This function updates the vehicles DataFrame based on the choices made by the AV routing model. - + Parameters: state: The current state of the simulation. model_settings: The settings for the AV routing model. @@ -226,22 +251,48 @@ def execute_av_trip_matches( return vehicle_trips # looping through avs in the household - av_cols = choices.columns[choices.columns.str.startswith('av_')] - + av_cols = choices.columns[choices.columns.str.startswith("av_")] + all_veh_trips = [] for av_col in av_cols: - av_number = int(av_col.split('_')[1]) + av_number = int(av_col.split("_")[1]) # drop trip_0 or na from choices since they represent the AV not doing anything - vehicle_choices = choices.loc[choices[av_col] != 'trip_0', av_col].dropna().to_frame(name='av_choice').reset_index() - vehicle_choices['trip_number'] = vehicle_choices.av_choice.str.split('_').str[1].astype(int) - vehicle_choices['av_number'] = av_number + vehicle_choices = ( + choices.loc[choices[av_col] != "trip_0", av_col] + .dropna() + .to_frame(name="av_choice") + .reset_index() + ) + vehicle_choices["trip_number"] = ( + vehicle_choices.av_choice.str.split("_").str[1].astype(int) + ) + vehicle_choices["av_number"] = av_number # merge vehicle id so we know which vehicle we are tracking - current_veh_trips = vehicle_choices.merge(av_vehicles.reset_index()[['household_id', 'vehicle_id', 'av_number']], on=['household_id', 'av_number'], how='left', validate='1:1') + current_veh_trips = vehicle_choices.merge( + av_vehicles.reset_index()[["household_id", "vehicle_id", "av_number"]], + on=["household_id", "av_number"], + how="left", + validate="1:1", + ) # merge trip information so we know where the vehicle is going - current_veh_trips = current_veh_trips.merge(trips_in_period.reset_index()[['household_id', 'trip_id', 'depart', 'origin', 'destination', 'trip_number']], on=['household_id', 'trip_number'], how='left', validate='1:1') + current_veh_trips = current_veh_trips.merge( + trips_in_period.reset_index()[ + [ + "household_id", + "trip_id", + "depart", + "origin", + "destination", + "trip_number", + ] + ], + on=["household_id", "trip_number"], + how="left", + validate="1:1", + ) all_veh_trips.append(current_veh_trips) @@ -251,7 +302,9 @@ def execute_av_trip_matches( else: vehicle_trips = all_veh_trips - assert all_veh_trips.vehicle_id.notna(), "There should be a vehicle_id for each trip made by an AV" + assert ( + all_veh_trips.vehicle_id.notna().all() + ), "There should be a vehicle_id for each trip made by an AV" return vehicle_trips @@ -259,7 +312,7 @@ def execute_av_trip_matches( def update_vehicle_positions(vehicle_trips, av_vehicles): """ Update the vehicle positions based on the trips assigned to each AV. - + Parameters: vehicle_trips: DataFrame containing trips made by household AVs. av_vehicles: DataFrame containing the all AV vehicles. @@ -267,10 +320,28 @@ def update_vehicle_positions(vehicle_trips, av_vehicles): Returns: av_vehicles: The updated AV vehicles DataFrame with vehicle_location """ + # get the rows with the latest depart time for each trip + latest_trips = vehicle_trips.loc[ + vehicle_trips.groupby(["household_id", "vehicle_id"])["depart"].idxmax() + ].set_index("vehicle_id") + + # update the vehicle_location in av_vehicles with the latest trip's destination + av_vehicles.loc[latest_trips.index, "veh_location"] = latest_trips["destination"] + + assert ( + av_vehicles.veh_location.notna().all() + ), "There should be a vehicle_location for each AV" + return av_vehicles -def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFrame, vehicles: pd.DataFrame, trace_label: str) -> pd.DataFrame: +def av_trip_matching( + state, + model_settings: AVRoutingSettings, + trips: pd.DataFrame, + vehicles: pd.DataFrame, + trace_label: str, +) -> pd.DataFrame: """ Match trips to AVs First, construct all possible trip-AV combinations within the household for this time period. @@ -281,14 +352,13 @@ def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFra """ # get the maximum number of AVs and Trips during this time period - max_number_of_avs = vehicles.groupby('household_id').size().max() - max_number_of_trips = trips.groupby('household_id').size().max() + max_number_of_avs = vehicles.groupby("household_id").size().max() + max_number_of_trips = trips.groupby("household_id").size().max() # the real choosers here are the households with an av that have trips in this time period choosers = pd.DataFrame(index=trips.household_id.unique()) - choosers.index.name = 'household_id' - have_trace_targets = state.tracing.has_trace_targets(choosers) - + choosers.index.name = "household_id" + alts = construct_av_to_trip_alternatives(max_number_of_avs, max_number_of_trips) interaction_df = build_av_to_trip_interaction_df( @@ -298,9 +368,16 @@ def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFra choosers=choosers, trace_label=trace_label, ) + have_trace_targets = state.tracing.has_trace_targets( + interaction_df, slicer="household_id" + ) - model_spec_raw = state.filesystem.read_model_spec(file_name=model_settings.AV_TRIP_MATCHING_SPEC) - coefficients_df = state.filesystem.read_model_coefficients(file_name=model_settings.AV_TRIP_MATCHING_COEFFICIENTS) + model_spec_raw = state.filesystem.read_model_spec( + file_name=model_settings.AV_TRIP_MATCHING_SPEC + ) + coefficients_df = state.filesystem.read_model_coefficients( + file_name=model_settings.AV_TRIP_MATCHING_COEFFICIENTS + ) model_spec = simulate.eval_coefficients( state, model_spec_raw, coefficients_df, estimator=None ) @@ -323,19 +400,27 @@ def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFra # interaction_utilities is a df with one utility column and one row per row in model_design if have_trace_targets: trace_rows, trace_ids = state.tracing.interaction_trace_rows( - interaction_df, choosers, sample_size=len(alts) + interaction_df, choosers, sample_size=None ) - state.tracing.trace_df( - interaction_df[trace_rows], + interaction_df, tracing.extend_trace_label(trace_label, "interaction_df"), + transpose=False, + ) + # write alternatives to trace folder as well + state.tracing.trace_df( + alts, + tracing.extend_trace_label(trace_label, "alts"), slicer="NONE", transpose=False, ) else: trace_rows = trace_ids = None - interaction_df['utility'], trace_eval_results = interaction_simulate.eval_interaction_utilities( + ( + interaction_df["utility"], + trace_eval_results, + ) = interaction_simulate.eval_interaction_utilities( state, model_spec, interaction_df, @@ -348,7 +433,12 @@ def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFra ) # sum utilities across the alternatives - interaction_utilities = interaction_df.groupby(['household_id', 'alt'])['utility'].sum().reset_index().set_index('alt') + interaction_utilities = ( + interaction_df.groupby(["household_id", "alt"])["utility"] + .sum() + .reset_index() + .set_index("alt") + ) # make choices based on the summed utilities # reshape utilities (one utility column and one row per row in model_design) @@ -401,15 +491,24 @@ def av_trip_matching(state, model_settings: AVRoutingSettings, trips: pd.DataFra columns=[None, "rand"], ) - choices = choices.to_frame(name="alt").reset_index().merge(alts.reset_index(), how='left', on='alt').set_index('household_id') + choices = ( + choices.to_frame(name="alt") + .reset_index() + .merge(alts.reset_index(), how="left", on="alt") + .set_index("household_id") + ) return choices -def av_repositioning(): +def av_repositioning( + state, + model_settings: AVRoutingSettings, +) -> None: """Reposition AVs based on household needs.""" logger.info("Repositioning AVs based on household needs...") # Implement repositioning logic here + pass @@ -433,18 +532,23 @@ def av_routing( model_settings_file_name, ) - driving_trips= trips[trips.trip_mode.isin(model_settings.DRIVING_MODES)].copy() + av_vehicles = vehicles[vehicles.vehicle_type.str.contains("-AV")].copy() + driving_trips = trips[ + trips.trip_mode.isin(model_settings.DRIVING_MODES) + & trips.household_id.isin(av_vehicles.household_id) + ].copy() time_periods = driving_trips.depart.unique() time_periods.sort() - av_vehicles = vehicles[vehicles.vehicle_type.str.contains('-AV')].copy() if av_vehicles.empty or driving_trips.empty: logger.info("No AVs or trips to process, skipping AV routing.") return - + # prepping vehicle table for models: labeling vehicles and adding init location to home - av_vehicles['av_number'] = av_vehicles.groupby('household_id').cumcount() + 1 - av_vehicles['veh_location'] = households.home_zone_id.reindex(av_vehicles.household_id).values + av_vehicles["av_number"] = av_vehicles.groupby("household_id").cumcount() + 1 + av_vehicles["veh_location"] = households.home_zone_id.reindex( + av_vehicles.household_id + ).values vehicle_trips = None av_trip_matching_choices = [] @@ -457,29 +561,35 @@ def av_routing( if trips_in_period.empty: continue - trips_in_period['trip_number'] = trips_in_period.groupby('household_id').cumcount() + 1 + trips_in_period["trip_number"] = ( + trips_in_period.groupby("household_id").cumcount() + 1 + ) choices = av_trip_matching( - state, - model_settings, - trips=trips_in_period, - vehicles=av_vehicles, - trace_label=trace_label + state, + model_settings, + trips=trips_in_period, + vehicles=av_vehicles, + trace_label=tracing.extend_trace_label( + trace_label, str(time_period), "av_trip_matching" + ), ) - - choices['time_period'] = time_period + + choices["time_period"] = time_period av_trip_matching_choices.append(choices) vehicle_trips = execute_av_trip_matches( - state, - model_settings, - choices, - vehicle_trips, - trips_in_period, - av_vehicles + state, model_settings, choices, vehicle_trips, trips_in_period, av_vehicles ) av_vehicles = update_vehicle_positions(vehicle_trips, av_vehicles) - av_repositioning() + av_repositioning( + state, + driving_trips, + trips=trips_in_period, + vehicles=av_vehicles, + trace_label=tracing.extend_trace_label(trace_label, str(time_period)), + ) av_trip_matching_choices = pd.concat(av_trip_matching_choices, ignore_index=False) + state.add_table("vehicle_trips", vehicle_trips) From 0629a2cbc514339f04f84c2930ed52d6a8952750 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 28 Jul 2025 13:55:43 -0700 Subject: [PATCH 03/53] av_repositioning with next trip alternatives --- .../configs/resident/av_repositioning.csv | 18 ++ .../av_repositioning_coefficients.csv | 5 + src/asim/extensions/av_routing.py | 237 ++++++++++++++++-- 3 files changed, 235 insertions(+), 25 deletions(-) create mode 100644 src/asim/configs/resident/av_repositioning.csv create mode 100644 src/asim/configs/resident/av_repositioning_coefficients.csv diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv new file mode 100644 index 000000000..42031b044 --- /dev/null +++ b/src/asim/configs/resident/av_repositioning.csv @@ -0,0 +1,18 @@ +Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 +util_dummy_1,Dummy variable 1,1,1,1,1,1,1,1 +# stay with person utils,,,,,,,, +util_cost_of_parking,Cost of parking at destination,1,coef_parking_cost,,,,, +util_trip_duration,Time until next trip,1,coef_trip_duration,,,,, +# go to parking utils,,,,,,,, +util_time_parking,time from vehicle location to parking,1,,coef_av_ivt,,,, +# go home utils,,,,,,,, +util_time_home,time from vehicle location to home,1,,,coef_av_ivt,,, +# service next trip util 1,,,,,,,, +util_next_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,coef_unavailable,, +util_time_to_next_trip_destination,Time to next trip destination,1,,,,coef_av_ivt,, +# service next trip util 2,,,,,,,, +util_next_trip_available,Unavailable if no next trip,next_trip_id_1 == -1,,,,,coef_unavailable, +util_time_to_next_trip_origin,Time to next trip origin,1,,,,,coef_av_ivt, +# service next trip util 3,,,,,,,, +util_next_trip_available_3,Unavailable if no next trip 3,next_trip_id_3 == -1,,,,,,coef_unavailable +util_time_to_next_trip_destination_3,Time to next trip destination 3,1,,,,,,coef_av_ivt \ No newline at end of file diff --git a/src/asim/configs/resident/av_repositioning_coefficients.csv b/src/asim/configs/resident/av_repositioning_coefficients.csv new file mode 100644 index 000000000..e680c3f47 --- /dev/null +++ b/src/asim/configs/resident/av_repositioning_coefficients.csv @@ -0,0 +1,5 @@ +coefficient_name,value,constrain +coef_unavailable,-999.0,F +coef_parking_cost,-1.0,F +coef_av_ivt,-1.0,F +coef_trip_duration,-1.0,F diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 9751db515..fe6e192ed 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -41,10 +41,35 @@ class AVRoutingSettings(LogitComponentSettings): """List of modes that are eligible for routing with a household AV""" +def setup_model_settings(state, model_settings): + """ + Reading the coefficients and spec files so we aren't reading every time period + """ + model_settings.AV_TRIP_MATCHING_SPEC = state.filesystem.read_model_spec( + file_name=model_settings.AV_TRIP_MATCHING_SPEC + ) + model_settings.AV_TRIP_MATCHING_COEFFICIENTS = ( + state.filesystem.read_model_coefficients( + file_name=model_settings.AV_TRIP_MATCHING_COEFFICIENTS + ) + ) + + model_settings.AV_REPOSITIONING_SPEC = state.filesystem.read_model_spec( + file_name=model_settings.AV_REPOSITIONING_SPEC + ) + model_settings.AV_REPOSITIONING_COEFFICIENTS = ( + state.filesystem.read_model_coefficients( + file_name=model_settings.AV_REPOSITIONING_COEFFICIENTS + ) + ) + + return model_settings + + def setup_skims(network_los): """ Setup skims for AV routing. - FIXME this should eventually be replaced with abm.models.util.logsums setup_skims function from the pnr work + """ skim_dict = network_los.get_default_skim_dict() @@ -372,14 +397,11 @@ def av_trip_matching( interaction_df, slicer="household_id" ) - model_spec_raw = state.filesystem.read_model_spec( - file_name=model_settings.AV_TRIP_MATCHING_SPEC - ) - coefficients_df = state.filesystem.read_model_coefficients( - file_name=model_settings.AV_TRIP_MATCHING_COEFFICIENTS - ) model_spec = simulate.eval_coefficients( - state, model_spec_raw, coefficients_df, estimator=None + state, + model_settings.AV_TRIP_MATCHING_SPEC, + model_settings.AV_TRIP_MATCHING_COEFFICIENTS, + estimator=None, ) constants = config.get_model_constants(model_settings) @@ -501,15 +523,166 @@ def av_trip_matching( return choices +def get_next_household_trips_to_service( + state, + choosers: pd.DataFrame, + av_eligible_trips: pd.DataFrame, + av_vehicles: pd.DataFrame, +) -> pd.DataFrame: + """ + Get the next household trips to service for each AV vehicle. + Eligible trips are those that satisfy the following conditions: + - the trip origin is not at home + - the trip does not have an AV at their current location + - exists in households that had an AV service a trip in this time period + - is the next trip + + Parameters: + state: The current state of the simulation. + choosers: DataFrame containing the choosers (AV vehicles). + av_eligible_trips: DataFrame containing the eligible trips for AV routing. + av_vehicles: DataFrame containing all AV vehicles. + + Returns: + choosers with selected next trip info attached as new columns, e.g. + next_trip_id_1, next_trip_depart_1, next_trip_origin_1, next_trip_destination_1, next_trip_id_2,... + """ + + # get the next trip for each person in the household that are not at home + next_hh_trips = ( + av_eligible_trips[ + av_eligible_trips.household_id.isin(choosers.household_id) + & (av_eligible_trips.depart > choosers["depart"].max()) + & (av_eligible_trips.origin != av_eligible_trips.home_zone_id) + ] + .reset_index() + .sort_values(by=["depart", "trip_num"]) + .groupby(["household_id", "person_id"]) + .first() + .reset_index() + .set_index("trip_id") + ) + + # remove the trip if there is already an AV at the trip origin + # this also takes care of the AV trying to reposition to its current location + next_hh_trips_x_av = next_hh_trips.reset_index().merge( + av_vehicles[["household_id", "veh_location"]], + on="household_id", + how="inner", + ) + trips_with_av_at_origin = next_hh_trips_x_av[ + next_hh_trips_x_av.origin == next_hh_trips_x_av.veh_location + ] + next_hh_trips = next_hh_trips[ + ~next_hh_trips.index.isin(trips_with_av_at_origin.trip_id) + ] + + # select only the first 3 possible trips to reroute to + next_hh_trips = next_hh_trips.groupby("household_id").head(3).reset_index() + # number the trips + next_hh_trips["next_trip_number"] = ( + next_hh_trips.groupby("household_id").cumcount() + 1 + ) + + trip_columns_to_keep = [ + "trip_id", + "person_id", + "household_id", + "depart", + "origin", + "destination", + ] + + # loop through next_trip_number and add the trip info to choosers + for next_trip_num in range(1, 4): + next_trips = next_hh_trips[next_hh_trips.next_trip_number == next_trip_num][ + trip_columns_to_keep + ] + next_trips.columns = [ + f"next_{col}_{next_trip_num}" for col in trip_columns_to_keep + ] + next_trips.rename( + columns={f"next_household_id_{next_trip_num}": "household_id"}, inplace=True + ) + choosers = choosers.merge(next_trips, on="household_id", how="left") + + # fill NaN values with -1 so skims and stuff works with utility expressions + choosers.fillna(-1, inplace=True) + + return choosers + + def av_repositioning( state, model_settings: AVRoutingSettings, + veh_trips_this_period: pd.DataFrame, + av_eligible_trips: pd.DataFrame, + av_vehicles: pd.DataFrame, + trace_label: str, ) -> None: - """Reposition AVs based on household needs.""" - logger.info("Repositioning AVs based on household needs...") - # Implement repositioning logic here + """ + Reposition AVs based on household needs. + + Alternatives are: + 1. Stay with person + 2. Go to remote parking + 3. Go home + 4. Service another household trip + + Choosers of this model are av vehicles who serviced a trip during this time period + as determined by the av_trip_matching model. We are now deciding where to go after + they have dropped off their rider. + + Parameters: + state: The current state of the simulation. + model_settings: The settings for the AV routing model. + veh_trips_this_period: DataFrame containing trips made by household AVs in this time period. + av_eligible_trips: DataFrame containing trips eligible for AV routing. + av_vehicles: DataFrame containing all AV vehicles. + trace_label: Label for tracing the repositioning choices. + + Returns: + veh_trips_this_period: input dataframe with additional repositioning trips appended + """ + + choosers = veh_trips_this_period.copy() + + # choosers['nearest_av_parking_zone_id'] = get_nearest_parking_zone_id(state, choosers) + + choosers = get_next_household_trips_to_service( + state, choosers, av_eligible_trips, av_vehicles + ) + + model_spec = simulate.eval_coefficients( + state, + model_settings.AV_REPOSITIONING_SPEC, + model_settings.AV_REPOSITIONING_COEFFICIENTS, + estimator=None, + ) + constants = config.get_model_constants(model_settings) + + state.get_rn_generator().add_channel("av_repositioning", choosers) + + choices = simulate.simple_simulate( + state, + choosers=choosers, + spec=model_spec, + nest_spec=None, + locals_d=constants, + trace_label=trace_label, + trace_choice_name="transponder_ownership", + estimator=None, + compute_settings=model_settings.compute_settings, + ) + + # convert indexes to alternative names + choices = pd.Series(model_spec.columns[choices.values], index=choices.index) + + state.get_rn_generator().drop_channel("av_repositioning") - pass + # veh_trips_this_period = reposition_avs(choosers, choices) + + return veh_trips_this_period @workflow.step @@ -531,20 +704,24 @@ def av_routing( state.filesystem, model_settings_file_name, ) + model_settings = setup_model_settings(state, model_settings) av_vehicles = vehicles[vehicles.vehicle_type.str.contains("-AV")].copy() - driving_trips = trips[ + av_eligible_trips = trips[ trips.trip_mode.isin(model_settings.DRIVING_MODES) & trips.household_id.isin(av_vehicles.household_id) ].copy() - time_periods = driving_trips.depart.unique() + time_periods = av_eligible_trips.depart.unique() time_periods.sort() - if av_vehicles.empty or driving_trips.empty: + if av_vehicles.empty or av_eligible_trips.empty: logger.info("No AVs or trips to process, skipping AV routing.") return - # prepping vehicle table for models: labeling vehicles and adding init location to home + # prepping table for models: labeling vehicles and adding init location to home + av_eligible_trips["home_zone_id"] = av_eligible_trips.household_id.map( + households.home_zone_id.to_dict() + ) av_vehicles["av_number"] = av_vehicles.groupby("household_id").cumcount() + 1 av_vehicles["veh_location"] = households.home_zone_id.reindex( av_vehicles.household_id @@ -552,12 +729,14 @@ def av_routing( vehicle_trips = None av_trip_matching_choices = [] + all_veh_trips = [] # looping through time periods for time_period in time_periods: + period_trace_label = tracing.extend_trace_label(trace_label, str(time_period)) # trips in the time period - trips_in_period = driving_trips[driving_trips.depart == time_period] + trips_in_period = av_eligible_trips[av_eligible_trips.depart == time_period] if trips_in_period.empty: continue @@ -571,25 +750,33 @@ def av_routing( trips=trips_in_period, vehicles=av_vehicles, trace_label=tracing.extend_trace_label( - trace_label, str(time_period), "av_trip_matching" + period_trace_label, "av_trip_matching" ), ) choices["time_period"] = time_period av_trip_matching_choices.append(choices) - vehicle_trips = execute_av_trip_matches( + veh_trips_this_period = execute_av_trip_matches( state, model_settings, choices, vehicle_trips, trips_in_period, av_vehicles ) - av_vehicles = update_vehicle_positions(vehicle_trips, av_vehicles) - av_repositioning( + av_vehicles = update_vehicle_positions(veh_trips_this_period, av_vehicles) + veh_trips_this_period = av_repositioning( state, - driving_trips, - trips=trips_in_period, - vehicles=av_vehicles, - trace_label=tracing.extend_trace_label(trace_label, str(time_period)), + model_settings, + veh_trips_this_period, + av_eligible_trips, + av_vehicles, + trace_label=tracing.extend_trace_label( + period_trace_label, "av_repositioning" + ), ) + # again update vehicle positions after av_repositioning model + av_vehicles = update_vehicle_positions(veh_trips_this_period, av_vehicles) + all_veh_trips.append(veh_trips_this_period) av_trip_matching_choices = pd.concat(av_trip_matching_choices, ignore_index=False) + # create one table of all vehicle trips and add to pipeline + vehicle_trips = pd.concat(all_veh_trips, ignore_index=False) state.add_table("vehicle_trips", vehicle_trips) From f2c9127fc0c1ebbd3837b479b639ece698754f4d Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 18 Aug 2025 11:44:48 -0700 Subject: [PATCH 04/53] running with av_repositioning --- .../configs/resident/av_repositioning.csv | 4 +- .../av_repositioning_preprocessor.csv | 5 + src/asim/configs/resident/av_routing.yaml | 25 +- .../configs/resident/av_trip_matching.csv | 7 +- .../av_trip_matching_coefficients.csv | 2 + .../av_trip_matching_preprocessor.csv | 5 + src/asim/extensions/av_routing.py | 335 +++++++++++++++--- 7 files changed, 322 insertions(+), 61 deletions(-) create mode 100644 src/asim/configs/resident/av_repositioning_preprocessor.csv create mode 100644 src/asim/configs/resident/av_trip_matching_preprocessor.csv diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 42031b044..8cda2f589 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -8,10 +8,10 @@ util_time_parking,time from vehicle location to parking,1,,coef_av_ivt,,,, # go home utils,,,,,,,, util_time_home,time from vehicle location to home,1,,,coef_av_ivt,,, # service next trip util 1,,,,,,,, -util_next_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,coef_unavailable,, +util_next_trip_available,Unavailable if no next trip,next_trip_id_1 == -1,,,,coef_unavailable,, util_time_to_next_trip_destination,Time to next trip destination,1,,,,coef_av_ivt,, # service next trip util 2,,,,,,,, -util_next_trip_available,Unavailable if no next trip,next_trip_id_1 == -1,,,,,coef_unavailable, +util_next_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,,coef_unavailable, util_time_to_next_trip_origin,Time to next trip origin,1,,,,,coef_av_ivt, # service next trip util 3,,,,,,,, util_next_trip_available_3,Unavailable if no next trip 3,next_trip_id_3 == -1,,,,,,coef_unavailable diff --git a/src/asim/configs/resident/av_repositioning_preprocessor.csv b/src/asim/configs/resident/av_repositioning_preprocessor.csv new file mode 100644 index 000000000..6ee8bb7d3 --- /dev/null +++ b/src/asim/configs/resident/av_repositioning_preprocessor.csv @@ -0,0 +1,5 @@ +Description,Target,Expression +departure time map,_depart_time_map,trips.groupby('tour_id')['depart'].shift(-1).to_dict() +next trip start time,next_depart,df['trip_id'].map(_depart_time_map) +trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" +duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" diff --git a/src/asim/configs/resident/av_routing.yaml b/src/asim/configs/resident/av_routing.yaml index 6d9ee38de..8fbf92cd4 100644 --- a/src/asim/configs/resident/av_routing.yaml +++ b/src/asim/configs/resident/av_routing.yaml @@ -9,16 +9,27 @@ AV_REPOSITIONING_COEFFICIENTS: av_repositioning_coefficients.csv # needed to pass logit settings validation, but not used in this model SPEC: None +# Column in landuse DataFrame that indicates if a zone has AV parking available +AV_PARKING_ZONE_COLUMN: remoteAVParking + +# Skim core for nearest parking zone calculations +NEAREST_ZONE_SKIM: DIST + # List of modes that are eligible for routing with a household AV DRIVING_MODES: - DRIVEALONE - SHARED2 - SHARED3 -# av_trip_matching_preprocessor: -# SPEC: av_trip_matching_preprocessor.csv -# DF: df -# TABLES: -# - land_use -# - tours -# - vehicles \ No newline at end of file +av_trip_matching_preprocessor: + SPEC: av_trip_matching_preprocessor.csv + DF: df + TABLES: + - trips + +av_repositioning_preprocessor: + SPEC: av_repositioning_preprocessor.csv + DF: df + TABLES: + - trips + - land_use \ No newline at end of file diff --git a/src/asim/configs/resident/av_trip_matching.csv b/src/asim/configs/resident/av_trip_matching.csv index 49edddbfe..e8f888551 100644 --- a/src/asim/configs/resident/av_trip_matching.csv +++ b/src/asim/configs/resident/av_trip_matching.csv @@ -1,5 +1,10 @@ Label,Description,Expression,coefficient util_dummy_1,Dummy variable 1,1,coef_one +util_veh_to_trip_origin_time,Time veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, veho_tripo_t_skims['SOV_TR_L_TIME'])",coef_ivt +util_veh_to_trip_origin_cost,cost veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, (df.auto_operating_cost * veho_tripo_t_skims['SOV_TR_L_DIST']) + veho_tripo_t_skims['SOV_TR_L_TOLLCOST'])",coef_cost +# *14 multiplier to convert from ivt to reliability as used in previous iteration,,, +util_veh_to_trip_origin_reliability,reliability veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, veho_tripo_t_skims['SOV_NT_L_REL']) * 14",coef_ivt +util_trip_duration,Trip duration,df.duration_benefit,coef_ivt util_no_vehicle,Alternative unavailable if no vehicle,df.vehicle_id.isna() & (df.trip_number > 0),coef_unavailable util_no_trip,unavailable if no trip and alt is not idle,df.trip_id.isna() & (df.trip_number > 0),coef_unavailable -util_idle,Do not service any trips,(df.trip_number == 0) & ~df.vehicle_id.isna(),coef_idle \ No newline at end of file +util_idle,Do not service any trips,(df.trip_number == 0) & ~df.vehicle_id.isna(),coef_idle diff --git a/src/asim/configs/resident/av_trip_matching_coefficients.csv b/src/asim/configs/resident/av_trip_matching_coefficients.csv index 386cc04b7..1fb6e3530 100644 --- a/src/asim/configs/resident/av_trip_matching_coefficients.csv +++ b/src/asim/configs/resident/av_trip_matching_coefficients.csv @@ -2,3 +2,5 @@ coefficient_name,value,constrain coef_unavailable,-999.0,F coef_one,1.0,F coef_idle,-10.0,F +coef_ivt,-0.03,F +coef_cost,-0.002,F \ No newline at end of file diff --git a/src/asim/configs/resident/av_trip_matching_preprocessor.csv b/src/asim/configs/resident/av_trip_matching_preprocessor.csv new file mode 100644 index 000000000..6ee8bb7d3 --- /dev/null +++ b/src/asim/configs/resident/av_trip_matching_preprocessor.csv @@ -0,0 +1,5 @@ +Description,Target,Expression +departure time map,_depart_time_map,trips.groupby('tour_id')['depart'].shift(-1).to_dict() +next trip start time,next_depart,df['trip_id'].map(_depart_time_map) +trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" +duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index fe6e192ed..0821bfe61 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -21,6 +21,9 @@ logger = logging.getLogger(__name__) +# This is a global variable to store the mapping of zones to the nearest parking zone. +PARKING_ZONE_MAP = {} + class AVRoutingSettings(LogitComponentSettings): """ @@ -37,6 +40,10 @@ class AVRoutingSettings(LogitComponentSettings): av_repositioning_preprocessor: PreprocessorSettings | None = None + AV_PARKING_ZONE_COLUMN: str + + NEAREST_ZONE_SKIM: str = "DIST" + DRIVING_MODES: list[str] """List of modes that are eligible for routing with a household AV""" @@ -66,51 +73,39 @@ def setup_model_settings(state, model_settings): return model_settings -def setup_skims(network_los): +def setup_skims_trip_matching(state, interaction_df: pd.DataFrame): """ Setup skims for AV routing. - """ - + network_los = state.get_injectable("network_los") skim_dict = network_los.get_default_skim_dict() - # setup skim keys - out_time_col_name = "start" - in_time_col_name = "end" - orig_col_name = "origin" - dest_col_name = "destination" - # creating skim wrappers - odt_skim_stack_wrapper = skim_dict.wrap_3d( - orig_key=orig_col_name, dest_key=dest_col_name, dim3_key="out_period" + vo_to_t_skim_stack_wrapper = skim_dict.wrap_3d( + orig_key="veh_location", dest_key="origin", dim3_key="out_period" ) - - dot_skim_stack_wrapper = skim_dict.wrap_3d( - orig_key=dest_col_name, dest_key=orig_col_name, dim3_key="in_period" + trip_odt_skim_wrapper = skim_dict.wrap_3d( + orig_key="origin", dest_key="destination", dim3_key="out_period" ) - odr_skim_stack_wrapper = skim_dict.wrap_3d( - orig_key=orig_col_name, dest_key=dest_col_name, dim3_key="in_period" - ) - dor_skim_stack_wrapper = skim_dict.wrap_3d( - orig_key=dest_col_name, dest_key=orig_col_name, dim3_key="out_period" - ) - od_skim_stack_wrapper = skim_dict.wrap(orig_col_name, dest_col_name) - do_skim_stack_wrapper = skim_dict.wrap(dest_col_name, orig_col_name) skims = { - "odt_skims": odt_skim_stack_wrapper, - "dot_skims": dot_skim_stack_wrapper, - "odr_skims": odr_skim_stack_wrapper, # dot return skims for e.g. TNC bridge return fare - "dor_skims": dor_skim_stack_wrapper, # odt return skims for e.g. TNC bridge return fare - "od_skims": od_skim_stack_wrapper, - "do_skims": do_skim_stack_wrapper, - "orig_col_name": orig_col_name, - "dest_col_name": dest_col_name, - "out_time_col_name": out_time_col_name, - "in_time_col_name": in_time_col_name, + "odt_skims": trip_odt_skim_wrapper, + "veho_tripo_t_skims": vo_to_t_skim_stack_wrapper, } - return skims + # updating interaction_df with skim compliant values + interaction_df["out_period"] = network_los.skim_time_period_label( + interaction_df["depart"].fillna(interaction_df["depart"].mode()[0]) + ) + interaction_df["veh_location"] = ( + interaction_df["veh_location"].fillna(-1).astype(int) + ) + interaction_df["origin"] = interaction_df["origin"].fillna(-1).astype(int) + interaction_df["destination"] = interaction_df["destination"].fillna(-1).astype(int) + + simulate.set_skim_wrapper_targets(interaction_df, skims) + + return skims, interaction_df def construct_av_to_trip_alternatives(num_avs, num_trips): @@ -331,6 +326,8 @@ def execute_av_trip_matches( all_veh_trips.vehicle_id.notna().all() ), "There should be a vehicle_id for each trip made by an AV" + # FIXME add trip to table if the AV is not at the trip origin! + return vehicle_trips @@ -345,10 +342,12 @@ def update_vehicle_positions(vehicle_trips, av_vehicles): Returns: av_vehicles: The updated AV vehicles DataFrame with vehicle_location """ - # get the rows with the latest depart time for each trip - latest_trips = vehicle_trips.loc[ - vehicle_trips.groupby(["household_id", "vehicle_id"])["depart"].idxmax() - ].set_index("vehicle_id") + # get the rows with the latest depart time for each vehicle (last instance if multiple have same time) + latest_trips = ( + vehicle_trips.groupby(["household_id", "vehicle_id"]) + .tail(1) + .set_index("vehicle_id") + ) # update the vehicle_location in av_vehicles with the latest trip's destination av_vehicles.loc[latest_trips.index, "veh_location"] = latest_trips["destination"] @@ -406,15 +405,22 @@ def av_trip_matching( constants = config.get_model_constants(model_settings) # setup skim wrappers - # skims = setup_skims(network_los=state.get_injectable("network_los")) - # simulate.set_skim_wrapper_targets(interaction_df, skims) + skims, interaction_df = setup_skims_trip_matching(state, interaction_df) - locals_d = { - # "skims": skims, - } + locals_d = skims if constants is not None: locals_d.update(constants) + expressions.annotate_preprocessors( + state, + df=interaction_df, + locals_dict=locals_d, + skims=None, + model_settings=model_settings, + trace_label=trace_label, + preprocessor_setting_name="av_trip_matching_preprocessor", + ) + # evaluate expressions from the spec multiply by coefficients and sum # spec is df with one row per spec expression and one col with utility coefficient # column names of model_design match spec index values @@ -530,12 +536,12 @@ def get_next_household_trips_to_service( av_vehicles: pd.DataFrame, ) -> pd.DataFrame: """ - Get the next household trips to service for each AV vehicle. + Get the next 3 household trips to service for each AV vehicle. Eligible trips are those that satisfy the following conditions: - the trip origin is not at home - the trip does not have an AV at their current location - exists in households that had an AV service a trip in this time period - - is the next trip + - is the next trip for the person in the household Parameters: state: The current state of the simulation. @@ -609,9 +615,207 @@ def get_next_household_trips_to_service( # fill NaN values with -1 so skims and stuff works with utility expressions choosers.fillna(-1, inplace=True) + # adding home zone so we can use it for go_to_home option + home_zone_map = av_eligible_trips.drop_duplicates(subset="household_id").set_index( + "household_id" + )["home_zone_id"] + choosers["home_zone_id"] = choosers["household_id"].map(home_zone_map) + return choosers +def get_nearest_parking_zone_id( + state, model_settings: AVRoutingSettings, choosers: pd.DataFrame +) -> pd.Series: + """ + Get the nearest parking zone ID for each AV vehicle needing repositioning. + + Parameters: + state: The current state of the simulation. + choosers: DataFrame containing the choosers (AV vehicles). + + Returns: + Series with nearest parking zone IDs indexed by household_id. + """ + # grabbing zones that have parking available + landuse = state.get_table("land_use") + parking_zones = landuse[landuse[model_settings.AV_PARKING_ZONE_COLUMN] == 1].index + + if parking_zones.empty: + logger.warning("No parking zones available for AVs.") + return pd.Series(-1, index=choosers.index, name="nearest_av_parking_zone_id") + + def nearest_skim(skim_dict, skim_name, oz, zones): + # need to pass equal # of origins and destinations to skim_dict + orig_zones = np.full(shape=len(zones), fill_value=oz, dtype=int) + return ( + oz, + zones[np.argmin(skim_dict.lookup(orig_zones, zones, skim_name))], + ) + + # only need to find nearest zone for zones not already in PARKING_ZONE_MAP + unmatched_zones = choosers.destination[ + ~choosers.destination.isin(PARKING_ZONE_MAP.keys()) + ].unique() + + # check if we even need to find any more nearest zones + if unmatched_zones.size == 0: + return choosers.destination.map(PARKING_ZONE_MAP) + + # get nearest zones from skims + skim_dict = state.get_injectable("skim_dict") + nearest_zones = [ + nearest_skim(skim_dict, model_settings.NEAREST_ZONE_SKIM, oz, parking_zones) + for oz in unmatched_zones + ] + + # update PARKING_ZONE_MAP with nearest parking zone for each unmatched zone + PARKING_ZONE_MAP.update(dict(nearest_zones)) + + assert choosers.destination.isin( + PARKING_ZONE_MAP + ).all(), "All vehicle locations should have a corresponding parking zone in PARKING_ZONE_MAP" + + return choosers.destination.map(PARKING_ZONE_MAP) + + +def reposition_avs_from_choice(state, veh_trips_this_period, choosers): + """ + Reposition AVs based on the choices made by the AV routing model. + + Parameters: + state: The current state of the simulation. + veh_trips_this_period: DataFrame containing trips made by household AVs in this time period. + choices: Series containing the chosen alternatives for each chooser. + """ + # make sure all choices are one of the expected options + expected_choices = [ + "go_home", + "go_to_parking", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3", + "stay_with_person", + ] + assert ( + veh_trips_this_period["av_repositioning_choice"].isin(expected_choices).all() + ), "All repositioning choices should be one of the expected options" + + # first duplicating all trips in this period + new_veh_trips = veh_trips_this_period.copy() + new_veh_trips["origin"] = new_veh_trips["destination"] + new_veh_trips["destination"] = pd.NA + + # updating location to home for vehicles going home + go_home_mask = new_veh_trips["av_repositioning_choice"] == "go_home" + new_veh_trips.loc[go_home_mask, "destination"] = choosers.loc[ + go_home_mask, "home_zone_id" + ] + + # updating location to nearest parking zone for vehicles going to remote parking + go_park_mask = new_veh_trips["av_repositioning_choice"] == "go_to_parking" + new_veh_trips.loc[go_park_mask, "destination"] = new_veh_trips.loc[ + go_park_mask, "origin" + ].map(PARKING_ZONE_MAP) + + # updating location for those going to the next trip origin + for next_trip_num in range(1, 4): + go_next_trip_mask = ( + new_veh_trips["av_repositioning_choice"] + == f"service_next_trip_{next_trip_num}" + ) + new_veh_trips.loc[go_next_trip_mask, "destination"] = choosers.loc[ + go_next_trip_mask, f"next_origin_{next_trip_num}" + ] + + # remove any vehicles that are not repositioning + # needs to come at the end of the other options to keep indexing correct with choosers + new_veh_trips = new_veh_trips[ + new_veh_trips["av_repositioning_choice"] != "stay_with_person" + ] + + assert ( + new_veh_trips["destination"].notna().all() + ), "All repositioning trips should have a destination set or be filtered out" + + new_veh_trips["is_deadhead"] = True + na_cols = [ + "av_choice", + "av_repositioning_choice", + "trip_number", + "av_number", + "trip_id", + ] + new_veh_trips[na_cols] = pd.NA + veh_trips_this_period["is_deadhead"] = False + + # appending the new trips to the existing trips + veh_trips_this_period = pd.concat( + [veh_trips_this_period, new_veh_trips], ignore_index=True + ) + veh_trips_this_period.sort_values( + by=["household_id", "vehicle_id", "depart"], inplace=True + ) + + return veh_trips_this_period + + +def setup_skims_av_repositioning(state, choosers: pd.DataFrame): + """ + Set up skim wrappers for AV Repositioning model. + """ + network_los = state.get_injectable("network_los") + skim_dict = network_los.get_default_skim_dict() + + # creating skim wrappers + v_to_home_skim_wrapper = skim_dict.wrap_3d( + orig_key="destination", dest_key="home_zone_id", dim3_key="out_period" + ) + v_to_parking_skim_wrapper = skim_dict.wrap_3d( + orig_key="destination", + dest_key="nearest_av_parking_zone_id", + dim3_key="out_period", + ) + v_to_trip_orig1_skim_wrapper = skim_dict.wrap_3d( + orig_key="destination", dest_key="next_origin_1", dim3_key="out_period" + ) + v_to_trip_orig2_skim_wrapper = skim_dict.wrap_3d( + orig_key="destination", dest_key="next_origin_2", dim3_key="out_period" + ) + v_to_trip_orig3_skim_wrapper = skim_dict.wrap_3d( + orig_key="destination", dest_key="next_origin_3", dim3_key="out_period" + ) + next_trip_od1_skim_wrapper = skim_dict.wrap_3d( + orig_key="next_origin_1", dest_key="next_destination_1", dim3_key="out_period" + ) + next_trip_od2_skim_wrapper = skim_dict.wrap_3d( + orig_key="next_origin_2", dest_key="next_destination_2", dim3_key="out_period" + ) + next_trip_od3_skim_wrapper = skim_dict.wrap_3d( + orig_key="next_origin_3", dest_key="next_destination_3", dim3_key="out_period" + ) + + skims = { + "v_to_home_skim": v_to_home_skim_wrapper, + "v_to_parking_skim": v_to_parking_skim_wrapper, + "v_to_trip_orig1_skim": v_to_trip_orig1_skim_wrapper, + "v_to_trip_orig2_skim": v_to_trip_orig2_skim_wrapper, + "v_to_trip_orig3_skim": v_to_trip_orig3_skim_wrapper, + "next_trip_od1_skim": next_trip_od1_skim_wrapper, + "next_trip_od2_skim": next_trip_od2_skim_wrapper, + "next_trip_od3_skim": next_trip_od3_skim_wrapper, + } + + # updating choosers with skim compliant values + choosers["out_period"] = network_los.skim_time_period_label( + choosers["depart"].fillna(choosers["depart"].mode()[0]) + ) + + simulate.set_skim_wrapper_targets(choosers, skims) + + return skims, choosers + + def av_repositioning( state, model_settings: AVRoutingSettings, @@ -647,40 +851,61 @@ def av_repositioning( choosers = veh_trips_this_period.copy() - # choosers['nearest_av_parking_zone_id'] = get_nearest_parking_zone_id(state, choosers) + choosers["nearest_av_parking_zone_id"] = get_nearest_parking_zone_id( + state, model_settings, choosers + ) choosers = get_next_household_trips_to_service( state, choosers, av_eligible_trips, av_vehicles ) + skims, choosers = setup_skims_av_repositioning(state, choosers) + model_spec = simulate.eval_coefficients( state, model_settings.AV_REPOSITIONING_SPEC, model_settings.AV_REPOSITIONING_COEFFICIENTS, estimator=None, ) + + locals_d = skims constants = config.get_model_constants(model_settings) + if constants is not None: + locals_d.update(constants) state.get_rn_generator().add_channel("av_repositioning", choosers) + expressions.annotate_preprocessors( + state, + df=choosers, + locals_dict=locals_d, + skims=None, + model_settings=model_settings, + trace_label=trace_label, + preprocessor_setting_name="av_repositioning_preprocessor", + ) + choices = simulate.simple_simulate( state, choosers=choosers, spec=model_spec, nest_spec=None, - locals_d=constants, + locals_d=locals_d, trace_label=trace_label, trace_choice_name="transponder_ownership", estimator=None, compute_settings=model_settings.compute_settings, ) - # convert indexes to alternative names - choices = pd.Series(model_spec.columns[choices.values], index=choices.index) - state.get_rn_generator().drop_channel("av_repositioning") - # veh_trips_this_period = reposition_avs(choosers, choices) + veh_trips_this_period["av_repositioning_choice"] = model_spec.columns[ + choices.values + ] + + veh_trips_this_period = reposition_avs_from_choice( + state, veh_trips_this_period, choosers + ) return veh_trips_this_period @@ -698,6 +923,14 @@ def av_routing( ) -> None: """ This model performs intra-household autonomous vehicle routing. + + The code performs the following: + 1. Select only driving trips from households with AVs + 2. Loop through time periods. For each time period: + a. Match trips to AVs using the av_trip_matching model + b. Execute the trip matches to create vehicle trips + c. Reposition AVs based on the choices made by the av_repositioning model + 4. Combine all vehicle trips into a single DataFrame and add it to the state """ if model_settings is None: model_settings = AVRoutingSettings.read_settings_file( @@ -778,5 +1011,5 @@ def av_routing( av_trip_matching_choices = pd.concat(av_trip_matching_choices, ignore_index=False) # create one table of all vehicle trips and add to pipeline - vehicle_trips = pd.concat(all_veh_trips, ignore_index=False) + vehicle_trips = pd.concat(all_veh_trips, ignore_index=True) state.add_table("vehicle_trips", vehicle_trips) From 304e02b6c58db9bdac98452ee629c73e387046f3 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Tue, 19 Aug 2025 12:13:54 -0700 Subject: [PATCH 05/53] missed import in extensions init --- src/asim/extensions/__init__.py | 1 + src/asim/extensions/av_routing.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/asim/extensions/__init__.py b/src/asim/extensions/__init__.py index 971f47368..f937e727e 100644 --- a/src/asim/extensions/__init__.py +++ b/src/asim/extensions/__init__.py @@ -1,4 +1,5 @@ from . import av_ownership +from . import av_routing from . import external_identification from . import external_location_choice from . import transponder_ownership diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 0821bfe61..316f7b55f 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -831,7 +831,7 @@ def av_repositioning( 1. Stay with person 2. Go to remote parking 3. Go home - 4. Service another household trip + 4. Service another household trip (3 options for next trip) Choosers of this model are av vehicles who serviced a trip during this time period as determined by the av_trip_matching model. We are now deciding where to go after From fd9174fad5c2fba4ccc14710d06d43853b303a8b Mon Sep 17 00:00:00 2001 From: Ali Etezady <58451076+aletzdy@users.noreply.github.com> Date: Thu, 4 Sep 2025 14:25:01 -0700 Subject: [PATCH 06/53] updated utils for av repositioning --- src/asim/configs/common/constants.yaml | 3 ++ .../configs/resident/av_repositioning.csv | 18 +++++---- .../av_repositioning_coefficients.csv | 5 +-- .../av_repositioning_preprocessor.csv | 39 +++++++++++++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/asim/configs/common/constants.yaml b/src/asim/configs/common/constants.yaml index 720a0e274..8866f87e0 100644 --- a/src/asim/configs/common/constants.yaml +++ b/src/asim/configs/common/constants.yaml @@ -89,6 +89,9 @@ autoParkingCostFactorAV: {policy-AV-autoParkingCostFactor:} autoCostPerMileFactorAV: {policy-AV-autoCostPerMileFactor:} autoTerminalTimeFactorAV: {policy-AV-autoTerminalTimeFactor:} minAgeDriveAloneAV: {policy-AV-minAgeDriveAlone:} +AV_maxDuration: 1.5 # max duration for keeping car close (hrs) +AV_maxBenefit: 60 # max benefit for keeping car close (mins) +RemoteParkingCostPerHour: 3 #dollar #valueOfTime: 8.00 diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 8cda2f589..63568d3f8 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -1,18 +1,22 @@ Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 util_dummy_1,Dummy variable 1,1,1,1,1,1,1,1 # stay with person utils,,,,,,,, -util_cost_of_parking,Cost of parking at destination,1,coef_parking_cost,,,,, -util_trip_duration,Time until next trip,1,coef_trip_duration,,,,, +util_cost_of_parking,Cost of parking at destination,parking_cost,coef_cost,,,,, +util_time_stay,Stay- Need car soon,"np.where(duration_hrs 0), 60 - (60/1.5 * duration_hrs), 0)" +#Parking cost calculation,, +,free_parking_available,(df.tour_type == 'work') & df.free_parking_at_work +,is_indiv,(df.number_of_participants == 1) +person has free on-site parking at workplace,freeOnsite,"(free_parking_available)*np.where(is_indiv,1,0)" +new reimbursement amount,reimburseProportion,0 +tour primary destination,tour_dest,"reindex(tours.destination, df.tour_id)" +half tour duration,tourDuration,"reindex(tours.duration, df.tour_id)/2" +new daily parking cost with reimbursement,parkingCostDayDollars,"reindex(land_use.exp_daily, tour_dest)" +new hourly parking cost with reimbursement,parkingCostHourDollars,"reindex(land_use.exp_hourly, tour_dest)" +new monthly parking cost with reimbursement,parkingCostMonthDollars,"reindex(land_use.exp_monthly, tour_dest)" +Parking area,parkingConstrainedArea,"np.where(reindex(land_use.parking_type, tour_dest) == 1, 1, 0)" +daily cost converted to cents,parkingCostDay,parkingCostDayDollars*100 +hourly cost converted to cents,parkingCostHour,parkingCostHourDollars*100 +monthly cost converted to cents,parkingCostMonth,parkingCostMonthDollars*100 +Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"df.ptype.isin([1,3]) * is_indiv * np.minimum(parkingCostMonth/22, parkingCostDay)" +Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"df.ptype.isin([1,3]) * is_indiv * np.minimum(_parkingCostBeforeReimb, parkingCostHour * duration_hrs)" +Trip parking cost for other person types,parkingCostBeforeReimb,"np.where((~df.ptype.isin([1,3]) * is_indiv) | (is_joint), np.minimum(parkingCostDay, parkingCostHour * duration_hrs), _parkingCostBeforeReimb)" +Reimbursement applies to this tour purpose,reimbursePurpose,"reindex(tours.tour_type, df.tour_id)=='work'" +Effective parking cost for free parkers,_parkingCost,"0 * np.where(reimbursePurpose*freeOnsite,1,0)" +Effective parking cost for reimbursed parkers,_parkingCost,"np.where(is_indiv*reimbursePurpose*(1-freeOnsite), np.maximum((1-reimburseProportion) * parkingCostBeforeReimb, 0),_parkingCost)" +Effective parking cost,parkingCost,"np.where(is_joint+is_indiv*(1-reimbursePurpose), parkingCostBeforeReimb,_parkingCost)" +#,, +Slope of benefit calculation,slope, (-1)*(AV_maxBenefit / AV_maxDuration) +#,, +,parkingConstrained,"reindex(land_use.parking_type,df.destination)==1" +#,, +,coef_rel,coef_ivt*14 +,ClosestRemoteLot_DA_IVT,coef_ivt*v_to_parking_skim['SOV_TR_H_TIME'] +,ClosestRemoteLot_DA_REL,"coef_rel*v_to_parking_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_parking_skim['SOV_TR_H_DIST'])" +,ClosestRemoteLot_DA_OC,"coef_cost*(v_to_parking_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_parking_skim['SOV_TR_H_TOLLCOST)" +,util_ClosestRemoteLot,ClosestRemoteLot_DA_IVT + ClosestRemoteLot_DA_REL + ClosestRemoteLot_DA_OC +,toHome_DA_IVT,"coef_ivt*v_to_home_skim['SOV_TR_H_TIME']" +,toHome_DA_REL,"coef_rel*v_to_home_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_home_skim['SOV_TR_H_DIST'])" +,toHome_DA_OC,"coef_cost*(v_to_home_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_home_skim['SOV_TR_H_TOLLCOST)" +,util_toHome,toHome_DA_IVT + toHome_DA_REL + toHome_DA_OC +,toNext_DA_IVT,"coef_ivt*v_to_next_skim['SOV_TR_H_TIME']" +,toNext_DA_REL,"coef_rel*v_to_next_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_next_skim['SOV_TR_H_DIST'])" +,toNext_DA_OC,"coef_cost*(v_to_next_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_next_skim['SOV_TR_H_TOLLCOST)" +,util_toNext,toNext_DA_IVT + toNext_DA_REL + toNext_DA_OC From 67261c7854a809309c5931c6cf81f36424562f2a Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 8 Sep 2025 14:31:49 -0700 Subject: [PATCH 07/53] initial taxi tnc routing commit --- .../taxi_tnc_routing/taxi_tnc_routing.py | 352 ++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py new file mode 100644 index 000000000..4396c029e --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -0,0 +1,352 @@ +import numpy as np +import pandas as pd +import openmatrix as omx +import os + + +input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full" + + +def read_input_data(input_folder, skim_core): + # Read the data from the OpenMatrix file + with omx.open_file(os.path.join(input_folder, "traffic_skims_AM.omx"), "r") as f: + skim = np.array(f[skim_core]) + mapping = f.mapping(f.list_mappings()[0]) + + # Convert the data to a pandas DataFrame + cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] + # trips = pd.read_csv(os.path.join(input_folder, "final_trips.csv"), usecols=cols) + # reading subset for faster I/O + trips = pd.read_csv(os.path.join(input_folder, "final_tnc_trips.csv"), usecols=cols) + trips = trips[trips.trip_mode.isin(["TAXI", "TNC_SINGLE", "TNC_SHARED"])] + + landuse = pd.read_csv(os.path.join(input_folder, "land_use.csv")) + maz_to_taz_map = landuse.set_index("MAZ")["taz"].to_dict() + + trips["oskim_idx"] = trips["origin"].map(maz_to_taz_map).map(mapping) + trips["dskim_idx"] = trips["destination"].map(maz_to_taz_map).map(mapping) + + return trips, skim, mapping + + +def determine_time_bin(trips, bin_size): + # Create a new column for the time bin + # Convert departure time to mins, sampling within the half hour + # Then bin into the bin size (supplied in mins) + trips["time_in_mins"] = trips["depart"] * 30 + np.random.randint( + 0, 30, size=len(trips) + ) + trips["time_bin"] = trips["time_in_mins"] // bin_size + + return trips + + +def determine_potential_trip_pairs(trips, skim_data, pooling_buffer=10): + # pre-filter trips for pooling + # find pairs of trips that are within the same origin and destination buffer + # Ensure indices are integer arrays and no NA + o_idx = trips["oskim_idx"].to_numpy(dtype=int) + d_idx = trips["dskim_idx"].to_numpy(dtype=int) + trip_ids = trips["trip_id"].to_numpy() + + origin_proximity_mask = skim_data[o_idx, :] <= pooling_buffer + destination_proximity_mask = skim_data[d_idx, :] <= pooling_buffer + + # From your masks (shape: n_trips x n_zones), select only the columns for the trips’ zones + # This yields trip-to-trip boolean matrices + origin_pair_ok = origin_proximity_mask[:, o_idx] # shape: n_trips x n_trips + dest_pair_ok = destination_proximity_mask[:, d_idx] # shape: n_trips x n_trips + + # Both origin and destination must be within the buffer + pair_ok = origin_pair_ok & dest_pair_ok + + # Drop self-pairs and keep ioj->di->dj + t2 = skim_data[oj, oi] + skim_data[oi, dj] + skim_data[dj, di] # oj->oi->dj->di + t3 = skim_data[oi, oj] + skim_data[oj, dj] + skim_data[dj, di] # oi->oj->dj->di + t4 = skim_data[oj, oi] + skim_data[oi, di] + skim_data[di, dj] # oj->oi->di->dj + + # per-trip detours + d1_i = t1 - i_direct + d1_j = t1 - j_direct + d2_i = t2 - i_direct + d2_j = t2 - j_direct + d3_i = t3 - i_direct + d3_j = t3 - j_direct + d4_i = t4 - i_direct + d4_j = t4 - j_direct + + v1 = (d1_i <= max_detour) & (d1_j <= max_detour) + v2 = (d2_i <= max_detour) & (d2_j <= max_detour) + v3 = (d3_i <= max_detour) & (d3_j <= max_detour) + v4 = (d4_i <= max_detour) & (d4_j <= max_detour) + + totals = np.column_stack([t1, t2, t3, t4]) + valids = np.column_stack([v1, v2, v3, v4]) + det_i_m = np.column_stack([d1_i, d2_i, d3_i, d4_i]) + det_j_m = np.column_stack([d1_j, d2_j, d3_j, d4_j]) + + # mask invalid scenarios + totals_masked = np.where(valids, totals, np.inf) + + # choose best valid scenario + min_idx = np.argmin(totals_masked, axis=1) # 0..3 + row = np.arange(len(min_idx)) + min_total = totals_masked[row, min_idx] + valid = np.isfinite(min_total) + + route_scenario = np.where(valid, min_idx + 1, 0) # 1..4, or 0 if none valid + total_ivt = np.where(valid, min_total, np.nan) + detour_i = np.where(valid, det_i_m[row, min_idx], np.nan) + detour_j = np.where(valid, det_j_m[row, min_idx], np.nan) + + trip_pairs["route_scenario"] = route_scenario + trip_pairs["total_ivt"] = total_ivt + trip_pairs["valid"] = valid + trip_pairs["detour_i"] = detour_i + trip_pairs["detour_j"] = detour_j + trip_pairs["total_detour"] = detour_i + detour_j + + assert ( + trip_pairs[trip_pairs.valid]["detour_i"] < max_detour + ).all(), "Detour times exceed maximum allowed" + assert ( + trip_pairs[trip_pairs.valid]["detour_j"] < max_detour + ).all(), "Detour times exceed maximum allowed" + assert ( + trip_pairs[trip_pairs.valid]["route_scenario"] > 0 + ).all(), "Valid trips must have a scenario" + + print(f"\tTotal trip pairs within original OD buffer: {len(trip_pairs)}") + trip_pairs = trip_pairs[trip_pairs.valid] + print( + f"\tFound {len(trip_pairs)} valid trip pairs across {trip_pairs['trip_i'].nunique()} unique trips" + ) + print( + f"\twith an average detour times for trip i {trip_pairs['detour_i'].mean()} and trip j {trip_pairs['detour_j'].mean()}" + ) + + return trip_pairs + + +def select_mutual_best_recursive(trip_pairs: pd.DataFrame) -> pd.DataFrame: + # start from valid pairs only, keep only needed cols for speed + pairs = trip_pairs.loc[ + trip_pairs["valid"], ["trip_i", "trip_j", "total_detour"] + ].copy() + if pairs.empty: + return trip_pairs.iloc[0:0].copy() + + # deterministic tie-breaking + pairs = pairs.sort_values(["total_detour", "trip_i", "trip_j"]).reset_index( + drop=True + ) + + batches = [] + used = set() + while not pairs.empty: + # best partner for each i, and best partner for each j + best_j_for_i_idx = pairs.groupby("trip_i", sort=False)["total_detour"].idxmin() + best_j_for_i = pairs.loc[best_j_for_i_idx, ["trip_i", "trip_j", "total_detour"]] + + best_i_for_j_idx = pairs.groupby("trip_j", sort=False)["total_detour"].idxmin() + best_i_for_j = pairs.loc[best_i_for_j_idx, ["trip_j", "trip_i", "total_detour"]] + best_i_for_j.columns = ["trip_j", "trip_i", "detour_time_j"] # rename for merge + + # mutual-best intersection + mutual = best_j_for_i.merge( + best_i_for_j[["trip_i", "trip_j"]], on=["trip_i", "trip_j"], how="inner" + ) + # handle instances where trip_i is also in trip_j + mutual = mutual[~mutual["trip_j"].isin(mutual["trip_i"])] + + if mutual.empty: + # no more matches + break + + batches.append(mutual[["trip_i", "trip_j"]].copy()) + + # remove all trips that just got paired + used.update(mutual["trip_i"].to_numpy().tolist()) + used.update(mutual["trip_j"].to_numpy().tolist()) + pairs = pairs[ + ~pairs["trip_i"].isin(used) & ~pairs["trip_j"].isin(used) + ].reset_index(drop=True) + + if not batches: + return trip_pairs.iloc[0:0].copy() + + disjoint_keys = pd.concat(batches, ignore_index=True) + + # bring all attributes back from original trip_pairs + trip_matches = disjoint_keys.merge( + trip_pairs, on=["trip_i", "trip_j"], how="left" + ).reset_index(drop=True) + + # sanity checks + assert trip_matches["trip_i"].is_unique + assert trip_matches["trip_j"].is_unique + assert (~trip_matches["trip_i"].isin(trip_matches["trip_j"])).all() + + print(f"\tSelected {len(trip_matches)} disjoint pairs via recursive mutual-best") + print( + f"\twith an average detour times for trip i {trip_matches['detour_i'].mean()} and trip j {trip_matches['detour_j'].mean()}" + ) + print(f"\tAverage total detour time {trip_matches['total_detour'].mean()}") + print(f"\tAverage total in vehicle time {trip_matches['total_ivt'].mean()}") + + return trip_matches + + +def create_trip_routes(trip_matches): + trips_routed = trip_matches[["trip_i", "trip_j", "total_ivt"]].copy() + + s1_idx = [0, 1, 2, 3] # oi->oj->di->dj + s2_idx = [1, 0, 3, 2] # oj->oi->dj->di + s3_idx = [0, 1, 3, 2] # oi->oj->dj->di + s4_idx = [1, 0, 2, 3] # oj->oi->di->dj + + ods = trip_matches[ + ["o_i_skim_idx", "o_j_skim_idx", "d_i_skim_idx", "d_j_skim_idx"] + ].to_numpy() + + scenario_orders = np.array( + [s1_idx, s2_idx, s3_idx, s4_idx] + ) # index with (route_scenario-1) + rs = trip_matches["route_scenario"].to_numpy() + + valid_mask = rs > 0 + order_idx = ( + scenario_orders[rs[valid_mask] - 1] + if valid_mask.any() + else np.empty((0, 4), dtype=int) + ) + + ordered_nodes = np.full((len(trips_routed), 4), -1, dtype=int) + if valid_mask.any(): + row_idx = np.arange(len(trips_routed))[valid_mask] + ordered_nodes[valid_mask] = ods[row_idx[:, None], order_idx] + + trips_routed[ + ["origin_skim_idx", "stop1_skim_idx", "stop2_skim_idx", "destination_skim_idx"] + ] = ordered_nodes + return trips_routed + + +def create_full_trip_route_table(tnc_trips, trips_routed, skim_data): + # need to append any additional tnc trips during this time period that were not grouped + mask = ~( + tnc_trips.trip_id.isin(trips_routed.trip_i) + | tnc_trips.trip_id.isin(trips_routed.trip_j) + ) + cols = { + "trip_id": "trip_i", + "oskim_idx": "origin_skim_idx", + "dskim_idx": "destination_skim_idx", + } + single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() + single_trips["total_ivt"] = skim_data[ + single_trips.origin_skim_idx, single_trips.destination_skim_idx + ] + + full_trip_routes = pd.concat([trips_routed, single_trips], ignore_index=True) + + print( + f"\tAdded {single_trips.shape[0]} single trips for a total of {full_trip_routes.shape[0]} episodes." + ) + + return full_trip_routes + + +def create_vehicle_trips(vehicle_trips, full_trip_routes): + # Create vehicle trips from the full trip routes + pass + return vehicle_trips + + +def route_taxi_tncs(): + tnc_trips, skim, mapping = read_input_data(input_folder, "SOV_TR_H_TIME__AM") + + skim_data = np.array(skim) + + tnc_trips = determine_time_bin(tnc_trips, bin_size=15) + + vehicle_trips = pd.DataFrame( + columns=["vehicle_id", "origin", "destination", "time_bin", "trip_i", "trip_j"] + ) + + for _, tnc_trips_i in tnc_trips.groupby("time_bin"): + print( + f"Processing time bin {tnc_trips_i['time_bin'].iloc[0]} with {len(tnc_trips_i)} taxi / tnc trips:" + ) + trip_pairs = determine_potential_trip_pairs( + tnc_trips_i.copy(), skim_data, pooling_buffer=10 + ) + + trip_pairs = determine_detour_times(trip_pairs, skim_data) + + trip_matches = select_mutual_best_recursive(trip_pairs) + + shared_trips_routed = create_trip_routes(trip_matches) + + full_trip_routes = create_full_trip_route_table( + tnc_trips_i, shared_trips_routed, skim_data + ) + + vehicle_trips = create_vehicle_trips(vehicle_trips, full_trip_routes) + + return vehicle_trips + + +if __name__ == "__main__": + vehicle_trips = route_taxi_tncs() + print(f"Created {len(vehicle_trips)} vehicle trips.") From 5b256eefa5ccc165a78d8602d29aadf3cc72ee01 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 10 Sep 2025 12:35:26 -0700 Subject: [PATCH 08/53] add timing to tnc routing --- src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 4396c029e..3bfdd9917 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -2,7 +2,7 @@ import pandas as pd import openmatrix as omx import os - +import time input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full" @@ -109,7 +109,7 @@ def determine_detour_times(trip_pairs, skim_data, max_detour=15): j_direct = skim_data[oj, dj] # scenario totals - # WARNING if these scenarios are changes, they also need to be changed downstream in the routing + # WARNING if these scenarios are changed, they also need to be changed downstream in the routing t1 = skim_data[oi, oj] + skim_data[oj, di] + skim_data[di, dj] # oi->oj->di->dj t2 = skim_data[oj, oi] + skim_data[oi, dj] + skim_data[dj, di] # oj->oi->dj->di t3 = skim_data[oi, oj] + skim_data[oj, dj] + skim_data[dj, di] # oi->oj->dj->di @@ -348,5 +348,11 @@ def route_taxi_tncs(): if __name__ == "__main__": + start_time = time.time() + vehicle_trips = route_taxi_tncs() print(f"Created {len(vehicle_trips)} vehicle trips.") + + end_time = time.time() + elapsed_time = end_time - start_time + print(f"Time to complete: {elapsed_time:.2f} seconds") From ca813ecb497b66ec73929fb131bec6ac526191bd Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 12 Sep 2025 09:45:38 -0700 Subject: [PATCH 09/53] working av_repositioning configs --- .../configs/resident/av_repositioning.csv | 31 ++++++---- .../av_repositioning_coefficients.csv | 2 +- .../av_repositioning_preprocessor.csv | 59 +++++++++++-------- src/asim/configs/resident/av_routing.yaml | 4 +- .../av_trip_matching_preprocessor.csv | 3 +- src/asim/extensions/av_routing.py | 6 +- 6 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 63568d3f8..49eb0519d 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -1,22 +1,31 @@ Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 util_dummy_1,Dummy variable 1,1,1,1,1,1,1,1 # stay with person utils,,,,,,,, -util_cost_of_parking,Cost of parking at destination,parking_cost,coef_cost,,,,, -util_time_stay,Stay- Need car soon,"np.where(duration_hrs 0), 60 - (60/1.5 * duration_hrs), 0)" #Parking cost calculation,, -,free_parking_available,(df.tour_type == 'work') & df.free_parking_at_work -,is_indiv,(df.number_of_participants == 1) +,tour_id,"reindex(trips.tour_id, df.trip_id)" +,tour_type,"reindex(tours.tour_type, tour_id)" +,person_id,"reindex(trips.person_id, df.trip_id)" +,ptype,"reindex(persons.ptype, person_id)" +,free_parking_at_work,"reindex(persons.free_parking_at_work, person_id)" +,free_parking_available,(tour_type == 'work') & free_parking_at_work +,number_of_participants,"reindex(tours.number_of_participants, tour_id)" +,is_indiv,(number_of_participants == 1) person has free on-site parking at workplace,freeOnsite,"(free_parking_available)*np.where(is_indiv,1,0)" new reimbursement amount,reimburseProportion,0 -tour primary destination,tour_dest,"reindex(tours.destination, df.tour_id)" -half tour duration,tourDuration,"reindex(tours.duration, df.tour_id)/2" +tour primary destination,tour_dest,"reindex(tours.destination, tour_id)" +half tour duration,tourDuration,"reindex(tours.duration, tour_id)/2" new daily parking cost with reimbursement,parkingCostDayDollars,"reindex(land_use.exp_daily, tour_dest)" new hourly parking cost with reimbursement,parkingCostHourDollars,"reindex(land_use.exp_hourly, tour_dest)" new monthly parking cost with reimbursement,parkingCostMonthDollars,"reindex(land_use.exp_monthly, tour_dest)" -Parking area,parkingConstrainedArea,"np.where(reindex(land_use.parking_type, tour_dest) == 1, 1, 0)" daily cost converted to cents,parkingCostDay,parkingCostDayDollars*100 hourly cost converted to cents,parkingCostHour,parkingCostHourDollars*100 monthly cost converted to cents,parkingCostMonth,parkingCostMonthDollars*100 -Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"df.ptype.isin([1,3]) * is_indiv * np.minimum(parkingCostMonth/22, parkingCostDay)" -Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"df.ptype.isin([1,3]) * is_indiv * np.minimum(_parkingCostBeforeReimb, parkingCostHour * duration_hrs)" -Trip parking cost for other person types,parkingCostBeforeReimb,"np.where((~df.ptype.isin([1,3]) * is_indiv) | (is_joint), np.minimum(parkingCostDay, parkingCostHour * duration_hrs), _parkingCostBeforeReimb)" -Reimbursement applies to this tour purpose,reimbursePurpose,"reindex(tours.tour_type, df.tour_id)=='work'" +Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"ptype.isin([1,3]).values * is_indiv * np.minimum(parkingCostMonth/22, parkingCostDay)" +Trip parking cost for full-time workers and university students,_parkingCostBeforeReimb,"ptype.isin([1,3]).values * is_indiv * np.minimum(_parkingCostBeforeReimb, parkingCostHour * duration_hrs)" +,is_joint,(number_of_participants > 1) +Trip parking cost for other person types,parkingCostBeforeReimb,"np.where((~ptype.isin([1,3]).values * is_indiv) | (is_joint), np.minimum(parkingCostDay, parkingCostHour * duration_hrs), _parkingCostBeforeReimb)" +Reimbursement applies to this tour purpose,reimbursePurpose,tour_type=='work' Effective parking cost for free parkers,_parkingCost,"0 * np.where(reimbursePurpose*freeOnsite,1,0)" Effective parking cost for reimbursed parkers,_parkingCost,"np.where(is_indiv*reimbursePurpose*(1-freeOnsite), np.maximum((1-reimburseProportion) * parkingCostBeforeReimb, 0),_parkingCost)" Effective parking cost,parkingCost,"np.where(is_joint+is_indiv*(1-reimbursePurpose), parkingCostBeforeReimb,_parkingCost)" -#,, +# These following two are from AutonomousVehicleAllocationChoice.xls,, +Maximim benefit for keeping car close (min),AV_maxBenefit,60 +Maximum duration for keeping car close (hrs),AV_maxDuration,1.5 Slope of benefit calculation,slope, (-1)*(AV_maxBenefit / AV_maxDuration) +# below taken from parametersByYear.csv,, +,RemoteParkingCostPerHour,0.81 #,, ,parkingConstrained,"reindex(land_use.parking_type,df.destination)==1" -#,, -,coef_rel,coef_ivt*14 -,ClosestRemoteLot_DA_IVT,coef_ivt*v_to_parking_skim['SOV_TR_H_TIME'] -,ClosestRemoteLot_DA_REL,"coef_rel*v_to_parking_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_parking_skim['SOV_TR_H_DIST'])" -,ClosestRemoteLot_DA_OC,"coef_cost*(v_to_parking_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_parking_skim['SOV_TR_H_TOLLCOST)" -,util_ClosestRemoteLot,ClosestRemoteLot_DA_IVT + ClosestRemoteLot_DA_REL + ClosestRemoteLot_DA_OC -,toHome_DA_IVT,"coef_ivt*v_to_home_skim['SOV_TR_H_TIME']" -,toHome_DA_REL,"coef_rel*v_to_home_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_home_skim['SOV_TR_H_DIST'])" -,toHome_DA_OC,"coef_cost*(v_to_home_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_home_skim['SOV_TR_H_TOLLCOST)" -,util_toHome,toHome_DA_IVT + toHome_DA_REL + toHome_DA_OC -,toNext_DA_IVT,"coef_ivt*v_to_next_skim['SOV_TR_H_TIME']" -,toNext_DA_REL,"coef_rel*v_to_next_skim['SOV_TR_H_REL']/np.maximum(0.1,v_to_next_skim['SOV_TR_H_DIST'])" -,toNext_DA_OC,"coef_cost*(v_to_next_skim['SOV_TR_H_DIST']*auto_op_cost*autoCPMFactor+v_to_next_skim['SOV_TR_H_TOLLCOST)" -,util_toNext,toNext_DA_IVT + toNext_DA_REL + toNext_DA_OC +,v_to_trip_orig1_time,"np.where(df.next_trip_id_1 > 0, v_to_trip_orig1_skim['SOV_TR_H_TIME'], 0)" +,v_to_trip_orig2_time,"np.where(df.next_trip_id_2 > 0, v_to_trip_orig2_skim['SOV_TR_H_TIME'], 0)" +,v_to_trip_orig3_time,"np.where(df.next_trip_id_3 > 0, v_to_trip_orig3_skim['SOV_TR_H_TIME'], 0)" +,v_to_trip_orig1_dist,"np.where(df.next_trip_id_1 > 0, v_to_trip_orig1_skim['SOV_TR_H_DIST'], 0)" +,v_to_trip_orig2_dist,"np.where(df.next_trip_id_2 > 0, v_to_trip_orig2_skim['SOV_TR_H_DIST'], 0)" +,v_to_trip_orig3_dist,"np.where(df.next_trip_id_3 > 0, v_to_trip_orig3_skim['SOV_TR_H_DIST'], 0)" +,v_to_trip_orig1_rel,"np.where(df.next_trip_id_1 > 0, v_to_trip_orig1_skim['SOV_TR_H_REL'], 0)" +,v_to_trip_orig2_rel,"np.where(df.next_trip_id_2 > 0, v_to_trip_orig2_skim['SOV_TR_H_REL'], 0)" +,v_to_trip_orig3_rel,"np.where(df.next_trip_id_3 > 0, v_to_trip_orig3_skim['SOV_TR_H_REL'], 0)" +,v_to_trip_orig1_toll,"np.where(df.next_trip_id_1 > 0, v_to_trip_orig1_skim['SOV_TR_H_TOLLCOST'], 0)" +,v_to_trip_orig2_toll,"np.where(df.next_trip_id_2 > 0, v_to_trip_orig2_skim['SOV_TR_H_TOLLCOST'], 0)" +,v_to_trip_orig3_toll,"np.where(df.next_trip_id_3 > 0, v_to_trip_orig3_skim['SOV_TR_H_TOLLCOST'], 0)" diff --git a/src/asim/configs/resident/av_routing.yaml b/src/asim/configs/resident/av_routing.yaml index 8fbf92cd4..e25b1d5f2 100644 --- a/src/asim/configs/resident/av_routing.yaml +++ b/src/asim/configs/resident/av_routing.yaml @@ -32,4 +32,6 @@ av_repositioning_preprocessor: DF: df TABLES: - trips - - land_use \ No newline at end of file + - land_use + - tours + - persons diff --git a/src/asim/configs/resident/av_trip_matching_preprocessor.csv b/src/asim/configs/resident/av_trip_matching_preprocessor.csv index 6ee8bb7d3..3cbe8cca7 100644 --- a/src/asim/configs/resident/av_trip_matching_preprocessor.csv +++ b/src/asim/configs/resident/av_trip_matching_preprocessor.csv @@ -1,5 +1,4 @@ Description,Target,Expression -departure time map,_depart_time_map,trips.groupby('tour_id')['depart'].shift(-1).to_dict() -next trip start time,next_depart,df['trip_id'].map(_depart_time_map) +next trip start time,next_depart,df['trip_id'].map(trips.groupby('tour_id')['depart'].shift(-1).to_dict()) trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 316f7b55f..557888a7c 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -1011,5 +1011,7 @@ def av_routing( av_trip_matching_choices = pd.concat(av_trip_matching_choices, ignore_index=False) # create one table of all vehicle trips and add to pipeline - vehicle_trips = pd.concat(all_veh_trips, ignore_index=True) - state.add_table("vehicle_trips", vehicle_trips) + av_vehicle_trips = pd.concat(all_veh_trips, ignore_index=True) + av_vehicle_trips['av_vehicle_trip_id'] = av_vehicle_trips.vehicle_id * 100 + av_vehicle_trips.groupby('vehicle_id').cumcount() + av_vehicle_trips.set_index('av_vehicle_trip_id', inplace=True) + state.add_table("av_vehicle_trips", av_vehicle_trips) From dfab2b100b8338e70d46260e39bf0b7e2e72f810 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Tue, 16 Sep 2025 15:14:44 -0700 Subject: [PATCH 10/53] vehicle to trip matching and creation of veh trips --- .../taxi_tnc_routing/taxi_tnc_routing.py | 269 ++++++++++++++++-- 1 file changed, 251 insertions(+), 18 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 3bfdd9917..04dd0226d 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -16,6 +16,7 @@ def read_input_data(input_folder, skim_core): # Convert the data to a pandas DataFrame cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] # trips = pd.read_csv(os.path.join(input_folder, "final_trips.csv"), usecols=cols) + # trips['trip_mode'] = 'TNC_SHARED' # reading subset for faster I/O trips = pd.read_csv(os.path.join(input_folder, "final_tnc_trips.csv"), usecols=cols) trips = trips[trips.trip_mode.isin(["TAXI", "TNC_SINGLE", "TNC_SHARED"])] @@ -33,6 +34,9 @@ def determine_time_bin(trips, bin_size): # Create a new column for the time bin # Convert departure time to mins, sampling within the half hour # Then bin into the bin size (supplied in mins) + + # FIXME set random seed in settings + np.random.seed(42) trips["time_in_mins"] = trips["depart"] * 30 + np.random.randint( 0, 30, size=len(trips) ) @@ -64,7 +68,7 @@ def determine_potential_trip_pairs(trips, skim_data, pooling_buffer=10): np.fill_diagonal(pair_ok, False) ii, jj = np.where(np.triu(pair_ok, k=1)) print( - f"\tFound {len(ii)} potential trip pairs from {len(trips)} trips or {(len(trips) **2)/ len(ii)}% of n**2" + f"\tFound {len(ii)} potential trip pairs from {len(trips)} trips or {(len(ii) / (len(trips) **2)) * 100:.2f}% of n**2" ) trip_pairs = pd.DataFrame( @@ -125,6 +129,7 @@ def determine_detour_times(trip_pairs, skim_data, max_detour=15): d4_i = t4 - i_direct d4_j = t4 - j_direct + # checking detour times against max detour time v1 = (d1_i <= max_detour) & (d1_j <= max_detour) v2 = (d2_i <= max_detour) & (d2_j <= max_detour) v3 = (d3_i <= max_detour) & (d3_j <= max_detour) @@ -180,9 +185,7 @@ def determine_detour_times(trip_pairs, skim_data, max_detour=15): def select_mutual_best_recursive(trip_pairs: pd.DataFrame) -> pd.DataFrame: # start from valid pairs only, keep only needed cols for speed - pairs = trip_pairs.loc[ - trip_pairs["valid"], ["trip_i", "trip_j", "total_detour"] - ].copy() + pairs = trip_pairs[["trip_i", "trip_j", "total_detour"]].copy() if pairs.empty: return trip_pairs.iloc[0:0].copy() @@ -304,29 +307,246 @@ def create_full_trip_route_table(tnc_trips, trips_routed, skim_data): f"\tAdded {single_trips.shape[0]} single trips for a total of {full_trip_routes.shape[0]} episodes." ) + assert full_trip_routes.trip_i.is_unique, "Trip IDs are not unique" + return full_trip_routes -def create_vehicle_trips(vehicle_trips, full_trip_routes): +def create_new_vehicles(vehicles, trips_to_service, trip_to_veh_map): + idx_start_num = 0 if vehicles.empty else vehicles.index.max() + + new_vehs = pd.DataFrame( + data={ + "location_skim_idx": trips_to_service.origin_skim_idx.values, + "is_free": False, + "last_refuel_time": -1, + "next_time_free": np.nan, + }, + index=idx_start_num + np.arange(1, len(trips_to_service) + 1), + ) + new_vehs.index.name = "vehicle_id" + + # updating the trip to vehicle mapping with the newly created vehicles + trip_to_veh_map.loc[trips_to_service.trip_i] = new_vehs.index.values + + if vehicles.empty: + vehicles = new_vehs + else: + vehicles = pd.concat([vehicles, new_vehs], ignore_index=False) + + return vehicles, trip_to_veh_map + + +def match_vehicles_to_trips(vehicles, full_trip_routes, skim_data): + + free_vehicles = vehicles[vehicles.is_free].copy() + unserviced_trips = full_trip_routes.copy() + + trip_to_veh_map = pd.Series( + name="vehicle_id", index=unserviced_trips.trip_i, dtype=vehicles.index.dtype + ) + + # loop until all available vehicles are assigned or there are no more unserviced trips + while not (free_vehicles.empty or unserviced_trips.empty): + + veh_locations = free_vehicles.location_skim_idx.to_numpy() + trip_origins = unserviced_trips.origin_skim_idx.to_numpy() + + # find skim times between trip origins and all veh locations + skim_times = skim_data[trip_origins[:, None], veh_locations] + + # grab the minimum time for each trip and vehicle + min_times = skim_times.min(axis=1) + + # if multiple trips match to the same vehicle, take the one with the smallest time + closest_vehicles = free_vehicles.index[np.argmin(skim_times, axis=1)] + + # map trips to their closest vehicles + trip_to_veh_map.loc[unserviced_trips.trip_i] = closest_vehicles + + # trips with a min wait time larger than the maximum allowed are removed from pool + # ties are given to the first trip as given by trip_id + time_gt_max_wait = min_times > 15 + trip_to_veh_map.loc[unserviced_trips.trip_i[time_gt_max_wait]] = np.nan + ties_mask = trip_to_veh_map.duplicated(keep="first") & trip_to_veh_map.notna() + trip_to_veh_map.loc[ties_mask] = np.nan + + # remove matched trips and vehicles from the pools or trips that have no vehs within the max wait time + serviced_trips = trip_to_veh_map[trip_to_veh_map.notna()] + unserviced_trips = unserviced_trips[ + ~(unserviced_trips.trip_i.isin(serviced_trips.index) | time_gt_max_wait) + ] + free_vehicles = free_vehicles[~free_vehicles.index.isin(serviced_trips.values)] + + if trip_to_veh_map.isna().any(): + # create new vehicles for those still unmatched + # trips without match + unserviced_mask = full_trip_routes.trip_i.isin( + trip_to_veh_map.index[trip_to_veh_map.isna()] + ) + trips_still_needing_service = full_trip_routes[unserviced_mask] + vehicles, trip_to_veh_map = create_new_vehicles( + vehicles, trips_still_needing_service, trip_to_veh_map + ) + + assert ( + not trip_to_veh_map.isna().any() + ), f"Some trips were not matched to vehicles {trip_to_veh_map[trip_to_veh_map.isna()]}" + + # return a mapping of trips.trip_i to vehicles.vehicle_id + # trips that were not matched will have an NaN vehicle_id + return vehicles, trip_to_veh_map + + +def create_vehicle_trips(full_trip_routes, vehicles, trip_to_veh_map, skim_data): # Create vehicle trips from the full trip routes + + # first turning full_trip_routes into a list of stops + pickup = full_trip_routes[["trip_i", "trip_j", "origin_skim_idx"]].rename( + columns={"origin_skim_idx": "destination_skim_idx"} + ) + # creating a temporary trip num because not all vehicles will have stops + pickup["tmp_trip_num"] = 1 + stop_1 = full_trip_routes.loc[ + full_trip_routes.stop1_skim_idx > 0, ["trip_i", "trip_j", "stop1_skim_idx"] + ].rename(columns={"stop1_skim_idx": "destination_skim_idx"}) + stop_1["tmp_trip_num"] = 2 + stop_2 = full_trip_routes.loc[ + full_trip_routes.stop2_skim_idx > 0, ["trip_i", "trip_j", "stop2_skim_idx"] + ].rename(columns={"stop2_skim_idx": "destination_skim_idx"}) + stop_2["tmp_trip_num"] = 3 + drop_off = full_trip_routes[["trip_i", "trip_j", "destination_skim_idx"]].rename( + columns={"destination_skim_idx": "destination_skim_idx"} + ) + drop_off["tmp_trip_num"] = 4 + + new_v_trips = pd.concat([pickup, stop_1, stop_2, drop_off]) + + new_v_trips["vehicle_id"] = new_v_trips["trip_i"].map(trip_to_veh_map).astype(int) + + # ensure ordering before deriving origins + new_v_trips.sort_values( + ["vehicle_id", "tmp_trip_num"], inplace=True, ignore_index=True + ) + + new_v_trips["origin_skim_idx"] = pd.NA + + # first leg origin = vehicle current location + first_leg_mask = new_v_trips.tmp_trip_num == 1 + new_v_trips.loc[first_leg_mask, "origin_skim_idx"] = new_v_trips.loc[ + first_leg_mask, "vehicle_id" + ].map(vehicles.location_skim_idx) + + # subsequent leg origin = previous leg destination (shift(1), not shift(-1)) + prev_destinations = new_v_trips.groupby("vehicle_id")["destination_skim_idx"].shift( + 1 + ) + new_v_trips.loc[~first_leg_mask, "origin_skim_idx"] = prev_destinations[ + ~first_leg_mask + ] + + assert ( + not new_v_trips.origin_skim_idx.isna().any() + ), f"Some vehicle trips do not have an origin skim index: {new_v_trips[new_v_trips.origin_skim_idx.isna()]}" + assert ( + not new_v_trips.destination_skim_idx.isna().any() + ), f"Some vehicle trips do not have a destination skim index: {new_v_trips[new_v_trips.destination_skim_idx.isna()]}" + + new_v_trips["origin_skim_idx"] = new_v_trips.origin_skim_idx.astype(int) + new_v_trips["destination_skim_idx"] = new_v_trips.destination_skim_idx.astype(int) + + # TODO fix trip_i and trip_j labels based on route scenario + + # determine time bin of each trip + new_v_trips["OD_time"] = skim_data[ + new_v_trips.origin_skim_idx.to_numpy(), + new_v_trips.destination_skim_idx.to_numpy(), + ] + new_v_trips["cumulative_trip_time"] = new_v_trips.groupby("vehicle_id")[ + "OD_time" + ].cumsum() + new_v_trips["depart_bin"] = ( + full_trip_routes.time_bin.mode()[0] + + (new_v_trips["cumulative_trip_time"] - new_v_trips["OD_time"]) // 15 + ) + new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( + new_v_trips["cumulative_trip_time"] // 15 + ) + + assert ( + new_v_trips.depart_bin <= new_v_trips.arrival_bin + ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" + + return new_v_trips + + +def update_vehicle_fleet(vehicles, vehicle_trips, time_bin): + # update the next_time_free based on the vehicle trips + next_time_free_update = ( + vehicle_trips.groupby("vehicle_id").arrival_bin.max() + 1 + ) # +1 rouding up to account for dropoff time + vehicles.loc[next_time_free_update.index, "next_time_free"] = next_time_free_update + # +1 on time bin since we are calculating the availaibility for the next time bin + vehicles["is_free"] = np.where( + (time_bin + 1 >= vehicles.next_time_free), True, False + ) + + # also want to update the vehicle location + final_veh_location = vehicle_trips.groupby("vehicle_id").destination_skim_idx.last() + vehicles.loc[final_veh_location.index, "location_skim_idx"] = final_veh_location + + return vehicles + + +def summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles): + + # Summary statistics for TNC vehicle trips + print("TNC Vehicle Trips Summary:") + print(f"Total TNC Vehicle Trips: {len(tnc_veh_trips)}") + print(f"Total TNC Trips: {len(tnc_trips)}") + print(f"Total Vehicles: {len(vehicles)}") + print(f"Vehicles to TNC Trips Ratio: {(len(vehicles) / len(tnc_trips)):.2f}") + print( + f"Average number of stops per vehicle: {(tnc_veh_trips.groupby('vehicle_id').size().mean()):.2f}" + ) + print( + f"Average time for vehicle to get to trip origin: {tnc_veh_trips[tnc_veh_trips.tmp_trip_num == 1].OD_time.mean():.2f}" + ) + + # also performing consistency checks on the outputs + assert ( + tnc_trips.trip_id.isin(tnc_veh_trips.trip_i) + | tnc_trips.trip_id.isin(tnc_veh_trips.trip_j) + ).all(), "Some trip IDs were not serviced by any vehicle trips" + assert vehicles.index.isin( + tnc_veh_trips.vehicle_id + ).all(), "Some vehicle were created but do not serve any trips" + assert ( + tnc_veh_trips.groupby("vehicle_id").size() >= 2 + ).all(), "Some vehicles do not have at least 2 trips" + pass - return vehicle_trips def route_taxi_tncs(): - tnc_trips, skim, mapping = read_input_data(input_folder, "SOV_TR_H_TIME__AM") + tnc_trips, skim, skim_zone_mapping = read_input_data( + input_folder, "SOV_TR_H_TIME__AM" + ) skim_data = np.array(skim) tnc_trips = determine_time_bin(tnc_trips, bin_size=15) - vehicle_trips = pd.DataFrame( - columns=["vehicle_id", "origin", "destination", "time_bin", "trip_i", "trip_j"] + vehicles = pd.DataFrame( + columns=["location_skim_idx", "is_free", "next_time_free", "last_refuel_time"] ) + vehicles.index.name = "vehicle_id" + + veh_trips = [] - for _, tnc_trips_i in tnc_trips.groupby("time_bin"): + for time_bin, tnc_trips_i in tnc_trips.groupby("time_bin"): print( - f"Processing time bin {tnc_trips_i['time_bin'].iloc[0]} with {len(tnc_trips_i)} taxi / tnc trips:" + f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" ) trip_pairs = determine_potential_trip_pairs( tnc_trips_i.copy(), skim_data, pooling_buffer=10 @@ -341,18 +561,31 @@ def route_taxi_tncs(): full_trip_routes = create_full_trip_route_table( tnc_trips_i, shared_trips_routed, skim_data ) + full_trip_routes["time_bin"] = time_bin - vehicle_trips = create_vehicle_trips(vehicle_trips, full_trip_routes) + vehicles, trip_to_veh_map = match_vehicles_to_trips( + vehicles, full_trip_routes, skim_data + ) + + vehicle_trips_i = create_vehicle_trips( + full_trip_routes, vehicles, trip_to_veh_map, skim_data + ) + veh_trips.append(vehicle_trips_i) - return vehicle_trips + vehicles = update_vehicle_fleet(vehicles, vehicle_trips_i, time_bin) + + tnc_veh_trips = pd.concat(veh_trips) + + summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles) + + return tnc_veh_trips if __name__ == "__main__": start_time = time.time() - vehicle_trips = route_taxi_tncs() - print(f"Created {len(vehicle_trips)} vehicle trips.") - - end_time = time.time() - elapsed_time = end_time - start_time + tnc_veh_trips = route_taxi_tncs() + print(f"Created {len(tnc_veh_trips)} vehicle trips.") + + elapsed_time = time.time() - start_time print(f"Time to complete: {elapsed_time:.2f} seconds") From 18ae0572bd92931590679eb6ae8f469fcfa59b9b Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 18 Sep 2025 15:23:31 -0700 Subject: [PATCH 11/53] runtime optimization, multiple trips on tour in time period, trip matching repositioning --- src/asim/extensions/av_routing.py | 184 ++++++++++++++++++------------ 1 file changed, 113 insertions(+), 71 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 557888a7c..f5b60c8f2 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -151,7 +151,6 @@ def build_av_to_trip_interaction_df( trips: pd.DataFrame, alts: pd.DataFrame, choosers: pd.DataFrame, - trace_label: str, ): """ Creating a table that matches a single av trip with a single trip. @@ -172,74 +171,69 @@ def build_av_to_trip_interaction_df( trips: DataFrame containing trip information. alts: DataFrame containing alternatives (AV-trip combinations). choosers: DataFrame containing choosers (households). - trace_label: Label for tracing the interaction DataFrame. Returns: interaction_df: DataFrame containing the interaction between AVs and trips. """ - interaction_dfs = [] - # looping through alternatives to build custom interaction_df - for row in alts.iterrows(): - for col in alts.columns: - av_number = int( - col.split("_")[1] - ) # Extract the AV number from the column name - trip_number = int( - row[1][col].split("_")[1] - ) # Extract the trip number from row - - av_choosers = vehicles[ - vehicles.household_id.isin(trips.household_id.unique()) - & (vehicles.av_number == av_number) - ] - trip_choosers = trips[trips.trip_number == trip_number] - - assert ( - av_choosers.household_id.is_unique - ), "There should be only one AV chooser per household at this stage" - assert ( - trip_choosers.household_id.is_unique - ), "There should be only one trip chooser per household at this stage" - - # want a complete set of household_ids for both choosers - # reindex to save trip / vehicle ID and then reindex to households which are making the choices - av_choosers = ( - av_choosers.reset_index() - .set_index("household_id") - .reindex(choosers.index, fill_value=np.nan) - ) - trip_choosers = ( - trip_choosers.reset_index() - .set_index("household_id") - .reindex(choosers.index, fill_value=np.nan) - ) - - # setting alt trip and av numbers so we can use them in spec availability conditions - av_choosers["av_number"] = av_number - trip_choosers["trip_number"] = trip_number - - # merge the tables together to create a table with columns describing the AV and the trip - interaction_df = pd.merge( - av_choosers, - trip_choosers, - on="household_id", - suffixes=("", "_trip"), - ) - interaction_df["alt"] = row[0] - - interaction_dfs.append( - interaction_df - ) # Assign the alternative index to the interaction_df - - # Concatenate all interaction DataFrames into a single DataFrame - # and sort by household_id and alt - interaction_df = pd.concat(interaction_dfs, ignore_index=False).reset_index() - interaction_df.sort_values(by=["household_id", "alt"], inplace=True) + # Long form alternatives: one row per (alt, av_number) mapping to trip_number + alts_long = alts.reset_index().melt( + id_vars="alt", var_name="av_col", value_name="trip_token" + ) + # Extract integers + alts_long["av_number"] = alts_long["av_col"].str.split("_").str[1].astype(int) + alts_long["trip_number"] = alts_long["trip_token"].str.split("_").str[1].astype(int) + + alts_long = alts_long[["alt", "av_number", "trip_number"]].sort_values( + ["alt", "av_number"] + ) + alt_rows = len(alts_long) + + # Cartesian product households x alts_long + hh_ids = choosers.index.to_numpy() + n_hh = len(hh_ids) + + base = pd.DataFrame( + { + "household_id": np.repeat(hh_ids, alt_rows), + "alt": np.tile(alts_long["alt"].to_numpy(), n_hh), + "av_number": np.tile(alts_long["av_number"].to_numpy(), n_hh), + "trip_number": np.tile(alts_long["trip_number"].to_numpy(), n_hh), + } + ) + + # Fast lookups for vehicle and trip attributes using MultiIndex reindex + veh_lookup = vehicles.reset_index(drop=False).set_index( + ["household_id", "av_number"] + ) + trip_lookup = trips.reset_index(drop=False).set_index( + ["household_id", "trip_number"] + ) + + veh_mi = pd.MultiIndex.from_arrays( + [base["household_id"].to_numpy(), base["av_number"].to_numpy()], + names=["household_id", "av_number"], + ) + trip_mi = pd.MultiIndex.from_arrays( + [base["household_id"].to_numpy(), base["trip_number"].to_numpy()], + names=["household_id", "trip_number"], + ) + + veh_block = veh_lookup.reindex(veh_mi).reset_index(drop=True) + trip_block = trip_lookup.reindex(trip_mi).reset_index(drop=True) + trip_block.columns = [ + col + "_trip" if col in veh_block.columns else col for col in trip_block.columns + ] + + # Concatenate + interaction_df = pd.concat([base, veh_block, trip_block], axis=1) + # Integrity check: rows per hh should equal alts.shape[0] * alts.shape[1] + expected = alts.shape[0] * alts.shape[1] + counts = interaction_df.groupby("household_id").size() assert ( - interaction_df.groupby("household_id").size() == (alts.shape[0] * alts.shape[1]) - ).all(), "There should be one row per AV and trip combination per household" + counts == expected + ).all(), f"Row count mismatch (expected {expected} per household)." return interaction_df @@ -256,6 +250,10 @@ def execute_av_trip_matches( Execute the AV trip matches by updating the vehicles DataFrame with the chosen trips. This function updates the vehicles DataFrame based on the choices made by the AV routing model. + If two trips exist on the same tour in this time period, both trips are serviced by the AV. + If the AV is not at the origin, an additional repositioning trip is added from the vehicle + location to the trip origin. + Parameters: state: The current state of the simulation. model_settings: The settings for the AV routing model. @@ -298,6 +296,8 @@ def execute_av_trip_matches( validate="1:1", ) # merge trip information so we know where the vehicle is going + # will include any additional trips in the tour during this time period + # because the trip_number is the same across those trips in trips_in_period current_veh_trips = current_veh_trips.merge( trips_in_period.reset_index()[ [ @@ -311,12 +311,45 @@ def execute_av_trip_matches( ], on=["household_id", "trip_number"], how="left", - validate="1:1", + validate="1:m", ) all_veh_trips.append(current_veh_trips) all_veh_trips = pd.concat(all_veh_trips, ignore_index=True) + all_veh_trips["is_deadhead"] = False + + # add trip to table if the AV is not at the trip origin! + first_veh_trip = all_veh_trips.drop_duplicates("vehicle_id") + veh_locations = av_vehicles.loc[first_veh_trip.vehicle_id, "veh_location"] + additional_reposition_trips = first_veh_trip[ + first_veh_trip["origin"] != veh_locations.values + ] + + if not additional_reposition_trips.empty: + assert ( + additional_reposition_trips.vehicle_id.is_unique + ), "Each vehicle should only need one repositioning trip" + # destination of the repositioning trip is the origin of the first vehicle trip for this time period + additional_reposition_trips["destination"] = additional_reposition_trips[ + "origin" + ] + additional_reposition_trips["origin"] = av_vehicles.loc[ + additional_reposition_trips.vehicle_id, "veh_location" + ].values + additional_reposition_trips[["trip_number", "av_number", "trip_id"]] = pd.NA + additional_reposition_trips["is_deadhead"] = True + + # merge in the repositioning trips + all_veh_trips = pd.concat( + [additional_reposition_trips, all_veh_trips], ignore_index=True + ) + # sort by vehicle_id will put these new trips at the start + all_veh_trips.sort_values( + by=["vehicle_id", "depart"], inplace=True, ignore_index=True + ) + + # add new trips to existing vehicle trip table if vehicle_trips is not None: vehicle_trips = pd.concat([vehicle_trips, all_veh_trips], ignore_index=True) else: @@ -326,8 +359,6 @@ def execute_av_trip_matches( all_veh_trips.vehicle_id.notna().all() ), "There should be a vehicle_id for each trip made by an AV" - # FIXME add trip to table if the AV is not at the trip origin! - return vehicle_trips @@ -390,7 +421,6 @@ def av_trip_matching( trips=trips, alts=alts, choosers=choosers, - trace_label=trace_label, ) have_trace_targets = state.tracing.has_trace_targets( interaction_df, slicer="household_id" @@ -973,14 +1003,23 @@ def av_routing( if trips_in_period.empty: continue - trips_in_period["trip_number"] = ( - trips_in_period.groupby("household_id").cumcount() + 1 + # keep only the first trip in a tour during this time period + # if selected, all trips in the tour will be serviced by the same av vehicle + trips_per_tour = trips_in_period.groupby("tour_id").cumcount() + 1 + first_trips_in_period = trips_in_period[trips_per_tour == 1] + + first_trips_in_period["trip_number"] = ( + first_trips_in_period.groupby("household_id").cumcount() + 1 + ) + # merging duplicate trip numbers back to trips_in_period to be used in executing_av_trip_matches + trips_in_period["trip_number"] = trips_in_period.tour_id.map( + first_trips_in_period.set_index("tour_id")["trip_number"] ) choices = av_trip_matching( state, model_settings, - trips=trips_in_period, + trips=first_trips_in_period, vehicles=av_vehicles, trace_label=tracing.extend_trace_label( period_trace_label, "av_trip_matching" @@ -1012,6 +1051,9 @@ def av_routing( # create one table of all vehicle trips and add to pipeline av_vehicle_trips = pd.concat(all_veh_trips, ignore_index=True) - av_vehicle_trips['av_vehicle_trip_id'] = av_vehicle_trips.vehicle_id * 100 + av_vehicle_trips.groupby('vehicle_id').cumcount() - av_vehicle_trips.set_index('av_vehicle_trip_id', inplace=True) + av_vehicle_trips["av_vehicle_trip_id"] = ( + av_vehicle_trips.vehicle_id * 100 + + av_vehicle_trips.groupby("vehicle_id").cumcount() + ) + av_vehicle_trips.set_index("av_vehicle_trip_id", inplace=True) state.add_table("av_vehicle_trips", av_vehicle_trips) From 44e37b857f37ff1b97f6e3b6b8a58df2631d2fdf Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 25 Sep 2025 14:54:46 -0700 Subject: [PATCH 12/53] settings, test scenario code --- .../create_test_taxi_tnc_routing_scenario.py | 69 + .../taxi_tnc_routing/taxi_tnc_routing.py | 1208 ++++++++++------- .../taxi_tnc_routing_settings.yaml | 29 + 3 files changed, 819 insertions(+), 487 deletions(-) create mode 100644 src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py create mode 100644 src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml diff --git a/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py b/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py new file mode 100644 index 000000000..f4f94f8ab --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py @@ -0,0 +1,69 @@ +import numpy as np +import pandas as pd +import openmatrix as omx +import os + +# Target folder (adjust if you want elsewhere) +OUT_DIR = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\test" +os.makedirs(OUT_DIR, exist_ok=True) + +np.random.seed(42) + +# 1. Create a 10-zone skim (minutes) – simple linear distances +# Time = 3 * |i-j| + 2 (off-diagonal), 0 on diagonal +ZONES = np.arange(1, 11) # 1..10 +n = len(ZONES) +skim = np.zeros((n, n), dtype=np.float32) +for i in range(n): + for j in range(n): + if i != j: + skim[i, j] = 3 * abs(i - j) + 2 # ensures small clusters within buffer 10 + +print(f"skim:\n{skim}") + +# 2. Write OpenMatrix file with mapping +omx_path = os.path.join(OUT_DIR, "traffic_skims_AM.omx") +if os.path.exists(omx_path): + os.remove(omx_path) + +with omx.open_file(omx_path, "w") as f: + f["SOV_TR_H_TIME__AM"] = skim + # Mapping: zone id -> index + f.create_mapping("ZONE_MAP", ZONES) + +print(f"Wrote skim to {omx_path}") + +# 3. Land use MAZ→TAZ (1:1 for this test) +land_use = pd.DataFrame({ + "MAZ": ZONES, + "taz": ZONES +}) +land_use.to_csv(os.path.join(OUT_DIR, "land_use.csv"), index=False) +print("Wrote land_use.csv") + +# 4. Create trips (half-hour depart periods, some clustered to allow pooling) +# depart is in half-hour bins (your code multiplies by 30 then adds random 0–29) +trips = pd.DataFrame([ + # group A (zones 1–4) – several close OD pairs + (1001, "TNC_SINGLE", 0, 1, 3), + (1002, "TNC_SINGLE", 0, 2, 4), + (1003, "TNC_SHARED", 0, 1, 4), + (1004, "TAXI", 0, 3, 2), + (1005, "TNC_SINGLE", 0, 2, 1), + (1006, "TNC_SHARED", 0, 4, 1), + # group B (zones 6–8) – another cluster + (1010, "TAXI", 0, 6, 8), + (1011, "TNC_SINGLE", 0, 7, 6), + (1012, "TNC_SHARED", 0, 8, 6), + (1013, "TNC_SINGLE", 0, 6, 7), + # mixed / farther (some won’t pool) + (1020, "TAXI", 0, 1, 9), + (1021, "TNC_SINGLE", 0, 9, 2), + (1022, "TNC_SINGLE", 0, 4, 8), + (1023, "TNC_SHARED", 0, 8, 4), +], columns=["trip_id", "trip_mode", "depart", "origin", "destination"]) + +trips.to_csv(os.path.join(OUT_DIR, "final_tnc_trips.csv"), index=False) +print("Wrote final_tnc_trips.csv") + +print("Test dataset ready.") \ No newline at end of file diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 04dd0226d..ac9d9c833 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -3,589 +3,823 @@ import openmatrix as omx import os import time +from pydantic import BaseModel, ValidationError +import logging +import yaml -input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full" +logger = logging.getLogger(__name__) +# input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full" +# input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\test" -def read_input_data(input_folder, skim_core): - # Read the data from the OpenMatrix file - with omx.open_file(os.path.join(input_folder, "traffic_skims_AM.omx"), "r") as f: - skim = np.array(f[skim_core]) - mapping = f.mapping(f.list_mappings()[0]) - # Convert the data to a pandas DataFrame - cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] - # trips = pd.read_csv(os.path.join(input_folder, "final_trips.csv"), usecols=cols) - # trips['trip_mode'] = 'TNC_SHARED' - # reading subset for faster I/O - trips = pd.read_csv(os.path.join(input_folder, "final_tnc_trips.csv"), usecols=cols) - trips = trips[trips.trip_mode.isin(["TAXI", "TNC_SINGLE", "TNC_SHARED"])] +class TaxiTNCSettings(BaseModel): + """ + Taxi / TNC route choice settings + """ - landuse = pd.read_csv(os.path.join(input_folder, "land_use.csv")) - maz_to_taz_map = landuse.set_index("MAZ")["taz"].to_dict() + # path to activitysim output folder with trip data + asim_output_dir: str - trips["oskim_idx"] = trips["origin"].map(maz_to_taz_map).map(mapping) - trips["dskim_idx"] = trips["destination"].map(maz_to_taz_map).map(mapping) - - return trips, skim, mapping - - -def determine_time_bin(trips, bin_size): - # Create a new column for the time bin - # Convert departure time to mins, sampling within the half hour - # Then bin into the bin size (supplied in mins) - - # FIXME set random seed in settings - np.random.seed(42) - trips["time_in_mins"] = trips["depart"] * 30 + np.random.randint( - 0, 30, size=len(trips) + # path to folder with skim data + skim_dir: str + skim_core: str = ( + "SOV_TR_H_TIME" # name of skim matrix in OMX file minus time period suffix ) - trips["time_bin"] = trips["time_in_mins"] // bin_size - - return trips + skim_periods: list = ["EA", "AM", "MD", "PM", "EV"] # time periods to process + periods: list = [0, 6, 12, 25, 32, 48] + # output folder for results + output_dir: str = "./output" -def determine_potential_trip_pairs(trips, skim_data, pooling_buffer=10): - # pre-filter trips for pooling - # find pairs of trips that are within the same origin and destination buffer - # Ensure indices are integer arrays and no NA - o_idx = trips["oskim_idx"].to_numpy(dtype=int) - d_idx = trips["dskim_idx"].to_numpy(dtype=int) - trip_ids = trips["trip_id"].to_numpy() + # modes for shared and single occupancy TNC / taxi trips + shared_tnc_modes: list = ["TNC_SHARED"] + single_tnc_modes: list = ["TNC_SINGLE", "TAXI"] - origin_proximity_mask = skim_data[o_idx, :] <= pooling_buffer - destination_proximity_mask = skim_data[d_idx, :] <= pooling_buffer + # time bin size (in mins) + time_bin_size: int = 10 - # From your masks (shape: n_trips x n_zones), select only the columns for the trips’ zones - # This yields trip-to-trip boolean matrices - origin_pair_ok = origin_proximity_mask[:, o_idx] # shape: n_trips x n_trips - dest_pair_ok = destination_proximity_mask[:, d_idx] # shape: n_trips x n_trips + # buffer size comparing origins and destinations for potential pooling (in mins) + pooling_buffer: int = 10 - # Both origin and destination must be within the buffer - pair_ok = origin_pair_ok & dest_pair_ok + # maximum allowed detour time for pooled trips (in mins) + max_detour: int = 15 - # Drop self-pairs and keep ioj->di->dj - t2 = skim_data[oj, oi] + skim_data[oi, dj] + skim_data[dj, di] # oj->oi->dj->di - t3 = skim_data[oi, oj] + skim_data[oj, dj] + skim_data[dj, di] # oi->oj->dj->di - t4 = skim_data[oj, oi] + skim_data[oi, di] + skim_data[di, dj] # oj->oi->di->dj - - # per-trip detours - d1_i = t1 - i_direct - d1_j = t1 - j_direct - d2_i = t2 - i_direct - d2_j = t2 - j_direct - d3_i = t3 - i_direct - d3_j = t3 - j_direct - d4_i = t4 - i_direct - d4_j = t4 - j_direct - - # checking detour times against max detour time - v1 = (d1_i <= max_detour) & (d1_j <= max_detour) - v2 = (d2_i <= max_detour) & (d2_j <= max_detour) - v3 = (d3_i <= max_detour) & (d3_j <= max_detour) - v4 = (d4_i <= max_detour) & (d4_j <= max_detour) - - totals = np.column_stack([t1, t2, t3, t4]) - valids = np.column_stack([v1, v2, v3, v4]) - det_i_m = np.column_stack([d1_i, d2_i, d3_i, d4_i]) - det_j_m = np.column_stack([d1_j, d2_j, d3_j, d4_j]) - - # mask invalid scenarios - totals_masked = np.where(valids, totals, np.inf) - - # choose best valid scenario - min_idx = np.argmin(totals_masked, axis=1) # 0..3 - row = np.arange(len(min_idx)) - min_total = totals_masked[row, min_idx] - valid = np.isfinite(min_total) - - route_scenario = np.where(valid, min_idx + 1, 0) # 1..4, or 0 if none valid - total_ivt = np.where(valid, min_total, np.nan) - detour_i = np.where(valid, det_i_m[row, min_idx], np.nan) - detour_j = np.where(valid, det_j_m[row, min_idx], np.nan) - - trip_pairs["route_scenario"] = route_scenario - trip_pairs["total_ivt"] = total_ivt - trip_pairs["valid"] = valid - trip_pairs["detour_i"] = detour_i - trip_pairs["detour_j"] = detour_j - trip_pairs["total_detour"] = detour_i + detour_j - - assert ( - trip_pairs[trip_pairs.valid]["detour_i"] < max_detour - ).all(), "Detour times exceed maximum allowed" - assert ( - trip_pairs[trip_pairs.valid]["detour_j"] < max_detour - ).all(), "Detour times exceed maximum allowed" - assert ( - trip_pairs[trip_pairs.valid]["route_scenario"] > 0 - ).all(), "Valid trips must have a scenario" - - print(f"\tTotal trip pairs within original OD buffer: {len(trip_pairs)}") - trip_pairs = trip_pairs[trip_pairs.valid] - print( - f"\tFound {len(trip_pairs)} valid trip pairs across {trip_pairs['trip_i'].nunique()} unique trips" - ) - print( - f"\twith an average detour times for trip i {trip_pairs['detour_i'].mean()} and trip j {trip_pairs['detour_j'].mean()}" - ) + @property + def period_time_bin_minutes(self) -> int: + # minutes per (max period index); unchanged if periods list changes + return (24 * 60) // max(self.periods) - return trip_pairs +def load_settings( + yaml_path: str = "taxi_tnc_routing_settings.yaml", +) -> TaxiTNCSettings: + with open(os.path.join(os.path.dirname(__file__), yaml_path), "r") as f: + data = yaml.safe_load(f) + try: + settings = TaxiTNCSettings(**data) + except ValidationError as e: + logger.error("Settings validation error:", e) + raise -def select_mutual_best_recursive(trip_pairs: pd.DataFrame) -> pd.DataFrame: - # start from valid pairs only, keep only needed cols for speed - pairs = trip_pairs[["trip_i", "trip_j", "total_detour"]].copy() - if pairs.empty: - return trip_pairs.iloc[0:0].copy() + # ensure output path exists + if not os.path.exists(os.path.expanduser(settings.output_dir)): + os.makedirs(os.path.expanduser(settings.output_dir)) + logger.info(f"Created output directory: {settings.output_dir}") - # deterministic tie-breaking - pairs = pairs.sort_values(["total_detour", "trip_i", "trip_j"]).reset_index( - drop=True + # setup logger + log_file_location = os.path.join( + os.path.expanduser(settings.output_dir), "taxi_tnc_routing.log" + ) + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[logging.FileHandler(log_file_location), logging.StreamHandler()], ) - batches = [] - used = set() - while not pairs.empty: - # best partner for each i, and best partner for each j - best_j_for_i_idx = pairs.groupby("trip_i", sort=False)["total_detour"].idxmin() - best_j_for_i = pairs.loc[best_j_for_i_idx, ["trip_i", "trip_j", "total_detour"]] - - best_i_for_j_idx = pairs.groupby("trip_j", sort=False)["total_detour"].idxmin() - best_i_for_j = pairs.loc[best_i_for_j_idx, ["trip_j", "trip_i", "total_detour"]] - best_i_for_j.columns = ["trip_j", "trip_i", "detour_time_j"] # rename for merge - - # mutual-best intersection - mutual = best_j_for_i.merge( - best_i_for_j[["trip_i", "trip_j"]], on=["trip_i", "trip_j"], how="inner" + # set random seed for reproducibility + np.random.seed(settings.random_seed) + + return settings + + +class TaxiTNCRouter: + def __init__(self, settings: TaxiTNCSettings): + self.settings = settings + self.skim_data = None + + def read_input_data(self): + # Read the data from the OpenMatrix file + with omx.open_file( + os.path.join(self.settings.skim_dir, "traffic_skims_AM.omx"), "r" + ) as f: + skim = np.array(f[self.settings.skim_core]) + mapping = f.mapping(f.list_mappings()[0]) + + # Convert the data to a pandas DataFrame + cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] + # trips = pd.read_csv(os.path.join(self.settings.asim_output_dir, "final_trips.csv"), usecols=cols) + # trips['trip_mode'] = 'TNC_SHARED' + # reading subset for faster I/O + trips = pd.read_csv( + os.path.join(self.settings.asim_output_dir, "final_tnc_trips.csv"), + usecols=cols, ) - # handle instances where trip_i is also in trip_j - mutual = mutual[~mutual["trip_j"].isin(mutual["trip_i"])] + trips = trips[trips.trip_mode.isin(["TAXI", "TNC_SINGLE", "TNC_SHARED"])] - if mutual.empty: - # no more matches - break + landuse = pd.read_csv( + os.path.join(self.settings.asim_output_dir, "final_land_use.csv") + ) - batches.append(mutual[["trip_i", "trip_j"]].copy()) + if "MAZ" in landuse.columns: + maz_to_taz_map = landuse.set_index("MAZ")["taz"].to_dict() + elif "zone_id" in landuse.columns: + maz_to_taz_map = landuse.set_index("zone_id")["TAZ"].to_dict() + else: + raise KeyError( + "Land use data must contain either 'MAZ' or 'zone_id' column for mapping to TAZ." + ) - # remove all trips that just got paired - used.update(mutual["trip_i"].to_numpy().tolist()) - used.update(mutual["trip_j"].to_numpy().tolist()) - pairs = pairs[ - ~pairs["trip_i"].isin(used) & ~pairs["trip_j"].isin(used) - ].reset_index(drop=True) + trips["oskim_idx"] = trips["origin"].map(maz_to_taz_map).map(mapping) + trips["dskim_idx"] = trips["destination"].map(maz_to_taz_map).map(mapping) - if not batches: - return trip_pairs.iloc[0:0].copy() + return trips, skim, mapping - disjoint_keys = pd.concat(batches, ignore_index=True) + def sample_tnc_trip_simulation_time_bin(self, trips): + # Create a new column for the time bin + # Convert departure time to mins, sampling within the half hour + # Then bin into the bin size (supplied in mins) - # bring all attributes back from original trip_pairs - trip_matches = disjoint_keys.merge( - trip_pairs, on=["trip_i", "trip_j"], how="left" - ).reset_index(drop=True) + trips["time_in_mins"] = trips["depart"] * 30 + np.random.randint( + 0, 30, size=len(trips) + ) + trips["time_bin"] = trips["time_in_mins"] // self.settings.time_bin_size - # sanity checks - assert trip_matches["trip_i"].is_unique - assert trip_matches["trip_j"].is_unique - assert (~trip_matches["trip_i"].isin(trip_matches["trip_j"])).all() + return trips - print(f"\tSelected {len(trip_matches)} disjoint pairs via recursive mutual-best") - print( - f"\twith an average detour times for trip i {trip_matches['detour_i'].mean()} and trip j {trip_matches['detour_j'].mean()}" - ) - print(f"\tAverage total detour time {trip_matches['total_detour'].mean()}") - print(f"\tAverage total in vehicle time {trip_matches['total_ivt'].mean()}") - - return trip_matches + def determine_potential_trip_pairs(self, trips): + # pre-filter trips for pooling + # find pairs of trips that are within the same origin and destination buffer + # Ensure indices are integer arrays and no NA + o_idx = trips["oskim_idx"].to_numpy(dtype=int) + d_idx = trips["dskim_idx"].to_numpy(dtype=int) + trip_ids = trips["trip_id"].to_numpy() + origin_proximity_mask = self.skim_data[o_idx, :] <= self.settings.pooling_buffer + destination_proximity_mask = ( + self.skim_data[d_idx, :] <= self.settings.pooling_buffer + ) -def create_trip_routes(trip_matches): - trips_routed = trip_matches[["trip_i", "trip_j", "total_ivt"]].copy() + # From your masks (shape: n_trips x n_zones), select only the columns for the trips’ zones + # This yields trip-to-trip boolean matrices + origin_pair_ok = origin_proximity_mask[:, o_idx] # shape: n_trips x n_trips + dest_pair_ok = destination_proximity_mask[:, d_idx] # shape: n_trips x n_trips - s1_idx = [0, 1, 2, 3] # oi->oj->di->dj - s2_idx = [1, 0, 3, 2] # oj->oi->dj->di - s3_idx = [0, 1, 3, 2] # oi->oj->dj->di - s4_idx = [1, 0, 2, 3] # oj->oi->di->dj + # Both origin and destination must be within the buffer + pair_ok = origin_pair_ok & dest_pair_ok - ods = trip_matches[ - ["o_i_skim_idx", "o_j_skim_idx", "d_i_skim_idx", "d_j_skim_idx"] - ].to_numpy() + # Drop self-pairs and keep i 0 - order_idx = ( - scenario_orders[rs[valid_mask] - 1] - if valid_mask.any() - else np.empty((0, 4), dtype=int) - ) + # include skim times for origins/destinations + o2o_time = self.skim_data[o_idx][:, o_idx] + d2d_time = self.skim_data[d_idx][:, d_idx] + trip_pairs["origin_time"] = o2o_time[ii, jj] + trip_pairs["dest_time"] = d2d_time[ii, jj] + # also include the origin and destination skim idxs + # create maps from trip id to origin and to destination + lookup = trips.loc[:, ["trip_id", "oskim_idx", "dskim_idx"]].set_index( + "trip_id" + ) - ordered_nodes = np.full((len(trips_routed), 4), -1, dtype=int) - if valid_mask.any(): - row_idx = np.arange(len(trips_routed))[valid_mask] - ordered_nodes[valid_mask] = ods[row_idx[:, None], order_idx] + trip_pairs = trip_pairs.join( + lookup.rename( + columns={"oskim_idx": "o_i_skim_idx", "dskim_idx": "d_i_skim_idx"} + ), + on="trip_i", + ).join( + lookup.rename( + columns={"oskim_idx": "o_j_skim_idx", "dskim_idx": "d_j_skim_idx"} + ), + on="trip_j", + ) + return trip_pairs + + def determine_detour_times(self, trip_pairs): + # For each trip pair, calculate the four possible routing scenarios + # and determine if they are valid (within detour limits) + # and select the best valid scenario (minimum total time) + + oi = trip_pairs["o_i_skim_idx"].to_numpy() + oj = trip_pairs["o_j_skim_idx"].to_numpy() + di = trip_pairs["d_i_skim_idx"].to_numpy() + dj = trip_pairs["d_j_skim_idx"].to_numpy() + + # direct times + i_direct = self.skim_data[oi, di] + j_direct = self.skim_data[oj, dj] + + # scenario totals + # WARNING if these scenarios are changed, they also need to be changed downstream in the routing + t1 = ( + self.skim_data[oi, oj] + self.skim_data[oj, di] + self.skim_data[di, dj] + ) # oi->oj->di->dj + t2 = ( + self.skim_data[oj, oi] + self.skim_data[oi, dj] + self.skim_data[dj, di] + ) # oj->oi->dj->di + t3 = ( + self.skim_data[oi, oj] + self.skim_data[oj, dj] + self.skim_data[dj, di] + ) # oi->oj->dj->di + t4 = ( + self.skim_data[oj, oi] + self.skim_data[oi, di] + self.skim_data[di, dj] + ) # oj->oi->di->dj + + # per-trip detours + d1_i = t1 - i_direct + d1_j = t1 - j_direct + d2_i = t2 - i_direct + d2_j = t2 - j_direct + d3_i = t3 - i_direct + d3_j = t3 - j_direct + d4_i = t4 - i_direct + d4_j = t4 - j_direct + + # checking detour times against max detour time + max_detour = self.settings.max_detour + v1 = (d1_i <= max_detour) & (d1_j <= max_detour) + v2 = (d2_i <= max_detour) & (d2_j <= max_detour) + v3 = (d3_i <= max_detour) & (d3_j <= max_detour) + v4 = (d4_i <= max_detour) & (d4_j <= max_detour) + + totals = np.column_stack([t1, t2, t3, t4]) + valids = np.column_stack([v1, v2, v3, v4]) + det_i_m = np.column_stack([d1_i, d2_i, d3_i, d4_i]) + det_j_m = np.column_stack([d1_j, d2_j, d3_j, d4_j]) + + # mask invalid scenarios + totals_masked = np.where(valids, totals, np.inf) + + # choose best valid scenario + min_idx = np.argmin(totals_masked, axis=1) # 0..3 + row = np.arange(len(min_idx)) + min_total = totals_masked[row, min_idx] + valid = np.isfinite(min_total) + + route_scenario = np.where(valid, min_idx + 1, 0) # 1..4, or 0 if none valid + total_ivt = np.where(valid, min_total, np.nan) + detour_i = np.where(valid, det_i_m[row, min_idx], np.nan) + detour_j = np.where(valid, det_j_m[row, min_idx], np.nan) + + trip_pairs["route_scenario"] = route_scenario + trip_pairs["total_ivt"] = total_ivt + trip_pairs["valid"] = valid + trip_pairs["detour_i"] = detour_i + trip_pairs["detour_j"] = detour_j + trip_pairs["total_detour"] = detour_i + detour_j + + assert ( + trip_pairs[trip_pairs.valid]["detour_i"] < max_detour + ).all(), "Detour times exceed maximum allowed" + assert ( + trip_pairs[trip_pairs.valid]["detour_j"] < max_detour + ).all(), "Detour times exceed maximum allowed" + assert ( + trip_pairs[trip_pairs.valid]["route_scenario"] > 0 + ).all(), "Valid trips must have a scenario" + + logger.info(f"\tTotal trip pairs within original OD buffer: {len(trip_pairs)}") + trip_pairs = trip_pairs[trip_pairs.valid] + logger.info( + f"\tFound {len(trip_pairs)} valid trip pairs across {trip_pairs['trip_i'].nunique()} unique trips" + ) + logger.info( + f"\twith an average detour times for trip i {trip_pairs['detour_i'].mean():.2f} and trip j {trip_pairs['detour_j'].mean():.2f}" + ) - trips_routed[ - ["origin_skim_idx", "stop1_skim_idx", "stop2_skim_idx", "destination_skim_idx"] - ] = ordered_nodes - return trips_routed + return trip_pairs + def select_mutual_best_recursive(self, trip_pairs: pd.DataFrame) -> pd.DataFrame: + # start from valid pairs only, keep only needed cols for speed + pairs = trip_pairs[["trip_i", "trip_j", "total_detour"]].copy() + if pairs.empty: + return trip_pairs.iloc[0:0].copy() -def create_full_trip_route_table(tnc_trips, trips_routed, skim_data): - # need to append any additional tnc trips during this time period that were not grouped - mask = ~( - tnc_trips.trip_id.isin(trips_routed.trip_i) - | tnc_trips.trip_id.isin(trips_routed.trip_j) - ) - cols = { - "trip_id": "trip_i", - "oskim_idx": "origin_skim_idx", - "dskim_idx": "destination_skim_idx", - } - single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() - single_trips["total_ivt"] = skim_data[ - single_trips.origin_skim_idx, single_trips.destination_skim_idx - ] - - full_trip_routes = pd.concat([trips_routed, single_trips], ignore_index=True) - - print( - f"\tAdded {single_trips.shape[0]} single trips for a total of {full_trip_routes.shape[0]} episodes." - ) + # deterministic tie-breaking + pairs = pairs.sort_values(["total_detour", "trip_i", "trip_j"]).reset_index( + drop=True + ) - assert full_trip_routes.trip_i.is_unique, "Trip IDs are not unique" + batches = [] + used = set() + i = 0 + while not pairs.empty: + # best partner for each i, and best partner for each j + best_j_for_i_idx = pairs.groupby("trip_i", sort=False)[ + "total_detour" + ].idxmin() + best_j_for_i = pairs.loc[ + best_j_for_i_idx, ["trip_i", "trip_j", "total_detour"] + ] + + best_i_for_j_idx = pairs.groupby("trip_j", sort=False)[ + "total_detour" + ].idxmin() + best_i_for_j = pairs.loc[ + best_i_for_j_idx, ["trip_j", "trip_i", "total_detour"] + ] + best_i_for_j.columns = [ + "trip_j", + "trip_i", + "detour_time_j", + ] # rename for merge + + # mutual-best intersection + mutual = best_j_for_i.merge( + best_i_for_j[["trip_i", "trip_j"]], on=["trip_i", "trip_j"], how="inner" + ) + # handle instances where trip_i is also in trip_j + mutual = mutual[~mutual["trip_j"].isin(mutual["trip_i"])] + + if mutual.empty: + # no more matches + break + + batches.append(mutual[["trip_i", "trip_j"]].copy()) + + # remove all trips that just got paired + used.update(mutual["trip_i"].to_numpy().tolist()) + used.update(mutual["trip_j"].to_numpy().tolist()) + pairs = pairs[ + ~pairs["trip_i"].isin(used) & ~pairs["trip_j"].isin(used) + ].reset_index(drop=True) + + i += 1 + if i > 100: + raise RuntimeError("Exceeded maximum iterations for trip pooling") + + if not batches: + return trip_pairs.iloc[0:0].copy() + + disjoint_keys = pd.concat(batches, ignore_index=True) + + # bring all attributes back from original trip_pairs + trip_matches = disjoint_keys.merge( + trip_pairs, on=["trip_i", "trip_j"], how="left" + ).reset_index(drop=True) + + # sanity checks + assert trip_matches["trip_i"].is_unique + assert trip_matches["trip_j"].is_unique + assert (~trip_matches["trip_i"].isin(trip_matches["trip_j"])).all() + + logger.info( + f"\tSelected {len(trip_matches)} disjoint pairs via recursive mutual-best" + ) + logger.info( + f"\twith an average detour times for trip i {trip_matches['detour_i'].mean():.2f} and trip j {trip_matches['detour_j'].mean():.2f}" + ) + logger.info( + f"\tAverage total detour time {trip_matches['total_detour'].mean():.2f}" + ) + logger.info( + f"\tAverage total in vehicle time {trip_matches['total_ivt'].mean():.2f}" + ) - return full_trip_routes + return trip_matches + def create_trip_routes(self, trip_matches): + trips_routed = trip_matches[ + ["trip_i", "trip_j", "total_ivt", "route_scenario", "detour_i", "detour_j"] + ].copy() -def create_new_vehicles(vehicles, trips_to_service, trip_to_veh_map): - idx_start_num = 0 if vehicles.empty else vehicles.index.max() + s1_idx = [0, 1, 2, 3] # oi->oj->di->dj + s2_idx = [1, 0, 3, 2] # oj->oi->dj->di + s3_idx = [0, 1, 3, 2] # oi->oj->dj->di + s4_idx = [1, 0, 2, 3] # oj->oi->di->dj - new_vehs = pd.DataFrame( - data={ - "location_skim_idx": trips_to_service.origin_skim_idx.values, - "is_free": False, - "last_refuel_time": -1, - "next_time_free": np.nan, - }, - index=idx_start_num + np.arange(1, len(trips_to_service) + 1), - ) - new_vehs.index.name = "vehicle_id" + ods = trip_matches[ + ["o_i_skim_idx", "o_j_skim_idx", "d_i_skim_idx", "d_j_skim_idx"] + ].to_numpy() - # updating the trip to vehicle mapping with the newly created vehicles - trip_to_veh_map.loc[trips_to_service.trip_i] = new_vehs.index.values + scenario_orders = np.array( + [s1_idx, s2_idx, s3_idx, s4_idx] + ) # index with (route_scenario-1) + rs = trip_matches["route_scenario"].to_numpy() - if vehicles.empty: - vehicles = new_vehs - else: - vehicles = pd.concat([vehicles, new_vehs], ignore_index=False) + valid_mask = rs > 0 + order_idx = ( + scenario_orders[rs[valid_mask] - 1] + if valid_mask.any() + else np.empty((0, 4), dtype=int) + ) - return vehicles, trip_to_veh_map + ordered_nodes = np.full((len(trips_routed), 4), -1, dtype=int) + if valid_mask.any(): + row_idx = np.arange(len(trips_routed))[valid_mask] + ordered_nodes[valid_mask] = ods[row_idx[:, None], order_idx] + + trips_routed[ + [ + "origin_skim_idx", + "stop1_skim_idx", + "stop2_skim_idx", + "destination_skim_idx", + ] + ] = ordered_nodes + return trips_routed + + def create_full_trip_route_table(self, tnc_trips, trips_routed): + # need to append any additional tnc trips during this time period that were not grouped + mask = ~( + tnc_trips.trip_id.isin(trips_routed.trip_i) + | tnc_trips.trip_id.isin(trips_routed.trip_j) + ) + cols = { + "trip_id": "trip_i", + "oskim_idx": "origin_skim_idx", + "dskim_idx": "destination_skim_idx", + } + single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() + single_trips["total_ivt"] = self.skim_data[ + single_trips.origin_skim_idx, single_trips.destination_skim_idx + ] + single_trips["detour_i"] = 0 + full_trip_routes = pd.concat([trips_routed, single_trips], ignore_index=True) -def match_vehicles_to_trips(vehicles, full_trip_routes, skim_data): + logger.info( + f"\tAdded {single_trips.shape[0]} single trips for a total of {full_trip_routes.shape[0]} episodes." + ) - free_vehicles = vehicles[vehicles.is_free].copy() - unserviced_trips = full_trip_routes.copy() + assert full_trip_routes.trip_i.is_unique, "Trip IDs are not unique" - trip_to_veh_map = pd.Series( - name="vehicle_id", index=unserviced_trips.trip_i, dtype=vehicles.index.dtype - ) + return full_trip_routes - # loop until all available vehicles are assigned or there are no more unserviced trips - while not (free_vehicles.empty or unserviced_trips.empty): + def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): + idx_start_num = 0 if vehicles.empty else vehicles.index.max() - veh_locations = free_vehicles.location_skim_idx.to_numpy() - trip_origins = unserviced_trips.origin_skim_idx.to_numpy() + new_vehs = pd.DataFrame( + data={ + "location_skim_idx": trips_to_service.origin_skim_idx.values, + "is_free": False, + "last_refuel_time": -1, + "next_time_free": np.nan, + }, + index=idx_start_num + np.arange(1, len(trips_to_service) + 1), + ) + new_vehs.index.name = "vehicle_id" - # find skim times between trip origins and all veh locations - skim_times = skim_data[trip_origins[:, None], veh_locations] + # updating the trip to vehicle mapping with the newly created vehicles + trip_to_veh_map.loc[trips_to_service.trip_i] = new_vehs.index.values - # grab the minimum time for each trip and vehicle - min_times = skim_times.min(axis=1) + if vehicles.empty: + vehicles = new_vehs + else: + vehicles = pd.concat([vehicles, new_vehs], ignore_index=False) - # if multiple trips match to the same vehicle, take the one with the smallest time - closest_vehicles = free_vehicles.index[np.argmin(skim_times, axis=1)] + return vehicles, trip_to_veh_map - # map trips to their closest vehicles - trip_to_veh_map.loc[unserviced_trips.trip_i] = closest_vehicles + def match_vehicles_to_trips(self, vehicles, full_trip_routes): - # trips with a min wait time larger than the maximum allowed are removed from pool - # ties are given to the first trip as given by trip_id - time_gt_max_wait = min_times > 15 - trip_to_veh_map.loc[unserviced_trips.trip_i[time_gt_max_wait]] = np.nan - ties_mask = trip_to_veh_map.duplicated(keep="first") & trip_to_veh_map.notna() - trip_to_veh_map.loc[ties_mask] = np.nan + free_vehicles = vehicles[vehicles.is_free].copy() + unserviced_trips = full_trip_routes.copy() - # remove matched trips and vehicles from the pools or trips that have no vehs within the max wait time - serviced_trips = trip_to_veh_map[trip_to_veh_map.notna()] - unserviced_trips = unserviced_trips[ - ~(unserviced_trips.trip_i.isin(serviced_trips.index) | time_gt_max_wait) - ] - free_vehicles = free_vehicles[~free_vehicles.index.isin(serviced_trips.values)] + trip_to_veh_map = pd.Series( + name="vehicle_id", index=unserviced_trips.trip_i, dtype=vehicles.index.dtype + ) - if trip_to_veh_map.isna().any(): - # create new vehicles for those still unmatched - # trips without match - unserviced_mask = full_trip_routes.trip_i.isin( - trip_to_veh_map.index[trip_to_veh_map.isna()] + # loop until all available vehicles are assigned or there are no more unserviced trips + i = 0 + while not (free_vehicles.empty or unserviced_trips.empty): + + veh_locations = free_vehicles.location_skim_idx.to_numpy() + trip_origins = unserviced_trips.origin_skim_idx.to_numpy() + + # find skim times between trip origins and all veh locations + skim_times = self.skim_data[trip_origins[:, None], veh_locations] + + # grab the minimum time for each trip and vehicle + min_times = skim_times.min(axis=1) + + # if multiple trips match to the same vehicle, take the one with the smallest time + closest_vehicles = free_vehicles.index[np.argmin(skim_times, axis=1)] + + # map trips to their closest vehicles + trip_to_veh_map.loc[unserviced_trips.trip_i] = closest_vehicles + + # trips with a min wait time larger than the maximum allowed are removed from pool + # ties are given to the first trip as given by trip_id + time_gt_max_wait = min_times > 15 + trip_to_veh_map.loc[unserviced_trips.trip_i[time_gt_max_wait]] = np.nan + ties_mask = ( + trip_to_veh_map.duplicated(keep="first") & trip_to_veh_map.notna() + ) + trip_to_veh_map.loc[ties_mask] = np.nan + + # remove matched trips and vehicles from the pools or trips that have no vehs within the max wait time + serviced_trips = trip_to_veh_map[trip_to_veh_map.notna()] + unserviced_trips = unserviced_trips[ + ~(unserviced_trips.trip_i.isin(serviced_trips.index) | time_gt_max_wait) + ] + free_vehicles = free_vehicles[ + ~free_vehicles.index.isin(serviced_trips.values) + ] + + i += 1 + if i > 100: + raise RuntimeError("Exceeded maximum iterations for vehicle matching") + + if trip_to_veh_map.isna().any(): + # create new vehicles for those still unmatched + # trips without match + unserviced_mask = full_trip_routes.trip_i.isin( + trip_to_veh_map.index[trip_to_veh_map.isna()] + ) + trips_still_needing_service = full_trip_routes[unserviced_mask] + vehicles, trip_to_veh_map = self.create_new_vehicles( + vehicles, trips_still_needing_service, trip_to_veh_map + ) + + assert ( + not trip_to_veh_map.isna().any() + ), f"Some trips were not matched to vehicles {trip_to_veh_map[trip_to_veh_map.isna()]}" + + # return a mapping of trips.trip_i to vehicles.vehicle_id + # trips that were not matched will have an NaN vehicle_id + return vehicles, trip_to_veh_map + + def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): + # Create vehicle trips from the full trip routes + + # first turning full_trip_routes into a list of stops + pickup = full_trip_routes[["trip_i", "trip_j", "origin_skim_idx"]].rename( + columns={"origin_skim_idx": "destination_skim_idx"} ) - trips_still_needing_service = full_trip_routes[unserviced_mask] - vehicles, trip_to_veh_map = create_new_vehicles( - vehicles, trips_still_needing_service, trip_to_veh_map + # creating a temporary trip num because not all vehicles will have stops + pickup["tmp_trip_num"] = 1 + stop_1 = full_trip_routes.loc[ + full_trip_routes.stop1_skim_idx > -1, ["trip_i", "trip_j", "stop1_skim_idx"] + ].rename(columns={"stop1_skim_idx": "destination_skim_idx"}) + stop_1["tmp_trip_num"] = 2 + stop_2 = full_trip_routes.loc[ + full_trip_routes.stop2_skim_idx > -1, ["trip_i", "trip_j", "stop2_skim_idx"] + ].rename(columns={"stop2_skim_idx": "destination_skim_idx"}) + stop_2["tmp_trip_num"] = 3 + drop_off = full_trip_routes[ + ["trip_i", "trip_j", "destination_skim_idx"] + ].rename(columns={"destination_skim_idx": "destination_skim_idx"}) + drop_off["tmp_trip_num"] = 4 + + new_v_trips = pd.concat([pickup, stop_1, stop_2, drop_off]) + + new_v_trips["vehicle_id"] = ( + new_v_trips["trip_i"].map(trip_to_veh_map).astype(int) ) - assert ( - not trip_to_veh_map.isna().any() - ), f"Some trips were not matched to vehicles {trip_to_veh_map[trip_to_veh_map.isna()]}" - - # return a mapping of trips.trip_i to vehicles.vehicle_id - # trips that were not matched will have an NaN vehicle_id - return vehicles, trip_to_veh_map - - -def create_vehicle_trips(full_trip_routes, vehicles, trip_to_veh_map, skim_data): - # Create vehicle trips from the full trip routes - - # first turning full_trip_routes into a list of stops - pickup = full_trip_routes[["trip_i", "trip_j", "origin_skim_idx"]].rename( - columns={"origin_skim_idx": "destination_skim_idx"} - ) - # creating a temporary trip num because not all vehicles will have stops - pickup["tmp_trip_num"] = 1 - stop_1 = full_trip_routes.loc[ - full_trip_routes.stop1_skim_idx > 0, ["trip_i", "trip_j", "stop1_skim_idx"] - ].rename(columns={"stop1_skim_idx": "destination_skim_idx"}) - stop_1["tmp_trip_num"] = 2 - stop_2 = full_trip_routes.loc[ - full_trip_routes.stop2_skim_idx > 0, ["trip_i", "trip_j", "stop2_skim_idx"] - ].rename(columns={"stop2_skim_idx": "destination_skim_idx"}) - stop_2["tmp_trip_num"] = 3 - drop_off = full_trip_routes[["trip_i", "trip_j", "destination_skim_idx"]].rename( - columns={"destination_skim_idx": "destination_skim_idx"} - ) - drop_off["tmp_trip_num"] = 4 - - new_v_trips = pd.concat([pickup, stop_1, stop_2, drop_off]) - - new_v_trips["vehicle_id"] = new_v_trips["trip_i"].map(trip_to_veh_map).astype(int) - - # ensure ordering before deriving origins - new_v_trips.sort_values( - ["vehicle_id", "tmp_trip_num"], inplace=True, ignore_index=True - ) + # ensure ordering before deriving origins + new_v_trips.sort_values( + ["vehicle_id", "tmp_trip_num"], inplace=True, ignore_index=True + ) - new_v_trips["origin_skim_idx"] = pd.NA + new_v_trips["origin_skim_idx"] = pd.NA - # first leg origin = vehicle current location - first_leg_mask = new_v_trips.tmp_trip_num == 1 - new_v_trips.loc[first_leg_mask, "origin_skim_idx"] = new_v_trips.loc[ - first_leg_mask, "vehicle_id" - ].map(vehicles.location_skim_idx) + # first leg origin = vehicle current location + first_leg_mask = new_v_trips.tmp_trip_num == 1 + new_v_trips.loc[first_leg_mask, "origin_skim_idx"] = new_v_trips.loc[ + first_leg_mask, "vehicle_id" + ].map(vehicles.location_skim_idx) - # subsequent leg origin = previous leg destination (shift(1), not shift(-1)) - prev_destinations = new_v_trips.groupby("vehicle_id")["destination_skim_idx"].shift( - 1 - ) - new_v_trips.loc[~first_leg_mask, "origin_skim_idx"] = prev_destinations[ - ~first_leg_mask - ] - - assert ( - not new_v_trips.origin_skim_idx.isna().any() - ), f"Some vehicle trips do not have an origin skim index: {new_v_trips[new_v_trips.origin_skim_idx.isna()]}" - assert ( - not new_v_trips.destination_skim_idx.isna().any() - ), f"Some vehicle trips do not have a destination skim index: {new_v_trips[new_v_trips.destination_skim_idx.isna()]}" - - new_v_trips["origin_skim_idx"] = new_v_trips.origin_skim_idx.astype(int) - new_v_trips["destination_skim_idx"] = new_v_trips.destination_skim_idx.astype(int) - - # TODO fix trip_i and trip_j labels based on route scenario - - # determine time bin of each trip - new_v_trips["OD_time"] = skim_data[ - new_v_trips.origin_skim_idx.to_numpy(), - new_v_trips.destination_skim_idx.to_numpy(), - ] - new_v_trips["cumulative_trip_time"] = new_v_trips.groupby("vehicle_id")[ - "OD_time" - ].cumsum() - new_v_trips["depart_bin"] = ( - full_trip_routes.time_bin.mode()[0] - + (new_v_trips["cumulative_trip_time"] - new_v_trips["OD_time"]) // 15 - ) - new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( - new_v_trips["cumulative_trip_time"] // 15 - ) + # subsequent leg origin = previous leg destination (shift(1), not shift(-1)) + prev_destinations = new_v_trips.groupby("vehicle_id")[ + "destination_skim_idx" + ].shift(1) + new_v_trips.loc[~first_leg_mask, "origin_skim_idx"] = prev_destinations[ + ~first_leg_mask + ] - assert ( - new_v_trips.depart_bin <= new_v_trips.arrival_bin - ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" + assert ( + not new_v_trips.origin_skim_idx.isna().any() + ), f"Some vehicle trips do not have an origin skim index: {new_v_trips[new_v_trips.origin_skim_idx.isna()]}" + assert ( + not new_v_trips.destination_skim_idx.isna().any() + ), f"Some vehicle trips do not have a destination skim index: {new_v_trips[new_v_trips.destination_skim_idx.isna()]}" - return new_v_trips + new_v_trips["origin_skim_idx"] = new_v_trips.origin_skim_idx.astype(int) + new_v_trips["destination_skim_idx"] = new_v_trips.destination_skim_idx.astype( + int + ) + # update which trips are being served during the specific vehicle leg + # right now, we have both trip_i and trip_j (if pooled) for all legs + new_v_trips["servicing_trip_id"] = new_v_trips[ + "trip_i" + ] # leave a trail to know where the vehicle is going + # first trip from vehicle location to pickup has no occupants. + new_v_trips.loc[new_v_trips.tmp_trip_num == 1, ["trip_i", "trip_j"]] = np.nan + # who gets picked up and goes to the stops is dependent on the scenario + scenario = ( + full_trip_routes.set_index("trip_i") + .route_scenario.reindex(new_v_trips.servicing_trip_id) + .values + ) + new_v_trips["scenario"] = scenario + # scenario 1: oi->oj->di->dj + new_v_trips.loc[ + (scenario == 1) & (new_v_trips.tmp_trip_num == 2), "trip_j" + ] = np.nan + new_v_trips.loc[ + (scenario == 1) & (new_v_trips.tmp_trip_num == 4), "trip_i" + ] = np.nan + # scenario 2: oj->oi->dj->di + new_v_trips.loc[ + (scenario == 2) & (new_v_trips.tmp_trip_num == 2), "trip_i" + ] = np.nan + new_v_trips.loc[ + (scenario == 2) & (new_v_trips.tmp_trip_num == 4), "trip_j" + ] = np.nan + # scenario 3: oi->oj->dj->di + new_v_trips.loc[ + (scenario == 3) & (new_v_trips.tmp_trip_num == 2), "trip_j" + ] = np.nan + new_v_trips.loc[ + (scenario == 3) & (new_v_trips.tmp_trip_num == 4), "trip_j" + ] = np.nan + # scenario 4: oj->oi->di->dj + new_v_trips.loc[ + (scenario == 4) & (new_v_trips.tmp_trip_num == 2), "trip_i" + ] = np.nan + new_v_trips.loc[ + (scenario == 4) & (new_v_trips.tmp_trip_num == 4), "trip_i" + ] = np.nan + + # determine time bin of each trip + new_v_trips["OD_time"] = self.skim_data[ + new_v_trips.origin_skim_idx.to_numpy(), + new_v_trips.destination_skim_idx.to_numpy(), + ] + new_v_trips["cumulative_trip_time"] = new_v_trips.groupby("vehicle_id")[ + "OD_time" + ].cumsum() + new_v_trips["depart_bin"] = ( + full_trip_routes.time_bin.mode()[0] + + (new_v_trips["cumulative_trip_time"] - new_v_trips["OD_time"]) // 15 + ) + new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( + new_v_trips["cumulative_trip_time"] // 15 + ) -def update_vehicle_fleet(vehicles, vehicle_trips, time_bin): - # update the next_time_free based on the vehicle trips - next_time_free_update = ( - vehicle_trips.groupby("vehicle_id").arrival_bin.max() + 1 - ) # +1 rouding up to account for dropoff time - vehicles.loc[next_time_free_update.index, "next_time_free"] = next_time_free_update - # +1 on time bin since we are calculating the availaibility for the next time bin - vehicles["is_free"] = np.where( - (time_bin + 1 >= vehicles.next_time_free), True, False - ) + assert ( + new_v_trips.depart_bin <= new_v_trips.arrival_bin + ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" - # also want to update the vehicle location - final_veh_location = vehicle_trips.groupby("vehicle_id").destination_skim_idx.last() - vehicles.loc[final_veh_location.index, "location_skim_idx"] = final_veh_location + # merge initial wait time from repositioning trip to full_trip_routes + initial_wait = new_v_trips[new_v_trips.tmp_trip_num == 1][ + ["servicing_trip_id", "OD_time"] + ].set_index("servicing_trip_id") + full_trip_routes["initial_wait"] = full_trip_routes.trip_i.map( + initial_wait.OD_time + ) - return vehicles + return new_v_trips, full_trip_routes + + def update_vehicle_fleet(self, vehicles, vehicle_trips, time_bin): + # update the next_time_free based on the vehicle trips + next_time_free_update = ( + vehicle_trips.groupby("vehicle_id").arrival_bin.max() + 1 + ) # +1 rouding up to account for dropoff time + vehicles.loc[ + next_time_free_update.index, "next_time_free" + ] = next_time_free_update + # +1 on time bin since we are calculating the availaibility for the next time bin + vehicles["is_free"] = np.where( + (time_bin + 1 >= vehicles.next_time_free), True, False + ) + # also want to update the vehicle location + final_veh_location = vehicle_trips.groupby( + "vehicle_id" + ).destination_skim_idx.last() + vehicles.loc[final_veh_location.index, "location_skim_idx"] = final_veh_location -def summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles): + return vehicles - # Summary statistics for TNC vehicle trips - print("TNC Vehicle Trips Summary:") - print(f"Total TNC Vehicle Trips: {len(tnc_veh_trips)}") - print(f"Total TNC Trips: {len(tnc_trips)}") - print(f"Total Vehicles: {len(vehicles)}") - print(f"Vehicles to TNC Trips Ratio: {(len(vehicles) / len(tnc_trips)):.2f}") - print( - f"Average number of stops per vehicle: {(tnc_veh_trips.groupby('vehicle_id').size().mean()):.2f}" - ) - print( - f"Average time for vehicle to get to trip origin: {tnc_veh_trips[tnc_veh_trips.tmp_trip_num == 1].OD_time.mean():.2f}" - ) + def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): - # also performing consistency checks on the outputs - assert ( - tnc_trips.trip_id.isin(tnc_veh_trips.trip_i) - | tnc_trips.trip_id.isin(tnc_veh_trips.trip_j) - ).all(), "Some trip IDs were not serviced by any vehicle trips" - assert vehicles.index.isin( - tnc_veh_trips.vehicle_id - ).all(), "Some vehicle were created but do not serve any trips" - assert ( - tnc_veh_trips.groupby("vehicle_id").size() >= 2 - ).all(), "Some vehicles do not have at least 2 trips" + # Summary statistics for TNC vehicle trips + logger.info("TNC Vehicle Trips Summary:") + logger.info(f"Total TNC Vehicle Trips: {len(tnc_veh_trips)}") + logger.info(f"Total TNC Trips: {len(tnc_trips)}") + logger.info(f"Total Vehicles: {len(vehicles)}") + logger.info( + f"TNC Trips to Vehicles Ratio: {(len(tnc_trips) / len(vehicles)):.2f}" + ) + logger.info( + f"Average trips per vehicle: {(tnc_veh_trips.groupby('vehicle_id').size().mean()):.2f}" + ) + logger.info( + f"Average number of trips per vehicle: {(tnc_veh_trips.groupby('vehicle_id').size().mean()):.2f}" + ) + logger.info( + f"Average initial wait time: {pooled_trips.initial_wait.mean():.2f} mins" + ) + avg_detour = ( + pooled_trips[pooled_trips.trip_j.notna()][["detour_i", "detour_j"]] + .melt() + .dropna() + .value.mean() + ) + logger.info( + f"Average detour time per passenger on pooled trips: {avg_detour:.2f} mins" + ) + tnc_veh_trips["is_deadhead"] = ( + tnc_veh_trips.trip_i.isna() & tnc_veh_trips.trip_j.isna() + ) + logger.info( + f"Percentage of deadhead vehicle trips: {tnc_veh_trips.is_deadhead.mean() * 100:.2f}%" + ) + tnc_veh_trips["occupancy"] = ( + tnc_veh_trips[["trip_i", "trip_j"]].notna().sum(axis=1) + ) + logger.info( + f"Average occupancy of all vehicle trips: {tnc_veh_trips.occupancy.mean():.2f}" + ) - pass + # also performing consistency checks on the outputs + assert ( + tnc_trips.trip_id.isin(tnc_veh_trips.trip_i) + | tnc_trips.trip_id.isin(tnc_veh_trips.trip_j) + ).all(), "Some trip IDs were not serviced by any vehicle trips" + assert vehicles.index.isin( + tnc_veh_trips.vehicle_id + ).all(), "Some vehicle were created but do not serve any trips" + assert ( + tnc_veh_trips.groupby("vehicle_id").size() >= 2 + ).all(), "Some vehicles do not have at least 2 trips" + + pass + + def route_taxi_tncs(self): + tnc_trips, skim, skim_zone_mapping = self.read_input_data() + + self.skim_data = np.array(skim) + + tnc_trips = self.sample_tnc_trip_simulation_time_bin(tnc_trips) + + vehicles = pd.DataFrame( + columns=[ + "location_skim_idx", + "is_free", + "next_time_free", + "last_refuel_time", + ] + ) + vehicles.index.name = "vehicle_id" + veh_trips = [] + pooling_trips = [] -def route_taxi_tncs(): - tnc_trips, skim, skim_zone_mapping = read_input_data( - input_folder, "SOV_TR_H_TIME__AM" - ) + for time_bin, tnc_trips_i in tnc_trips.groupby("time_bin"): + logger.info( + f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" + ) + trip_pairs = self.determine_potential_trip_pairs(tnc_trips_i.copy()) - skim_data = np.array(skim) + trip_pairs = self.determine_detour_times(trip_pairs) - tnc_trips = determine_time_bin(tnc_trips, bin_size=15) + trip_matches = self.select_mutual_best_recursive(trip_pairs) - vehicles = pd.DataFrame( - columns=["location_skim_idx", "is_free", "next_time_free", "last_refuel_time"] - ) - vehicles.index.name = "vehicle_id" + shared_trips_routed = self.create_trip_routes(trip_matches) - veh_trips = [] + full_trip_routes = self.create_full_trip_route_table( + tnc_trips_i, shared_trips_routed + ) + full_trip_routes["time_bin"] = time_bin - for time_bin, tnc_trips_i in tnc_trips.groupby("time_bin"): - print( - f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" - ) - trip_pairs = determine_potential_trip_pairs( - tnc_trips_i.copy(), skim_data, pooling_buffer=10 - ) + vehicles, trip_to_veh_map = self.match_vehicles_to_trips( + vehicles, full_trip_routes + ) - trip_pairs = determine_detour_times(trip_pairs, skim_data) + vehicle_trips_i, full_trip_routes = self.create_vehicle_trips( + full_trip_routes, vehicles, trip_to_veh_map + ) + veh_trips.append(vehicle_trips_i) + pooling_trips.append(full_trip_routes) - trip_matches = select_mutual_best_recursive(trip_pairs) + vehicles = self.update_vehicle_fleet(vehicles, vehicle_trips_i, time_bin) - shared_trips_routed = create_trip_routes(trip_matches) + tnc_veh_trips = pd.concat(veh_trips) + pooled_trips = pd.concat(pooling_trips) - full_trip_routes = create_full_trip_route_table( - tnc_trips_i, shared_trips_routed, skim_data - ) - full_trip_routes["time_bin"] = time_bin + self.summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles, pooled_trips) - vehicles, trip_to_veh_map = match_vehicles_to_trips( - vehicles, full_trip_routes, skim_data + tnc_veh_trips.to_csv( + os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv") ) - - vehicle_trips_i = create_vehicle_trips( - full_trip_routes, vehicles, trip_to_veh_map, skim_data + pooled_trips.to_csv( + os.path.join(self.settings.output_dir, "output_tnc_pooled_trips.csv") ) - veh_trips.append(vehicle_trips_i) - - vehicles = update_vehicle_fleet(vehicles, vehicle_trips_i, time_bin) - - tnc_veh_trips = pd.concat(veh_trips) - summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles) - - return tnc_veh_trips + return tnc_veh_trips if __name__ == "__main__": start_time = time.time() - tnc_veh_trips = route_taxi_tncs() - print(f"Created {len(tnc_veh_trips)} vehicle trips.") + settings = load_settings(yaml_path="taxi_tnc_routing_settings.yaml") + + router = TaxiTNCRouter(settings) + router.route_taxi_tncs() elapsed_time = time.time() - start_time - print(f"Time to complete: {elapsed_time:.2f} seconds") + logger.info(f"Time to complete: {elapsed_time:.2f} seconds") diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml new file mode 100644 index 000000000..afa1b9048 --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -0,0 +1,29 @@ +# path to activitysim output folder with trip data +asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full + +# path to folder with skim data +skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +# name of skim matrix in OMX file minus time period suffix +skim_core: SOV_TR_H_TIME__AM +# time periods to process, should match network_los.yaml settings +skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] +periods: [0, 6, 12, 25, 32, 48] + +# output folder for results +output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full + +# modes for shared and single occupancy TNC / taxi trips +shared_tnc_modes: ['TNC_SHARED'] +single_tnc_modes: ['TNC_SINGLE', 'TAXI'] + +# simulation time bin size (in mins) +# determines how far apart trips in time can be to be considered for pooling +time_bin_size: 10 + +# buffer size comparing origins and destinations for potential pooling (in mins) +pooling_buffer: 10 +# maximum allowed detour time for pooled trips (in mins) +max_detour: 15 + +# numpy random seed for reproducibility +random_seed: 42 \ No newline at end of file From 8fbf7b738c53d0f6154b05f5ff22f52381cb2f9a Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 29 Sep 2025 17:29:22 -0700 Subject: [PATCH 13/53] tnc vehicle refueling --- .../create_test_taxi_tnc_routing_scenario.py | 20 +- .../taxi_tnc_routing/taxi_tnc_routing.py | 197 ++++++++++++++---- .../taxi_tnc_routing_settings.yaml | 7 + 3 files changed, 168 insertions(+), 56 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py b/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py index f4f94f8ab..fe4e3ca70 100644 --- a/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py +++ b/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py @@ -45,21 +45,21 @@ # depart is in half-hour bins (your code multiplies by 30 then adds random 0–29) trips = pd.DataFrame([ # group A (zones 1–4) – several close OD pairs - (1001, "TNC_SINGLE", 0, 1, 3), - (1002, "TNC_SINGLE", 0, 2, 4), + (1001, "TNC_SHARED", 0, 1, 3), + (1002, "TNC_SHARED", 0, 2, 4), (1003, "TNC_SHARED", 0, 1, 4), - (1004, "TAXI", 0, 3, 2), - (1005, "TNC_SINGLE", 0, 2, 1), + (1004, "TNC_SHARED", 0, 3, 2), + (1005, "TNC_SHARED", 0, 2, 1), (1006, "TNC_SHARED", 0, 4, 1), # group B (zones 6–8) – another cluster - (1010, "TAXI", 0, 6, 8), - (1011, "TNC_SINGLE", 0, 7, 6), + (1010, "TNC_SHARED", 0, 6, 8), + (1011, "TNC_SHARED", 0, 7, 6), (1012, "TNC_SHARED", 0, 8, 6), - (1013, "TNC_SINGLE", 0, 6, 7), + (1013, "TNC_SHARED", 0, 6, 7), # mixed / farther (some won’t pool) - (1020, "TAXI", 0, 1, 9), - (1021, "TNC_SINGLE", 0, 9, 2), - (1022, "TNC_SINGLE", 0, 4, 8), + (1020, "TNC_SHARED", 0, 1, 9), + (1021, "TNC_SHARED", 0, 9, 2), + (1022, "TNC_SHARED", 0, 4, 8), (1023, "TNC_SHARED", 0, 8, 4), ], columns=["trip_id", "trip_mode", "depart", "origin", "destination"]) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index ac9d9c833..ddd06206a 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -45,6 +45,11 @@ class TaxiTNCSettings(BaseModel): # maximum allowed detour time for pooled trips (in mins) max_detour: int = 15 + # column in the landuse table that indicates the presence of refueling stations + landuse_refuel_col: str = "refueling_stations" + # maximum time (in active travel mins) a vehicle can operate before refueling + max_refuel_time: int = 240 # 4 hours + # numpy random seed for reproducibility random_seed: int = 42 @@ -108,16 +113,20 @@ def read_input_data(self): os.path.join(self.settings.asim_output_dir, "final_tnc_trips.csv"), usecols=cols, ) - trips = trips[trips.trip_mode.isin(["TAXI", "TNC_SINGLE", "TNC_SHARED"])] + trips = trips[ + trips.trip_mode.isin( + self.settings.single_tnc_modes + self.settings.shared_tnc_modes + ) + ] - landuse = pd.read_csv( + self.landuse = pd.read_csv( os.path.join(self.settings.asim_output_dir, "final_land_use.csv") ) - if "MAZ" in landuse.columns: - maz_to_taz_map = landuse.set_index("MAZ")["taz"].to_dict() - elif "zone_id" in landuse.columns: - maz_to_taz_map = landuse.set_index("zone_id")["TAZ"].to_dict() + if "MAZ" in self.landuse.columns: + maz_to_taz_map = self.landuse.set_index("MAZ")["taz"].to_dict() + elif "zone_id" in self.landuse.columns: + maz_to_taz_map = self.landuse.set_index("zone_id")["TAZ"].to_dict() else: raise KeyError( "Land use data must contain either 'MAZ' or 'zone_id' column for mapping to TAZ." @@ -125,8 +134,9 @@ def read_input_data(self): trips["oskim_idx"] = trips["origin"].map(maz_to_taz_map).map(mapping) trips["dskim_idx"] = trips["destination"].map(maz_to_taz_map).map(mapping) + self.skim_zone_mapping = mapping - return trips, skim, mapping + return trips, skim def sample_tnc_trip_simulation_time_bin(self, trips): # Create a new column for the time bin @@ -164,8 +174,9 @@ def determine_potential_trip_pairs(self, trips): # Drop self-pairs and keep ioj->di->dj @@ -447,7 +458,10 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): return full_trip_routes def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): - idx_start_num = 0 if vehicles.empty else vehicles.index.max() + """ + Create new + """ + idx_start_num = 0 if vehicles is None else vehicles.index.max() new_vehs = pd.DataFrame( data={ @@ -455,6 +469,7 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): "is_free": False, "last_refuel_time": -1, "next_time_free": np.nan, + "drive_time_since_refuel": 0, }, index=idx_start_num + np.arange(1, len(trips_to_service) + 1), ) @@ -463,20 +478,25 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): # updating the trip to vehicle mapping with the newly created vehicles trip_to_veh_map.loc[trips_to_service.trip_i] = new_vehs.index.values - if vehicles.empty: - vehicles = new_vehs - else: + if vehicles is not None: vehicles = pd.concat([vehicles, new_vehs], ignore_index=False) + else: + vehicles = new_vehs return vehicles, trip_to_veh_map def match_vehicles_to_trips(self, vehicles, full_trip_routes): - free_vehicles = vehicles[vehicles.is_free].copy() + if vehicles is not None: + free_vehicles = vehicles[vehicles.is_free].copy() + else: + free_vehicles = pd.DataFrame() unserviced_trips = full_trip_routes.copy() trip_to_veh_map = pd.Series( - name="vehicle_id", index=unserviced_trips.trip_i, dtype=vehicles.index.dtype + name="vehicle_id", + index=unserviced_trips.trip_i, + dtype=vehicles.index.dtype if vehicles is not None else "int64", ) # loop until all available vehicles are assigned or there are no more unserviced trips @@ -547,19 +567,26 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): columns={"origin_skim_idx": "destination_skim_idx"} ) # creating a temporary trip num because not all vehicles will have stops - pickup["tmp_trip_num"] = 1 + pickup["tmp_tnum"] = 1 + pickup["trip_type"] = "pickup" + stop_1 = full_trip_routes.loc[ full_trip_routes.stop1_skim_idx > -1, ["trip_i", "trip_j", "stop1_skim_idx"] ].rename(columns={"stop1_skim_idx": "destination_skim_idx"}) - stop_1["tmp_trip_num"] = 2 + stop_1["tmp_tnum"] = 2 + stop_1["trip_type"] = "pickup" + stop_2 = full_trip_routes.loc[ full_trip_routes.stop2_skim_idx > -1, ["trip_i", "trip_j", "stop2_skim_idx"] ].rename(columns={"stop2_skim_idx": "destination_skim_idx"}) - stop_2["tmp_trip_num"] = 3 + stop_2["tmp_tnum"] = 3 + stop_2["trip_type"] = "dropoff" + drop_off = full_trip_routes[ ["trip_i", "trip_j", "destination_skim_idx"] ].rename(columns={"destination_skim_idx": "destination_skim_idx"}) - drop_off["tmp_trip_num"] = 4 + drop_off["tmp_tnum"] = 4 + drop_off["trip_type"] = "dropoff" new_v_trips = pd.concat([pickup, stop_1, stop_2, drop_off]) @@ -569,13 +596,13 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): # ensure ordering before deriving origins new_v_trips.sort_values( - ["vehicle_id", "tmp_trip_num"], inplace=True, ignore_index=True + ["vehicle_id", "tmp_tnum"], inplace=True, ignore_index=True ) new_v_trips["origin_skim_idx"] = pd.NA # first leg origin = vehicle current location - first_leg_mask = new_v_trips.tmp_trip_num == 1 + first_leg_mask = new_v_trips.tmp_tnum == 1 new_v_trips.loc[first_leg_mask, "origin_skim_idx"] = new_v_trips.loc[ first_leg_mask, "vehicle_id" ].map(vehicles.location_skim_idx) @@ -606,7 +633,7 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): "trip_i" ] # leave a trail to know where the vehicle is going # first trip from vehicle location to pickup has no occupants. - new_v_trips.loc[new_v_trips.tmp_trip_num == 1, ["trip_i", "trip_j"]] = np.nan + new_v_trips.loc[new_v_trips.tmp_tnum == 1, ["trip_i", "trip_j"]] = np.nan # who gets picked up and goes to the stops is dependent on the scenario scenario = ( full_trip_routes.set_index("trip_i") @@ -616,31 +643,31 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): new_v_trips["scenario"] = scenario # scenario 1: oi->oj->di->dj new_v_trips.loc[ - (scenario == 1) & (new_v_trips.tmp_trip_num == 2), "trip_j" + (scenario == 1) & (new_v_trips.tmp_tnum == 2), "trip_j" ] = np.nan new_v_trips.loc[ - (scenario == 1) & (new_v_trips.tmp_trip_num == 4), "trip_i" + (scenario == 1) & (new_v_trips.tmp_tnum == 4), "trip_i" ] = np.nan # scenario 2: oj->oi->dj->di new_v_trips.loc[ - (scenario == 2) & (new_v_trips.tmp_trip_num == 2), "trip_i" + (scenario == 2) & (new_v_trips.tmp_tnum == 2), "trip_i" ] = np.nan new_v_trips.loc[ - (scenario == 2) & (new_v_trips.tmp_trip_num == 4), "trip_j" + (scenario == 2) & (new_v_trips.tmp_tnum == 4), "trip_j" ] = np.nan # scenario 3: oi->oj->dj->di new_v_trips.loc[ - (scenario == 3) & (new_v_trips.tmp_trip_num == 2), "trip_j" + (scenario == 3) & (new_v_trips.tmp_tnum == 2), "trip_j" ] = np.nan new_v_trips.loc[ - (scenario == 3) & (new_v_trips.tmp_trip_num == 4), "trip_j" + (scenario == 3) & (new_v_trips.tmp_tnum == 4), "trip_j" ] = np.nan # scenario 4: oj->oi->di->dj new_v_trips.loc[ - (scenario == 4) & (new_v_trips.tmp_trip_num == 2), "trip_i" + (scenario == 4) & (new_v_trips.tmp_tnum == 2), "trip_i" ] = np.nan new_v_trips.loc[ - (scenario == 4) & (new_v_trips.tmp_trip_num == 4), "trip_i" + (scenario == 4) & (new_v_trips.tmp_tnum == 4), "trip_i" ] = np.nan # determine time bin of each trip @@ -664,7 +691,7 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" # merge initial wait time from repositioning trip to full_trip_routes - initial_wait = new_v_trips[new_v_trips.tmp_trip_num == 1][ + initial_wait = new_v_trips[new_v_trips.tmp_tnum == 1][ ["servicing_trip_id", "OD_time"] ].set_index("servicing_trip_id") full_trip_routes["initial_wait"] = full_trip_routes.trip_i.map( @@ -673,10 +700,10 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): return new_v_trips, full_trip_routes - def update_vehicle_fleet(self, vehicles, vehicle_trips, time_bin): + def update_vehicle_fleet(self, vehicles, vehicle_trips_i, time_bin): # update the next_time_free based on the vehicle trips next_time_free_update = ( - vehicle_trips.groupby("vehicle_id").arrival_bin.max() + 1 + vehicle_trips_i.groupby("vehicle_id").arrival_bin.max() + 1 ) # +1 rouding up to account for dropoff time vehicles.loc[ next_time_free_update.index, "next_time_free" @@ -687,11 +714,14 @@ def update_vehicle_fleet(self, vehicles, vehicle_trips, time_bin): ) # also want to update the vehicle location - final_veh_location = vehicle_trips.groupby( + final_veh_location = vehicle_trips_i.groupby( "vehicle_id" ).destination_skim_idx.last() vehicles.loc[final_veh_location.index, "location_skim_idx"] = final_veh_location + tot_drive_time = vehicle_trips_i.groupby("vehicle_id").OD_time.sum() + vehicles.loc[tot_drive_time.index, "drive_time_since_refuel"] += tot_drive_time + return vehicles def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): @@ -749,23 +779,88 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): pass - def route_taxi_tncs(self): - tnc_trips, skim, skim_zone_mapping = self.read_input_data() + def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): + """Check to see if the vehicle needs to refuel. - self.skim_data = np.array(skim) + If the vehicle has been operating for more than the refuel interval, + it needs be routed to the nearest refuel station before it becomes available again. + """ + # updated drive time + drive_time_from_trips_in_bin = vehicle_trips_i.groupby( + "vehicle_id" + ).OD_time.sum() + tot_drive_time = ( + drive_time_from_trips_in_bin + + vehicles.loc[ + drive_time_from_trips_in_bin.index, "drive_time_since_refuel" + ] + ) + needs_refuel = tot_drive_time > self.settings.max_refuel_time - tnc_trips = self.sample_tnc_trip_simulation_time_bin(tnc_trips) + if not needs_refuel.any(): + return None - vehicles = pd.DataFrame( - columns=[ - "location_skim_idx", - "is_free", - "next_time_free", - "last_refuel_time", + # find the nearest refuel station for each vehicle that needs to refuel + vehs_to_refuel = ( + vehicle_trips_i[ + vehicle_trips_i.vehicle_id.isin(needs_refuel[needs_refuel].index) ] + .drop_duplicates("vehicle_id", keep="last") + .copy() + ) + refuel_stations = self.landuse[ + self.landuse[self.settings.landuse_refuel_col] > 0 + ] + refuel_stations = ( + refuel_stations.TAZ + if "TAZ" in refuel_stations.columns + else refuel_stations.taz ) - vehicles.index.name = "vehicle_id" + refuel_stations_idx = refuel_stations.map(self.skim_zone_mapping).to_numpy() + # find skim times between trip origins and all veh locations + skim_times = self.skim_data[ + np.ix_(vehs_to_refuel.destination_skim_idx.to_numpy(), refuel_stations_idx) + ] + + # best station per vehicle + station_choice_idx = np.argmin(skim_times, axis=1) + min_times = skim_times[np.arange(len(station_choice_idx)), station_choice_idx] + nearest_station_skim_idx = refuel_stations_idx[station_choice_idx] + + # create refuel vehicle trips + refuel_veh_trips = pd.DataFrame( + { + "vehicle_id": vehs_to_refuel.index, + "trip_i": np.nan, + "trip_j": np.nan, + "scenario": -1, + "tmp_trip_num": -1, + "origin_skim_idx": vehs_to_refuel.destination_skim_idx, # start refuel trip from last dropoff + "destination_skim_idx": nearest_station_skim_idx, + "servicing_trip_id": np.nan, + "OD_time": min_times, + "cumulative_trip_time": min_times, + "depart_bin": vehs_to_refuel.arrival_bin, # start refuel trip right after last trip + "arrival_bin": vehs_to_refuel.arrival_bin + + np.ceil(min_times / self.settings.time_bin_size).astype( + int + ), # assuming refuel trip takes the time to get to the station + "trip_type": "refuel", + } + ).set_index("vehicle_id") + logger.info(f"\tRouting {len(refuel_veh_trips)} vehicles to refuel stations") + + return refuel_veh_trips + + def route_taxi_tncs(self): + tnc_trips, skim = self.read_input_data() + + self.skim_data = np.array(skim) + + tnc_trips = self.sample_tnc_trip_simulation_time_bin(tnc_trips) + + vehicles = None veh_trips = [] pooling_trips = [] @@ -773,7 +868,11 @@ def route_taxi_tncs(self): logger.info( f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" ) - trip_pairs = self.determine_potential_trip_pairs(tnc_trips_i.copy()) + trip_pairs = self.determine_potential_trip_pairs( + tnc_trips_i[ + tnc_trips_i.trip_mode.isin(self.settings.shared_tnc_modes) + ].copy() + ) trip_pairs = self.determine_detour_times(trip_pairs) @@ -796,6 +895,12 @@ def route_taxi_tncs(self): veh_trips.append(vehicle_trips_i) pooling_trips.append(full_trip_routes) + refuel_veh_trips_i = self.check_refuel_needs( + vehicle_trips_i, vehicles, time_bin + ) + if refuel_veh_trips_i is not None: + veh_trips.append(refuel_veh_trips_i) + vehicles = self.update_vehicle_fleet(vehicles, vehicle_trips_i, time_bin) tnc_veh_trips = pd.concat(veh_trips) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index afa1b9048..c45ad8f1a 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -15,6 +15,8 @@ output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documen # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: ['TNC_SHARED'] single_tnc_modes: ['TNC_SINGLE', 'TAXI'] +# shared_tnc_modes: ['TNC_SHARED', 'TNC_SINGLE', 'TAXI'] +# single_tnc_modes: [] # simulation time bin size (in mins) # determines how far apart trips in time can be to be considered for pooling @@ -25,5 +27,10 @@ pooling_buffer: 10 # maximum allowed detour time for pooled trips (in mins) max_detour: 15 +# column in the landuse table that indicates the presence of refueling stations +landuse_refuel_col: refueling_stations +# maximum time (in active travel mins) a vehicle can operate before refueling +max_refuel_time: 240 # 4 hours + # numpy random seed for reproducibility random_seed: 42 \ No newline at end of file From ee5c11de5b4e52de0f839d7b57875069209dc146 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Tue, 30 Sep 2025 21:34:43 -0700 Subject: [PATCH 14/53] skim data periods, maz in outputs --- .../taxi_tnc_routing/taxi_tnc_routing.py | 339 ++++++++++++++---- .../taxi_tnc_routing_settings.yaml | 5 +- 2 files changed, 273 insertions(+), 71 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index ddd06206a..6cd315e22 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -3,7 +3,7 @@ import openmatrix as omx import os import time -from pydantic import BaseModel, ValidationError +from pydantic import BaseModel, ValidationError, model_validator import logging import yaml @@ -23,11 +23,17 @@ class TaxiTNCSettings(BaseModel): # path to folder with skim data skim_dir: str - skim_core: str = ( - "SOV_TR_H_TIME" # name of skim matrix in OMX file minus time period suffix - ) + # name of skim matrix in OMX file minus time period suffix + skim_time_core: str = "SOV_TR_H_TIME" skim_periods: list = ["EA", "AM", "MD", "PM", "EV"] # time periods to process periods: list = [0, 6, 12, 25, 32, 48] + skim_files: list = [ + "traffic_skims_EA.omx", + "traffic_skims_AM.omx", + "traffic_skims_MD.omx", + "traffic_skims_PM.omx", + "traffic_skims_EV.omx", + ] # output folder for results output_dir: str = "./output" @@ -58,6 +64,16 @@ def period_time_bin_minutes(self) -> int: # minutes per (max period index); unchanged if periods list changes return (24 * 60) // max(self.periods) + @model_validator(mode="after") + def check_skim_periods(self): + if len(self.skim_periods) != len(self.periods) - 1: + raise ValueError( + "Length of skim_periods must be one less than length of periods" + ) + if len(self.skim_files) != len(self.skim_periods): + raise ValueError("Length of skim_files must match length of skim_periods") + return self + def load_settings( yaml_path: str = "taxi_tnc_routing_settings.yaml", @@ -95,15 +111,82 @@ class TaxiTNCRouter: def __init__(self, settings: TaxiTNCSettings): self.settings = settings self.skim_data = None + self.skim_zone_mapping = None + self.current_skim_time_period = None + self.generate_time_table() + + def generate_time_table(self): + # Build and cache a time-bin lookup table on self: + # index: time_bin; cols: hour, minute, period (EA/AM/MD/PM/EV), depart_bin (1..48 starting at 3 AM) + minutes_per_bin = int(self.settings.time_bin_size) + bins_per_day = (24 * 60) // minutes_per_bin + time_bins = np.arange(bins_per_day, dtype=int) + + # Offset bin starts by 3:00 (180 min), wrap at 24h + bin_start_min = (180 + time_bins * minutes_per_bin) % 1440 # minutes from 00:00 + + # Clock time + hours = (bin_start_min // 60) % 24 + minutes = bin_start_min % 60 + + # ActivitySim depart bin: half-hour bins starting at 3:00 (bin 1) + # Wrap with modulo 1440 to handle minutes before 3:00 correctly. + depart_bin = ((bin_start_min - 180) % 1440) // 30 + 1 + depart_bin = depart_bin.astype(int) # 1..48 + + # Map depart_bin -> skim period using configured breakpoints + # periods are boundaries like [0, 6, 12, 25, 32, 48] meaning (0,6], (6,12], ... + edges = np.asarray(self.settings.periods, dtype=int) + labels = np.asarray(self.settings.skim_periods, dtype=object) + period_idx = np.digitize(depart_bin, edges, right=True) - 1 # 0..len(labels)-1 + period_idx = np.clip(period_idx, 0, len(labels) - 1) + period = labels[period_idx] + + self.time_bin_table = pd.DataFrame( + { + "hour": hours, + "minute": minutes, + "period": period, + "depart_bin": depart_bin, + }, + index=pd.Index(time_bins, name="time_bin"), + ) + return + + def read_skim_data(self, time_bin): + # current period of the time_bin + time_period = self.time_bin_table.loc[time_bin, "period"] + time_mismatch = self.current_skim_time_period != time_period + + def load_skim(omx_file, core): + with omx.open_file( + os.path.join(self.settings.skim_dir, omx_file), "r" + ) as f: + skim = np.array(f[core]) + mapping = f.mapping(f.list_mappings()[0]) + return skim, mapping + + # load new skim if no skim data currently exists or the skim is not for the current period + if self.skim_data is None or time_mismatch: + self.current_skim_time_period = time_period + skim_file = self.settings.skim_files[ + self.settings.skim_periods.index(time_period) + ] + self.skim_data, mapping = load_skim( + skim_file, self.settings.skim_time_core + "__" + time_period + ) + assert ( + self.skim_zone_mapping == mapping + ) or self.skim_zone_mapping is None, "Zone mapping changed between skims" + self.skim_zone_mapping = mapping + # otherwise keep using existing skim data + else: + pass + + return def read_input_data(self): # Read the data from the OpenMatrix file - with omx.open_file( - os.path.join(self.settings.skim_dir, "traffic_skims_AM.omx"), "r" - ) as f: - skim = np.array(f[self.settings.skim_core]) - mapping = f.mapping(f.list_mappings()[0]) - # Convert the data to a pandas DataFrame cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] # trips = pd.read_csv(os.path.join(self.settings.asim_output_dir, "final_trips.csv"), usecols=cols) @@ -132,21 +215,28 @@ def read_input_data(self): "Land use data must contain either 'MAZ' or 'zone_id' column for mapping to TAZ." ) - trips["oskim_idx"] = trips["origin"].map(maz_to_taz_map).map(mapping) - trips["dskim_idx"] = trips["destination"].map(maz_to_taz_map).map(mapping) - self.skim_zone_mapping = mapping + # mapping origin and destination maz to skim taz index for fast lookups + trips["oskim_idx"] = ( + trips["origin"].map(maz_to_taz_map).map(self.skim_zone_mapping) + ) + trips["dskim_idx"] = ( + trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) + ) - return trips, skim + return trips def sample_tnc_trip_simulation_time_bin(self, trips): # Create a new column for the time bin # Convert departure time to mins, sampling within the half hour # Then bin into the bin size (supplied in mins) - trips["time_in_mins"] = trips["depart"] * 30 + np.random.randint( - 0, 30, size=len(trips) + trips["time_in_mins"] = (trips["depart"] - 1) * 30 + np.random.randint( + 0, self.settings.period_time_bin_minutes, size=len(trips) ) trips["time_bin"] = trips["time_in_mins"] // self.settings.time_bin_size + assert trips.time_bin.isin( + self.time_bin_table.index + ).all(), "Some time bins are out of range" return trips @@ -190,18 +280,28 @@ def determine_potential_trip_pairs(self, trips): trip_pairs["dest_time"] = d2d_time[ii, jj] # also include the origin and destination skim idxs # create maps from trip id to origin and to destination - lookup = trips.loc[:, ["trip_id", "oskim_idx", "dskim_idx"]].set_index( - "trip_id" - ) + lookup = trips.loc[ + :, ["trip_id", "oskim_idx", "dskim_idx", "origin", "destination"] + ].set_index("trip_id") trip_pairs = trip_pairs.join( lookup.rename( - columns={"oskim_idx": "o_i_skim_idx", "dskim_idx": "d_i_skim_idx"} + columns={ + "oskim_idx": "o_i_skim_idx", + "dskim_idx": "d_i_skim_idx", + "origin": "origin_i", + "destination": "destination_i", + } ), on="trip_i", ).join( lookup.rename( - columns={"oskim_idx": "o_j_skim_idx", "dskim_idx": "d_j_skim_idx"} + columns={ + "oskim_idx": "o_j_skim_idx", + "dskim_idx": "d_j_skim_idx", + "origin": "origin_j", + "destination": "destination_j", + } ), on="trip_j", ) @@ -399,9 +499,12 @@ def create_trip_routes(self, trip_matches): s3_idx = [0, 1, 3, 2] # oi->oj->dj->di s4_idx = [1, 0, 2, 3] # oj->oi->di->dj - ods = trip_matches[ + ods_idx = trip_matches[ ["o_i_skim_idx", "o_j_skim_idx", "d_i_skim_idx", "d_j_skim_idx"] ].to_numpy() + ods = trip_matches[ + ["origin_i", "origin_j", "destination_i", "destination_j"] + ].to_numpy() scenario_orders = np.array( [s1_idx, s2_idx, s3_idx, s4_idx] @@ -416,8 +519,10 @@ def create_trip_routes(self, trip_matches): ) ordered_nodes = np.full((len(trips_routed), 4), -1, dtype=int) + ordered_nodes_idx = np.full((len(trips_routed), 4), -1, dtype=int) if valid_mask.any(): row_idx = np.arange(len(trips_routed))[valid_mask] + ordered_nodes_idx[valid_mask] = ods_idx[row_idx[:, None], order_idx] ordered_nodes[valid_mask] = ods[row_idx[:, None], order_idx] trips_routed[ @@ -427,6 +532,14 @@ def create_trip_routes(self, trip_matches): "stop2_skim_idx", "destination_skim_idx", ] + ] = ordered_nodes_idx + trips_routed[ + [ + "origin", + "stop1", + "stop2", + "destination", + ] ] = ordered_nodes return trips_routed @@ -440,6 +553,8 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): "trip_id": "trip_i", "oskim_idx": "origin_skim_idx", "dskim_idx": "destination_skim_idx", + "origin": "origin", + "destination": "destination", } single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() single_trips["total_ivt"] = self.skim_data[ @@ -466,6 +581,7 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): new_vehs = pd.DataFrame( data={ "location_skim_idx": trips_to_service.origin_skim_idx.values, + "location": trips_to_service.origin.values, "is_free": False, "last_refuel_time": -1, "next_time_free": np.nan, @@ -563,29 +679,37 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): # Create vehicle trips from the full trip routes # first turning full_trip_routes into a list of stops - pickup = full_trip_routes[["trip_i", "trip_j", "origin_skim_idx"]].rename( - columns={"origin_skim_idx": "destination_skim_idx"} + pickup = full_trip_routes[ + ["trip_i", "trip_j", "origin_skim_idx", "origin"] + ].rename( + columns={"origin_skim_idx": "destination_skim_idx", "origin": "destination"} ) # creating a temporary trip num because not all vehicles will have stops - pickup["tmp_tnum"] = 1 + pickup["srv_trip_num"] = 1 pickup["trip_type"] = "pickup" stop_1 = full_trip_routes.loc[ - full_trip_routes.stop1_skim_idx > -1, ["trip_i", "trip_j", "stop1_skim_idx"] - ].rename(columns={"stop1_skim_idx": "destination_skim_idx"}) - stop_1["tmp_tnum"] = 2 + full_trip_routes.stop1_skim_idx > -1, + ["trip_i", "trip_j", "stop1_skim_idx", "stop1"], + ].rename( + columns={"stop1_skim_idx": "destination_skim_idx", "stop1": "destination"} + ) + stop_1["srv_trip_num"] = 2 stop_1["trip_type"] = "pickup" stop_2 = full_trip_routes.loc[ - full_trip_routes.stop2_skim_idx > -1, ["trip_i", "trip_j", "stop2_skim_idx"] - ].rename(columns={"stop2_skim_idx": "destination_skim_idx"}) - stop_2["tmp_tnum"] = 3 + full_trip_routes.stop2_skim_idx > -1, + ["trip_i", "trip_j", "stop2_skim_idx", "stop2"], + ].rename( + columns={"stop2_skim_idx": "destination_skim_idx", "stop2": "destination"} + ) + stop_2["srv_trip_num"] = 3 stop_2["trip_type"] = "dropoff" drop_off = full_trip_routes[ - ["trip_i", "trip_j", "destination_skim_idx"] - ].rename(columns={"destination_skim_idx": "destination_skim_idx"}) - drop_off["tmp_tnum"] = 4 + ["trip_i", "trip_j", "destination_skim_idx", "destination"] + ].copy() + drop_off["srv_trip_num"] = 4 drop_off["trip_type"] = "dropoff" new_v_trips = pd.concat([pickup, stop_1, stop_2, drop_off]) @@ -596,36 +720,42 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): # ensure ordering before deriving origins new_v_trips.sort_values( - ["vehicle_id", "tmp_tnum"], inplace=True, ignore_index=True + ["vehicle_id", "srv_trip_num"], inplace=True, ignore_index=True ) new_v_trips["origin_skim_idx"] = pd.NA + new_v_trips["origin"] = pd.NA # first leg origin = vehicle current location - first_leg_mask = new_v_trips.tmp_tnum == 1 + first_leg_mask = new_v_trips.srv_trip_num == 1 new_v_trips.loc[first_leg_mask, "origin_skim_idx"] = new_v_trips.loc[ first_leg_mask, "vehicle_id" ].map(vehicles.location_skim_idx) + new_v_trips.loc[first_leg_mask, "origin"] = new_v_trips.loc[ + first_leg_mask, "vehicle_id" + ].map(vehicles.location) - # subsequent leg origin = previous leg destination (shift(1), not shift(-1)) - prev_destinations = new_v_trips.groupby("vehicle_id")[ - "destination_skim_idx" - ].shift(1) - new_v_trips.loc[~first_leg_mask, "origin_skim_idx"] = prev_destinations[ - ~first_leg_mask - ] - + # subsequent leg origin = previous leg destination + new_v_trips.loc[~first_leg_mask, "origin_skim_idx"] = new_v_trips.groupby( + "vehicle_id" + )["destination_skim_idx"].shift(1)[~first_leg_mask] + new_v_trips.loc[~first_leg_mask, "origin"] = new_v_trips.groupby("vehicle_id")[ + "destination" + ].shift(1)[~first_leg_mask] + + o_idx_na = new_v_trips.origin_skim_idx.notna() + d_idx_na = new_v_trips.destination_skim_idx.notna() + o_na = new_v_trips.origin.notna() + d_na = new_v_trips.destination.notna() assert ( - not new_v_trips.origin_skim_idx.isna().any() - ), f"Some vehicle trips do not have an origin skim index: {new_v_trips[new_v_trips.origin_skim_idx.isna()]}" + o_idx_na & d_idx_na + ).all(), f"Some vehicle trips do not have an origin or destination skim index:\n {new_v_trips[~(o_idx_na & d_idx_na)]}" assert ( - not new_v_trips.destination_skim_idx.isna().any() - ), f"Some vehicle trips do not have a destination skim index: {new_v_trips[new_v_trips.destination_skim_idx.isna()]}" + o_na & d_na + ).all(), f"Some vehicle trips do not have an origin or destination:\n {new_v_trips[~(o_na & d_na)]}" - new_v_trips["origin_skim_idx"] = new_v_trips.origin_skim_idx.astype(int) - new_v_trips["destination_skim_idx"] = new_v_trips.destination_skim_idx.astype( - int - ) + cols = ["origin_skim_idx", "destination_skim_idx", "origin", "destination"] + new_v_trips[cols] = new_v_trips[cols].astype({col: int for col in cols}) # update which trips are being served during the specific vehicle leg # right now, we have both trip_i and trip_j (if pooled) for all legs @@ -633,7 +763,7 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): "trip_i" ] # leave a trail to know where the vehicle is going # first trip from vehicle location to pickup has no occupants. - new_v_trips.loc[new_v_trips.tmp_tnum == 1, ["trip_i", "trip_j"]] = np.nan + new_v_trips.loc[new_v_trips.srv_trip_num == 1, ["trip_i", "trip_j"]] = np.nan # who gets picked up and goes to the stops is dependent on the scenario scenario = ( full_trip_routes.set_index("trip_i") @@ -643,31 +773,31 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): new_v_trips["scenario"] = scenario # scenario 1: oi->oj->di->dj new_v_trips.loc[ - (scenario == 1) & (new_v_trips.tmp_tnum == 2), "trip_j" + (scenario == 1) & (new_v_trips.srv_trip_num == 2), "trip_j" ] = np.nan new_v_trips.loc[ - (scenario == 1) & (new_v_trips.tmp_tnum == 4), "trip_i" + (scenario == 1) & (new_v_trips.srv_trip_num == 4), "trip_i" ] = np.nan # scenario 2: oj->oi->dj->di new_v_trips.loc[ - (scenario == 2) & (new_v_trips.tmp_tnum == 2), "trip_i" + (scenario == 2) & (new_v_trips.srv_trip_num == 2), "trip_i" ] = np.nan new_v_trips.loc[ - (scenario == 2) & (new_v_trips.tmp_tnum == 4), "trip_j" + (scenario == 2) & (new_v_trips.srv_trip_num == 4), "trip_j" ] = np.nan # scenario 3: oi->oj->dj->di new_v_trips.loc[ - (scenario == 3) & (new_v_trips.tmp_tnum == 2), "trip_j" + (scenario == 3) & (new_v_trips.srv_trip_num == 2), "trip_j" ] = np.nan new_v_trips.loc[ - (scenario == 3) & (new_v_trips.tmp_tnum == 4), "trip_j" + (scenario == 3) & (new_v_trips.srv_trip_num == 4), "trip_j" ] = np.nan # scenario 4: oj->oi->di->dj new_v_trips.loc[ - (scenario == 4) & (new_v_trips.tmp_tnum == 2), "trip_i" + (scenario == 4) & (new_v_trips.srv_trip_num == 2), "trip_i" ] = np.nan new_v_trips.loc[ - (scenario == 4) & (new_v_trips.tmp_tnum == 4), "trip_i" + (scenario == 4) & (new_v_trips.srv_trip_num == 4), "trip_i" ] = np.nan # determine time bin of each trip @@ -691,7 +821,7 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" # merge initial wait time from repositioning trip to full_trip_routes - initial_wait = new_v_trips[new_v_trips.tmp_tnum == 1][ + initial_wait = new_v_trips[new_v_trips.srv_trip_num == 1][ ["servicing_trip_id", "OD_time"] ].set_index("servicing_trip_id") full_trip_routes["initial_wait"] = full_trip_routes.trip_i.map( @@ -714,10 +844,14 @@ def update_vehicle_fleet(self, vehicles, vehicle_trips_i, time_bin): ) # also want to update the vehicle location - final_veh_location = vehicle_trips_i.groupby( + final_veh_location_idx = vehicle_trips_i.groupby( "vehicle_id" ).destination_skim_idx.last() - vehicles.loc[final_veh_location.index, "location_skim_idx"] = final_veh_location + vehicles.loc[ + final_veh_location_idx.index, "location_skim_idx" + ] = final_veh_location_idx + final_veh_location = vehicle_trips_i.groupby("vehicle_id").destination.last() + vehicles.loc[final_veh_location.index, "location"] = final_veh_location tot_drive_time = vehicle_trips_i.groupby("vehicle_id").OD_time.sum() vehicles.loc[tot_drive_time.index, "drive_time_since_refuel"] += tot_drive_time @@ -811,12 +945,12 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): refuel_stations = self.landuse[ self.landuse[self.settings.landuse_refuel_col] > 0 ] - refuel_stations = ( + refuel_stations_taz = ( refuel_stations.TAZ if "TAZ" in refuel_stations.columns else refuel_stations.taz ) - refuel_stations_idx = refuel_stations.map(self.skim_zone_mapping).to_numpy() + refuel_stations_idx = refuel_stations_taz.map(self.skim_zone_mapping).to_numpy() # find skim times between trip origins and all veh locations skim_times = self.skim_data[ @@ -827,6 +961,12 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): station_choice_idx = np.argmin(skim_times, axis=1) min_times = skim_times[np.arange(len(station_choice_idx)), station_choice_idx] nearest_station_skim_idx = refuel_stations_idx[station_choice_idx] + refuel_stations_maz = ( + refuel_stations.MAZ + if "MAZ" in refuel_stations.columns + else refuel_stations.mgra + ).to_numpy() + nearest_station_maz = refuel_stations_maz[station_choice_idx] # create refuel vehicle trips refuel_veh_trips = pd.DataFrame( @@ -835,9 +975,11 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): "trip_i": np.nan, "trip_j": np.nan, "scenario": -1, - "tmp_trip_num": -1, + "srv_trip_num": -1, "origin_skim_idx": vehs_to_refuel.destination_skim_idx, # start refuel trip from last dropoff "destination_skim_idx": nearest_station_skim_idx, + "origin": vehs_to_refuel.destination, # start refuel trip from last dropoff + "destination": nearest_station_maz, "servicing_trip_id": np.nan, "OD_time": min_times, "cumulative_trip_time": min_times, @@ -853,17 +995,70 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): return refuel_veh_trips - def route_taxi_tncs(self): - tnc_trips, skim = self.read_input_data() + def remap_skim_idx_to_zone(self, tnc_veh_trips, pooled_trips, tnc_trips): + # remap the skim idx back to zone ids for output + skim_idx_to_taz_map = {v: k for k, v in self.skim_zone_mapping.items()} - self.skim_data = np.array(skim) + # map skim index back to taz + tnc_veh_trips["origin_taz"] = tnc_veh_trips.origin_skim_idx.map( + skim_idx_to_taz_map + ) + tnc_veh_trips["destination_taz"] = tnc_veh_trips.destination_skim_idx.map( + skim_idx_to_taz_map + ) + + pooled_trips["origin_taz"] = pooled_trips.origin_skim_idx.map( + skim_idx_to_taz_map + ) + pooled_trips["stop1_taz"] = pooled_trips.stop1_skim_idx.map(skim_idx_to_taz_map) + pooled_trips["stop2_taz"] = pooled_trips.stop2_skim_idx.map(skim_idx_to_taz_map) + pooled_trips["destination_taz"] = pooled_trips.destination_skim_idx.map( + skim_idx_to_taz_map + ) + missing_o = tnc_veh_trips["origin"].isna() + missing_d = tnc_veh_trips["destination"].isna() + assert ( + not missing_o.any() + ), f"Some vehicle trips do not have an origin MAZ {tnc_veh_trips[missing_o]}" + assert ( + not missing_d.any() + ), f"Some vehicle trips do not have a destination MAZ {tnc_veh_trips[missing_d]}" + + # Drop skim indices after mapping back to zones/MAZ + tnc_veh_trips.drop( + columns=["origin_skim_idx", "destination_skim_idx"], + inplace=True, + errors="ignore", + ) + pooled_trips.drop( + columns=[ + "origin_skim_idx", + "destination_skim_idx", + "stop1_skim_idx", + "stop2_skim_idx", + ], + inplace=True, + errors="ignore", + ) + + return tnc_veh_trips, pooled_trips + + def route_taxi_tncs(self): + """Main function to route taxi and TNC trips, including pooling logic.""" + # read in initial skim data + self.read_skim_data(0) + + # read in taxi / tnc trip data + tnc_trips = self.read_input_data() tnc_trips = self.sample_tnc_trip_simulation_time_bin(tnc_trips) + # initialize vehicle fleet vehicles = None veh_trips = [] pooling_trips = [] + # loop through each time bin and process trips for time_bin, tnc_trips_i in tnc_trips.groupby("time_bin"): logger.info( f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" @@ -908,6 +1103,10 @@ def route_taxi_tncs(self): self.summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles, pooled_trips) + tnc_veh_trips, pooled_trips = self.remap_skim_idx_to_zone( + tnc_veh_trips, pooled_trips, tnc_trips + ) + tnc_veh_trips.to_csv( os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv") ) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index c45ad8f1a..35a511b35 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -4,10 +4,13 @@ asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Do # path to folder with skim data skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full # name of skim matrix in OMX file minus time period suffix -skim_core: SOV_TR_H_TIME__AM +skim_time_core: SOV_TR_H_TIME # time periods to process, should match network_los.yaml settings skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] +# skim_periods: ['AM', 'AM', 'AM', 'AM', 'AM'] periods: [0, 6, 12, 25, 32, 48] +skim_files: ['traffic_skims_EA.omx', 'traffic_skims_AM.omx', 'traffic_skims_MD.omx', 'traffic_skims_PM.omx', 'traffic_skims_EV.omx'] +# skim_files: ['traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx'] # output folder for results output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full From 46fc057d3a57f76fbb459fd07ad2873bbef71756 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 2 Oct 2025 21:56:35 -0700 Subject: [PATCH 15/53] updating av_repositioning to handle multiple trips in tour in time period --- src/asim/extensions/av_routing.py | 32 +++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index f5b60c8f2..1d46bbeed 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -318,6 +318,10 @@ def execute_av_trip_matches( all_veh_trips = pd.concat(all_veh_trips, ignore_index=True) all_veh_trips["is_deadhead"] = False + assert ( + all_veh_trips.trip_id.notna().all() + ), f"Some AV trips do not have a trip_id after merging with trips_in_period:\n{all_veh_trips[all_veh_trips.trip_id.isna()]}" + all_veh_trips["trip_type"] = "serving_trip" # add trip to table if the AV is not at the trip origin! first_veh_trip = all_veh_trips.drop_duplicates("vehicle_id") @@ -339,6 +343,7 @@ def execute_av_trip_matches( ].values additional_reposition_trips[["trip_number", "av_number", "trip_id"]] = pd.NA additional_reposition_trips["is_deadhead"] = True + additional_reposition_trips["trip_type"] = "going_to_matched_trip" # merge in the repositioning trips all_veh_trips = pd.concat( @@ -630,6 +635,7 @@ def get_next_household_trips_to_service( ] # loop through next_trip_number and add the trip info to choosers + choosers.reset_index(inplace=True, drop=False) for next_trip_num in range(1, 4): next_trips = next_hh_trips[next_hh_trips.next_trip_number == next_trip_num][ trip_columns_to_keep @@ -641,6 +647,7 @@ def get_next_household_trips_to_service( columns={f"next_household_id_{next_trip_num}": "household_id"}, inplace=True ) choosers = choosers.merge(next_trips, on="household_id", how="left") + choosers.set_index("repo_chooser_id", inplace=True) # fill NaN values with -1 so skims and stuff works with utility expressions choosers.fillna(-1, inplace=True) @@ -728,11 +735,11 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): "stay_with_person", ] assert ( - veh_trips_this_period["av_repositioning_choice"].isin(expected_choices).all() + choosers["av_repositioning_choice"].isin(expected_choices).all() ), "All repositioning choices should be one of the expected options" # first duplicating all trips in this period - new_veh_trips = veh_trips_this_period.copy() + new_veh_trips = choosers.copy()[veh_trips_this_period.columns] new_veh_trips["origin"] = new_veh_trips["destination"] new_veh_trips["destination"] = pd.NA @@ -741,14 +748,17 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): new_veh_trips.loc[go_home_mask, "destination"] = choosers.loc[ go_home_mask, "home_zone_id" ] + new_veh_trips.loc[go_home_mask, "trip_type"] = "going_home" # updating location to nearest parking zone for vehicles going to remote parking go_park_mask = new_veh_trips["av_repositioning_choice"] == "go_to_parking" new_veh_trips.loc[go_park_mask, "destination"] = new_veh_trips.loc[ go_park_mask, "origin" ].map(PARKING_ZONE_MAP) + new_veh_trips.loc[go_park_mask, "trip_type"] = "going_to_parking" # updating location for those going to the next trip origin + new_veh_trips["next_trip_id"] = np.nan for next_trip_num in range(1, 4): go_next_trip_mask = ( new_veh_trips["av_repositioning_choice"] @@ -757,6 +767,10 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): new_veh_trips.loc[go_next_trip_mask, "destination"] = choosers.loc[ go_next_trip_mask, f"next_origin_{next_trip_num}" ] + new_veh_trips.loc[go_next_trip_mask, "next_trip_id"] = choosers.loc[ + go_next_trip_mask, f"next_trip_id_{next_trip_num}" + ] + new_veh_trips.loc[go_next_trip_mask, "trip_type"] = "going_to_next_trip" # remove any vehicles that are not repositioning # needs to come at the end of the other options to keep indexing correct with choosers @@ -776,7 +790,7 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): "av_number", "trip_id", ] - new_veh_trips[na_cols] = pd.NA + new_veh_trips[na_cols] = np.nan veh_trips_this_period["is_deadhead"] = False # appending the new trips to the existing trips @@ -879,7 +893,12 @@ def av_repositioning( veh_trips_this_period: input dataframe with additional repositioning trips appended """ - choosers = veh_trips_this_period.copy() + # can have more than one veh trip in this period if the av serviced multiple trips + # so we need to drop duplicates to get only the last trip for each vehicle + choosers = veh_trips_this_period.sort_values("trip_number").drop_duplicates( + subset=["vehicle_id"], keep="last" + ) + choosers.index.name = "repo_chooser_id" choosers["nearest_av_parking_zone_id"] = get_nearest_parking_zone_id( state, model_settings, choosers @@ -929,8 +948,9 @@ def av_repositioning( state.get_rn_generator().drop_channel("av_repositioning") - veh_trips_this_period["av_repositioning_choice"] = model_spec.columns[ - choices.values + choosers["av_repositioning_choice"] = model_spec.columns[choices.values] + veh_trips_this_period["av_repositioning_choice"] = choosers[ + "av_repositioning_choice" ] veh_trips_this_period = reposition_avs_from_choice( From ec134ecb428e72b878e2fff68edc134d1bcfee7f Mon Sep 17 00:00:00 2001 From: David Hensle <51132108+dhensle@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:59:47 -0700 Subject: [PATCH 16/53] fixing av_repositioning spec bug --- src/asim/configs/resident/av_repositioning.csv | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 49eb0519d..e601acc7b 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -6,26 +6,26 @@ util_cost_of_parking,Cost of parking at destination,parkingCost,coef_cost,,,,, util_time_stay,Stay- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",coef_ivt,,,,, # go to parking utils,,,,,,,, util_time_go_to_parking,Remote- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",,coef_ivt,,,, -util_remote_cost,Remote park - Cost of parking until departure,"duration_hrs * RemoteParkingCostPerHour * 100",,coef_cost,,,, -util_remote_ivt,in vehicle time to remote parking location,@v_to_parking_skim['SOV_TR_H_TIME'],,,,coef_ivt,, -util_remote_rel,reliability vehicle location to remote parking location,"@v_to_parking_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_parking_skim['SOV_TR_H_DIST'])",,,,coef_ivt,, -util_remote_auto_cost,auto operating cost from vehicle location to remote parking location,"@(v_to_parking_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_parking_skim['SOV_TR_H_TOLLCOST']",,,,coef_cost,, +util_remote_cost,Remote park - Cost of parking until departure,duration_hrs * RemoteParkingCostPerHour * 100,,coef_cost,,,, +util_remote_ivt,in vehicle time to remote parking location,@v_to_parking_skim['SOV_TR_H_TIME'],,coef_ivt,,,, +util_remote_rel,reliability vehicle location to remote parking location,"@v_to_parking_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_parking_skim['SOV_TR_H_DIST'])",,coef_ivt,,,, +util_remote_auto_cost,auto operating cost from vehicle location to remote parking location,@(v_to_parking_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_parking_skim['SOV_TR_H_TOLLCOST'],,coef_cost,,,, # go home utils,,,,,,,, util_home_ivt,in vehicle time to go home,@v_to_home_skim['SOV_TR_H_TIME'],,,coef_ivt,,, util_home_rel,reliability vehicle location to home,"@v_to_home_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_home_skim['SOV_TR_H_DIST'])",,,coef_ivt,,, -util_home_auto_cost,auto operating cost from vehicle location to home,"@(v_to_home_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_home_skim['SOV_TR_H_TOLLCOST']",,,coef_cost,,, +util_home_auto_cost,auto operating cost from vehicle location to home,@(v_to_home_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_home_skim['SOV_TR_H_TOLLCOST'],,,coef_cost,,, # service next trip util 1,,,,,,,, util_next_trip_available,Unavailable if no next trip,next_trip_id_1 == -1,,,,coef_unavailable,, util_next1_ivt,in vehicle time to next trip 1 origin,v_to_trip_orig1_time,,,,coef_ivt,, util_next1_rel,reliability vehicle location to next trip 1 origin,"@df.v_to_trip_orig1_rel * 14 / np.maximum(0.1, df.v_to_trip_orig1_dist)",,,,coef_ivt,, -util_next1_auto_cost,auto operating cost from vehicle location to next trip 1 origin,"@(df.v_to_trip_orig1_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig1_toll",,,,coef_cost,, +util_next1_auto_cost,auto operating cost from vehicle location to next trip 1 origin,@(df.v_to_trip_orig1_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig1_toll,,,,coef_cost,, # service next trip util 2,,,,,,,, util_next_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,,coef_unavailable, util_next2_ivt,in vehicle time to next trip 2 origin,v_to_trip_orig2_time,,,,,coef_ivt, util_next2_rel,reliability vehicle location to next trip 2 origin,"@df.v_to_trip_orig2_rel * 14 / np.maximum(0.2, df.v_to_trip_orig2_dist)",,,,,coef_ivt, -util_next2_auto_cost,auto operating cost from vehicle location to next trip 2 origin,"@(df.v_to_trip_orig2_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig2_toll",,,,,coef_cost, +util_next2_auto_cost,auto operating cost from vehicle location to next trip 2 origin,@(df.v_to_trip_orig2_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig2_toll,,,,,coef_cost, # service next trip util 3,,,,,,,, util_next_trip_available_3,Unavailable if no next trip 3,next_trip_id_3 == -1,,,,,,coef_unavailable util_next3_ivt,in vehicle time to next trip 3 origin,v_to_trip_orig3_time,,,,,,coef_ivt util_next3_rel,reliability vehicle location to next trip 3 origin,"@df.v_to_trip_orig3_rel * 14 / np.maximum(0.3, df.v_to_trip_orig3_dist)",,,,,,coef_ivt -util_next3_auto_cost,auto operating cost from vehicle location to next trip 3 origin,"@(df.v_to_trip_orig3_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig3_toll",,,,,,coef_cost +util_next3_auto_cost,auto operating cost from vehicle location to next trip 3 origin,@(df.v_to_trip_orig3_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig3_toll,,,,,,coef_cost From 7215a4902c7f102500de4ed8898225a65f6ecda9 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 15 Oct 2025 08:16:38 -0700 Subject: [PATCH 17/53] fixing refuel bug --- .../taxi_tnc_routing/taxi_tnc_routing.py | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 6cd315e22..a70b67659 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -830,7 +830,9 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): return new_v_trips, full_trip_routes - def update_vehicle_fleet(self, vehicles, vehicle_trips_i, time_bin): + def update_vehicle_fleet( + self, vehicles, vehicle_trips_i, time_bin, refuel_veh_trips_i + ): # update the next_time_free based on the vehicle trips next_time_free_update = ( vehicle_trips_i.groupby("vehicle_id").arrival_bin.max() + 1 @@ -856,6 +858,23 @@ def update_vehicle_fleet(self, vehicles, vehicle_trips_i, time_bin): tot_drive_time = vehicle_trips_i.groupby("vehicle_id").OD_time.sum() vehicles.loc[tot_drive_time.index, "drive_time_since_refuel"] += tot_drive_time + # updating fleet with refueled vehicles + if refuel_veh_trips_i is not None: + vehicles.loc[ + refuel_veh_trips_i.index, "last_refuel_time" + ] = refuel_veh_trips_i.arrival_bin + vehicles.loc[refuel_veh_trips_i.index, "drive_time_since_refuel"] = 0 + vehicles.loc[refuel_veh_trips_i.index, "is_free"] = False + vehicles.loc[refuel_veh_trips_i.index, "next_time_free"] = ( + refuel_veh_trips_i.arrival_bin + 1 + ) + vehicles.loc[ + refuel_veh_trips_i.index, "location_skim_idx" + ] = refuel_veh_trips_i.destination_skim_idx + vehicles.loc[ + refuel_veh_trips_i.index, "location" + ] = refuel_veh_trips_i.destination + return vehicles def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): @@ -898,6 +917,10 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): logger.info( f"Average occupancy of all vehicle trips: {tnc_veh_trips.occupancy.mean():.2f}" ) + num_refuel_trips = tnc_veh_trips[tnc_veh_trips.trip_type == "refuel"].shape[0] + logger.info( + f"Total number of refuel trips: {num_refuel_trips} = {(num_refuel_trips / len(tnc_veh_trips) * 100):.2f}% of all vehicle trips" + ) # also performing consistency checks on the outputs assert ( @@ -1096,7 +1119,9 @@ def route_taxi_tncs(self): if refuel_veh_trips_i is not None: veh_trips.append(refuel_veh_trips_i) - vehicles = self.update_vehicle_fleet(vehicles, vehicle_trips_i, time_bin) + vehicles = self.update_vehicle_fleet( + vehicles, vehicle_trips_i, time_bin, refuel_veh_trips_i + ) tnc_veh_trips = pd.concat(veh_trips) pooled_trips = pd.concat(pooling_trips) From e7418aedf8f7a551b3a1792aa3b9d3afb12783ed Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 20 Oct 2025 21:36:30 -0700 Subject: [PATCH 18/53] fixing deadheading labeling and repositioning choosers --- src/asim/extensions/av_routing.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 1d46bbeed..7cecb2059 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -341,7 +341,9 @@ def execute_av_trip_matches( additional_reposition_trips["origin"] = av_vehicles.loc[ additional_reposition_trips.vehicle_id, "veh_location" ].values - additional_reposition_trips[["trip_number", "av_number", "trip_id"]] = pd.NA + additional_reposition_trips[ + ["trip_number", "av_number", "trip_id", "av_repositioning_choice"] + ] = pd.NA additional_reposition_trips["is_deadhead"] = True additional_reposition_trips["trip_type"] = "going_to_matched_trip" @@ -791,7 +793,6 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): "trip_id", ] new_veh_trips[na_cols] = np.nan - veh_trips_this_period["is_deadhead"] = False # appending the new trips to the existing trips veh_trips_this_period = pd.concat( @@ -895,9 +896,7 @@ def av_repositioning( # can have more than one veh trip in this period if the av serviced multiple trips # so we need to drop duplicates to get only the last trip for each vehicle - choosers = veh_trips_this_period.sort_values("trip_number").drop_duplicates( - subset=["vehicle_id"], keep="last" - ) + choosers = veh_trips_this_period.drop_duplicates(subset=["vehicle_id"], keep="last") choosers.index.name = "repo_chooser_id" choosers["nearest_av_parking_zone_id"] = get_nearest_parking_zone_id( @@ -1028,6 +1027,7 @@ def av_routing( trips_per_tour = trips_in_period.groupby("tour_id").cumcount() + 1 first_trips_in_period = trips_in_period[trips_per_tour == 1] + # labeling trips in household during this period first_trips_in_period["trip_number"] = ( first_trips_in_period.groupby("household_id").cumcount() + 1 ) From 14dff0567474cb18df1ba36d3d822f00da7773bb Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 23 Oct 2025 17:04:29 -0700 Subject: [PATCH 19/53] repositioning spec updates --- src/asim/configs/resident/av_repositioning.csv | 3 ++- .../configs/resident/av_repositioning_preprocessor.csv | 9 ++++----- src/asim/configs/resident/av_trip_matching.csv | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index e601acc7b..815f3827d 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -1,16 +1,17 @@ Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 util_dummy_1,Dummy variable 1,1,1,1,1,1,1,1 # stay with person utils,,,,,,,, -util_stay_with_person_avail,Whether auto can park at destination,parkingConstrained,coef_unavailable,,,,, util_cost_of_parking,Cost of parking at destination,parkingCost,coef_cost,,,,, util_time_stay,Stay- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",coef_ivt,,,,, # go to parking utils,,,,,,,, +util_remote_park_only_if_park_const,Can only use remote parking if in parking constrained zone,~parkingConstrained,,coef_unavailable,,,, util_time_go_to_parking,Remote- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",,coef_ivt,,,, util_remote_cost,Remote park - Cost of parking until departure,duration_hrs * RemoteParkingCostPerHour * 100,,coef_cost,,,, util_remote_ivt,in vehicle time to remote parking location,@v_to_parking_skim['SOV_TR_H_TIME'],,coef_ivt,,,, util_remote_rel,reliability vehicle location to remote parking location,"@v_to_parking_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_parking_skim['SOV_TR_H_DIST'])",,coef_ivt,,,, util_remote_auto_cost,auto operating cost from vehicle location to remote parking location,@(v_to_parking_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_parking_skim['SOV_TR_H_TOLLCOST'],,coef_cost,,,, # go home utils,,,,,,,, +util_already_at_home,Unavailable if already at home destination,destination == home_zone_id,,,coef_unavailable,,, util_home_ivt,in vehicle time to go home,@v_to_home_skim['SOV_TR_H_TIME'],,,coef_ivt,,, util_home_rel,reliability vehicle location to home,"@v_to_home_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_home_skim['SOV_TR_H_DIST'])",,,coef_ivt,,, util_home_auto_cost,auto operating cost from vehicle location to home,@(v_to_home_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_home_skim['SOV_TR_H_TOLLCOST'],,,coef_cost,,, diff --git a/src/asim/configs/resident/av_repositioning_preprocessor.csv b/src/asim/configs/resident/av_repositioning_preprocessor.csv index ae19beee4..41181fbb9 100644 --- a/src/asim/configs/resident/av_repositioning_preprocessor.csv +++ b/src/asim/configs/resident/av_repositioning_preprocessor.csv @@ -13,11 +13,9 @@ duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs ,is_indiv,(number_of_participants == 1) person has free on-site parking at workplace,freeOnsite,"(free_parking_available)*np.where(is_indiv,1,0)" new reimbursement amount,reimburseProportion,0 -tour primary destination,tour_dest,"reindex(tours.destination, tour_id)" -half tour duration,tourDuration,"reindex(tours.duration, tour_id)/2" -new daily parking cost with reimbursement,parkingCostDayDollars,"reindex(land_use.exp_daily, tour_dest)" -new hourly parking cost with reimbursement,parkingCostHourDollars,"reindex(land_use.exp_hourly, tour_dest)" -new monthly parking cost with reimbursement,parkingCostMonthDollars,"reindex(land_use.exp_monthly, tour_dest)" +new daily parking cost with reimbursement,parkingCostDayDollars,"reindex(land_use.exp_daily, df.destination)" +new hourly parking cost with reimbursement,parkingCostHourDollars,"reindex(land_use.exp_hourly, df.destination)" +new monthly parking cost with reimbursement,parkingCostMonthDollars,"reindex(land_use.exp_monthly, df.destination)" daily cost converted to cents,parkingCostDay,parkingCostDayDollars*100 hourly cost converted to cents,parkingCostHour,parkingCostHourDollars*100 monthly cost converted to cents,parkingCostMonth,parkingCostMonthDollars*100 @@ -29,6 +27,7 @@ Reimbursement applies to this tour purpose,reimbursePurpose,tour_type=='work' Effective parking cost for free parkers,_parkingCost,"0 * np.where(reimbursePurpose*freeOnsite,1,0)" Effective parking cost for reimbursed parkers,_parkingCost,"np.where(is_indiv*reimbursePurpose*(1-freeOnsite), np.maximum((1-reimburseProportion) * parkingCostBeforeReimb, 0),_parkingCost)" Effective parking cost,parkingCost,"np.where(is_joint+is_indiv*(1-reimbursePurpose), parkingCostBeforeReimb,_parkingCost)" +Parking cost is 0 if going home,parkingCost,"np.where(df.destination == df.home_zone_id, 0, parkingCost)" # These following two are from AutonomousVehicleAllocationChoice.xls,, Maximim benefit for keeping car close (min),AV_maxBenefit,60 Maximum duration for keeping car close (hrs),AV_maxDuration,1.5 diff --git a/src/asim/configs/resident/av_trip_matching.csv b/src/asim/configs/resident/av_trip_matching.csv index e8f888551..c775e3442 100644 --- a/src/asim/configs/resident/av_trip_matching.csv +++ b/src/asim/configs/resident/av_trip_matching.csv @@ -2,7 +2,7 @@ Label,Description,Expression,coefficient util_dummy_1,Dummy variable 1,1,coef_one util_veh_to_trip_origin_time,Time veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, veho_tripo_t_skims['SOV_TR_L_TIME'])",coef_ivt util_veh_to_trip_origin_cost,cost veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, (df.auto_operating_cost * veho_tripo_t_skims['SOV_TR_L_DIST']) + veho_tripo_t_skims['SOV_TR_L_TOLLCOST'])",coef_cost -# *14 multiplier to convert from ivt to reliability as used in previous iteration,,, +# *14 multiplier to convert from ivt to reliability as used in abm2+ uec,,, util_veh_to_trip_origin_reliability,reliability veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, veho_tripo_t_skims['SOV_NT_L_REL']) * 14",coef_ivt util_trip_duration,Trip duration,df.duration_benefit,coef_ivt util_no_vehicle,Alternative unavailable if no vehicle,df.vehicle_id.isna() & (df.trip_number > 0),coef_unavailable From 253dbf4ae7e0fd8ffc814dd7befb531557e9be11 Mon Sep 17 00:00:00 2001 From: David Hensle <51132108+dhensle@users.noreply.github.com> Date: Mon, 3 Nov 2025 22:55:46 -0800 Subject: [PATCH 20/53] summary plots, special market demand --- .../TNC_summaries_and_comparison.ipynb | 15750 ++++++++++++++++ .../taxi_tnc_routing/taxi_tnc_routing.py | 75 +- .../taxi_tnc_routing_settings.yaml | 34 +- 3 files changed, 15839 insertions(+), 20 deletions(-) create mode 100644 src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb diff --git a/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb b/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb new file mode 100644 index 000000000..bb671785f --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb @@ -0,0 +1,15750 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import plotly.graph_objects as go\n", + "import openmatrix as omx" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "new_df = pd.read_csv(\n", + " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\tnc_routing_test\\output_tnc_vehicle_trips.csv\"\n", + ")\n", + "old_df = pd.read_csv(\n", + " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\tnc_routing_data\\TNCTrips.csv\"\n", + ").rename(columns={\n", + " \"vehicle_ID\": \"vehicle_id\",\n", + " \"totalPassengers\": \"occupancy\",\n", + " \"originMgra\": \"origin\",\n", + " \"destinationMgra\": \"destination\"\n", + "})\n", + "\n", + "start_time = pd.Timestamp(\"2000-01-01 03:00:00\")\n", + "\n", + "landuse_file = r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\tnc_routing_data\\final_land_use.csv\"\n", + "omx_path = r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\input_data_full\\skims\\traffic_skims_MD.omx\"\n", + "skim_core = \"SOV_TR_H_DIST__MD\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Total number of vehicles in service" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 1 — Unique vehicles:\n", + " New: 7,528\n", + " Old: 17,615\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Old", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AgAIAAsAFwAdACIAJwAsADUANwA4AD8ARwBKAFYAWQBZAF0AZQBqAHIAggCIAJYAuADbAPAABgENARYBTQGFAbMB2AH9AR4CmALGAhADSQOBA5sD1wQvBl0HKQijCCYJJgoTCwQMxQxwDekNqw5aD7IP9w8+EIkQ4RAwEXYRyxEDElMSjRLKEiwTchPIExkUWxSgFPMURxWOFdEVchb/Fn0X5RdGGJkY2RgmGW8ZvhkOGkwavxpVG+wbTByuHBkdOR18HZ4d1x37HSoeSx5hHnQemB7OHgUfDR8dHzEfTh9rH38frB/YH/cfGSBAIFUgniDLIPMgGSFCIWohySEGIlEidiK1IvkiYCOrIwckfCTZJCglyiU1JrUmMieaJ+UnoyiLKR4qrioKK5ArASxiLMgsPS2RLfEtnC55LyMwvjBCMcoxEDJQMm8ymDLXMkQzwjMfNIo0DTWdNec1KjaXNvA2IzdiN5835jctOGk4xjgiOWU5ozkGOnM6yDoWO3870jszPKQ88zxWPas90D3yPRE+Mj5mPqo++T4pP4c/sT/YPxVAX0CDQJpAyEABQStBi0HQQfdBVUKeQu5C80L0Qv9CFkMuQ0JDUUNiQ3JDf0OLQ5pDpEOtQ7ZDukPDQ9xD+EMTRDFESURlRH9Ei0SORJJElUSmRLREtkS2RLdEt0S3RLdEt0S3RLlEuUS5RLxEvUS9RL5EvkS+RMBEwUTFRMVExUTFRMVExUTFRMdEx0TJRMpEy0TNRM1EzUTPRA==", + "dtype": "i2" + } + }, + { + "mode": "lines", + "name": "New", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000" + ], + "y": { + "bdata": "LABPAGgAdQCMAKsAvgDYAOYACgEfATQBeQGzAf8BcAK5AukCnQMSBE0E8wZjCJgIigpfC+wLkg2jDdENBQ4iDkoOTw5rDm8Oew7GDiQPuA87EFsQaxCXEOwQSRGtEbQRthG8Eb8RvxHBEcERwRHBEcERwhHDEcMRwxHDEcMR7REtEnMSvBLGEggTOhN+E5QTIhR4FOIUHhUwFU4V7hUvFmQWaxZuFm8WcRZ1Fn4WiBaPFs8WDRcPF1oXXReRF8MXIRhhGLoYuhi7GMcY9BhZGaQZ8BlbGrQaHhuMGxEcExwUHBQcTBy0HP4c/hwAHVkdXx1fHV8dYB1gHWMdYx1jHWMdYx1jHWMdYx1kHWQdZB1mHWcdZx1nHWgd", + "dtype": "i2" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Item 1 — Cumulative Vehicles in Service" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "title": { + "text": "Cumulative Unique Vehicles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# NEW\n", + "new_first = (\n", + " new_df.assign(depart_bin=lambda d: d[\"depart_bin\"].astype(int))\n", + " .groupby(\"vehicle_id\")[\"depart_bin\"].min()\n", + ")\n", + "new_intro = new_first.value_counts().sort_index()\n", + "new_intro = new_intro.reindex(pd.RangeIndex(0, new_intro.index.max() + 1), fill_value=0).cumsum()\n", + "new_intro_time = new_intro.copy()\n", + "new_intro_time.index = start_time + pd.to_timedelta(new_intro_time.index * 10, unit=\"m\")\n", + "\n", + "# OLD\n", + "old_first = (\n", + " old_df.assign(startPeriod=lambda d: d[\"startPeriod\"].astype(int))\n", + " .groupby(\"vehicle_id\")[\"startPeriod\"].min()\n", + ")\n", + "old_intro = old_first.value_counts().sort_index()\n", + "old_intro = old_intro.reindex(pd.RangeIndex(0, old_intro.index.max() + 1), fill_value=0).cumsum()\n", + "old_intro_time = old_intro.copy()\n", + "old_intro_time.index = start_time + pd.to_timedelta(old_intro_time.index * 5, unit=\"m\")\n", + "\n", + "print(\"Item 1 — Unique vehicles:\")\n", + "print(f\" New: {new_first.shape[0]:,}\")\n", + "print(f\" Old: {old_first.shape[0]:,}\")\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Scatter(x=old_intro_time.index, y=old_intro_time.values, mode=\"lines\",\n", + " name=\"Old\"))\n", + "fig.add_trace(go.Scatter(x=new_intro_time.index, y=new_intro_time.values, mode=\"lines\",\n", + " name=\"New\"))\n", + "fig.update_layout(\n", + " title=\"Item 1 — Cumulative Vehicles in Service\",\n", + " xaxis_title=\"Time of Day\",\n", + " yaxis_title=\"Cumulative Unique Vehicles\",\n", + " hovermode=\"x unified\",\n", + " xaxis=dict(tickformat=\"%H:%M\")\n", + ")\n", + "fig.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Total number of (real) trips serviced" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Old REAL trips/hour (normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "New REAL trips/hour (normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Item 2 — REAL Trips (per hour)" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 2 — REAL trips\n", + " Old REAL trips: 229,785\n", + " New REAL trips: 186,115\n" + ] + } + ], + "source": [ + "\n", + "# REAL-trip\n", + "real_new = (new_df[\"trip_i\"].notna() | new_df[\"trip_j\"].notna()) & (new_df[\"is_deadhead\"] == False)\n", + "occ_old_num = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", + "real_old = (occ_old_num > 0) & old_df[\"pickupIdsAtOrigin\"].notna() & old_df[\"dropoffIdsAtOrigin\"].isna()\n", + "\n", + "# Bin counts\n", + "old_bins = old_df.loc[real_old, \"startPeriod\"].dropna().astype(int)\n", + "new_bins = new_df.loc[real_new, \"depart_bin\"].dropna().astype(int)\n", + "\n", + "old_counts = old_bins.value_counts().sort_index().reindex(pd.RangeIndex(0, old_bins.max() + 1), fill_value=0)\n", + "new_counts = new_bins.value_counts().sort_index().reindex(pd.RangeIndex(0, new_bins.max() + 1), fill_value=0)\n", + "\n", + "# Normalize to trips/hour \n", + "old_rate = old_counts * (60 / 5) # 5-min bins : per hour\n", + "new_rate = new_counts * (60 / 10) # 10-min bins : per hour\n", + "\n", + "# Map to time \n", + "old_rate_time = start_time + pd.to_timedelta(old_rate.index * 5, unit=\"m\")\n", + "new_rate_time = start_time + pd.to_timedelta(new_rate.index * 10, unit=\"m\")\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate.values, mode=\"lines\",\n", + " name=\"Old REAL trips/hour (normalized)\"))\n", + "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate.values, mode=\"lines\",\n", + " name=\"New REAL trips/hour (normalized)\"))\n", + "fig.update_layout(\n", + " title=\"Item 2 — REAL Trips (per hour)\",\n", + " xaxis_title=\"Time of Day\",\n", + " yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\",\n", + " xaxis=dict(tickformat=\"%H:%M\")\n", + ")\n", + "fig.show()\n", + "\n", + "\n", + "# Systemwide totals\n", + "print(\"Item 2 — REAL trips\")\n", + "print(f\" Old REAL trips: {int(real_old.sum()):,}\")\n", + "print(f\" New REAL trips: {int(real_new.sum()):,}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Old output (startPeriod, 5-min bins)\n", + "# Max possible startPeriod = 287\n", + "# This is ok\n", + "\n", + "# New output (depart_bin, 10-min bins)\n", + "# Max possible depart_bin = 143\n", + "# there are records bigger than 143. records with > 144 are all deadhead trips but there are a few = 144 that are not." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Total number of trips made by the TNC vehicles " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Old (all trips/hour, normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAOEAAAAAAAABSQAAAAAAAAE5AAAAAAAAAZUAAAAAAAABeQAAAAAAAgGBAAAAAAACAbEAAAAAAAIBvQAAAAAAAgG9AAAAAAAAAXkAAAAAAAIBgQAAAAAAAwHJAAAAAAAAAdUAAAAAAAIBpQAAAAAAAAIJAAAAAAACAaUAAAAAAAABoQAAAAAAAAIJAAAAAAAAAe0AAAAAAAEB3QAAAAAAAgIBAAAAAAAAAgkAAAAAAAIB8QAAAAAAAgHxAAAAAAADAjkAAAAAAAFCQQAAAAAAAUJBAAAAAAADgkEAAAAAAABCUQAAAAAAAIIxAAAAAAAC4oUAAAAAAAGCeQAAAAAAA4J9AAAAAAADIoEAAAAAAANChQAAAAAAA6KFAAAAAAACIsUAAAAAAABSwQAAAAAAAXLBAAAAAAABUskAAAAAAAKyxQAAAAAAAALJAAAAAAAASxUAAAAAAAI7EQAAAAAAA3sVAAAAAAAAMyEAAAAAAAPTHQAAAAAAAcMdAAAAAAADa0EAAAAAAAJHRQAAAAAAAXdJAAAAAAAB000AAAAAAAOfSQAAAAAAANNRAAAAAAAB01kAAAAAAAKzXQAAAAAAAUdhAAAAAAADb2EAAAAAAAKXYQAAAAAAAXNlAAAAAAAA82EAAAAAAAHvYQAAAAAAAZNdAAAAAAADN10AAAAAAAEbXQAAAAAAAPddAAAAAAAC51kAAAAAAADLWQAAAAAAA1NZAAAAAAAC410AAAAAAABTWQAAAAAAAuNdAAAAAAABQ1kAAAAAAAPbVQAAAAAAAitVAAAAAAAB+1UAAAAAAACDWQAAAAAAAa9ZAAAAAAABs20AAAAAAAEvbQAAAAAAAydtAAAAAAAAy3EAAAAAAACzcQAAAAAAAvNxAAAAAAADf2kAAAAAAANbaQAAAAAAA/dpAAAAAAABO20AAAAAAANDaQAAAAAAAb9tAAAAAAAAu3UAAAAAAAJDeQAAAAAAAoN1AAAAAAAAP3kAAAAAAAIfeQAAAAAAAAt9AAAAAAAA82EAAAAAAAI/ZQAAAAAAAptdAAAAAAAA910AAAAAAAKbXQAAAAAAAqddAAAAAAAA/0kAAAAAAABnRQAAAAAAA69FAAAAAAACs0UAAAAAAALjRQAAAAAAAadJAAAAAAAB0yUAAAAAAAAzIQAAAAAAAFMlAAAAAAAAcykAAAAAAAHLIQAAAAAAAJslAAAAAAADwy0AAAAAAALTLQAAAAAAACspAAAAAAAAUzEAAAAAAAHzKQAAAAAAAzMhAAAAAAACMzEAAAAAAANTJQAAAAAAAgMlAAAAAAAC8zEAAAAAAAKLLQAAAAAAANstAAAAAAAAGzkAAAAAAAPTNQAAAAAAAgM9AAAAAAACOzUAAAAAAABjOQAAAAAAAFM9AAAAAAADZ0UAAAAAAAIjRQAAAAAAAp9BAAAAAAABe0UAAAAAAACXRQAAAAAAA+NBAAAAAAADj1kAAAAAAADbVQAAAAAAAEdZAAAAAAABl1kAAAAAAANrWQAAAAAAALtdAAAAAAAAd3EAAAAAAAHDdQAAAAAAACNxAAAAAAAAC3EAAAAAAAGjcQAAAAAAAlN1AAAAAAACT20AAAAAAAHTcQAAAAAAAuttAAAAAAAB52kAAAAAAANLbQAAAAAAARdtAAAAAAACt30AAAAAAABrgQAAAAAAA2t9AAAAAAABf4EAAAAAAgEXgQAAAAACAveBAAAAAAABb2kAAAAAAAHnaQAAAAAAAy9lAAAAAAABo2UAAAAAAAD3aQAAAAAAAZNpAAAAAAACh3EAAAAAAALrbQAAAAAAAx91AAAAAAACv3UAAAAAAACHeQAAAAAAAVtxAAAAAAADp3EAAAAAAAGneQAAAAAAAjd5AAAAAAAAW3UAAAAAAAI3eQAAAAAAAOt1AAAAAAAC+2kAAAAAAABnaQAAAAAAAiNpAAAAAAACN20AAAAAAAPDbQAAAAAAAGtxAAAAAAACl20AAAAAAAJnbQAAAAAAAqNtAAAAAAADG20AAAAAAAEfcQAAAAAAAS9tAAAAAAABu3EAAAAAAADjcQAAAAAAAINxAAAAAAABr3EAAAAAAAIfeQAAAAAAAM9tAAAAAAABd2EAAAAAAAMLWQAAAAAAAn9VAAAAAAABc1kAAAAAAALjXQAAAAAAAiNdAAAAAAAAK10AAAAAAABjVQAAAAAAAdtdAAAAAAACh1kAAAAAAAHLVQAAAAAAAj9ZAAAAAAAAl1EAAAAAAAAXTQAAAAAAAM9JAAAAAAABC0kAAAAAAAPHRQAAAAAAAetNAAAAAAAAQ1EAAAAAAABPUQAAAAAAAjtFAAAAAAABU1UAAAAAAADnVQAAAAAAATNRAAAAAAADGyEAAAAAAAGjGQAAAAAAAIMlAAAAAAADSy0AAAAAAAIbJQAAAAAAA7MlAAAAAAAA8yEAAAAAAAFDGQAAAAAAAGsZAAAAAAACKxUAAAAAAAADFQAAAAAAAWsJAAAAAAAC0vkAAAAAAAGS6QAAAAAAAxL1AAAAAAAAwvkAAAAAAAHi7QAAAAAAAuLpAAAAAAADgwEAAAAAAAETAQAAAAAAA2sBAAAAAAADWwUAAAAAAAHDBQAAAAAAAnMJAAAAAAAD8uEAAAAAAAKi4QAAAAAAAVLhAAAAAAAC8s0AAAAAAAFS7QAAAAAAAOLlAAAAAAABQoEAAAAAAAHChQAAAAAAAYJ5AAAAAAAAwnkAAAAAAAIihQAAAAAAAAJtAAAAAAABglUAAAAAAAMCSQAAAAAAAUJNAAAAAAADQkUAAAAAAAFCQQAAAAAAAIJBAAAAAAACgjUAAAAAAAMCOQAAAAAAAYIhAAAAAAACgikAAAAAAACCTQAAAAAAA4IxAAAAAAAAghkAAAAAAAMCOQAAAAAAAwIVAAAAAAABgi0AAAAAAAMCFQAAAAAAAQIpAAAAAAACAfEAAAAAAAICAQAAAAAAAAH5AAAAAAADAgkAAAAAAAMB+QAAAAAAAoIdAAAAAAADAeEAAAAAAAICDQAAAAAAAQHdAAAAAAAAAckAAAAAAAIBvQAAAAAAAAEhA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "New (all trips/hour, normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T03:00:00.000000000", + "2000-01-02T03:10:00.000000000", + "2000-01-02T03:20:00.000000000", + "2000-01-02T03:30:00.000000000", + "2000-01-02T03:40:00.000000000" + ], + "y": { + "bdata": "AAAAAACAgEAAAAAAACCDQAAAAAAA4H9AAAAAAABAfUAAAAAAAFCDQAAAAAAAMIhAAAAAAABwh0AAAAAAANCKQAAAAAAA8IVAAAAAAACwkEAAAAAAAICPQAAAAAAA4I9AAAAAAABAoUAAAAAAAAShQAAAAAAAuKRAAAAAAACMrEAAAAAAAPCrQAAAAAAApKxAAAAAAADyuUAAAAAAAEC6QAAAAAAA7LlAAAAAAADVzkAAAAAAAL/PQAAAAAAA4c5AAAAAAID61UAAAAAAgITWQAAAAAAAkddAAAAAAIAW20AAAAAAgCDaQAAAAACAo9tAAAAAAABN2UAAAAAAgFLYQAAAAAAAaNlAAAAAAAA41kAAAAAAACLXQAAAAAAAntZAAAAAAIBs1kAAAAAAgPfVQAAAAACAqNZAAAAAAIA42kAAAAAAAO/ZQAAAAACARdlAAAAAAAB42EAAAAAAgN/YQAAAAACAFdlAAAAAAID020AAAAAAgNDbQAAAAAAA/tlAAAAAAIAn1kAAAAAAAALWQAAAAAAAMNhAAAAAAIBt0kAAAAAAABrTQAAAAACAh9NAAAAAAAABzUAAAAAAAC7NQAAAAAAA285AAAAAAAC6zkAAAAAAAAXPQAAAAAAAE81AAAAAAABW0EAAAAAAgKLQQAAAAAAAy9BAAAAAAACv0UAAAAAAADbSQAAAAAAA6tJAAAAAAIDs1EAAAAAAgH3UQAAAAACAM9ZAAAAAAID22UAAAAAAAP3aQAAAAAAAtdpAAAAAAABi4EAAAAAAgEXgQAAAAABA+uBAAAAAAIAG4EAAAAAAAJjfQAAAAAAAq95AAAAAAIDy4UAAAAAAAPfhQAAAAAAAS+JAAAAAAAB93EAAAAAAAEfcQAAAAAAAYtxAAAAAAID73UAAAAAAAIzfQAAAAACAi95AAAAAAIAk30AAAAAAAB3fQAAAAAAAU99AAAAAAIAv3UAAAAAAgAjdQAAAAACAv91AAAAAAIC63EAAAAAAAD3dQAAAAAAAJd1AAAAAAAAZ3UAAAAAAANndQAAAAACA6txAAAAAAAB+2EAAAAAAANjYQAAAAAAAlNdAAAAAAIA710AAAAAAAAnYQAAAAACAjNdAAAAAAICP1EAAAAAAgJXUQAAAAACAYtRAAAAAAIDL1EAAAAAAAKPUQAAAAACADdVAAAAAAACFykAAAAAAACvKQAAAAAAAD8tAAAAAAAAwyEAAAAAAAPfHQAAAAAAAxMdAAAAAAACMwEAAAAAAAJ7AQAAAAAAATcBAAAAAAADCwEAAAAAAABrAQAAAAAAAJcFAAAAAAACSuUAAAAAAAI63QAAAAAAAvLlAAAAAAABEo0AAAAAAAAijQAAAAAAA5KJAAAAAAAAIlkAAAAAAAEibQAAAAAAAyJlAAAAAAABAlEAAAAAAAPiTQAAAAAAAOJNAAAAAAACwkEAAAAAAAAiTQAAAAAAA6JFAAAAAAAAgj0AAAAAAAICMQAAAAAAAgIxAAAAAAACQi0AAAAAAAMCOQAAAAAAAcIdAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Item 3 — All TNC Trips (normalized to trips/hour)" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 3 — Systemwide (All TNC trips)\n", + " Old total trips: 381,347\n", + " New total trips: 413,065\n" + ] + } + ], + "source": [ + "old_bins_all = old_df[\"startPeriod\"].dropna().astype(int)\n", + "new_bins_all = new_df[\"depart_bin\"].dropna().astype(int)\n", + "\n", + "old_counts_all = old_bins_all.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, old_bins_all.max() + 1), fill_value=0\n", + ")\n", + "new_counts_all = new_bins_all.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, new_bins_all.max() + 1), fill_value=0\n", + ")\n", + "\n", + "# normalize to trips/hour\n", + "old_rate_all = old_counts_all * (60 / 5) # 5-min bins : per hour\n", + "new_rate_all = new_counts_all * (60 / 10) # 10-min bins : per hour\n", + "\n", + "old_rate_time = start_time + pd.to_timedelta(old_rate_all.index * 5, unit=\"m\")\n", + "new_rate_time = start_time + pd.to_timedelta(new_rate_all.index * 10, unit=\"m\")\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_all.values, mode=\"lines\",\n", + " name=\"Old (all trips/hour, normalized)\"))\n", + "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_all.values, mode=\"lines\",\n", + " name=\"New (all trips/hour, normalized)\"))\n", + "fig.update_layout(\n", + " title=\"Item 3 — All TNC Trips (normalized to trips/hour)\",\n", + " xaxis_title=\"Time of Day\",\n", + " yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\",\n", + " xaxis=dict(tickformat=\"%H:%M\")\n", + ")\n", + "fig.show()\n", + "\n", + "\n", + "# Systemwide totals (all trips)\n", + "print(\"Item 3 — Systemwide (All TNC trips)\")\n", + "print(f\" Old total trips: {int(old_counts_all.sum()):,}\")\n", + "print(f\" New total trips: {int(new_counts_all.sum()):,}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Non-deadhead trips made by the TNC vehicles " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Old (all trips/hour, normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "New (all trips/hour, normalized)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Non-Deadhead TNC Trips (normalized to trips/hour)" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Systemwide Non-deadhead TNC Vehicle Trips\n", + " Old total trips: 229,967\n", + " New total trips: 186,115\n" + ] + } + ], + "source": [ + "old_bins_all = old_df[old_df.occupancy > 0][\"startPeriod\"].dropna().astype(int)\n", + "new_bins_all = new_df[new_df.is_deadhead == False][\"depart_bin\"].dropna().astype(int)\n", + "\n", + "old_counts_all = old_bins_all.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, old_bins_all.max() + 1), fill_value=0\n", + ")\n", + "new_counts_all = new_bins_all.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, new_bins_all.max() + 1), fill_value=0\n", + ")\n", + "\n", + "# normalize to trips/hour\n", + "old_rate_all = old_counts_all * (60 / 5) # 5-min bins : per hour\n", + "new_rate_all = new_counts_all * (60 / 10) # 10-min bins : per hour\n", + "\n", + "old_rate_time = start_time + pd.to_timedelta(old_rate_all.index * 5, unit=\"m\")\n", + "new_rate_time = start_time + pd.to_timedelta(new_rate_all.index * 10, unit=\"m\")\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_all.values, mode=\"lines\",\n", + " name=\"Old (all trips/hour, normalized)\"))\n", + "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_all.values, mode=\"lines\",\n", + " name=\"New (all trips/hour, normalized)\"))\n", + "fig.update_layout(\n", + " title=\"Non-Deadhead TNC Trips (normalized to trips/hour)\",\n", + " xaxis_title=\"Time of Day\",\n", + " yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\",\n", + " xaxis=dict(tickformat=\"%H:%M\")\n", + ")\n", + "fig.show()\n", + "\n", + "\n", + "# Systemwide totals (all trips)\n", + "print(\"Systemwide Non-deadhead TNC Vehicle Trips\")\n", + "print(f\" Old total trips: {int(old_counts_all.sum()):,}\")\n", + "print(f\" New total trips: {int(new_counts_all.sum()):,}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Average occupancy by number of trips and average occupancy by VMT" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 4 — Average occupancy (trip-level)\n", + "OLD By trips: 1.07 | By VMT: 1.32 \n", + "NEW By trips: 0.45 | By VMT: 0.86 \n" + ] + } + ], + "source": [ + "new_trips = new_df[[\"occupancy\", \"origin\", \"destination\"]].copy()\n", + "old_trips = old_df[[\"occupancy\", \"origin\", \"destination\"]].copy()\n", + "\n", + "lu = pd.read_csv(landuse_file, usecols=[\"mgra\", \"TAZ\"])\n", + "\n", + "new_trips = new_trips.merge(lu.rename(columns={\"mgra\":\"origin\"}), on=\"origin\", how=\"left\").rename(columns={\"TAZ\":\"oTAZ\"})\n", + "new_trips = new_trips.merge(lu.rename(columns={\"mgra\":\"destination\"}), on=\"destination\", how=\"left\").rename(columns={\"TAZ\":\"dTAZ\"})\n", + "old_trips = old_trips.merge(lu.rename(columns={\"mgra\":\"origin\"}), on=\"origin\", how=\"left\").rename(columns={\"TAZ\":\"oTAZ\"})\n", + "old_trips = old_trips.merge(lu.rename(columns={\"mgra\":\"destination\"}), on=\"destination\", how=\"left\").rename(columns={\"TAZ\":\"dTAZ\"})\n", + "\n", + "with omx.open_file(omx_path) as f:\n", + " skim = np.array(f[skim_core])\n", + " taz_map = f.mapping(f.list_mappings()[0]) # dict-like TAZ -> idx\n", + "\n", + "taz_to_idx = pd.Series(taz_map)\n", + "\n", + "# Map TAZ labels to skim indices\n", + "new_trips[\"otaz_idx\"] = taz_to_idx.reindex(new_trips[\"oTAZ\"].values).values\n", + "new_trips[\"dtaz_idx\"] = taz_to_idx.reindex(new_trips[\"dTAZ\"].values).values\n", + "old_trips[\"otaz_idx\"] = taz_to_idx.reindex(old_trips[\"oTAZ\"].values).values\n", + "old_trips[\"dtaz_idx\"] = taz_to_idx.reindex(old_trips[\"dTAZ\"].values).values\n", + "\n", + "# Compute distances o\n", + "new_pairs = new_trips[[\"otaz_idx\",\"dtaz_idx\"]].dropna().astype(\"int32\").drop_duplicates()\n", + "old_pairs = old_trips[[\"otaz_idx\",\"dtaz_idx\"]].dropna().astype(\"int32\").drop_duplicates()\n", + "pairs = pd.concat([new_pairs, old_pairs], ignore_index=True).drop_duplicates()\n", + "\n", + "pairs[\"trip_dist\"] = skim[pairs[\"otaz_idx\"].to_numpy(), pairs[\"dtaz_idx\"].to_numpy()]\n", + "\n", + "new_trips = new_trips.merge(pairs, on=[\"otaz_idx\",\"dtaz_idx\"], how=\"left\")\n", + "old_trips = old_trips.merge(pairs, on=[\"otaz_idx\",\"dtaz_idx\"], how=\"left\")\n", + "\n", + "# Clean occupancy; compute distance-weighted term\n", + "for df in (new_trips, old_trips):\n", + " df[\"occupancy\"] = pd.to_numeric(df[\"occupancy\"], errors=\"coerce\")\n", + " df[\"occ_x_dist\"] = df[\"occupancy\"] * df[\"trip_dist\"]\n", + "\n", + "# Systemwide averages\n", + "avg_occ_old_by_trips = old_trips[\"occupancy\"].mean()\n", + "avg_occ_new_by_trips = new_trips[\"occupancy\"].mean()\n", + "\n", + "avg_occ_old_by_vmt = old_trips[\"occ_x_dist\"].sum() / old_trips[\"trip_dist\"].sum()\n", + "avg_occ_new_by_vmt = new_trips[\"occ_x_dist\"].sum() / new_trips[\"trip_dist\"].sum()\n", + "\n", + "\n", + "\n", + "print(\"Item 4 — Average occupancy (trip-level)\")\n", + "print(f\"OLD By trips: {avg_occ_old_by_trips:,.2f} | By VMT: {avg_occ_old_by_vmt:,.2f} \")\n", + "print(f\"NEW By trips: {avg_occ_new_by_trips:,.2f} | By VMT: {avg_occ_new_by_vmt:,.2f} \")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Number and share of deadheading by number of trips and VMT" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 5 — Deadheading rate\n", + "OLD\n", + " By trips: 151,376 / 381,347: 39.7%\n", + " By VMT: 593,419 / 1,729,081: 34.3%\n", + "NEW\n", + " By trips: 226,950 / 413,065: 54.9%\n", + " By VMT: 248,362 / 1,716,421: 14.5%\n" + ] + } + ], + "source": [ + "new_trips = new_trips.copy()\n", + "old_trips = old_trips.copy()\n", + "\n", + "# NEW: use is_deadhead from source\n", + "new_trips[\"is_deadhead\"] = new_df[\"is_deadhead\"].values\n", + "\n", + "# OLD: deadhead => passengers==0 AND dropoffIdsAtOrigin non-null AND pickupIdsAtOrigin null\n", + "occ_old_num = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", + "old_deadhead_mask = (occ_old_num == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", + "old_trips[\"is_deadhead\"] = old_deadhead_mask.values\n", + "\n", + "# By TRIPS (simple counts)\n", + "old_total_trips = len(old_trips)\n", + "new_total_trips = len(new_trips)\n", + "old_dead_trips = int(old_trips[\"is_deadhead\"].sum())\n", + "new_dead_trips = int(new_trips[\"is_deadhead\"].sum())\n", + "old_share_trips = old_dead_trips / old_total_trips if old_total_trips else np.nan\n", + "new_share_trips = new_dead_trips / new_total_trips if new_total_trips else np.nan\n", + "\n", + "# By VMT (distance-weighted)\n", + "old_dead_vmt = old_trips.loc[old_trips[\"is_deadhead\"], \"trip_dist\"].sum()\n", + "new_dead_vmt = new_trips.loc[new_trips[\"is_deadhead\"], \"trip_dist\"].sum()\n", + "old_total_vmt = old_trips[\"trip_dist\"].sum()\n", + "new_total_vmt = new_trips[\"trip_dist\"].sum()\n", + "old_share_vmt = old_dead_vmt / old_total_vmt if old_total_vmt else np.nan\n", + "new_share_vmt = new_dead_vmt / new_total_vmt if new_total_vmt else np.nan\n", + "\n", + "# --- Report\n", + "print(\"Item 5 — Deadheading rate\")\n", + "print(\"OLD\")\n", + "print(f\" By trips: {old_dead_trips:,} / {old_total_trips:,}: {old_share_trips:,.1%}\")\n", + "print(f\" By VMT: {old_dead_vmt:,.0f} / {old_total_vmt:,.0f}: {old_share_vmt:,.1%}\")\n", + "print(\"NEW\")\n", + "print(f\" By trips: {new_dead_trips:,} / {new_total_trips:,}: {new_share_trips:,.1%}\")\n", + "print(f\" By VMT: {new_dead_vmt:,.0f} / {new_total_vmt:,.0f}: {new_share_vmt:,.1%}\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Number and share of refueling trips by number of trips and VMT" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Old refuel trips/hour", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "New refuel trips/hour", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T03:00:00.000000000", + "2000-01-02T03:10:00.000000000", + "2000-01-02T03:20:00.000000000", + "2000-01-02T03:30:00.000000000", + "2000-01-02T03:40:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Item 6 — Refueling Trips (per hour)" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item 6 — Refueling trips\n", + "OLD\n", + " By trips: 2 / 381,347 → 0.00%\n", + " By VMT: 90 / 1,729,081 → 0.01%\n", + "NEW\n", + " By trips: 40,863 / 413,065 → 9.89%\n", + " By VMT: 48,012 / 1,716,421 → 2.80%\n" + ] + } + ], + "source": [ + "refuel_new = new_df[\"trip_type\"].astype(str).str.lower() == \"refuel\"\n", + "refuel_old = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\") == 4\n", + "\n", + "old_bins_ref = old_df.loc[refuel_old, \"startPeriod\"].dropna().astype(int)\n", + "new_bins_ref = new_df.loc[refuel_new, \"depart_bin\"].dropna().astype(int)\n", + "\n", + "old_counts_ref = old_bins_ref.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, (old_bins_ref.max() if len(old_bins_ref) else -1) + 1), fill_value=0\n", + ")\n", + "new_counts_ref = new_bins_ref.value_counts().sort_index().reindex(\n", + " pd.RangeIndex(0, (new_bins_ref.max() if len(new_bins_ref) else -1) + 1), fill_value=0\n", + ")\n", + "\n", + "old_rate_ref = old_counts_ref * (60 / 5)\n", + "new_rate_ref = new_counts_ref * (60 / 10)\n", + "\n", + "old_rate_time = start_time + pd.to_timedelta(old_rate_ref.index * 5, unit=\"m\")\n", + "new_rate_time = start_time + pd.to_timedelta(new_rate_ref.index * 10, unit=\"m\")\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_ref.values, mode=\"lines\",\n", + " name=\"Old refuel trips/hour\"))\n", + "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_ref.values, mode=\"lines\",\n", + " name=\"New refuel trips/hour\"))\n", + "fig.update_layout(\n", + " title=\"Item 6 — Refueling Trips (per hour)\",\n", + " xaxis_title=\"Time of Day\",\n", + " yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\",\n", + " xaxis=dict(tickformat=\"%H:%M\")\n", + ")\n", + "fig.show()\n", + "\n", + "new_trips = new_trips.copy()\n", + "old_trips = old_trips.copy()\n", + "new_trips[\"is_refuel\"] = refuel_new.values\n", + "old_trips[\"is_refuel\"] = refuel_old.values\n", + "\n", + "n_ref_new = int(new_trips[\"is_refuel\"].sum())\n", + "n_ref_old = int(old_trips[\"is_refuel\"].sum())\n", + "tot_new = len(new_trips)\n", + "tot_old = len(old_trips)\n", + "share_ref_trips_new = n_ref_new / tot_new\n", + "share_ref_trips_old = n_ref_old / tot_old\n", + "\n", + "ref_vmt_new = new_trips.loc[new_trips[\"is_refuel\"], \"trip_dist\"].sum()\n", + "ref_vmt_old = old_trips.loc[old_trips[\"is_refuel\"], \"trip_dist\"].sum()\n", + "tot_vmt_new = new_trips[\"trip_dist\"].sum()\n", + "tot_vmt_old = old_trips[\"trip_dist\"].sum()\n", + "share_ref_vmt_new = ref_vmt_new / tot_vmt_new\n", + "share_ref_vmt_old = ref_vmt_old / tot_vmt_old\n", + "\n", + "print(\"Item 6 — Refueling trips\")\n", + "print(\"OLD\")\n", + "print(f\" By trips: {n_ref_old:,} / {tot_old:,} → {share_ref_trips_old:,.2%}\")\n", + "print(f\" By VMT: {ref_vmt_old:,.0f} / {tot_vmt_old:,.0f} → {share_ref_vmt_old:,.2%}\")\n", + "print(\"NEW\")\n", + "print(f\" By trips: {n_ref_new:,} / {tot_new:,} → {share_ref_trips_new:,.2%}\")\n", + "print(f\" By VMT: {ref_vmt_new:,.0f} / {tot_vmt_new:,.0f} → {share_ref_vmt_new:,.2%}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Pickup/hr (reposition)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refuel/hr", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Dropoff/hr (serviced)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAOEAAAAAAAABSQAAAAAAAAEhAAAAAAACAY0AAAAAAAABYQAAAAAAAAFhAAAAAAAAAYkAAAAAAAIBjQAAAAAAAgGZAAAAAAAAAUkAAAAAAAABSQAAAAAAAAGhAAAAAAAAAa0AAAAAAAABeQAAAAAAAgHZAAAAAAAAAXkAAAAAAAABYQAAAAAAAgHNAAAAAAACAcEAAAAAAAABrQAAAAAAAgHNAAAAAAAAAeEAAAAAAAIBwQAAAAAAAgHNAAAAAAADAhUAAAAAAAOCGQAAAAAAAQIRAAAAAAAAAhUAAAAAAAGCFQAAAAAAAgH9AAAAAAADglkAAAAAAAHCUQAAAAAAAQJRAAAAAAABAlEAAAAAAADCVQAAAAAAAAJVAAAAAAAAQp0AAAAAAABiiQAAAAAAAmKNAAAAAAACgpEAAAAAAABCkQAAAAAAACKNAAAAAAADMu0AAAAAAADi8QAAAAAAAmLxAAAAAAAB0vEAAAAAAAHC6QAAAAAAAELpAAAAAAABWw0AAAAAAANTDQAAAAAAAfMRAAAAAAAAwxUAAAAAAAFjEQAAAAAAA6MRAAAAAAAC4x0AAAAAAAITIQAAAAAAAKshAAAAAAACEyEAAAAAAAITIQAAAAAAAAslAAAAAAABGx0AAAAAAACLHQAAAAAAAGsZAAAAAAACqxkAAAAAAANLFQAAAAAAAGsZAAAAAAAAoxEAAAAAAABzEQAAAAAAA9MRAAAAAAABmxUAAAAAAAHzEQAAAAAAAYMVAAAAAAAC2w0AAAAAAAJLDQAAAAAAAesNAAAAAAABWw0AAAAAAAJLDQAAAAAAAwsNAAAAAAADWx0AAAAAAAFjHQAAAAAAAoMdAAAAAAACax0AAAAAAAKbHQAAAAAAAEshAAAAAAABWxkAAAAAAAFbGQAAAAAAAUMZAAAAAAACGxkAAAAAAAFbGQAAAAAAAqsZAAAAAAABOyEAAAAAAAIbJQAAAAAAA9shAAAAAAADSyEAAAAAAAALJQAAAAAAAbslAAAAAAAD+w0AAAAAAAHjFQAAAAAAAjMNAAAAAAACkw0AAAAAAAIbDQAAAAAAAsMNAAAAAAACwv0AAAAAAACS+QAAAAAAACL9AAAAAAADkvkAAAAAAAES/QAAAAAAAdMBAAAAAAABYt0AAAAAAAHS2QAAAAAAA7LZAAAAAAACcuEAAAAAAANS2QAAAAAAAcLdAAAAAAABQuUAAAAAAACC5QAAAAAAAWLdAAAAAAACMuUAAAAAAAOi3QAAAAAAAXLZAAAAAAAAMu0AAAAAAAFS4QAAAAAAAiLdAAAAAAABMukAAAAAAAAS6QAAAAAAAULlAAAAAAACkvEAAAAAAAGy7QAAAAAAATL1AAAAAAACgukAAAAAAALS7QAAAAAAA1LxAAAAAAADgwEAAAAAAAJ7AQAAAAAAAvL9AAAAAAADIwEAAAAAAAETAQAAAAAAAFMBAAAAAAADYxUAAAAAAAFLEQAAAAAAAHsVAAAAAAAAwxUAAAAAAAGbFQAAAAAAAQsVAAAAAAACCykAAAAAAADLMQAAAAAAALspAAAAAAAAiykAAAAAAAPLJQAAAAAAAeMtAAAAAAACAyUAAAAAAAODJQAAAAAAAMslAAAAAAACEyEAAAAAAAHrJQAAAAAAAtMhAAAAAAAAQzUAAAAAAAB7OQAAAAAAAQM1AAAAAAADozUAAAAAAAJTNQAAAAAAAMM5AAAAAAACmx0AAAAAAAC7HQAAAAAAAesZAAAAAAABWxkAAAAAAADTHQAAAAAAAjsdAAAAAAAAgyUAAAAAAAO7HQAAAAAAAvMlAAAAAAAC8yUAAAAAAAILKQAAAAAAAZshAAAAAAAA2yEAAAAAAAATKQAAAAAAAwslAAAAAAABayEAAAAAAANTJQAAAAAAA2MhAAAAAAACexkAAAAAAAHrGQAAAAAAAXMZAAAAAAACUx0AAAAAAAKbHQAAAAAAAfMdAAAAAAADaxkAAAAAAACjHQAAAAAAAdsdAAAAAAAAcx0AAAAAAAF7HQAAAAAAA1MZAAAAAAAAix0AAAAAAABbHQAAAAAAAwsZAAAAAAAAQx0AAAAAAALTIQAAAAAAADsZAAAAAAACAw0AAAAAAAFrCQAAAAAAAUsFAAAAAAADiwUAAAAAAACbDQAAAAAAAGsNAAAAAAACiwkAAAAAAAP7AQAAAAAAASsNAAAAAAAAwwkAAAAAAABDBQAAAAAAADMJAAAAAAACAwEAAAAAAADy+QAAAAAAAKL1AAAAAAADcvUAAAAAAAHC9QAAAAAAAvL9AAAAAAAA+wEAAAAAAANS/QAAAAAAAkLtAAAAAAAAowUAAAAAAAATBQAAAAAAAbsBAAAAAAACks0AAAAAAAGSxQAAAAAAA4LNAAAAAAACotUAAAAAAAFi0QAAAAAAA9LRAAAAAAAAgs0AAAAAAAKCxQAAAAAAAELFAAAAAAADUsEAAAAAAAKSwQAAAAAAAEK1AAAAAAAA4qUAAAAAAAGClQAAAAAAAeKhAAAAAAAAwqEAAAAAAAGimQAAAAAAAaKZAAAAAAAC4qkAAAAAAALCpQAAAAAAAGKtAAAAAAACArEAAAAAAAPCrQAAAAAAAiK1AAAAAAACYo0AAAAAAADijQAAAAAAAUKNAAAAAAACAn0AAAAAAAJClQAAAAAAAKKRAAAAAAACAjEAAAAAAACCPQAAAAAAAAItAAAAAAACgikAAAAAAAOCPQAAAAAAAYIhAAAAAAAAAhUAAAAAAAMCCQAAAAAAAgINAAAAAAACggUAAAAAAACCAQAAAAAAAgIBAAAAAAAAAfkAAAAAAAMB+QAAAAAAAwHhAAAAAAABAekAAAAAAACCDQAAAAAAAQH1AAAAAAACAdkAAAAAAACCAQAAAAAAAwHVAAAAAAAAAe0AAAAAAAMB1QAAAAAAAQHpAAAAAAACAbEAAAAAAAIBwQAAAAAAAgG9AAAAAAADAckAAAAAAAIBvQAAAAAAAAHhAAAAAAACAaUAAAAAAAEB0QAAAAAAAgGZAAAAAAAAAYkAAAAAAAIBgQAAAAAAAADhA", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "OLD — Trips per Hour by Trip Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 19769.4 + ], + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Pickup/hr (reposition)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAIHBAAAAAAAAAbkAAAAAAAIBzQAAAAAAAYHhAAAAAAADgdkAAAAAAAAB7QAAAAAAAwHVAAAAAAACwgEAAAAAAAIB/QAAAAAAAIIBAAAAAAABwkUAAAAAAAOCQQAAAAAAA6JRAAAAAAABQnEAAAAAAAFCcQAAAAAAAUJxAAAAAAABwqkAAAAAAABCqQAAAAAAAjKlAAAAAAABQv0AAAAAAAG6/QAAAAAAAwL5AAAAAAAAXxkAAAAAAAG7GQAAAAAAAjsdAAAAAAAAYy0AAAAAAABnKQAAAAAAAostAAAAAAABKyUAAAAAAAEXIQAAAAAAAZclAAAAAAAApxkAAAAAAABDHQAAAAAAAgMZAAAAAAABTxkAAAAAAANvFQAAAAAAAfcZAAAAAAAAfykAAAAAAALbJQAAAAAAADslAAAAAAABFyEAAAAAAAJnIQAAAAAAAwMhAAAAAAACWy0AAAAAAAGDLQAAAAAAAdMlAAAAAAACcxUAAAAAAAGPFQAAAAAAAfMdAAAAAAACdwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA1LxAAAAAAABovEAAAAAAAIC8QAAAAAAAUrpAAAAAAABSvUAAAAAAABK+QAAAAAAA0L1AAAAAAAA4v0AAAAAAACPAQAAAAAAAnsBAAAAAAAB+wkAAAAAAAN/BQAAAAAAAR8NAAAAAAACkxkAAAAAAAHPHQAAAAAAAQMdAAAAAAACtzEAAAAAAAMLMQAAAAAAArM1AAAAAAADky0AAAAAAAI3LQAAAAAAAuMpAAAAAAACzz0AAAAAAACzPQAAAAAAAy89AAAAAAAAMyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA6clAAAAAAAA6ykAAAAAAACjKQAAAAAAAc8pAAAAAAAAqyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA4sFAAAAAAACEtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refuel/hr", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T03:00:00.000000000", + "2000-01-02T03:10:00.000000000", + "2000-01-02T03:20:00.000000000", + "2000-01-02T03:30:00.000000000", + "2000-01-02T03:40:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Dropoff/hr (serviced)", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHCqQAAAAAAATKpAAAAAAABavkAAAAAAAAjAQAAAAAAAAr9AAAAAAADexUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACjKQAAAAAAAostAAAAAAABKyUAAAAAAAE7IQAAAAAAAX8lAAAAAAAAvxkAAAAAAAArHQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA1LxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABkvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADwy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADLPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA48lAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "NEW — Trips per Hour by Trip Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 19769.4 + ], + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Trips/hour by trip type — separate OLD vs NEW plots (same y-axis)\n", + "\n", + "# NEW: trip_type has pickup / dropoff / refuel\n", + "tt = new_df[\"trip_type\"].astype(str).str.lower()\n", + "new_pickup = tt.eq(\"pickup\")\n", + "new_dropoff = tt.eq(\"dropoff\")\n", + "new_refuel = tt.eq(\"refuel\")\n", + "\n", + "# OLD: destinationPurpose -> 1/3 = pickup, 2 = dropoff, 4 = refuel\n", + "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", + "old_pickup = dp.isin([1,3])\n", + "old_dropoff = dp.eq(2)\n", + "old_refuel = dp.eq(4)\n", + "\n", + "# Counts → trips/hour\n", + "new_pk = new_df.loc[new_pickup, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", + "new_do = new_df.loc[new_dropoff, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", + "new_rf = new_df.loc[new_refuel, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", + "if len(new_pk): new_pk = new_pk.reindex(pd.RangeIndex(0, new_pk.index.max()+1), fill_value=0)\n", + "if len(new_do): new_do = new_do.reindex(pd.RangeIndex(0, new_do.index.max()+1), fill_value=0)\n", + "if len(new_rf): new_rf = new_rf.reindex(pd.RangeIndex(0, new_rf.index.max()+1), fill_value=0)\n", + "new_pk_rate, new_do_rate, new_rf_rate = new_pk*(60/10), new_do*(60/10), new_rf*(60/10)\n", + "\n", + "old_pk = old_df.loc[old_pickup, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", + "old_do = old_df.loc[old_dropoff, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", + "old_rf = old_df.loc[old_refuel, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", + "if len(old_pk): old_pk = old_pk.reindex(pd.RangeIndex(0, old_pk.index.max()+1), fill_value=0)\n", + "if len(old_do): old_do = old_do.reindex(pd.RangeIndex(0, old_do.index.max()+1), fill_value=0)\n", + "if len(old_rf): old_rf = old_rf.reindex(pd.RangeIndex(0, old_rf.index.max()+1), fill_value=0)\n", + "old_pk_rate, old_do_rate, old_rf_rate = old_pk*(60/5), old_do*(60/5), old_rf*(60/5)\n", + "\n", + "# Common y-axis\n", + "ymax = float(pd.concat([new_pk_rate,new_do_rate,new_rf_rate,old_pk_rate,old_do_rate,old_rf_rate]).max())*1.05\n", + "\n", + "# OLD plot\n", + "fig_old = go.Figure()\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_pk_rate.index*5, unit=\"m\"),\n", + " y=old_pk_rate.values, mode=\"lines\", name=\"Pickup/hr (reposition)\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_rf_rate.index*5, unit=\"m\"),\n", + " y=old_rf_rate.values, mode=\"lines\", name=\"Refuel/hr\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_do_rate.index*5, unit=\"m\"),\n", + " y=old_do_rate.values, mode=\"lines\", name=\"Dropoff/hr (serviced)\"))\n", + "fig_old.update_layout(title=\"OLD — Trips per Hour by Trip Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_old.show()\n", + "\n", + "# NEW plot\n", + "fig_new = go.Figure()\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_pk_rate.index*10, unit=\"m\"),\n", + " y=new_pk_rate.values, mode=\"lines\", name=\"Pickup/hr (reposition)\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_rf_rate.index*10, unit=\"m\"),\n", + " y=new_rf_rate.values, mode=\"lines\", name=\"Refuel/hr\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_do_rate.index*10, unit=\"m\"),\n", + " y=new_do_rate.values, mode=\"lines\", name=\"Dropoff/hr (serviced)\"))\n", + "fig_new.update_layout(title=\"NEW — Trips per Hour by Trip Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_new.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Repositioning", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Servicing", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refueling", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "OLD — Trips per Hour by Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 21457.8 + ], + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Repositioning", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAIHBAAAAAAAAAbkAAAAAAAIBzQAAAAAAAYHhAAAAAAADgdkAAAAAAAAB7QAAAAAAAwHVAAAAAAACwgEAAAAAAAIB/QAAAAAAAIIBAAAAAAABwkUAAAAAAAOCQQAAAAAAA6JRAAAAAAABQnEAAAAAAAFCcQAAAAAAAUJxAAAAAAABwqkAAAAAAAASqQAAAAAAAjKlAAAAAAABKv0AAAAAAAG6/QAAAAAAAwL5AAAAAAAAUxkAAAAAAAG7GQAAAAAAAjsdAAAAAAAAYy0AAAAAAABbKQAAAAAAAn8tAAAAAAABKyUAAAAAAAELIQAAAAAAAZclAAAAAAAAmxkAAAAAAAA3HQAAAAAAAgMZAAAAAAABTxkAAAAAAANvFQAAAAAAAfcZAAAAAAAAfykAAAAAAALbJQAAAAAAADslAAAAAAABFyEAAAAAAAJnIQAAAAAAAwMhAAAAAAACWy0AAAAAAAGDLQAAAAAAAdMlAAAAAAACcxUAAAAAAAGPFQAAAAAAAfMdAAAAAAACdwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAAzrxAAAAAAABovEAAAAAAAIC8QAAAAAAAUrpAAAAAAABMvUAAAAAAABK+QAAAAAAA0L1AAAAAAAA4v0AAAAAAACPAQAAAAAAAnsBAAAAAAAB+wkAAAAAAAN/BQAAAAAAAR8NAAAAAAACkxkAAAAAAAHPHQAAAAAAAQMdAAAAAAACtzEAAAAAAAMLMQAAAAAAArM1AAAAAAADhy0AAAAAAAI3LQAAAAAAAuMpAAAAAAACzz0AAAAAAACbPQAAAAAAAy89AAAAAAAAMyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA6ykAAAAAAACjKQAAAAAAAc8pAAAAAAAAqyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA4sFAAAAAAACEtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Servicing", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refueling", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T03:00:00.000000000", + "2000-01-02T03:10:00.000000000", + "2000-01-02T03:20:00.000000000", + "2000-01-02T03:30:00.000000000", + "2000-01-02T03:40:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "NEW — Trips per Hour by Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 21457.8 + ], + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Trips/hour by trip type — separate OLD vs NEW plots (same y-axis)\n", + "\n", + "# NEW\n", + "trip_type = new_df[\"trip_type\"].astype(str).str.lower()\n", + "is_deadhead = new_df[\"is_deadhead\"] == True\n", + "reposition_new = trip_type.eq(\"pickup\") & is_deadhead\n", + "servicing_new = (trip_type.eq(\"pickup\") & ~is_deadhead) | trip_type.eq(\"dropoff\")\n", + "refueling_new = trip_type.eq(\"refuel\")\n", + "\n", + "# OLD\n", + "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", + "occ = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", + "is_deadhead_old = (occ == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", + "reposition_old = dp.isin([1, 3]) & is_deadhead_old\n", + "servicing_old = (dp.isin([1, 3]) & ~is_deadhead_old) | dp.eq(2)\n", + "refueling_old = dp.eq(4)\n", + "\n", + "def rate(df, mask, col, width):\n", + " bins = df.loc[mask, col].dropna().astype(int)\n", + " if not len(bins): return pd.Series(dtype=float)\n", + " counts = bins.value_counts().sort_index().reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0)\n", + " return counts * (60 / width)\n", + "\n", + "# NEW\n", + "rate_rep_new = rate(new_df, reposition_new, \"depart_bin\", 10)\n", + "rate_srv_new = rate(new_df, servicing_new, \"depart_bin\", 10)\n", + "rate_ref_new = rate(new_df, refueling_new, \"depart_bin\", 10)\n", + "# OLD\n", + "rate_rep_old = rate(old_df, reposition_old, \"startPeriod\", 5)\n", + "rate_srv_old = rate(old_df, servicing_old, \"startPeriod\", 5)\n", + "rate_ref_old = rate(old_df, refueling_old, \"startPeriod\", 5)\n", + "\n", + "ymax = float(pd.concat([\n", + " rate_rep_new, rate_srv_new, rate_ref_new,\n", + " rate_rep_old, rate_srv_old, rate_ref_old\n", + "]).max()) * 1.05\n", + "\n", + "# OLD plot\n", + "fig_old = go.Figure()\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_rep_old.index*5, unit=\"m\"),\n", + " y=rate_rep_old.values, mode=\"lines\", name=\"Repositioning\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_srv_old.index*5, unit=\"m\"),\n", + " y=rate_srv_old.values, mode=\"lines\", name=\"Servicing\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_ref_old.index*5, unit=\"m\"),\n", + " y=rate_ref_old.values, mode=\"lines\", name=\"Refueling\"))\n", + "fig_old.update_layout(title=\"OLD — Trips per Hour by Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_old.show()\n", + "\n", + "# NEW plot\n", + "fig_new = go.Figure()\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_rep_new.index*10, unit=\"m\"),\n", + " y=rate_rep_new.values, mode=\"lines\", name=\"Repositioning\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_srv_new.index*10, unit=\"m\"),\n", + " y=rate_srv_new.values, mode=\"lines\", name=\"Servicing\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_ref_new.index*10, unit=\"m\"),\n", + " y=rate_ref_new.values, mode=\"lines\", name=\"Refueling\"))\n", + "fig_new.update_layout(title=\"NEW — Trips per Hour by Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_new.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Repositioning", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Servicing", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:45:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T19:55:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:05:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:15:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:25:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:35:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:45:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T20:55:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:05:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:15:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:25:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:35:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:45:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T21:55:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:05:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:15:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:25:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:35:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:45:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T22:55:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:05:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:15:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:25:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:35:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:45:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-01T23:55:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:05:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:15:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:25:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:35:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:45:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T00:55:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:05:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:15:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:25:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:35:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:45:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T01:55:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:05:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:15:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:25:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:35:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:45:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T02:55:00.000000000" + ], + "y": { + "bdata": "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", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refueling", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:05:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:15:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:25:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:35:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:45:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T03:55:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:05:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:15:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:25:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:35:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:45:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T04:55:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:05:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:15:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:25:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:35:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:45:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T05:55:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:05:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:15:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:25:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:35:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:45:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T06:55:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:05:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:15:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:25:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:35:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:45:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T07:55:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:05:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:15:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:25:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:35:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:45:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T08:55:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:05:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:15:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:25:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:35:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:45:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T09:55:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:05:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:15:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:25:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:35:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:45:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T10:55:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:05:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:15:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:25:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:35:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:45:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T11:55:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:05:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:15:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:25:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:35:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:45:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T12:55:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:05:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:15:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:25:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:35:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:45:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T13:55:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:05:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:15:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:25:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:35:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:45:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T14:55:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:05:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:15:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:25:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:35:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:45:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T15:55:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:05:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:15:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:25:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:35:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:45:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T16:55:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:05:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:15:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:25:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:35:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:45:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T17:55:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:05:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:15:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:25:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:35:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:45:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T18:55:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:05:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:15:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:25:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:35:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBrxg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAKWZ7QA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "OLD — VMT per Hour by Trip Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 125453.2801536888 + ], + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "Repositioning", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AAAImOEET0AAADJR7nyBQAAA9mqZbIRAAADK03F4ikAAAEr6kKaRQAAA8YubWZJAAACeFpoLlUAAANifPfKVQAAA0Jn6iJJAAADLF+b8mEAAALI6bdCdQAAAmvFWv5tAAACPclMWr0AAANYHUAirQADAE4q+36tAAADpd/BLsUAAcFJ1/XW1QADAYUUPNrRAAOD2r8ycwkAAGCAXQLzBQACAtn3lHr1AANAmoLGdyUAAWKitpAbGQADQxUKlbMhAACgL3XS9zUAAENFFjtHLQAA4BcMMes5AAAjubWAay0AACOu0ncbKQACQrCe8Ps9AAChf8a80y0AAeLEUcGDIQAB4HHH3us1AANioLacNxUAAQF8IAwPGQABQkI4PjcVAAJhXPczwyEAAaN5diK3GQADw4L3SjshAAIA8jhyE0UAA/IRLbQ3QQADgdiAezs1AAGCKX4h6zEAACJmaX8nPQABIYXRikMxAAGR9VP/50kAAIGqqpZzQQACg4PZ/lc5AAGDTSoIMxEAA6L9XmGHFQADQUqFO3spAABDPas4CvkAAwBbE6ALAQAAwQR0D2MFAAFD5ha5rs0AAMEfugTS0QAAQVBBaabZAAEDaU8a5tEAAYIHLevi4QADgE2tCRblAAIDA70g7u0AAwPizn3e7QACArMKNirlAAKB2prw3vkAAAJ2Xb9O7QABA8k7HZLxAAKDCWpONvkAAEGJQjNjBQADIi4Fp9MFAAKCeaEERyEAAeBaT4pbGQAAgiOoAlsVAAMS19u5N0EAASMV0VQ/PQAAgftaar8xAAGAVnMZVykAAcJ3kiRzJQABIEg+5V8xAAOgGV9pUzkAA2LkiFKXPQAB8qCHEIdBAABg2H1eswEAAEILBw+y/QAD4TypywcFAAAhH3jyLxkAAqBTUN9DOQABYKsSXfcxAAIAzYaHOykAAkCfvyQXNQAC43aSiB8tAAJBOEwz5x0AAEO0Xj/XHQADIpuGc7cVAALhMNqxgxUAASKA6JozFQABYFd5mxsRAALCnU2kJxUAAgDI9VxjJQADgs+SNy8hAADDAkwFvxEAAOCmh3fPDQABouyw/tcJAAPCkXd1lwkAAkM03+PbBQACAO737x8RAAGDM+z+GwUAAUJT+hYm/QAAgPA3FJ8BAAECue+pAwEAAaDzjktXCQADgDRmYr8FAADAzZfM2tkAAQMtzwEy5QAAo+YXLRsNAAOAVlp3MvkAA8MiUOSq4QABQlUscjblAAFCVn5fiskAAYEyhPhy4QAAAmPqxZ61AAOAIGAMyskAAoJAUaW2qQACgOqMJ6bNAAABMq4mjrUAAIJxNSCyrQAAAUjMc7KpAAID8IJqThkAAAKejB+KJQAAAI1iR+IhAAAAI7CxGcUAAAB+lM7N+QAAAt5qbyIBAAACMn6gWe0AAAKi+lNeBQAAAvTOihIVAAADoxd6PeUAAAOrKX618QAAAUkpGMYBAAAASyqxVfkAAAJDKbQF+QAAAz8i2PnhAAACoFf/gg0AAAO8lJMqBQAAAzETUAHpA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Servicing", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000" + ], + "y": { + "bdata": "AADQujdnq0AAAAwYYyCzQAAAoCKeya1AAAAUteJRqkAAwKZhST6zQADAfoXo2LNAAACACZ2OtEAAgOGTb0C1QAAAdCwRkbRAAID0DxKhv0AAAMOA7Uu5QACAnSR0rrlAAMC1VT7fyUAAgIG/hjXMQABgEi53y9BAAMD6uXX31EAAwGJAkubRQADgnDFECthAAEBM1kK03kAAuC9p5snfQACYxJWU/uBAANgEnuvT8EAAwIHdiz/yQABcOG+R1fBAAGD2OFmd9kAAblz+FYr4QAA4VKLQK/pAAPApSfBl+UAAqfepKxj3QABIYHjoW/lAACDQHd/W90AAzFtTEkv4QADqSOOy5fdAAFKUHFoW9EAAsNE3kDf1QACiltsFNvNAAIiAojd59kAA+EJJAhv2QABw/bAdMfdAAOwUc4MX+EAARolNCoj3QAC0BIcRyPZAAMCdpyxs9kAAKJqQBBz3QADCus5aPfZAAJ3qzZtz+UAAuDmUSqD5QAB4IcweBvhAAMwKP+9980AAlMfHA9fzQADIpLGtpfVAAN5a7p6h70AAt7RcdRrxQABkux+yMPFAAEBAGhws6kAAMB7c8ePqQACofa4Tv+xAALxO13/R7UAAeBhIATztQACIHBFlZ+pAAGhibiOP7UAATh2l4QfuQAAIOcUfpexAALhxCVC47kAA+W/sJEfxQACaEs5XlfBAAHlO0kHD8kAABM630HXxQAAqqOlJD/JAAFT7DRxg9EAABltcDY/1QAB83rnLbfVAAM5qfk/5+kAATdDNyeL5QACYL0Yp4fpAADzvjJxj+kAAZFdxvOL4QADUPtU4dPlAAKxLZ5T7/EAALSeUiZn7QADw6Qd1K/1AAAC3rYOE9EAAeNyebLv0QAAc7CXvDPVAAF4hUT7Z90AAkv7cIhH5QADoVszbM/hAAKpApVyj+EAAJtBwgoX4QABg3dZPifhAADZ/fPVm90AApHsivjn3QADYlx52d/dAAFI7DT969UAAzm+5SwP3QAC4gzdojvdAAAgymS/990AAiDRh3QL6QAAEJDDXFfhAAOCjWWLi80AADN7JkKz0QACepC/PivJAALhpwX9980AAv6+/2YT1QADMPzPpDfVAAOzr0oCI8kAARMBCC63yQABgN9xQjPJAAGynWGHX8kAAUPTezs3yQACkRMS5N/NAAJhaP0XW6EAAwOvn6JLnQABo58f55+tAALC9fiFL6UAAuPrCg6LoQABAx4o+BupAALBz1jUC4EAAENcS9VTjQACUA7LAr+JAAABev9Dg20AAcObddunZQACw4AySM95AACCCbzrD3UAAAI6wGfnXQABAwfYmz91AAABXa+2lwEAAAJ5hZ7a+QAAg5XJ6e8BAAAAc7WNmrUAAAFZWY8O0QAAAJHXZ4rxAAAA98/eetEAAgN7ln5e0QAAAZBSMJLNAAADcO+ZzpUAAAHqeYra2QAAADPdXM7dAAACaxGfbskAAAGAnkCGrQAAAXN6Iv6xAAAAn+58xtUAAgHVrPJKyQAAAMgoKTKlA", + "dtype": "f8" + } + }, + { + "mode": "lines", + "name": "Refueling", + "type": "scatter", + "x": [ + "2000-01-01T03:00:00.000000000", + "2000-01-01T03:10:00.000000000", + "2000-01-01T03:20:00.000000000", + "2000-01-01T03:30:00.000000000", + "2000-01-01T03:40:00.000000000", + "2000-01-01T03:50:00.000000000", + "2000-01-01T04:00:00.000000000", + "2000-01-01T04:10:00.000000000", + "2000-01-01T04:20:00.000000000", + "2000-01-01T04:30:00.000000000", + "2000-01-01T04:40:00.000000000", + "2000-01-01T04:50:00.000000000", + "2000-01-01T05:00:00.000000000", + "2000-01-01T05:10:00.000000000", + "2000-01-01T05:20:00.000000000", + "2000-01-01T05:30:00.000000000", + "2000-01-01T05:40:00.000000000", + "2000-01-01T05:50:00.000000000", + "2000-01-01T06:00:00.000000000", + "2000-01-01T06:10:00.000000000", + "2000-01-01T06:20:00.000000000", + "2000-01-01T06:30:00.000000000", + "2000-01-01T06:40:00.000000000", + "2000-01-01T06:50:00.000000000", + "2000-01-01T07:00:00.000000000", + "2000-01-01T07:10:00.000000000", + "2000-01-01T07:20:00.000000000", + "2000-01-01T07:30:00.000000000", + "2000-01-01T07:40:00.000000000", + "2000-01-01T07:50:00.000000000", + "2000-01-01T08:00:00.000000000", + "2000-01-01T08:10:00.000000000", + "2000-01-01T08:20:00.000000000", + "2000-01-01T08:30:00.000000000", + "2000-01-01T08:40:00.000000000", + "2000-01-01T08:50:00.000000000", + "2000-01-01T09:00:00.000000000", + "2000-01-01T09:10:00.000000000", + "2000-01-01T09:20:00.000000000", + "2000-01-01T09:30:00.000000000", + "2000-01-01T09:40:00.000000000", + "2000-01-01T09:50:00.000000000", + "2000-01-01T10:00:00.000000000", + "2000-01-01T10:10:00.000000000", + "2000-01-01T10:20:00.000000000", + "2000-01-01T10:30:00.000000000", + "2000-01-01T10:40:00.000000000", + "2000-01-01T10:50:00.000000000", + "2000-01-01T11:00:00.000000000", + "2000-01-01T11:10:00.000000000", + "2000-01-01T11:20:00.000000000", + "2000-01-01T11:30:00.000000000", + "2000-01-01T11:40:00.000000000", + "2000-01-01T11:50:00.000000000", + "2000-01-01T12:00:00.000000000", + "2000-01-01T12:10:00.000000000", + "2000-01-01T12:20:00.000000000", + "2000-01-01T12:30:00.000000000", + "2000-01-01T12:40:00.000000000", + "2000-01-01T12:50:00.000000000", + "2000-01-01T13:00:00.000000000", + "2000-01-01T13:10:00.000000000", + "2000-01-01T13:20:00.000000000", + "2000-01-01T13:30:00.000000000", + "2000-01-01T13:40:00.000000000", + "2000-01-01T13:50:00.000000000", + "2000-01-01T14:00:00.000000000", + "2000-01-01T14:10:00.000000000", + "2000-01-01T14:20:00.000000000", + "2000-01-01T14:30:00.000000000", + "2000-01-01T14:40:00.000000000", + "2000-01-01T14:50:00.000000000", + "2000-01-01T15:00:00.000000000", + "2000-01-01T15:10:00.000000000", + "2000-01-01T15:20:00.000000000", + "2000-01-01T15:30:00.000000000", + "2000-01-01T15:40:00.000000000", + "2000-01-01T15:50:00.000000000", + "2000-01-01T16:00:00.000000000", + "2000-01-01T16:10:00.000000000", + "2000-01-01T16:20:00.000000000", + "2000-01-01T16:30:00.000000000", + "2000-01-01T16:40:00.000000000", + "2000-01-01T16:50:00.000000000", + "2000-01-01T17:00:00.000000000", + "2000-01-01T17:10:00.000000000", + "2000-01-01T17:20:00.000000000", + "2000-01-01T17:30:00.000000000", + "2000-01-01T17:40:00.000000000", + "2000-01-01T17:50:00.000000000", + "2000-01-01T18:00:00.000000000", + "2000-01-01T18:10:00.000000000", + "2000-01-01T18:20:00.000000000", + "2000-01-01T18:30:00.000000000", + "2000-01-01T18:40:00.000000000", + "2000-01-01T18:50:00.000000000", + "2000-01-01T19:00:00.000000000", + "2000-01-01T19:10:00.000000000", + "2000-01-01T19:20:00.000000000", + "2000-01-01T19:30:00.000000000", + "2000-01-01T19:40:00.000000000", + "2000-01-01T19:50:00.000000000", + "2000-01-01T20:00:00.000000000", + "2000-01-01T20:10:00.000000000", + "2000-01-01T20:20:00.000000000", + "2000-01-01T20:30:00.000000000", + "2000-01-01T20:40:00.000000000", + "2000-01-01T20:50:00.000000000", + "2000-01-01T21:00:00.000000000", + "2000-01-01T21:10:00.000000000", + "2000-01-01T21:20:00.000000000", + "2000-01-01T21:30:00.000000000", + "2000-01-01T21:40:00.000000000", + "2000-01-01T21:50:00.000000000", + "2000-01-01T22:00:00.000000000", + "2000-01-01T22:10:00.000000000", + "2000-01-01T22:20:00.000000000", + "2000-01-01T22:30:00.000000000", + "2000-01-01T22:40:00.000000000", + "2000-01-01T22:50:00.000000000", + "2000-01-01T23:00:00.000000000", + "2000-01-01T23:10:00.000000000", + "2000-01-01T23:20:00.000000000", + "2000-01-01T23:30:00.000000000", + "2000-01-01T23:40:00.000000000", + "2000-01-01T23:50:00.000000000", + "2000-01-02T00:00:00.000000000", + "2000-01-02T00:10:00.000000000", + "2000-01-02T00:20:00.000000000", + "2000-01-02T00:30:00.000000000", + "2000-01-02T00:40:00.000000000", + "2000-01-02T00:50:00.000000000", + "2000-01-02T01:00:00.000000000", + "2000-01-02T01:10:00.000000000", + "2000-01-02T01:20:00.000000000", + "2000-01-02T01:30:00.000000000", + "2000-01-02T01:40:00.000000000", + "2000-01-02T01:50:00.000000000", + "2000-01-02T02:00:00.000000000", + "2000-01-02T02:10:00.000000000", + "2000-01-02T02:20:00.000000000", + "2000-01-02T02:30:00.000000000", + "2000-01-02T02:40:00.000000000", + "2000-01-02T02:50:00.000000000", + "2000-01-02T03:00:00.000000000", + "2000-01-02T03:10:00.000000000", + "2000-01-02T03:20:00.000000000", + "2000-01-02T03:30:00.000000000", + "2000-01-02T03:40:00.000000000" + ], + "y": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCfXQxAAAAA5BplFEAAAEA3khlDQAAAAKqgCjRAAAAA0Sh6RkAAAEA5nntYQAAA4Hi5SGdAAABgpjmLZkAAAIDOsJhpQAAAeBAX5XFAAABgI8x8W0AAAESo+C1kQAAA8KmDkmxAAACw0GrXaEAAAOxhabRyQAAAmD3d3HhAAADoMBy+e0AAANBrCgGDQAAABM7J4YVAAAC6B2p0gUAAAKgdqAuHQAAA7zhalpFAAADs3yNejkAAACIPiaKIQAAAc0hGGJBAAABHo3iHkkAAABlZNFCSQAAAifeFsZdAAIA4SAyKoUAAAHZ6f5aXQAAAPruQ3qJAAID04WR9okAAgG/UnV+dQACAXiQDz6hAAIBB9JG3q0AAAKNl9WmjQABAWeuPAqNAAAAoNV9WpEAA4Ijn6ymlQAAAK8KUW6lAAAAMcAXnq0AAgO3HhkisQAAAPn0IKbBAAAAHxmccskAAgFKPKWGsQAAAvB9ZcbFAAEDeqmdFsUAAQBef2vCvQADA5c0aN7BAACBrPwaWsUAAIGaOK6qyQACA9k0Aa7JAAGBhUQeksUAAgDcoX+azQABA1YvrX7BAAIAH1xtysEAAQB8U94OxQADQfdU7CLRAAIAXSNGbs0AAoFWOGxa3QADQv8ek77NAAABcGey5tEAAgEKMg5W2QADAg1cAgrVAAKBLeNJ2tkAAAI7TdLC1QABADirbwLVAAGCGv+1euUAAQO9jiSO0QACAi5ITVbdAAED8hl41tUAAQN56kSG3QADgOMkMarNAAIDHkmjOskAAQHNweuqzQACg/Kuei7RAAAAyDYfds0AAMC5BBGOxQADgAETAxrFAAMBnYjKcsEAA4PruSiyvQAAA/GOPYK9AAICYM6q5qUAAQBi4mWCmQACA/yq4HaNAAEBpICvMp0AAgOjMqFagQACAnMKl/qJAAAAAcZWgo0AAgEv1ahaiQAAAbllbr5JAAAC9m8zOl0AAACt14XGbQACAYICy859AAAB5plPVnUAAAHYRtzeXQAAA1+GUqJJAAAAL5q6akEAAAJAdFR+FQAAAdFMi4YlAAAAAsKAIb0AAAIxzI0OOQAAAmPFAbJdAAABQlTuzZkAAADhfo8J6QAAA5N+xrG9AAACQsX3+YUAAABhztdZlQAAAiDsuAnhAAACgcebtcEAAAOCqDZBsQAAAgPi4IFpAAABA27bVW0AAABgGom91QAAAYCzrK1dAAAAg3KdYbkAAAADcz0JaQAAAAEBajWFAAAAAVMhAYkAAAADgikRaQA==", + "dtype": "f8" + } + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "NEW — VMT per Hour by Trip Type" + }, + "xaxis": { + "tickformat": "%H:%M", + "title": { + "text": "Time of Day" + } + }, + "yaxis": { + "range": [ + 0, + 125453.2801536888 + ], + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# VMT/hour by trip type — separate OLD vs NEW plots with same y-axis\n", + "\n", + "start_time = pd.Timestamp(\"2000-01-01 03:00:00\")\n", + "\n", + "# --- Categorize trips ---\n", + "# NEW: only say Repositioning, Servicing, Refueling; pickup but NOT deadhead => Servicing\n", + "tt = new_df[\"trip_type\"].astype(str).str.lower()\n", + "new_is_deadhead = (new_df[\"is_deadhead\"] == True)\n", + "new_reposition = tt.eq(\"pickup\") & new_is_deadhead\n", + "new_servicing = tt.eq(\"dropoff\") | (tt.eq(\"pickup\") & ~new_is_deadhead)\n", + "new_refueling = tt.eq(\"refuel\")\n", + "\n", + "# OLD: destinationPurpose (1/3=pickup, 2=dropoff, 4=refuel); pickup but NOT deadhead => Servicing\n", + "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", + "occ = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", + "old_is_deadhead = (occ == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", + "old_reposition = dp.isin([1,3]) & old_is_deadhead\n", + "old_servicing = dp.eq(2) | (dp.isin([1,3]) & ~old_is_deadhead)\n", + "old_refueling = dp.eq(4)\n", + "\n", + "# ensure time columns on trip-distance tables\n", + "new_trips = new_trips.copy(); new_trips[\"depart_bin\"] = new_df[\"depart_bin\"].values\n", + "old_trips = old_trips.copy(); old_trips[\"startPeriod\"] = old_df[\"startPeriod\"].values\n", + "\n", + "# --- VMT/hour per type ---\n", + "# NEW (10-min bins)\n", + "tmp = new_trips.loc[new_reposition, [\"depart_bin\",\"trip_dist\"]].dropna()\n", + "vmt_rep_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "tmp = new_trips.loc[new_servicing, [\"depart_bin\",\"trip_dist\"]].dropna()\n", + "vmt_srv_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "tmp = new_trips.loc[new_refueling, [\"depart_bin\",\"trip_dist\"]].dropna()\n", + "vmt_ref_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "if len(vmt_rep_new): vmt_rep_new = vmt_rep_new.reindex(pd.RangeIndex(0, vmt_rep_new.index.max()+1), fill_value=0.0)\n", + "if len(vmt_srv_new): vmt_srv_new = vmt_srv_new.reindex(pd.RangeIndex(0, vmt_srv_new.index.max()+1), fill_value=0.0)\n", + "if len(vmt_ref_new): vmt_ref_new = vmt_ref_new.reindex(pd.RangeIndex(0, vmt_ref_new.index.max()+1), fill_value=0.0)\n", + "vmt_rep_new *= (60/10); vmt_srv_new *= (60/10); vmt_ref_new *= (60/10)\n", + "\n", + "# OLD (5-min bins)\n", + "tmp = old_trips.loc[old_reposition, [\"startPeriod\",\"trip_dist\"]].dropna()\n", + "vmt_rep_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "tmp = old_trips.loc[old_servicing, [\"startPeriod\",\"trip_dist\"]].dropna()\n", + "vmt_srv_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "tmp = old_trips.loc[old_refueling, [\"startPeriod\",\"trip_dist\"]].dropna()\n", + "vmt_ref_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", + "if len(vmt_rep_old): vmt_rep_old = vmt_rep_old.reindex(pd.RangeIndex(0, vmt_rep_old.index.max()+1), fill_value=0.0)\n", + "if len(vmt_srv_old): vmt_srv_old = vmt_srv_old.reindex(pd.RangeIndex(0, vmt_srv_old.index.max()+1), fill_value=0.0)\n", + "if len(vmt_ref_old): vmt_ref_old = vmt_ref_old.reindex(pd.RangeIndex(0, vmt_ref_old.index.max()+1), fill_value=0.0)\n", + "vmt_rep_old *= (60/5); vmt_srv_old *= (60/5); vmt_ref_old *= (60/5)\n", + "\n", + "# common y-axis\n", + "ymax = float(pd.concat([vmt_rep_new, vmt_srv_new, vmt_ref_new, vmt_rep_old, vmt_srv_old, vmt_ref_old]).max()) * 1.05\n", + "\n", + "# OLD plot\n", + "fig_old = go.Figure()\n", + "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_rep_old.index * 5, unit=\"m\"),\n", + " y=vmt_rep_old.values, mode=\"lines\", name=\"Repositioning\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_srv_old.index * 5, unit=\"m\"),\n", + " y=vmt_srv_old.values, mode=\"lines\", name=\"Servicing\"))\n", + "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_ref_old.index * 5, unit=\"m\"),\n", + " y=vmt_ref_old.values, mode=\"lines\", name=\"Refueling\"))\n", + "fig_old.update_layout(title=\"OLD — VMT per Hour by Trip Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"VMT per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_old.show()\n", + "\n", + "# NEW plot\n", + "fig_new = go.Figure()\n", + "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_rep_new.index * 10, unit=\"m\"),\n", + " y=vmt_rep_new.values, mode=\"lines\", name=\"Repositioning\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_srv_new.index * 10, unit=\"m\"),\n", + " y=vmt_srv_new.values, mode=\"lines\", name=\"Servicing\"))\n", + "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_ref_new.index * 10, unit=\"m\"),\n", + " y=vmt_ref_new.values, mode=\"lines\", name=\"Refueling\"))\n", + "fig_new.update_layout(title=\"NEW — VMT per Hour by Trip Type\",\n", + " xaxis_title=\"Time of Day\", yaxis_title=\"VMT per hour\",\n", + " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", + " yaxis=dict(range=[0, ymax]))\n", + "fig_new.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OLD — Total VMT by trip type\n", + " Repositioning: 593,419 (34.32%)\n", + " Servicing: 1,135,572 (65.67%)\n", + " Refueling: 90 (0.01%)\n", + " Total: 1,729,081\n", + "\n", + "NEW — Total VMT by trip type\n", + " Repositioning: 200,350 (11.67%)\n", + " Servicing: 1,468,059 (85.53%)\n", + " Refueling: 48,012 (2.80%)\n", + " Total: 1,716,421\n" + ] + } + ], + "source": [ + "# Add: total distance and share by trip type (using trip_dist from earlier join)\n", + "# assumes new_trips and old_trips already have 'trip_dist' (from skim lookup)\n", + "\n", + "# --- NEW ---\n", + "reposition_new_dist = new_trips.loc[reposition_new, \"trip_dist\"].sum()\n", + "servicing_new_dist = new_trips.loc[servicing_new, \"trip_dist\"].sum()\n", + "refueling_new_dist = new_trips.loc[refueling_new, \"trip_dist\"].sum()\n", + "total_new_dist = reposition_new_dist + servicing_new_dist + refueling_new_dist\n", + "\n", + "# --- OLD ---\n", + "reposition_old_dist = old_trips.loc[reposition_old, \"trip_dist\"].sum()\n", + "servicing_old_dist = old_trips.loc[servicing_old, \"trip_dist\"].sum()\n", + "refueling_old_dist = old_trips.loc[refueling_old, \"trip_dist\"].sum()\n", + "total_old_dist = reposition_old_dist + servicing_old_dist + refueling_old_dist\n", + "\n", + "print(\"OLD — Total VMT by trip type\")\n", + "print(f\" Repositioning: {reposition_old_dist:,.0f} ({reposition_old_dist/total_old_dist:,.2%})\")\n", + "print(f\" Servicing: {servicing_old_dist:,.0f} ({servicing_old_dist/total_old_dist:,.2%})\")\n", + "print(f\" Refueling: {refueling_old_dist:,.0f} ({refueling_old_dist/total_old_dist:,.2%})\")\n", + "print(f\" Total: {total_old_dist:,.0f}\\n\")\n", + "\n", + "print(\"NEW — Total VMT by trip type\")\n", + "print(f\" Repositioning: {reposition_new_dist:,.0f} ({reposition_new_dist/total_new_dist:,.2%})\")\n", + "print(f\" Servicing: {servicing_new_dist:,.0f} ({servicing_new_dist/total_new_dist:,.2%})\")\n", + "print(f\" Refueling: {refueling_new_dist:,.0f} ({refueling_new_dist/total_new_dist:,.2%})\")\n", + "print(f\" Total: {total_new_dist:,.0f}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "activitysim", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index a70b67659..acb283c15 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -20,6 +20,7 @@ class TaxiTNCSettings(BaseModel): # path to activitysim output folder with trip data asim_output_dir: str + asim_demand_files: list # path to folder with skim data skim_dir: str @@ -188,14 +189,34 @@ def load_skim(omx_file, core): def read_input_data(self): # Read the data from the OpenMatrix file # Convert the data to a pandas DataFrame - cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] - # trips = pd.read_csv(os.path.join(self.settings.asim_output_dir, "final_trips.csv"), usecols=cols) - # trips['trip_mode'] = 'TNC_SHARED' - # reading subset for faster I/O - trips = pd.read_csv( - os.path.join(self.settings.asim_output_dir, "final_tnc_trips.csv"), - usecols=cols, - ) + base_cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] + opt_col = "arrival_mode" + frames = [] + for fname in self.settings.asim_demand_files: + fpath = os.path.join(self.settings.asim_output_dir, fname) + if not os.path.exists(fpath): + raise ValueError(f"Demand file not found: {fpath}") + lower = fpath.lower() + if lower.endswith((".parquet", ".parq", ".pq")): + try: + df = pd.read_parquet(fpath, columns=base_cols + [opt_col]) + except (ValueError, KeyError): + df = pd.read_parquet(fpath, columns=base_cols) + elif lower.endswith((".csv", ".csv.gz", ".txt", ".txt.gz")): + try: + df = pd.read_csv(fpath, usecols=base_cols + [opt_col]) + except (ValueError, KeyError): + df = pd.read_csv(fpath, usecols=base_cols) + else: + raise ValueError(f"Unsupported demand file type: {fpath}") + df['source_file'] = fname + if opt_col in df.columns: + df['trip_mode'] = df[opt_col] + df.drop(columns=[opt_col], inplace=True) + frames.append(df) + + trips = pd.concat(frames, ignore_index=True) + trips = trips[ trips.trip_mode.isin( self.settings.single_tnc_modes + self.settings.shared_tnc_modes @@ -222,6 +243,10 @@ def read_input_data(self): trips["dskim_idx"] = ( trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) ) + if trips.trip_id.is_unique is False: + trips['original_trip_id'] = trips['trip_id'] + trips.reset_index(inplace=True, drop=True) + trips['trip_id'] = trips.index return trips @@ -379,11 +404,12 @@ def determine_detour_times(self, trip_pairs): trip_pairs["detour_j"] = detour_j trip_pairs["total_detour"] = detour_i + detour_j + eps = 1e-9 # avoiding case where detour is exactly equal to max_detour assert ( - trip_pairs[trip_pairs.valid]["detour_i"] < max_detour + trip_pairs[trip_pairs.valid]["detour_i"] <= (max_detour + eps) ).all(), "Detour times exceed maximum allowed" assert ( - trip_pairs[trip_pairs.valid]["detour_j"] < max_detour + trip_pairs[trip_pairs.valid]["detour_j"] <= (max_detour + eps) ).all(), "Detour times exceed maximum allowed" assert ( trip_pairs[trip_pairs.valid]["route_scenario"] > 0 @@ -456,7 +482,7 @@ def select_mutual_best_recursive(self, trip_pairs: pd.DataFrame) -> pd.DataFrame ].reset_index(drop=True) i += 1 - if i > 100: + if i > 10000: raise RuntimeError("Exceeded maximum iterations for trip pooling") if not batches: @@ -653,7 +679,7 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): ] i += 1 - if i > 100: + if i > 10000: raise RuntimeError("Exceeded maximum iterations for vehicle matching") if trip_to_veh_map.isna().any(): @@ -1067,6 +1093,22 @@ def remap_skim_idx_to_zone(self, tnc_veh_trips, pooled_trips, tnc_trips): return tnc_veh_trips, pooled_trips + def remap_trip_ids(self, tnc_veh_trips, pooled_trips, tnc_trips): + # remap trip_i and trip_j back to original trip ids + trip_id_map = tnc_trips.set_index('trip_id').original_trip_id.to_dict() + + tnc_veh_trips['tnc_internal_trip_i'] = tnc_veh_trips["trip_i"] + tnc_veh_trips['tnc_internal_trip_j'] = tnc_veh_trips["trip_j"] + + tnc_veh_trips["trip_i"] = tnc_veh_trips["trip_i"].map(trip_id_map) + tnc_veh_trips["trip_j"] = tnc_veh_trips["trip_j"].map(trip_id_map) + + pooled_trips['tnc_internal_trip_i'] = pooled_trips["trip_i"] + pooled_trips['tnc_internal_trip_j'] = pooled_trips["trip_j"] + + pooled_trips["trip_i"] = pooled_trips["trip_i"].map(trip_id_map) + pooled_trips["trip_j"] = pooled_trips["trip_j"].map(trip_id_map) + def route_taxi_tncs(self): """Main function to route taxi and TNC trips, including pooling logic.""" # read in initial skim data @@ -1128,15 +1170,20 @@ def route_taxi_tncs(self): self.summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles, pooled_trips) + if "original_trip_id" in tnc_trips.columns: + self.remap_trip_ids(tnc_veh_trips, pooled_trips, tnc_trips) + tnc_veh_trips, pooled_trips = self.remap_skim_idx_to_zone( tnc_veh_trips, pooled_trips, tnc_trips ) tnc_veh_trips.to_csv( - os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv") + os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv"), + index=False ) pooled_trips.to_csv( - os.path.join(self.settings.output_dir, "output_tnc_pooled_trips.csv") + os.path.join(self.settings.output_dir, "output_tnc_pooled_trips.csv"), + index=False ) return tnc_veh_trips diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index 35a511b35..f066a9dc3 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -1,8 +1,14 @@ # path to activitysim output folder with trip data -asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +asim_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data +asim_demand_files: + - final_cbxtrips.parquet + - final_santrips.parquet + - final_trips.parquet + - final_trips_visitor.parquet + - final_trips_xborder.parquet # path to folder with skim data -skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +skim_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\input_data_full\skims # name of skim matrix in OMX file minus time period suffix skim_time_core: SOV_TR_H_TIME # time periods to process, should match network_los.yaml settings @@ -13,12 +19,28 @@ skim_files: ['traffic_skims_EA.omx', 'traffic_skims_AM.omx', 'traffic_skims_MD.o # skim_files: ['traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx'] # output folder for results -output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full +output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\outputs\tnc_routing_test # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: ['TNC_SHARED'] -single_tnc_modes: ['TNC_SINGLE', 'TAXI'] -# shared_tnc_modes: ['TNC_SHARED', 'TNC_SINGLE', 'TAXI'] +single_tnc_modes: + - 'TNC_SINGLE' + - 'TAXI' + - 'RIDEHAIL_LOC1' + - 'RIDEHAIL_LOC2' + - 'TAXI_LOC1' + - 'TAXI_LOC2' +# shared_tnc_modes: +# # - 'DRIVEALONE' +# # - 'SHARED2' +# - 'SHARED3' +# - 'TNC_SHARED' +# - 'TNC_SINGLE' +# - 'TAXI' +# - 'RIDEHAIL_LOC1' +# - 'RIDEHAIL_LOC2' +# - 'TAXI_LOC1' +# - 'TAXI_LOC2' # single_tnc_modes: [] # simulation time bin size (in mins) @@ -33,7 +55,7 @@ max_detour: 15 # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: refueling_stations # maximum time (in active travel mins) a vehicle can operate before refueling -max_refuel_time: 240 # 4 hours +max_refuel_time: 360 # 6 hours # numpy random seed for reproducibility random_seed: 42 \ No newline at end of file From 8322dc2d7fc552c32992dd01cb9a9920f1bdb9fc Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 14 Nov 2025 11:54:27 -0800 Subject: [PATCH 21/53] adding distance, batching, output id map, and bug fixes --- .../taxi_tnc_routing/taxi_tnc_routing.py | 247 +++++++++++------- 1 file changed, 148 insertions(+), 99 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index acb283c15..1f23dbda5 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -25,7 +25,8 @@ class TaxiTNCSettings(BaseModel): # path to folder with skim data skim_dir: str # name of skim matrix in OMX file minus time period suffix - skim_time_core: str = "SOV_TR_H_TIME" + skim_time_core: str = "HOV2_TR_H_TIME" + skim_dist_core: str = "HOV2_TR_H_DIST" skim_periods: list = ["EA", "AM", "MD", "PM", "EV"] # time periods to process periods: list = [0, 6, 12, 25, 32, 48] skim_files: list = [ @@ -48,14 +49,19 @@ class TaxiTNCSettings(BaseModel): # buffer size comparing origins and destinations for potential pooling (in mins) pooling_buffer: int = 10 + # batch size for matching pooled trips together and matching trips to vehicles + pair_batch_size: int = 6000 # maximum allowed detour time for pooled trips (in mins) max_detour: int = 15 # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: str = "refueling_stations" - # maximum time (in active travel mins) a vehicle can operate before refueling - max_refuel_time: int = 240 # 4 hours + # maximum distance (in miles) a vehicle can operate before refueling + max_refuel_dist: int = 300 + + # maximum initial wait time (in minutes) for a vehicle before a new vehicle is created + max_wait_time: int = 15 # numpy random seed for reproducibility random_seed: int = 42 @@ -111,7 +117,8 @@ def load_settings( class TaxiTNCRouter: def __init__(self, settings: TaxiTNCSettings): self.settings = settings - self.skim_data = None + self.skim_time = None + self.skim_dist = None self.skim_zone_mapping = None self.current_skim_time_period = None self.generate_time_table() @@ -168,14 +175,17 @@ def load_skim(omx_file, core): return skim, mapping # load new skim if no skim data currently exists or the skim is not for the current period - if self.skim_data is None or time_mismatch: + if self.skim_time is None or time_mismatch: self.current_skim_time_period = time_period skim_file = self.settings.skim_files[ self.settings.skim_periods.index(time_period) ] - self.skim_data, mapping = load_skim( + self.skim_time, mapping = load_skim( skim_file, self.settings.skim_time_core + "__" + time_period ) + self.skim_dist, mapping = load_skim( + skim_file, self.settings.skim_dist_core + "__" + time_period + ) assert ( self.skim_zone_mapping == mapping ) or self.skim_zone_mapping is None, "Zone mapping changed between skims" @@ -209,12 +219,12 @@ def read_input_data(self): df = pd.read_csv(fpath, usecols=base_cols) else: raise ValueError(f"Unsupported demand file type: {fpath}") - df['source_file'] = fname + df["source"] = fname.strip('.parquet').strip('.csv').strip('.csv.gz').strip('final_') if opt_col in df.columns: - df['trip_mode'] = df[opt_col] + df["trip_mode"] = df[opt_col] df.drop(columns=[opt_col], inplace=True) frames.append(df) - + trips = pd.concat(frames, ignore_index=True) trips = trips[ @@ -244,11 +254,13 @@ def read_input_data(self): trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) ) if trips.trip_id.is_unique is False: - trips['original_trip_id'] = trips['trip_id'] + trips["original_trip_id"] = trips["trip_id"] trips.reset_index(inplace=True, drop=True) - trips['trip_id'] = trips.index + trips["trip_id"] = trips.index + + id_mapping_df = trips[["trip_id", "original_trip_id", "source"]].copy() - return trips + return trips, id_mapping_df def sample_tnc_trip_simulation_time_bin(self, trips): # Create a new column for the time bin @@ -265,7 +277,7 @@ def sample_tnc_trip_simulation_time_bin(self, trips): return trips - def determine_potential_trip_pairs(self, trips): + def _determine_potential_trip_pairs(self, trips): # pre-filter trips for pooling # find pairs of trips that are within the same origin and destination buffer # Ensure indices are integer arrays and no NA @@ -273,9 +285,9 @@ def determine_potential_trip_pairs(self, trips): d_idx = trips["dskim_idx"].to_numpy(dtype=int) trip_ids = trips["trip_id"].to_numpy() - origin_proximity_mask = self.skim_data[o_idx, :] <= self.settings.pooling_buffer + origin_proximity_mask = self.skim_time[o_idx, :] <= self.settings.pooling_buffer destination_proximity_mask = ( - self.skim_data[d_idx, :] <= self.settings.pooling_buffer + self.skim_time[d_idx, :] <= self.settings.pooling_buffer ) # From your masks (shape: n_trips x n_zones), select only the columns for the trips’ zones @@ -299,8 +311,8 @@ def determine_potential_trip_pairs(self, trips): ) # include skim times for origins/destinations - o2o_time = self.skim_data[o_idx][:, o_idx] - d2d_time = self.skim_data[d_idx][:, d_idx] + o2o_time = self.skim_time[o_idx][:, o_idx] + d2d_time = self.skim_time[d_idx][:, d_idx] trip_pairs["origin_time"] = o2o_time[ii, jj] trip_pairs["dest_time"] = d2d_time[ii, jj] # also include the origin and destination skim idxs @@ -330,6 +342,29 @@ def determine_potential_trip_pairs(self, trips): ), on="trip_j", ) + + return trip_pairs + + def determine_potential_trip_pairs(self, trips): + """Wrapper around determining potential trip pairs to implement batching""" + + # break trips up into batches + trip_pairs_list = [] + n_trips = len(trips) + if n_trips == 0: + return self._determine_potential_trip_pairs(trips) + + batch_size = self.settings.pair_batch_size + for start_idx in range(0, n_trips, batch_size): + end_idx = min(start_idx + batch_size, n_trips) + trip_batch = trips.iloc[start_idx:end_idx] + logger.info( + f"\tProcessing trip batch {start_idx} to {end_idx} of {n_trips} trips" + ) + trip_pairs_batch = self._determine_potential_trip_pairs(trip_batch) + trip_pairs_list.append(trip_pairs_batch) + trip_pairs = pd.concat(trip_pairs_list, ignore_index=True) + return trip_pairs def determine_detour_times(self, trip_pairs): @@ -344,21 +379,21 @@ def determine_detour_times(self, trip_pairs): dj = trip_pairs["d_j_skim_idx"].to_numpy() # direct times - i_direct = self.skim_data[oi, di] - j_direct = self.skim_data[oj, dj] + i_direct = self.skim_time[oi, di] + j_direct = self.skim_time[oj, dj] # scenario totals t1 = ( - self.skim_data[oi, oj] + self.skim_data[oj, di] + self.skim_data[di, dj] + self.skim_time[oi, oj] + self.skim_time[oj, di] + self.skim_time[di, dj] ) # oi->oj->di->dj t2 = ( - self.skim_data[oj, oi] + self.skim_data[oi, dj] + self.skim_data[dj, di] + self.skim_time[oj, oi] + self.skim_time[oi, dj] + self.skim_time[dj, di] ) # oj->oi->dj->di t3 = ( - self.skim_data[oi, oj] + self.skim_data[oj, dj] + self.skim_data[dj, di] + self.skim_time[oi, oj] + self.skim_time[oj, dj] + self.skim_time[dj, di] ) # oi->oj->dj->di t4 = ( - self.skim_data[oj, oi] + self.skim_data[oi, di] + self.skim_data[di, dj] + self.skim_time[oj, oi] + self.skim_time[oi, di] + self.skim_time[di, dj] ) # oj->oi->di->dj # per-trip detours @@ -583,7 +618,7 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): "destination": "destination", } single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() - single_trips["total_ivt"] = self.skim_data[ + single_trips["total_ivt"] = self.skim_time[ single_trips.origin_skim_idx, single_trips.destination_skim_idx ] single_trips["detour_i"] = 0 @@ -600,7 +635,7 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): """ - Create new + Create new vehicles for trips that could not be matched to existing free vehicles """ idx_start_num = 0 if vehicles is None else vehicles.index.max() @@ -611,7 +646,7 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): "is_free": False, "last_refuel_time": -1, "next_time_free": np.nan, - "drive_time_since_refuel": 0, + "drive_dist_since_refuel": 0, }, index=idx_start_num + np.arange(1, len(trips_to_service) + 1), ) @@ -627,29 +662,15 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): return vehicles, trip_to_veh_map - def match_vehicles_to_trips(self, vehicles, full_trip_routes): - - if vehicles is not None: - free_vehicles = vehicles[vehicles.is_free].copy() - else: - free_vehicles = pd.DataFrame() - unserviced_trips = full_trip_routes.copy() - - trip_to_veh_map = pd.Series( - name="vehicle_id", - index=unserviced_trips.trip_i, - dtype=vehicles.index.dtype if vehicles is not None else "int64", - ) + def _match_vehicles_to_trips(self, free_vehicles, unserviced_trips, trip_to_veh_map): - # loop until all available vehicles are assigned or there are no more unserviced trips i = 0 while not (free_vehicles.empty or unserviced_trips.empty): - - veh_locations = free_vehicles.location_skim_idx.to_numpy() - trip_origins = unserviced_trips.origin_skim_idx.to_numpy() + trip_origins = unserviced_trips.origin_skim_idx.to_numpy().astype(int) + veh_locations = free_vehicles.location_skim_idx.to_numpy().astype(int) # find skim times between trip origins and all veh locations - skim_times = self.skim_data[trip_origins[:, None], veh_locations] + skim_times = self.skim_time[trip_origins[:, None], veh_locations] # grab the minimum time for each trip and vehicle min_times = skim_times.min(axis=1) @@ -662,7 +683,7 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): # trips with a min wait time larger than the maximum allowed are removed from pool # ties are given to the first trip as given by trip_id - time_gt_max_wait = min_times > 15 + time_gt_max_wait = min_times > self.settings.max_wait_time trip_to_veh_map.loc[unserviced_trips.trip_i[time_gt_max_wait]] = np.nan ties_mask = ( trip_to_veh_map.duplicated(keep="first") & trip_to_veh_map.notna() @@ -678,9 +699,39 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): ~free_vehicles.index.isin(serviced_trips.values) ] - i += 1 if i > 10000: + # making sure we never get stuck in an infinite loop raise RuntimeError("Exceeded maximum iterations for vehicle matching") + + return free_vehicles, unserviced_trips, trip_to_veh_map + + + def match_vehicles_to_trips(self, vehicles, full_trip_routes): + if vehicles is not None: + free_vehicles = vehicles[vehicles.is_free].copy() + else: + free_vehicles = pd.DataFrame() + unserviced_trips = full_trip_routes.copy() + + trip_to_veh_map = pd.Series( + name="vehicle_id", + index=unserviced_trips.trip_i, + dtype=vehicles.index.dtype if vehicles is not None else "int64", + ) + + # loop until all available vehicles are assigned or there are no more unserviced trips + batch_size = self.settings.pair_batch_size + matched_trip_count = 0 + logger.info(f"\tStarting vehicle to trip matching with {len(free_vehicles)} free vehicles and {len(unserviced_trips)} unserviced trips in trip batches of {batch_size}") + for i in range(0, len(unserviced_trips), batch_size): + if free_vehicles.empty: + break + unserviced_trips_block = unserviced_trips.iloc[i : i + batch_size] + free_vehicles, unserviced_trips_block, trip_to_veh_map = self._match_vehicles_to_trips( + free_vehicles, unserviced_trips_block, trip_to_veh_map + ) + logger.info(f"\t Iteration {i}: Matched {trip_to_veh_map.notna().sum() - matched_trip_count} trips to vehicles") + matched_trip_count = trip_to_veh_map.notna().sum() if trip_to_veh_map.isna().any(): # create new vehicles for those still unmatched @@ -827,21 +878,24 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): ] = np.nan # determine time bin of each trip - new_v_trips["OD_time"] = self.skim_data[ + new_v_trips["OD_time"] = self.skim_time[ new_v_trips.origin_skim_idx.to_numpy(), new_v_trips.destination_skim_idx.to_numpy(), ] - new_v_trips["cumulative_trip_time"] = new_v_trips.groupby("vehicle_id")[ - "OD_time" - ].cumsum() + cumulative_trip_time = new_v_trips.groupby("vehicle_id")["OD_time"].cumsum() new_v_trips["depart_bin"] = ( full_trip_routes.time_bin.mode()[0] - + (new_v_trips["cumulative_trip_time"] - new_v_trips["OD_time"]) // 15 + + (cumulative_trip_time - new_v_trips["OD_time"]) // 15 ) new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( - new_v_trips["cumulative_trip_time"] // 15 + cumulative_trip_time // 15 ) + new_v_trips['OD_dist'] = self.skim_dist[ + new_v_trips.origin_skim_idx.to_numpy(), + new_v_trips.destination_skim_idx.to_numpy(), + ] + assert ( new_v_trips.depart_bin <= new_v_trips.arrival_bin ).all(), f"Departure bin must be less than or equal to arrival bin {new_v_trips[new_v_trips.depart_bin > new_v_trips.arrival_bin]}" @@ -882,23 +936,23 @@ def update_vehicle_fleet( vehicles.loc[final_veh_location.index, "location"] = final_veh_location tot_drive_time = vehicle_trips_i.groupby("vehicle_id").OD_time.sum() - vehicles.loc[tot_drive_time.index, "drive_time_since_refuel"] += tot_drive_time + vehicles.loc[tot_drive_time.index, "drive_dist_since_refuel"] += tot_drive_time # updating fleet with refueled vehicles if refuel_veh_trips_i is not None: vehicles.loc[ - refuel_veh_trips_i.index, "last_refuel_time" + refuel_veh_trips_i.vehicle_id, "last_refuel_time" ] = refuel_veh_trips_i.arrival_bin - vehicles.loc[refuel_veh_trips_i.index, "drive_time_since_refuel"] = 0 - vehicles.loc[refuel_veh_trips_i.index, "is_free"] = False - vehicles.loc[refuel_veh_trips_i.index, "next_time_free"] = ( + vehicles.loc[refuel_veh_trips_i.vehicle_id, "drive_dist_since_refuel"] = 0 + vehicles.loc[refuel_veh_trips_i.vehicle_id, "is_free"] = False + vehicles.loc[refuel_veh_trips_i.vehicle_id, "next_time_free"] = ( refuel_veh_trips_i.arrival_bin + 1 ) vehicles.loc[ - refuel_veh_trips_i.index, "location_skim_idx" + refuel_veh_trips_i.vehicle_id, "location_skim_idx" ] = refuel_veh_trips_i.destination_skim_idx vehicles.loc[ - refuel_veh_trips_i.index, "location" + refuel_veh_trips_i.vehicle_id, "location" ] = refuel_veh_trips_i.destination return vehicles @@ -971,14 +1025,14 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): # updated drive time drive_time_from_trips_in_bin = vehicle_trips_i.groupby( "vehicle_id" - ).OD_time.sum() + ).OD_dist.sum() tot_drive_time = ( drive_time_from_trips_in_bin + vehicles.loc[ - drive_time_from_trips_in_bin.index, "drive_time_since_refuel" + drive_time_from_trips_in_bin.index, "drive_dist_since_refuel" ] ) - needs_refuel = tot_drive_time > self.settings.max_refuel_time + needs_refuel = tot_drive_time > self.settings.max_refuel_dist if not needs_refuel.any(): return None @@ -1002,7 +1056,7 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): refuel_stations_idx = refuel_stations_taz.map(self.skim_zone_mapping).to_numpy() # find skim times between trip origins and all veh locations - skim_times = self.skim_data[ + skim_times = self.skim_time[ np.ix_(vehs_to_refuel.destination_skim_idx.to_numpy(), refuel_stations_idx) ] @@ -1020,7 +1074,7 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): # create refuel vehicle trips refuel_veh_trips = pd.DataFrame( { - "vehicle_id": vehs_to_refuel.index, + "vehicle_id": vehs_to_refuel.vehicle_id, "trip_i": np.nan, "trip_j": np.nan, "scenario": -1, @@ -1031,7 +1085,7 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): "destination": nearest_station_maz, "servicing_trip_id": np.nan, "OD_time": min_times, - "cumulative_trip_time": min_times, + "OD_dist": self.skim_dist[vehs_to_refuel.destination_skim_idx.to_numpy(), nearest_station_skim_idx], "depart_bin": vehs_to_refuel.arrival_bin, # start refuel trip right after last trip "arrival_bin": vehs_to_refuel.arrival_bin + np.ceil(min_times / self.settings.time_bin_size).astype( @@ -1039,7 +1093,7 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): ), # assuming refuel trip takes the time to get to the station "trip_type": "refuel", } - ).set_index("vehicle_id") + ) logger.info(f"\tRouting {len(refuel_veh_trips)} vehicles to refuel stations") return refuel_veh_trips @@ -1092,22 +1146,22 @@ def remap_skim_idx_to_zone(self, tnc_veh_trips, pooled_trips, tnc_trips): ) return tnc_veh_trips, pooled_trips + + def write_outputs(self, tnc_veh_trips, pooled_trips, id_mapping_df): + """Write final tables to output folder""" + tnc_veh_trips.to_csv( + os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv"), + index=True, + ) + pooled_trips.to_csv( + os.path.join(self.settings.output_dir, "output_tnc_pooled_trips.csv"), + index=False, + ) - def remap_trip_ids(self, tnc_veh_trips, pooled_trips, tnc_trips): - # remap trip_i and trip_j back to original trip ids - trip_id_map = tnc_trips.set_index('trip_id').original_trip_id.to_dict() - - tnc_veh_trips['tnc_internal_trip_i'] = tnc_veh_trips["trip_i"] - tnc_veh_trips['tnc_internal_trip_j'] = tnc_veh_trips["trip_j"] - - tnc_veh_trips["trip_i"] = tnc_veh_trips["trip_i"].map(trip_id_map) - tnc_veh_trips["trip_j"] = tnc_veh_trips["trip_j"].map(trip_id_map) - - pooled_trips['tnc_internal_trip_i'] = pooled_trips["trip_i"] - pooled_trips['tnc_internal_trip_j'] = pooled_trips["trip_j"] - - pooled_trips["trip_i"] = pooled_trips["trip_i"].map(trip_id_map) - pooled_trips["trip_j"] = pooled_trips["trip_j"].map(trip_id_map) + id_mapping_df.to_csv( + os.path.join(self.settings.output_dir, "tnc_trip_id_mapping.csv"), + index=False, + ) def route_taxi_tncs(self): """Main function to route taxi and TNC trips, including pooling logic.""" @@ -1115,7 +1169,7 @@ def route_taxi_tncs(self): self.read_skim_data(0) # read in taxi / tnc trip data - tnc_trips = self.read_input_data() + tnc_trips, id_mapping_df = self.read_input_data() tnc_trips = self.sample_tnc_trip_simulation_time_bin(tnc_trips) # initialize vehicle fleet @@ -1128,11 +1182,10 @@ def route_taxi_tncs(self): logger.info( f"Processing time bin {time_bin} with {len(tnc_trips_i)} taxi / tnc trips:" ) - trip_pairs = self.determine_potential_trip_pairs( - tnc_trips_i[ - tnc_trips_i.trip_mode.isin(self.settings.shared_tnc_modes) - ].copy() - ) + shared_tnc_trips = tnc_trips_i[ + tnc_trips_i.trip_mode.isin(self.settings.shared_tnc_modes) + ] + trip_pairs = self.determine_potential_trip_pairs(shared_tnc_trips.copy()) trip_pairs = self.determine_detour_times(trip_pairs) @@ -1166,25 +1219,21 @@ def route_taxi_tncs(self): ) tnc_veh_trips = pd.concat(veh_trips) + tnc_veh_trips["vehicle_trip_id"] = ( + tnc_veh_trips.vehicle_id * 1000 + + tnc_veh_trips.groupby("vehicle_id").cumcount() + + 1 + ) + tnc_veh_trips.set_index("vehicle_trip_id", inplace=True) pooled_trips = pd.concat(pooling_trips) self.summarize_tnc_trips(tnc_veh_trips, tnc_trips, vehicles, pooled_trips) - if "original_trip_id" in tnc_trips.columns: - self.remap_trip_ids(tnc_veh_trips, pooled_trips, tnc_trips) - tnc_veh_trips, pooled_trips = self.remap_skim_idx_to_zone( tnc_veh_trips, pooled_trips, tnc_trips ) - tnc_veh_trips.to_csv( - os.path.join(self.settings.output_dir, "output_tnc_vehicle_trips.csv"), - index=False - ) - pooled_trips.to_csv( - os.path.join(self.settings.output_dir, "output_tnc_pooled_trips.csv"), - index=False - ) + self.write_outputs(tnc_veh_trips, pooled_trips, id_mapping_df) return tnc_veh_trips @@ -1198,4 +1247,4 @@ def route_taxi_tncs(self): router.route_taxi_tncs() elapsed_time = time.time() - start_time - logger.info(f"Time to complete: {elapsed_time:.2f} seconds") + logger.info(f"Time to complete: {elapsed_time:.2f} seconds = {elapsed_time/60:.2f} minutes") From 60dd25cd3aaf53f2f57f6579eeb62435c3bfbc6b Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 14 Nov 2025 12:37:49 -0800 Subject: [PATCH 22/53] taxi tnc settings yaml update --- .../taxi_tnc_routing_settings.yaml | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index f066a9dc3..1d88829c0 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -1,5 +1,15 @@ # path to activitysim output folder with trip data asim_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data +# asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +# path to folder with skim data +skim_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\input_data_full\skims +# skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +# output folder for results +output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\outputs\tnc_routing_test +# output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full + +# demand files to process from activitysim output directory +# accepts both csv and parquet formats asim_demand_files: - final_cbxtrips.parquet - final_santrips.parquet @@ -7,10 +17,9 @@ asim_demand_files: - final_trips_visitor.parquet - final_trips_xborder.parquet -# path to folder with skim data -skim_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\input_data_full\skims # name of skim matrix in OMX file minus time period suffix -skim_time_core: SOV_TR_H_TIME +skim_time_core: HOV2_H_TIME +skim_dist_core: HOV2_H_DIST # time periods to process, should match network_los.yaml settings skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] # skim_periods: ['AM', 'AM', 'AM', 'AM', 'AM'] @@ -18,9 +27,6 @@ periods: [0, 6, 12, 25, 32, 48] skim_files: ['traffic_skims_EA.omx', 'traffic_skims_AM.omx', 'traffic_skims_MD.omx', 'traffic_skims_PM.omx', 'traffic_skims_EV.omx'] # skim_files: ['traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx'] -# output folder for results -output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\outputs\tnc_routing_test - # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: ['TNC_SHARED'] single_tnc_modes: @@ -54,8 +60,8 @@ max_detour: 15 # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: refueling_stations -# maximum time (in active travel mins) a vehicle can operate before refueling -max_refuel_time: 360 # 6 hours +# maximum distance (in miles) a vehicle can operate before refueling +max_refuel_dist: 300 # numpy random seed for reproducibility random_seed: 42 \ No newline at end of file From 38eaae2316a0f377f21b02aa80533a13af5669e1 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 14 Nov 2025 12:39:12 -0800 Subject: [PATCH 23/53] formatting --- .../taxi_tnc_routing/taxi_tnc_routing.py | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 1f23dbda5..1e4542d80 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -219,7 +219,9 @@ def read_input_data(self): df = pd.read_csv(fpath, usecols=base_cols) else: raise ValueError(f"Unsupported demand file type: {fpath}") - df["source"] = fname.strip('.parquet').strip('.csv').strip('.csv.gz').strip('final_') + df["source"] = ( + fname.strip(".parquet").strip(".csv").strip(".csv.gz").strip("final_") + ) if opt_col in df.columns: df["trip_mode"] = df[opt_col] df.drop(columns=[opt_col], inplace=True) @@ -257,7 +259,7 @@ def read_input_data(self): trips["original_trip_id"] = trips["trip_id"] trips.reset_index(inplace=True, drop=True) trips["trip_id"] = trips.index - + id_mapping_df = trips[["trip_id", "original_trip_id", "source"]].copy() return trips, id_mapping_df @@ -662,7 +664,9 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): return vehicles, trip_to_veh_map - def _match_vehicles_to_trips(self, free_vehicles, unserviced_trips, trip_to_veh_map): + def _match_vehicles_to_trips( + self, free_vehicles, unserviced_trips, trip_to_veh_map + ): i = 0 while not (free_vehicles.empty or unserviced_trips.empty): @@ -702,9 +706,8 @@ def _match_vehicles_to_trips(self, free_vehicles, unserviced_trips, trip_to_veh_ if i > 10000: # making sure we never get stuck in an infinite loop raise RuntimeError("Exceeded maximum iterations for vehicle matching") - - return free_vehicles, unserviced_trips, trip_to_veh_map + return free_vehicles, unserviced_trips, trip_to_veh_map def match_vehicles_to_trips(self, vehicles, full_trip_routes): if vehicles is not None: @@ -722,15 +725,23 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): # loop until all available vehicles are assigned or there are no more unserviced trips batch_size = self.settings.pair_batch_size matched_trip_count = 0 - logger.info(f"\tStarting vehicle to trip matching with {len(free_vehicles)} free vehicles and {len(unserviced_trips)} unserviced trips in trip batches of {batch_size}") + logger.info( + f"\tStarting vehicle to trip matching with {len(free_vehicles)} free vehicles and {len(unserviced_trips)} unserviced trips in trip batches of {batch_size}" + ) for i in range(0, len(unserviced_trips), batch_size): if free_vehicles.empty: break unserviced_trips_block = unserviced_trips.iloc[i : i + batch_size] - free_vehicles, unserviced_trips_block, trip_to_veh_map = self._match_vehicles_to_trips( + ( + free_vehicles, + unserviced_trips_block, + trip_to_veh_map, + ) = self._match_vehicles_to_trips( free_vehicles, unserviced_trips_block, trip_to_veh_map ) - logger.info(f"\t Iteration {i}: Matched {trip_to_veh_map.notna().sum() - matched_trip_count} trips to vehicles") + logger.info( + f"\t Iteration {i}: Matched {trip_to_veh_map.notna().sum() - matched_trip_count} trips to vehicles" + ) matched_trip_count = trip_to_veh_map.notna().sum() if trip_to_veh_map.isna().any(): @@ -891,7 +902,7 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): cumulative_trip_time // 15 ) - new_v_trips['OD_dist'] = self.skim_dist[ + new_v_trips["OD_dist"] = self.skim_dist[ new_v_trips.origin_skim_idx.to_numpy(), new_v_trips.destination_skim_idx.to_numpy(), ] @@ -1085,7 +1096,10 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): "destination": nearest_station_maz, "servicing_trip_id": np.nan, "OD_time": min_times, - "OD_dist": self.skim_dist[vehs_to_refuel.destination_skim_idx.to_numpy(), nearest_station_skim_idx], + "OD_dist": self.skim_dist[ + vehs_to_refuel.destination_skim_idx.to_numpy(), + nearest_station_skim_idx, + ], "depart_bin": vehs_to_refuel.arrival_bin, # start refuel trip right after last trip "arrival_bin": vehs_to_refuel.arrival_bin + np.ceil(min_times / self.settings.time_bin_size).astype( @@ -1146,7 +1160,7 @@ def remap_skim_idx_to_zone(self, tnc_veh_trips, pooled_trips, tnc_trips): ) return tnc_veh_trips, pooled_trips - + def write_outputs(self, tnc_veh_trips, pooled_trips, id_mapping_df): """Write final tables to output folder""" tnc_veh_trips.to_csv( @@ -1247,4 +1261,6 @@ def route_taxi_tncs(self): router.route_taxi_tncs() elapsed_time = time.time() - start_time - logger.info(f"Time to complete: {elapsed_time:.2f} seconds = {elapsed_time/60:.2f} minutes") + logger.info( + f"Time to complete: {elapsed_time:.2f} seconds = {elapsed_time/60:.2f} minutes" + ) From 2d1b8f1411366b8c66e121e85aff8402ecd5154c Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 17 Nov 2025 10:42:15 -0800 Subject: [PATCH 24/53] adding vehicle occupancy --- .../taxi_tnc_routing/taxi_tnc_routing.py | 88 ++++++++++++++++--- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 1e4542d80..908c97e95 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -55,6 +55,9 @@ class TaxiTNCSettings(BaseModel): # maximum allowed detour time for pooled trips (in mins) max_detour: int = 15 + # maximum vehicle occupancy per trip record + max_vehicle_occupancy: int | None = 4 + # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: str = "refueling_stations" # maximum distance (in miles) a vehicle can operate before refueling @@ -199,7 +202,7 @@ def load_skim(omx_file, core): def read_input_data(self): # Read the data from the OpenMatrix file # Convert the data to a pandas DataFrame - base_cols = ["trip_id", "trip_mode", "depart", "origin", "destination"] + base_cols = ["trip_id", "trip_mode", "depart", "origin", "destination", "tour_participants"] opt_col = "arrival_mode" frames = [] for fname in self.settings.asim_demand_files: @@ -255,10 +258,26 @@ def read_input_data(self): trips["dskim_idx"] = ( trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) ) - if trips.trip_id.is_unique is False: - trips["original_trip_id"] = trips["trip_id"] - trips.reset_index(inplace=True, drop=True) - trips["trip_id"] = trips.index + trips['occupancy'] = trips['tour_participants'] + if self.settings.max_vehicle_occupancy: + total_occupants = trips.occupancy.sum() + # duplicate trip rows that are over max_occupancy + n_splits = np.ceil(trips['occupancy'] / self.settings.max_vehicle_occupancy) + trips = trips.loc[trips.index.repeat(n_splits)] + + # split occupants evenly among the new rows + split_num = trips.groupby(level=0).cumcount() + base = trips['occupancy'] // n_splits + remainder = trips['occupancy'] % n_splits + trips['occupancy'] = base + (split_num < remainder).astype(int) + + # make sure all people are accounted for + assert trips.occupancy.sum() == total_occupants, "Not all occupants are accounted for!" + + + trips["original_trip_id"] = trips["trip_id"] + trips.reset_index(inplace=True, drop=True) + trips["trip_id"] = trips.index id_mapping_df = trips[["trip_id", "original_trip_id", "source"]].copy() @@ -317,10 +336,10 @@ def _determine_potential_trip_pairs(self, trips): d2d_time = self.skim_time[d_idx][:, d_idx] trip_pairs["origin_time"] = o2o_time[ii, jj] trip_pairs["dest_time"] = d2d_time[ii, jj] - # also include the origin and destination skim idxs - # create maps from trip id to origin and to destination + + # also include the origin and destination skim idxs, plus occupancy for capacity checks lookup = trips.loc[ - :, ["trip_id", "oskim_idx", "dskim_idx", "origin", "destination"] + :, ["trip_id", "oskim_idx", "dskim_idx", "origin", "destination", "occupancy"] ].set_index("trip_id") trip_pairs = trip_pairs.join( @@ -330,6 +349,7 @@ def _determine_potential_trip_pairs(self, trips): "dskim_idx": "d_i_skim_idx", "origin": "origin_i", "destination": "destination_i", + "occupancy": "occupancy_i", } ), on="trip_i", @@ -340,11 +360,23 @@ def _determine_potential_trip_pairs(self, trips): "dskim_idx": "d_j_skim_idx", "origin": "origin_j", "destination": "destination_j", + "occupancy": "occupancy_j", } ), on="trip_j", ) + # Ensure total occupancy across the pair does not exceed the max allowed (if set) + max_occ = self.settings.max_vehicle_occupancy + if max_occ is not None: + occ_ok = (trip_pairs["occupancy_i"] + trip_pairs["occupancy_j"]) <= max_occ + dropped = (~occ_ok).sum() + if dropped > 0: + logger.info( + f"\tDropped {dropped} trip pairs exceeding max occupancy ({max_occ}); kept {occ_ok.sum()}" + ) + trip_pairs = trip_pairs.loc[occ_ok].copy() + return trip_pairs def determine_potential_trip_pairs(self, trips): @@ -554,7 +586,7 @@ def select_mutual_best_recursive(self, trip_pairs: pd.DataFrame) -> pd.DataFrame def create_trip_routes(self, trip_matches): trips_routed = trip_matches[ - ["trip_i", "trip_j", "total_ivt", "route_scenario", "detour_i", "detour_j"] + ["trip_i", "trip_j", "total_ivt", "route_scenario", "detour_i", "detour_j", 'occupancy_i', 'occupancy_j'] ].copy() s1_idx = [0, 1, 2, 3] # oi->oj->di->dj @@ -618,6 +650,7 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): "dskim_idx": "destination_skim_idx", "origin": "origin", "destination": "destination", + "occupancy": "occupancy_i", } single_trips = tnc_trips[mask][cols.keys()].rename(columns=cols).copy() single_trips["total_ivt"] = self.skim_time[ @@ -731,18 +764,25 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): for i in range(0, len(unserviced_trips), batch_size): if free_vehicles.empty: break + # limiting the number of trips and vehicle combos for run time + # allowing twice the number of free vehicles as trips unserviced_trips_block = unserviced_trips.iloc[i : i + batch_size] + free_vehicles_block = free_vehicles.iloc[: 2 * batch_size] + ( - free_vehicles, + free_vehicles_block, unserviced_trips_block, trip_to_veh_map, ) = self._match_vehicles_to_trips( - free_vehicles, unserviced_trips_block, trip_to_veh_map + free_vehicles_block, unserviced_trips_block, trip_to_veh_map ) logger.info( f"\t Iteration {i}: Matched {trip_to_veh_map.notna().sum() - matched_trip_count} trips to vehicles" ) matched_trip_count = trip_to_veh_map.notna().sum() + free_vehicles = free_vehicles.loc[ + ~free_vehicles.index.isin(trip_to_veh_map) + ] if trip_to_veh_map.isna().any(): # create new vehicles for those still unmatched @@ -921,6 +961,18 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): return new_v_trips, full_trip_routes + def calculate_occupancy(self, vehicle_trips_i, tnc_trips_i): + """Calculating occupancy for each vehicle trip based on the trips being served""" + trip_occ_map = tnc_trips_i.set_index("trip_id")["occupancy"] + + # occupancy of the vehicle trips is the sum of occupancy across trips + trip_i_occ = vehicle_trips_i.trip_i.map(trip_occ_map).fillna(0) + trip_j_occ = vehicle_trips_i.trip_j.map(trip_occ_map).fillna(0) + + vehicle_trips_i['occupancy'] = trip_i_occ + trip_j_occ + + return vehicle_trips_i + def update_vehicle_fleet( self, vehicles, vehicle_trips_i, time_bin, refuel_veh_trips_i ): @@ -1002,9 +1054,6 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): logger.info( f"Percentage of deadhead vehicle trips: {tnc_veh_trips.is_deadhead.mean() * 100:.2f}%" ) - tnc_veh_trips["occupancy"] = ( - tnc_veh_trips[["trip_i", "trip_j"]].notna().sum(axis=1) - ) logger.info( f"Average occupancy of all vehicle trips: {tnc_veh_trips.occupancy.mean():.2f}" ) @@ -1012,6 +1061,16 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): logger.info( f"Total number of refuel trips: {num_refuel_trips} = {(num_refuel_trips / len(tnc_veh_trips) * 100):.2f}% of all vehicle trips" ) + total_vmt = tnc_veh_trips.OD_dist.sum() + logger.info(f"Total VMT from TNC Vehicle Trips: {total_vmt:.2f} miles") + deadhead_vmt = tnc_veh_trips[tnc_veh_trips.is_deadhead].OD_dist.sum() + logger.info(f"Total Deadhead VMT: {deadhead_vmt:.2f} miles") + pct_deadhead_vmt = (deadhead_vmt / total_vmt) * 100 if total_vmt > 0 else 0 + logger.info(f"Percentage of Deadhead VMT: {pct_deadhead_vmt:.2f}%") + + weighted_occ = tnc_veh_trips.occupancy * tnc_veh_trips.OD_dist + avg_weighted_occ = (weighted_occ.sum() / tnc_veh_trips.OD_dist.sum()) if tnc_veh_trips.OD_dist.sum() > 0 else 0 + logger.info(f"Average occupancy weighted by VMT: {avg_weighted_occ:.2f}") # also performing consistency checks on the outputs assert ( @@ -1219,6 +1278,7 @@ def route_taxi_tncs(self): vehicle_trips_i, full_trip_routes = self.create_vehicle_trips( full_trip_routes, vehicles, trip_to_veh_map ) + vehicle_trips_i = self.calculate_occupancy(vehicle_trips_i, tnc_trips_i) veh_trips.append(vehicle_trips_i) pooling_trips.append(full_trip_routes) From 78958628237144bd0119618df9990f35ec03d7f3 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 24 Nov 2025 08:43:39 -0800 Subject: [PATCH 25/53] removing unnecessary dummy coefficients --- src/asim/configs/resident/av_repositioning.csv | 1 - src/asim/configs/resident/av_trip_matching.csv | 1 - src/asim/configs/resident/av_trip_matching_preprocessor.csv | 2 +- src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 815f3827d..28fa09c34 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -1,5 +1,4 @@ Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 -util_dummy_1,Dummy variable 1,1,1,1,1,1,1,1 # stay with person utils,,,,,,,, util_cost_of_parking,Cost of parking at destination,parkingCost,coef_cost,,,,, util_time_stay,Stay- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",coef_ivt,,,,, diff --git a/src/asim/configs/resident/av_trip_matching.csv b/src/asim/configs/resident/av_trip_matching.csv index c775e3442..18e14dc87 100644 --- a/src/asim/configs/resident/av_trip_matching.csv +++ b/src/asim/configs/resident/av_trip_matching.csv @@ -1,5 +1,4 @@ Label,Description,Expression,coefficient -util_dummy_1,Dummy variable 1,1,coef_one util_veh_to_trip_origin_time,Time veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, veho_tripo_t_skims['SOV_TR_L_TIME'])",coef_ivt util_veh_to_trip_origin_cost,cost veh to trip origin,"@np.where((df.veh_location == df.origin) | (df.veh_location < 0) | (df.origin < 0), 0, (df.auto_operating_cost * veho_tripo_t_skims['SOV_TR_L_DIST']) + veho_tripo_t_skims['SOV_TR_L_TOLLCOST'])",coef_cost # *14 multiplier to convert from ivt to reliability as used in abm2+ uec,,, diff --git a/src/asim/configs/resident/av_trip_matching_preprocessor.csv b/src/asim/configs/resident/av_trip_matching_preprocessor.csv index 3cbe8cca7..29e1d7fc6 100644 --- a/src/asim/configs/resident/av_trip_matching_preprocessor.csv +++ b/src/asim/configs/resident/av_trip_matching_preprocessor.csv @@ -1,4 +1,4 @@ Description,Target,Expression next trip start time,next_depart,df['trip_id'].map(trips.groupby('tour_id')['depart'].shift(-1).to_dict()) -trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" +trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) * 2" duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 908c97e95..a53a7e3c0 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -707,7 +707,7 @@ def _match_vehicles_to_trips( veh_locations = free_vehicles.location_skim_idx.to_numpy().astype(int) # find skim times between trip origins and all veh locations - skim_times = self.skim_time[trip_origins[:, None], veh_locations] + skim_times = self.skim_time[veh_locations, trip_origins[:, None]] # grab the minimum time for each trip and vehicle min_times = skim_times.min(axis=1) From 2d0e28c64c3b92eb77a6d00fb8013aacc8c5e933 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 24 Nov 2025 15:16:29 -0800 Subject: [PATCH 26/53] Adding docstrings --- .../taxi_tnc_routing/taxi_tnc_routing.py | 510 +++++++++++++++++- 1 file changed, 492 insertions(+), 18 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index a53a7e3c0..02a8eb383 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -9,10 +9,6 @@ logger = logging.getLogger(__name__) -# input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full" -# input_folder = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\test" - - class TaxiTNCSettings(BaseModel): """ Taxi / TNC route choice settings @@ -71,11 +67,36 @@ class TaxiTNCSettings(BaseModel): @property def period_time_bin_minutes(self) -> int: + """ + Calculate the number of minutes per period time bin. + + Returns the integer number of minutes in each period bin by dividing + total daily minutes (1440) by the maximum period index. This property + remains constant regardless of changes to the periods list structure. + + Returns + ------- + int + Minutes per period time bin. + """ # minutes per (max period index); unchanged if periods list changes return (24 * 60) // max(self.periods) @model_validator(mode="after") def check_skim_periods(self): + """ + Validate consistency between skim_periods, periods, and skim_files configuration. + + Ensures that the number of skim periods is exactly one less than the + number of periods, and that the number of skim files matches the number + of skim periods. This validation is performed after model initialization. + + Returns + ------- + self + The validated TaxiTNCSettings instance. + + """ if len(self.skim_periods) != len(self.periods) - 1: raise ValueError( "Length of skim_periods must be one less than length of periods" @@ -88,6 +109,23 @@ def check_skim_periods(self): def load_settings( yaml_path: str = "taxi_tnc_routing_settings.yaml", ) -> TaxiTNCSettings: + """ + Load TNC routing settings from a YAML configuration file. + + Reads and validates the configuration using the TaxiTNCSettings Pydantic + model, ensuring all required fields are present and properly typed. Creates + the output directory if it doesn't exist and sets up logging. + + Parameters + ---------- + yaml_path : str + Path to the YAML settings file (relative to this module's directory). + + Returns + ------- + TaxiTNCSettings + Validated settings object containing all TNC routing configuration. + """ with open(os.path.join(os.path.dirname(__file__), yaml_path), "r") as f: data = yaml.safe_load(f) try: @@ -119,6 +157,14 @@ def load_settings( class TaxiTNCRouter: def __init__(self, settings: TaxiTNCSettings): + """ + Initialize the TNC router with validated settings. + + Parameters + ---------- + settings : TaxiTNCSettings + Validated configuration object containing all TNC routing parameters. + """ self.settings = settings self.skim_time = None self.skim_dist = None @@ -127,6 +173,21 @@ def __init__(self, settings: TaxiTNCSettings): self.generate_time_table() def generate_time_table(self): + """ + Generate a lookup table mapping time bins to clock time and ActivitySim periods. + + Creates a DataFrame indexed by time_bin with columns for hour, minute, + period (EA/AM/MD/PM/EV), and depart_bin (1-48 half-hour periods starting + at 3 AM). All times are offset by 3 hours to match ActivitySim convention. + + The table is cached in self.time_bin_table for repeated lookups during + simulation. + + Returns + ------- + None + Sets self.time_bin_table in place. + """ # Build and cache a time-bin lookup table on self: # index: time_bin; cols: hour, minute, period (EA/AM/MD/PM/EV), depart_bin (1..48 starting at 3 AM) minutes_per_bin = int(self.settings.time_bin_size) @@ -165,6 +226,24 @@ def generate_time_table(self): return def read_skim_data(self, time_bin): + """ + Load or update skim matrices for the current time bin's period. + + Reads time and distance skims from OMX files only when the time period + changes. Caches skims in memory to avoid redundant I/O. Validates that + zone mappings remain consistent across all skim files. + + Parameters + ---------- + time_bin : int + The time bin for which to load skim data. + + Returns + ------- + None + Updates self.skim_time, self.skim_dist, and self.skim_zone_mapping + in place. + """ # current period of the time_bin time_period = self.time_bin_table.loc[time_bin, "period"] time_mismatch = self.current_skim_time_period != time_period @@ -200,6 +279,22 @@ def load_skim(omx_file, core): return def read_input_data(self): + """ + Load TNC trip demand from ActivitySim output files. + + Reads trip tables (parquet or CSV) from the ActivitySim output directory, + filters for TNC modes, and prepares data for routing. Loads land use data + to create MAZ-to-TAZ mappings and skim zone lookups. Optionally splits + trips with occupancy exceeding max_vehicle_occupancy into multiple trips. + + Returns + ------- + pd.DataFrame + TNC trips with columns: trip_id, trip_mode, depart, origin, destination, + tour_participants, occupancy, origin_skim_idx, dest_skim_idx, and + optionally arrival_mode. + + """ # Read the data from the OpenMatrix file # Convert the data to a pandas DataFrame base_cols = ["trip_id", "trip_mode", "depart", "origin", "destination", "tour_participants"] @@ -284,6 +379,25 @@ def read_input_data(self): return trips, id_mapping_df def sample_tnc_trip_simulation_time_bin(self, trips): + """ + Assign fine-grained simulation time bins to TNC trips. + + Converts ActivitySim half-hour departure periods to continuous minute + values by sampling uniformly within each period, then bins into the + configured time_bin_size. This provides higher temporal resolution for + vehicle scheduling. + + Parameters + ---------- + trips : pd.DataFrame + Trip table with 'depart' column (ActivitySim half-hour periods, + 1-indexed). + + Returns + ------- + pd.DataFrame + Input trips with added 'time_in_mins' and 'time_bin' columns. + """ # Create a new column for the time bin # Convert departure time to mins, sampling within the half hour # Then bin into the bin size (supplied in mins) @@ -299,6 +413,28 @@ def sample_tnc_trip_simulation_time_bin(self, trips): return trips def _determine_potential_trip_pairs(self, trips): + """ + Identify candidate trip pairs for pooled service based on proximity. + + Finds all pairs of trips where both origin-to-origin AND destination-to-destination + travel times are within the pooling_buffer. Also enforces occupancy constraints if + max_vehicle_occupancy is set. + + The function creates upper-triangular pairs (i < j) to avoid duplicates and + includes origin/destination skim times for use in detour calculations. + + Parameters: + trips: DataFrame of trips within a single time bin, with columns: + trip_id, oskim_idx, dskim_idx, origin, destination, occupancy. + + Returns: + DataFrame with columns: + - trip_i, trip_j: Trip IDs forming the pair + - origin_time, dest_time: Skim times between origins and destinations + - o_i_skim_idx, d_i_skim_idx, origin_i, destination_i, occupancy_i: Trip i attributes + - o_j_skim_idx, d_j_skim_idx, origin_j, destination_j, occupancy_j: Trip j attributes + - pair_occupancy: Total occupancy if both trips are pooled (if capacity check enabled) + """ # pre-filter trips for pooling # find pairs of trips that are within the same origin and destination buffer # Ensure indices are integer arrays and no NA @@ -380,7 +516,27 @@ def _determine_potential_trip_pairs(self, trips): return trip_pairs def determine_potential_trip_pairs(self, trips): - """Wrapper around determining potential trip pairs to implement batching""" + """ + Identify all candidate trip pairs for pooling with batching for large trip sets. + + Wrapper around _determine_potential_trip_pairs that processes trips in + batches of size pair_batch_size to manage memory usage. Delegates to the + internal method for actual pairing logic. + + Parameters + ---------- + trips : pd.DataFrame + Trip table with columns: trip_id, origin, destination, oskim_idx, + dskim_idx, occupancy. + + Returns + ------- + pd.DataFrame + All candidate trip pairs with columns: trip_i, trip_j, origin_time, + dest_time, o_i_skim_idx, d_i_skim_idx, origin_i, destination_i, + occupancy_i (and _j variants). If max_vehicle_occupancy is set, + pairs exceeding capacity are excluded. + """ # break trips up into batches trip_pairs_list = [] @@ -402,11 +558,37 @@ def determine_potential_trip_pairs(self, trips): return trip_pairs def determine_detour_times(self, trip_pairs): - # For each trip pair, calculate the four possible routing scenarios - # and determine if they are valid (within detour limits) - # and select the best valid scenario (minimum total time) - # WARNING if these scenarios are changed, they also need to be changed downstream in the routing - + """ + Calculate detour times for all four routing scenarios per trip pair. + + Evaluates four possible pickup/dropoff orders: + 1. oi→oj→di→dj + 2. oj→oi→dj→di + 3. oi→oj→dj→di + 4. oj→oi→di→dj + + Computes per-trip detours relative to solo travel, filters out pairs + exceeding detour limits, and selects the scenario with minimum total + in-vehicle time for each valid pair. + + Parameters + ---------- + trip_pairs : pd.DataFrame + Candidate pairs with o_i_skim_idx, d_i_skim_idx, o_j_skim_idx, + d_j_skim_idx columns. + + Returns + ------- + pd.DataFrame + Valid trip pairs with added columns: detour_i, detour_j, total_detour, + total_ivt, route_scenario. Only includes pairs where both detours are + within max_detour_minutes. + + Notes + ----- + WARNING: If scenarios are modified, corresponding logic in create_trip_routes + must also be updated to match the new ordering. + """ oi = trip_pairs["o_i_skim_idx"].to_numpy() oj = trip_pairs["o_j_skim_idx"].to_numpy() di = trip_pairs["d_i_skim_idx"].to_numpy() @@ -496,6 +678,27 @@ def determine_detour_times(self, trip_pairs): return trip_pairs def select_mutual_best_recursive(self, trip_pairs: pd.DataFrame) -> pd.DataFrame: + """ + Select disjoint trip pairs using iterative mutual-best matching. + + Implements a greedy algorithm that repeatedly finds mutually best pairs + (where trip i prefers trip j and vice versa) and removes them from the + pool. Ensures each trip appears in at most one pair. Ties are broken + deterministically by sorting on total_detour, trip_i, and trip_j. + + Parameters + ---------- + trip_pairs : pd.DataFrame + All candidate trip pairs with columns: trip_i, trip_j, total_detour, + detour_i, detour_j, total_ivt, and other routing attributes. + + Returns + ------- + pd.DataFrame + Subset of trip_pairs containing only disjoint mutual-best matches, + with all original columns preserved. Returns empty DataFrame if no + mutual matches found. + """ # start from valid pairs only, keep only needed cols for speed pairs = trip_pairs[["trip_i", "trip_j", "total_detour"]].copy() if pairs.empty: @@ -585,6 +788,26 @@ def select_mutual_best_recursive(self, trip_pairs: pd.DataFrame) -> pd.DataFrame return trip_matches def create_trip_routes(self, trip_matches): + """ + Convert matched trip pairs into ordered route sequences. + + Takes mutually matched trip pairs and expands them into ordered sequences + of O/D stops based on the optimal routing scenario (e.g., oi→oj→di→dj). + Creates a 4-row per-pair table with origin/intermediate/destination flags. + + Parameters + ---------- + trip_matches : pd.DataFrame + Matched pairs with columns: trip_i, trip_j, route_scenario, total_ivt, + detour_i, detour_j, occupancy_i, occupancy_j. + + Returns + ------- + pd.DataFrame + Route table with columns: trip_i, trip_j, origin, destination, + origin_type, destination_type (pickup, intermediate, dropoff), + detour_i, detour_j, occupancy_i, occupancy_j. + """ trips_routed = trip_matches[ ["trip_i", "trip_j", "total_ivt", "route_scenario", "detour_i", "detour_j", 'occupancy_i', 'occupancy_j'] ].copy() @@ -639,6 +862,28 @@ def create_trip_routes(self, trip_matches): return trips_routed def create_full_trip_route_table(self, tnc_trips, trips_routed): + """ + Combine pooled trips with solo trips into a unified route table. + + Appends any TNC trips not included in pooled pairs as solo trips (trip_i + only, trip_j = NaN). Both pooled and solo trips are represented in a + consistent format for vehicle matching. + + Parameters + ---------- + tnc_trips : pd.DataFrame + All TNC trips in the current time bin with columns: trip_id, origin, + destination, origin_skim_idx, dest_skim_idx, occupancy. + trips_routed : pd.DataFrame + Pooled trip routes from create_trip_routes with trip_i and trip_j. + + Returns + ------- + pd.DataFrame + Unified route table containing both pooled and solo trips, with + columns: trip_i, trip_j (NaN for solo), origin, destination, + origin_skim_idx, dest_skim_idx, occupancy_i, occupancy_j. + """ # need to append any additional tnc trips during this time period that were not grouped mask = ~( tnc_trips.trip_id.isin(trips_routed.trip_i) @@ -670,7 +915,29 @@ def create_full_trip_route_table(self, tnc_trips, trips_routed): def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): """ - Create new vehicles for trips that could not be matched to existing free vehicles + Create new vehicles for trips that could not be matched to existing free vehicles. + + Instantiates new vehicle records starting at the trip origins and updates + the trip-to-vehicle mapping. Vehicle IDs are assigned sequentially starting + from the next available ID after existing vehicles. + + Parameters + ---------- + vehicles : pd.DataFrame or None + Existing fleet table with vehicle_id index. Can be None if no vehicles + exist yet. + trips_to_service : pd.DataFrame + Unmatched trips that need new vehicles, with columns: trip_i, + origin_skim_idx, origin. + trip_to_veh_map : pd.Series + Index=trip_i, values=vehicle_id. Updated in place with new vehicle + assignments. + + Returns + ------- + tuple of (pd.DataFrame, pd.Series) + - vehicles: Updated fleet table with new vehicles appended + - trip_to_veh_map: Updated mapping with new vehicle assignments """ idx_start_num = 0 if vehicles is None else vehicles.index.max() @@ -700,6 +967,32 @@ def create_new_vehicles(self, vehicles, trips_to_service, trip_to_veh_map): def _match_vehicles_to_trips( self, free_vehicles, unserviced_trips, trip_to_veh_map ): + """ + Core greedy algorithm to assign free vehicles to unserviced trips. + + Iteratively matches each trip to the nearest available vehicle by + deadhead time. Enforces max_wait_time constraint and handles ties + deterministically by keeping the first trip when multiple trips compete + for the same vehicle. Continues until all trips are serviced or no + vehicles are within the max wait time. + + Parameters + ---------- + free_vehicles : pd.DataFrame + Available vehicles with columns: location_skim_idx, is_free, etc. + unserviced_trips : pd.DataFrame + Trips not yet assigned, with origin_skim_idx and trip_i columns. + trip_to_veh_map : pd.Series + Index=trip_i, values=vehicle_id. Updated in place with new matches. + + Returns + ------- + tuple of (pd.DataFrame, pd.DataFrame, pd.Series) + - free_vehicles: Remaining unmatched vehicles + - unserviced_trips: Remaining unmatched trips + - trip_to_veh_map: Updated mapping with new vehicle assignments + + """ i = 0 while not (free_vehicles.empty or unserviced_trips.empty): @@ -743,6 +1036,31 @@ def _match_vehicles_to_trips( return free_vehicles, unserviced_trips, trip_to_veh_map def match_vehicles_to_trips(self, vehicles, full_trip_routes): + """ + Assign available vehicles to trips and create new vehicles as needed. + + Processes trips in batches (vehicle_match_batch_size) to avoid memory + issues with large distance matrices. Matches free vehicles to trips via + _match_vehicles_to_trips, then creates new vehicles for any remaining + unserviced trips. + + Parameters + ---------- + vehicles : pd.DataFrame or None + Fleet table with is_free, location_skim_idx, next_time_free columns. + Can be None if no vehicles exist yet. + full_trip_routes : pd.DataFrame + All trip routes (solo and pooled) with trip_i, origin_skim_idx, + occupancy_i columns. + + Returns + ------- + tuple of (pd.DataFrame, pd.DataFrame, pd.Series) + - vehicles: Updated fleet with new vehicles added + - full_trip_routes: Input routes (unchanged) + - trip_to_veh_map: Series mapping trip_i to vehicle_id (NaN if + exceeded max_wait_time) + """ if vehicles is not None: free_vehicles = vehicles[vehicles.is_free].copy() else: @@ -804,6 +1122,35 @@ def match_vehicles_to_trips(self, vehicles, full_trip_routes): return vehicles, trip_to_veh_map def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): + """ + Generate leg-by-leg vehicle trips from assigned trip routes. + + Expands route sequences into individual vehicle legs (pickup, intermediate, + dropoff) with cumulative travel times. For pooled trips, creates intermediate + legs between the first pickup and the last dropoff. Calculates arrival times + in minutes and maps to time bins. + + The first leg for each vehicle includes deadhead time from the vehicle's + current location to the first pickup. Subsequent legs are added with + cumulative travel times. + + Parameters + ---------- + full_trip_routes : pd.DataFrame + Trip routes with columns: trip_i, trip_j, origin, destination, + origin_type, destination_type, origin_skim_idx, dest_skim_idx. + vehicles : pd.DataFrame + Fleet table with location_skim_idx for deadhead calculations. + trip_to_veh_map : pd.Series + Mapping from trip_i to vehicle_id. + + Returns + ------- + pd.DataFrame + Vehicle trip legs with columns: vehicle_id, trip_i, trip_j, origin, + destination, leg_type (pickup, intermediate, dropoff, deadhead), + travel_time, arrival_time (minutes), arrival_bin (time bin). + """ # Create vehicle trips from the full trip routes # first turning full_trip_routes into a list of stops @@ -962,7 +1309,25 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): return new_v_trips, full_trip_routes def calculate_occupancy(self, vehicle_trips_i, tnc_trips_i): - """Calculating occupancy for each vehicle trip based on the trips being served""" + """ + Calculate vehicle occupancy for each leg based on trips being served. + + Sums the occupancy from trip_i and trip_j (if present) for each vehicle + trip leg. Uses the occupancy values from the original TNC trips table. + + Parameters + ---------- + vehicle_trips_i : pd.DataFrame + Vehicle trip legs with trip_i and trip_j columns (trip_j may be NaN + for solo trips). + tnc_trips_i : pd.DataFrame + Original TNC trips with trip_id and occupancy columns. + + Returns + ------- + pd.DataFrame + vehicle_trips_i with added 'occupancy' column. + """ trip_occ_map = tnc_trips_i.set_index("trip_id")["occupancy"] # occupancy of the vehicle trips is the sum of occupancy across trips @@ -976,6 +1341,33 @@ def calculate_occupancy(self, vehicle_trips_i, tnc_trips_i): def update_vehicle_fleet( self, vehicles, vehicle_trips_i, time_bin, refuel_veh_trips_i ): + """ + Update vehicle availability and location after serving trips in current time bin. + + Updates next_time_free based on the latest arrival time (+1 to account + for dropoff), marks vehicles as free if they will be available in the + next time bin, and updates vehicle locations to their final destination + or refuel station. + + Parameters + ---------- + vehicles : pd.DataFrame + Fleet table with columns: is_free, next_time_free, location, + location_skim_idx, etc. + vehicle_trips_i : pd.DataFrame + Completed vehicle trips with vehicle_id, arrival_bin, destination, + destination_skim_idx columns. + time_bin : int + Current simulation time bin. + refuel_veh_trips_i : pd.DataFrame + Subset of vehicle_trips_i that are refueling trips, with refuel_dest + and refuel_dest_skim_idx columns. + + Returns + ------- + pd.DataFrame + Updated vehicles table with refreshed availability and locations. + """ # update the next_time_free based on the vehicle trips next_time_free_update = ( vehicle_trips_i.groupby("vehicle_id").arrival_bin.max() + 1 @@ -1021,6 +1413,25 @@ def update_vehicle_fleet( return vehicles def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): + """ + Log summary statistics and perform consistency checks on TNC routing outputs. + + Calculates and logs total trips, vehicles, pooling rate, average occupancy, + VMT, deadhead VMT percentage, and average distance-weighted occupancy. + Validates that all trips are serviced and all vehicles are used. + + Parameters + ---------- + tnc_veh_trips : pd.DataFrame + Vehicle trip legs with trip_i, trip_j, vehicle_id, OD_dist, occupancy, + is_deadhead columns. + tnc_trips : pd.DataFrame + Original TNC trips with trip_id column. + vehicles : pd.DataFrame + Fleet table with vehicle_id index. + pooled_trips : pd.DataFrame + Matched trip pairs with trip_i and trip_j columns. + """ # Summary statistics for TNC vehicle trips logger.info("TNC Vehicle Trips Summary:") @@ -1086,11 +1497,29 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): pass - def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): - """Check to see if the vehicle needs to refuel. - - If the vehicle has been operating for more than the refuel interval, - it needs be routed to the nearest refuel station before it becomes available again. + def check_refuel_needs(self, vehicle_trips_i, vehicles): + """ + Identify vehicles needing refueling and create refuel trips to nearest stations. + + Checks cumulative drive distance since last refuel against the max_refuel_dist + threshold. For vehicles exceeding the threshold, finds the nearest refuel station + (MAZ with landuse_refuel_col > 0) and creates a refuel trip leg from the vehicle's + last destination to the station. + + Parameters + ---------- + vehicle_trips_i : pd.DataFrame + Completed vehicle trips with vehicle_id, destination_skim_idx, OD_dist, + arrival_bin columns. + vehicles : pd.DataFrame + Fleet table with drive_dist_since_refuel column. + + Returns + ------- + pd.DataFrame or None + Refuel trip legs with columns: vehicle_id, origin, origin_skim_idx, + destination (refuel station MAZ), destination_skim_idx, OD_time, OD_dist, + arrival_bin, trip_type='refuel'. Returns None if no vehicles need refueling. """ # updated drive time drive_time_from_trips_in_bin = vehicle_trips_i.groupby( @@ -1172,6 +1601,31 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles, time_bin): return refuel_veh_trips def remap_skim_idx_to_zone(self, tnc_veh_trips, pooled_trips, tnc_trips): + """ + Convert skim indices back to TAZ and MAZ identifiers for output. + + Maps vehicle trip origins and destinations from internal skim indices to: + - TAZ: Traffic analysis zone IDs + - MAZ: Micro-analysis zone IDs (actual pickup/dropoff locations) + + For pooled trips, determines correct pickup/dropoff MAZ based on route_scenario. + For refuel trips, uses first MAZ in TAZ (preferring MAZs with refuel stations for destinations). + For regular vehicle movements, uses first MAZ in origin TAZ and scenario-specific MAZ for destinations. + + Parameters: + tnc_veh_trips: DataFrame of all vehicle movement legs. + pooled_trips: DataFrame of matched trip pairs. + tnc_trips: Original trip table with MAZ origins and destinations. + + Returns: + Tuple of (updated tnc_veh_trips, updated pooled_trips) with: + - origin_taz, destination_taz: Zone identifiers + - origin, destination: MAZ identifiers + - skim indices dropped from DataFrames + + Raises: + ValueError: If any vehicle trip is missing origin or destination MAZ after mapping. + """ # remap the skim idx back to zone ids for output skim_idx_to_taz_map = {v: k for k, v in self.skim_zone_mapping.items()} @@ -1237,7 +1691,27 @@ def write_outputs(self, tnc_veh_trips, pooled_trips, id_mapping_df): ) def route_taxi_tncs(self): - """Main function to route taxi and TNC trips, including pooling logic.""" + """ + Execute the complete TNC routing simulation workflow. + + Main entry point that orchestrates the entire TNC routing process: + 1. Load input data (trips, land use, skims) + 2. For each time bin: + a. Identify potential trip pairs for pooling + b. Calculate detour times and select mutual-best pairs + c. Match vehicles to trips (existing or newly created) + d. Generate leg-by-leg vehicle routes + e. Calculate occupancy and update vehicle fleet + f. Check refueling needs and route vehicles to stations + 3. Remap skim indices to TAZ/MAZ zones + 4. Summarize results and write outputs + + Returns + ------- + pd.DataFrame + Complete vehicle trip table (tnc_veh_trips) with all legs indexed by + vehicle_trip_id. Output files are also written to disk. + """ # read in initial skim data self.read_skim_data(0) From 1bb7ab914e5d854431d123c2d41b6ba89c01fc0a Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 1 Dec 2025 16:54:43 -0800 Subject: [PATCH 27/53] fixing hard-coded simulation time bin in refueling --- src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 02a8eb383..b6b346115 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -1283,10 +1283,10 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): cumulative_trip_time = new_v_trips.groupby("vehicle_id")["OD_time"].cumsum() new_v_trips["depart_bin"] = ( full_trip_routes.time_bin.mode()[0] - + (cumulative_trip_time - new_v_trips["OD_time"]) // 15 + + (cumulative_trip_time - new_v_trips["OD_time"]) // self.settings.time_bin_size ) new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( - cumulative_trip_time // 15 + cumulative_trip_time // self.settings.time_bin_size ) new_v_trips["OD_dist"] = self.skim_dist[ From 389cc4181b822d55d9837acbbd695d8d2d82016a Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 1 Dec 2025 21:19:34 -0800 Subject: [PATCH 28/53] deleting unused argument from check_refuel_needs --- src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index b6b346115..b619e2bc1 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -1757,7 +1757,7 @@ def route_taxi_tncs(self): pooling_trips.append(full_trip_routes) refuel_veh_trips_i = self.check_refuel_needs( - vehicle_trips_i, vehicles, time_bin + vehicle_trips_i, vehicles ) if refuel_veh_trips_i is not None: veh_trips.append(refuel_veh_trips_i) From d031883e8514b617cf101160eeac0dc4bef2b488 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Tue, 2 Dec 2025 15:10:43 -0800 Subject: [PATCH 29/53] fixing bug looking at time instead of dist for refuel --- .../scripts/taxi_tnc_routing/taxi_tnc_routing.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index b619e2bc1..660349d3c 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -1390,8 +1390,8 @@ def update_vehicle_fleet( final_veh_location = vehicle_trips_i.groupby("vehicle_id").destination.last() vehicles.loc[final_veh_location.index, "location"] = final_veh_location - tot_drive_time = vehicle_trips_i.groupby("vehicle_id").OD_time.sum() - vehicles.loc[tot_drive_time.index, "drive_dist_since_refuel"] += tot_drive_time + tot_drive_dist = vehicle_trips_i.groupby("vehicle_id").OD_dist.sum() + vehicles.loc[tot_drive_dist.index, "drive_dist_since_refuel"] += tot_drive_dist # updating fleet with refueled vehicles if refuel_veh_trips_i is not None: @@ -1522,16 +1522,16 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles): arrival_bin, trip_type='refuel'. Returns None if no vehicles need refueling. """ # updated drive time - drive_time_from_trips_in_bin = vehicle_trips_i.groupby( + drive_dist_from_trips_in_bin = vehicle_trips_i.groupby( "vehicle_id" ).OD_dist.sum() - tot_drive_time = ( - drive_time_from_trips_in_bin + tot_drive_dist = ( + drive_dist_from_trips_in_bin + vehicles.loc[ - drive_time_from_trips_in_bin.index, "drive_dist_since_refuel" + drive_dist_from_trips_in_bin.index, "drive_dist_since_refuel" ] ) - needs_refuel = tot_drive_time > self.settings.max_refuel_dist + needs_refuel = tot_drive_dist > self.settings.max_refuel_dist if not needs_refuel.any(): return None From 039d5cf58a1ae7425063c80c9ed0637e020e22aa Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 22 Dec 2025 17:06:07 -0800 Subject: [PATCH 30/53] implement chunking in av_trip_matching --- src/asim/extensions/av_routing.py | 119 +++++++++++++++++++++++++++--- 1 file changed, 107 insertions(+), 12 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 7cecb2059..f7622f15c 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -7,6 +7,7 @@ import itertools from activitysim.core import ( + chunk, config, expressions, logit, @@ -397,38 +398,43 @@ def update_vehicle_positions(vehicle_trips, av_vehicles): return av_vehicles -def av_trip_matching( +def _av_trip_matching( state, model_settings: AVRoutingSettings, trips: pd.DataFrame, vehicles: pd.DataFrame, + alts: pd.DataFrame, trace_label: str, + chunk_sizer, ) -> pd.DataFrame: """ - Match trips to AVs - First, construct all possible trip-AV combinations within the household for this time period. - Then, use a utility function to select the best AV for each trip. + Internal function to match trips to AVs for a single chunk of choosers. - Much of the utilty and choice logic is taken from activitysim.core.interaction_simulate - (Couldn't just call it because of the extra step here where we combine across alternatives) - """ + Parameters: + state: The current state of the simulation. + model_settings: The settings for the AV routing model. + trips: DataFrame containing trips for the current chunk of households. + vehicles: DataFrame containing vehicles for the current chunk of households. + alts: DataFrame containing alternatives (AV-trip combinations). + trace_label: Label for tracing. + chunk_sizer: Chunk sizer for memory tracking. - # get the maximum number of AVs and Trips during this time period - max_number_of_avs = vehicles.groupby("household_id").size().max() - max_number_of_trips = trips.groupby("household_id").size().max() + Returns: + DataFrame containing the choices for each household in the chunk. + """ # the real choosers here are the households with an av that have trips in this time period choosers = pd.DataFrame(index=trips.household_id.unique()) choosers.index.name = "household_id" - alts = construct_av_to_trip_alternatives(max_number_of_avs, max_number_of_trips) - interaction_df = build_av_to_trip_interaction_df( vehicles=vehicles, trips=trips, alts=alts, choosers=choosers, ) + chunk_sizer.log_df(trace_label, "interaction_df", interaction_df) + have_trace_targets = state.tracing.has_trace_targets( interaction_df, slicer="household_id" ) @@ -504,6 +510,10 @@ def av_trip_matching( .reset_index() .set_index("alt") ) + chunk_sizer.log_df(trace_label, "interaction_utilities", interaction_utilities) + + del interaction_df + chunk_sizer.log_df(trace_label, "interaction_df", None) # make choices based on the summed utilities # reshape utilities (one utility column and one row per row in model_design) @@ -512,6 +522,7 @@ def av_trip_matching( interaction_utilities.utility.values.reshape(len(choosers), len(alts)), index=choosers.index, ) + chunk_sizer.log_df(trace_label, "utilities", utilities) if have_trace_targets: state.tracing.trace_df( @@ -525,6 +536,10 @@ def av_trip_matching( probs = logit.utils_to_probs( state, utilities, trace_label=trace_label, trace_choosers=choosers ) + chunk_sizer.log_df(trace_label, "probs", probs) + + del utilities + chunk_sizer.log_df(trace_label, "utilities", None) # make choices # positions is series with the chosen alternative represented as a column index in probs @@ -543,6 +558,7 @@ def av_trip_matching( # create a series with index from choosers and the index of the chosen alternative choices = pd.Series(choices, index=choosers.index) + chunk_sizer.log_df(trace_label, "choices", choices) if have_trace_targets: state.tracing.trace_df( @@ -566,6 +582,85 @@ def av_trip_matching( return choices +def av_trip_matching( + state, + model_settings: AVRoutingSettings, + trips: pd.DataFrame, + vehicles: pd.DataFrame, + trace_label: str, + explicit_chunk_size: int = 0, +) -> pd.DataFrame: + """ + Match trips to AVs with optional chunking for memory management. + + First, construct all possible trip-AV combinations within the household for this time period. + Then, use a utility function to select the best AV for each trip. + + Much of the utility and choice logic is taken from activitysim.core.interaction_simulate + (Couldn't just call it because of the extra step here where we combine across alternatives) + + Parameters: + state: The current state of the simulation. + model_settings: The settings for the AV routing model. + trips: DataFrame containing trips to match. + vehicles: DataFrame containing available AV vehicles. + trace_label: Label for tracing. + explicit_chunk_size: If > 0, specifies the chunk size to use when chunking. + If < 1, specifies the fraction of the total number of choosers. + + Returns: + DataFrame containing the choices for each household. + """ + trace_label = tracing.extend_trace_label(trace_label, "av_trip_matching") + + # get the maximum number of AVs and Trips during this time period + max_number_of_avs = vehicles.groupby("household_id").size().max() + max_number_of_trips = trips.groupby("household_id").size().max() + + # construct alternatives once for all chunks + alts = construct_av_to_trip_alternatives(max_number_of_avs, max_number_of_trips) + + # the real choosers here are the households with an av that have trips in this time period + choosers = pd.DataFrame(index=trips.household_id.unique()) + choosers.index.name = "household_id" + + result_list = [] + for ( + i, + chooser_chunk, + chunk_trace_label, + chunk_sizer, + ) in chunk.adaptive_chunked_choosers( + state, choosers, trace_label, explicit_chunk_size=explicit_chunk_size + ): + # filter trips and vehicles to only those in the current chunk + chunk_hh_ids = chooser_chunk.index + trips_chunk = trips[trips.household_id.isin(chunk_hh_ids)] + vehicles_chunk = vehicles[vehicles.household_id.isin(chunk_hh_ids)] + + choices = _av_trip_matching( + state, + model_settings, + trips=trips_chunk, + vehicles=vehicles_chunk, + alts=alts, + trace_label=chunk_trace_label, + chunk_sizer=chunk_sizer, + ) + + result_list.append(choices) + chunk_sizer.log_df(trace_label, "result_list", result_list) + + if len(result_list) > 1: + choices = pd.concat(result_list) + else: + choices = result_list[0] + + assert len(choices.index) == len(choosers.index) + + return choices + + def get_next_household_trips_to_service( state, choosers: pd.DataFrame, From 7605180f051c8f2cb32773c50bfa82b2597b46c1 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Mon, 22 Dec 2025 20:48:27 -0800 Subject: [PATCH 31/53] adding explicit_chunk setting --- src/asim/extensions/av_routing.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index f7622f15c..78e7aea93 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -48,6 +48,13 @@ class AVRoutingSettings(LogitComponentSettings): DRIVING_MODES: list[str] """List of modes that are eligible for routing with a household AV""" + explicit_chunk: float = 0 + """ + If > 0, use this chunk size instead of adaptive chunking. + If less than 1, use this fraction of the total number of rows. + If not supplied or None, will default to the chunk size in the location choice model settings. + """ + def setup_model_settings(state, model_settings): """ @@ -588,7 +595,6 @@ def av_trip_matching( trips: pd.DataFrame, vehicles: pd.DataFrame, trace_label: str, - explicit_chunk_size: int = 0, ) -> pd.DataFrame: """ Match trips to AVs with optional chunking for memory management. @@ -631,7 +637,7 @@ def av_trip_matching( chunk_trace_label, chunk_sizer, ) in chunk.adaptive_chunked_choosers( - state, choosers, trace_label, explicit_chunk_size=explicit_chunk_size + state, choosers, trace_label, explicit_chunk_size=model_settings.explicit_chunk ): # filter trips and vehicles to only those in the current chunk chunk_hh_ids = chooser_chunk.index From 7cd77425ca3fdf8a75957f9c49423a96e751caf3 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 15:02:47 -0800 Subject: [PATCH 32/53] initial commit of tnc_av_matrix_builder.py --- .../taxi_tnc_routing_settings.yaml | 34 +- .../taxi_tnc_routing/tnc_av_matrix_builder.py | 817 ++++++++++++++++++ 2 files changed, 837 insertions(+), 14 deletions(-) create mode 100644 src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index 1d88829c0..09a2f6a8f 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -1,9 +1,10 @@ # path to activitysim output folder with trip data asim_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data # asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +# asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\outputs\test # path to folder with skim data skim_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\input_data_full\skims -# skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full +# skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\sandag_data_cropped # output folder for results output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\outputs\tnc_routing_test # output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full @@ -36,18 +37,6 @@ single_tnc_modes: - 'RIDEHAIL_LOC2' - 'TAXI_LOC1' - 'TAXI_LOC2' -# shared_tnc_modes: -# # - 'DRIVEALONE' -# # - 'SHARED2' -# - 'SHARED3' -# - 'TNC_SHARED' -# - 'TNC_SINGLE' -# - 'TAXI' -# - 'RIDEHAIL_LOC1' -# - 'RIDEHAIL_LOC2' -# - 'TAXI_LOC1' -# - 'TAXI_LOC2' -# single_tnc_modes: [] # simulation time bin size (in mins) # determines how far apart trips in time can be to be considered for pooling @@ -64,4 +53,21 @@ landuse_refuel_col: refueling_stations max_refuel_dist: 300 # numpy random seed for reproducibility -random_seed: 42 \ No newline at end of file +random_seed: 42 + +# ============================================ +# Matrix Builder Settings (for tnc_av_matrix_builder.py) +# ============================================ + +# AV routing outputs (from ActivitySim av_routing model) +# Script will try .parquet first, then .csv +av_vehicle_trips_file: "final_av_vehicle_trips" + +# TNC routing outputs (from taxi_tnc_routing model) +tnc_vehicle_trips_file: "output_tnc_vehicle_trips.csv" + +# Output directory for OMX matrix files +matrix_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data + +# Occupancy binning for TNC matrices (occupancy >= max grouped into max bin) +max_occupancy_bin: 3 \ No newline at end of file diff --git a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py new file mode 100644 index 000000000..0bd8624c4 --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py @@ -0,0 +1,817 @@ +""" +TNC/AV Demand Matrix Builder + +Reads vehicle trip outputs from taxi_tnc_routing and av_routing models, +aggregates to O-D matrices by time period and occupancy, and writes +OMX files for import into Emme traffic assignment. + +Output Files: + - TNCVehicleTrips_pp.omx: TNC vehicle trips by occupancy (0, 1, 2, 3+) + - EmptyAVTrips.omx: AV deadhead/repositioning trips only + +Usage: + python tnc_av_matrix_builder.py [--settings path/to/settings.yaml] +""" + +import os +import logging +import argparse +import time +from typing import Optional, Dict + +import numpy as np +import pandas as pd +import openmatrix as omx +import yaml +from pydantic import BaseModel, ValidationError, model_validator + +logger = logging.getLogger(__name__) + + +class MatrixBuilderSettings(BaseModel): + """ + Settings for the TNC/AV Matrix Builder. + + Extends taxi_tnc_routing settings with matrix output configuration. + """ + + # Input paths - from existing taxi_tnc_routing settings + asim_output_dir: str + output_dir: str # taxi_tnc_routing output dir (contains tnc vehicle trips) + + # Skim configuration - reused for zone mapping + skim_dir: str + skim_files: list + skim_periods: list = ["EA", "AM", "MD", "PM", "EV"] + periods: list = [0, 6, 12, 25, 32, 48] + + # Matrix builder specific settings + av_vehicle_trips_file: str = "final_av_vehicle_trips" + tnc_vehicle_trips_file: str = "output_tnc_vehicle_trips.csv" + matrix_output_dir: str = "./output" + max_occupancy_bin: int = 3 + + @model_validator(mode="after") + def check_periods_match(self): + """Validate that periods and skim_periods have compatible lengths.""" + if len(self.periods) != len(self.skim_periods) + 1: + raise ValueError( + f"periods ({len(self.periods)}) must have one more element than " + f"skim_periods ({len(self.skim_periods)})" + ) + return self + + +def load_settings(yaml_path: str) -> MatrixBuilderSettings: + """ + Load and validate settings from YAML file. + + Parameters + ---------- + yaml_path : str + Path to the YAML settings file. + + Returns + ------- + MatrixBuilderSettings + Validated settings object. + """ + with open(yaml_path, "r") as f: + data = yaml.safe_load(f) + + try: + settings = MatrixBuilderSettings(**data) + except ValidationError as e: + logger.error(f"Settings validation error: {e}") + raise + + # Ensure output directory exists + matrix_output_dir = os.path.expanduser(settings.matrix_output_dir) + if not os.path.exists(matrix_output_dir): + os.makedirs(matrix_output_dir) + logger.info(f"Created matrix output directory: {matrix_output_dir}") + + return settings + + +class TNCVehicleMatrixBuilder: + """ + Builds OMX demand matrices from TNC and AV vehicle trip outputs. + + Reads vehicle trip tables from taxi_tnc_routing and av_routing models, + aggregates trips by O-D, period, and occupancy, and writes OMX matrices + for import into traffic assignment. + + Attributes + ---------- + settings : MatrixBuilderSettings + Configuration settings from YAML file + skim_zone_mapping : dict + Mapping from TAZ ID to skim matrix index + zone_ids : np.ndarray + Ordered array of zone IDs matching skim matrix dimensions + num_zones : int + Number of zones in the skim/output matrices + period_labels : list + Unique period labels (EA, AM, MD, PM, EV) + """ + + def __init__(self, settings: MatrixBuilderSettings): + """ + Initialize the matrix builder with settings. + + Parameters + ---------- + settings : MatrixBuilderSettings + Configuration settings from YAML file. + """ + self.settings = settings + self.skim_zone_mapping: Dict[int, int] = {} + self.maz_to_taz: Dict[int, int] = {} + self.zone_ids: Optional[np.ndarray] = None + self.zone_mapping_name: str = "zone_id" # Default mapping name + self.num_zones: int = 0 + self.period_labels: list = [] + self.depart_bin_to_period: Dict[int, str] = {} + + self._load_zone_mapping() + self._load_maz_to_taz_mapping() + self._setup_period_mapping() + + def _load_zone_mapping(self) -> None: + """ + Load zone mapping from skim file. + + Reads the first skim file to get zone ordering and creates + a mapping from TAZ ID to matrix index. If no explicit mapping + exists in the OMX file, assumes standard 1-indexed zone IDs + based on matrix dimensions. + """ + skim_dir = os.path.expanduser(self.settings.skim_dir) + skim_file = self.settings.skim_files[0] + skim_path = os.path.join(skim_dir, skim_file) + + if not os.path.exists(skim_path): + raise FileNotFoundError( + f"Do not know how to map zones -- skim file not found: {skim_path}" + ) + + with omx.open_file(skim_path, "r") as f: + # Get list of available mappings + available_mappings = f.list_mappings() + + if available_mappings: + # Use the first available mapping + mapping_name = available_mappings[0] + self.zone_mapping_name = mapping_name # Store for output files + mapping = f.mapping(mapping_name) + self.zone_ids = np.array(list(mapping.keys())) + logger.info(f"Using zone mapping '{mapping_name}' from {skim_file}") + else: + # No mapping exists - assume standard zone IDs based on matrix shape + # Get shape from first matrix core + matrix_names = f.list_matrices() + if not matrix_names: + raise ValueError(f"No matrices found in skim file: {skim_path}") + + first_matrix = f[matrix_names[0]] + self.num_zones = first_matrix.shape[0] + # Assume 1-indexed zone IDs + self.zone_ids = np.arange(1, self.num_zones + 1) + logger.warning( + f"No zone mapping found in {skim_file}. " + f"Assuming standard 1-indexed zone IDs (1 to {self.num_zones})" + ) + + self.num_zones = len(self.zone_ids) + self.skim_zone_mapping = { + zone_id: idx for idx, zone_id in enumerate(self.zone_ids) + } + + logger.info(f"Loaded zone mapping with {self.num_zones} zones from {skim_file}") + + def _load_maz_to_taz_mapping(self) -> None: + """ + Load MAZ to TAZ mapping from final_land_use table. + + Reads the land use table from ActivitySim output directory to create + a mapping from MAZ (Micro Analysis Zone) to TAZ (Traffic Analysis Zone). + This is needed because AV vehicle trips use MAZ for origin/destination + but output matrices need to be at TAZ level. + """ + asim_dir = os.path.expanduser(self.settings.asim_output_dir) + + # Try parquet first, then csv + parquet_path = os.path.join(asim_dir, "final_land_use.parquet") + csv_path = os.path.join(asim_dir, "final_land_use.csv") + + land_use = None + file_used = None + + if os.path.exists(parquet_path): + try: + land_use = pd.read_parquet(parquet_path) + file_used = parquet_path + except Exception as e: + logger.warning(f"Error reading land_use parquet: {e}") + + if land_use is None and os.path.exists(csv_path): + try: + land_use = pd.read_csv(csv_path) + file_used = csv_path + except Exception as e: + logger.warning(f"Error reading land_use csv: {e}") + + if land_use is None: + logger.warning( + f"Land use file not found: tried {parquet_path} and {csv_path}. " + f"MAZ to TAZ mapping will not be available for AV trips." + ) + return + + # Determine MAZ and TAZ column names + # Common column name patterns + maz_col = None + taz_col = None + + # Check for MAZ column + for col in ["MAZ", "maz", "zone_id", "ZONE_ID", "mgra", "MGRA"]: + if col in land_use.columns: + maz_col = col + break + + # Check for TAZ column + for col in ["TAZ", "taz", "TAZ_ORIGINAL", "taz_original"]: + if col in land_use.columns: + taz_col = col + break + + # If MAZ column is the index, use that + if maz_col is None and land_use.index.name in [ + "MAZ", + "maz", + "zone_id", + "ZONE_ID", + "mgra", + "MGRA", + ]: + land_use = land_use.reset_index() + maz_col = land_use.columns[0] + + if maz_col is None or taz_col is None: + logger.warning( + f"Could not identify MAZ and/or TAZ columns in land use file. " + f"Available columns: {list(land_use.columns)}. " + f"MAZ to TAZ mapping will not be available for AV trips." + ) + return + + # Create the mapping + self.maz_to_taz = land_use.set_index(maz_col)[taz_col].to_dict() + + logger.info( + f"Loaded MAZ to TAZ mapping with {len(self.maz_to_taz)} zones from {file_used} " + f"(MAZ col: {maz_col}, TAZ col: {taz_col})" + ) + + def _setup_period_mapping(self) -> None: + """ + Setup time period mapping from settings. + + Uses periods boundaries and skim_periods labels to create + a mapping from depart_bin (1-48) to period label. + """ + # Get unique period labels + self.period_labels = list(dict.fromkeys(self.settings.skim_periods)) + + # Create depart_bin -> period mapping + # periods defines boundaries: [0, 6, 12, 25, 32, 48] + # skim_periods defines labels for each interval + edges = np.array(self.settings.periods, dtype=int) + labels = np.array(self.settings.skim_periods, dtype=object) + + # Map each depart_bin (1-48) to a period + for depart_bin in range(1, 49): + # Find which interval this bin falls into + idx = np.searchsorted(edges, depart_bin, side="right") - 1 + idx = np.clip(idx, 0, len(labels) - 1) + self.depart_bin_to_period[depart_bin] = labels[idx] + + logger.info(f"Setup period mapping for periods: {self.period_labels}") + + def _read_tnc_vehicle_trips(self) -> Optional[pd.DataFrame]: + """ + Read TNC vehicle trips from taxi_tnc_routing output. + + Returns + ------- + pd.DataFrame or None + TNC vehicle trips with columns: origin_taz, destination_taz, + depart_bin, occupancy. Returns None if file not found or empty. + """ + output_dir = os.path.expanduser(self.settings.output_dir) + tnc_file = os.path.join(output_dir, self.settings.tnc_vehicle_trips_file) + + if not os.path.exists(tnc_file): + logger.warning(f"TNC vehicle trips file not found: {tnc_file}") + return None + + try: + trips = pd.read_csv(tnc_file) + except Exception as e: + logger.warning(f"Error reading TNC vehicle trips: {e}") + return None + + if trips.empty: + logger.warning("TNC vehicle trips file is empty") + return None + + # Validate required columns + required_cols = ["origin_taz", "destination_taz", "depart_bin", "occupancy"] + missing_cols = [col for col in required_cols if col not in trips.columns] + if missing_cols: + logger.warning(f"TNC trips missing required columns: {missing_cols}") + return None + + logger.info(f"Read {len(trips)} TNC vehicle trips from {tnc_file}") + return trips[required_cols].copy() + + def _read_av_vehicle_trips(self) -> Optional[pd.DataFrame]: + """ + Read AV vehicle trips from ActivitySim output. + + Tries .parquet first, then .csv. Returns only deadhead trips. + + Returns + ------- + pd.DataFrame or None + AV deadhead trips with columns: origin, destination, depart, + is_deadhead. Returns None if not found or empty. + """ + asim_dir = os.path.expanduser(self.settings.asim_output_dir) + base_name = self.settings.av_vehicle_trips_file + + # Try parquet first, then csv + parquet_path = os.path.join(asim_dir, f"{base_name}.parquet") + csv_path = os.path.join(asim_dir, f"{base_name}.csv") + + trips = None + file_used = None + + if os.path.exists(parquet_path): + try: + trips = pd.read_parquet(parquet_path) + file_used = parquet_path + except Exception as e: + logger.warning(f"Error reading AV trips parquet: {e}") + + if trips is None and os.path.exists(csv_path): + try: + trips = pd.read_csv(csv_path) + file_used = csv_path + except Exception as e: + logger.warning(f"Error reading AV trips csv: {e}") + + if trips is None: + logger.warning( + f"AV vehicle trips file not found: tried {parquet_path} and {csv_path}" + ) + return None + + if trips.empty: + logger.warning("AV vehicle trips file is empty") + return None + + # Filter to deadhead trips only + deadhead_trips = trips[ + (trips["is_deadhead"] == True) + & (trips.origin > 0) + & (trips.destination > 0) + ].copy() + + if deadhead_trips.empty: + logger.warning("No deadhead trips found in AV vehicle trips") + return None + + # Validate required columns for deadhead trips + required_cols = ["origin", "destination", "depart"] + missing_cols = [ + col for col in required_cols if col not in deadhead_trips.columns + ] + if missing_cols: + logger.warning( + f"AV deadhead trips missing required columns: {missing_cols}" + ) + return None + + logger.info( + f"Read {len(deadhead_trips)} AV deadhead trips from {file_used} " + f"(out of {len(trips)} total AV trips)" + ) + + # Convert MAZ to TAZ for origin and destination + if not self.maz_to_taz: + logger.warning("No MAZ to TAZ mapping available. AV trips will be skipped.") + return None + + deadhead_trips = deadhead_trips.copy() + deadhead_trips["origin_taz"] = deadhead_trips["origin"].map(self.maz_to_taz) + deadhead_trips["destination_taz"] = deadhead_trips["destination"].map( + self.maz_to_taz + ) + + # Check for unmapped MAZs + unmapped_origins = deadhead_trips["origin_taz"].isna().sum() + unmapped_dests = deadhead_trips["destination_taz"].isna().sum() + + if unmapped_origins > 0 or unmapped_dests > 0: + logger.error( + f"Found {unmapped_origins} unmapped origin MAZs and " + f"{unmapped_dests} unmapped destination MAZs in AV trips" + ) + raise ValueError( + "Unmapped MAZs found in AV deadhead trips -- check MAZ to TAZ mapping" + ) + + deadhead_trips["origin_taz"] = deadhead_trips["origin_taz"].astype(int) + deadhead_trips["destination_taz"] = deadhead_trips["destination_taz"].astype( + int + ) + + return deadhead_trips[ + ["origin_taz", "destination_taz", "depart", "is_deadhead"] + ].copy() + + def _map_zones_to_indices( + self, trips: pd.DataFrame, origin_col: str, dest_col: str + ) -> pd.DataFrame: + """ + Map zone IDs to matrix indices. + + Parameters + ---------- + trips : pd.DataFrame + Trip records with origin/destination columns + origin_col : str + Column name for origin zone + dest_col : str + Column name for destination zone + + Returns + ------- + pd.DataFrame + Trips with added origin_idx and dest_idx columns + """ + trips = trips.copy() + trips["origin_idx"] = trips[origin_col].map(self.skim_zone_mapping) + trips["dest_idx"] = trips[dest_col].map(self.skim_zone_mapping) + + # Filter out trips with unmapped zones + valid_mask = trips["origin_idx"].notna() & trips["dest_idx"].notna() + n_invalid = (~valid_mask).sum() + if n_invalid > 0: + logger.warning(f"Dropping {n_invalid} trips with unmapped zones") + + trips = trips[valid_mask].copy() + trips["origin_idx"] = trips["origin_idx"].astype(int) + trips["dest_idx"] = trips["dest_idx"].astype(int) + + return trips + + def _map_depart_to_period( + self, trips: pd.DataFrame, depart_col: str + ) -> pd.DataFrame: + """ + Map departure time to period labels. + + Parameters + ---------- + trips : pd.DataFrame + Trip records with departure time column + depart_col : str + Column name for departure time (1-48 half-hour bins) + + Returns + ------- + pd.DataFrame + Trips with added 'period' column + """ + trips = trips.copy() + trips["period"] = trips[depart_col].map(self.depart_bin_to_period) + + # Handle any unmapped values + unmapped = trips["period"].isna() + if unmapped.any(): + logger.warning( + f"Found {unmapped.sum()} trips with unmapped depart times, " + f"assigning to first period" + ) + trips.loc[unmapped, "period"] = self.period_labels[0] + + return trips + + def _aggregate_to_matrix(self, trips: pd.DataFrame, period: str) -> np.ndarray: + """ + Aggregate trips to O-D matrix for a given period. + + Parameters + ---------- + trips : pd.DataFrame + Trip records with origin_idx, dest_idx, and period columns + period : str + Period label to filter by + + Returns + ------- + np.ndarray + 2D array of shape (num_zones, num_zones) with trip counts + """ + matrix = np.zeros((self.num_zones, self.num_zones), dtype=np.float32) + + period_trips = trips[trips["period"] == period] + + if period_trips.empty: + return matrix + + # Use numpy bincount for fast aggregation + o_idx = period_trips["origin_idx"].values + d_idx = period_trips["dest_idx"].values + + # Create flat index for O-D pairs + flat_idx = o_idx * self.num_zones + d_idx + + # Count trips per O-D pair + counts = np.bincount(flat_idx, minlength=self.num_zones * self.num_zones) + matrix = counts.reshape(self.num_zones, self.num_zones).astype(np.float32) + + return matrix + + def _create_empty_matrix(self) -> np.ndarray: + """Create a zero-filled matrix of the correct dimensions.""" + return np.zeros((self.num_zones, self.num_zones), dtype=np.float32) + + def _write_tnc_matrices( + self, tnc_trips: Optional[pd.DataFrame], input_trip_count: int + ) -> int: + """ + Write TNC vehicle trip matrices to OMX files. + + Creates one OMX file per period with cores for each occupancy bin + (0, 1, 2, 3+). Occupancy 0 includes deadhead/repositioning trips. + + If tnc_trips is None or empty, writes empty matrices with a warning. + + Parameters + ---------- + tnc_trips : pd.DataFrame or None + ALL TNC vehicle trips (both serving and deadhead) + input_trip_count : int + Original number of trips from input file for validation + + Returns + ------- + int + Total number of trips written to matrices + """ + output_dir = os.path.expanduser(self.settings.matrix_output_dir) + total_written = 0 + + if tnc_trips is None or tnc_trips.empty: + logger.warning("No TNC trips available, writing empty TNC matrices") + tnc_trips = pd.DataFrame( + columns=["origin_taz", "destination_taz", "depart_bin", "occupancy"] + ) + + # Track trips after zone/period mapping for validation + trips_after_mapping = len(tnc_trips) + + # Map zones and periods + tnc_trips = self._map_zones_to_indices( + tnc_trips, "origin_taz", "destination_taz" + ) + tnc_trips = self._map_depart_to_period(tnc_trips, "depart_bin") + + trips_after_zone_mapping = len(tnc_trips) + + # Bin occupancy (0, 1, 2, 3+) + max_bin = self.settings.max_occupancy_bin + tnc_trips["occ_bin"] = tnc_trips["occupancy"].clip(upper=max_bin).astype(int) + + # Write one OMX file per period + for period in self.period_labels: + omx_filename = f"TNCVehicleTrips_{period}.omx" + omx_path = os.path.join(output_dir, omx_filename) + + with omx.open_file(omx_path, "w") as f: + # Create zone mapping using same name as input skim + f.create_mapping(self.zone_mapping_name, self.zone_ids) + + # Write matrix for each occupancy bin + for occ_bin in range(max_bin + 1): + core_name = f"TNC_{period}_{occ_bin}" + + occ_trips = tnc_trips[tnc_trips["occ_bin"] == occ_bin] + matrix = self._aggregate_to_matrix(occ_trips, period) + + f[core_name] = matrix + + matrix_trips = matrix.sum() + total_written += matrix_trips + logger.info(f" {core_name}: {matrix_trips:.0f} trips") + + logger.info(f"Wrote TNC matrices to {omx_path}") + + # Assert that all trips after zone mapping are written + assert abs(total_written - trips_after_zone_mapping) < 1e-6, ( + f"TNC trip count mismatch: {trips_after_zone_mapping} trips after zone mapping, " + f"but {total_written:.0f} trips written to matrices" + ) + + logger.info( + f"TNC validation: {input_trip_count} input trips -> " + f"{trips_after_zone_mapping} after zone mapping -> " + f"{total_written:.0f} written to matrices" + ) + + return int(total_written) + + def _write_empty_av_matrices( + self, av_deadhead: Optional[pd.DataFrame], input_trip_count: int + ) -> int: + """ + Write AV deadhead trip matrices to OMX file. + + Writes EmptyAVTrips.omx with one core per period containing ONLY + deadhead/repositioning trips from the AV routing model. + + If av_deadhead is None or empty, writes empty matrices with warning. + + Parameters + ---------- + av_deadhead : pd.DataFrame or None + AV deadhead/repositioning trips only + input_trip_count : int + Original number of trips from input file for validation + + Returns + ------- + int + Total number of trips written to matrices + """ + output_dir = os.path.expanduser(self.settings.matrix_output_dir) + omx_path = os.path.join(output_dir, "EmptyAVTrips.omx") + total_written = 0 + + if av_deadhead is None or av_deadhead.empty: + logger.warning("No AV deadhead trips available, writing empty AV matrices") + av_deadhead = pd.DataFrame( + columns=["origin_taz", "destination_taz", "depart"] + ) + + trips_after_taz_mapping = len(av_deadhead) + + # Map zones and periods + if not av_deadhead.empty: + av_deadhead = self._map_zones_to_indices( + av_deadhead, "origin_taz", "destination_taz" + ) + av_deadhead = self._map_depart_to_period(av_deadhead, "depart") + + trips_after_zone_mapping = len(av_deadhead) + + with omx.open_file(omx_path, "w") as f: + # Create zone mapping using same name as input skim + f.create_mapping(self.zone_mapping_name, self.zone_ids) + + # Write matrix for each period + for period in self.period_labels: + core_name = f"EmptyAV_{period}" + + if av_deadhead.empty: + matrix = self._create_empty_matrix() + else: + matrix = self._aggregate_to_matrix(av_deadhead, period) + + f[core_name] = matrix + + matrix_trips = matrix.sum() + total_written += matrix_trips + logger.info(f" {core_name}: {matrix_trips:.0f} trips") + + logger.info(f"Wrote EmptyAV matrices to {omx_path}") + + # Assert that all trips after zone mapping are written + assert abs(total_written - trips_after_zone_mapping) < 1e-6, ( + f"AV trip count mismatch: {trips_after_zone_mapping} trips after zone mapping, " + f"but {total_written:.0f} trips written to matrices" + ) + + logger.info( + f"AV validation: {input_trip_count} deadhead trips -> " + f"{trips_after_taz_mapping} after MAZ->TAZ mapping -> " + f"{trips_after_zone_mapping} after zone mapping -> " + f"{total_written:.0f} written to matrices" + ) + + return int(total_written) + + def build_matrices(self) -> None: + """ + Main entry point: read inputs, aggregate, and write OMX files. + + Workflow: + 1. Read TNC vehicle trips (warn if missing/empty) + 2. Read AV vehicle trips and filter to deadhead (warn if missing/empty) + 3. Map zones and periods + 4. Write TNCVehicleTrips_pp.omx files (all TNC trips by occupancy) + 5. Write EmptyAVTrips.omx file (AV deadhead only) + """ + # Read TNC vehicle trips + logger.info("Reading TNC vehicle trips...") + tnc_trips = self._read_tnc_vehicle_trips() + tnc_input_count = len(tnc_trips) if tnc_trips is not None else 0 + + # Read AV vehicle trips (deadhead only) + logger.info("Reading AV vehicle trips...") + av_deadhead = self._read_av_vehicle_trips() + av_input_count = len(av_deadhead) if av_deadhead is not None else 0 + + # Check if we have any data at all + if tnc_trips is None and av_deadhead is None: + logger.warning( + "No TNC or AV trips found. Writing empty matrices for all outputs." + ) + + # Write TNC matrices (all TNC trips by occupancy) + logger.info("Writing TNC vehicle trip matrices...") + tnc_written = self._write_tnc_matrices(tnc_trips, tnc_input_count) + + # Write EmptyAV matrices (AV deadhead only) + logger.info("Writing EmptyAV matrices...") + av_written = self._write_empty_av_matrices(av_deadhead, av_input_count) + + # Summary + logger.info("=" * 60) + logger.info("Matrix building complete!") + logger.info("=" * 60) + + logger.info( + f" TNC trips: {tnc_input_count:,} input -> {tnc_written:,} written" + ) + logger.info( + f" AV deadhead trips: {av_input_count:,} input -> {av_written:,} written" + ) + logger.info(f" Output directory: {self.settings.matrix_output_dir}") + + +def main(): + """CLI entry point.""" + start_time = time.time() + parser = argparse.ArgumentParser( + description="Build TNC/AV demand matrices from routing model outputs" + ) + parser.add_argument( + "--settings", + default="taxi_tnc_routing_settings.yaml", + help="Path to settings YAML file (default: taxi_tnc_routing_settings.yaml)", + ) + args = parser.parse_args() + + # Determine settings file path + if os.path.isabs(args.settings): + settings_path = args.settings + else: + # Look in same directory as this script + script_dir = os.path.dirname(os.path.abspath(__file__)) + settings_path = os.path.join(script_dir, args.settings) + settings = load_settings(settings_path) + + # Setup logging + log_dir = settings.matrix_output_dir + log_file = os.path.join(log_dir, "tnc_av_matrix_builder.log") + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[logging.FileHandler(log_file), logging.StreamHandler()], + ) + + logger.info("=" * 60) + logger.info("TNC/AV Demand Matrix Builder") + logger.info("=" * 60) + + try: + builder = TNCVehicleMatrixBuilder(settings) + builder.build_matrices() + except Exception as e: + logger.error(f"Error building matrices: {e}", exc_info=True) + raise + + elapsed_time = time.time() - start_time + logger.info( + f"\nTime to complete: {elapsed_time:.2f} seconds = {elapsed_time/60:.2f} minutes" + ) + + +if __name__ == "__main__": + main() From 6a6e1fa0418eb781eb8e1f714bae43cd43cd08aa Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 15:03:47 -0800 Subject: [PATCH 33/53] improve mem by dropping unused cols in av_routing --- src/asim/extensions/av_routing.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 78e7aea93..2ab6c3ae7 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -434,6 +434,23 @@ def _av_trip_matching( choosers = pd.DataFrame(index=trips.household_id.unique()) choosers.index.name = "household_id" + model_spec = simulate.eval_coefficients( + state, + model_settings.AV_TRIP_MATCHING_SPEC, + model_settings.AV_TRIP_MATCHING_COEFFICIENTS, + estimator=None, + ) + constants = config.get_model_constants(model_settings) + + trips = util.drop_unused_columns( + trips, + model_spec, + locals_d=constants, + custom_chooser=None, + sharrow_enabled=False, + additional_columns=['trip_number', 'household_id', 'depart', 'tour_id', 'destination', 'origin'], + ) + interaction_df = build_av_to_trip_interaction_df( vehicles=vehicles, trips=trips, @@ -446,14 +463,6 @@ def _av_trip_matching( interaction_df, slicer="household_id" ) - model_spec = simulate.eval_coefficients( - state, - model_settings.AV_TRIP_MATCHING_SPEC, - model_settings.AV_TRIP_MATCHING_COEFFICIENTS, - estimator=None, - ) - constants = config.get_model_constants(model_settings) - # setup skim wrappers skims, interaction_df = setup_skims_trip_matching(state, interaction_df) From 6943ed9a252514a277dd56d245cb66918d31cc30 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 15:04:23 -0800 Subject: [PATCH 34/53] blacken taxi_tnc_routing.py --- .../taxi_tnc_routing/taxi_tnc_routing.py | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 660349d3c..19affd2c1 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -9,6 +9,7 @@ logger = logging.getLogger(__name__) + class TaxiTNCSettings(BaseModel): """ Taxi / TNC route choice settings @@ -297,7 +298,14 @@ def read_input_data(self): """ # Read the data from the OpenMatrix file # Convert the data to a pandas DataFrame - base_cols = ["trip_id", "trip_mode", "depart", "origin", "destination", "tour_participants"] + base_cols = [ + "trip_id", + "trip_mode", + "depart", + "origin", + "destination", + "tour_participants", + ] opt_col = "arrival_mode" frames = [] for fname in self.settings.asim_demand_files: @@ -353,22 +361,23 @@ def read_input_data(self): trips["dskim_idx"] = ( trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) ) - trips['occupancy'] = trips['tour_participants'] + trips["occupancy"] = trips["tour_participants"] if self.settings.max_vehicle_occupancy: total_occupants = trips.occupancy.sum() # duplicate trip rows that are over max_occupancy - n_splits = np.ceil(trips['occupancy'] / self.settings.max_vehicle_occupancy) + n_splits = np.ceil(trips["occupancy"] / self.settings.max_vehicle_occupancy) trips = trips.loc[trips.index.repeat(n_splits)] # split occupants evenly among the new rows split_num = trips.groupby(level=0).cumcount() - base = trips['occupancy'] // n_splits - remainder = trips['occupancy'] % n_splits - trips['occupancy'] = base + (split_num < remainder).astype(int) + base = trips["occupancy"] // n_splits + remainder = trips["occupancy"] % n_splits + trips["occupancy"] = base + (split_num < remainder).astype(int) # make sure all people are accounted for - assert trips.occupancy.sum() == total_occupants, "Not all occupants are accounted for!" - + assert ( + trips.occupancy.sum() == total_occupants + ), "Not all occupants are accounted for!" trips["original_trip_id"] = trips["trip_id"] trips.reset_index(inplace=True, drop=True) @@ -475,7 +484,8 @@ def _determine_potential_trip_pairs(self, trips): # also include the origin and destination skim idxs, plus occupancy for capacity checks lookup = trips.loc[ - :, ["trip_id", "oskim_idx", "dskim_idx", "origin", "destination", "occupancy"] + :, + ["trip_id", "oskim_idx", "dskim_idx", "origin", "destination", "occupancy"], ].set_index("trip_id") trip_pairs = trip_pairs.join( @@ -809,7 +819,16 @@ def create_trip_routes(self, trip_matches): detour_i, detour_j, occupancy_i, occupancy_j. """ trips_routed = trip_matches[ - ["trip_i", "trip_j", "total_ivt", "route_scenario", "detour_i", "detour_j", 'occupancy_i', 'occupancy_j'] + [ + "trip_i", + "trip_j", + "total_ivt", + "route_scenario", + "detour_i", + "detour_j", + "occupancy_i", + "occupancy_j", + ] ].copy() s1_idx = [0, 1, 2, 3] # oi->oj->di->dj @@ -1283,7 +1302,8 @@ def create_vehicle_trips(self, full_trip_routes, vehicles, trip_to_veh_map): cumulative_trip_time = new_v_trips.groupby("vehicle_id")["OD_time"].cumsum() new_v_trips["depart_bin"] = ( full_trip_routes.time_bin.mode()[0] - + (cumulative_trip_time - new_v_trips["OD_time"]) // self.settings.time_bin_size + + (cumulative_trip_time - new_v_trips["OD_time"]) + // self.settings.time_bin_size ) new_v_trips["arrival_bin"] = full_trip_routes.time_bin.mode()[0] + ( cumulative_trip_time // self.settings.time_bin_size @@ -1329,12 +1349,12 @@ def calculate_occupancy(self, vehicle_trips_i, tnc_trips_i): vehicle_trips_i with added 'occupancy' column. """ trip_occ_map = tnc_trips_i.set_index("trip_id")["occupancy"] - + # occupancy of the vehicle trips is the sum of occupancy across trips trip_i_occ = vehicle_trips_i.trip_i.map(trip_occ_map).fillna(0) trip_j_occ = vehicle_trips_i.trip_j.map(trip_occ_map).fillna(0) - vehicle_trips_i['occupancy'] = trip_i_occ + trip_j_occ + vehicle_trips_i["occupancy"] = trip_i_occ + trip_j_occ return vehicle_trips_i @@ -1480,7 +1500,11 @@ def summarize_tnc_trips(self, tnc_veh_trips, tnc_trips, vehicles, pooled_trips): logger.info(f"Percentage of Deadhead VMT: {pct_deadhead_vmt:.2f}%") weighted_occ = tnc_veh_trips.occupancy * tnc_veh_trips.OD_dist - avg_weighted_occ = (weighted_occ.sum() / tnc_veh_trips.OD_dist.sum()) if tnc_veh_trips.OD_dist.sum() > 0 else 0 + avg_weighted_occ = ( + (weighted_occ.sum() / tnc_veh_trips.OD_dist.sum()) + if tnc_veh_trips.OD_dist.sum() > 0 + else 0 + ) logger.info(f"Average occupancy weighted by VMT: {avg_weighted_occ:.2f}") # also performing consistency checks on the outputs @@ -1756,9 +1780,7 @@ def route_taxi_tncs(self): veh_trips.append(vehicle_trips_i) pooling_trips.append(full_trip_routes) - refuel_veh_trips_i = self.check_refuel_needs( - vehicle_trips_i, vehicles - ) + refuel_veh_trips_i = self.check_refuel_needs(vehicle_trips_i, vehicles) if refuel_veh_trips_i is not None: veh_trips.append(refuel_veh_trips_i) From 62e8620deda23f9f4d3d10639d8ccc03a242fb3b Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 20:53:27 -0800 Subject: [PATCH 35/53] adding documentation to ABM3 wiki --- docs/design/demand/av-routing.md | 88 ++++++++++++ docs/design/demand/resident.md | 2 +- docs/design/demand/taxi-tnc-routing.md | 125 ++++++++++++++++++ .../images/design/av_routing_model_design.png | Bin 0 -> 90876 bytes docs/images/design/taxi_tnc_model_design.png | Bin 0 -> 66333 bytes mkdocs.yml | 2 + 6 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 docs/design/demand/av-routing.md create mode 100644 docs/design/demand/taxi-tnc-routing.md create mode 100644 docs/images/design/av_routing_model_design.png create mode 100644 docs/images/design/taxi_tnc_model_design.png diff --git a/docs/design/demand/av-routing.md b/docs/design/demand/av-routing.md new file mode 100644 index 000000000..d9d6bf758 --- /dev/null +++ b/docs/design/demand/av-routing.md @@ -0,0 +1,88 @@ +# Autonomous Vehicle (AV) Routing Model + +The AV routing model simulates how household-owned autonomous vehicles are dispatched to serve household members' travel needs throughout the day. This model runs as a post-processing step after the resident model generates trips for households that own autonomous vehicles. + +## Model Overview + +The AV routing model performs intra-household autonomous vehicle routing, determining which trips are served by the household's AV(s) and how the vehicles reposition between trips. The model operates on a time-period basis, processing trips chronologically throughout the simulated day. + +The model design is shown below: + +![](../../images/design/av_routing_model_design.png) + +## Model Components + +### AV-Trip Matching + +For each time period, the model matches available household AVs to trips that need to be served. The matching process: + +1. **Identifies eligible trips**: Selects driving-mode trips from households with AVs +2. **Constructs alternatives**: Creates all possible AV-to-trip assignments within the household +3. **Evaluates utilities**: Uses skim data (travel time from vehicle location to trip origin) and other factors to score each assignment +4. **Makes choices**: Selects the optimal assignment of trips to AVs using a logit model + +If multiple trips exist on the same tour during a time period, both trips are served by the same AV. If the AV is not at the trip origin, an additional repositioning trip is added. + +### AV Repositioning + +After serving trips, the model determines where each AV should go next. The repositioning alternatives include: + +1. **Stay with person**: The AV waits at the current location with the person it just dropped off +2. **Go home**: The AV returns to the household's home location +3. **Go to remote parking**: The AV travels to a designated parking zone (useful in areas with limited parking) +4. **Service next household trip**: The AV proactively repositions to the origin of an upcoming trip for another household member + +The repositioning choice is made using a utility-based model that considers: +- Travel time to each alternative destination +- Time until the next potential trip +- Parking availability at the current location + +## Vehicle Trip Types + +The model generates several types of vehicle trips: + +| Trip Type | Description | +|-----------|-------------| +| `serving_trip` | AV traveling with a passenger to their destination | +| `going_home` | Empty AV returning to home location | +| `going_to_parking` | Empty AV traveling to remote parking | +| `repositioning` | Empty AV traveling to serve an upcoming trip | + +## Outputs + +The AV routing model produces: + +- **AV Vehicle Trips Table**: A record of all vehicle movements including: + - Vehicle ID and household ID + - Origin and destination zones + - Departure time + - Whether the trip is a deadhead (empty) trip + - Trip type (serving, repositioning, etc.) + +## Relationship to Other Models + +The AV routing model depends on outputs from the [resident model](resident.md), specifically the trip list for households with AVs. It uses skim matrices generated during the travel model run to evaluate travel times for both serving trips and repositioning trips. The AV routing model runs as part of the resident model between trip mode choice and parking location choices models. + +## Integration with Traffic Assignment + +The AV vehicle trips are aggregated into origin-destination matrices for traffic assignment: + +- **EmptyAVTrips.omx**: Contains deadhead/repositioning trips by time period + - `EmptyAV_EA`, `EmptyAV_AM`, `EmptyAV_MD`, `EmptyAV_PM`, `EmptyAV_EV` + +These matrices are imported alongside other demand matrices in the traffic assignment process. See the matrix builder (src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py) for details on how these matrices are created. + +ActivitySim resident model output matrices account for the trips served by AVs, so only the deadhead trips need to be added separately in this step. + +## Configuration + +The AV routing model is configured through `av_routing.yaml` with key settings including: + +- `AV_TRIP_MATCHING_SPEC`: Specification file for AV trip matching model +- `AV_TRIP_MATCHING_COEFFICIENTS`: Coefficients file for AV trip matching model +- `AV_REPOSITIONING_SPEC`: Specification file for AV repositioning model +- `AV_REPOSITIONING_COEFFICIENTS`: Coefficients file for AV repositioning model +- `DRIVING_MODES`: List of trip modes eligible for AV routing +- `AV_PARKING_ZONE_COLUMN`: Land use column indicating remote AV parking availability +- `NEAREST_ZONE_SKIM`: Skim matrix used to find nearest parking zones + diff --git a/docs/design/demand/resident.md b/docs/design/demand/resident.md index c34b9aefb..08acc8db1 100644 --- a/docs/design/demand/resident.md +++ b/docs/design/demand/resident.md @@ -88,5 +88,5 @@ flowchart TD ``` -At this point, all tours are generated, scheduled, have a primary destination, and a selected tour mode. The next set of models fills in details about the tours - number of intermediate stops, location of each stop, the departure time of each stop, and the mode of each trip on the tour. Finally, the parking location of each auto trip to the central business district (CBD) is determined. +At this point, all tours are generated, scheduled, have a primary destination, and a selected tour mode. The next set of models fills in details about the tours - number of intermediate stops, location of each stop, the departure time of each stop, and the mode of each trip on the tour. For households that own autonomous vehicles, an additional [AV Routing Model](av-routing.md) is run after the resident model completes. This model simulates how household AVs are dispatched to serve household members' trips throughout the day. Finally, the parking location of each auto trip to the central business district (CBD) is determined. After the model is run, the output files listed above are created. The trip lists are then summarized into origin-destination matrices by time period and vehicle class or transit mode and assigned to the transport network. \ No newline at end of file diff --git a/docs/design/demand/taxi-tnc-routing.md b/docs/design/demand/taxi-tnc-routing.md new file mode 100644 index 000000000..775d94f25 --- /dev/null +++ b/docs/design/demand/taxi-tnc-routing.md @@ -0,0 +1,125 @@ +# Taxi and TNC Routing Model + +The Taxi and Transportation Network Company (TNC) routing model simulates the operation of for-hire vehicle fleets serving passenger trips. This model processes TNC and taxi trips generated by the activity-based demand models and creates realistic vehicle routing patterns including pooled rides, empty repositioning, and refueling trips. + +## Model Overview + +The model operates as a microsimulation of a taxi/TNC fleet, processing trips in chronological order through fine-grained time bins. Key features include: + +- **Trip pooling**: Matches compatible shared-ride requests to reduce vehicle miles traveled +- **Vehicle dispatching**: Assigns vehicles to trips based on proximity and availability +- **Fleet management**: Tracks vehicle locations, mileage, and refueling needs +- **Deadhead routing**: Simulates empty vehicle repositioning between trips + +The model design is shown below: + +![](../../images/design/taxi_tnc_model_design.png) + +## Model Components + +### Trip Pooling + +For shared TNC modes, the model identifies opportunities to combine multiple passenger trips into a single vehicle route: + +1. **Proximity filtering**: Finds trip pairs where both origins and destinations are within a configurable buffer (default: 10 minutes) +2. **Detour calculation**: Evaluates four possible routing scenarios for each pair: + + - Origin i → Origin j → Destination i → Destination j + - Origin j → Origin i → Destination j → Destination i + - Origin i → Origin j → Destination j → Destination i + - Origin j → Origin i → Destination i → Destination j + +3. **Detour validation**: Filters out pairs where either passenger's detour exceeds the maximum allowed (default: 15 minutes) +4. **Mutual best selection**: Uses a recursive algorithm to select trip pairs where both trips prefer each other + +### Vehicle Dispatching + +The model maintains a fleet of vehicles and matches them to trips: + +- **Free vehicles**: Vehicles that have completed their previous trip are matched to new trips based on proximity +- **New vehicles**: When no free vehicle is available within the maximum wait time, a new vehicle is created at the trip origin +- **Wait time tracking**: Records the time passengers wait for vehicle arrival + +### Occupancy Tracking + +Vehicle occupancy is tracked for each trip leg: + +| Occupancy | Description | +|-----------|-------------| +| 0 | Empty/deadhead trip (repositioning or refueling) | +| 1 | Single passenger (or driver in non-AV scenario) | +| 2 | Two passengers | +| 3+ | Three or more passengers | + +### Refueling + +The model tracks cumulative vehicle mileage and routes vehicles to refueling stations when needed: + +- Vehicles exceeding the maximum distance threshold are routed to the nearest zone with refueling stations +- Refueling trips are marked as deadhead trips with occupancy 0 +- After refueling, the vehicle's odometer is reset + +## Configuration + +Key settings in `taxi_tnc_routing_settings.yaml`: + +| Setting | Description | Default | +|---------|-------------|---------| +| `time_bin_size` | Simulation time bin size (minutes) | 10 | +| `pooling_buffer` | Max O-O and D-D time for pooling (minutes) | 10 | +| `max_detour` | Maximum detour time for pooled trips (minutes) | 15 | +| `max_wait_time` | Maximum wait before creating new vehicle (minutes) | 15 | +| `max_refuel_dist` | Maximum distance before refueling (miles) | 300 | +| `shared_tnc_modes` | Modes eligible for pooling | TNC_SHARED | +| `single_tnc_modes` | Solo ride modes | TNC_SINGLE, TAXI | + +## Outputs + +The model produces several output files: + +### TNC Vehicle Trips (`output_tnc_vehicle_trips.csv`) + +Each row represents a vehicle trip leg with columns: +- `vehicle_id`: Unique vehicle identifier +- `origin_taz`, `destination_taz`: Trip endpoints (TAZ level) +- `depart_bin`: Departure time bin +- `occupancy`: Number of passengers +- `trip_type`: pickup, dropoff, refuel, etc. +- `is_deadhead`: Whether the trip is empty + +### Pooled Trips (`output_tnc_pooled_trips.csv`) + +Details of matched trip pairs including: +- Trip IDs for both passengers +- Route scenario used +- Detour times for each passenger +- Stop sequence + +This file is useful for analyzing pooling efficiency and general debugging of the pooling algorithm. + +## Integration with Traffic Assignment + +TNC vehicle trips are aggregated into origin-destination matrices: + +- **TNCVehicleTrips_pp.omx**: One file per period with occupancy-based cores + - `TNC_EA_0`, `TNC_EA_1`, `TNC_EA_2`, `TNC_EA_3` (and similar for AM, MD, PM, EV) + +The matrix builder script (`tnc_av_matrix_builder.py`) reads the vehicle trip outputs and creates OMX matrices that are imported into traffic assignment alongside other demand matrices. + +## Relationship to Other Models + +### Upstream Dependencies + +- **Resident Model**: Generates TNC_SINGLE, TNC_SHARED, and TAXI trips +- **Visitor Model**: Generates visitor TNC/taxi trips +- **Cross-border Model**: Generates cross-border TNC/taxi trips +- **Airport Model**: Generates airport ground access TNC/taxi trips + +### Downstream Integration + +The vehicle trip outputs can be used for: + +- Traffic Assignment: TNC vehicle matrices are assigned to the highway network +- Fleet sizing analysis +- VMT and emissions calculations +- Equity analysis of service availability diff --git a/docs/images/design/av_routing_model_design.png b/docs/images/design/av_routing_model_design.png new file mode 100644 index 0000000000000000000000000000000000000000..4b46a63b2e22bd2dfb00dbe803b2d4f31e3e4718 GIT binary patch literal 90876 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

-(GA^3^g=yD8(mnJ1sYsfnHL!bUs`>Yf_k#r}}5 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 literal 0 HcmV?d00001 diff --git a/docs/images/design/taxi_tnc_model_design.png b/docs/images/design/taxi_tnc_model_design.png new file mode 100644 index 0000000000000000000000000000000000000000..2d178f5dd0a247212d0c375adcb6ca890899fc0a GIT binary patch literal 66333 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 1a311387a..1d408056d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -60,6 +60,8 @@ nav: - design/demand/visitor.md - design/demand/cvm.md - design/demand/external.md + - design/demand/av-routing.md + - design/demand/taxi-tnc-routing.md - Supply: - design/supply/index.md - design/supply/bike-logsums.md From 249a439363a31c20e84989e8fab90b0caee346ae Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 21:09:13 -0800 Subject: [PATCH 36/53] Adding optional settings for max trips and avs to consider --- src/asim/extensions/av_routing.py | 59 ++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index 2ab6c3ae7..affd2826f 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -55,6 +55,23 @@ class AVRoutingSettings(LogitComponentSettings): If not supplied or None, will default to the chunk size in the location choice model settings. """ + MAX_AVS_TO_CONSIDER: int | None = None + """ + Maximum number of AVs to consider per household when constructing alternatives. + If None, all AVs in the household are considered. + Capping this value reduces the combinatorial explosion of alternatives but may + result in some AVs not being assigned trips. Excluded AVs will remain at their + current location for the time period. + """ + + MAX_TRIPS_TO_CONSIDER: int | None = None + """ + Maximum number of trips to consider per household per time period when constructing alternatives. + If None, all trips in the household are considered. + Capping this value reduces the combinatorial explosion of alternatives but may + result in some trips not being matched to an AV. + """ + def setup_model_settings(state, model_settings): """ @@ -448,7 +465,14 @@ def _av_trip_matching( locals_d=constants, custom_chooser=None, sharrow_enabled=False, - additional_columns=['trip_number', 'household_id', 'depart', 'tour_id', 'destination', 'origin'], + additional_columns=[ + "trip_number", + "household_id", + "depart", + "tour_id", + "destination", + "origin", + ], ) interaction_df = build_av_to_trip_interaction_df( @@ -632,6 +656,39 @@ def av_trip_matching( max_number_of_avs = vehicles.groupby("household_id").size().max() max_number_of_trips = trips.groupby("household_id").size().max() + # apply caps if configured (reduces combinatorial explosion of alternatives) + if model_settings.MAX_AVS_TO_CONSIDER is not None: + if max_number_of_avs > model_settings.MAX_AVS_TO_CONSIDER: + n_excluded_avs = ( + vehicles.groupby("household_id").size() + > model_settings.MAX_AVS_TO_CONSIDER + ).sum() + logger.warning( + f"Capping max AVs from {max_number_of_avs} to {model_settings.MAX_AVS_TO_CONSIDER}. " + f"{n_excluded_avs} households have AVs that will be excluded from matching." + ) + max_number_of_avs = model_settings.MAX_AVS_TO_CONSIDER + # Filter vehicles to only include the first N per household + # av_number is 1-indexed, so we keep av_number <= cap + vehicles = vehicles[ + vehicles.av_number <= model_settings.MAX_AVS_TO_CONSIDER + ] + + if model_settings.MAX_TRIPS_TO_CONSIDER is not None: + if max_number_of_trips > model_settings.MAX_TRIPS_TO_CONSIDER: + n_excluded_trips = ( + trips.groupby("household_id").size() + > model_settings.MAX_TRIPS_TO_CONSIDER + ).sum() + logger.warning( + f"Capping max trips from {max_number_of_trips} to {model_settings.MAX_TRIPS_TO_CONSIDER}. " + f"{n_excluded_trips} households have trips that will be excluded from AV matching." + ) + max_number_of_trips = model_settings.MAX_TRIPS_TO_CONSIDER + # Filter trips to only include the first N per household + # trip_number is 1-indexed, so we keep trip_number <= cap + trips = trips[trips.trip_number <= model_settings.MAX_TRIPS_TO_CONSIDER] + # construct alternatives once for all chunks alts = construct_av_to_trip_alternatives(max_number_of_avs, max_number_of_trips) From 9d3fabbb4ce6b75729e80d45560d3a7c320efc8e Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 21:15:09 -0800 Subject: [PATCH 37/53] add user setting to specify the max number of next trips to consider for repositioning --- src/asim/extensions/av_routing.py | 94 ++++++++++++++++++------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index affd2826f..abc26f4dc 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -72,6 +72,15 @@ class AVRoutingSettings(LogitComponentSettings): result in some trips not being matched to an AV. """ + MAX_NEXT_TRIPS_TO_CONSIDER: int = 3 + """ + Maximum number of future household trips to consider for AV repositioning. + Default is 3. The AV repositioning specification file (av_repositioning.csv) must + include matching alternatives for each next trip option (e.g., service_next_trip_1, + service_next_trip_2, etc.). If you change this setting, you must also update the + spec file to include or remove the corresponding alternatives. + """ + def setup_model_settings(state, model_settings): """ @@ -738,9 +747,10 @@ def get_next_household_trips_to_service( choosers: pd.DataFrame, av_eligible_trips: pd.DataFrame, av_vehicles: pd.DataFrame, + max_next_trips: int = 3, ) -> pd.DataFrame: """ - Get the next 3 household trips to service for each AV vehicle. + Get the next N household trips to service for each AV vehicle. Eligible trips are those that satisfy the following conditions: - the trip origin is not at home - the trip does not have an AV at their current location @@ -752,6 +762,7 @@ def get_next_household_trips_to_service( choosers: DataFrame containing the choosers (AV vehicles). av_eligible_trips: DataFrame containing the eligible trips for AV routing. av_vehicles: DataFrame containing all AV vehicles. + max_next_trips: Maximum number of next trips to consider for repositioning. Returns: choosers with selected next trip info attached as new columns, e.g. @@ -787,8 +798,10 @@ def get_next_household_trips_to_service( ~next_hh_trips.index.isin(trips_with_av_at_origin.trip_id) ] - # select only the first 3 possible trips to reroute to - next_hh_trips = next_hh_trips.groupby("household_id").head(3).reset_index() + # select only the first N possible trips to reroute to + next_hh_trips = ( + next_hh_trips.groupby("household_id").head(max_next_trips).reset_index() + ) # number the trips next_hh_trips["next_trip_number"] = ( next_hh_trips.groupby("household_id").cumcount() + 1 @@ -805,7 +818,7 @@ def get_next_household_trips_to_service( # loop through next_trip_number and add the trip info to choosers choosers.reset_index(inplace=True, drop=False) - for next_trip_num in range(1, 4): + for next_trip_num in range(1, max_next_trips + 1): next_trips = next_hh_trips[next_hh_trips.next_trip_number == next_trip_num][ trip_columns_to_keep ] @@ -885,24 +898,24 @@ def nearest_skim(skim_dict, skim_name, oz, zones): return choosers.destination.map(PARKING_ZONE_MAP) -def reposition_avs_from_choice(state, veh_trips_this_period, choosers): +def reposition_avs_from_choice( + state, veh_trips_this_period, choosers, max_next_trips: int = 3 +): """ Reposition AVs based on the choices made by the AV routing model. Parameters: state: The current state of the simulation. veh_trips_this_period: DataFrame containing trips made by household AVs in this time period. - choices: Series containing the chosen alternatives for each chooser. + choosers: DataFrame containing the choosers with repositioning choices. + max_next_trips: Maximum number of next trips that were considered for repositioning. """ # make sure all choices are one of the expected options expected_choices = [ "go_home", "go_to_parking", - "service_next_trip_1", - "service_next_trip_2", - "service_next_trip_3", "stay_with_person", - ] + ] + [f"service_next_trip_{i}" for i in range(1, max_next_trips + 1)] assert ( choosers["av_repositioning_choice"].isin(expected_choices).all() ), "All repositioning choices should be one of the expected options" @@ -928,7 +941,7 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): # updating location for those going to the next trip origin new_veh_trips["next_trip_id"] = np.nan - for next_trip_num in range(1, 4): + for next_trip_num in range(1, max_next_trips + 1): go_next_trip_mask = ( new_veh_trips["av_repositioning_choice"] == f"service_next_trip_{next_trip_num}" @@ -972,9 +985,16 @@ def reposition_avs_from_choice(state, veh_trips_this_period, choosers): return veh_trips_this_period -def setup_skims_av_repositioning(state, choosers: pd.DataFrame): +def setup_skims_av_repositioning( + state, choosers: pd.DataFrame, max_next_trips: int = 3 +): """ Set up skim wrappers for AV Repositioning model. + + Parameters: + state: The current state of the simulation. + choosers: DataFrame containing the choosers (AV vehicles). + max_next_trips: Maximum number of next trips to set up skims for. """ network_los = state.get_injectable("network_los") skim_dict = network_los.get_default_skim_dict() @@ -988,36 +1008,23 @@ def setup_skims_av_repositioning(state, choosers: pd.DataFrame): dest_key="nearest_av_parking_zone_id", dim3_key="out_period", ) - v_to_trip_orig1_skim_wrapper = skim_dict.wrap_3d( - orig_key="destination", dest_key="next_origin_1", dim3_key="out_period" - ) - v_to_trip_orig2_skim_wrapper = skim_dict.wrap_3d( - orig_key="destination", dest_key="next_origin_2", dim3_key="out_period" - ) - v_to_trip_orig3_skim_wrapper = skim_dict.wrap_3d( - orig_key="destination", dest_key="next_origin_3", dim3_key="out_period" - ) - next_trip_od1_skim_wrapper = skim_dict.wrap_3d( - orig_key="next_origin_1", dest_key="next_destination_1", dim3_key="out_period" - ) - next_trip_od2_skim_wrapper = skim_dict.wrap_3d( - orig_key="next_origin_2", dest_key="next_destination_2", dim3_key="out_period" - ) - next_trip_od3_skim_wrapper = skim_dict.wrap_3d( - orig_key="next_origin_3", dest_key="next_destination_3", dim3_key="out_period" - ) skims = { "v_to_home_skim": v_to_home_skim_wrapper, "v_to_parking_skim": v_to_parking_skim_wrapper, - "v_to_trip_orig1_skim": v_to_trip_orig1_skim_wrapper, - "v_to_trip_orig2_skim": v_to_trip_orig2_skim_wrapper, - "v_to_trip_orig3_skim": v_to_trip_orig3_skim_wrapper, - "next_trip_od1_skim": next_trip_od1_skim_wrapper, - "next_trip_od2_skim": next_trip_od2_skim_wrapper, - "next_trip_od3_skim": next_trip_od3_skim_wrapper, } + # dynamically add skim wrappers for each next trip option + for i in range(1, max_next_trips + 1): + skims[f"v_to_trip_orig{i}_skim"] = skim_dict.wrap_3d( + orig_key="destination", dest_key=f"next_origin_{i}", dim3_key="out_period" + ) + skims[f"next_trip_od{i}_skim"] = skim_dict.wrap_3d( + orig_key=f"next_origin_{i}", + dest_key=f"next_destination_{i}", + dim3_key="out_period", + ) + # updating choosers with skim compliant values choosers["out_period"] = network_los.skim_time_period_label( choosers["depart"].fillna(choosers["depart"].mode()[0]) @@ -1071,10 +1078,16 @@ def av_repositioning( ) choosers = get_next_household_trips_to_service( - state, choosers, av_eligible_trips, av_vehicles + state, + choosers, + av_eligible_trips, + av_vehicles, + max_next_trips=model_settings.MAX_NEXT_TRIPS_TO_CONSIDER, ) - skims, choosers = setup_skims_av_repositioning(state, choosers) + skims, choosers = setup_skims_av_repositioning( + state, choosers, max_next_trips=model_settings.MAX_NEXT_TRIPS_TO_CONSIDER + ) model_spec = simulate.eval_coefficients( state, @@ -1120,7 +1133,10 @@ def av_repositioning( ] veh_trips_this_period = reposition_avs_from_choice( - state, veh_trips_this_period, choosers + state, + veh_trips_this_period, + choosers, + max_next_trips=model_settings.MAX_NEXT_TRIPS_TO_CONSIDER, ) return veh_trips_this_period From a8cbc892b6be0fc4228c7e40d45736ffcba8c731 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 21:24:40 -0800 Subject: [PATCH 38/53] fixing pandas future warnings on fillna --- src/asim/extensions/av_routing.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index abc26f4dc..e65f07842 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -132,10 +132,18 @@ def setup_skims_trip_matching(state, interaction_df: pd.DataFrame): interaction_df["depart"].fillna(interaction_df["depart"].mode()[0]) ) interaction_df["veh_location"] = ( - interaction_df["veh_location"].fillna(-1).astype(int) + pd.to_numeric(interaction_df["veh_location"], errors="coerce") + .fillna(-1) + .astype(int) + ) + interaction_df["origin"] = ( + pd.to_numeric(interaction_df["origin"], errors="coerce").fillna(-1).astype(int) + ) + interaction_df["destination"] = ( + pd.to_numeric(interaction_df["destination"], errors="coerce") + .fillna(-1) + .astype(int) ) - interaction_df["origin"] = interaction_df["origin"].fillna(-1).astype(int) - interaction_df["destination"] = interaction_df["destination"].fillna(-1).astype(int) simulate.set_skim_wrapper_targets(interaction_df, skims) @@ -832,6 +840,8 @@ def get_next_household_trips_to_service( choosers.set_index("repo_chooser_id", inplace=True) # fill NaN values with -1 so skims and stuff works with utility expressions + # use infer_objects to avoid FutureWarning about downcasting + choosers = choosers.infer_objects(copy=False) choosers.fillna(-1, inplace=True) # adding home zone so we can use it for go_to_home option From 1c15591a61337b88cf2e65e30c84006684ee93da Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 21:38:08 -0800 Subject: [PATCH 39/53] updating default settings for taxi_tnc_routing --- .../scripts/taxi_tnc_routing/taxi_tnc_routing.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 19affd2c1..ba20fb57f 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -22,8 +22,8 @@ class TaxiTNCSettings(BaseModel): # path to folder with skim data skim_dir: str # name of skim matrix in OMX file minus time period suffix - skim_time_core: str = "HOV2_TR_H_TIME" - skim_dist_core: str = "HOV2_TR_H_DIST" + skim_time_core: str = "HOV2_H_TIME" + skim_dist_core: str = "HOV2_H_DIST" skim_periods: list = ["EA", "AM", "MD", "PM", "EV"] # time periods to process periods: list = [0, 6, 12, 25, 32, 48] skim_files: list = [ @@ -39,7 +39,14 @@ class TaxiTNCSettings(BaseModel): # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: list = ["TNC_SHARED"] - single_tnc_modes: list = ["TNC_SINGLE", "TAXI"] + single_tnc_modes: list = [ + "TNC_SINGLE", + "TAXI", + "RIDEHAIL_LOC1", + "RIDEHAIL_LOC2", + "TAXI_LOC1", + "TAXI_LOC2", + ] # time bin size (in mins) time_bin_size: int = 10 From e161bf56b840265e34d40d14af7bac6bcfc59f38 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 21:40:46 -0800 Subject: [PATCH 40/53] adding av_routing to settings yamls --- src/asim/configs/resident/settings.yaml | 2 ++ src/asim/configs/resident/settings_mp.yaml | 1 + 2 files changed, 3 insertions(+) diff --git a/src/asim/configs/resident/settings.yaml b/src/asim/configs/resident/settings.yaml index 116be4d73..26f7e1cbf 100644 --- a/src/asim/configs/resident/settings.yaml +++ b/src/asim/configs/resident/settings.yaml @@ -120,6 +120,7 @@ output_tables: - vehicles - proto_disaggregate_accessibility - disaggregate_accessibility + - av_vehicle_trips resume_after: @@ -175,6 +176,7 @@ models: - trip_purpose_and_destination - trip_scheduling - trip_mode_choice + - av_routing - parking_location ### mp_summarize (single process) - write_data_dictionary diff --git a/src/asim/configs/resident/settings_mp.yaml b/src/asim/configs/resident/settings_mp.yaml index 193b6f416..4c615f24f 100644 --- a/src/asim/configs/resident/settings_mp.yaml +++ b/src/asim/configs/resident/settings_mp.yaml @@ -69,6 +69,7 @@ models: - trip_purpose_and_destination - trip_scheduling - trip_mode_choice + - av_routing - parking_location ### mp_summarize (single process) - write_data_dictionary From 2a12758f3238ff93e56801e346b68d3fb64db8d8 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Thu, 29 Jan 2026 22:12:38 -0800 Subject: [PATCH 41/53] excluding av trips from parking location choice model --- ...arking_location_choice_annotate_trips_preprocessor.csv | 2 +- src/asim/extensions/av_routing.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/asim/configs/resident/parking_location_choice_annotate_trips_preprocessor.csv b/src/asim/configs/resident/parking_location_choice_annotate_trips_preprocessor.csv index 788c992ea..5d42d1688 100644 --- a/src/asim/configs/resident/parking_location_choice_annotate_trips_preprocessor.csv +++ b/src/asim/configs/resident/parking_location_choice_annotate_trips_preprocessor.csv @@ -3,6 +3,6 @@ Person Type,ptype,"reindex(persons.ptype, df.person_id)" Trip mode is drive,drive_trip,"df.trip_mode.isin(['DRIVEALONE', 'SHARED2', 'SHARED3'])" # putting all trips into the same parking segment,, Parking segment,parking_segment,"np.where(df['tour_id'] % 4 == 0, 'segment_1',np.where(df['tour_id'] % 4 == 1, 'segment_2',np.where(df['tour_id'] % 4 == 2, 'segment_3', 'segment_4')))" -Parking eligible trip,is_park_eligible,"(drive_trip & (df.purpose != 'home') & (reindex(land_use.parking_type,df.destination)==1))" +Parking eligible trip,is_park_eligible,"(drive_trip & (df.get('serviced_by_av', False) == False) & (df.purpose != 'home') & (reindex(land_use.parking_type,df.destination)==1))" Next Trip Departure,_next_trip_depart,df.groupby('tour_id')['depart'].shift() Activity duration,activity_duration,"np.where(_next_trip_depart.isna(), 0, _next_trip_depart - df.depart)" diff --git a/src/asim/extensions/av_routing.py b/src/asim/extensions/av_routing.py index e65f07842..89b958a3f 100644 --- a/src/asim/extensions/av_routing.py +++ b/src/asim/extensions/av_routing.py @@ -1270,3 +1270,11 @@ def av_routing( ) av_vehicle_trips.set_index("av_vehicle_trip_id", inplace=True) state.add_table("av_vehicle_trips", av_vehicle_trips) + + # denote in the trips table which trips were serviced by an AV + # only serving trips have a valid trip_id (deadhead trips have NA) + served_trip_ids = av_vehicle_trips.loc[ + av_vehicle_trips["trip_type"] == "serving_trip", "trip_id" + ].dropna() + trips["serviced_by_av"] = trips.index.isin(served_trip_ids) + state.add_table("trips", trips) \ No newline at end of file From 10ca4948754d803b1fe3e627e5a3befa43aaf4e3 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 30 Jan 2026 15:24:47 -0800 Subject: [PATCH 42/53] updating path settings to match ABM3 expectations --- .../taxi_tnc_routing/taxi_tnc_routing.py | 218 +++++++++++++++--- .../taxi_tnc_routing_settings.yaml | 43 ++-- .../taxi_tnc_routing/tnc_av_matrix_builder.py | 70 +++++- 3 files changed, 268 insertions(+), 63 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index ba20fb57f..5c7bd43cb 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -1,11 +1,44 @@ -import numpy as np -import pandas as pd -import openmatrix as omx +""" +Taxi/TNC Vehicle Routing Simulation + +Routes taxi and TNC (Transportation Network Company) trips from ActivitySim +person trip outputs to generate vehicle-level trip tables. The simulation: + +- Pools compatible shared-ride trips based on origin/destination proximity +- Matches trips to available vehicles or creates new vehicles as needed +- Generates vehicle trip legs with deadhead, pickup, and dropoff segments +- Handles vehicle refueling based on distance traveled + +Usage +----- + python taxi_tnc_routing.py [--settings ] + +Arguments +--------- + project_dir : str + Path to the project directory. All relative paths in the settings + YAML file (asim_output_dir, skim_dir, output_dir) are resolved + relative to this directory. + + --settings : str, optional + Path to the settings YAML file (default: taxi_tnc_routing_settings.yaml) + +Examples +-------- + python taxi_tnc_routing.py /path/to/project + python taxi_tnc_routing.py C:/models/scenario1 --settings custom_settings.yaml +""" + +import argparse +import logging import os import time -from pydantic import BaseModel, ValidationError, model_validator -import logging + +import numpy as np +import openmatrix as omx +import pandas as pd import yaml +from pydantic import BaseModel, ValidationError, model_validator logger = logging.getLogger(__name__) @@ -14,10 +47,11 @@ class TaxiTNCSettings(BaseModel): """ Taxi / TNC route choice settings """ - # path to activitysim output folder with trip data asim_output_dir: str asim_demand_files: list + # path to landuse file (relative to asim_output_dir) + asim_landuse_file: str = "resident\\final_land_use.csv" # path to folder with skim data skim_dir: str @@ -115,6 +149,7 @@ def check_skim_periods(self): def load_settings( + project_dir: str, yaml_path: str = "taxi_tnc_routing_settings.yaml", ) -> TaxiTNCSettings: """ @@ -124,8 +159,13 @@ def load_settings( model, ensuring all required fields are present and properly typed. Creates the output directory if it doesn't exist and sets up logging. + All relative paths in the settings are resolved relative to the project_dir. + Parameters ---------- + project_dir : str + Base project directory. All relative paths in settings will be resolved + relative to this directory. yaml_path : str Path to the YAML settings file (relative to this module's directory). @@ -136,6 +176,15 @@ def load_settings( """ with open(os.path.join(os.path.dirname(__file__), yaml_path), "r") as f: data = yaml.safe_load(f) + + # Resolve relative paths in settings relative to project_dir + path_fields = ["asim_output_dir", "skim_dir", "output_dir"] + for field in path_fields: + if field in data and data[field]: + path_value = os.path.expanduser(data[field]) + if not os.path.isabs(path_value): + data[field] = os.path.join(project_dir, path_value) + try: settings = TaxiTNCSettings(**data) except ValidationError as e: @@ -286,6 +335,99 @@ def load_skim(omx_file, core): return + @staticmethod + def _read_data_file( + fpath: str, + file_desc: str = "File", + columns: list[str] | None = None, + optional_columns: list[str] | None = None, + ) -> tuple[pd.DataFrame, str]: + """ + Resolve file path, determine file type, and read the data. + + If the path has a recognized extension, validates the file exists. + If no extension is specified, searches for parquet then csv variants. + Reads the file using pandas with optional column filtering. + + Parameters + ---------- + fpath : str + File path, optionally without extension. + file_desc : str, optional + Description of file type for error messages (default "File"). + columns : list[str], optional + Columns to read from the file. If None, reads all columns. + optional_columns : list[str], optional + Additional columns to attempt to read. If they don't exist in the + file, they are silently ignored. + + Returns + ------- + tuple[pd.DataFrame, str] + DataFrame with the file contents and the resolved file path. + + Raises + ------ + ValueError + If file cannot be found with any supported extension. + """ + lower = fpath.lower() + + # Determine file type from extension + if lower.endswith((".parquet", ".parq", ".pq")): + file_type = "parquet" + elif lower.endswith((".csv", ".csv.gz", ".txt", ".txt.gz")): + file_type = "csv" + else: + # No recognized extension - search for both parquet and csv + parquet_candidates = [fpath + ext for ext in [".parquet", ".parq", ".pq"]] + csv_candidates = [fpath + ext for ext in [".csv", ".csv.gz"]] + + found_parquet = next((p for p in parquet_candidates if os.path.exists(p)), None) + found_csv = next((p for p in csv_candidates if os.path.exists(p)), None) + + if found_parquet: + fpath = found_parquet + file_type = "parquet" + elif found_csv: + fpath = found_csv + file_type = "csv" + else: + raise ValueError( + f"{file_desc} not found: {fpath} (also checked for .parquet, .csv extensions)" + ) + + # Verify file exists (for cases where extension was specified) + if not os.path.exists(fpath): + raise ValueError(f"{file_desc} not found: {fpath}") + + # Build column list with optional columns + read_cols = list(columns) if columns else None + if read_cols and optional_columns: + read_cols = read_cols + list(optional_columns) + + # Read the file + if file_type == "parquet": + if read_cols: + try: + df = pd.read_parquet(fpath, columns=read_cols) + except (ValueError, KeyError): + # Optional columns not found, read without them + df = pd.read_parquet(fpath, columns=columns) + else: + df = pd.read_parquet(fpath) + else: # csv + if read_cols: + try: + df = pd.read_csv(fpath, usecols=read_cols) + except (ValueError, KeyError): + # Optional columns not found, read without them + df = pd.read_csv(fpath, usecols=columns) + else: + df = pd.read_csv(fpath) + + return df, fpath + def read_input_data(self): """ Load TNC trip demand from ActivitySim output files. @@ -303,8 +445,8 @@ def read_input_data(self): optionally arrival_mode. """ - # Read the data from the OpenMatrix file - # Convert the data to a pandas DataFrame + logger.info("Loading TNC trip demand data from ActivitySim outputs...") + base_cols = [ "trip_id", "trip_mode", @@ -317,24 +459,12 @@ def read_input_data(self): frames = [] for fname in self.settings.asim_demand_files: fpath = os.path.join(self.settings.asim_output_dir, fname) - if not os.path.exists(fpath): - raise ValueError(f"Demand file not found: {fpath}") - lower = fpath.lower() - if lower.endswith((".parquet", ".parq", ".pq")): - try: - df = pd.read_parquet(fpath, columns=base_cols + [opt_col]) - except (ValueError, KeyError): - df = pd.read_parquet(fpath, columns=base_cols) - elif lower.endswith((".csv", ".csv.gz", ".txt", ".txt.gz")): - try: - df = pd.read_csv(fpath, usecols=base_cols + [opt_col]) - except (ValueError, KeyError): - df = pd.read_csv(fpath, usecols=base_cols) - else: - raise ValueError(f"Unsupported demand file type: {fpath}") - df["source"] = ( - fname.strip(".parquet").strip(".csv").strip(".csv.gz").strip("final_") + df, fpath = self._read_data_file( + fpath, "Demand file", columns=base_cols, optional_columns=[opt_col] ) + df["source"] = os.path.basename(fpath).replace(".parquet", "").replace( + ".csv.gz", "" + ).replace(".csv", "").replace("final_", "") if opt_col in df.columns: df["trip_mode"] = df[opt_col] df.drop(columns=[opt_col], inplace=True) @@ -348,9 +478,11 @@ def read_input_data(self): ) ] - self.landuse = pd.read_csv( - os.path.join(self.settings.asim_output_dir, "final_land_use.csv") + # Load landuse file (supports parquet and CSV) + landuse_path = os.path.join( + self.settings.asim_output_dir, self.settings.asim_landuse_file ) + self.landuse, _ = self._read_data_file(landuse_path, "Land use file") if "MAZ" in self.landuse.columns: maz_to_taz_map = self.landuse.set_index("MAZ")["taz"].to_dict() @@ -368,7 +500,12 @@ def read_input_data(self): trips["dskim_idx"] = ( trips["destination"].map(maz_to_taz_map).map(self.skim_zone_mapping) ) - trips["occupancy"] = trips["tour_participants"] + nan_count = trips["tour_participants"].isna().sum() + if nan_count > 0: + logger.warning( + f"Found {nan_count} trips with NaN tour_participants, filling with 1" + ) + trips["occupancy"] = trips["tour_participants"].fillna(1).astype(int) if self.settings.max_vehicle_occupancy: total_occupants = trips.occupancy.sum() # duplicate trip rows that are over max_occupancy @@ -1625,6 +1762,7 @@ def check_refuel_needs(self, vehicle_trips_i, vehicles): int ), # assuming refuel trip takes the time to get to the station "trip_type": "refuel", + "occupancy": 0, } ) logger.info(f"\tRouting {len(refuel_veh_trips)} vehicles to refuel stations") @@ -1816,9 +1954,31 @@ def route_taxi_tncs(self): if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Route TNC/Taxi trips and generate vehicle trip tables." + ) + parser.add_argument( + "project_dir", + type=str, + help="Path to the project directory. All relative paths in the settings " + "YAML file will be resolved relative to this directory.", + ) + parser.add_argument( + "--settings", + type=str, + default="taxi_tnc_routing_settings.yaml", + help="Path to the settings YAML file (default: taxi_tnc_routing_settings.yaml)", + ) + args = parser.parse_args() + start_time = time.time() - settings = load_settings(yaml_path="taxi_tnc_routing_settings.yaml") + # Resolve project directory to absolute path + project_dir = os.path.abspath(os.path.expanduser(args.project_dir)) + if not os.path.isdir(project_dir): + raise ValueError(f"Project directory does not exist: {project_dir}") + + settings = load_settings(project_dir=project_dir, yaml_path=args.settings) router = TaxiTNCRouter(settings) router.route_taxi_tncs() diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index 09a2f6a8f..8f7b6b654 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -1,32 +1,31 @@ -# path to activitysim output folder with trip data -asim_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data -# asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\full -# asim_output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\outputs\test -# path to folder with skim data -skim_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\input_data_full\skims -# skim_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\sandag_data_cropped -# output folder for results -output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\outputs\tnc_routing_test -# output_dir: C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_outputs\full +# paths are relative to project directory (merged with path of asim_demand_files) + +# path to activitysim output folder with trip data. asim_demand_files are relative to this path +asim_output_dir: output + +# path to folder with skim data. skim_files are relative to this path +skim_dir: output\skims + +# output folder for results. output files will be written here, namely output_tnc_vehicle_trips.csv +output_dir: output\tnc_routing # demand files to process from activitysim output directory # accepts both csv and parquet formats asim_demand_files: - - final_cbxtrips.parquet - - final_santrips.parquet - - final_trips.parquet - - final_trips_visitor.parquet - - final_trips_xborder.parquet + - airport.CBX\final_cbxtrips + - airport.SAN\final_santrips + - resident\final_trips + - visitor\final_trips + - crossborder\final_trips +asim_landuse_file: resident\final_land_use # name of skim matrix in OMX file minus time period suffix skim_time_core: HOV2_H_TIME skim_dist_core: HOV2_H_DIST # time periods to process, should match network_los.yaml settings -skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] -# skim_periods: ['AM', 'AM', 'AM', 'AM', 'AM'] +skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] periods: [0, 6, 12, 25, 32, 48] skim_files: ['traffic_skims_EA.omx', 'traffic_skims_AM.omx', 'traffic_skims_MD.omx', 'traffic_skims_PM.omx', 'traffic_skims_EV.omx'] -# skim_files: ['traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx', 'traffic_skims_AM.omx'] # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: ['TNC_SHARED'] @@ -61,13 +60,13 @@ random_seed: 42 # AV routing outputs (from ActivitySim av_routing model) # Script will try .parquet first, then .csv -av_vehicle_trips_file: "final_av_vehicle_trips" +av_vehicle_trips_file: resident\final_av_vehicle_trips -# TNC routing outputs (from taxi_tnc_routing model) -tnc_vehicle_trips_file: "output_tnc_vehicle_trips.csv" +# TNC routing outputs (from taxi_tnc_routing model) +tnc_vehicle_trips_file: output_tnc_vehicle_trips.csv # Output directory for OMX matrix files -matrix_output_dir: C:\projects\sandag\av_tnc_routing\av_run_dir\tnc_routing_data +matrix_output_dir: output\assignment # Occupancy binning for TNC matrices (occupancy >= max grouped into max bin) max_occupancy_bin: 3 \ No newline at end of file diff --git a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py index 0bd8624c4..94a2d533d 100644 --- a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py +++ b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py @@ -9,8 +9,24 @@ - TNCVehicleTrips_pp.omx: TNC vehicle trips by occupancy (0, 1, 2, 3+) - EmptyAVTrips.omx: AV deadhead/repositioning trips only -Usage: - python tnc_av_matrix_builder.py [--settings path/to/settings.yaml] +Usage +----- + python tnc_av_matrix_builder.py [--settings ] + +Arguments +--------- + project_dir : str + Path to the project directory. All relative paths in the settings + YAML file (asim_output_dir, output_dir, skim_dir, matrix_output_dir) + are resolved relative to this directory. + + --settings : str, optional + Path to the settings YAML file (default: taxi_tnc_routing_settings.yaml) + +Examples +-------- + python tnc_av_matrix_builder.py /path/to/project + python tnc_av_matrix_builder.py C:/models/scenario1 --settings custom_settings.yaml """ import os @@ -62,12 +78,17 @@ def check_periods_match(self): return self -def load_settings(yaml_path: str) -> MatrixBuilderSettings: +def load_settings(project_dir: str, yaml_path: str) -> MatrixBuilderSettings: """ Load and validate settings from YAML file. + All relative paths in the settings are resolved relative to the project_dir. + Parameters ---------- + project_dir : str + Base project directory. All relative paths in settings will be resolved + relative to this directory. yaml_path : str Path to the YAML settings file. @@ -76,9 +97,30 @@ def load_settings(yaml_path: str) -> MatrixBuilderSettings: MatrixBuilderSettings Validated settings object. """ - with open(yaml_path, "r") as f: + # Try yaml_path as-is, then relative to project_dir, then relative to script dir + script_dir = os.path.dirname(os.path.abspath(__file__)) + candidates = [ + yaml_path, + os.path.join(project_dir, yaml_path), + os.path.join(script_dir, yaml_path), + ] + settings_file = next((p for p in candidates if os.path.exists(p)), None) + if settings_file is None: + raise FileNotFoundError( + f"Settings file not found: tried {candidates}" + ) + + with open(settings_file, "r") as f: data = yaml.safe_load(f) + # Resolve relative paths in settings relative to project_dir + path_fields = ["asim_output_dir", "output_dir", "skim_dir", "matrix_output_dir"] + for field in path_fields: + if field in data and data[field]: + path_value = os.path.expanduser(data[field]) + if not os.path.isabs(path_value): + data[field] = os.path.join(project_dir, path_value) + try: settings = MatrixBuilderSettings(**data) except ValidationError as e: @@ -770,6 +812,12 @@ def main(): parser = argparse.ArgumentParser( description="Build TNC/AV demand matrices from routing model outputs" ) + parser.add_argument( + "project_dir", + type=str, + help="Path to the project directory. All relative paths in the settings " + "YAML file will be resolved relative to this directory.", + ) parser.add_argument( "--settings", default="taxi_tnc_routing_settings.yaml", @@ -777,14 +825,12 @@ def main(): ) args = parser.parse_args() - # Determine settings file path - if os.path.isabs(args.settings): - settings_path = args.settings - else: - # Look in same directory as this script - script_dir = os.path.dirname(os.path.abspath(__file__)) - settings_path = os.path.join(script_dir, args.settings) - settings = load_settings(settings_path) + # Resolve project directory to absolute path + project_dir = os.path.abspath(os.path.expanduser(args.project_dir)) + if not os.path.isdir(project_dir): + raise ValueError(f"Project directory does not exist: {project_dir}") + + settings = load_settings(project_dir=project_dir, yaml_path=args.settings) # Setup logging log_dir = settings.matrix_output_dir From 7322af748cbe33115647ab7605ddabd7d0c368c4 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 30 Jan 2026 15:28:24 -0800 Subject: [PATCH 43/53] sensitivity test summary notebooks --- .../AV_sensitivity_test_summaries.ipynb | 8318 ++ .../TNC_sensitivity_test_summaries.ipynb | 106774 +++++++++++++++ .../TNC_summaries_and_comparison.ipynb | 15750 --- .../create_test_taxi_tnc_routing_scenario.py | 69 - 4 files changed, 115092 insertions(+), 15819 deletions(-) create mode 100644 src/asim/scripts/taxi_tnc_routing/AV_sensitivity_test_summaries.ipynb create mode 100644 src/asim/scripts/taxi_tnc_routing/TNC_sensitivity_test_summaries.ipynb delete mode 100644 src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb delete mode 100644 src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py diff --git a/src/asim/scripts/taxi_tnc_routing/AV_sensitivity_test_summaries.ipynb b/src/asim/scripts/taxi_tnc_routing/AV_sensitivity_test_summaries.ipynb new file mode 100644 index 000000000..c10dfe4c0 --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/AV_sensitivity_test_summaries.ipynb @@ -0,0 +1,8318 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Imports / display settings\n", + "\n", + "from pathlib import Path\n", + "from typing import Dict, List, Optional\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import plotly.graph_objects as go\n", + "import openmatrix as omx\n", + "\n", + "pd.set_option(\"display.max_columns\", 200)\n", + "pd.set_option(\"display.width\", 200)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reading files" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['base', 'deadheading_charge', 'no_cost_remote_parking', 'no_parking_cbd']\n" + ] + } + ], + "source": [ + "# Config (paths, scenario namess)\n", + "\n", + "ROOT_DIR = Path(r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\AV_intraHH_sensitivity_tests\")\n", + "\n", + "SCENARIO_FILES = {\n", + " \"households\": \"final_households.csv\",\n", + " \"trips\": \"final_trips.csv\",\n", + " \"av_trips\": \"final_av_vehicle_trips.csv\",\n", + "}\n", + "\n", + "LAND_USE_PATH = Path(\n", + " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\sensitivity_test_run_dir\\final_land_use.csv\"\n", + ")\n", + "\n", + "SKIM_PATH = Path(\n", + " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\input_data_full\\skims\\traffic_skims_MD.omx\"\n", + ")\n", + "\n", + "SKIM_DIST_CORE = \"SOV_TR_H_DIST__MD\"\n", + "\n", + "DRIVE_MODES = [\"DRIVEALONE\", \"SHARED2\", \"SHARED3\"]\n", + "REPO_CORE_ORDER = [\"stay_with_person\", \"go_to_parking\", \"go_home\"]\n", + "\n", + "DAY_START_HHMM = \"03:00\"\n", + "\n", + "all_dirs = sorted([p.name for p in ROOT_DIR.iterdir() if p.is_dir()])\n", + "\n", + "ALL_SCENARIOS = [\"base\"] + [s for s in all_dirs if s != \"base\"]\n", + "print(ALL_SCENARIOS)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# helpers (no I/O)\n", + "\n", + "def stop_period_to_clock_minutes(stop_period: pd.Series) -> pd.Series:\n", + " sp = pd.to_numeric(stop_period, errors=\"coerce\")\n", + " return (sp - 1) * 30.0\n", + "\n", + "def clock_minutes_to_hhmm(minutes_since_3am: float) -> str:\n", + " if not np.isfinite(minutes_since_3am):\n", + " return \"\"\n", + " total = int(round(minutes_since_3am))\n", + " base_h = 3\n", + " hh = (base_h * 60 + total) % (24 * 60)\n", + " h = hh // 60\n", + " m = hh % 60\n", + " return f\"{h:02d}:{m:02d}\"\n", + "\n", + "def format_time_ticks(fig: go.Figure, minutes: List[int]) -> None:\n", + " fig.update_xaxes(\n", + " tickmode=\"array\",\n", + " tickvals=minutes,\n", + " ticktext=[clock_minutes_to_hhmm(v) for v in minutes],\n", + " title=f\"Time of day)\",\n", + " )\n", + "\n", + "# Plot helpers\n", + "\n", + "def fig_grouped_choice_pct(df: pd.DataFrame, title: str) -> go.Figure:\n", + " fig = go.Figure()\n", + " for scen in df[\"scenario\"].unique():\n", + " sub = df[df[\"scenario\"] == scen]\n", + " fig.add_trace(go.Bar(x=sub[\"choice\"], y=sub[\"pct\"] * 100.0, name=scen))\n", + " fig.update_layout(title=title, barmode=\"group\", xaxis_title=\"Choice\", yaxis_title=\"Percent\")\n", + " return fig\n", + "\n", + "def fig_overlay_time_series(df: pd.DataFrame, title: str, y_col: str) -> go.Figure:\n", + " fig = go.Figure()\n", + " for scen in df[\"scenario\"].unique():\n", + " sub = df[df[\"scenario\"] == scen].sort_values(\"clock_min\")\n", + " fig.add_trace(go.Scatter(x=sub[\"clock_min\"], y=sub[y_col], mode=\"lines\", name=scen))\n", + " fig.update_layout(title=title, yaxis_title=y_col)\n", + " return fig\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded land use: C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\sensitivity_test_run_dir\\final_land_use.csv\n", + "Loaded skim: C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\input_data_full\\skims\\traffic_skims_MD.omx\n", + "Skim shape: (4947, 4947)\n", + "TAZ mapping size: 4947\n" + ] + } + ], + "source": [ + "# fixed inputs (land use + skim) (ONE TIME READ)\n", + "\n", + "with omx.open_file(SKIM_PATH, \"r\") as f:\n", + " SKIM_DIST = np.asarray(f[SKIM_DIST_CORE])\n", + "\n", + " map_name = list(f.list_mappings())[0]\n", + " zones = list(f.mapping(map_name))\n", + " TAZ_TO_IDX = {int(z): int(i) for i, z in enumerate(zones)}\n", + "\n", + "print(\"Loaded land use:\", LAND_USE_PATH)\n", + "print(\"Loaded skim:\", SKIM_PATH)\n", + "print(\"Skim shape:\", SKIM_DIST.shape)\n", + "print(\"TAZ mapping size:\", len(TAZ_TO_IDX))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MGRA - TAZ mapping size: 24333\n" + ] + } + ], + "source": [ + "# Build MGRA - TAZ mapping \n", + "LAND_USE = pd.read_csv(LAND_USE_PATH, low_memory=False)\n", + "\n", + "def build_mgra_to_taz(land_use: pd.DataFrame) -> Dict[int, int]:\n", + " mgra_col = \"mgra\"\n", + " taz_col = \"taz\"\n", + "\n", + " mgra = land_use[mgra_col]\n", + " taz = land_use[taz_col]\n", + " mapping = {}\n", + " valid = mgra.notna() & taz.notna()\n", + " for m, t in zip(mgra[valid].astype(int), taz[valid].astype(int)):\n", + " mapping[int(m)] = int(t)\n", + "\n", + " return mapping\n", + "\n", + "MGRA_TO_TAZ = build_mgra_to_taz(LAND_USE)\n", + "print(\"MGRA - TAZ mapping size:\", len(MGRA_TO_TAZ))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded scenarios: ['base', 'deadheading_charge', 'no_cost_remote_parking', 'no_parking_cbd']\n" + ] + } + ], + "source": [ + "# Scenario loader + bulk scenario read\n", + "# This cell reads ALL scenario CSVs into memory exactly once.\n", + "# Everything below will use SCENARIO_DATA_ALL and MUST NOT call read_csv again.\n", + "\n", + "def load_av_scenario_csv(scenario_name: str) -> Optional[dict]:\n", + " sdir = ROOT_DIR / scenario_name\n", + " paths = {k: sdir / v for k, v in SCENARIO_FILES.items()}\n", + "\n", + " # CSV-only, no timers\n", + " households = pd.read_csv(paths[\"households\"], low_memory=False)\n", + " trips = pd.read_csv(paths[\"trips\"], low_memory=False)\n", + " av_trips = pd.read_csv(paths[\"av_trips\"], low_memory=False)\n", + "\n", + " return {\n", + " \"scenario\": scenario_name,\n", + " \"dir\": sdir,\n", + " \"households\": households,\n", + " \"trips\": trips,\n", + " \"av_trips\": av_trips,\n", + " }\n", + "\n", + "SCENARIO_DATA_ALL: Dict[str, dict] = {}\n", + "for scen in ALL_SCENARIOS:\n", + " SCENARIO_DATA_ALL[scen] = load_av_scenario_csv(scen)\n", + "\n", + "print(\"Loaded scenarios:\", list(SCENARIO_DATA_ALL.keys()))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scenarios updated: []\n" + ] + } + ], + "source": [ + "# Update selected scenarios\n", + "# Set to [] or None if no updates are needed.\n", + "\n", + "SCENARIOS_TO_UPDATE = []\n", + "# Examples:\n", + "# SCENARIOS_TO_UPDATE = [\"deadheading_charge\"]\n", + "# SCENARIOS_TO_UPDATE = [\"base\", \"deadheading_charge\"]\n", + "\n", + "if SCENARIOS_TO_UPDATE:\n", + " for scen in SCENARIOS_TO_UPDATE:\n", + " sd = load_av_scenario_csv(scen)\n", + " if sd is not None:\n", + " SCENARIO_DATA_ALL[scen] = sd\n", + "\n", + "print(\"Scenarios updated:\", SCENARIOS_TO_UPDATE)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Trip-dist prep done for: ['base', 'deadheading_charge', 'no_cost_remote_parking', 'no_parking_cbd']\n" + ] + } + ], + "source": [ + "# Trip-dist (run once after initial load; then only for updated scenarios)\n", + "# Behavior:\n", + "# - If run with SCENARIOS_TO_UPDATE = [...] : only runs those scenarios.\n", + "# - If SCENARIOS_TO_UPDATE is empty: it runs ALL scenarios.\n", + "\n", + "def add_otaz_dtaz_idx_from_mgra(df: pd.DataFrame, o_mgra_col: str, d_mgra_col: str) -> pd.DataFrame:\n", + " out = df.copy()\n", + "\n", + " o_mgra = out[o_mgra_col]\n", + " d_mgra = out[d_mgra_col]\n", + "\n", + " o_taz = o_mgra.map(MGRA_TO_TAZ)\n", + " d_taz = d_mgra.map(MGRA_TO_TAZ)\n", + "\n", + " out[\"o_taz\"] = pd.to_numeric(o_taz, errors=\"coerce\")\n", + " out[\"d_taz\"] = pd.to_numeric(d_taz, errors=\"coerce\")\n", + "\n", + " otaz_idx = out[\"o_taz\"].map(TAZ_TO_IDX)\n", + " dtaz_idx = out[\"d_taz\"].map(TAZ_TO_IDX)\n", + "\n", + " out[\"otaz_idx\"] = pd.to_numeric(otaz_idx, errors=\"coerce\")\n", + " out[\"dtaz_idx\"] = pd.to_numeric(dtaz_idx, errors=\"coerce\")\n", + "\n", + " return out\n", + "\n", + "\n", + "def get_trip_dist(df: pd.DataFrame, skim: np.ndarray) -> pd.DataFrame:\n", + " m = df[\"otaz_idx\"].notna() & df[\"dtaz_idx\"].notna()\n", + " i = df.loc[m, \"otaz_idx\"].astype(int).to_numpy()\n", + " j = df.loc[m, \"dtaz_idx\"].astype(int).to_numpy()\n", + " ok = (i >= 0) & (i < skim.shape[0]) & (j >= 0) & (j < skim.shape[1])\n", + " vals = np.full(m.sum(), np.nan, dtype=float)\n", + " vals[ok] = skim[i[ok], j[ok]]\n", + " df[\"trip_dist\"] = np.nan\n", + " df.loc[m, \"trip_dist\"] = vals\n", + " return df\n", + "\n", + "\n", + "def ensure_trip_dist_for_scenario(sd: dict) -> dict:\n", + " trips = sd[\"trips\"]\n", + " av = sd[\"av_trips\"]\n", + "\n", + " trips_o = \"origin\"\n", + " trips_d = \"destination\"\n", + "\n", + " trips2 = add_otaz_dtaz_idx_from_mgra(trips, trips_o, trips_d)\n", + " trips2 = get_trip_dist(trips2, SKIM_DIST)\n", + "\n", + " av_o = \"origin\"\n", + " av_d = \"destination\"\n", + "\n", + " av2 = add_otaz_dtaz_idx_from_mgra(av, av_o, av_d)\n", + " av2 = get_trip_dist(av2, SKIM_DIST)\n", + "\n", + " sd[\"trips\"] = trips2\n", + " sd[\"av_trips\"] = av2\n", + " sd[\"_prepped_trip_dist\"] = True\n", + " return sd\n", + "\n", + "\n", + "# Decide which scenarios to prep:\n", + "# - If SCENARIOS_TO_UPDATE exists and is non-empty: prep only those.\n", + "# - Otherwise: prep ALL scenarios.\n", + "\n", + "if \"SCENARIOS_TO_UPDATE\" in globals() and SCENARIOS_TO_UPDATE:\n", + " _targets = [s for s in SCENARIOS_TO_UPDATE if s in SCENARIO_DATA_ALL]\n", + "else:\n", + " _targets = list(SCENARIO_DATA_ALL.keys())\n", + "\n", + "for s in _targets:\n", + " SCENARIO_DATA_ALL[s] = ensure_trip_dist_for_scenario(SCENARIO_DATA_ALL[s])\n", + "\n", + "print(\"Trip-dist prep done for:\", _targets)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def metric1_share_driving_served(scenario_data: Dict[str, dict]) -> pd.DataFrame:\n", + " rows = []\n", + " for scen, sd in scenario_data.items():\n", + " trips = sd[\"trips\"]\n", + " av = sd[\"av_trips\"]\n", + "\n", + " total_drive = int(trips[trips[\"trip_mode\"].isin(DRIVE_MODES)].shape[0])\n", + "\n", + " served = av[\"trip_id\"].dropna().nunique()\n", + "\n", + " share = (served / total_drive) if total_drive else np.nan\n", + "\n", + " rows.append({\n", + " \"scenario\": scen,\n", + " \"total_driving_trips\": total_drive,\n", + " \"av_served_driving_trips_unique\": int(served),\n", + " \"share_served\": float(share),\n", + " })\n", + " return pd.DataFrame(rows)\n", + "\n", + "def metric1_share_driving_served_with_why(scenario_data: Dict[str, dict]) -> pd.DataFrame:\n", + " rows = []\n", + " for scen, sd in scenario_data.items():\n", + " trips = sd[\"trips\"]\n", + " av = sd[\"av_trips\"]\n", + "\n", + " drive_trips = trips[trips[\"trip_mode\"].isin(DRIVE_MODES)].copy()\n", + " total_drive = int(len(drive_trips))\n", + "\n", + " av_trip_ids = set(av[\"trip_id\"].dropna().unique())\n", + " served_ids = set(drive_trips.loc[drive_trips[\"trip_id\"].isin(av_trip_ids), \"trip_id\"].dropna().unique())\n", + " served = int(len(served_ids))\n", + "\n", + " non_served = drive_trips.loc[~drive_trips[\"trip_id\"].isin(av_trip_ids)].copy()\n", + "\n", + " veh_hh_links = (\n", + " av.loc[av[\"trip_id\"].notna(), [\"vehicle_id\", \"trip_id\"]]\n", + " .merge(trips[[\"trip_id\", \"household_id\"]], on=\"trip_id\", how=\"left\")\n", + " .dropna(subset=[\"vehicle_id\", \"household_id\"])\n", + " )\n", + " veh_to_hh = (\n", + " veh_hh_links.drop_duplicates(subset=[\"vehicle_id\", \"household_id\"])\n", + " .set_index(\"vehicle_id\")[\"household_id\"]\n", + " )\n", + "\n", + " veh_timepool = (\n", + " av.dropna(subset=[\"vehicle_id\", \"depart\"])\n", + " .groupby(\"vehicle_id\")[\"depart\"]\n", + " .apply(lambda s: set(s.unique()))\n", + " )\n", + "\n", + " hh_to_vehicles = (\n", + " veh_to_hh.reset_index()\n", + " .groupby(\"household_id\")[\"vehicle_id\"]\n", + " .apply(list)\n", + " .to_dict()\n", + " )\n", + "\n", + " if len(non_served):\n", + " vids_series = non_served[\"household_id\"].map(hh_to_vehicles)\n", + " depart_series = non_served[\"depart\"]\n", + "\n", + " unavailable = []\n", + " for vids, depart_bin in zip(vids_series, depart_series):\n", + " if not isinstance(vids, list) or len(vids) == 0:\n", + " unavailable.append(False)\n", + " else:\n", + " unavailable.append(all(depart_bin in veh_timepool.get(v, set()) for v in vids))\n", + "\n", + " non_served[\"unavailable\"] = unavailable\n", + " unavail_ct = int(non_served[\"unavailable\"].sum())\n", + " else:\n", + " unavail_ct = 0\n", + "\n", + " avail_not_used_ct = int(len(non_served) - unavail_ct)\n", + "\n", + " served_pct = (served / total_drive) if total_drive else float(\"nan\")\n", + " unavail_pct = (unavail_ct / total_drive) if total_drive else float(\"nan\")\n", + " avail_not_used_pct = (avail_not_used_ct / total_drive) if total_drive else float(\"nan\")\n", + "\n", + " rows.append({\n", + " \"scenario\": scen,\n", + " \"total_driving_trips\": total_drive,\n", + " \"served_ct\": served,\n", + " \"unavailable_ct\": unavail_ct,\n", + " \"available_not_used_ct\": avail_not_used_ct,\n", + " \"served_pct\": served_pct,\n", + " \"unavailable_pct\": unavail_pct,\n", + " \"available_not_used_pct\": avail_not_used_pct,\n", + " })\n", + "\n", + " return pd.DataFrame(rows)\n", + "\n", + "def metric2_reposition_choice(scenario_data: Dict[str, dict]) -> pd.DataFrame:\n", + " all_rows = []\n", + " for scen, sd in scenario_data.items():\n", + " av = sd[\"av_trips\"]\n", + "\n", + " vc = av[\"av_repositioning_choice\"].dropna().value_counts()\n", + " total = float(vc.sum()) if len(vc) else 0.0\n", + "\n", + " present = list(vc.index)\n", + " ordered = [c for c in REPO_CORE_ORDER if c in present] + [c for c in present if c not in REPO_CORE_ORDER]\n", + "\n", + " for c in ordered:\n", + " cnt = int(vc.get(c, 0))\n", + " pct = (cnt / total) if total else np.nan\n", + " all_rows.append({\"scenario\": scen, \"choice\": c, \"count\": cnt, \"pct\": pct})\n", + "\n", + " return pd.DataFrame(all_rows)\n", + "\n", + "def metric3_deadhead_shares(scenario_data: Dict[str, dict]) -> pd.DataFrame:\n", + " rows = []\n", + " for scen, sd in scenario_data.items():\n", + " trips = sd[\"trips\"]\n", + " av = sd[\"av_trips\"]\n", + "\n", + " drive_trips = trips[trips[\"trip_mode\"].isin(DRIVE_MODES)]\n", + " total_av = int(av.shape[0])\n", + " dead_ct = int(av.loc[av[\"is_deadhead\"] == True].shape[0])\n", + "\n", + "\n", + " av_trip_ids = set(av[\"trip_id\"].dropna().unique())\n", + " non_av_drive = drive_trips.loc[~drive_trips[\"trip_id\"].isin(av_trip_ids)]\n", + " non_av_ct = int(non_av_drive.shape[0])\n", + "\n", + " dead_pct_of_av = (dead_ct / total_av) if total_av else np.nan\n", + " dead_pct_of_all_driving = (dead_ct / (total_av + non_av_ct)) if (total_av + non_av_ct) else np.nan\n", + "\n", + " rows.append({\n", + " \"scenario\": scen,\n", + " \"deadhead_av_trips\": dead_ct,\n", + " \"all_av_trips\": total_av,\n", + " \"all_non_av_driving_trips\": non_av_ct,\n", + " \"deadhead_pct_of_av_trips\": float(dead_pct_of_av),\n", + " \"deadhead_pct_of_all_driving\": float(dead_pct_of_all_driving),\n", + " })\n", + "\n", + " return pd.DataFrame(rows)\n", + "\n", + "def add_prev_dest_to_cur_orig_dist(\n", + " df: pd.DataFrame,\n", + " prev_dest_mgra_col: str,\n", + " cur_orig_mgra_col: str,\n", + " out_col: str,\n", + ") -> pd.DataFrame:\n", + " out = df.copy()\n", + "\n", + " prev_mgra = out[prev_dest_mgra_col]\n", + " cur_mgra = out[cur_orig_mgra_col]\n", + "\n", + " prev_taz = prev_mgra.map(MGRA_TO_TAZ)\n", + " cur_taz = cur_mgra.map(MGRA_TO_TAZ)\n", + "\n", + " i = prev_taz.map(TAZ_TO_IDX)\n", + " j = cur_taz.map(TAZ_TO_IDX)\n", + "\n", + " i = pd.to_numeric(i, errors=\"coerce\").fillna(-1).astype(np.int64).to_numpy()\n", + " j = pd.to_numeric(j, errors=\"coerce\").fillna(-1).astype(np.int64).to_numpy()\n", + "\n", + " valid = (i >= 0) & (j >= 0) & (i < SKIM_DIST.shape[0]) & (j < SKIM_DIST.shape[1])\n", + "\n", + " dist = np.full(len(out), np.nan, dtype=float)\n", + " dist[valid] = SKIM_DIST[i[valid], j[valid]]\n", + "\n", + " out[out_col] = dist\n", + " return out\n", + "\n", + "def metric4_prev_dest_to_next_origin(scenario_data: Dict[str, dict]):\n", + " overall_rows = []\n", + " profile_rows = []\n", + "\n", + " for scen, sd in scenario_data.items():\n", + " av = sd[\"av_trips\"].copy()\n", + "\n", + " depart_col = \"depart\"\n", + " if depart_col is None:\n", + " overall_rows.append({\"scenario\": scen, \"avg_prev_dest_to_next_origin_dist\": np.nan})\n", + " continue\n", + "\n", + " needed = {\"vehicle_id\", \"origin\", \"destination\", depart_col}\n", + " if any(c not in av.columns for c in needed):\n", + " overall_rows.append({\"scenario\": scen, \"avg_prev_dest_to_next_origin_dist\": np.nan})\n", + " continue\n", + "\n", + " base = av.dropna(subset=[\"vehicle_id\", \"origin\", \"destination\", depart_col]).copy()\n", + "\n", + " if \"is_deadhead\" in base.columns:\n", + " base = base.loc[base[\"is_deadhead\"] == False].copy()\n", + "\n", + " base[\"veh\"] = pd.to_numeric(base[\"vehicle_id\"], errors=\"coerce\").astype(\"Int64\")\n", + " base[\"depart_bin\"] = pd.to_numeric(base[depart_col], errors=\"coerce\")\n", + "\n", + " base = base.sort_values([\"veh\", \"depart_bin\"])\n", + " base[\"prev_dest_mgra\"] = base.groupby(\"veh\")[\"destination\"].shift(1)\n", + "\n", + " base = add_prev_dest_to_cur_orig_dist(\n", + " base,\n", + " prev_dest_mgra_col=\"prev_dest_mgra\",\n", + " cur_orig_mgra_col=\"origin\",\n", + " out_col=\"prevdest_to_curorig_dist\",\n", + " )\n", + "\n", + " arr = pd.to_numeric(base[\"prevdest_to_curorig_dist\"], errors=\"coerce\").to_numpy()\n", + " overall_mean = float(np.nanmean(arr)) if np.isfinite(arr).any() else np.nan\n", + " overall_rows.append({\"scenario\": scen, \"avg_prev_dest_to_next_origin_dist\": overall_mean})\n", + "\n", + " tmp = base.copy()\n", + " tmp[\"clock_min\"] = stop_period_to_clock_minutes(tmp[\"depart_bin\"])\n", + " prof = (\n", + " tmp.groupby(\"clock_min\", dropna=True)[\"prevdest_to_curorig_dist\"]\n", + " .mean()\n", + " .reset_index()\n", + " .rename(columns={\"prevdest_to_curorig_dist\": \"mean_dist\"})\n", + " )\n", + "\n", + " for _, r in prof.iterrows():\n", + " profile_rows.append({\n", + " \"scenario\": scen,\n", + " \"clock_min\": float(r[\"clock_min\"]),\n", + " \"mean_dist\": float(r[\"mean_dist\"]),\n", + " })\n", + "\n", + " return pd.DataFrame(overall_rows), pd.DataFrame(profile_rows)\n", + "\n", + "def metric5_not_served_within_av_households(scenario_data: Dict[str, dict]) -> pd.DataFrame:\n", + " rows = []\n", + " for scen, sd in scenario_data.items():\n", + " hh = sd[\"households\"]\n", + " trips = sd[\"trips\"]\n", + " av = sd[\"av_trips\"]\n", + "\n", + " hh_id_col = \"household_id\"\n", + " trips_hh_col = \"household_id\"\n", + "\n", + " if hh_id_col is None or trips_hh_col is None:\n", + " rows.append({\n", + " \"scenario\": scen,\n", + " \"hh_with_av_count\": 0,\n", + " \"driving_trips_from_av_households\": 0,\n", + " \"driving_trips_not_served_by_av\": 0,\n", + " \"share_not_served_within_av_households\": np.nan,\n", + " })\n", + " continue\n", + "\n", + " av_own_col = \"av_ownership\"\n", + " auto_own_col =\"auto_ownership\"\n", + "\n", + " if av_own_col is None:\n", + " hh_with_av = set()\n", + " else:\n", + " av_own = pd.to_numeric(hh[av_own_col], errors=\"coerce\").fillna(0).ne(0)\n", + " if auto_own_col is not None:\n", + " auto_own = pd.to_numeric(hh[auto_own_col], errors=\"coerce\").fillna(0).ne(0)\n", + " mask = av_own & auto_own\n", + " else:\n", + " mask = av_own\n", + "\n", + " hh_with_av = set(\n", + " pd.to_numeric(hh.loc[mask, hh_id_col], errors=\"coerce\").dropna().astype(int).unique()\n", + " )\n", + "\n", + " hh_drive = trips[\n", + " (trips[trips_hh_col].isin(hh_with_av)) &\n", + " (trips[\"trip_mode\"].isin(DRIVE_MODES))\n", + " ].copy()\n", + "\n", + " av_trip_ids = set(av[\"trip_id\"].dropna().unique())\n", + " non_served = hh_drive.loc[~hh_drive[\"trip_id\"].isin(av_trip_ids)].copy()\n", + "\n", + " total = int(hh_drive.shape[0])\n", + " not_served = int(non_served.shape[0])\n", + " share = (not_served / total) if total else np.nan\n", + "\n", + " rows.append({\n", + " \"scenario\": scen,\n", + " \"hh_with_av_count\": int(len(hh_with_av)),\n", + " \"driving_trips_from_av_households\": total,\n", + " \"driving_trips_not_served_by_av\": not_served,\n", + " \"share_not_served_within_av_households\": float(share),\n", + " })\n", + "\n", + " return pd.DataFrame(rows)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# def run_all_cases(all_data: Dict[str, dict], scenario_order: List[str]) -> None:\n", + "# scenario_data = {s: all_data[s] for s in scenario_order if s in all_data}\n", + "# if not scenario_data:\n", + "# print(\"No scenarios loaded.\")\n", + "# return\n", + "\n", + "# print(\"Using loaded scenarios:\", list(scenario_data.keys()))\n", + "\n", + "# # ---------------- Metric 1 ----------------\n", + "# m1 = metric1_share_driving_served_with_why(scenario_data)\n", + "\n", + "# m1_print = m1.copy()\n", + "# m1_print[\"served_pct\"] = (m1_print[\"served_pct\"] * 100.0).round(2)\n", + "# m1_print[\"unavailable_pct\"] = (m1_print[\"unavailable_pct\"] * 100.0).round(2)\n", + "# m1_print[\"available_not_used_pct\"] = (m1_print[\"available_not_used_pct\"] * 100.0).round(2)\n", + "\n", + "# print(\"\\n[Metric 1] Share of driving trips serviced by AV\")\n", + "# print(m1_print[[\n", + "# \"scenario\",\n", + "# \"total_driving_trips\",\n", + "# \"served_ct\",\n", + "# \"unavailable_ct\",\n", + "# \"available_not_used_ct\",\n", + "# \"served_pct\",\n", + "# \"unavailable_pct\",\n", + "# \"available_not_used_pct\",\n", + "# ]].to_string(index=False))\n", + "\n", + "# m1_plot = m1.set_index(\"scenario\").loc[scenario_order].reset_index()\n", + "\n", + "# y_served = m1_plot[\"served_pct\"] * 100.0\n", + "# y_unav = m1_plot[\"unavailable_pct\"] * 100.0\n", + "# y_avail = m1_plot[\"available_not_used_pct\"] * 100.0\n", + "\n", + "# fig1 = go.Figure()\n", + "# fig1.add_trace(go.Bar(\n", + "# x=m1_plot[\"scenario\"],\n", + "# y=y_served,\n", + "# name=\"Served by AV\",\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_served],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"inside\",\n", + "# insidetextanchor=\"middle\",\n", + "# ))\n", + "# fig1.add_trace(go.Bar(\n", + "# x=m1_plot[\"scenario\"],\n", + "# y=y_unav,\n", + "# name=\"Not served: AV unavailable\",\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_unav],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"inside\",\n", + "# insidetextanchor=\"middle\",\n", + "# ))\n", + "# fig1.add_trace(go.Bar(\n", + "# x=m1_plot[\"scenario\"],\n", + "# y=y_avail,\n", + "# name=\"Not served: AV available, not used\",\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_avail],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"inside\",\n", + "# insidetextanchor=\"middle\",\n", + "# ))\n", + "# fig1.update_layout(\n", + "# barmode=\"stack\",\n", + "# title=\"driving trips breakdown\",\n", + "# xaxis_title=\"Scenario\",\n", + "# yaxis_title=\"Percent\",\n", + "# uniformtext_minsize=9,\n", + "# uniformtext_mode=\"hide\",\n", + "# )\n", + "# fig1.update_traces(\n", + "# texttemplate=\"%{y:.1f}\",\n", + "# textposition=\"inside\",\n", + "# insidetextanchor=\"middle\",\n", + "# textfont=dict(size=14),\n", + "# cliponaxis=False, # prevent text from being clipped by the plot area\n", + "# )\n", + "\n", + "# fig1.update_layout(\n", + "# uniformtext_minsize=14,\n", + "# uniformtext_mode=\"show\", # never hide labels\n", + "# yaxis=dict(range=[0, 105]), # a little headroom; keeps everything comfortably visible\n", + "# margin=dict(t=80),\n", + "# )\n", + "# fig1.show()\n", + "\n", + "# # ---------------- Metric 2 ----------------\n", + "# m2 = metric2_reposition_choice(scenario_data)\n", + "# m2_print = m2.copy()\n", + "# m2_print[\"pct\"] = (m2_print[\"pct\"] * 100.0).round(2)\n", + "# print(\"\\n[Metric 2] AV repositioning choices (percent)\")\n", + "# print(m2_print[[\"scenario\", \"choice\", \"count\", \"pct\"]].to_string(index=False))\n", + "\n", + "# # grouped bars: x=choice, one trace per scenario (with labels)\n", + "# m2_plot = m2.copy()\n", + "# m2_plot[\"pct100\"] = m2_plot[\"pct\"] * 100.0\n", + "\n", + "# # stable ordering (your existing REPO_CORE_ORDER first, then any extras)\n", + "# present = list(m2_plot[\"choice\"].dropna().unique())\n", + "# choice_order = [c for c in REPO_CORE_ORDER if c in present] + [c for c in present if c not in REPO_CORE_ORDER]\n", + "\n", + "# fig2 = go.Figure()\n", + "# for scen in scenario_order:\n", + "# if scen not in scenario_data:\n", + "# continue\n", + "# sub = m2_plot.loc[m2_plot[\"scenario\"] == scen].copy()\n", + "# sub = sub.set_index(\"choice\").reindex(choice_order).reset_index()\n", + "\n", + "# y = sub[\"pct100\"]\n", + "# fig2.add_trace(go.Bar(\n", + "# x=sub[\"choice\"],\n", + "# y=y,\n", + "# name=scen,\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"outside\",\n", + "# ))\n", + "\n", + "# fig2.update_layout(\n", + "# barmode=\"group\",\n", + "# title=\"AV repositioning choice breakdown\",\n", + "# xaxis_title=\"Choice\",\n", + "# yaxis_title=\"Percent\",\n", + "# uniformtext_minsize=9,\n", + "# uniformtext_mode=\"hide\",\n", + "# )\n", + "# fig2.show()\n", + "\n", + "# # ---------------- Metric 3 ----------------\n", + "# m3 = metric3_deadhead_shares(scenario_data)\n", + "# m3_print = m3.copy()\n", + "# m3_print[\"deadhead_pct_of_av_trips\"] = (m3_print[\"deadhead_pct_of_av_trips\"] * 100.0).round(2)\n", + "# m3_print[\"deadhead_pct_of_all_driving\"] = (m3_print[\"deadhead_pct_of_all_driving\"] * 100.0).round(2)\n", + "# print(\"\\n[Metric 3] Deadheading shares (counts-based)\")\n", + "# print(m3_print[[\n", + "# \"scenario\",\n", + "# \"deadhead_av_trips\",\n", + "# \"all_av_trips\",\n", + "# \"all_non_av_driving_trips\",\n", + "# \"deadhead_pct_of_av_trips\",\n", + "# \"deadhead_pct_of_all_driving\",\n", + "# ]].to_string(index=False))\n", + "\n", + "# y = m3[\"deadhead_pct_of_av_trips\"] * 100.0\n", + "# fig3a = go.Figure()\n", + "# fig3a.add_trace(go.Bar(\n", + "# x=m3[\"scenario\"],\n", + "# y=y,\n", + "# name=\"% of trips\",\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"outside\",\n", + "# ))\n", + "# fig3a.update_layout(title=\"Deadheading (% of AV trips)\",\n", + "# xaxis_title=\"Scenario\", yaxis_title=\"Percent\")\n", + "# fig3a.show()\n", + "\n", + "# y = m3[\"deadhead_pct_of_all_driving\"] * 100.0\n", + "# fig3b = go.Figure()\n", + "# fig3b.add_trace(go.Bar(\n", + "# x=m3[\"scenario\"],\n", + "# y=y,\n", + "# name=\"% of VMT\",\n", + "# text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + "# texttemplate=\"%{text}\",\n", + "# textposition=\"outside\",\n", + "# ))\n", + "# fig3b.update_layout(title=\"Deadheading (% of VMT)\",\n", + "# xaxis_title=\"Scenario\", yaxis_title=\"Percent\")\n", + "# fig3b.show()\n", + "\n", + "# # ---------------- Metric 4 ----------------\n", + "# m4_overall, m4_profile = metric4_prev_dest_to_next_origin(scenario_data)\n", + "# print(\"\\n[Metric 4] Avg prev-dest → next-origin distance (overall, served trips)\")\n", + "# print(m4_overall.to_string(index=False))\n", + "\n", + "# fig4 = fig_overlay_time_series(\n", + "# m4_profile,\n", + "# \"Mean prev-dest → next-origin distance by time (served trips)\",\n", + "# y_col=\"mean_dist\",\n", + "# )\n", + "# ticks = list(range(0, 24 * 60, 120))\n", + "# format_time_ticks(fig4, ticks)\n", + "# fig4.update_yaxes(title=\"Miles\")\n", + "# fig4.show()\n", + "def run_all_cases(all_data: Dict[str, dict], scenario_order: List[str]) -> None:\n", + " scenario_data = {s: all_data[s] for s in scenario_order if s in all_data}\n", + " if not scenario_data:\n", + " print(\"No scenarios loaded.\")\n", + " return\n", + "\n", + " print(\"Using loaded scenarios:\", list(scenario_data.keys()))\n", + "\n", + " SCALE = 1.30 # +30% text sizing\n", + "\n", + " # ---------------- Metric 1 ----------------\n", + " m1 = metric1_share_driving_served_with_why(scenario_data)\n", + "\n", + " m1_print = m1.copy()\n", + " m1_print[\"served_pct\"] = (m1_print[\"served_pct\"] * 100.0).round(2)\n", + " m1_print[\"unavailable_pct\"] = (m1_print[\"unavailable_pct\"] * 100.0).round(2)\n", + " m1_print[\"available_not_used_pct\"] = (m1_print[\"available_not_used_pct\"] * 100.0).round(2)\n", + "\n", + " print(\"\\n[Metric 1] Share of driving trips serviced by AV\")\n", + " print(m1_print[[\n", + " \"scenario\",\n", + " \"total_driving_trips\",\n", + " \"served_ct\",\n", + " \"unavailable_ct\",\n", + " \"available_not_used_ct\",\n", + " \"served_pct\",\n", + " \"unavailable_pct\",\n", + " \"available_not_used_pct\",\n", + " ]].to_string(index=False))\n", + "\n", + " m1_plot = m1.set_index(\"scenario\").loc[scenario_order].reset_index()\n", + "\n", + " y_served = m1_plot[\"served_pct\"] * 100.0\n", + " y_unav = m1_plot[\"unavailable_pct\"] * 100.0\n", + " y_avail = m1_plot[\"available_not_used_pct\"] * 100.0\n", + "\n", + " fig1 = go.Figure()\n", + " fig1.add_trace(go.Bar(\n", + " x=m1_plot[\"scenario\"],\n", + " y=y_served,\n", + " name=\"Served\",\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_served],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"inside\",\n", + " insidetextanchor=\"middle\",\n", + " ))\n", + " fig1.add_trace(go.Bar(\n", + " x=m1_plot[\"scenario\"],\n", + " y=y_unav,\n", + " name=\"Not served: unavailable\",\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_unav],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"inside\",\n", + " insidetextanchor=\"middle\",\n", + " ))\n", + " fig1.add_trace(go.Bar(\n", + " x=m1_plot[\"scenario\"],\n", + " y=y_avail,\n", + " name=\"Not served: avail/not used\",\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y_avail],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"inside\",\n", + " insidetextanchor=\"middle\",\n", + " ))\n", + "\n", + " fig1.update_layout(\n", + " barmode=\"stack\",\n", + " width=1600,\n", + " height=780,\n", + " title=None,\n", + " xaxis=dict(title=\"Scenario\", titlefont=dict(size=int(22*SCALE)), tickfont=dict(size=int(18*SCALE))),\n", + " yaxis=dict(title=\"Percent\", titlefont=dict(size=int(22*SCALE)), tickfont=dict(size=int(18*SCALE)), range=[0, 112]),\n", + " legend=dict(\n", + " orientation=\"h\",\n", + " yanchor=\"bottom\",\n", + " y=1.02,\n", + " xanchor=\"left\",\n", + " x=0.0,\n", + " font=dict(size=int(18*SCALE)),\n", + " title_text=\"\",\n", + " ),\n", + " margin=dict(l=95, r=50, t=40, b=95),\n", + " uniformtext_minsize=int(18*SCALE),\n", + " uniformtext_mode=\"show\",\n", + " font=dict(size=int(16*SCALE)),\n", + " )\n", + " fig1.update_traces(textfont=dict(size=int(18*SCALE)), cliponaxis=False)\n", + " fig1.show()\n", + "\n", + " # ---------------- Metric 2 ----------------\n", + " m2 = metric2_reposition_choice(scenario_data)\n", + " m2_print = m2.copy()\n", + " m2_print[\"pct\"] = (m2_print[\"pct\"] * 100.0).round(2)\n", + " print(\"\\n[Metric 2] AV repositioning choices (percent)\")\n", + " print(m2_print[[\"scenario\", \"choice\", \"count\", \"pct\"]].to_string(index=False))\n", + "\n", + " m2_plot = m2.copy()\n", + " m2_plot[\"pct100\"] = m2_plot[\"pct\"] * 100.0\n", + "\n", + " present = list(m2_plot[\"choice\"].dropna().unique())\n", + " choice_order = [c for c in REPO_CORE_ORDER if c in present] + [c for c in present if c not in REPO_CORE_ORDER]\n", + "\n", + " fig2 = go.Figure()\n", + " for scen in scenario_order:\n", + " if scen not in scenario_data:\n", + " continue\n", + " sub = m2_plot.loc[m2_plot[\"scenario\"] == scen].copy()\n", + " sub = sub.set_index(\"choice\").reindex(choice_order).reset_index()\n", + "\n", + " y = sub[\"pct100\"]\n", + " fig2.add_trace(go.Bar(\n", + " x=sub[\"choice\"],\n", + " y=y,\n", + " name=scen,\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"outside\",\n", + " ))\n", + "\n", + " fig2.update_layout(\n", + " barmode=\"group\",\n", + " width=1900,\n", + " height=800,\n", + " title=None,\n", + " xaxis=dict(title=\"Choice\", titlefont=dict(size=int(22*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " yaxis=dict(title=\"Percent\", titlefont=dict(size=int(22*SCALE)), tickfont=dict(size=int(18*SCALE)), range=[0, 110]),\n", + " legend=dict(\n", + " orientation=\"h\",\n", + " yanchor=\"bottom\",\n", + " y=1.02,\n", + " xanchor=\"left\",\n", + " x=0.0,\n", + " font=dict(size=int(18*SCALE)),\n", + " title_text=\"\",\n", + " ),\n", + " margin=dict(l=95, r=50, t=40, b=130),\n", + " uniformtext_minsize=int(14*SCALE),\n", + " uniformtext_mode=\"show\",\n", + " font=dict(size=int(16*SCALE)),\n", + " )\n", + " fig2.update_traces(textfont=dict(size=int(16*SCALE)), cliponaxis=False)\n", + " fig2.show()\n", + "\n", + " # ---------------- Metric 3 ----------------\n", + " m3 = metric3_deadhead_shares(scenario_data)\n", + " m3_print = m3.copy()\n", + " m3_print[\"deadhead_pct_of_av_trips\"] = (m3_print[\"deadhead_pct_of_av_trips\"] * 100.0).round(2)\n", + " m3_print[\"deadhead_pct_of_all_driving\"] = (m3_print[\"deadhead_pct_of_all_driving\"] * 100.0).round(2)\n", + " print(\"\\n[Metric 3] Deadheading shares (counts-based)\")\n", + " print(m3_print[[\n", + " \"scenario\",\n", + " \"deadhead_av_trips\",\n", + " \"all_av_trips\",\n", + " \"all_non_av_driving_trips\",\n", + " \"deadhead_pct_of_av_trips\",\n", + " \"deadhead_pct_of_all_driving\",\n", + " ]].to_string(index=False))\n", + "\n", + " y = m3[\"deadhead_pct_of_av_trips\"] * 100.0\n", + " fig3a = go.Figure()\n", + " fig3a.add_trace(go.Bar(\n", + " x=m3[\"scenario\"],\n", + " y=y,\n", + " name=\"Deadhead (% AV trips)\",\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"outside\",\n", + " ))\n", + " fig3a.update_layout(\n", + " width=1400,\n", + " height=720,\n", + " title=None,\n", + " xaxis=dict(title=\"Scenario\", titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " yaxis=dict(title=\"Percent\", titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " margin=dict(l=90, r=50, t=40, b=95),\n", + " uniformtext_minsize=int(14*SCALE),\n", + " uniformtext_mode=\"show\",\n", + " font=dict(size=int(16*SCALE)),\n", + " )\n", + " fig3a.update_traces(textfont=dict(size=int(16*SCALE)), cliponaxis=False)\n", + " fig3a.show()\n", + "\n", + " y = m3[\"deadhead_pct_of_all_driving\"] * 100.0\n", + " fig3b = go.Figure()\n", + " fig3b.add_trace(go.Bar(\n", + " x=m3[\"scenario\"],\n", + " y=y,\n", + " name=\"Deadhead (% all driving)\",\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"outside\",\n", + " ))\n", + " fig3b.update_layout(\n", + " width=1400,\n", + " height=720,\n", + " title=None,\n", + " xaxis=dict(title=\"Scenario\", titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " yaxis=dict(title=\"Percent\", titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " margin=dict(l=90, r=50, t=40, b=95),\n", + " uniformtext_minsize=int(14*SCALE),\n", + " uniformtext_mode=\"show\",\n", + " font=dict(size=int(16*SCALE)),\n", + " )\n", + " fig3b.update_traces(textfont=dict(size=int(16*SCALE)), cliponaxis=False)\n", + " fig3b.show()\n", + "\n", + " # ---------------- Metric 4 ----------------\n", + " m4_overall, m4_profile = metric4_prev_dest_to_next_origin(scenario_data)\n", + " print(\"\\n[Metric 4] Avg prev-dest → next-origin distance (overall, served trips)\")\n", + " print(m4_overall.to_string(index=False))\n", + "\n", + " fig4 = fig_overlay_time_series(\n", + " m4_profile,\n", + " \"\", # no title\n", + " y_col=\"mean_dist\",\n", + " )\n", + " ticks = list(range(0, 24 * 60, 120))\n", + " format_time_ticks(fig4, ticks)\n", + " fig4.update_yaxes(title=\"Miles\")\n", + "\n", + " fig4.update_layout(\n", + " width=1600,\n", + " height=780,\n", + " title=None,\n", + " legend=dict(font=dict(size=int(16*SCALE)), title_text=\"\"),\n", + " xaxis=dict(titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " yaxis=dict(titlefont=dict(size=int(20*SCALE)), tickfont=dict(size=int(16*SCALE))),\n", + " margin=dict(l=95, r=50, t=40, b=95),\n", + " font=dict(size=int(16*SCALE)),\n", + " )\n", + " fig4.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stay with person in CBD when parking prohibited " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Repositioning choice breakdown for AV trips with CBD destinations" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "name": "base", + "text": [ + "38.9", + "30.5", + "16.6", + "8.7", + "3.7", + "1.6" + ], + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 38.90627849024494, + 30.525588038655567, + 16.582842034887253, + 8.683826657752386, + 3.677900686804838, + 1.6235640916550171 + ] + }, + { + "name": "deadheading_charge", + "text": [ + "67.9", + "20.4", + "6.1", + "3.7", + "1.4", + "0.5" + ], + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 67.94834281014481, + 20.352869536334804, + 6.100483198759974, + 3.652856092179456, + 1.3989829891893175, + 0.546465373391644 + ] + }, + { + "name": "no_cost_remote_parking", + "text": [ + "36.0", + "37.6", + "14.2", + "7.5", + "3.2", + "1.5" + ], + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 36.048463671237045, + 37.64518211857648, + 14.194994112955298, + 7.464013065441148, + 3.1934368946788716, + 1.4539101371111702 + ] + }, + { + "name": "no_parking_cbd", + "text": [ + "", + "54.6", + "25.2", + "12.9", + "5.1", + "2.2" + ], + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + null, + 54.594109003981636, + 25.187852580451153, + 12.864571041392278, + 5.115223862416542, + 2.2382435117583914 + ] + } + ], + "layout": { + "barmode": "group", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Going to CBD: AV repositioning choice breakdown" + }, + "uniformtext": { + "minsize": 9, + "mode": "hide" + }, + "xaxis": { + "title": { + "text": "Choice" + } + }, + "yaxis": { + "title": { + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Going to CBD: AV repositioning choice breakdown\n", + "# (apply the same exclusion ONLY for no_parking_cbd: drop CBD-dest + stay_with_person trip_ids)\n", + "\n", + "SCEN_EXCL = \"no_parking_cbd\"\n", + "CHOICE_EXCL = \"stay_with_person\"\n", + "\n", + "mgra_to_pseudo = dict(zip(\n", + " LAND_USE[\"mgra\"].astype(int),\n", + " pd.to_numeric(LAND_USE[\"pseudomsa\"], errors=\"coerce\").fillna(-1).astype(int),\n", + "))\n", + "\n", + "# trip_ids to exclude (ONLY for no_parking_cbd)\n", + "av_excl = SCENARIO_DATA_ALL[SCEN_EXCL][\"av_trips\"]\n", + "dest_pseudo_excl = pd.to_numeric(av_excl[\"destination\"], errors=\"coerce\").fillna(-1).astype(int).map(mgra_to_pseudo)\n", + "drop_trip_ids = set(\n", + " av_excl.loc[(dest_pseudo_excl == 1) & (av_excl[\"av_repositioning_choice\"] == CHOICE_EXCL), \"trip_id\"]\n", + " .dropna()\n", + " .unique()\n", + ")\n", + "\n", + "rows = []\n", + "for scen, sd in SCENARIO_DATA_ALL.items():\n", + " av = sd[\"av_trips\"]\n", + "\n", + " if scen == SCEN_EXCL and drop_trip_ids:\n", + " av = av.loc[~av[\"trip_id\"].isin(drop_trip_ids)].copy()\n", + "\n", + " dest_pseudo = pd.to_numeric(av[\"destination\"], errors=\"coerce\").fillna(-1).astype(int).map(mgra_to_pseudo)\n", + " cbd = av.loc[dest_pseudo == 1]\n", + "\n", + " vc = cbd[\"av_repositioning_choice\"].dropna().value_counts()\n", + " total = float(vc.sum()) if len(vc) else 0.0\n", + "\n", + " present = list(vc.index)\n", + " ordered = [c for c in REPO_CORE_ORDER if c in present] + [c for c in present if c not in REPO_CORE_ORDER]\n", + "\n", + " for c in ordered:\n", + " cnt = int(vc.get(c, 0))\n", + " pct = (cnt / total) if total else float(\"nan\")\n", + " rows.append({\"scenario\": scen, \"choice\": c, \"count\": cnt, \"pct\": pct})\n", + "\n", + "df_cbd_choice = pd.DataFrame(rows)\n", + "df_cbd_choice[\"pct100\"] = df_cbd_choice[\"pct\"] * 100.0\n", + "\n", + "present = list(df_cbd_choice[\"choice\"].dropna().unique())\n", + "choice_order = [c for c in REPO_CORE_ORDER if c in present] + [c for c in present if c not in REPO_CORE_ORDER]\n", + "\n", + "fig = go.Figure()\n", + "for scen in list(SCENARIO_DATA_ALL.keys()):\n", + " sub = df_cbd_choice.loc[df_cbd_choice[\"scenario\"] == scen].copy()\n", + " sub = sub.set_index(\"choice\").reindex(choice_order).reset_index()\n", + "\n", + " y = sub[\"pct100\"]\n", + " fig.add_trace(go.Bar(\n", + " x=sub[\"choice\"],\n", + " y=y,\n", + " name=scen,\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"outside\",\n", + " ))\n", + "\n", + "fig.update_layout(\n", + " barmode=\"group\",\n", + " title=\"Going to CBD: AV repositioning choice breakdown\",\n", + " xaxis_title=\"Choice\",\n", + " yaxis_title=\"Percent\",\n", + " uniformtext_minsize=9,\n", + " uniformtext_mode=\"hide\",\n", + ")\n", + "fig.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deadheading percentage of trips heading to CBD" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "text": [ + "42.2", + "26.8", + "42.1", + "46.3" + ], + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 42.23721443285591, + 26.78729871547205, + 42.074677601385055, + 46.34252313858742 + ] + } + ], + "layout": { + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Going to CBD: Deadheading share of VMT" + }, + "uniformtext": { + "minsize": 9, + "mode": "hide" + }, + "xaxis": { + "title": { + "text": "Scenario" + } + }, + "yaxis": { + "title": { + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mgra_to_pseudo = dict(zip(\n", + " LAND_USE[\"mgra\"].astype(int),\n", + " pd.to_numeric(LAND_USE[\"pseudomsa\"], errors=\"coerce\").fillna(-1).astype(int),\n", + "))\n", + "\n", + "rows = []\n", + "for scen, sd in SCENARIO_DATA_ALL.items():\n", + " av = sd[\"av_trips\"]\n", + "\n", + " dest_pseudo = pd.to_numeric(av[\"destination\"], errors=\"coerce\").fillna(-1).astype(int).map(mgra_to_pseudo)\n", + " sub = av.loc[dest_pseudo == 1]\n", + "\n", + " A = pd.to_numeric(sub.loc[sub[\"is_deadhead\"] == True, \"trip_dist\"], errors=\"coerce\").sum()\n", + " B = pd.to_numeric(sub[\"trip_dist\"], errors=\"coerce\").sum()\n", + "\n", + " rows.append({\"scenario\": scen, \"pct\": (A / B * 100.0) if B > 0 else float(\"nan\")})\n", + "\n", + "df = pd.DataFrame(rows).set_index(\"scenario\").loc[list(SCENARIO_DATA_ALL.keys())].reset_index()\n", + "\n", + "y = df[\"pct\"]\n", + "fig = go.Figure()\n", + "fig.add_trace(go.Bar(\n", + " x=df[\"scenario\"],\n", + " y=y,\n", + " text=[f\"{v:.1f}\" if pd.notna(v) else \"\" for v in y],\n", + " texttemplate=\"%{text}\",\n", + " textposition=\"outside\",\n", + "))\n", + "fig.update_layout(\n", + " title=\"Going to CBD: Deadheading share of VMT\",\n", + " xaxis_title=\"Scenario\",\n", + " yaxis_title=\"Percent\",\n", + " uniformtext_minsize=9,\n", + " uniformtext_mode=\"hide\",\n", + ")\n", + "fig.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Summaries" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filtered out 235 AV rows in no_parking_cbd (CBD dest + stay_with_person).\n", + "Using loaded scenarios: ['base', 'deadheading_charge', 'no_cost_remote_parking', 'no_parking_cbd']\n", + "\n", + "[Metric 1] Share of driving trips serviced by AV\n", + " scenario total_driving_trips served_ct unavailable_ct available_not_used_ct served_pct unavailable_pct available_not_used_pct\n", + " base 10582539 8505884 1906616 170039 80.38 18.02 1.61\n", + " deadheading_charge 10582539 8045232 1821706 715601 76.02 17.21 6.76\n", + "no_cost_remote_parking 10582539 8505841 1906663 170035 80.38 18.02 1.61\n", + " no_parking_cbd 10582539 8505642 1906722 170175 80.37 18.02 1.61\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "cliponaxis": false, + "insidetextanchor": "middle", + "name": "Served", + "text": [ + "80.4", + "76.0", + "80.4", + "80.4" + ], + "textfont": { + "size": 23 + }, + "textposition": "inside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 80.37659015478232, + 76.02364612121912, + 80.3761838250726, + 80.37430336897413 + ] + }, + { + "cliponaxis": false, + "insidetextanchor": "middle", + "name": "Not served: unavailable", + "text": [ + "18.0", + "17.2", + "18.0", + "18.0" + ], + "textfont": { + "size": 23 + }, + "textposition": "inside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 18.01662153099554, + 17.214262097215045, + 18.017065658817792, + 18.017623180977647 + ] + }, + { + "cliponaxis": false, + "insidetextanchor": "middle", + "name": "Not served: avail/not used", + "text": [ + "1.6", + "6.8", + "1.6", + "1.6" + ], + "textfont": { + "size": 23 + }, + "textposition": "inside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 1.606788314222135, + 6.762091781565842, + 1.6067505161096027, + 1.6080734500482352 + ] + } + ], + "layout": { + "barmode": "stack", + "font": { + "size": 20 + }, + "height": 780, + "legend": { + "font": { + "size": 23 + }, + "orientation": "h", + "title": { + "text": "" + }, + "x": 0, + "xanchor": "left", + "y": 1.02, + "yanchor": "bottom" + }, + "margin": { + "b": 95, + "l": 95, + "r": 50, + "t": 40 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": {}, + "uniformtext": { + "minsize": 23, + "mode": "show" + }, + "width": 1600, + "xaxis": { + "tickfont": { + "size": 23 + }, + "title": { + "font": { + "size": 28 + }, + "text": "Scenario" + } + }, + "yaxis": { + "range": [ + 0, + 112 + ], + "tickfont": { + "size": 23 + }, + "title": { + "font": { + "size": 28 + }, + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[Metric 2] AV repositioning choices (percent)\n", + " scenario choice count pct\n", + " base stay_with_person 5293608 75.28\n", + " base go_to_parking 94645 1.35\n", + " base go_home 783028 11.14\n", + " base service_next_trip_1 488805 6.95\n", + " base service_next_trip_2 245158 3.49\n", + " base service_next_trip_3 126788 1.80\n", + " deadheading_charge stay_with_person 6040785 90.92\n", + " deadheading_charge go_to_parking 55162 0.83\n", + " deadheading_charge go_home 290038 4.37\n", + " deadheading_charge service_next_trip_1 140167 2.11\n", + " deadheading_charge service_next_trip_2 75763 1.14\n", + " deadheading_charge service_next_trip_3 41820 0.63\n", + "no_cost_remote_parking stay_with_person 5282844 75.13\n", + "no_cost_remote_parking go_to_parking 116803 1.66\n", + "no_cost_remote_parking go_home 775615 11.03\n", + "no_cost_remote_parking service_next_trip_1 486306 6.92\n", + "no_cost_remote_parking service_next_trip_2 244742 3.48\n", + "no_cost_remote_parking service_next_trip_3 125720 1.79\n", + " no_parking_cbd stay_with_person 5241319 74.54\n", + " no_parking_cbd go_to_parking 125726 1.79\n", + " no_parking_cbd go_home 794674 11.30\n", + " no_parking_cbd service_next_trip_1 495211 7.04\n", + " no_parking_cbd service_next_trip_2 247842 3.52\n", + " no_parking_cbd service_next_trip_3 127025 1.81\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "cliponaxis": false, + "name": "base", + "text": [ + "75.3", + "1.3", + "11.1", + "7.0", + "3.5", + "1.8" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 75.27849702617964, + 1.3459125328212387, + 11.135159794494678, + 6.951120245186597, + 3.4863038165924163, + 1.8030065847254393 + ] + }, + { + "cliponaxis": false, + "name": "deadheading_charge", + "text": [ + "90.9", + "0.8", + "4.4", + "2.1", + "1.1", + "0.6" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 90.92453266122143, + 0.8302859761865878, + 4.365586526253681, + 2.1097620540253335, + 1.1403675793811765, + 0.6294652029317847 + ] + }, + { + "cliponaxis": false, + "name": "no_cost_remote_parking", + "text": [ + "75.1", + "1.7", + "11.0", + "6.9", + "3.5", + "1.8" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 75.12544741703321, + 1.6610139604068812, + 11.029745322474449, + 6.915584831122734, + 3.4803890199558305, + 1.7878194490069013 + ] + }, + { + "cliponaxis": false, + "name": "no_parking_cbd", + "text": [ + "74.5", + "1.8", + "11.3", + "7.0", + "3.5", + "1.8" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "stay_with_person", + "go_to_parking", + "go_home", + "service_next_trip_1", + "service_next_trip_2", + "service_next_trip_3" + ], + "y": [ + 74.5374048767335, + 1.7879640154572152, + 11.301151042898423, + 7.042453017343931, + 3.5245898025782028, + 1.8064372449887276 + ] + } + ], + "layout": { + "barmode": "group", + "font": { + "size": 20 + }, + "height": 800, + "legend": { + "font": { + "size": 23 + }, + "orientation": "h", + "title": { + "text": "" + }, + "x": 0, + "xanchor": "left", + "y": 1.02, + "yanchor": "bottom" + }, + "margin": { + "b": 130, + "l": 95, + "r": 50, + "t": 40 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": {}, + "uniformtext": { + "minsize": 18, + "mode": "show" + }, + "width": 1900, + "xaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 28 + }, + "text": "Choice" + } + }, + "yaxis": { + "range": [ + 0, + 110 + ], + "tickfont": { + "size": 23 + }, + "title": { + "font": { + "size": 28 + }, + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[Metric 3] Deadheading shares (counts-based)\n", + " scenario deadhead_av_trips all_av_trips all_non_av_driving_trips deadhead_pct_of_av_trips deadhead_pct_of_all_driving\n", + " base 4567115 13072999 2076655 34.94 30.15\n", + " deadheading_charge 2532260 10577492 2537307 23.94 19.31\n", + "no_cost_remote_parking 4584904 13090745 2076698 35.02 30.23\n", + " no_parking_cbd 4644831 13150473 2076897 35.32 30.50\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "cliponaxis": false, + "name": "Deadhead (% AV trips)", + "text": [ + "34.9", + "23.9", + "35.0", + "35.3" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 34.935480374472604, + 23.940079557611575, + 35.02401123847421, + 35.32063827666123 + ] + } + ], + "layout": { + "font": { + "size": 20 + }, + "height": 720, + "margin": { + "b": 95, + "l": 90, + "r": 50, + "t": 40 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": {}, + "uniformtext": { + "minsize": 18, + "mode": "show" + }, + "width": 1400, + "xaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 26 + }, + "text": "Scenario" + } + }, + "yaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 26 + }, + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "cliponaxis": false, + "name": "Deadhead (% all driving)", + "text": [ + "30.1", + "19.3", + "30.2", + "30.5" + ], + "textfont": { + "size": 20 + }, + "textposition": "outside", + "texttemplate": "%{text}", + "type": "bar", + "x": [ + "base", + "deadheading_charge", + "no_cost_remote_parking", + "no_parking_cbd" + ], + "y": [ + 30.146662095385146, + 19.308416392809374, + 30.228588958600337, + 30.503172905104424 + ] + } + ], + "layout": { + "font": { + "size": 20 + }, + "height": 720, + "margin": { + "b": 95, + "l": 90, + "r": 50, + "t": 40 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": {}, + "uniformtext": { + "minsize": 18, + "mode": "show" + }, + "width": 1400, + "xaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 26 + }, + "text": "Scenario" + } + }, + "yaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 26 + }, + "text": "Percent" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[Metric 4] Avg prev-dest → next-origin distance (overall, served trips)\n", + " scenario avg_prev_dest_to_next_origin_dist\n", + " base 3.206320\n", + " deadheading_charge 2.024152\n", + "no_cost_remote_parking 3.205988\n", + " no_parking_cbd 3.207656\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 30, + 60, + 90, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 390, + 420, + 450, + 480, + 510, + 540, + 570, + 600, + 630, + 660, + 690, + 720, + 750, + 780, + 810, + 840, + 870, + 900, + 930, + 960, + 990, + 1020, + 1050, + 1080, + 1110, + 1140, + 1170, + 1200, + 1230, + 1260, + 1290, + 1320, + 1350, + 1380, + 1410 + ], + "y": [ + 0.2714457365994652, + 0.8927347626574444, + 1.3531234943683632, + 1.2673367674688183, + 1.7793020247664253, + 2.3128333300518644, + 3.3725693443605262, + 4.179149411723364, + 4.206713924418482, + 3.8618501890623973, + 4.0626043799173965, + 3.4298166030071733, + 3.1678839804601977, + 2.8747135192941657, + 2.6926575914480213, + 2.72756511218195, + 2.8548184814562108, + 3.2572360564421876, + 3.428757835280082, + 3.1555934283420917, + 2.967130917531452, + 3.09249924653567, + 3.151277089317307, + 3.1446521381003785, + 3.1813263869542614, + 3.0935919822939284, + 3.187978964195365, + 3.3141371573305594, + 3.333518458550885, + 3.3796782158341356, + 3.3366790136113447, + 3.0069599927856787, + 2.993864283602907, + 2.7757430360411903, + 2.8027185436505997, + 2.6939945725531556, + 2.6417836241275863, + 2.866277203438918, + 3.0015666023708487, + 3.1255724167527683, + 3.0295474862592977, + 3.1619391361479026, + 3.0236653850139836, + 3.115792247295438, + 3.178840532604329, + 3.2577241295705237, + 3.6303520670175757, + 3.672035104131932 + ] + }, + { + "mode": "lines", + "name": "deadheading_charge", + "type": "scatter", + "x": [ + 0, + 30, + 60, + 90, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 390, + 420, + 450, + 480, + 510, + 540, + 570, + 600, + 630, + 660, + 690, + 720, + 750, + 780, + 810, + 840, + 870, + 900, + 930, + 960, + 990, + 1020, + 1050, + 1080, + 1110, + 1140, + 1170, + 1200, + 1230, + 1260, + 1290, + 1320, + 1350, + 1380, + 1410 + ], + "y": [ + 0.2718235046346808, + 0.36691210886351316, + 0.44885193900624026, + 0.4728974733729561, + 0.6514673248518877, + 0.9638677416573755, + 1.5670188382476584, + 2.243148413578458, + 2.4638780326588745, + 2.392408998554988, + 2.6556643789228858, + 2.3141061406795593, + 2.216847336805212, + 2.003839482853951, + 1.8756468991734954, + 1.8558457984726902, + 1.8986926314799195, + 2.0550148126255574, + 2.1125424379891, + 2.034707044033121, + 1.9176448730995763, + 2.0090066106421633, + 2.0515739046570696, + 2.0307787512085325, + 2.0423883359980377, + 1.9701605246536706, + 2.011632804062396, + 2.1146292888901783, + 2.085737339315754, + 2.117923610035623, + 2.0682278463122277, + 1.8751090530055918, + 1.8804489651990808, + 1.7121724236604543, + 1.726023455212698, + 1.6176991174117032, + 1.56870236176705, + 1.685524616810208, + 1.7250297393725096, + 1.7124041144586166, + 1.661442803510967, + 1.70806506306668, + 1.624558801767843, + 1.5740692670598757, + 1.5497771129732372, + 1.5440323123681345, + 1.539568204513605, + 1.6157791292932275 + ] + }, + { + "mode": "lines", + "name": "no_cost_remote_parking", + "type": "scatter", + "x": [ + 0, + 30, + 60, + 90, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 390, + 420, + 450, + 480, + 510, + 540, + 570, + 600, + 630, + 660, + 690, + 720, + 750, + 780, + 810, + 840, + 870, + 900, + 930, + 960, + 990, + 1020, + 1050, + 1080, + 1110, + 1140, + 1170, + 1200, + 1230, + 1260, + 1290, + 1320, + 1350, + 1380, + 1410 + ], + "y": [ + 0.2714457365994652, + 0.8927347626574444, + 1.3531234943683632, + 1.2673367674688183, + 1.7780425047435002, + 2.3068734925631995, + 3.379878170169468, + 4.181873086977287, + 4.211415112140996, + 3.8591650335786065, + 4.0638422410722805, + 3.434972315118763, + 3.172677570156221, + 2.8704815437497255, + 2.6936774789149855, + 2.730973507287413, + 2.860023999594208, + 3.258879472462436, + 3.43057494666901, + 3.149173711097823, + 2.9627456474683993, + 3.089868125913955, + 3.151405734554037, + 3.141884523344751, + 3.1847243150555875, + 3.0901871135853716, + 3.188435758150266, + 3.3102269508119417, + 3.3362616375439416, + 3.3760156197198987, + 3.3325558339529366, + 3.00468460398585, + 2.993566413628123, + 2.775113723962263, + 2.801494602593192, + 2.6972091654720045, + 2.6387336619965716, + 2.8646136891374216, + 2.998947118154736, + 3.1240965345958562, + 3.036041616132567, + 3.1537223242848174, + 3.036519205917991, + 3.1148759282026166, + 3.1851847799063897, + 3.2516553936456556, + 3.5837434384289377, + 3.673814589766138 + ] + }, + { + "mode": "lines", + "name": "no_parking_cbd", + "type": "scatter", + "x": [ + 0, + 30, + 60, + 90, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 390, + 420, + 450, + 480, + 510, + 540, + 570, + 600, + 630, + 660, + 690, + 720, + 750, + 780, + 810, + 840, + 870, + 900, + 930, + 960, + 990, + 1020, + 1050, + 1080, + 1110, + 1140, + 1170, + 1200, + 1230, + 1260, + 1290, + 1320, + 1350, + 1380, + 1410 + ], + "y": [ + 0.2714457365994652, + 0.8927347626574444, + 1.3649574611975306, + 1.273346835116539, + 1.7781506790896484, + 2.3161074271298747, + 3.38224618426993, + 4.182393971844332, + 4.211218058198609, + 3.8575729610475813, + 4.061047382177255, + 3.4298387475289362, + 3.1749308687469413, + 2.8754612629834924, + 2.6955591058722654, + 2.732000412676532, + 2.8597162646013197, + 3.2606328823173243, + 3.4294254903425614, + 3.151664747967606, + 2.9680292488806312, + 3.0903464887621097, + 3.14919776928015, + 3.14657771832841, + 3.1813499736051463, + 3.097974857084373, + 3.187877150272973, + 3.312899734506242, + 3.3372666777333246, + 3.3834417456868255, + 3.337887525142096, + 3.0107330804591235, + 2.993142263310158, + 2.7745527709453177, + 2.808961602324824, + 2.695672871962131, + 2.642426537130337, + 2.8746530780495974, + 2.997880798535715, + 3.1211039015786195, + 3.0313340993911124, + 3.1638814362194156, + 3.033880900227066, + 3.108717615417294, + 3.1776523066802613, + 3.2544400006287537, + 3.6203846965279602, + 3.693568007688026 + ] + } + ], + "layout": { + "font": { + "size": 20 + }, + "height": 780, + "legend": { + "font": { + "size": 20 + }, + "title": { + "text": "" + } + }, + "margin": { + "b": 95, + "l": 95, + "r": 50, + "t": 40 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": {}, + "width": 1600, + "xaxis": { + "tickfont": { + "size": 20 + }, + "tickmode": "array", + "ticktext": [ + "03:00", + "05:00", + "07:00", + "09:00", + "11:00", + "13:00", + "15:00", + "17:00", + "19:00", + "21:00", + "23:00", + "01:00" + ], + "tickvals": [ + 0, + 120, + 240, + 360, + 480, + 600, + 720, + 840, + 960, + 1080, + 1200, + 1320 + ], + "title": { + "font": { + "size": 26 + }, + "text": "Time of day)" + } + }, + "yaxis": { + "tickfont": { + "size": 20 + }, + "title": { + "font": { + "size": 26 + }, + "text": "Miles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# ignore CBD-destination + stay_with_person rows in no_parking_cbd, then rerun metrics \n", + "\n", + "SCEN = \"no_parking_cbd\"\n", + "CHOICE = \"stay_with_person\"\n", + "\n", + "mgra_to_pseudo = dict(zip(\n", + " LAND_USE[\"mgra\"].astype(int),\n", + " pd.to_numeric(LAND_USE[\"pseudomsa\"], errors=\"coerce\").fillna(-1).astype(int),\n", + "))\n", + "\n", + "av0 = SCENARIO_DATA_ALL[SCEN][\"av_trips\"]\n", + "dest_pseudo = pd.to_numeric(av0[\"destination\"], errors=\"coerce\").fillna(-1).astype(int).map(mgra_to_pseudo)\n", + "\n", + "drop_mask = (dest_pseudo == 1) & (av0[\"av_repositioning_choice\"] == CHOICE)\n", + "drop_trip_ids = set(av0.loc[drop_mask, \"trip_id\"].dropna().unique())\n", + "\n", + "scenario_data_mod = dict(SCENARIO_DATA_ALL)\n", + "scenario_data_mod[SCEN] = dict(SCENARIO_DATA_ALL[SCEN])\n", + "scenario_data_mod[SCEN][\"av_trips\"] = av0.loc[~av0[\"trip_id\"].isin(drop_trip_ids)].copy()\n", + "\n", + "print(f\"Filtered out {int(drop_mask.sum()):,} AV rows in {SCEN} (CBD dest + {CHOICE}).\")\n", + "\n", + "scenario_order = list(scenario_data_mod.keys())\n", + "run_all_cases(scenario_data_mod, scenario_order)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/asim/scripts/taxi_tnc_routing/TNC_sensitivity_test_summaries.ipynb b/src/asim/scripts/taxi_tnc_routing/TNC_sensitivity_test_summaries.ipynb new file mode 100644 index 000000000..112da0169 --- /dev/null +++ b/src/asim/scripts/taxi_tnc_routing/TNC_sensitivity_test_summaries.ipynb @@ -0,0 +1,106774 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import os\n", + "from pathlib import Path\n", + "import warnings\n", + "import numpy as np\n", + "import pandas as pd\n", + "import plotly.graph_objects as go\n", + "import plotly.express as px\n", + "from datetime import datetime, timedelta\n", + "import yaml\n", + "from typing import Callable, Dict, Any\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Root \n", + "BASE_OUTPUT_DIR = Path(r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\tnc_routing_test\")\n", + "\n", + "# Scenario groups\n", + "TEST_GROUPS = {\n", + " \"time_bin_size\": [\"base\", \"timebin_5\", \"timebin_15\"],\n", + " \"max_detour\": [\"base\", \"detour_5\", \"detour_10\", \"detour_20\"],\n", + " \"max_occupancy\": [\"base\", \"occ_6\", \"occ_8\"],\n", + " \"tnc_shared_demand\": [\"base\", \"shift_to_all_shared_tnc\"]\n", + "}\n", + "\n", + "# Minutes per bin for each scenario, needed to map depart_bin to clock time\n", + "SCENARIO_BIN_MINUTES = {\n", + " \"base\": 10,\n", + " \"timebin_5\": 5,\n", + " \"timebin_15\": 15,\n", + " \"detour_5\": 10,\n", + " \"detour_10\": 10,\n", + " \"detour_20\": 10,\n", + " \"occ_6\": 10,\n", + " \"occ_8\": 10,\n", + " \"shift_to_all_shared_tnc\": 10\n", + "}\n", + "\n", + "def get_bin_minutes(scenario: str) -> int:\n", + " \"\"\"Return minutes per bin for this scenario.\"\"\"\n", + " return SCENARIO_BIN_MINUTES.get(scenario, 10)\n", + "\n", + "# Uniform start of day time for all scenarios\n", + "start_time = datetime(2000, 1, 1, 3, 0, 0)\n", + "\n", + "dist_col_new = \"OD_dist\"\n", + "\n", + "def load_outputs(scenario: str):\n", + " \"\"\"Read vehicle and pooled trip outputs for a given scenario.\"\"\"\n", + " p_new = BASE_OUTPUT_DIR / scenario / \"output_tnc_vehicle_trips.csv\"\n", + " p_pooled = BASE_OUTPUT_DIR / scenario / \"output_tnc_pooled_trips.csv\"\n", + " new_df = pd.read_csv(p_new)\n", + " pooled_df = pd.read_csv(p_pooled)\n", + " return new_df, pooled_df\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def run_timeseries_metric(metric_func, metric_name, y_label):\n", + " \"\"\"\n", + " metric_func(new_df, pooled_df, scenario, bin_minutes) -> DataFrame with:\n", + " x : usually datetime (time of day)\n", + " y : metric value\n", + " hover : optional text\n", + " \"\"\"\n", + "\n", + " for test_name, scen_list in TEST_GROUPS.items():\n", + " fig = go.Figure()\n", + " global_min_h = None\n", + " global_max_h = None\n", + "\n", + " for scen in scen_list:\n", + " new_df, pooled_df = load_outputs(scen)\n", + " bin_minutes = get_bin_minutes(scen)\n", + "\n", + " df = metric_func(new_df, pooled_df, scen, bin_minutes).copy()\n", + " if df.empty:\n", + " continue\n", + "\n", + " df[\"hover\"] = df[\"y\"]\n", + " x_raw = df[\"x\"]\n", + "\n", + " # Convert x to hours since 3:00\n", + " if np.issubdtype(np.array(x_raw).dtype, np.datetime64):\n", + " x_dt = pd.to_datetime(x_raw)\n", + " hours_from_3 = (x_dt - start_time).dt.total_seconds() / 3600.0\n", + " else:\n", + " # If someone returns numeric already, just use that\n", + " hours_from_3 = pd.to_numeric(x_raw, errors=\"coerce\")\n", + "\n", + " hours_from_3 = hours_from_3.to_numpy()\n", + "\n", + " if hours_from_3.size == 0 or np.all(np.isnan(hours_from_3)):\n", + " continue\n", + "\n", + " h_min = np.nanmin(hours_from_3)\n", + " h_max = np.nanmax(hours_from_3)\n", + " if global_min_h is None or h_min < global_min_h:\n", + " global_min_h = h_min\n", + " if global_max_h is None or h_max > global_max_h:\n", + " global_max_h = h_max\n", + "\n", + " # Build per-point time label for hover\n", + " time_labels = [\n", + " (start_time + pd.to_timedelta(float(h), unit=\"h\")).strftime(\"%H:%M\")\n", + " for h in hours_from_3\n", + " ]\n", + "\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=hours_from_3,\n", + " y=df[\"y\"],\n", + " mode=\"lines\",\n", + " name=scen,\n", + " hovertemplate=(\n", + " \"Scenario: %{meta}
\"\n", + " \"Time: %{customdata[0]}
\"\n", + " \"%{customdata[1]}\"\n", + " ),\n", + " meta=scen,\n", + " customdata=np.column_stack([time_labels, df[\"hover\"].astype(str)]),\n", + " )\n", + " )\n", + "\n", + " fig.update_layout(\n", + " title=f\"{metric_name} — {test_name}\",\n", + " xaxis_title=\"Time of day\",\n", + " yaxis_title=y_label,\n", + " hovermode=\"x unified\",\n", + " )\n", + "\n", + " # Configure the numeric time axis (hours from 3:00) with HH:MM labels\n", + " if global_min_h is not None and global_max_h is not None:\n", + " lo = int(np.floor(global_min_h))\n", + " hi = int(np.ceil(global_max_h))\n", + " tickvals = list(range(lo, hi + 1))\n", + " ticktext = [\n", + " (start_time + pd.to_timedelta(h, unit=\"h\")).strftime(\"%H:%M\")\n", + " for h in tickvals\n", + " ]\n", + "\n", + " fig.update_xaxes(\n", + " tickmode=\"array\",\n", + " tickvals=tickvals,\n", + " ticktext=ticktext,\n", + " )\n", + "\n", + " fig.show()\n", + "\n", + "\n", + "def run_scalar_metric(metric_func, metric_name):\n", + " \"\"\"\n", + " metric_func(new_df, pooled_df) -> dict of scalar stats.\n", + " Any column whose name starts with 'share_' will be printed as a percent\n", + " with 2 decimal places.\n", + " \"\"\"\n", + "\n", + " for test_name, scen_list in TEST_GROUPS.items():\n", + " rows = []\n", + " for scen in scen_list:\n", + " new_df, pooled_df = load_outputs(scen)\n", + " stats = metric_func(new_df, pooled_df)\n", + " row = {\"scenario\": scen}\n", + " row.update(stats)\n", + " rows.append(row)\n", + "\n", + " df_stats = pd.DataFrame(rows).set_index(\"scenario\")\n", + "\n", + " # Format share_* columns as percentages with 2 decimals\n", + " for col in df_stats.columns:\n", + " if col.startswith(\"share_\"):\n", + " df_stats[col] = (df_stats[col] * 100).round(2).astype(str) + \"%\"\n", + "\n", + " print(f\"\\n{metric_name} — {test_name}\")\n", + " print(df_stats.to_string())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Number of pooled vehicle trips" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total shared TNC requested vehicle trips: 5,051 = 51 original TNC_SHARED + 5,000 converted DRIVEALONE\n", + "\n", + "= time_bin_size =\n", + "base : 816 pooled veh trips \n", + "timebin_5 : 549 pooled veh trips \n", + "timebin_15 : 1,022 pooled veh trips \n", + "\n", + "= max_detour =\n", + "base : 816 pooled veh trips \n", + "detour_5 : 42 pooled veh trips \n", + "detour_10 : 368 pooled veh trips \n", + "detour_20 : 1,028 pooled veh trips \n", + "\n", + "= max_occupancy =\n", + "base : 816 pooled veh trips \n", + "occ_6 : 851 pooled veh trips \n", + "occ_8 : 831 pooled veh trips \n", + "\n", + "= tnc_shared_demand =\n", + "base : 816 pooled veh trips \n", + "shift_to_all_shared_tnc: 5,223,850 pooled veh trips \n", + "\n" + ] + } + ], + "source": [ + "# shared-TNC “requested trips” \n", + "demand_dir = Path(r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\tnc_routing_data\")\n", + "demand_files = [\n", + " \"final_trips.parquet\",\n", + " \"final_trips_xborder.parquet\",\n", + " \"final_trips_visitor.parquet\",\n", + " \"final_santrips.parquet\",\n", + " \"final_cbxtrips.parquet\",\n", + "]\n", + "\n", + "frames = []\n", + "for fn in demand_files:\n", + " df = pd.read_parquet(demand_dir / fn, columns=[\"trip_mode\"])\n", + " frames.append(df)\n", + "\n", + "all_trips = pd.concat(frames, ignore_index=True)\n", + "n_shared_requested = int((all_trips[\"trip_mode\"] == \"TNC_SHARED\").sum())\n", + "\n", + "# Original shared TNC trips in demand\n", + "n_shared_orig = (all_trips[\"trip_mode\"] == \"TNC_SHARED\").sum()\n", + "\n", + "# DRIVEALONE trips that we convert in taxi_tnc_routing.py\n", + "n_da = (all_trips[\"trip_mode\"] == \"DRIVEALONE\").sum()\n", + "n_boost = min(5000, n_da) \n", + "n_shared_effective = n_shared_orig + n_boost\n", + "\n", + "print(\n", + " f\"Total shared TNC requested vehicle trips: \"\n", + " f\"{n_shared_effective:,} \"\n", + " f\"= {n_shared_orig:,} original TNC_SHARED + {n_boost:,} converted DRIVEALONE\\n\"\n", + ")\n", + "\n", + "\n", + "for group_name, scenarios in TEST_GROUPS.items():\n", + " print(f\"= {group_name} =\")\n", + " for scen in scenarios:\n", + " scen_dir = BASE_OUTPUT_DIR / scen\n", + "\n", + " pooled_path = scen_dir / \"output_tnc_pooled_trips.csv\"\n", + " pooled_df = pd.read_csv(pooled_path, usecols=[\"trip_i\", \"trip_j\"])\n", + " n_pooled = int(pooled_df[\"trip_j\"].notna().sum())\n", + "\n", + " print(f\"{scen:12s}: {n_pooled:8,d} pooled veh trips \")\n", + " print()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Trip counts by trip_mode (all input files combined):\n", + " BIKE 207,568\n", + " DRIVEALONE 6,706,371\n", + " EBIKE 9,434\n", + " ESCOOTER 2,964\n", + " KNR_LOC 3,352\n", + " KNR_MIX 1,230\n", + " KNR_PRM 21,589\n", + " PNR_LOC 425\n", + " PNR_MIX 203\n", + " PNR_PRM 8,794\n", + " SCH_BUS 20,502\n", + " SHARED2 2,336,043\n", + " SHARED3 1,842,507\n", + " TAXI 44,436\n", + " TNC_LOC 51\n", + " TNC_MIX 15\n", + " TNC_PRM 276\n", + " TNC_SHARED 51\n", + " TNC_SINGLE 123,986\n", + " WALK 1,949,737\n", + " WALK_LOC 58,974\n", + " WALK_MIX 32,833\n", + " WALK_PRM 73,871\n", + "\n", + "TOTAL: 13,445,212\n" + ] + } + ], + "source": [ + "mode_counts = (\n", + " all_trips[\"trip_mode\"]\n", + " .astype(\"string\")\n", + " .fillna(\"MISSING\")\n", + " .value_counts(dropna=False)\n", + " .sort_index()\n", + ")\n", + "print(\"Trip counts by trip_mode (all input files combined):\")\n", + "for mode, cnt in mode_counts.items():\n", + " print(f\" {mode:20s} {int(cnt):,}\")\n", + "\n", + "print(f\"\\nTOTAL: {int(mode_counts.sum()):,}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fleet Size (cumulative vehicles)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "229" + ], + [ + "04:10", + "255" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "370" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "622" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "862" + ], + [ + "05:49", + "951" + ], + [ + "06:00", + "1166" + ], + [ + "06:10", + "1304" + ], + [ + "06:19", + "1466" + ], + [ + "06:30", + "2208" + ], + [ + "06:40", + "2687" + ], + [ + "06:49", + "2936" + ], + [ + "07:00", + "3610" + ], + [ + "07:10", + "3938" + ], + [ + "07:19", + "4140" + ], + [ + "07:30", + "4692" + ], + [ + "07:40", + "4779" + ], + [ + "07:49", + "4789" + ], + [ + "08:00", + "4847" + ], + [ + "08:10", + "4896" + ], + [ + "08:19", + "4937" + ], + [ + "08:30", + "4947" + ], + [ + "08:40", + "4963" + ], + [ + "08:49", + "4966" + ], + [ + "09:00", + "4979" + ], + [ + "09:10", + "5064" + ], + [ + "09:19", + "5135" + ], + [ + "09:30", + "5385" + ], + [ + "09:40", + "5549" + ], + [ + "09:49", + "5649" + ], + [ + "10:00", + "5669" + ], + [ + "10:10", + "5693" + ], + [ + "10:19", + "5724" + ], + [ + "10:30", + "5858" + ], + [ + "10:40", + "5996" + ], + [ + "10:49", + "6080" + ], + [ + "11:00", + "6085" + ], + [ + "11:10", + "6086" + ], + [ + "11:19", + "6090" + ], + [ + "11:30", + "6091" + ], + [ + "11:40", + "6093" + ], + [ + "11:49", + "6093" + ], + [ + "12:00", + "6097" + ], + [ + "12:10", + "6097" + ], + [ + "12:19", + "6097" + ], + [ + "12:30", + "6099" + ], + [ + "12:40", + "6102" + ], + [ + "12:49", + "6105" + ], + [ + "13:00", + "6107" + ], + [ + "13:10", + "6111" + ], + [ + "13:19", + "6111" + ], + [ + "13:30", + "6111" + ], + [ + "13:40", + "6113" + ], + [ + "13:49", + "6118" + ], + [ + "14:00", + "6127" + ], + [ + "14:10", + "6132" + ], + [ + "14:19", + "6135" + ], + [ + "14:30", + "6172" + ], + [ + "14:40", + "6239" + ], + [ + "14:49", + "6284" + ], + [ + "15:00", + "6457" + ], + [ + "15:10", + "6600" + ], + [ + "15:19", + "6714" + ], + [ + "15:30", + "6765" + ], + [ + "15:40", + "6827" + ], + [ + "15:49", + "6853" + ], + [ + "16:00", + "7064" + ], + [ + "16:10", + "7234" + ], + [ + "16:19", + "7384" + ], + [ + "16:30", + "7387" + ], + [ + "16:40", + "7393" + ], + [ + "16:49", + "7400" + ], + [ + "17:00", + "7404" + ], + [ + "17:10", + "7406" + ], + [ + "17:19", + "7436" + ], + [ + "17:30", + "7525" + ], + [ + "17:40", + "7573" + ], + [ + "17:49", + "7653" + ], + [ + "18:00", + "7701" + ], + [ + "18:10", + "7786" + ], + [ + "18:19", + "7806" + ], + [ + "18:30", + "7847" + ], + [ + "18:40", + "7949" + ], + [ + "18:49", + "8089" + ], + [ + "19:00", + "8204" + ], + [ + "19:10", + "8349" + ], + [ + "19:19", + "8416" + ], + [ + "19:30", + "8429" + ], + [ + "19:40", + "8430" + ], + [ + "19:49", + "8492" + ], + [ + "20:00", + "8602" + ], + [ + "20:10", + "8726" + ], + [ + "20:19", + "8849" + ], + [ + "20:30", + "8895" + ], + [ + "20:40", + "8971" + ], + [ + "20:49", + "9131" + ], + [ + "21:00", + "9246" + ], + [ + "21:10", + "9472" + ], + [ + "21:19", + "9616" + ], + [ + "21:30", + "9619" + ], + [ + "21:40", + "9621" + ], + [ + "21:49", + "9621" + ], + [ + "22:00", + "9644" + ], + [ + "22:10", + "9797" + ], + [ + "22:19", + "9925" + ], + [ + "22:30", + "9926" + ], + [ + "22:40", + "9926" + ], + [ + "22:49", + "9933" + ], + [ + "23:00", + "9943" + ], + [ + "23:10", + "9978" + ], + [ + "23:19", + "9993" + ], + [ + "23:30", + "9996" + ], + [ + "23:40", + "9996" + ], + [ + "23:49", + "9997" + ], + [ + "00:00", + "9997" + ], + [ + "00:10", + "9997" + ], + [ + "00:19", + "9997" + ], + [ + "00:30", + "9997" + ], + [ + "00:40", + "9997" + ], + [ + "00:49", + "9997" + ], + [ + "01:00", + "9997" + ], + [ + "01:10", + "9997" + ], + [ + "01:19", + "9997" + ], + [ + "01:30", + "9999" + ], + [ + "01:40", + "9999" + ], + [ + "01:49", + "10000" + ], + [ + "02:00", + "10000" + ], + [ + "02:10", + "10001" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 229, + 255, + 274, + 311, + 335, + 370, + 451, + 541, + 622, + 774, + 862, + 951, + 1166, + 1304, + 1466, + 2208, + 2687, + 2936, + 3610, + 3938, + 4140, + 4692, + 4779, + 4789, + 4847, + 4896, + 4937, + 4947, + 4963, + 4966, + 4979, + 5064, + 5135, + 5385, + 5549, + 5649, + 5669, + 5693, + 5724, + 5858, + 5996, + 6080, + 6085, + 6086, + 6090, + 6091, + 6093, + 6093, + 6097, + 6097, + 6097, + 6099, + 6102, + 6105, + 6107, + 6111, + 6111, + 6111, + 6113, + 6118, + 6127, + 6132, + 6135, + 6172, + 6239, + 6284, + 6457, + 6600, + 6714, + 6765, + 6827, + 6853, + 7064, + 7234, + 7384, + 7387, + 7393, + 7400, + 7404, + 7406, + 7436, + 7525, + 7573, + 7653, + 7701, + 7786, + 7806, + 7847, + 7949, + 8089, + 8204, + 8349, + 8416, + 8429, + 8430, + 8492, + 8602, + 8726, + 8849, + 8895, + 8971, + 9131, + 9246, + 9472, + 9616, + 9619, + 9621, + 9621, + 9644, + 9797, + 9925, + 9926, + 9926, + 9933, + 9943, + 9978, + 9993, + 9996, + 9996, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9999, + 9999, + 10000, + 10000, + 10001 + ] + }, + { + "customdata": [ + [ + "03:00", + "16" + ], + [ + "03:04", + "50" + ], + [ + "03:10", + "73" + ], + [ + "03:15", + "89" + ], + [ + "03:19", + "96" + ], + [ + "03:25", + "111" + ], + [ + "03:30", + "127" + ], + [ + "03:34", + "140" + ], + [ + "03:40", + "160" + ], + [ + "03:45", + "172" + ], + [ + "03:49", + "183" + ], + [ + "03:55", + "196" + ], + [ + "04:00", + "203" + ], + [ + "04:04", + "221" + ], + [ + "04:10", + "238" + ], + [ + "04:15", + "250" + ], + [ + "04:19", + "261" + ], + [ + "04:25", + "271" + ], + [ + "04:30", + "290" + ], + [ + "04:34", + "304" + ], + [ + "04:40", + "316" + ], + [ + "04:45", + "331" + ], + [ + "04:49", + "349" + ], + [ + "04:55", + "362" + ], + [ + "05:00", + "402" + ], + [ + "05:04", + "442" + ], + [ + "05:10", + "495" + ], + [ + "05:15", + "535" + ], + [ + "05:19", + "566" + ], + [ + "05:25", + "600" + ], + [ + "05:30", + "661" + ], + [ + "05:34", + "762" + ], + [ + "05:40", + "811" + ], + [ + "05:45", + "836" + ], + [ + "05:49", + "870" + ], + [ + "05:55", + "911" + ], + [ + "06:00", + "1031" + ], + [ + "06:04", + "1126" + ], + [ + "06:10", + "1196" + ], + [ + "06:15", + "1252" + ], + [ + "06:19", + "1322" + ], + [ + "06:25", + "1397" + ], + [ + "06:30", + "1749" + ], + [ + "06:34", + "2019" + ], + [ + "06:40", + "2274" + ], + [ + "06:45", + "2500" + ], + [ + "06:49", + "2625" + ], + [ + "06:55", + "2692" + ], + [ + "07:00", + "3004" + ], + [ + "07:04", + "3241" + ], + [ + "07:10", + "3440" + ], + [ + "07:15", + "3559" + ], + [ + "07:19", + "3665" + ], + [ + "07:25", + "3765" + ], + [ + "07:30", + "3974" + ], + [ + "07:34", + "4198" + ], + [ + "07:40", + "4270" + ], + [ + "07:45", + "4310" + ], + [ + "07:49", + "4333" + ], + [ + "07:55", + "4333" + ], + [ + "08:00", + "4341" + ], + [ + "08:04", + "4388" + ], + [ + "08:10", + "4404" + ], + [ + "08:15", + "4421" + ], + [ + "08:19", + "4435" + ], + [ + "08:25", + "4459" + ], + [ + "08:30", + "4462" + ], + [ + "08:34", + "4465" + ], + [ + "08:40", + "4471" + ], + [ + "08:45", + "4484" + ], + [ + "08:49", + "4487" + ], + [ + "08:55", + "4494" + ], + [ + "09:00", + "4500" + ], + [ + "09:04", + "4504" + ], + [ + "09:10", + "4520" + ], + [ + "09:15", + "4586" + ], + [ + "09:19", + "4604" + ], + [ + "09:25", + "4633" + ], + [ + "09:30", + "4756" + ], + [ + "09:34", + "4872" + ], + [ + "09:40", + "4960" + ], + [ + "09:45", + "5013" + ], + [ + "09:49", + "5052" + ], + [ + "09:55", + "5092" + ], + [ + "10:00", + "5116" + ], + [ + "10:04", + "5133" + ], + [ + "10:10", + "5145" + ], + [ + "10:15", + "5150" + ], + [ + "10:19", + "5162" + ], + [ + "10:25", + "5183" + ], + [ + "10:30", + "5226" + ], + [ + "10:34", + "5304" + ], + [ + "10:40", + "5370" + ], + [ + "10:45", + "5430" + ], + [ + "10:49", + "5496" + ], + [ + "10:55", + "5512" + ], + [ + "11:00", + "5515" + ], + [ + "11:04", + "5517" + ], + [ + "11:10", + "5518" + ], + [ + "11:15", + "5518" + ], + [ + "11:19", + "5519" + ], + [ + "11:25", + "5521" + ], + [ + "11:30", + "5523" + ], + [ + "11:34", + "5523" + ], + [ + "11:40", + "5525" + ], + [ + "11:45", + "5526" + ], + [ + "11:49", + "5526" + ], + [ + "11:55", + "5526" + ], + [ + "12:00", + "5530" + ], + [ + "12:04", + "5530" + ], + [ + "12:10", + "5530" + ], + [ + "12:15", + "5530" + ], + [ + "12:19", + "5530" + ], + [ + "12:25", + "5530" + ], + [ + "12:30", + "5531" + ], + [ + "12:34", + "5532" + ], + [ + "12:40", + "5533" + ], + [ + "12:45", + "5535" + ], + [ + "12:49", + "5537" + ], + [ + "12:55", + "5538" + ], + [ + "13:00", + "5538" + ], + [ + "13:04", + "5539" + ], + [ + "13:10", + "5540" + ], + [ + "13:15", + "5543" + ], + [ + "13:19", + "5543" + ], + [ + "13:25", + "5543" + ], + [ + "13:30", + "5543" + ], + [ + "13:34", + "5543" + ], + [ + "13:40", + "5543" + ], + [ + "13:45", + "5543" + ], + [ + "13:49", + "5543" + ], + [ + "13:55", + "5545" + ], + [ + "14:00", + "5556" + ], + [ + "14:04", + "5570" + ], + [ + "14:10", + "5572" + ], + [ + "14:15", + "5574" + ], + [ + "14:19", + "5579" + ], + [ + "14:25", + "5583" + ], + [ + "14:30", + "5634" + ], + [ + "14:34", + "5649" + ], + [ + "14:40", + "5699" + ], + [ + "14:45", + "5703" + ], + [ + "14:49", + "5740" + ], + [ + "14:55", + "5745" + ], + [ + "15:00", + "5822" + ], + [ + "15:04", + "5901" + ], + [ + "15:10", + "6012" + ], + [ + "15:15", + "6079" + ], + [ + "15:19", + "6161" + ], + [ + "15:25", + "6172" + ], + [ + "15:30", + "6210" + ], + [ + "15:34", + "6224" + ], + [ + "15:40", + "6258" + ], + [ + "15:45", + "6289" + ], + [ + "15:49", + "6303" + ], + [ + "15:55", + "6333" + ], + [ + "16:00", + "6454" + ], + [ + "16:04", + "6564" + ], + [ + "16:10", + "6651" + ], + [ + "16:15", + "6752" + ], + [ + "16:19", + "6819" + ], + [ + "16:25", + "6843" + ], + [ + "16:30", + "6847" + ], + [ + "16:34", + "6847" + ], + [ + "16:40", + "6848" + ], + [ + "16:45", + "6854" + ], + [ + "16:49", + "6855" + ], + [ + "16:55", + "6860" + ], + [ + "17:00", + "6862" + ], + [ + "17:04", + "6864" + ], + [ + "17:10", + "6875" + ], + [ + "17:15", + "6882" + ], + [ + "17:19", + "6905" + ], + [ + "17:25", + "6965" + ], + [ + "17:30", + "7024" + ], + [ + "17:34", + "7073" + ], + [ + "17:40", + "7079" + ], + [ + "17:45", + "7120" + ], + [ + "17:49", + "7186" + ], + [ + "17:55", + "7253" + ], + [ + "18:00", + "7286" + ], + [ + "18:04", + "7332" + ], + [ + "18:10", + "7359" + ], + [ + "18:15", + "7410" + ], + [ + "18:19", + "7413" + ], + [ + "18:25", + "7430" + ], + [ + "18:30", + "7434" + ], + [ + "18:34", + "7486" + ], + [ + "18:40", + "7533" + ], + [ + "18:45", + "7623" + ], + [ + "18:49", + "7686" + ], + [ + "18:55", + "7754" + ], + [ + "19:00", + "7811" + ], + [ + "19:04", + "7886" + ], + [ + "19:10", + "7954" + ], + [ + "19:15", + "8025" + ], + [ + "19:19", + "8054" + ], + [ + "19:25", + "8119" + ], + [ + "19:30", + "8137" + ], + [ + "19:34", + "8138" + ], + [ + "19:40", + "8138" + ], + [ + "19:45", + "8138" + ], + [ + "19:49", + "8175" + ], + [ + "19:55", + "8201" + ], + [ + "20:00", + "8253" + ], + [ + "20:04", + "8331" + ], + [ + "20:10", + "8389" + ], + [ + "20:15", + "8455" + ], + [ + "20:19", + "8488" + ], + [ + "20:25", + "8578" + ], + [ + "20:30", + "8578" + ], + [ + "20:34", + "8606" + ], + [ + "20:40", + "8650" + ], + [ + "20:45", + "8718" + ], + [ + "20:49", + "8804" + ], + [ + "20:55", + "8878" + ], + [ + "21:00", + "8921" + ], + [ + "21:04", + "8987" + ], + [ + "21:10", + "9082" + ], + [ + "21:15", + "9235" + ], + [ + "21:19", + "9277" + ], + [ + "21:25", + "9328" + ], + [ + "21:30", + "9331" + ], + [ + "21:34", + "9331" + ], + [ + "21:40", + "9332" + ], + [ + "21:45", + "9333" + ], + [ + "21:49", + "9334" + ], + [ + "21:55", + "9337" + ], + [ + "22:00", + "9384" + ], + [ + "22:04", + "9436" + ], + [ + "22:10", + "9504" + ], + [ + "22:15", + "9572" + ], + [ + "22:19", + "9616" + ], + [ + "22:25", + "9666" + ], + [ + "22:30", + "9666" + ], + [ + "22:34", + "9666" + ], + [ + "22:40", + "9666" + ], + [ + "22:45", + "9666" + ], + [ + "22:49", + "9683" + ], + [ + "22:55", + "9722" + ], + [ + "23:00", + "9725" + ], + [ + "23:04", + "9736" + ], + [ + "23:10", + "9750" + ], + [ + "23:15", + "9767" + ], + [ + "23:19", + "9774" + ], + [ + "23:25", + "9776" + ], + [ + "23:30", + "9777" + ], + [ + "23:34", + "9779" + ], + [ + "23:40", + "9779" + ], + [ + "23:45", + "9779" + ], + [ + "23:49", + "9779" + ], + [ + "23:55", + "9780" + ], + [ + "00:00", + "9780" + ], + [ + "00:04", + "9780" + ], + [ + "00:10", + "9780" + ], + [ + "00:15", + "9780" + ], + [ + "00:19", + "9780" + ], + [ + "00:25", + "9780" + ], + [ + "00:30", + "9780" + ], + [ + "00:34", + "9780" + ], + [ + "00:40", + "9780" + ], + [ + "00:45", + "9780" + ], + [ + "00:49", + "9780" + ], + [ + "00:55", + "9780" + ], + [ + "01:00", + "9780" + ], + [ + "01:04", + "9780" + ], + [ + "01:10", + "9780" + ], + [ + "01:15", + "9780" + ], + [ + "01:19", + "9780" + ], + [ + "01:25", + "9780" + ], + [ + "01:30", + "9780" + ], + [ + "01:34", + "9781" + ], + [ + "01:40", + "9781" + ], + [ + "01:45", + "9781" + ], + [ + "01:49", + "9781" + ], + [ + "01:55", + "9782" + ], + [ + "02:00", + "9782" + ], + [ + "02:04", + "9782" + ], + [ + "02:10", + "9782" + ], + [ + "02:15", + "9783" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25 + ], + "y": [ + 16, + 50, + 73, + 89, + 96, + 111, + 127, + 140, + 160, + 172, + 183, + 196, + 203, + 221, + 238, + 250, + 261, + 271, + 290, + 304, + 316, + 331, + 349, + 362, + 402, + 442, + 495, + 535, + 566, + 600, + 661, + 762, + 811, + 836, + 870, + 911, + 1031, + 1126, + 1196, + 1252, + 1322, + 1397, + 1749, + 2019, + 2274, + 2500, + 2625, + 2692, + 3004, + 3241, + 3440, + 3559, + 3665, + 3765, + 3974, + 4198, + 4270, + 4310, + 4333, + 4333, + 4341, + 4388, + 4404, + 4421, + 4435, + 4459, + 4462, + 4465, + 4471, + 4484, + 4487, + 4494, + 4500, + 4504, + 4520, + 4586, + 4604, + 4633, + 4756, + 4872, + 4960, + 5013, + 5052, + 5092, + 5116, + 5133, + 5145, + 5150, + 5162, + 5183, + 5226, + 5304, + 5370, + 5430, + 5496, + 5512, + 5515, + 5517, + 5518, + 5518, + 5519, + 5521, + 5523, + 5523, + 5525, + 5526, + 5526, + 5526, + 5530, + 5530, + 5530, + 5530, + 5530, + 5530, + 5531, + 5532, + 5533, + 5535, + 5537, + 5538, + 5538, + 5539, + 5540, + 5543, + 5543, + 5543, + 5543, + 5543, + 5543, + 5543, + 5543, + 5545, + 5556, + 5570, + 5572, + 5574, + 5579, + 5583, + 5634, + 5649, + 5699, + 5703, + 5740, + 5745, + 5822, + 5901, + 6012, + 6079, + 6161, + 6172, + 6210, + 6224, + 6258, + 6289, + 6303, + 6333, + 6454, + 6564, + 6651, + 6752, + 6819, + 6843, + 6847, + 6847, + 6848, + 6854, + 6855, + 6860, + 6862, + 6864, + 6875, + 6882, + 6905, + 6965, + 7024, + 7073, + 7079, + 7120, + 7186, + 7253, + 7286, + 7332, + 7359, + 7410, + 7413, + 7430, + 7434, + 7486, + 7533, + 7623, + 7686, + 7754, + 7811, + 7886, + 7954, + 8025, + 8054, + 8119, + 8137, + 8138, + 8138, + 8138, + 8175, + 8201, + 8253, + 8331, + 8389, + 8455, + 8488, + 8578, + 8578, + 8606, + 8650, + 8718, + 8804, + 8878, + 8921, + 8987, + 9082, + 9235, + 9277, + 9328, + 9331, + 9331, + 9332, + 9333, + 9334, + 9337, + 9384, + 9436, + 9504, + 9572, + 9616, + 9666, + 9666, + 9666, + 9666, + 9666, + 9683, + 9722, + 9725, + 9736, + 9750, + 9767, + 9774, + 9776, + 9777, + 9779, + 9779, + 9779, + 9779, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9780, + 9781, + 9781, + 9781, + 9781, + 9782, + 9782, + 9782, + 9782, + 9783 + ] + }, + { + "customdata": [ + [ + "03:00", + "80" + ], + [ + "03:15", + "115" + ], + [ + "03:30", + "169" + ], + [ + "03:45", + "198" + ], + [ + "04:00", + "245" + ], + [ + "04:15", + "285" + ], + [ + "04:30", + "327" + ], + [ + "04:45", + "382" + ], + [ + "05:00", + "525" + ], + [ + "05:15", + "639" + ], + [ + "05:30", + "857" + ], + [ + "05:45", + "988" + ], + [ + "06:00", + "1315" + ], + [ + "06:15", + "1528" + ], + [ + "06:30", + "2733" + ], + [ + "06:45", + "3202" + ], + [ + "07:00", + "4235" + ], + [ + "07:15", + "4574" + ], + [ + "07:30", + "5332" + ], + [ + "07:45", + "5371" + ], + [ + "08:00", + "5458" + ], + [ + "08:15", + "5546" + ], + [ + "08:30", + "5560" + ], + [ + "08:45", + "5581" + ], + [ + "09:00", + "5613" + ], + [ + "09:15", + "5721" + ], + [ + "09:30", + "6059" + ], + [ + "09:45", + "6250" + ], + [ + "10:00", + "6293" + ], + [ + "10:15", + "6316" + ], + [ + "10:30", + "6542" + ], + [ + "10:45", + "6732" + ], + [ + "11:00", + "6736" + ], + [ + "11:15", + "6742" + ], + [ + "11:30", + "6745" + ], + [ + "11:45", + "6748" + ], + [ + "12:00", + "6750" + ], + [ + "12:15", + "6750" + ], + [ + "12:30", + "6754" + ], + [ + "12:45", + "6758" + ], + [ + "13:00", + "6760" + ], + [ + "13:15", + "6762" + ], + [ + "13:30", + "6762" + ], + [ + "13:45", + "6762" + ], + [ + "14:00", + "6768" + ], + [ + "14:15", + "6782" + ], + [ + "14:30", + "6836" + ], + [ + "14:45", + "6874" + ], + [ + "15:00", + "7112" + ], + [ + "15:15", + "7296" + ], + [ + "15:30", + "7309" + ], + [ + "15:45", + "7383" + ], + [ + "16:00", + "7720" + ], + [ + "16:15", + "7947" + ], + [ + "16:30", + "7953" + ], + [ + "16:45", + "7961" + ], + [ + "17:00", + "7965" + ], + [ + "17:15", + "8001" + ], + [ + "17:30", + "8096" + ], + [ + "17:45", + "8149" + ], + [ + "18:00", + "8206" + ], + [ + "18:15", + "8317" + ], + [ + "18:30", + "8356" + ], + [ + "18:45", + "8531" + ], + [ + "19:00", + "8692" + ], + [ + "19:15", + "8844" + ], + [ + "19:30", + "8845" + ], + [ + "19:45", + "8846" + ], + [ + "20:00", + "8952" + ], + [ + "20:15", + "9139" + ], + [ + "20:30", + "9234" + ], + [ + "20:45", + "9434" + ], + [ + "21:00", + "9616" + ], + [ + "21:15", + "9909" + ], + [ + "21:30", + "9913" + ], + [ + "21:45", + "9915" + ], + [ + "22:00", + "9928" + ], + [ + "22:15", + "10131" + ], + [ + "22:30", + "10131" + ], + [ + "22:45", + "10153" + ], + [ + "23:00", + "10174" + ], + [ + "23:15", + "10206" + ], + [ + "23:30", + "10208" + ], + [ + "23:45", + "10209" + ], + [ + "00:00", + "10210" + ], + [ + "00:15", + "10210" + ], + [ + "00:30", + "10210" + ], + [ + "00:45", + "10210" + ], + [ + "01:00", + "10210" + ], + [ + "01:15", + "10210" + ], + [ + "01:30", + "10213" + ], + [ + "01:45", + "10214" + ], + [ + "02:00", + "10214" + ], + [ + "02:15", + "10215" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25 + ], + "y": [ + 80, + 115, + 169, + 198, + 245, + 285, + 327, + 382, + 525, + 639, + 857, + 988, + 1315, + 1528, + 2733, + 3202, + 4235, + 4574, + 5332, + 5371, + 5458, + 5546, + 5560, + 5581, + 5613, + 5721, + 6059, + 6250, + 6293, + 6316, + 6542, + 6732, + 6736, + 6742, + 6745, + 6748, + 6750, + 6750, + 6754, + 6758, + 6760, + 6762, + 6762, + 6762, + 6768, + 6782, + 6836, + 6874, + 7112, + 7296, + 7309, + 7383, + 7720, + 7947, + 7953, + 7961, + 7965, + 8001, + 8096, + 8149, + 8206, + 8317, + 8356, + 8531, + 8692, + 8844, + 8845, + 8846, + 8952, + 9139, + 9234, + 9434, + 9616, + 9909, + 9913, + 9915, + 9928, + 10131, + 10131, + 10153, + 10174, + 10206, + 10208, + 10209, + 10210, + 10210, + 10210, + 10210, + 10210, + 10210, + 10213, + 10214, + 10214, + 10215 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Fleet Size (cumulative vehicles) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Cumulative unique vehicles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "229" + ], + [ + "04:10", + "255" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "370" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "622" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "862" + ], + [ + "05:49", + "951" + ], + [ + "06:00", + "1166" + ], + [ + "06:10", + "1304" + ], + [ + "06:19", + "1466" + ], + [ + "06:30", + "2208" + ], + [ + "06:40", + "2687" + ], + [ + "06:49", + "2936" + ], + [ + "07:00", + "3610" + ], + [ + "07:10", + "3938" + ], + [ + "07:19", + "4140" + ], + [ + "07:30", + "4692" + ], + [ + "07:40", + "4779" + ], + [ + "07:49", + "4789" + ], + [ + "08:00", + "4847" + ], + [ + "08:10", + "4896" + ], + [ + "08:19", + "4937" + ], + [ + "08:30", + "4947" + ], + [ + "08:40", + "4963" + ], + [ + "08:49", + "4966" + ], + [ + "09:00", + "4979" + ], + [ + "09:10", + "5064" + ], + [ + "09:19", + "5135" + ], + [ + "09:30", + "5385" + ], + [ + "09:40", + "5549" + ], + [ + "09:49", + "5649" + ], + [ + "10:00", + "5669" + ], + [ + "10:10", + "5693" + ], + [ + "10:19", + "5724" + ], + [ + "10:30", + "5858" + ], + [ + "10:40", + "5996" + ], + [ + "10:49", + "6080" + ], + [ + "11:00", + "6085" + ], + [ + "11:10", + "6086" + ], + [ + "11:19", + "6090" + ], + [ + "11:30", + "6091" + ], + [ + "11:40", + "6093" + ], + [ + "11:49", + "6093" + ], + [ + "12:00", + "6097" + ], + [ + "12:10", + "6097" + ], + [ + "12:19", + "6097" + ], + [ + "12:30", + "6099" + ], + [ + "12:40", + "6102" + ], + [ + "12:49", + "6105" + ], + [ + "13:00", + "6107" + ], + [ + "13:10", + "6111" + ], + [ + "13:19", + "6111" + ], + [ + "13:30", + "6111" + ], + [ + "13:40", + "6113" + ], + [ + "13:49", + "6118" + ], + [ + "14:00", + "6127" + ], + [ + "14:10", + "6132" + ], + [ + "14:19", + "6135" + ], + [ + "14:30", + "6172" + ], + [ + "14:40", + "6239" + ], + [ + "14:49", + "6284" + ], + [ + "15:00", + "6457" + ], + [ + "15:10", + "6600" + ], + [ + "15:19", + "6714" + ], + [ + "15:30", + "6765" + ], + [ + "15:40", + "6827" + ], + [ + "15:49", + "6853" + ], + [ + "16:00", + "7064" + ], + [ + "16:10", + "7234" + ], + [ + "16:19", + "7384" + ], + [ + "16:30", + "7387" + ], + [ + "16:40", + "7393" + ], + [ + "16:49", + "7400" + ], + [ + "17:00", + "7404" + ], + [ + "17:10", + "7406" + ], + [ + "17:19", + "7436" + ], + [ + "17:30", + "7525" + ], + [ + "17:40", + "7573" + ], + [ + "17:49", + "7653" + ], + [ + "18:00", + "7701" + ], + [ + "18:10", + "7786" + ], + [ + "18:19", + "7806" + ], + [ + "18:30", + "7847" + ], + [ + "18:40", + "7949" + ], + [ + "18:49", + "8089" + ], + [ + "19:00", + "8204" + ], + [ + "19:10", + "8349" + ], + [ + "19:19", + "8416" + ], + [ + "19:30", + "8429" + ], + [ + "19:40", + "8430" + ], + [ + "19:49", + "8492" + ], + [ + "20:00", + "8602" + ], + [ + "20:10", + "8726" + ], + [ + "20:19", + "8849" + ], + [ + "20:30", + "8895" + ], + [ + "20:40", + "8971" + ], + [ + "20:49", + "9131" + ], + [ + "21:00", + "9246" + ], + [ + "21:10", + "9472" + ], + [ + "21:19", + "9616" + ], + [ + "21:30", + "9619" + ], + [ + "21:40", + "9621" + ], + [ + "21:49", + "9621" + ], + [ + "22:00", + "9644" + ], + [ + "22:10", + "9797" + ], + [ + "22:19", + "9925" + ], + [ + "22:30", + "9926" + ], + [ + "22:40", + "9926" + ], + [ + "22:49", + "9933" + ], + [ + "23:00", + "9943" + ], + [ + "23:10", + "9978" + ], + [ + "23:19", + "9993" + ], + [ + "23:30", + "9996" + ], + [ + "23:40", + "9996" + ], + [ + "23:49", + "9997" + ], + [ + "00:00", + "9997" + ], + [ + "00:10", + "9997" + ], + [ + "00:19", + "9997" + ], + [ + "00:30", + "9997" + ], + [ + "00:40", + "9997" + ], + [ + "00:49", + "9997" + ], + [ + "01:00", + "9997" + ], + [ + "01:10", + "9997" + ], + [ + "01:19", + "9997" + ], + [ + "01:30", + "9999" + ], + [ + "01:40", + "9999" + ], + [ + "01:49", + "10000" + ], + [ + "02:00", + "10000" + ], + [ + "02:10", + "10001" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 229, + 255, + 274, + 311, + 335, + 370, + 451, + 541, + 622, + 774, + 862, + 951, + 1166, + 1304, + 1466, + 2208, + 2687, + 2936, + 3610, + 3938, + 4140, + 4692, + 4779, + 4789, + 4847, + 4896, + 4937, + 4947, + 4963, + 4966, + 4979, + 5064, + 5135, + 5385, + 5549, + 5649, + 5669, + 5693, + 5724, + 5858, + 5996, + 6080, + 6085, + 6086, + 6090, + 6091, + 6093, + 6093, + 6097, + 6097, + 6097, + 6099, + 6102, + 6105, + 6107, + 6111, + 6111, + 6111, + 6113, + 6118, + 6127, + 6132, + 6135, + 6172, + 6239, + 6284, + 6457, + 6600, + 6714, + 6765, + 6827, + 6853, + 7064, + 7234, + 7384, + 7387, + 7393, + 7400, + 7404, + 7406, + 7436, + 7525, + 7573, + 7653, + 7701, + 7786, + 7806, + 7847, + 7949, + 8089, + 8204, + 8349, + 8416, + 8429, + 8430, + 8492, + 8602, + 8726, + 8849, + 8895, + 8971, + 9131, + 9246, + 9472, + 9616, + 9619, + 9621, + 9621, + 9644, + 9797, + 9925, + 9926, + 9926, + 9933, + 9943, + 9978, + 9993, + 9996, + 9996, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9999, + 9999, + 10000, + 10000, + 10001 + ] + }, + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "230" + ], + [ + "04:10", + "256" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "371" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "621" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "864" + ], + [ + "05:49", + "953" + ], + [ + "06:00", + "1167" + ], + [ + "06:10", + "1303" + ], + [ + "06:19", + "1469" + ], + [ + "06:30", + "2215" + ], + [ + "06:40", + "2684" + ], + [ + "06:49", + "2949" + ], + [ + "07:00", + "3621" + ], + [ + "07:10", + "3940" + ], + [ + "07:19", + "4155" + ], + [ + "07:30", + "4697" + ], + [ + "07:40", + "4773" + ], + [ + "07:49", + "4789" + ], + [ + "08:00", + "4845" + ], + [ + "08:10", + "4892" + ], + [ + "08:19", + "4933" + ], + [ + "08:30", + "4941" + ], + [ + "08:40", + "4952" + ], + [ + "08:49", + "4955" + ], + [ + "09:00", + "4974" + ], + [ + "09:10", + "5055" + ], + [ + "09:19", + "5126" + ], + [ + "09:30", + "5375" + ], + [ + "09:40", + "5540" + ], + [ + "09:49", + "5632" + ], + [ + "10:00", + "5656" + ], + [ + "10:10", + "5682" + ], + [ + "10:19", + "5711" + ], + [ + "10:30", + "5852" + ], + [ + "10:40", + "5987" + ], + [ + "10:49", + "6070" + ], + [ + "11:00", + "6074" + ], + [ + "11:10", + "6075" + ], + [ + "11:19", + "6079" + ], + [ + "11:30", + "6080" + ], + [ + "11:40", + "6082" + ], + [ + "11:49", + "6082" + ], + [ + "12:00", + "6086" + ], + [ + "12:10", + "6086" + ], + [ + "12:19", + "6086" + ], + [ + "12:30", + "6088" + ], + [ + "12:40", + "6091" + ], + [ + "12:49", + "6094" + ], + [ + "13:00", + "6095" + ], + [ + "13:10", + "6099" + ], + [ + "13:19", + "6099" + ], + [ + "13:30", + "6099" + ], + [ + "13:40", + "6101" + ], + [ + "13:49", + "6107" + ], + [ + "14:00", + "6117" + ], + [ + "14:10", + "6123" + ], + [ + "14:19", + "6126" + ], + [ + "14:30", + "6163" + ], + [ + "14:40", + "6224" + ], + [ + "14:49", + "6272" + ], + [ + "15:00", + "6452" + ], + [ + "15:10", + "6591" + ], + [ + "15:19", + "6705" + ], + [ + "15:30", + "6747" + ], + [ + "15:40", + "6810" + ], + [ + "15:49", + "6845" + ], + [ + "16:00", + "7060" + ], + [ + "16:10", + "7219" + ], + [ + "16:19", + "7374" + ], + [ + "16:30", + "7377" + ], + [ + "16:40", + "7383" + ], + [ + "16:49", + "7390" + ], + [ + "17:00", + "7394" + ], + [ + "17:10", + "7396" + ], + [ + "17:19", + "7418" + ], + [ + "17:30", + "7507" + ], + [ + "17:40", + "7569" + ], + [ + "17:49", + "7642" + ], + [ + "18:00", + "7684" + ], + [ + "18:10", + "7780" + ], + [ + "18:19", + "7791" + ], + [ + "18:30", + "7837" + ], + [ + "18:40", + "7938" + ], + [ + "18:49", + "8076" + ], + [ + "19:00", + "8185" + ], + [ + "19:10", + "8321" + ], + [ + "19:19", + "8400" + ], + [ + "19:30", + "8402" + ], + [ + "19:40", + "8403" + ], + [ + "19:49", + "8473" + ], + [ + "20:00", + "8585" + ], + [ + "20:10", + "8710" + ], + [ + "20:19", + "8840" + ], + [ + "20:30", + "8899" + ], + [ + "20:40", + "8993" + ], + [ + "20:49", + "9152" + ], + [ + "21:00", + "9265" + ], + [ + "21:10", + "9491" + ], + [ + "21:19", + "9654" + ], + [ + "21:30", + "9657" + ], + [ + "21:40", + "9659" + ], + [ + "21:49", + "9659" + ], + [ + "22:00", + "9668" + ], + [ + "22:10", + "9823" + ], + [ + "22:19", + "9952" + ], + [ + "22:30", + "9954" + ], + [ + "22:40", + "9954" + ], + [ + "22:49", + "9958" + ], + [ + "23:00", + "9968" + ], + [ + "23:10", + "10004" + ], + [ + "23:19", + "10020" + ], + [ + "23:30", + "10023" + ], + [ + "23:40", + "10023" + ], + [ + "23:49", + "10024" + ], + [ + "00:00", + "10024" + ], + [ + "00:10", + "10024" + ], + [ + "00:19", + "10024" + ], + [ + "00:30", + "10024" + ], + [ + "00:40", + "10024" + ], + [ + "00:49", + "10024" + ], + [ + "01:00", + "10024" + ], + [ + "01:10", + "10024" + ], + [ + "01:19", + "10024" + ], + [ + "01:30", + "10025" + ], + [ + "01:40", + "10025" + ], + [ + "01:49", + "10026" + ], + [ + "02:00", + "10026" + ], + [ + "02:10", + "10027" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 230, + 256, + 274, + 311, + 335, + 371, + 451, + 541, + 621, + 774, + 864, + 953, + 1167, + 1303, + 1469, + 2215, + 2684, + 2949, + 3621, + 3940, + 4155, + 4697, + 4773, + 4789, + 4845, + 4892, + 4933, + 4941, + 4952, + 4955, + 4974, + 5055, + 5126, + 5375, + 5540, + 5632, + 5656, + 5682, + 5711, + 5852, + 5987, + 6070, + 6074, + 6075, + 6079, + 6080, + 6082, + 6082, + 6086, + 6086, + 6086, + 6088, + 6091, + 6094, + 6095, + 6099, + 6099, + 6099, + 6101, + 6107, + 6117, + 6123, + 6126, + 6163, + 6224, + 6272, + 6452, + 6591, + 6705, + 6747, + 6810, + 6845, + 7060, + 7219, + 7374, + 7377, + 7383, + 7390, + 7394, + 7396, + 7418, + 7507, + 7569, + 7642, + 7684, + 7780, + 7791, + 7837, + 7938, + 8076, + 8185, + 8321, + 8400, + 8402, + 8403, + 8473, + 8585, + 8710, + 8840, + 8899, + 8993, + 9152, + 9265, + 9491, + 9654, + 9657, + 9659, + 9659, + 9668, + 9823, + 9952, + 9954, + 9954, + 9958, + 9968, + 10004, + 10020, + 10023, + 10023, + 10024, + 10024, + 10024, + 10024, + 10024, + 10024, + 10024, + 10024, + 10024, + 10024, + 10025, + 10025, + 10026, + 10026, + 10027 + ] + }, + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "230" + ], + [ + "04:10", + "256" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "371" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "621" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "864" + ], + [ + "05:49", + "953" + ], + [ + "06:00", + "1167" + ], + [ + "06:10", + "1303" + ], + [ + "06:19", + "1469" + ], + [ + "06:30", + "2212" + ], + [ + "06:40", + "2682" + ], + [ + "06:49", + "2952" + ], + [ + "07:00", + "3613" + ], + [ + "07:10", + "3942" + ], + [ + "07:19", + "4156" + ], + [ + "07:30", + "4686" + ], + [ + "07:40", + "4766" + ], + [ + "07:49", + "4782" + ], + [ + "08:00", + "4838" + ], + [ + "08:10", + "4887" + ], + [ + "08:19", + "4919" + ], + [ + "08:30", + "4928" + ], + [ + "08:40", + "4946" + ], + [ + "08:49", + "4947" + ], + [ + "09:00", + "4961" + ], + [ + "09:10", + "5041" + ], + [ + "09:19", + "5117" + ], + [ + "09:30", + "5365" + ], + [ + "09:40", + "5530" + ], + [ + "09:49", + "5622" + ], + [ + "10:00", + "5647" + ], + [ + "10:10", + "5672" + ], + [ + "10:19", + "5696" + ], + [ + "10:30", + "5837" + ], + [ + "10:40", + "5975" + ], + [ + "10:49", + "6057" + ], + [ + "11:00", + "6064" + ], + [ + "11:10", + "6065" + ], + [ + "11:19", + "6069" + ], + [ + "11:30", + "6070" + ], + [ + "11:40", + "6072" + ], + [ + "11:49", + "6072" + ], + [ + "12:00", + "6076" + ], + [ + "12:10", + "6076" + ], + [ + "12:19", + "6076" + ], + [ + "12:30", + "6078" + ], + [ + "12:40", + "6081" + ], + [ + "12:49", + "6084" + ], + [ + "13:00", + "6085" + ], + [ + "13:10", + "6089" + ], + [ + "13:19", + "6089" + ], + [ + "13:30", + "6089" + ], + [ + "13:40", + "6091" + ], + [ + "13:49", + "6098" + ], + [ + "14:00", + "6108" + ], + [ + "14:10", + "6113" + ], + [ + "14:19", + "6116" + ], + [ + "14:30", + "6153" + ], + [ + "14:40", + "6219" + ], + [ + "14:49", + "6261" + ], + [ + "15:00", + "6437" + ], + [ + "15:10", + "6580" + ], + [ + "15:19", + "6692" + ], + [ + "15:30", + "6737" + ], + [ + "15:40", + "6800" + ], + [ + "15:49", + "6831" + ], + [ + "16:00", + "7047" + ], + [ + "16:10", + "7227" + ], + [ + "16:19", + "7368" + ], + [ + "16:30", + "7371" + ], + [ + "16:40", + "7377" + ], + [ + "16:49", + "7385" + ], + [ + "17:00", + "7389" + ], + [ + "17:10", + "7392" + ], + [ + "17:19", + "7424" + ], + [ + "17:30", + "7512" + ], + [ + "17:40", + "7576" + ], + [ + "17:49", + "7655" + ], + [ + "18:00", + "7712" + ], + [ + "18:10", + "7805" + ], + [ + "18:19", + "7827" + ], + [ + "18:30", + "7861" + ], + [ + "18:40", + "7964" + ], + [ + "18:49", + "8099" + ], + [ + "19:00", + "8208" + ], + [ + "19:10", + "8359" + ], + [ + "19:19", + "8428" + ], + [ + "19:30", + "8430" + ], + [ + "19:40", + "8431" + ], + [ + "19:49", + "8496" + ], + [ + "20:00", + "8605" + ], + [ + "20:10", + "8729" + ], + [ + "20:19", + "8864" + ], + [ + "20:30", + "8913" + ], + [ + "20:40", + "8994" + ], + [ + "20:49", + "9155" + ], + [ + "21:00", + "9269" + ], + [ + "21:10", + "9493" + ], + [ + "21:19", + "9650" + ], + [ + "21:30", + "9652" + ], + [ + "21:40", + "9654" + ], + [ + "21:49", + "9654" + ], + [ + "22:00", + "9655" + ], + [ + "22:10", + "9807" + ], + [ + "22:19", + "9942" + ], + [ + "22:30", + "9942" + ], + [ + "22:40", + "9943" + ], + [ + "22:49", + "9944" + ], + [ + "23:00", + "9954" + ], + [ + "23:10", + "9989" + ], + [ + "23:19", + "10007" + ], + [ + "23:30", + "10010" + ], + [ + "23:40", + "10010" + ], + [ + "23:49", + "10011" + ], + [ + "00:00", + "10011" + ], + [ + "00:10", + "10011" + ], + [ + "00:19", + "10011" + ], + [ + "00:30", + "10011" + ], + [ + "00:40", + "10011" + ], + [ + "00:49", + "10011" + ], + [ + "01:00", + "10011" + ], + [ + "01:10", + "10012" + ], + [ + "01:19", + "10012" + ], + [ + "01:30", + "10014" + ], + [ + "01:40", + "10014" + ], + [ + "01:49", + "10015" + ], + [ + "02:00", + "10015" + ], + [ + "02:10", + "10016" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 230, + 256, + 274, + 311, + 335, + 371, + 451, + 541, + 621, + 774, + 864, + 953, + 1167, + 1303, + 1469, + 2212, + 2682, + 2952, + 3613, + 3942, + 4156, + 4686, + 4766, + 4782, + 4838, + 4887, + 4919, + 4928, + 4946, + 4947, + 4961, + 5041, + 5117, + 5365, + 5530, + 5622, + 5647, + 5672, + 5696, + 5837, + 5975, + 6057, + 6064, + 6065, + 6069, + 6070, + 6072, + 6072, + 6076, + 6076, + 6076, + 6078, + 6081, + 6084, + 6085, + 6089, + 6089, + 6089, + 6091, + 6098, + 6108, + 6113, + 6116, + 6153, + 6219, + 6261, + 6437, + 6580, + 6692, + 6737, + 6800, + 6831, + 7047, + 7227, + 7368, + 7371, + 7377, + 7385, + 7389, + 7392, + 7424, + 7512, + 7576, + 7655, + 7712, + 7805, + 7827, + 7861, + 7964, + 8099, + 8208, + 8359, + 8428, + 8430, + 8431, + 8496, + 8605, + 8729, + 8864, + 8913, + 8994, + 9155, + 9269, + 9493, + 9650, + 9652, + 9654, + 9654, + 9655, + 9807, + 9942, + 9942, + 9943, + 9944, + 9954, + 9989, + 10007, + 10010, + 10010, + 10011, + 10011, + 10011, + 10011, + 10011, + 10011, + 10011, + 10011, + 10012, + 10012, + 10014, + 10014, + 10015, + 10015, + 10016 + ] + }, + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "229" + ], + [ + "04:10", + "255" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "370" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "622" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "862" + ], + [ + "05:49", + "951" + ], + [ + "06:00", + "1166" + ], + [ + "06:10", + "1304" + ], + [ + "06:19", + "1467" + ], + [ + "06:30", + "2208" + ], + [ + "06:40", + "2689" + ], + [ + "06:49", + "2932" + ], + [ + "07:00", + "3612" + ], + [ + "07:10", + "3937" + ], + [ + "07:19", + "4144" + ], + [ + "07:30", + "4698" + ], + [ + "07:40", + "4781" + ], + [ + "07:49", + "4800" + ], + [ + "08:00", + "4854" + ], + [ + "08:10", + "4903" + ], + [ + "08:19", + "4940" + ], + [ + "08:30", + "4949" + ], + [ + "08:40", + "4959" + ], + [ + "08:49", + "4962" + ], + [ + "09:00", + "4978" + ], + [ + "09:10", + "5058" + ], + [ + "09:19", + "5125" + ], + [ + "09:30", + "5379" + ], + [ + "09:40", + "5547" + ], + [ + "09:49", + "5639" + ], + [ + "10:00", + "5659" + ], + [ + "10:10", + "5683" + ], + [ + "10:19", + "5713" + ], + [ + "10:30", + "5846" + ], + [ + "10:40", + "5985" + ], + [ + "10:49", + "6071" + ], + [ + "11:00", + "6076" + ], + [ + "11:10", + "6077" + ], + [ + "11:19", + "6081" + ], + [ + "11:30", + "6082" + ], + [ + "11:40", + "6084" + ], + [ + "11:49", + "6084" + ], + [ + "12:00", + "6088" + ], + [ + "12:10", + "6088" + ], + [ + "12:19", + "6088" + ], + [ + "12:30", + "6090" + ], + [ + "12:40", + "6093" + ], + [ + "12:49", + "6096" + ], + [ + "13:00", + "6098" + ], + [ + "13:10", + "6102" + ], + [ + "13:19", + "6102" + ], + [ + "13:30", + "6102" + ], + [ + "13:40", + "6104" + ], + [ + "13:49", + "6110" + ], + [ + "14:00", + "6120" + ], + [ + "14:10", + "6125" + ], + [ + "14:19", + "6128" + ], + [ + "14:30", + "6164" + ], + [ + "14:40", + "6234" + ], + [ + "14:49", + "6281" + ], + [ + "15:00", + "6470" + ], + [ + "15:10", + "6599" + ], + [ + "15:19", + "6712" + ], + [ + "15:30", + "6755" + ], + [ + "15:40", + "6815" + ], + [ + "15:49", + "6844" + ], + [ + "16:00", + "7058" + ], + [ + "16:10", + "7228" + ], + [ + "16:19", + "7375" + ], + [ + "16:30", + "7378" + ], + [ + "16:40", + "7382" + ], + [ + "16:49", + "7390" + ], + [ + "17:00", + "7394" + ], + [ + "17:10", + "7396" + ], + [ + "17:19", + "7419" + ], + [ + "17:30", + "7512" + ], + [ + "17:40", + "7566" + ], + [ + "17:49", + "7651" + ], + [ + "18:00", + "7683" + ], + [ + "18:10", + "7775" + ], + [ + "18:19", + "7792" + ], + [ + "18:30", + "7821" + ], + [ + "18:40", + "7923" + ], + [ + "18:49", + "8057" + ], + [ + "19:00", + "8167" + ], + [ + "19:10", + "8308" + ], + [ + "19:19", + "8382" + ], + [ + "19:30", + "8384" + ], + [ + "19:40", + "8384" + ], + [ + "19:49", + "8447" + ], + [ + "20:00", + "8555" + ], + [ + "20:10", + "8684" + ], + [ + "20:19", + "8814" + ], + [ + "20:30", + "8859" + ], + [ + "20:40", + "8951" + ], + [ + "20:49", + "9114" + ], + [ + "21:00", + "9234" + ], + [ + "21:10", + "9464" + ], + [ + "21:19", + "9615" + ], + [ + "21:30", + "9617" + ], + [ + "21:40", + "9619" + ], + [ + "21:49", + "9619" + ], + [ + "22:00", + "9633" + ], + [ + "22:10", + "9785" + ], + [ + "22:19", + "9915" + ], + [ + "22:30", + "9916" + ], + [ + "22:40", + "9916" + ], + [ + "22:49", + "9917" + ], + [ + "23:00", + "9927" + ], + [ + "23:10", + "9964" + ], + [ + "23:19", + "9982" + ], + [ + "23:30", + "9985" + ], + [ + "23:40", + "9985" + ], + [ + "23:49", + "9986" + ], + [ + "00:00", + "9986" + ], + [ + "00:10", + "9986" + ], + [ + "00:19", + "9986" + ], + [ + "00:30", + "9986" + ], + [ + "00:40", + "9986" + ], + [ + "00:49", + "9986" + ], + [ + "01:00", + "9986" + ], + [ + "01:10", + "9987" + ], + [ + "01:19", + "9987" + ], + [ + "01:30", + "9989" + ], + [ + "01:40", + "9989" + ], + [ + "01:49", + "9990" + ], + [ + "02:00", + "9990" + ], + [ + "02:10", + "9991" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 229, + 255, + 274, + 311, + 335, + 370, + 451, + 541, + 622, + 774, + 862, + 951, + 1166, + 1304, + 1467, + 2208, + 2689, + 2932, + 3612, + 3937, + 4144, + 4698, + 4781, + 4800, + 4854, + 4903, + 4940, + 4949, + 4959, + 4962, + 4978, + 5058, + 5125, + 5379, + 5547, + 5639, + 5659, + 5683, + 5713, + 5846, + 5985, + 6071, + 6076, + 6077, + 6081, + 6082, + 6084, + 6084, + 6088, + 6088, + 6088, + 6090, + 6093, + 6096, + 6098, + 6102, + 6102, + 6102, + 6104, + 6110, + 6120, + 6125, + 6128, + 6164, + 6234, + 6281, + 6470, + 6599, + 6712, + 6755, + 6815, + 6844, + 7058, + 7228, + 7375, + 7378, + 7382, + 7390, + 7394, + 7396, + 7419, + 7512, + 7566, + 7651, + 7683, + 7775, + 7792, + 7821, + 7923, + 8057, + 8167, + 8308, + 8382, + 8384, + 8384, + 8447, + 8555, + 8684, + 8814, + 8859, + 8951, + 9114, + 9234, + 9464, + 9615, + 9617, + 9619, + 9619, + 9633, + 9785, + 9915, + 9916, + 9916, + 9917, + 9927, + 9964, + 9982, + 9985, + 9985, + 9986, + 9986, + 9986, + 9986, + 9986, + 9986, + 9986, + 9986, + 9987, + 9987, + 9989, + 9989, + 9990, + 9990, + 9991 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Fleet Size (cumulative vehicles) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Cumulative unique vehicles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "229" + ], + [ + "04:10", + "255" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "370" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "622" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "862" + ], + [ + "05:49", + "951" + ], + [ + "06:00", + "1166" + ], + [ + "06:10", + "1304" + ], + [ + "06:19", + "1466" + ], + [ + "06:30", + "2208" + ], + [ + "06:40", + "2687" + ], + [ + "06:49", + "2936" + ], + [ + "07:00", + "3610" + ], + [ + "07:10", + "3938" + ], + [ + "07:19", + "4140" + ], + [ + "07:30", + "4692" + ], + [ + "07:40", + "4779" + ], + [ + "07:49", + "4789" + ], + [ + "08:00", + "4847" + ], + [ + "08:10", + "4896" + ], + [ + "08:19", + "4937" + ], + [ + "08:30", + "4947" + ], + [ + "08:40", + "4963" + ], + [ + "08:49", + "4966" + ], + [ + "09:00", + "4979" + ], + [ + "09:10", + "5064" + ], + [ + "09:19", + "5135" + ], + [ + "09:30", + "5385" + ], + [ + "09:40", + "5549" + ], + [ + "09:49", + "5649" + ], + [ + "10:00", + "5669" + ], + [ + "10:10", + "5693" + ], + [ + "10:19", + "5724" + ], + [ + "10:30", + "5858" + ], + [ + "10:40", + "5996" + ], + [ + "10:49", + "6080" + ], + [ + "11:00", + "6085" + ], + [ + "11:10", + "6086" + ], + [ + "11:19", + "6090" + ], + [ + "11:30", + "6091" + ], + [ + "11:40", + "6093" + ], + [ + "11:49", + "6093" + ], + [ + "12:00", + "6097" + ], + [ + "12:10", + "6097" + ], + [ + "12:19", + "6097" + ], + [ + "12:30", + "6099" + ], + [ + "12:40", + "6102" + ], + [ + "12:49", + "6105" + ], + [ + "13:00", + "6107" + ], + [ + "13:10", + "6111" + ], + [ + "13:19", + "6111" + ], + [ + "13:30", + "6111" + ], + [ + "13:40", + "6113" + ], + [ + "13:49", + "6118" + ], + [ + "14:00", + "6127" + ], + [ + "14:10", + "6132" + ], + [ + "14:19", + "6135" + ], + [ + "14:30", + "6172" + ], + [ + "14:40", + "6239" + ], + [ + "14:49", + "6284" + ], + [ + "15:00", + "6457" + ], + [ + "15:10", + "6600" + ], + [ + "15:19", + "6714" + ], + [ + "15:30", + "6765" + ], + [ + "15:40", + "6827" + ], + [ + "15:49", + "6853" + ], + [ + "16:00", + "7064" + ], + [ + "16:10", + "7234" + ], + [ + "16:19", + "7384" + ], + [ + "16:30", + "7387" + ], + [ + "16:40", + "7393" + ], + [ + "16:49", + "7400" + ], + [ + "17:00", + "7404" + ], + [ + "17:10", + "7406" + ], + [ + "17:19", + "7436" + ], + [ + "17:30", + "7525" + ], + [ + "17:40", + "7573" + ], + [ + "17:49", + "7653" + ], + [ + "18:00", + "7701" + ], + [ + "18:10", + "7786" + ], + [ + "18:19", + "7806" + ], + [ + "18:30", + "7847" + ], + [ + "18:40", + "7949" + ], + [ + "18:49", + "8089" + ], + [ + "19:00", + "8204" + ], + [ + "19:10", + "8349" + ], + [ + "19:19", + "8416" + ], + [ + "19:30", + "8429" + ], + [ + "19:40", + "8430" + ], + [ + "19:49", + "8492" + ], + [ + "20:00", + "8602" + ], + [ + "20:10", + "8726" + ], + [ + "20:19", + "8849" + ], + [ + "20:30", + "8895" + ], + [ + "20:40", + "8971" + ], + [ + "20:49", + "9131" + ], + [ + "21:00", + "9246" + ], + [ + "21:10", + "9472" + ], + [ + "21:19", + "9616" + ], + [ + "21:30", + "9619" + ], + [ + "21:40", + "9621" + ], + [ + "21:49", + "9621" + ], + [ + "22:00", + "9644" + ], + [ + "22:10", + "9797" + ], + [ + "22:19", + "9925" + ], + [ + "22:30", + "9926" + ], + [ + "22:40", + "9926" + ], + [ + "22:49", + "9933" + ], + [ + "23:00", + "9943" + ], + [ + "23:10", + "9978" + ], + [ + "23:19", + "9993" + ], + [ + "23:30", + "9996" + ], + [ + "23:40", + "9996" + ], + [ + "23:49", + "9997" + ], + [ + "00:00", + "9997" + ], + [ + "00:10", + "9997" + ], + [ + "00:19", + "9997" + ], + [ + "00:30", + "9997" + ], + [ + "00:40", + "9997" + ], + [ + "00:49", + "9997" + ], + [ + "01:00", + "9997" + ], + [ + "01:10", + "9997" + ], + [ + "01:19", + "9997" + ], + [ + "01:30", + "9999" + ], + [ + "01:40", + "9999" + ], + [ + "01:49", + "10000" + ], + [ + "02:00", + "10000" + ], + [ + "02:10", + "10001" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 229, + 255, + 274, + 311, + 335, + 370, + 451, + 541, + 622, + 774, + 862, + 951, + 1166, + 1304, + 1466, + 2208, + 2687, + 2936, + 3610, + 3938, + 4140, + 4692, + 4779, + 4789, + 4847, + 4896, + 4937, + 4947, + 4963, + 4966, + 4979, + 5064, + 5135, + 5385, + 5549, + 5649, + 5669, + 5693, + 5724, + 5858, + 5996, + 6080, + 6085, + 6086, + 6090, + 6091, + 6093, + 6093, + 6097, + 6097, + 6097, + 6099, + 6102, + 6105, + 6107, + 6111, + 6111, + 6111, + 6113, + 6118, + 6127, + 6132, + 6135, + 6172, + 6239, + 6284, + 6457, + 6600, + 6714, + 6765, + 6827, + 6853, + 7064, + 7234, + 7384, + 7387, + 7393, + 7400, + 7404, + 7406, + 7436, + 7525, + 7573, + 7653, + 7701, + 7786, + 7806, + 7847, + 7949, + 8089, + 8204, + 8349, + 8416, + 8429, + 8430, + 8492, + 8602, + 8726, + 8849, + 8895, + 8971, + 9131, + 9246, + 9472, + 9616, + 9619, + 9621, + 9621, + 9644, + 9797, + 9925, + 9926, + 9926, + 9933, + 9943, + 9978, + 9993, + 9996, + 9996, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9999, + 9999, + 10000, + 10000, + 10001 + ] + }, + { + "customdata": [ + [ + "03:00", + "44" + ], + [ + "03:10", + "87" + ], + [ + "03:19", + "119" + ], + [ + "03:30", + "138" + ], + [ + "03:40", + "171" + ], + [ + "03:49", + "198" + ], + [ + "04:00", + "231" + ], + [ + "04:10", + "252" + ], + [ + "04:19", + "266" + ], + [ + "04:30", + "314" + ], + [ + "04:40", + "338" + ], + [ + "04:49", + "366" + ], + [ + "05:00", + "455" + ], + [ + "05:10", + "520" + ], + [ + "05:19", + "612" + ], + [ + "05:30", + "733" + ], + [ + "05:40", + "864" + ], + [ + "05:49", + "927" + ], + [ + "06:00", + "1165" + ], + [ + "06:10", + "1303" + ], + [ + "06:19", + "1425" + ], + [ + "06:30", + "2158" + ], + [ + "06:40", + "2713" + ], + [ + "06:49", + "2915" + ], + [ + "07:00", + "3618" + ], + [ + "07:10", + "3940" + ], + [ + "07:19", + "4072" + ], + [ + "07:30", + "4501" + ], + [ + "07:40", + "4636" + ], + [ + "07:49", + "4701" + ], + [ + "08:00", + "4753" + ], + [ + "08:10", + "4784" + ], + [ + "08:19", + "4835" + ], + [ + "08:30", + "4841" + ], + [ + "08:40", + "4844" + ], + [ + "08:49", + "4850" + ], + [ + "09:00", + "4856" + ], + [ + "09:10", + "4884" + ], + [ + "09:19", + "4965" + ], + [ + "09:30", + "5170" + ], + [ + "09:40", + "5300" + ], + [ + "09:49", + "5399" + ], + [ + "10:00", + "5412" + ], + [ + "10:10", + "5425" + ], + [ + "10:19", + "5448" + ], + [ + "10:30", + "5592" + ], + [ + "10:40", + "5696" + ], + [ + "10:49", + "5774" + ], + [ + "11:00", + "5777" + ], + [ + "11:10", + "5782" + ], + [ + "11:19", + "5785" + ], + [ + "11:30", + "5786" + ], + [ + "11:40", + "5786" + ], + [ + "11:49", + "5788" + ], + [ + "12:00", + "5789" + ], + [ + "12:10", + "5790" + ], + [ + "12:19", + "5791" + ], + [ + "12:30", + "5792" + ], + [ + "12:40", + "5794" + ], + [ + "12:49", + "5797" + ], + [ + "13:00", + "5799" + ], + [ + "13:10", + "5799" + ], + [ + "13:19", + "5800" + ], + [ + "13:30", + "5801" + ], + [ + "13:40", + "5801" + ], + [ + "13:49", + "5801" + ], + [ + "14:00", + "5810" + ], + [ + "14:10", + "5820" + ], + [ + "14:19", + "5847" + ], + [ + "14:30", + "5917" + ], + [ + "14:40", + "6009" + ], + [ + "14:49", + "6055" + ], + [ + "15:00", + "6194" + ], + [ + "15:10", + "6392" + ], + [ + "15:19", + "6423" + ], + [ + "15:30", + "6436" + ], + [ + "15:40", + "6503" + ], + [ + "15:49", + "6576" + ], + [ + "16:00", + "6758" + ], + [ + "16:10", + "6886" + ], + [ + "16:19", + "6982" + ], + [ + "16:30", + "6983" + ], + [ + "16:40", + "6985" + ], + [ + "16:49", + "6988" + ], + [ + "17:00", + "6990" + ], + [ + "17:10", + "6998" + ], + [ + "17:19", + "7039" + ], + [ + "17:30", + "7100" + ], + [ + "17:40", + "7193" + ], + [ + "17:49", + "7270" + ], + [ + "18:00", + "7283" + ], + [ + "18:10", + "7344" + ], + [ + "18:19", + "7405" + ], + [ + "18:30", + "7475" + ], + [ + "18:40", + "7542" + ], + [ + "18:49", + "7617" + ], + [ + "19:00", + "7742" + ], + [ + "19:10", + "7797" + ], + [ + "19:19", + "7891" + ], + [ + "19:30", + "7892" + ], + [ + "19:40", + "7892" + ], + [ + "19:49", + "7944" + ], + [ + "20:00", + "7992" + ], + [ + "20:10", + "8117" + ], + [ + "20:19", + "8296" + ], + [ + "20:30", + "8400" + ], + [ + "20:40", + "8464" + ], + [ + "20:49", + "8588" + ], + [ + "21:00", + "8702" + ], + [ + "21:10", + "8826" + ], + [ + "21:19", + "8996" + ], + [ + "21:30", + "8997" + ], + [ + "21:40", + "9001" + ], + [ + "21:49", + "9001" + ], + [ + "22:00", + "9039" + ], + [ + "22:10", + "9167" + ], + [ + "22:19", + "9315" + ], + [ + "22:30", + "9316" + ], + [ + "22:40", + "9316" + ], + [ + "22:49", + "9378" + ], + [ + "23:00", + "9382" + ], + [ + "23:10", + "9393" + ], + [ + "23:19", + "9428" + ], + [ + "23:30", + "9429" + ], + [ + "23:40", + "9430" + ], + [ + "23:49", + "9433" + ], + [ + "00:00", + "9434" + ], + [ + "00:10", + "9434" + ], + [ + "00:19", + "9435" + ], + [ + "00:30", + "9435" + ], + [ + "00:40", + "9435" + ], + [ + "00:49", + "9435" + ], + [ + "01:00", + "9435" + ], + [ + "01:10", + "9435" + ], + [ + "01:19", + "9435" + ], + [ + "01:30", + "9435" + ], + [ + "01:40", + "9436" + ], + [ + "01:49", + "9436" + ], + [ + "02:00", + "9436" + ], + [ + "02:10", + "9436" + ], + [ + "02:19", + "9437" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332 + ], + "y": [ + 44, + 87, + 119, + 138, + 171, + 198, + 231, + 252, + 266, + 314, + 338, + 366, + 455, + 520, + 612, + 733, + 864, + 927, + 1165, + 1303, + 1425, + 2158, + 2713, + 2915, + 3618, + 3940, + 4072, + 4501, + 4636, + 4701, + 4753, + 4784, + 4835, + 4841, + 4844, + 4850, + 4856, + 4884, + 4965, + 5170, + 5300, + 5399, + 5412, + 5425, + 5448, + 5592, + 5696, + 5774, + 5777, + 5782, + 5785, + 5786, + 5786, + 5788, + 5789, + 5790, + 5791, + 5792, + 5794, + 5797, + 5799, + 5799, + 5800, + 5801, + 5801, + 5801, + 5810, + 5820, + 5847, + 5917, + 6009, + 6055, + 6194, + 6392, + 6423, + 6436, + 6503, + 6576, + 6758, + 6886, + 6982, + 6983, + 6985, + 6988, + 6990, + 6998, + 7039, + 7100, + 7193, + 7270, + 7283, + 7344, + 7405, + 7475, + 7542, + 7617, + 7742, + 7797, + 7891, + 7892, + 7892, + 7944, + 7992, + 8117, + 8296, + 8400, + 8464, + 8588, + 8702, + 8826, + 8996, + 8997, + 9001, + 9001, + 9039, + 9167, + 9315, + 9316, + 9316, + 9378, + 9382, + 9393, + 9428, + 9429, + 9430, + 9433, + 9434, + 9434, + 9435, + 9435, + 9435, + 9435, + 9435, + 9435, + 9435, + 9435, + 9436, + 9436, + 9436, + 9436, + 9437 + ] + }, + { + "customdata": [ + [ + "03:00", + "40" + ], + [ + "03:10", + "86" + ], + [ + "03:19", + "119" + ], + [ + "03:30", + "144" + ], + [ + "03:40", + "168" + ], + [ + "03:49", + "193" + ], + [ + "04:00", + "227" + ], + [ + "04:10", + "257" + ], + [ + "04:19", + "272" + ], + [ + "04:30", + "316" + ], + [ + "04:40", + "343" + ], + [ + "04:49", + "368" + ], + [ + "05:00", + "459" + ], + [ + "05:10", + "539" + ], + [ + "05:19", + "607" + ], + [ + "05:30", + "742" + ], + [ + "05:40", + "848" + ], + [ + "05:49", + "950" + ], + [ + "06:00", + "1128" + ], + [ + "06:10", + "1336" + ], + [ + "06:19", + "1429" + ], + [ + "06:30", + "2178" + ], + [ + "06:40", + "2673" + ], + [ + "06:49", + "2881" + ], + [ + "07:00", + "3515" + ], + [ + "07:10", + "3823" + ], + [ + "07:19", + "4091" + ], + [ + "07:30", + "4513" + ], + [ + "07:40", + "4560" + ], + [ + "07:49", + "4664" + ], + [ + "08:00", + "4697" + ], + [ + "08:10", + "4729" + ], + [ + "08:19", + "4761" + ], + [ + "08:30", + "4763" + ], + [ + "08:40", + "4765" + ], + [ + "08:49", + "4775" + ], + [ + "09:00", + "4786" + ], + [ + "09:10", + "4798" + ], + [ + "09:19", + "4876" + ], + [ + "09:30", + "5036" + ], + [ + "09:40", + "5186" + ], + [ + "09:49", + "5251" + ], + [ + "10:00", + "5276" + ], + [ + "10:10", + "5284" + ], + [ + "10:19", + "5286" + ], + [ + "10:30", + "5416" + ], + [ + "10:40", + "5512" + ], + [ + "10:49", + "5632" + ], + [ + "11:00", + "5634" + ], + [ + "11:10", + "5635" + ], + [ + "11:19", + "5638" + ], + [ + "11:30", + "5638" + ], + [ + "11:40", + "5639" + ], + [ + "11:49", + "5640" + ], + [ + "12:00", + "5642" + ], + [ + "12:10", + "5642" + ], + [ + "12:19", + "5642" + ], + [ + "12:30", + "5643" + ], + [ + "12:40", + "5644" + ], + [ + "12:49", + "5647" + ], + [ + "13:00", + "5648" + ], + [ + "13:10", + "5648" + ], + [ + "13:19", + "5650" + ], + [ + "13:30", + "5653" + ], + [ + "13:40", + "5654" + ], + [ + "13:49", + "5655" + ], + [ + "14:00", + "5694" + ], + [ + "14:10", + "5721" + ], + [ + "14:19", + "5750" + ], + [ + "14:30", + "5807" + ], + [ + "14:40", + "5888" + ], + [ + "14:49", + "5973" + ], + [ + "15:00", + "6146" + ], + [ + "15:10", + "6286" + ], + [ + "15:19", + "6317" + ], + [ + "15:30", + "6346" + ], + [ + "15:40", + "6385" + ], + [ + "15:49", + "6437" + ], + [ + "16:00", + "6595" + ], + [ + "16:10", + "6753" + ], + [ + "16:19", + "6906" + ], + [ + "16:30", + "6907" + ], + [ + "16:40", + "6913" + ], + [ + "16:49", + "6916" + ], + [ + "17:00", + "6917" + ], + [ + "17:10", + "6926" + ], + [ + "17:19", + "6943" + ], + [ + "17:30", + "7030" + ], + [ + "17:40", + "7037" + ], + [ + "17:49", + "7062" + ], + [ + "18:00", + "7162" + ], + [ + "18:10", + "7187" + ], + [ + "18:19", + "7228" + ], + [ + "18:30", + "7259" + ], + [ + "18:40", + "7354" + ], + [ + "18:49", + "7444" + ], + [ + "19:00", + "7548" + ], + [ + "19:10", + "7639" + ], + [ + "19:19", + "7723" + ], + [ + "19:30", + "7731" + ], + [ + "19:40", + "7766" + ], + [ + "19:49", + "7790" + ], + [ + "20:00", + "7837" + ], + [ + "20:10", + "7968" + ], + [ + "20:19", + "8131" + ], + [ + "20:30", + "8226" + ], + [ + "20:40", + "8292" + ], + [ + "20:49", + "8416" + ], + [ + "21:00", + "8536" + ], + [ + "21:10", + "8686" + ], + [ + "21:19", + "8860" + ], + [ + "21:30", + "8862" + ], + [ + "21:40", + "8865" + ], + [ + "21:49", + "8866" + ], + [ + "22:00", + "8928" + ], + [ + "22:10", + "9064" + ], + [ + "22:19", + "9161" + ], + [ + "22:30", + "9162" + ], + [ + "22:40", + "9162" + ], + [ + "22:49", + "9260" + ], + [ + "23:00", + "9273" + ], + [ + "23:10", + "9275" + ], + [ + "23:19", + "9286" + ], + [ + "23:30", + "9288" + ], + [ + "23:40", + "9290" + ], + [ + "23:49", + "9290" + ], + [ + "00:00", + "9290" + ], + [ + "00:10", + "9291" + ], + [ + "00:19", + "9291" + ], + [ + "00:30", + "9291" + ], + [ + "00:40", + "9291" + ], + [ + "00:49", + "9291" + ], + [ + "01:00", + "9291" + ], + [ + "01:10", + "9291" + ], + [ + "01:19", + "9291" + ], + [ + "01:30", + "9291" + ], + [ + "01:40", + "9292" + ], + [ + "01:49", + "9294" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332 + ], + "y": [ + 40, + 86, + 119, + 144, + 168, + 193, + 227, + 257, + 272, + 316, + 343, + 368, + 459, + 539, + 607, + 742, + 848, + 950, + 1128, + 1336, + 1429, + 2178, + 2673, + 2881, + 3515, + 3823, + 4091, + 4513, + 4560, + 4664, + 4697, + 4729, + 4761, + 4763, + 4765, + 4775, + 4786, + 4798, + 4876, + 5036, + 5186, + 5251, + 5276, + 5284, + 5286, + 5416, + 5512, + 5632, + 5634, + 5635, + 5638, + 5638, + 5639, + 5640, + 5642, + 5642, + 5642, + 5643, + 5644, + 5647, + 5648, + 5648, + 5650, + 5653, + 5654, + 5655, + 5694, + 5721, + 5750, + 5807, + 5888, + 5973, + 6146, + 6286, + 6317, + 6346, + 6385, + 6437, + 6595, + 6753, + 6906, + 6907, + 6913, + 6916, + 6917, + 6926, + 6943, + 7030, + 7037, + 7062, + 7162, + 7187, + 7228, + 7259, + 7354, + 7444, + 7548, + 7639, + 7723, + 7731, + 7766, + 7790, + 7837, + 7968, + 8131, + 8226, + 8292, + 8416, + 8536, + 8686, + 8860, + 8862, + 8865, + 8866, + 8928, + 9064, + 9161, + 9162, + 9162, + 9260, + 9273, + 9275, + 9286, + 9288, + 9290, + 9290, + 9290, + 9291, + 9291, + 9291, + 9291, + 9291, + 9291, + 9291, + 9291, + 9291, + 9292, + 9294 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Fleet Size (cumulative vehicles) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Cumulative unique vehicles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "50" + ], + [ + "03:10", + "91" + ], + [ + "03:19", + "115" + ], + [ + "03:30", + "143" + ], + [ + "03:40", + "174" + ], + [ + "03:49", + "200" + ], + [ + "04:00", + "229" + ], + [ + "04:10", + "255" + ], + [ + "04:19", + "274" + ], + [ + "04:30", + "311" + ], + [ + "04:40", + "335" + ], + [ + "04:49", + "370" + ], + [ + "05:00", + "451" + ], + [ + "05:10", + "541" + ], + [ + "05:19", + "622" + ], + [ + "05:30", + "774" + ], + [ + "05:40", + "862" + ], + [ + "05:49", + "951" + ], + [ + "06:00", + "1166" + ], + [ + "06:10", + "1304" + ], + [ + "06:19", + "1466" + ], + [ + "06:30", + "2208" + ], + [ + "06:40", + "2687" + ], + [ + "06:49", + "2936" + ], + [ + "07:00", + "3610" + ], + [ + "07:10", + "3938" + ], + [ + "07:19", + "4140" + ], + [ + "07:30", + "4692" + ], + [ + "07:40", + "4779" + ], + [ + "07:49", + "4789" + ], + [ + "08:00", + "4847" + ], + [ + "08:10", + "4896" + ], + [ + "08:19", + "4937" + ], + [ + "08:30", + "4947" + ], + [ + "08:40", + "4963" + ], + [ + "08:49", + "4966" + ], + [ + "09:00", + "4979" + ], + [ + "09:10", + "5064" + ], + [ + "09:19", + "5135" + ], + [ + "09:30", + "5385" + ], + [ + "09:40", + "5549" + ], + [ + "09:49", + "5649" + ], + [ + "10:00", + "5669" + ], + [ + "10:10", + "5693" + ], + [ + "10:19", + "5724" + ], + [ + "10:30", + "5858" + ], + [ + "10:40", + "5996" + ], + [ + "10:49", + "6080" + ], + [ + "11:00", + "6085" + ], + [ + "11:10", + "6086" + ], + [ + "11:19", + "6090" + ], + [ + "11:30", + "6091" + ], + [ + "11:40", + "6093" + ], + [ + "11:49", + "6093" + ], + [ + "12:00", + "6097" + ], + [ + "12:10", + "6097" + ], + [ + "12:19", + "6097" + ], + [ + "12:30", + "6099" + ], + [ + "12:40", + "6102" + ], + [ + "12:49", + "6105" + ], + [ + "13:00", + "6107" + ], + [ + "13:10", + "6111" + ], + [ + "13:19", + "6111" + ], + [ + "13:30", + "6111" + ], + [ + "13:40", + "6113" + ], + [ + "13:49", + "6118" + ], + [ + "14:00", + "6127" + ], + [ + "14:10", + "6132" + ], + [ + "14:19", + "6135" + ], + [ + "14:30", + "6172" + ], + [ + "14:40", + "6239" + ], + [ + "14:49", + "6284" + ], + [ + "15:00", + "6457" + ], + [ + "15:10", + "6600" + ], + [ + "15:19", + "6714" + ], + [ + "15:30", + "6765" + ], + [ + "15:40", + "6827" + ], + [ + "15:49", + "6853" + ], + [ + "16:00", + "7064" + ], + [ + "16:10", + "7234" + ], + [ + "16:19", + "7384" + ], + [ + "16:30", + "7387" + ], + [ + "16:40", + "7393" + ], + [ + "16:49", + "7400" + ], + [ + "17:00", + "7404" + ], + [ + "17:10", + "7406" + ], + [ + "17:19", + "7436" + ], + [ + "17:30", + "7525" + ], + [ + "17:40", + "7573" + ], + [ + "17:49", + "7653" + ], + [ + "18:00", + "7701" + ], + [ + "18:10", + "7786" + ], + [ + "18:19", + "7806" + ], + [ + "18:30", + "7847" + ], + [ + "18:40", + "7949" + ], + [ + "18:49", + "8089" + ], + [ + "19:00", + "8204" + ], + [ + "19:10", + "8349" + ], + [ + "19:19", + "8416" + ], + [ + "19:30", + "8429" + ], + [ + "19:40", + "8430" + ], + [ + "19:49", + "8492" + ], + [ + "20:00", + "8602" + ], + [ + "20:10", + "8726" + ], + [ + "20:19", + "8849" + ], + [ + "20:30", + "8895" + ], + [ + "20:40", + "8971" + ], + [ + "20:49", + "9131" + ], + [ + "21:00", + "9246" + ], + [ + "21:10", + "9472" + ], + [ + "21:19", + "9616" + ], + [ + "21:30", + "9619" + ], + [ + "21:40", + "9621" + ], + [ + "21:49", + "9621" + ], + [ + "22:00", + "9644" + ], + [ + "22:10", + "9797" + ], + [ + "22:19", + "9925" + ], + [ + "22:30", + "9926" + ], + [ + "22:40", + "9926" + ], + [ + "22:49", + "9933" + ], + [ + "23:00", + "9943" + ], + [ + "23:10", + "9978" + ], + [ + "23:19", + "9993" + ], + [ + "23:30", + "9996" + ], + [ + "23:40", + "9996" + ], + [ + "23:49", + "9997" + ], + [ + "00:00", + "9997" + ], + [ + "00:10", + "9997" + ], + [ + "00:19", + "9997" + ], + [ + "00:30", + "9997" + ], + [ + "00:40", + "9997" + ], + [ + "00:49", + "9997" + ], + [ + "01:00", + "9997" + ], + [ + "01:10", + "9997" + ], + [ + "01:19", + "9997" + ], + [ + "01:30", + "9999" + ], + [ + "01:40", + "9999" + ], + [ + "01:49", + "10000" + ], + [ + "02:00", + "10000" + ], + [ + "02:10", + "10001" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668 + ], + "y": [ + 50, + 91, + 115, + 143, + 174, + 200, + 229, + 255, + 274, + 311, + 335, + 370, + 451, + 541, + 622, + 774, + 862, + 951, + 1166, + 1304, + 1466, + 2208, + 2687, + 2936, + 3610, + 3938, + 4140, + 4692, + 4779, + 4789, + 4847, + 4896, + 4937, + 4947, + 4963, + 4966, + 4979, + 5064, + 5135, + 5385, + 5549, + 5649, + 5669, + 5693, + 5724, + 5858, + 5996, + 6080, + 6085, + 6086, + 6090, + 6091, + 6093, + 6093, + 6097, + 6097, + 6097, + 6099, + 6102, + 6105, + 6107, + 6111, + 6111, + 6111, + 6113, + 6118, + 6127, + 6132, + 6135, + 6172, + 6239, + 6284, + 6457, + 6600, + 6714, + 6765, + 6827, + 6853, + 7064, + 7234, + 7384, + 7387, + 7393, + 7400, + 7404, + 7406, + 7436, + 7525, + 7573, + 7653, + 7701, + 7786, + 7806, + 7847, + 7949, + 8089, + 8204, + 8349, + 8416, + 8429, + 8430, + 8492, + 8602, + 8726, + 8849, + 8895, + 8971, + 9131, + 9246, + 9472, + 9616, + 9619, + 9621, + 9621, + 9644, + 9797, + 9925, + 9926, + 9926, + 9933, + 9943, + 9978, + 9993, + 9996, + 9996, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9997, + 9999, + 9999, + 10000, + 10000, + 10001 + ] + }, + { + "customdata": [ + [ + "03:00", + "1580" + ], + [ + "03:10", + "2996" + ], + [ + "03:19", + "4045" + ], + [ + "03:30", + "5056" + ], + [ + "03:40", + "5705" + ], + [ + "03:49", + "6093" + ], + [ + "04:00", + "7074" + ], + [ + "04:10", + "7795" + ], + [ + "04:19", + "8466" + ], + [ + "04:30", + "10110" + ], + [ + "04:40", + "11618" + ], + [ + "04:49", + "12604" + ], + [ + "05:00", + "15692" + ], + [ + "05:10", + "18296" + ], + [ + "05:19", + "19999" + ], + [ + "05:30", + "26092" + ], + [ + "05:40", + "31120" + ], + [ + "05:49", + "34266" + ], + [ + "06:00", + "47957" + ], + [ + "06:10", + "57852" + ], + [ + "06:19", + "63350" + ], + [ + "06:30", + "105491" + ], + [ + "06:40", + "134303" + ], + [ + "06:49", + "149152" + ], + [ + "07:00", + "183607" + ], + [ + "07:10", + "205100" + ], + [ + "07:19", + "215359" + ], + [ + "07:30", + "235051" + ], + [ + "07:40", + "242675" + ], + [ + "07:49", + "249562" + ], + [ + "08:00", + "255260" + ], + [ + "08:10", + "264121" + ], + [ + "08:19", + "272744" + ], + [ + "08:30", + "276657" + ], + [ + "08:40", + "282647" + ], + [ + "08:49", + "289050" + ], + [ + "09:00", + "291676" + ], + [ + "09:10", + "295561" + ], + [ + "09:19", + "299397" + ], + [ + "09:30", + "301966" + ], + [ + "09:40", + "305001" + ], + [ + "09:49", + "308361" + ], + [ + "10:00", + "310893" + ], + [ + "10:10", + "313553" + ], + [ + "10:19", + "315867" + ], + [ + "10:30", + "318304" + ], + [ + "10:40", + "320745" + ], + [ + "10:49", + "323073" + ], + [ + "11:00", + "324993" + ], + [ + "11:10", + "326450" + ], + [ + "11:19", + "327936" + ], + [ + "11:30", + "330302" + ], + [ + "11:40", + "332139" + ], + [ + "11:49", + "333835" + ], + [ + "12:00", + "334708" + ], + [ + "12:10", + "335633" + ], + [ + "12:19", + "336727" + ], + [ + "12:30", + "337347" + ], + [ + "12:40", + "338182" + ], + [ + "12:49", + "338958" + ], + [ + "13:00", + "339727" + ], + [ + "13:10", + "340394" + ], + [ + "13:19", + "340761" + ], + [ + "13:30", + "341106" + ], + [ + "13:40", + "341397" + ], + [ + "13:49", + "341633" + ], + [ + "14:00", + "342905" + ], + [ + "14:10", + "343854" + ], + [ + "14:19", + "344437" + ], + [ + "14:30", + "346938" + ], + [ + "14:40", + "348767" + ], + [ + "14:49", + "349790" + ], + [ + "15:00", + "353634" + ], + [ + "15:10", + "355594" + ], + [ + "15:19", + "356531" + ], + [ + "15:30", + "357649" + ], + [ + "15:40", + "358964" + ], + [ + "15:49", + "360233" + ], + [ + "16:00", + "362734" + ], + [ + "16:10", + "365555" + ], + [ + "16:19", + "368578" + ], + [ + "16:30", + "371509" + ], + [ + "16:40", + "376793" + ], + [ + "16:49", + "382064" + ], + [ + "17:00", + "387334" + ], + [ + "17:10", + "392699" + ], + [ + "17:19", + "398525" + ], + [ + "17:30", + "403983" + ], + [ + "17:40", + "410936" + ], + [ + "17:49", + "418729" + ], + [ + "18:00", + "423898" + ], + [ + "18:10", + "430811" + ], + [ + "18:19", + "438017" + ], + [ + "18:30", + "443983" + ], + [ + "18:40", + "450921" + ], + [ + "18:49", + "458146" + ], + [ + "19:00", + "461805" + ], + [ + "19:10", + "466910" + ], + [ + "19:19", + "472652" + ], + [ + "19:30", + "475982" + ], + [ + "19:40", + "480121" + ], + [ + "19:49", + "484291" + ], + [ + "20:00", + "486938" + ], + [ + "20:10", + "490970" + ], + [ + "20:19", + "495207" + ], + [ + "20:30", + "498233" + ], + [ + "20:40", + "501945" + ], + [ + "20:49", + "506196" + ], + [ + "21:00", + "508688" + ], + [ + "21:10", + "512106" + ], + [ + "21:19", + "515751" + ], + [ + "21:30", + "516524" + ], + [ + "21:40", + "517987" + ], + [ + "21:49", + "519722" + ], + [ + "22:00", + "520464" + ], + [ + "22:10", + "521587" + ], + [ + "22:19", + "522916" + ], + [ + "22:30", + "523281" + ], + [ + "22:40", + "524118" + ], + [ + "22:49", + "525008" + ], + [ + "23:00", + "525299" + ], + [ + "23:10", + "525965" + ], + [ + "23:19", + "526730" + ], + [ + "23:30", + "527405" + ], + [ + "23:40", + "528240" + ], + [ + "23:49", + "529280" + ], + [ + "00:00", + "529645" + ], + [ + "00:10", + "530378" + ], + [ + "00:19", + "531110" + ], + [ + "00:30", + "531496" + ], + [ + "00:40", + "531955" + ], + [ + "00:49", + "532560" + ], + [ + "01:00", + "532925" + ], + [ + "01:10", + "533458" + ], + [ + "01:19", + "534034" + ], + [ + "01:30", + "534273" + ], + [ + "01:40", + "534661" + ], + [ + "01:49", + "535183" + ], + [ + "02:00", + "535368" + ], + [ + "02:10", + "535728" + ], + [ + "02:19", + "536102" + ], + [ + "02:30", + "536262" + ], + [ + "02:40", + "536571" + ], + [ + "02:49", + "536885" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332 + ], + "y": [ + 1580, + 2996, + 4045, + 5056, + 5705, + 6093, + 7074, + 7795, + 8466, + 10110, + 11618, + 12604, + 15692, + 18296, + 19999, + 26092, + 31120, + 34266, + 47957, + 57852, + 63350, + 105491, + 134303, + 149152, + 183607, + 205100, + 215359, + 235051, + 242675, + 249562, + 255260, + 264121, + 272744, + 276657, + 282647, + 289050, + 291676, + 295561, + 299397, + 301966, + 305001, + 308361, + 310893, + 313553, + 315867, + 318304, + 320745, + 323073, + 324993, + 326450, + 327936, + 330302, + 332139, + 333835, + 334708, + 335633, + 336727, + 337347, + 338182, + 338958, + 339727, + 340394, + 340761, + 341106, + 341397, + 341633, + 342905, + 343854, + 344437, + 346938, + 348767, + 349790, + 353634, + 355594, + 356531, + 357649, + 358964, + 360233, + 362734, + 365555, + 368578, + 371509, + 376793, + 382064, + 387334, + 392699, + 398525, + 403983, + 410936, + 418729, + 423898, + 430811, + 438017, + 443983, + 450921, + 458146, + 461805, + 466910, + 472652, + 475982, + 480121, + 484291, + 486938, + 490970, + 495207, + 498233, + 501945, + 506196, + 508688, + 512106, + 515751, + 516524, + 517987, + 519722, + 520464, + 521587, + 522916, + 523281, + 524118, + 525008, + 525299, + 525965, + 526730, + 527405, + 528240, + 529280, + 529645, + 530378, + 531110, + 531496, + 531955, + 532560, + 532925, + 533458, + 534034, + 534273, + 534661, + 535183, + 535368, + 535728, + 536102, + 536262, + 536571, + 536885 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Fleet Size (cumulative vehicles) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Cumulative unique vehicles" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_fleet_size(new_df, pooled_df, scenario, bin_minutes):\n", + " # First depart_bin per vehicle\n", + " new_first = (\n", + " new_df.assign(depart_bin=lambda d: pd.to_numeric(d[\"depart_bin\"], errors=\"coerce\").astype(\"Int64\"))\n", + " .dropna(subset=[\"depart_bin\", \"vehicle_id\"])\n", + " .groupby(\"vehicle_id\")[\"depart_bin\"]\n", + " .min()\n", + " )\n", + "\n", + " if new_first.empty:\n", + " return pd.DataFrame(columns=[\"x\", \"y\", \"hover\"])\n", + "\n", + " intro = new_first.value_counts().sort_index()\n", + " intro = intro.reindex(\n", + " pd.RangeIndex(0, intro.index.max() + 1),\n", + " fill_value=0\n", + " ).cumsum()\n", + "\n", + " # Use scenario-specific bin size to map to clock time\n", + " times = start_time + pd.to_timedelta(intro.index * bin_minutes, unit=\"m\")\n", + " vals = intro.values\n", + "\n", + " df = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " df[\"hover\"] = [f\"Vehicles in service: {int(v):,}\" for v in vals]\n", + " return df\n", + "\n", + "run_timeseries_metric(\n", + " metric_fleet_size,\n", + " \"Fleet Size (cumulative vehicles)\",\n", + " \"Cumulative unique vehicles\",\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Number of requested vehicle trips serviced (as opposed to deadheading trips)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "450.0" + ], + [ + "04:30", + "480.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "576.0" + ], + [ + "05:00", + "1014.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3042.0" + ], + [ + "06:10", + "3402.0" + ], + [ + "06:19", + "3744.0" + ], + [ + "06:30", + "8136.0" + ], + [ + "06:40", + "8430.0" + ], + [ + "06:49", + "8478.0" + ], + [ + "07:00", + "12432.0" + ], + [ + "07:10", + "12216.0" + ], + [ + "07:19", + "12546.0" + ], + [ + "07:30", + "14910.0" + ], + [ + "07:40", + "14982.0" + ], + [ + "07:49", + "14856.0" + ], + [ + "08:00", + "14022.0" + ], + [ + "08:10", + "13818.0" + ], + [ + "08:19", + "14448.0" + ], + [ + "08:30", + "13050.0" + ], + [ + "08:40", + "12876.0" + ], + [ + "08:49", + "13326.0" + ], + [ + "09:00", + "12780.0" + ], + [ + "09:10", + "13242.0" + ], + [ + "09:19", + "12834.0" + ], + [ + "09:30", + "15090.0" + ], + [ + "09:40", + "15396.0" + ], + [ + "09:49", + "15480.0" + ], + [ + "10:00", + "15306.0" + ], + [ + "10:10", + "15174.0" + ], + [ + "10:19", + "14628.0" + ], + [ + "10:30", + "16152.0" + ], + [ + "10:40", + "16536.0" + ], + [ + "10:49", + "16584.0" + ], + [ + "11:00", + "14514.0" + ], + [ + "11:10", + "12984.0" + ], + [ + "11:19", + "13344.0" + ], + [ + "11:30", + "10836.0" + ], + [ + "11:40", + "10410.0" + ], + [ + "11:49", + "10752.0" + ], + [ + "12:00", + "7770.0" + ], + [ + "12:10", + "7818.0" + ], + [ + "12:19", + "8202.0" + ], + [ + "12:30", + "7902.0" + ], + [ + "12:40", + "8166.0" + ], + [ + "12:49", + "7788.0" + ], + [ + "13:00", + "8634.0" + ], + [ + "13:10", + "8412.0" + ], + [ + "13:19", + "8832.0" + ], + [ + "13:30", + "8892.0" + ], + [ + "13:40", + "9390.0" + ], + [ + "13:49", + "9312.0" + ], + [ + "14:00", + "10572.0" + ], + [ + "14:10", + "10848.0" + ], + [ + "14:19", + "10578.0" + ], + [ + "14:30", + "12906.0" + ], + [ + "14:40", + "13248.0" + ], + [ + "14:49", + "13338.0" + ], + [ + "15:00", + "16362.0" + ], + [ + "15:10", + "16206.0" + ], + [ + "15:19", + "17142.0" + ], + [ + "15:30", + "16152.0" + ], + [ + "15:40", + "15510.0" + ], + [ + "15:49", + "15978.0" + ], + [ + "16:00", + "18336.0" + ], + [ + "16:10", + "18156.0" + ], + [ + "16:19", + "18168.0" + ], + [ + "16:30", + "14376.0" + ], + [ + "16:40", + "14388.0" + ], + [ + "16:49", + "14310.0" + ], + [ + "17:00", + "15294.0" + ], + [ + "17:10", + "15126.0" + ], + [ + "17:19", + "15882.0" + ], + [ + "17:30", + "16320.0" + ], + [ + "17:40", + "15726.0" + ], + [ + "17:49", + "15798.0" + ], + [ + "18:00", + "14802.0" + ], + [ + "18:10", + "14646.0" + ], + [ + "18:19", + "14628.0" + ], + [ + "18:30", + "14142.0" + ], + [ + "18:40", + "14844.0" + ], + [ + "18:49", + "14862.0" + ], + [ + "19:00", + "14838.0" + ], + [ + "19:10", + "14886.0" + ], + [ + "19:19", + "15006.0" + ], + [ + "19:30", + "12102.0" + ], + [ + "19:40", + "12054.0" + ], + [ + "19:49", + "12732.0" + ], + [ + "20:00", + "12090.0" + ], + [ + "20:10", + "12036.0" + ], + [ + "20:19", + "12096.0" + ], + [ + "20:30", + "9792.0" + ], + [ + "20:40", + "10584.0" + ], + [ + "20:49", + "10536.0" + ], + [ + "21:00", + "10242.0" + ], + [ + "21:10", + "11400.0" + ], + [ + "21:19", + "10530.0" + ], + [ + "21:30", + "6924.0" + ], + [ + "21:40", + "6780.0" + ], + [ + "21:49", + "6570.0" + ], + [ + "22:00", + "5808.0" + ], + [ + "22:10", + "6840.0" + ], + [ + "22:19", + "6264.0" + ], + [ + "22:30", + "4332.0" + ], + [ + "22:40", + "3852.0" + ], + [ + "22:49", + "4008.0" + ], + [ + "23:00", + "4794.0" + ], + [ + "23:10", + "4512.0" + ], + [ + "23:19", + "4380.0" + ], + [ + "23:30", + "3366.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1308.0" + ], + [ + "00:10", + "1134.0" + ], + [ + "00:19", + "1122.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "570.0" + ], + [ + "01:19", + "618.0" + ], + [ + "01:30", + "606.0" + ], + [ + "01:40", + "408.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "474.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 450, + 480, + 498, + 576, + 1014, + 1302, + 1296, + 2016, + 1644, + 2028, + 3042, + 3402, + 3744, + 8136, + 8430, + 8478, + 12432, + 12216, + 12546, + 14910, + 14982, + 14856, + 14022, + 13818, + 14448, + 13050, + 12876, + 13326, + 12780, + 13242, + 12834, + 15090, + 15396, + 15480, + 15306, + 15174, + 14628, + 16152, + 16536, + 16584, + 14514, + 12984, + 13344, + 10836, + 10410, + 10752, + 7770, + 7818, + 8202, + 7902, + 8166, + 7788, + 8634, + 8412, + 8832, + 8892, + 9390, + 9312, + 10572, + 10848, + 10578, + 12906, + 13248, + 13338, + 16362, + 16206, + 17142, + 16152, + 15510, + 15978, + 18336, + 18156, + 18168, + 14376, + 14388, + 14310, + 15294, + 15126, + 15882, + 16320, + 15726, + 15798, + 14802, + 14646, + 14628, + 14142, + 14844, + 14862, + 14838, + 14886, + 15006, + 12102, + 12054, + 12732, + 12090, + 12036, + 12096, + 9792, + 10584, + 10536, + 10242, + 11400, + 10530, + 6924, + 6780, + 6570, + 5808, + 6840, + 6264, + 4332, + 3852, + 4008, + 4794, + 4512, + 4380, + 3366, + 3222, + 3348, + 1308, + 1134, + 1122, + 666, + 720, + 702, + 510, + 570, + 618, + 606, + 408, + 528, + 474, + 342, + 426, + 384, + 396, + 390, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "180.0" + ], + [ + "03:04", + "420.0" + ], + [ + "03:10", + "264.0" + ], + [ + "03:15", + "264.0" + ], + [ + "03:19", + "144.0" + ], + [ + "03:25", + "288.0" + ], + [ + "03:30", + "264.0" + ], + [ + "03:34", + "300.0" + ], + [ + "03:40", + "384.0" + ], + [ + "03:45", + "252.0" + ], + [ + "03:49", + "396.0" + ], + [ + "03:55", + "264.0" + ], + [ + "04:00", + "288.0" + ], + [ + "04:04", + "396.0" + ], + [ + "04:10", + "420.0" + ], + [ + "04:15", + "420.0" + ], + [ + "04:19", + "360.0" + ], + [ + "04:25", + "480.0" + ], + [ + "04:30", + "492.0" + ], + [ + "04:34", + "444.0" + ], + [ + "04:40", + "432.0" + ], + [ + "04:45", + "540.0" + ], + [ + "04:49", + "588.0" + ], + [ + "04:55", + "528.0" + ], + [ + "05:00", + "924.0" + ], + [ + "05:04", + "984.0" + ], + [ + "05:10", + "1296.0" + ], + [ + "05:15", + "1236.0" + ], + [ + "05:19", + "1188.0" + ], + [ + "05:25", + "1272.0" + ], + [ + "05:30", + "1668.0" + ], + [ + "05:34", + "2436.0" + ], + [ + "05:40", + "1608.0" + ], + [ + "05:45", + "1428.0" + ], + [ + "05:49", + "2208.0" + ], + [ + "05:55", + "1896.0" + ], + [ + "06:00", + "2928.0" + ], + [ + "06:04", + "2772.0" + ], + [ + "06:10", + "3612.0" + ], + [ + "06:15", + "3420.0" + ], + [ + "06:19", + "3420.0" + ], + [ + "06:25", + "4200.0" + ], + [ + "06:30", + "7404.0" + ], + [ + "06:34", + "7812.0" + ], + [ + "06:40", + "8604.0" + ], + [ + "06:45", + "8844.0" + ], + [ + "06:49", + "8076.0" + ], + [ + "06:55", + "8328.0" + ], + [ + "07:00", + "12192.0" + ], + [ + "07:04", + "12204.0" + ], + [ + "07:10", + "12408.0" + ], + [ + "07:15", + "11844.0" + ], + [ + "07:19", + "12276.0" + ], + [ + "07:25", + "12276.0" + ], + [ + "07:30", + "14724.0" + ], + [ + "07:34", + "15432.0" + ], + [ + "07:40", + "14856.0" + ], + [ + "07:45", + "14916.0" + ], + [ + "07:49", + "14892.0" + ], + [ + "07:55", + "14904.0" + ], + [ + "08:00", + "14076.0" + ], + [ + "08:04", + "14028.0" + ], + [ + "08:10", + "13884.0" + ], + [ + "08:15", + "14376.0" + ], + [ + "08:19", + "13860.0" + ], + [ + "08:25", + "13944.0" + ], + [ + "08:30", + "13584.0" + ], + [ + "08:34", + "13296.0" + ], + [ + "08:40", + "12816.0" + ], + [ + "08:45", + "12396.0" + ], + [ + "08:49", + "13764.0" + ], + [ + "08:55", + "13056.0" + ], + [ + "09:00", + "12828.0" + ], + [ + "09:04", + "12636.0" + ], + [ + "09:10", + "13116.0" + ], + [ + "09:15", + "13308.0" + ], + [ + "09:19", + "12564.0" + ], + [ + "09:25", + "12360.0" + ], + [ + "09:30", + "15084.0" + ], + [ + "09:34", + "15576.0" + ], + [ + "09:40", + "14796.0" + ], + [ + "09:45", + "15300.0" + ], + [ + "09:49", + "16104.0" + ], + [ + "09:55", + "14772.0" + ], + [ + "10:00", + "15876.0" + ], + [ + "10:04", + "14928.0" + ], + [ + "10:10", + "15336.0" + ], + [ + "10:15", + "14748.0" + ], + [ + "10:19", + "14904.0" + ], + [ + "10:25", + "14364.0" + ], + [ + "10:30", + "15852.0" + ], + [ + "10:34", + "15972.0" + ], + [ + "10:40", + "16572.0" + ], + [ + "10:45", + "16140.0" + ], + [ + "10:49", + "17100.0" + ], + [ + "10:55", + "16548.0" + ], + [ + "11:00", + "15264.0" + ], + [ + "11:04", + "14544.0" + ], + [ + "11:10", + "14028.0" + ], + [ + "11:15", + "12684.0" + ], + [ + "11:19", + "13392.0" + ], + [ + "11:25", + "13164.0" + ], + [ + "11:30", + "11352.0" + ], + [ + "11:34", + "10776.0" + ], + [ + "11:40", + "10812.0" + ], + [ + "11:45", + "10200.0" + ], + [ + "11:49", + "10236.0" + ], + [ + "11:55", + "11028.0" + ], + [ + "12:00", + "7752.0" + ], + [ + "12:04", + "8256.0" + ], + [ + "12:10", + "7800.0" + ], + [ + "12:15", + "7860.0" + ], + [ + "12:19", + "8232.0" + ], + [ + "12:25", + "7860.0" + ], + [ + "12:30", + "8220.0" + ], + [ + "12:34", + "8052.0" + ], + [ + "12:40", + "7908.0" + ], + [ + "12:45", + "8148.0" + ], + [ + "12:49", + "7848.0" + ], + [ + "12:55", + "7896.0" + ], + [ + "13:00", + "8544.0" + ], + [ + "13:04", + "8256.0" + ], + [ + "13:10", + "9084.0" + ], + [ + "13:15", + "8016.0" + ], + [ + "13:19", + "9180.0" + ], + [ + "13:25", + "8340.0" + ], + [ + "13:30", + "9228.0" + ], + [ + "13:34", + "8688.0" + ], + [ + "13:40", + "9444.0" + ], + [ + "13:45", + "9456.0" + ], + [ + "13:49", + "8640.0" + ], + [ + "13:55", + "9300.0" + ], + [ + "14:00", + "10596.0" + ], + [ + "14:04", + "10080.0" + ], + [ + "14:10", + "10932.0" + ], + [ + "14:15", + "11352.0" + ], + [ + "14:19", + "10728.0" + ], + [ + "14:25", + "10332.0" + ], + [ + "14:30", + "12912.0" + ], + [ + "14:34", + "12576.0" + ], + [ + "14:40", + "13116.0" + ], + [ + "14:45", + "13296.0" + ], + [ + "14:49", + "13668.0" + ], + [ + "14:55", + "13152.0" + ], + [ + "15:00", + "15348.0" + ], + [ + "15:04", + "16344.0" + ], + [ + "15:10", + "16128.0" + ], + [ + "15:15", + "16008.0" + ], + [ + "15:19", + "17652.0" + ], + [ + "15:25", + "16548.0" + ], + [ + "15:30", + "17256.0" + ], + [ + "15:34", + "15396.0" + ], + [ + "15:40", + "15444.0" + ], + [ + "15:45", + "15960.0" + ], + [ + "15:49", + "15588.0" + ], + [ + "15:55", + "15804.0" + ], + [ + "16:00", + "18324.0" + ], + [ + "16:04", + "17688.0" + ], + [ + "16:10", + "17856.0" + ], + [ + "16:15", + "18408.0" + ], + [ + "16:19", + "18816.0" + ], + [ + "16:25", + "17688.0" + ], + [ + "16:30", + "15216.0" + ], + [ + "16:34", + "14952.0" + ], + [ + "16:40", + "14352.0" + ], + [ + "16:45", + "14520.0" + ], + [ + "16:49", + "13968.0" + ], + [ + "16:55", + "14136.0" + ], + [ + "17:00", + "14340.0" + ], + [ + "17:04", + "15096.0" + ], + [ + "17:10", + "15180.0" + ], + [ + "17:15", + "15072.0" + ], + [ + "17:19", + "16668.0" + ], + [ + "17:25", + "15852.0" + ], + [ + "17:30", + "16224.0" + ], + [ + "17:34", + "15792.0" + ], + [ + "17:40", + "15540.0" + ], + [ + "17:45", + "15852.0" + ], + [ + "17:49", + "16476.0" + ], + [ + "17:55", + "15384.0" + ], + [ + "18:00", + "14952.0" + ], + [ + "18:04", + "14904.0" + ], + [ + "18:10", + "14388.0" + ], + [ + "18:15", + "14952.0" + ], + [ + "18:19", + "14448.0" + ], + [ + "18:25", + "14520.0" + ], + [ + "18:30", + "13464.0" + ], + [ + "18:34", + "14832.0" + ], + [ + "18:40", + "14688.0" + ], + [ + "18:45", + "14904.0" + ], + [ + "18:49", + "14616.0" + ], + [ + "18:55", + "15024.0" + ], + [ + "19:00", + "15096.0" + ], + [ + "19:04", + "14676.0" + ], + [ + "19:10", + "14688.0" + ], + [ + "19:15", + "14712.0" + ], + [ + "19:19", + "14868.0" + ], + [ + "19:25", + "15060.0" + ], + [ + "19:30", + "13248.0" + ], + [ + "19:34", + "11844.0" + ], + [ + "19:40", + "11964.0" + ], + [ + "19:45", + "12156.0" + ], + [ + "19:49", + "12192.0" + ], + [ + "19:55", + "12744.0" + ], + [ + "20:00", + "11964.0" + ], + [ + "20:04", + "12144.0" + ], + [ + "20:10", + "11976.0" + ], + [ + "20:15", + "12348.0" + ], + [ + "20:19", + "11520.0" + ], + [ + "20:25", + "11928.0" + ], + [ + "20:30", + "10212.0" + ], + [ + "20:34", + "10188.0" + ], + [ + "20:40", + "10884.0" + ], + [ + "20:45", + "10728.0" + ], + [ + "20:49", + "10140.0" + ], + [ + "20:55", + "10284.0" + ], + [ + "21:00", + "10860.0" + ], + [ + "21:04", + "9972.0" + ], + [ + "21:10", + "11148.0" + ], + [ + "21:15", + "11220.0" + ], + [ + "21:19", + "10620.0" + ], + [ + "21:25", + "10608.0" + ], + [ + "21:30", + "7212.0" + ], + [ + "21:34", + "6924.0" + ], + [ + "21:40", + "7128.0" + ], + [ + "21:45", + "6396.0" + ], + [ + "21:49", + "6360.0" + ], + [ + "21:55", + "6876.0" + ], + [ + "22:00", + "6012.0" + ], + [ + "22:04", + "6804.0" + ], + [ + "22:10", + "6324.0" + ], + [ + "22:15", + "6408.0" + ], + [ + "22:19", + "5928.0" + ], + [ + "22:25", + "6408.0" + ], + [ + "22:30", + "4644.0" + ], + [ + "22:34", + "3948.0" + ], + [ + "22:40", + "4416.0" + ], + [ + "22:45", + "3984.0" + ], + [ + "22:49", + "3972.0" + ], + [ + "22:55", + "4356.0" + ], + [ + "23:00", + "4584.0" + ], + [ + "23:04", + "4224.0" + ], + [ + "23:10", + "4932.0" + ], + [ + "23:15", + "4212.0" + ], + [ + "23:19", + "4164.0" + ], + [ + "23:25", + "4860.0" + ], + [ + "23:30", + "3504.0" + ], + [ + "23:34", + "3276.0" + ], + [ + "23:40", + "3276.0" + ], + [ + "23:45", + "3156.0" + ], + [ + "23:49", + "3180.0" + ], + [ + "23:55", + "3180.0" + ], + [ + "00:00", + "1920.0" + ], + [ + "00:04", + "1260.0" + ], + [ + "00:10", + "1236.0" + ], + [ + "00:15", + "1104.0" + ], + [ + "00:19", + "1116.0" + ], + [ + "00:25", + "1056.0" + ], + [ + "00:30", + "732.0" + ], + [ + "00:34", + "648.0" + ], + [ + "00:40", + "768.0" + ], + [ + "00:45", + "720.0" + ], + [ + "00:49", + "672.0" + ], + [ + "00:55", + "672.0" + ], + [ + "01:00", + "492.0" + ], + [ + "01:04", + "576.0" + ], + [ + "01:10", + "576.0" + ], + [ + "01:15", + "564.0" + ], + [ + "01:19", + "576.0" + ], + [ + "01:25", + "624.0" + ], + [ + "01:30", + "600.0" + ], + [ + "01:34", + "636.0" + ], + [ + "01:40", + "480.0" + ], + [ + "01:45", + "288.0" + ], + [ + "01:49", + "516.0" + ], + [ + "01:55", + "576.0" + ], + [ + "02:00", + "504.0" + ], + [ + "02:04", + "480.0" + ], + [ + "02:10", + "336.0" + ], + [ + "02:15", + "324.0" + ], + [ + "02:19", + "420.0" + ], + [ + "02:25", + "408.0" + ], + [ + "02:30", + "348.0" + ], + [ + "02:34", + "492.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:45", + "384.0" + ], + [ + "02:49", + "324.0" + ], + [ + "02:55", + "384.0" + ], + [ + "03:00", + "120.0" + ], + [ + "03:04", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25, + 23.333333333333332, + 23.416666666666668, + 23.5, + 23.583333333333332, + 23.666666666666668, + 23.75, + 23.833333333333332, + 23.916666666666668, + 24, + 24.083333333333332 + ], + "y": [ + 180, + 420, + 264, + 264, + 144, + 288, + 264, + 300, + 384, + 252, + 396, + 264, + 288, + 396, + 420, + 420, + 360, + 480, + 492, + 444, + 432, + 540, + 588, + 528, + 924, + 984, + 1296, + 1236, + 1188, + 1272, + 1668, + 2436, + 1608, + 1428, + 2208, + 1896, + 2928, + 2772, + 3612, + 3420, + 3420, + 4200, + 7404, + 7812, + 8604, + 8844, + 8076, + 8328, + 12192, + 12204, + 12408, + 11844, + 12276, + 12276, + 14724, + 15432, + 14856, + 14916, + 14892, + 14904, + 14076, + 14028, + 13884, + 14376, + 13860, + 13944, + 13584, + 13296, + 12816, + 12396, + 13764, + 13056, + 12828, + 12636, + 13116, + 13308, + 12564, + 12360, + 15084, + 15576, + 14796, + 15300, + 16104, + 14772, + 15876, + 14928, + 15336, + 14748, + 14904, + 14364, + 15852, + 15972, + 16572, + 16140, + 17100, + 16548, + 15264, + 14544, + 14028, + 12684, + 13392, + 13164, + 11352, + 10776, + 10812, + 10200, + 10236, + 11028, + 7752, + 8256, + 7800, + 7860, + 8232, + 7860, + 8220, + 8052, + 7908, + 8148, + 7848, + 7896, + 8544, + 8256, + 9084, + 8016, + 9180, + 8340, + 9228, + 8688, + 9444, + 9456, + 8640, + 9300, + 10596, + 10080, + 10932, + 11352, + 10728, + 10332, + 12912, + 12576, + 13116, + 13296, + 13668, + 13152, + 15348, + 16344, + 16128, + 16008, + 17652, + 16548, + 17256, + 15396, + 15444, + 15960, + 15588, + 15804, + 18324, + 17688, + 17856, + 18408, + 18816, + 17688, + 15216, + 14952, + 14352, + 14520, + 13968, + 14136, + 14340, + 15096, + 15180, + 15072, + 16668, + 15852, + 16224, + 15792, + 15540, + 15852, + 16476, + 15384, + 14952, + 14904, + 14388, + 14952, + 14448, + 14520, + 13464, + 14832, + 14688, + 14904, + 14616, + 15024, + 15096, + 14676, + 14688, + 14712, + 14868, + 15060, + 13248, + 11844, + 11964, + 12156, + 12192, + 12744, + 11964, + 12144, + 11976, + 12348, + 11520, + 11928, + 10212, + 10188, + 10884, + 10728, + 10140, + 10284, + 10860, + 9972, + 11148, + 11220, + 10620, + 10608, + 7212, + 6924, + 7128, + 6396, + 6360, + 6876, + 6012, + 6804, + 6324, + 6408, + 5928, + 6408, + 4644, + 3948, + 4416, + 3984, + 3972, + 4356, + 4584, + 4224, + 4932, + 4212, + 4164, + 4860, + 3504, + 3276, + 3276, + 3156, + 3180, + 3180, + 1920, + 1260, + 1236, + 1104, + 1116, + 1056, + 732, + 648, + 768, + 720, + 672, + 672, + 492, + 576, + 576, + 564, + 576, + 624, + 600, + 636, + 480, + 288, + 516, + 576, + 504, + 480, + 336, + 324, + 420, + 408, + 348, + 492, + 396, + 384, + 324, + 384, + 120, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "320.0" + ], + [ + "03:15", + "252.0" + ], + [ + "03:30", + "340.0" + ], + [ + "03:45", + "308.0" + ], + [ + "04:00", + "412.0" + ], + [ + "04:15", + "408.0" + ], + [ + "04:30", + "512.0" + ], + [ + "04:45", + "568.0" + ], + [ + "05:00", + "1236.0" + ], + [ + "05:15", + "1228.0" + ], + [ + "05:30", + "1988.0" + ], + [ + "05:45", + "1812.0" + ], + [ + "06:00", + "3504.0" + ], + [ + "06:15", + "3576.0" + ], + [ + "06:30", + "8184.0" + ], + [ + "06:45", + "8616.0" + ], + [ + "07:00", + "12176.0" + ], + [ + "07:15", + "12512.0" + ], + [ + "07:30", + "15080.0" + ], + [ + "07:45", + "14660.0" + ], + [ + "08:00", + "14060.0" + ], + [ + "08:15", + "14132.0" + ], + [ + "08:30", + "13020.0" + ], + [ + "08:45", + "13156.0" + ], + [ + "09:00", + "12936.0" + ], + [ + "09:15", + "13064.0" + ], + [ + "09:30", + "15560.0" + ], + [ + "09:45", + "15548.0" + ], + [ + "10:00", + "14968.0" + ], + [ + "10:15", + "14816.0" + ], + [ + "10:30", + "16488.0" + ], + [ + "10:45", + "16656.0" + ], + [ + "11:00", + "13756.0" + ], + [ + "11:15", + "13056.0" + ], + [ + "11:30", + "10696.0" + ], + [ + "11:45", + "10560.0" + ], + [ + "12:00", + "7696.0" + ], + [ + "12:15", + "8132.0" + ], + [ + "12:30", + "8100.0" + ], + [ + "12:45", + "8112.0" + ], + [ + "13:00", + "8480.0" + ], + [ + "13:15", + "8616.0" + ], + [ + "13:30", + "9380.0" + ], + [ + "13:45", + "9184.0" + ], + [ + "14:00", + "10784.0" + ], + [ + "14:15", + "10500.0" + ], + [ + "14:30", + "13184.0" + ], + [ + "14:45", + "13232.0" + ], + [ + "15:00", + "16460.0" + ], + [ + "15:15", + "16840.0" + ], + [ + "15:30", + "15640.0" + ], + [ + "15:45", + "16036.0" + ], + [ + "16:00", + "18216.0" + ], + [ + "16:15", + "18460.0" + ], + [ + "16:30", + "14060.0" + ], + [ + "16:45", + "14248.0" + ], + [ + "17:00", + "15712.0" + ], + [ + "17:15", + "15700.0" + ], + [ + "17:30", + "15856.0" + ], + [ + "17:45", + "15916.0" + ], + [ + "18:00", + "14464.0" + ], + [ + "18:15", + "14732.0" + ], + [ + "18:30", + "14292.0" + ], + [ + "18:45", + "15020.0" + ], + [ + "19:00", + "14928.0" + ], + [ + "19:15", + "15028.0" + ], + [ + "19:30", + "12008.0" + ], + [ + "19:45", + "12436.0" + ], + [ + "20:00", + "12228.0" + ], + [ + "20:15", + "11812.0" + ], + [ + "20:30", + "10260.0" + ], + [ + "20:45", + "10444.0" + ], + [ + "21:00", + "10800.0" + ], + [ + "21:15", + "10772.0" + ], + [ + "21:30", + "6836.0" + ], + [ + "21:45", + "6816.0" + ], + [ + "22:00", + "6080.0" + ], + [ + "22:15", + "6288.0" + ], + [ + "22:30", + "4180.0" + ], + [ + "22:45", + "4204.0" + ], + [ + "23:00", + "4504.0" + ], + [ + "23:15", + "4404.0" + ], + [ + "23:30", + "3204.0" + ], + [ + "23:45", + "3368.0" + ], + [ + "00:00", + "1100.0" + ], + [ + "00:15", + "1112.0" + ], + [ + "00:30", + "684.0" + ], + [ + "00:45", + "712.0" + ], + [ + "01:00", + "540.0" + ], + [ + "01:15", + "600.0" + ], + [ + "01:30", + "540.0" + ], + [ + "01:45", + "492.0" + ], + [ + "02:00", + "424.0" + ], + [ + "02:15", + "408.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:45", + "396.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25, + 23.5, + 23.75 + ], + "y": [ + 320, + 252, + 340, + 308, + 412, + 408, + 512, + 568, + 1236, + 1228, + 1988, + 1812, + 3504, + 3576, + 8184, + 8616, + 12176, + 12512, + 15080, + 14660, + 14060, + 14132, + 13020, + 13156, + 12936, + 13064, + 15560, + 15548, + 14968, + 14816, + 16488, + 16656, + 13756, + 13056, + 10696, + 10560, + 7696, + 8132, + 8100, + 8112, + 8480, + 8616, + 9380, + 9184, + 10784, + 10500, + 13184, + 13232, + 16460, + 16840, + 15640, + 16036, + 18216, + 18460, + 14060, + 14248, + 15712, + 15700, + 15856, + 15916, + 14464, + 14732, + 14292, + 15020, + 14928, + 15028, + 12008, + 12436, + 12228, + 11812, + 10260, + 10444, + 10800, + 10772, + 6836, + 6816, + 6080, + 6288, + 4180, + 4204, + 4504, + 4404, + 3204, + 3368, + 1100, + 1112, + 684, + 712, + 540, + 600, + 540, + 492, + 424, + 408, + 384, + 396 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Number of vehicle trips serviced (REAL) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Veh trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "450.0" + ], + [ + "04:30", + "480.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "576.0" + ], + [ + "05:00", + "1014.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3042.0" + ], + [ + "06:10", + "3402.0" + ], + [ + "06:19", + "3744.0" + ], + [ + "06:30", + "8136.0" + ], + [ + "06:40", + "8430.0" + ], + [ + "06:49", + "8478.0" + ], + [ + "07:00", + "12432.0" + ], + [ + "07:10", + "12216.0" + ], + [ + "07:19", + "12546.0" + ], + [ + "07:30", + "14910.0" + ], + [ + "07:40", + "14982.0" + ], + [ + "07:49", + "14856.0" + ], + [ + "08:00", + "14022.0" + ], + [ + "08:10", + "13818.0" + ], + [ + "08:19", + "14448.0" + ], + [ + "08:30", + "13050.0" + ], + [ + "08:40", + "12876.0" + ], + [ + "08:49", + "13326.0" + ], + [ + "09:00", + "12780.0" + ], + [ + "09:10", + "13242.0" + ], + [ + "09:19", + "12834.0" + ], + [ + "09:30", + "15090.0" + ], + [ + "09:40", + "15396.0" + ], + [ + "09:49", + "15480.0" + ], + [ + "10:00", + "15306.0" + ], + [ + "10:10", + "15174.0" + ], + [ + "10:19", + "14628.0" + ], + [ + "10:30", + "16152.0" + ], + [ + "10:40", + "16536.0" + ], + [ + "10:49", + "16584.0" + ], + [ + "11:00", + "14514.0" + ], + [ + "11:10", + "12984.0" + ], + [ + "11:19", + "13344.0" + ], + [ + "11:30", + "10836.0" + ], + [ + "11:40", + "10410.0" + ], + [ + "11:49", + "10752.0" + ], + [ + "12:00", + "7770.0" + ], + [ + "12:10", + "7818.0" + ], + [ + "12:19", + "8202.0" + ], + [ + "12:30", + "7902.0" + ], + [ + "12:40", + "8166.0" + ], + [ + "12:49", + "7788.0" + ], + [ + "13:00", + "8634.0" + ], + [ + "13:10", + "8412.0" + ], + [ + "13:19", + "8832.0" + ], + [ + "13:30", + "8892.0" + ], + [ + "13:40", + "9390.0" + ], + [ + "13:49", + "9312.0" + ], + [ + "14:00", + "10572.0" + ], + [ + "14:10", + "10848.0" + ], + [ + "14:19", + "10578.0" + ], + [ + "14:30", + "12906.0" + ], + [ + "14:40", + "13248.0" + ], + [ + "14:49", + "13338.0" + ], + [ + "15:00", + "16362.0" + ], + [ + "15:10", + "16206.0" + ], + [ + "15:19", + "17142.0" + ], + [ + "15:30", + "16152.0" + ], + [ + "15:40", + "15510.0" + ], + [ + "15:49", + "15978.0" + ], + [ + "16:00", + "18336.0" + ], + [ + "16:10", + "18156.0" + ], + [ + "16:19", + "18168.0" + ], + [ + "16:30", + "14376.0" + ], + [ + "16:40", + "14388.0" + ], + [ + "16:49", + "14310.0" + ], + [ + "17:00", + "15294.0" + ], + [ + "17:10", + "15126.0" + ], + [ + "17:19", + "15882.0" + ], + [ + "17:30", + "16320.0" + ], + [ + "17:40", + "15726.0" + ], + [ + "17:49", + "15798.0" + ], + [ + "18:00", + "14802.0" + ], + [ + "18:10", + "14646.0" + ], + [ + "18:19", + "14628.0" + ], + [ + "18:30", + "14142.0" + ], + [ + "18:40", + "14844.0" + ], + [ + "18:49", + "14862.0" + ], + [ + "19:00", + "14838.0" + ], + [ + "19:10", + "14886.0" + ], + [ + "19:19", + "15006.0" + ], + [ + "19:30", + "12102.0" + ], + [ + "19:40", + "12054.0" + ], + [ + "19:49", + "12732.0" + ], + [ + "20:00", + "12090.0" + ], + [ + "20:10", + "12036.0" + ], + [ + "20:19", + "12096.0" + ], + [ + "20:30", + "9792.0" + ], + [ + "20:40", + "10584.0" + ], + [ + "20:49", + "10536.0" + ], + [ + "21:00", + "10242.0" + ], + [ + "21:10", + "11400.0" + ], + [ + "21:19", + "10530.0" + ], + [ + "21:30", + "6924.0" + ], + [ + "21:40", + "6780.0" + ], + [ + "21:49", + "6570.0" + ], + [ + "22:00", + "5808.0" + ], + [ + "22:10", + "6840.0" + ], + [ + "22:19", + "6264.0" + ], + [ + "22:30", + "4332.0" + ], + [ + "22:40", + "3852.0" + ], + [ + "22:49", + "4008.0" + ], + [ + "23:00", + "4794.0" + ], + [ + "23:10", + "4512.0" + ], + [ + "23:19", + "4380.0" + ], + [ + "23:30", + "3366.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1308.0" + ], + [ + "00:10", + "1134.0" + ], + [ + "00:19", + "1122.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "570.0" + ], + [ + "01:19", + "618.0" + ], + [ + "01:30", + "606.0" + ], + [ + "01:40", + "408.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "474.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 450, + 480, + 498, + 576, + 1014, + 1302, + 1296, + 2016, + 1644, + 2028, + 3042, + 3402, + 3744, + 8136, + 8430, + 8478, + 12432, + 12216, + 12546, + 14910, + 14982, + 14856, + 14022, + 13818, + 14448, + 13050, + 12876, + 13326, + 12780, + 13242, + 12834, + 15090, + 15396, + 15480, + 15306, + 15174, + 14628, + 16152, + 16536, + 16584, + 14514, + 12984, + 13344, + 10836, + 10410, + 10752, + 7770, + 7818, + 8202, + 7902, + 8166, + 7788, + 8634, + 8412, + 8832, + 8892, + 9390, + 9312, + 10572, + 10848, + 10578, + 12906, + 13248, + 13338, + 16362, + 16206, + 17142, + 16152, + 15510, + 15978, + 18336, + 18156, + 18168, + 14376, + 14388, + 14310, + 15294, + 15126, + 15882, + 16320, + 15726, + 15798, + 14802, + 14646, + 14628, + 14142, + 14844, + 14862, + 14838, + 14886, + 15006, + 12102, + 12054, + 12732, + 12090, + 12036, + 12096, + 9792, + 10584, + 10536, + 10242, + 11400, + 10530, + 6924, + 6780, + 6570, + 5808, + 6840, + 6264, + 4332, + 3852, + 4008, + 4794, + 4512, + 4380, + 3366, + 3222, + 3348, + 1308, + 1134, + 1122, + 666, + 720, + 702, + 510, + 570, + 618, + 606, + 408, + 528, + 474, + 342, + 426, + 384, + 396, + 390, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "438.0" + ], + [ + "04:30", + "486.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "582.0" + ], + [ + "05:00", + "1008.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3012.0" + ], + [ + "06:10", + "3396.0" + ], + [ + "06:19", + "3774.0" + ], + [ + "06:30", + "8088.0" + ], + [ + "06:40", + "8388.0" + ], + [ + "06:49", + "8526.0" + ], + [ + "07:00", + "12366.0" + ], + [ + "07:10", + "12132.0" + ], + [ + "07:19", + "12396.0" + ], + [ + "07:30", + "14946.0" + ], + [ + "07:40", + "14796.0" + ], + [ + "07:49", + "14808.0" + ], + [ + "08:00", + "13968.0" + ], + [ + "08:10", + "13686.0" + ], + [ + "08:19", + "14418.0" + ], + [ + "08:30", + "12960.0" + ], + [ + "08:40", + "12864.0" + ], + [ + "08:49", + "13284.0" + ], + [ + "09:00", + "12756.0" + ], + [ + "09:10", + "13074.0" + ], + [ + "09:19", + "12852.0" + ], + [ + "09:30", + "14982.0" + ], + [ + "09:40", + "15444.0" + ], + [ + "09:49", + "15378.0" + ], + [ + "10:00", + "15348.0" + ], + [ + "10:10", + "15042.0" + ], + [ + "10:19", + "14526.0" + ], + [ + "10:30", + "16200.0" + ], + [ + "10:40", + "16512.0" + ], + [ + "10:49", + "16482.0" + ], + [ + "11:00", + "14460.0" + ], + [ + "11:10", + "12882.0" + ], + [ + "11:19", + "13356.0" + ], + [ + "11:30", + "10776.0" + ], + [ + "11:40", + "10338.0" + ], + [ + "11:49", + "10650.0" + ], + [ + "12:00", + "7782.0" + ], + [ + "12:10", + "7758.0" + ], + [ + "12:19", + "8124.0" + ], + [ + "12:30", + "7836.0" + ], + [ + "12:40", + "8124.0" + ], + [ + "12:49", + "7722.0" + ], + [ + "13:00", + "8592.0" + ], + [ + "13:10", + "8406.0" + ], + [ + "13:19", + "8700.0" + ], + [ + "13:30", + "8886.0" + ], + [ + "13:40", + "9378.0" + ], + [ + "13:49", + "9198.0" + ], + [ + "14:00", + "10542.0" + ], + [ + "14:10", + "10860.0" + ], + [ + "14:19", + "10452.0" + ], + [ + "14:30", + "12912.0" + ], + [ + "14:40", + "13146.0" + ], + [ + "14:49", + "13218.0" + ], + [ + "15:00", + "16368.0" + ], + [ + "15:10", + "16176.0" + ], + [ + "15:19", + "17058.0" + ], + [ + "15:30", + "16044.0" + ], + [ + "15:40", + "15492.0" + ], + [ + "15:49", + "15912.0" + ], + [ + "16:00", + "18228.0" + ], + [ + "16:10", + "18078.0" + ], + [ + "16:19", + "18024.0" + ], + [ + "16:30", + "14292.0" + ], + [ + "16:40", + "14364.0" + ], + [ + "16:49", + "14232.0" + ], + [ + "17:00", + "15192.0" + ], + [ + "17:10", + "15108.0" + ], + [ + "17:19", + "15684.0" + ], + [ + "17:30", + "16248.0" + ], + [ + "17:40", + "15792.0" + ], + [ + "17:49", + "15636.0" + ], + [ + "18:00", + "14832.0" + ], + [ + "18:10", + "14604.0" + ], + [ + "18:19", + "14586.0" + ], + [ + "18:30", + "14058.0" + ], + [ + "18:40", + "14904.0" + ], + [ + "18:49", + "14802.0" + ], + [ + "19:00", + "14820.0" + ], + [ + "19:10", + "14886.0" + ], + [ + "19:19", + "14970.0" + ], + [ + "19:30", + "11982.0" + ], + [ + "19:40", + "12078.0" + ], + [ + "19:49", + "12690.0" + ], + [ + "20:00", + "12090.0" + ], + [ + "20:10", + "11964.0" + ], + [ + "20:19", + "12132.0" + ], + [ + "20:30", + "9804.0" + ], + [ + "20:40", + "10632.0" + ], + [ + "20:49", + "10464.0" + ], + [ + "21:00", + "10242.0" + ], + [ + "21:10", + "11334.0" + ], + [ + "21:19", + "10632.0" + ], + [ + "21:30", + "6834.0" + ], + [ + "21:40", + "6756.0" + ], + [ + "21:49", + "6558.0" + ], + [ + "22:00", + "5742.0" + ], + [ + "22:10", + "6870.0" + ], + [ + "22:19", + "6330.0" + ], + [ + "22:30", + "4266.0" + ], + [ + "22:40", + "3912.0" + ], + [ + "22:49", + "3942.0" + ], + [ + "23:00", + "4818.0" + ], + [ + "23:10", + "4464.0" + ], + [ + "23:19", + "4434.0" + ], + [ + "23:30", + "3372.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1308.0" + ], + [ + "00:10", + "1140.0" + ], + [ + "00:19", + "1116.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "576.0" + ], + [ + "01:19", + "624.0" + ], + [ + "01:30", + "582.0" + ], + [ + "01:40", + "420.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "468.0" + ], + [ + "02:10", + "348.0" + ], + [ + "02:19", + "414.0" + ], + [ + "02:30", + "396.0" + ], + [ + "02:40", + "402.0" + ], + [ + "02:49", + "378.0" + ], + [ + "03:00", + "30.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 438, + 486, + 498, + 582, + 1008, + 1302, + 1296, + 2016, + 1644, + 2028, + 3012, + 3396, + 3774, + 8088, + 8388, + 8526, + 12366, + 12132, + 12396, + 14946, + 14796, + 14808, + 13968, + 13686, + 14418, + 12960, + 12864, + 13284, + 12756, + 13074, + 12852, + 14982, + 15444, + 15378, + 15348, + 15042, + 14526, + 16200, + 16512, + 16482, + 14460, + 12882, + 13356, + 10776, + 10338, + 10650, + 7782, + 7758, + 8124, + 7836, + 8124, + 7722, + 8592, + 8406, + 8700, + 8886, + 9378, + 9198, + 10542, + 10860, + 10452, + 12912, + 13146, + 13218, + 16368, + 16176, + 17058, + 16044, + 15492, + 15912, + 18228, + 18078, + 18024, + 14292, + 14364, + 14232, + 15192, + 15108, + 15684, + 16248, + 15792, + 15636, + 14832, + 14604, + 14586, + 14058, + 14904, + 14802, + 14820, + 14886, + 14970, + 11982, + 12078, + 12690, + 12090, + 11964, + 12132, + 9804, + 10632, + 10464, + 10242, + 11334, + 10632, + 6834, + 6756, + 6558, + 5742, + 6870, + 6330, + 4266, + 3912, + 3942, + 4818, + 4464, + 4434, + 3372, + 3222, + 3348, + 1308, + 1140, + 1116, + 666, + 720, + 702, + 510, + 576, + 624, + 582, + 420, + 528, + 468, + 348, + 414, + 396, + 402, + 378, + 30 + ] + }, + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "438.0" + ], + [ + "04:30", + "486.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "582.0" + ], + [ + "05:00", + "1008.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3012.0" + ], + [ + "06:10", + "3396.0" + ], + [ + "06:19", + "3780.0" + ], + [ + "06:30", + "8076.0" + ], + [ + "06:40", + "8406.0" + ], + [ + "06:49", + "8538.0" + ], + [ + "07:00", + "12378.0" + ], + [ + "07:10", + "12156.0" + ], + [ + "07:19", + "12432.0" + ], + [ + "07:30", + "14928.0" + ], + [ + "07:40", + "14844.0" + ], + [ + "07:49", + "14958.0" + ], + [ + "08:00", + "13944.0" + ], + [ + "08:10", + "13752.0" + ], + [ + "08:19", + "14400.0" + ], + [ + "08:30", + "13020.0" + ], + [ + "08:40", + "12894.0" + ], + [ + "08:49", + "13272.0" + ], + [ + "09:00", + "12756.0" + ], + [ + "09:10", + "13146.0" + ], + [ + "09:19", + "12858.0" + ], + [ + "09:30", + "15000.0" + ], + [ + "09:40", + "15450.0" + ], + [ + "09:49", + "15372.0" + ], + [ + "10:00", + "15348.0" + ], + [ + "10:10", + "15156.0" + ], + [ + "10:19", + "14538.0" + ], + [ + "10:30", + "16218.0" + ], + [ + "10:40", + "16440.0" + ], + [ + "10:49", + "16566.0" + ], + [ + "11:00", + "14532.0" + ], + [ + "11:10", + "12888.0" + ], + [ + "11:19", + "13362.0" + ], + [ + "11:30", + "10806.0" + ], + [ + "11:40", + "10350.0" + ], + [ + "11:49", + "10710.0" + ], + [ + "12:00", + "7764.0" + ], + [ + "12:10", + "7776.0" + ], + [ + "12:19", + "8154.0" + ], + [ + "12:30", + "7872.0" + ], + [ + "12:40", + "8142.0" + ], + [ + "12:49", + "7734.0" + ], + [ + "13:00", + "8634.0" + ], + [ + "13:10", + "8406.0" + ], + [ + "13:19", + "8772.0" + ], + [ + "13:30", + "8904.0" + ], + [ + "13:40", + "9414.0" + ], + [ + "13:49", + "9234.0" + ], + [ + "14:00", + "10536.0" + ], + [ + "14:10", + "10842.0" + ], + [ + "14:19", + "10512.0" + ], + [ + "14:30", + "12900.0" + ], + [ + "14:40", + "13230.0" + ], + [ + "14:49", + "13272.0" + ], + [ + "15:00", + "16326.0" + ], + [ + "15:10", + "16158.0" + ], + [ + "15:19", + "17046.0" + ], + [ + "15:30", + "16176.0" + ], + [ + "15:40", + "15486.0" + ], + [ + "15:49", + "15894.0" + ], + [ + "16:00", + "18330.0" + ], + [ + "16:10", + "18126.0" + ], + [ + "16:19", + "18036.0" + ], + [ + "16:30", + "14382.0" + ], + [ + "16:40", + "14364.0" + ], + [ + "16:49", + "14274.0" + ], + [ + "17:00", + "15168.0" + ], + [ + "17:10", + "15168.0" + ], + [ + "17:19", + "15786.0" + ], + [ + "17:30", + "16320.0" + ], + [ + "17:40", + "15690.0" + ], + [ + "17:49", + "15786.0" + ], + [ + "18:00", + "14736.0" + ], + [ + "18:10", + "14652.0" + ], + [ + "18:19", + "14598.0" + ], + [ + "18:30", + "14070.0" + ], + [ + "18:40", + "14880.0" + ], + [ + "18:49", + "14778.0" + ], + [ + "19:00", + "14874.0" + ], + [ + "19:10", + "14934.0" + ], + [ + "19:19", + "14934.0" + ], + [ + "19:30", + "12000.0" + ], + [ + "19:40", + "12114.0" + ], + [ + "19:49", + "12762.0" + ], + [ + "20:00", + "12042.0" + ], + [ + "20:10", + "11928.0" + ], + [ + "20:19", + "12204.0" + ], + [ + "20:30", + "9768.0" + ], + [ + "20:40", + "10560.0" + ], + [ + "20:49", + "10506.0" + ], + [ + "21:00", + "10266.0" + ], + [ + "21:10", + "11292.0" + ], + [ + "21:19", + "10686.0" + ], + [ + "21:30", + "6834.0" + ], + [ + "21:40", + "6750.0" + ], + [ + "21:49", + "6600.0" + ], + [ + "22:00", + "5640.0" + ], + [ + "22:10", + "6948.0" + ], + [ + "22:19", + "6306.0" + ], + [ + "22:30", + "4314.0" + ], + [ + "22:40", + "3852.0" + ], + [ + "22:49", + "3996.0" + ], + [ + "23:00", + "4782.0" + ], + [ + "23:10", + "4542.0" + ], + [ + "23:19", + "4374.0" + ], + [ + "23:30", + "3378.0" + ], + [ + "23:40", + "3210.0" + ], + [ + "23:49", + "3360.0" + ], + [ + "00:00", + "1302.0" + ], + [ + "00:10", + "1140.0" + ], + [ + "00:19", + "1110.0" + ], + [ + "00:30", + "672.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "576.0" + ], + [ + "01:19", + "624.0" + ], + [ + "01:30", + "594.0" + ], + [ + "01:40", + "408.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "474.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "432.0" + ], + [ + "02:30", + "378.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 438, + 486, + 498, + 582, + 1008, + 1302, + 1296, + 2016, + 1644, + 2028, + 3012, + 3396, + 3780, + 8076, + 8406, + 8538, + 12378, + 12156, + 12432, + 14928, + 14844, + 14958, + 13944, + 13752, + 14400, + 13020, + 12894, + 13272, + 12756, + 13146, + 12858, + 15000, + 15450, + 15372, + 15348, + 15156, + 14538, + 16218, + 16440, + 16566, + 14532, + 12888, + 13362, + 10806, + 10350, + 10710, + 7764, + 7776, + 8154, + 7872, + 8142, + 7734, + 8634, + 8406, + 8772, + 8904, + 9414, + 9234, + 10536, + 10842, + 10512, + 12900, + 13230, + 13272, + 16326, + 16158, + 17046, + 16176, + 15486, + 15894, + 18330, + 18126, + 18036, + 14382, + 14364, + 14274, + 15168, + 15168, + 15786, + 16320, + 15690, + 15786, + 14736, + 14652, + 14598, + 14070, + 14880, + 14778, + 14874, + 14934, + 14934, + 12000, + 12114, + 12762, + 12042, + 11928, + 12204, + 9768, + 10560, + 10506, + 10266, + 11292, + 10686, + 6834, + 6750, + 6600, + 5640, + 6948, + 6306, + 4314, + 3852, + 3996, + 4782, + 4542, + 4374, + 3378, + 3210, + 3360, + 1302, + 1140, + 1110, + 672, + 720, + 702, + 510, + 576, + 624, + 594, + 408, + 528, + 474, + 342, + 432, + 378, + 396, + 390, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "450.0" + ], + [ + "04:30", + "480.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "576.0" + ], + [ + "05:00", + "1014.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3048.0" + ], + [ + "06:10", + "3414.0" + ], + [ + "06:19", + "3762.0" + ], + [ + "06:30", + "8118.0" + ], + [ + "06:40", + "8448.0" + ], + [ + "06:49", + "8442.0" + ], + [ + "07:00", + "12486.0" + ], + [ + "07:10", + "12156.0" + ], + [ + "07:19", + "12642.0" + ], + [ + "07:30", + "14940.0" + ], + [ + "07:40", + "15012.0" + ], + [ + "07:49", + "14850.0" + ], + [ + "08:00", + "14070.0" + ], + [ + "08:10", + "13776.0" + ], + [ + "08:19", + "14466.0" + ], + [ + "08:30", + "13038.0" + ], + [ + "08:40", + "12924.0" + ], + [ + "08:49", + "13344.0" + ], + [ + "09:00", + "12834.0" + ], + [ + "09:10", + "13212.0" + ], + [ + "09:19", + "12864.0" + ], + [ + "09:30", + "15048.0" + ], + [ + "09:40", + "15456.0" + ], + [ + "09:49", + "15414.0" + ], + [ + "10:00", + "15390.0" + ], + [ + "10:10", + "15180.0" + ], + [ + "10:19", + "14610.0" + ], + [ + "10:30", + "16158.0" + ], + [ + "10:40", + "16644.0" + ], + [ + "10:49", + "16554.0" + ], + [ + "11:00", + "14568.0" + ], + [ + "11:10", + "12966.0" + ], + [ + "11:19", + "13374.0" + ], + [ + "11:30", + "10872.0" + ], + [ + "11:40", + "10404.0" + ], + [ + "11:49", + "10752.0" + ], + [ + "12:00", + "7794.0" + ], + [ + "12:10", + "7848.0" + ], + [ + "12:19", + "8196.0" + ], + [ + "12:30", + "7926.0" + ], + [ + "12:40", + "8190.0" + ], + [ + "12:49", + "7800.0" + ], + [ + "13:00", + "8640.0" + ], + [ + "13:10", + "8412.0" + ], + [ + "13:19", + "8844.0" + ], + [ + "13:30", + "8940.0" + ], + [ + "13:40", + "9372.0" + ], + [ + "13:49", + "9306.0" + ], + [ + "14:00", + "10590.0" + ], + [ + "14:10", + "10860.0" + ], + [ + "14:19", + "10590.0" + ], + [ + "14:30", + "12954.0" + ], + [ + "14:40", + "13266.0" + ], + [ + "14:49", + "13392.0" + ], + [ + "15:00", + "16362.0" + ], + [ + "15:10", + "16242.0" + ], + [ + "15:19", + "17064.0" + ], + [ + "15:30", + "16206.0" + ], + [ + "15:40", + "15540.0" + ], + [ + "15:49", + "16032.0" + ], + [ + "16:00", + "18372.0" + ], + [ + "16:10", + "18096.0" + ], + [ + "16:19", + "18168.0" + ], + [ + "16:30", + "14442.0" + ], + [ + "16:40", + "14400.0" + ], + [ + "16:49", + "14352.0" + ], + [ + "17:00", + "15360.0" + ], + [ + "17:10", + "15090.0" + ], + [ + "17:19", + "15864.0" + ], + [ + "17:30", + "16296.0" + ], + [ + "17:40", + "15774.0" + ], + [ + "17:49", + "15804.0" + ], + [ + "18:00", + "14826.0" + ], + [ + "18:10", + "14730.0" + ], + [ + "18:19", + "14580.0" + ], + [ + "18:30", + "14094.0" + ], + [ + "18:40", + "14994.0" + ], + [ + "18:49", + "14844.0" + ], + [ + "19:00", + "14880.0" + ], + [ + "19:10", + "14874.0" + ], + [ + "19:19", + "15012.0" + ], + [ + "19:30", + "12024.0" + ], + [ + "19:40", + "12078.0" + ], + [ + "19:49", + "12780.0" + ], + [ + "20:00", + "12108.0" + ], + [ + "20:10", + "11880.0" + ], + [ + "20:19", + "12282.0" + ], + [ + "20:30", + "9774.0" + ], + [ + "20:40", + "10638.0" + ], + [ + "20:49", + "10542.0" + ], + [ + "21:00", + "10254.0" + ], + [ + "21:10", + "11316.0" + ], + [ + "21:19", + "10608.0" + ], + [ + "21:30", + "6894.0" + ], + [ + "21:40", + "6762.0" + ], + [ + "21:49", + "6588.0" + ], + [ + "22:00", + "5760.0" + ], + [ + "22:10", + "6864.0" + ], + [ + "22:19", + "6318.0" + ], + [ + "22:30", + "4260.0" + ], + [ + "22:40", + "3882.0" + ], + [ + "22:49", + "3960.0" + ], + [ + "23:00", + "4860.0" + ], + [ + "23:10", + "4470.0" + ], + [ + "23:19", + "4422.0" + ], + [ + "23:30", + "3360.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1314.0" + ], + [ + "00:10", + "1140.0" + ], + [ + "00:19", + "1116.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "576.0" + ], + [ + "01:19", + "618.0" + ], + [ + "01:30", + "594.0" + ], + [ + "01:40", + "414.0" + ], + [ + "01:49", + "522.0" + ], + [ + "02:00", + "480.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:40", + "402.0" + ], + [ + "02:49", + "378.0" + ], + [ + "03:00", + "30.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 450, + 480, + 498, + 576, + 1014, + 1302, + 1296, + 2016, + 1644, + 2028, + 3048, + 3414, + 3762, + 8118, + 8448, + 8442, + 12486, + 12156, + 12642, + 14940, + 15012, + 14850, + 14070, + 13776, + 14466, + 13038, + 12924, + 13344, + 12834, + 13212, + 12864, + 15048, + 15456, + 15414, + 15390, + 15180, + 14610, + 16158, + 16644, + 16554, + 14568, + 12966, + 13374, + 10872, + 10404, + 10752, + 7794, + 7848, + 8196, + 7926, + 8190, + 7800, + 8640, + 8412, + 8844, + 8940, + 9372, + 9306, + 10590, + 10860, + 10590, + 12954, + 13266, + 13392, + 16362, + 16242, + 17064, + 16206, + 15540, + 16032, + 18372, + 18096, + 18168, + 14442, + 14400, + 14352, + 15360, + 15090, + 15864, + 16296, + 15774, + 15804, + 14826, + 14730, + 14580, + 14094, + 14994, + 14844, + 14880, + 14874, + 15012, + 12024, + 12078, + 12780, + 12108, + 11880, + 12282, + 9774, + 10638, + 10542, + 10254, + 11316, + 10608, + 6894, + 6762, + 6588, + 5760, + 6864, + 6318, + 4260, + 3882, + 3960, + 4860, + 4470, + 4422, + 3360, + 3222, + 3348, + 1314, + 1140, + 1116, + 666, + 720, + 702, + 510, + 576, + 618, + 594, + 414, + 522, + 480, + 342, + 426, + 384, + 402, + 378, + 30 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Number of vehicle trips serviced (REAL) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Veh trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "450.0" + ], + [ + "04:30", + "480.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "576.0" + ], + [ + "05:00", + "1014.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3042.0" + ], + [ + "06:10", + "3402.0" + ], + [ + "06:19", + "3744.0" + ], + [ + "06:30", + "8136.0" + ], + [ + "06:40", + "8430.0" + ], + [ + "06:49", + "8478.0" + ], + [ + "07:00", + "12432.0" + ], + [ + "07:10", + "12216.0" + ], + [ + "07:19", + "12546.0" + ], + [ + "07:30", + "14910.0" + ], + [ + "07:40", + "14982.0" + ], + [ + "07:49", + "14856.0" + ], + [ + "08:00", + "14022.0" + ], + [ + "08:10", + "13818.0" + ], + [ + "08:19", + "14448.0" + ], + [ + "08:30", + "13050.0" + ], + [ + "08:40", + "12876.0" + ], + [ + "08:49", + "13326.0" + ], + [ + "09:00", + "12780.0" + ], + [ + "09:10", + "13242.0" + ], + [ + "09:19", + "12834.0" + ], + [ + "09:30", + "15090.0" + ], + [ + "09:40", + "15396.0" + ], + [ + "09:49", + "15480.0" + ], + [ + "10:00", + "15306.0" + ], + [ + "10:10", + "15174.0" + ], + [ + "10:19", + "14628.0" + ], + [ + "10:30", + "16152.0" + ], + [ + "10:40", + "16536.0" + ], + [ + "10:49", + "16584.0" + ], + [ + "11:00", + "14514.0" + ], + [ + "11:10", + "12984.0" + ], + [ + "11:19", + "13344.0" + ], + [ + "11:30", + "10836.0" + ], + [ + "11:40", + "10410.0" + ], + [ + "11:49", + "10752.0" + ], + [ + "12:00", + "7770.0" + ], + [ + "12:10", + "7818.0" + ], + [ + "12:19", + "8202.0" + ], + [ + "12:30", + "7902.0" + ], + [ + "12:40", + "8166.0" + ], + [ + "12:49", + "7788.0" + ], + [ + "13:00", + "8634.0" + ], + [ + "13:10", + "8412.0" + ], + [ + "13:19", + "8832.0" + ], + [ + "13:30", + "8892.0" + ], + [ + "13:40", + "9390.0" + ], + [ + "13:49", + "9312.0" + ], + [ + "14:00", + "10572.0" + ], + [ + "14:10", + "10848.0" + ], + [ + "14:19", + "10578.0" + ], + [ + "14:30", + "12906.0" + ], + [ + "14:40", + "13248.0" + ], + [ + "14:49", + "13338.0" + ], + [ + "15:00", + "16362.0" + ], + [ + "15:10", + "16206.0" + ], + [ + "15:19", + "17142.0" + ], + [ + "15:30", + "16152.0" + ], + [ + "15:40", + "15510.0" + ], + [ + "15:49", + "15978.0" + ], + [ + "16:00", + "18336.0" + ], + [ + "16:10", + "18156.0" + ], + [ + "16:19", + "18168.0" + ], + [ + "16:30", + "14376.0" + ], + [ + "16:40", + "14388.0" + ], + [ + "16:49", + "14310.0" + ], + [ + "17:00", + "15294.0" + ], + [ + "17:10", + "15126.0" + ], + [ + "17:19", + "15882.0" + ], + [ + "17:30", + "16320.0" + ], + [ + "17:40", + "15726.0" + ], + [ + "17:49", + "15798.0" + ], + [ + "18:00", + "14802.0" + ], + [ + "18:10", + "14646.0" + ], + [ + "18:19", + "14628.0" + ], + [ + "18:30", + "14142.0" + ], + [ + "18:40", + "14844.0" + ], + [ + "18:49", + "14862.0" + ], + [ + "19:00", + "14838.0" + ], + [ + "19:10", + "14886.0" + ], + [ + "19:19", + "15006.0" + ], + [ + "19:30", + "12102.0" + ], + [ + "19:40", + "12054.0" + ], + [ + "19:49", + "12732.0" + ], + [ + "20:00", + "12090.0" + ], + [ + "20:10", + "12036.0" + ], + [ + "20:19", + "12096.0" + ], + [ + "20:30", + "9792.0" + ], + [ + "20:40", + "10584.0" + ], + [ + "20:49", + "10536.0" + ], + [ + "21:00", + "10242.0" + ], + [ + "21:10", + "11400.0" + ], + [ + "21:19", + "10530.0" + ], + [ + "21:30", + "6924.0" + ], + [ + "21:40", + "6780.0" + ], + [ + "21:49", + "6570.0" + ], + [ + "22:00", + "5808.0" + ], + [ + "22:10", + "6840.0" + ], + [ + "22:19", + "6264.0" + ], + [ + "22:30", + "4332.0" + ], + [ + "22:40", + "3852.0" + ], + [ + "22:49", + "4008.0" + ], + [ + "23:00", + "4794.0" + ], + [ + "23:10", + "4512.0" + ], + [ + "23:19", + "4380.0" + ], + [ + "23:30", + "3366.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1308.0" + ], + [ + "00:10", + "1134.0" + ], + [ + "00:19", + "1122.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "570.0" + ], + [ + "01:19", + "618.0" + ], + [ + "01:30", + "606.0" + ], + [ + "01:40", + "408.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "474.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 450, + 480, + 498, + 576, + 1014, + 1302, + 1296, + 2016, + 1644, + 2028, + 3042, + 3402, + 3744, + 8136, + 8430, + 8478, + 12432, + 12216, + 12546, + 14910, + 14982, + 14856, + 14022, + 13818, + 14448, + 13050, + 12876, + 13326, + 12780, + 13242, + 12834, + 15090, + 15396, + 15480, + 15306, + 15174, + 14628, + 16152, + 16536, + 16584, + 14514, + 12984, + 13344, + 10836, + 10410, + 10752, + 7770, + 7818, + 8202, + 7902, + 8166, + 7788, + 8634, + 8412, + 8832, + 8892, + 9390, + 9312, + 10572, + 10848, + 10578, + 12906, + 13248, + 13338, + 16362, + 16206, + 17142, + 16152, + 15510, + 15978, + 18336, + 18156, + 18168, + 14376, + 14388, + 14310, + 15294, + 15126, + 15882, + 16320, + 15726, + 15798, + 14802, + 14646, + 14628, + 14142, + 14844, + 14862, + 14838, + 14886, + 15006, + 12102, + 12054, + 12732, + 12090, + 12036, + 12096, + 9792, + 10584, + 10536, + 10242, + 11400, + 10530, + 6924, + 6780, + 6570, + 5808, + 6840, + 6264, + 4332, + 3852, + 4008, + 4794, + 4512, + 4380, + 3366, + 3222, + 3348, + 1308, + 1134, + 1122, + 666, + 720, + 702, + 510, + 570, + 618, + 606, + 408, + 528, + 474, + 342, + 426, + 384, + 396, + 390, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "264.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "246.0" + ], + [ + "03:30", + "252.0" + ], + [ + "03:40", + "330.0" + ], + [ + "03:49", + "348.0" + ], + [ + "04:00", + "396.0" + ], + [ + "04:10", + "378.0" + ], + [ + "04:19", + "372.0" + ], + [ + "04:30", + "576.0" + ], + [ + "04:40", + "480.0" + ], + [ + "04:49", + "546.0" + ], + [ + "05:00", + "1002.0" + ], + [ + "05:10", + "1140.0" + ], + [ + "05:19", + "1386.0" + ], + [ + "05:30", + "1800.0" + ], + [ + "05:40", + "1968.0" + ], + [ + "05:49", + "1824.0" + ], + [ + "06:00", + "3228.0" + ], + [ + "06:10", + "3426.0" + ], + [ + "06:19", + "3606.0" + ], + [ + "06:30", + "7902.0" + ], + [ + "06:40", + "8838.0" + ], + [ + "06:49", + "8106.0" + ], + [ + "07:00", + "12318.0" + ], + [ + "07:10", + "12198.0" + ], + [ + "07:19", + "12270.0" + ], + [ + "07:30", + "14184.0" + ], + [ + "07:40", + "14778.0" + ], + [ + "07:49", + "14622.0" + ], + [ + "08:00", + "14082.0" + ], + [ + "08:10", + "13260.0" + ], + [ + "08:19", + "14148.0" + ], + [ + "08:30", + "12612.0" + ], + [ + "08:40", + "12162.0" + ], + [ + "08:49", + "12468.0" + ], + [ + "09:00", + "11838.0" + ], + [ + "09:10", + "12126.0" + ], + [ + "09:19", + "12540.0" + ], + [ + "09:30", + "13926.0" + ], + [ + "09:40", + "14028.0" + ], + [ + "09:49", + "14448.0" + ], + [ + "10:00", + "13272.0" + ], + [ + "10:10", + "13386.0" + ], + [ + "10:19", + "13764.0" + ], + [ + "10:30", + "14964.0" + ], + [ + "10:40", + "15216.0" + ], + [ + "10:49", + "14700.0" + ], + [ + "11:00", + "12828.0" + ], + [ + "11:10", + "11940.0" + ], + [ + "11:19", + "12228.0" + ], + [ + "11:30", + "9912.0" + ], + [ + "11:40", + "9966.0" + ], + [ + "11:49", + "9846.0" + ], + [ + "12:00", + "7530.0" + ], + [ + "12:10", + "7536.0" + ], + [ + "12:19", + "7770.0" + ], + [ + "12:30", + "7992.0" + ], + [ + "12:40", + "7620.0" + ], + [ + "12:49", + "7464.0" + ], + [ + "13:00", + "8472.0" + ], + [ + "13:10", + "7908.0" + ], + [ + "13:19", + "8292.0" + ], + [ + "13:30", + "8466.0" + ], + [ + "13:40", + "8634.0" + ], + [ + "13:49", + "9018.0" + ], + [ + "14:00", + "10452.0" + ], + [ + "14:10", + "10128.0" + ], + [ + "14:19", + "10122.0" + ], + [ + "14:30", + "12420.0" + ], + [ + "14:40", + "12636.0" + ], + [ + "14:49", + "12612.0" + ], + [ + "15:00", + "15144.0" + ], + [ + "15:10", + "16332.0" + ], + [ + "15:19", + "16032.0" + ], + [ + "15:30", + "14928.0" + ], + [ + "15:40", + "15072.0" + ], + [ + "15:49", + "15036.0" + ], + [ + "16:00", + "17262.0" + ], + [ + "16:10", + "17244.0" + ], + [ + "16:19", + "17040.0" + ], + [ + "16:30", + "13434.0" + ], + [ + "16:40", + "13704.0" + ], + [ + "16:49", + "13530.0" + ], + [ + "17:00", + "14010.0" + ], + [ + "17:10", + "14178.0" + ], + [ + "17:19", + "14862.0" + ], + [ + "17:30", + "15042.0" + ], + [ + "17:40", + "14598.0" + ], + [ + "17:49", + "14730.0" + ], + [ + "18:00", + "13062.0" + ], + [ + "18:10", + "14208.0" + ], + [ + "18:19", + "13380.0" + ], + [ + "18:30", + "13128.0" + ], + [ + "18:40", + "13488.0" + ], + [ + "18:49", + "13680.0" + ], + [ + "19:00", + "13608.0" + ], + [ + "19:10", + "13470.0" + ], + [ + "19:19", + "13470.0" + ], + [ + "19:30", + "10968.0" + ], + [ + "19:40", + "11136.0" + ], + [ + "19:49", + "11190.0" + ], + [ + "20:00", + "10428.0" + ], + [ + "20:10", + "10758.0" + ], + [ + "20:19", + "10896.0" + ], + [ + "20:30", + "9780.0" + ], + [ + "20:40", + "9552.0" + ], + [ + "20:49", + "9576.0" + ], + [ + "21:00", + "9540.0" + ], + [ + "21:10", + "9426.0" + ], + [ + "21:19", + "9792.0" + ], + [ + "21:30", + "6252.0" + ], + [ + "21:40", + "6114.0" + ], + [ + "21:49", + "6030.0" + ], + [ + "22:00", + "5676.0" + ], + [ + "22:10", + "5946.0" + ], + [ + "22:19", + "5460.0" + ], + [ + "22:30", + "3954.0" + ], + [ + "22:40", + "3606.0" + ], + [ + "22:49", + "4056.0" + ], + [ + "23:00", + "4062.0" + ], + [ + "23:10", + "4002.0" + ], + [ + "23:19", + "3984.0" + ], + [ + "23:30", + "3072.0" + ], + [ + "23:40", + "2880.0" + ], + [ + "23:49", + "3066.0" + ], + [ + "00:00", + "1128.0" + ], + [ + "00:10", + "1152.0" + ], + [ + "00:19", + "1092.0" + ], + [ + "00:30", + "594.0" + ], + [ + "00:40", + "672.0" + ], + [ + "00:49", + "804.0" + ], + [ + "01:00", + "606.0" + ], + [ + "01:10", + "528.0" + ], + [ + "01:19", + "564.0" + ], + [ + "01:30", + "534.0" + ], + [ + "01:40", + "432.0" + ], + [ + "01:49", + "576.0" + ], + [ + "02:00", + "384.0" + ], + [ + "02:10", + "438.0" + ], + [ + "02:19", + "402.0" + ], + [ + "02:30", + "324.0" + ], + [ + "02:40", + "438.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 264, + 282, + 246, + 252, + 330, + 348, + 396, + 378, + 372, + 576, + 480, + 546, + 1002, + 1140, + 1386, + 1800, + 1968, + 1824, + 3228, + 3426, + 3606, + 7902, + 8838, + 8106, + 12318, + 12198, + 12270, + 14184, + 14778, + 14622, + 14082, + 13260, + 14148, + 12612, + 12162, + 12468, + 11838, + 12126, + 12540, + 13926, + 14028, + 14448, + 13272, + 13386, + 13764, + 14964, + 15216, + 14700, + 12828, + 11940, + 12228, + 9912, + 9966, + 9846, + 7530, + 7536, + 7770, + 7992, + 7620, + 7464, + 8472, + 7908, + 8292, + 8466, + 8634, + 9018, + 10452, + 10128, + 10122, + 12420, + 12636, + 12612, + 15144, + 16332, + 16032, + 14928, + 15072, + 15036, + 17262, + 17244, + 17040, + 13434, + 13704, + 13530, + 14010, + 14178, + 14862, + 15042, + 14598, + 14730, + 13062, + 14208, + 13380, + 13128, + 13488, + 13680, + 13608, + 13470, + 13470, + 10968, + 11136, + 11190, + 10428, + 10758, + 10896, + 9780, + 9552, + 9576, + 9540, + 9426, + 9792, + 6252, + 6114, + 6030, + 5676, + 5946, + 5460, + 3954, + 3606, + 4056, + 4062, + 4002, + 3984, + 3072, + 2880, + 3066, + 1128, + 1152, + 1092, + 594, + 672, + 804, + 606, + 528, + 564, + 534, + 432, + 576, + 384, + 438, + 402, + 324, + 438, + 390, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "240.0" + ], + [ + "03:10", + "288.0" + ], + [ + "03:19", + "258.0" + ], + [ + "03:30", + "300.0" + ], + [ + "03:40", + "306.0" + ], + [ + "03:49", + "348.0" + ], + [ + "04:00", + "348.0" + ], + [ + "04:10", + "438.0" + ], + [ + "04:19", + "360.0" + ], + [ + "04:30", + "516.0" + ], + [ + "04:40", + "528.0" + ], + [ + "04:49", + "462.0" + ], + [ + "05:00", + "1080.0" + ], + [ + "05:10", + "1224.0" + ], + [ + "05:19", + "1284.0" + ], + [ + "05:30", + "1806.0" + ], + [ + "05:40", + "1842.0" + ], + [ + "05:49", + "1938.0" + ], + [ + "06:00", + "3000.0" + ], + [ + "06:10", + "3774.0" + ], + [ + "06:19", + "3474.0" + ], + [ + "06:30", + "7926.0" + ], + [ + "06:40", + "8622.0" + ], + [ + "06:49", + "8208.0" + ], + [ + "07:00", + "11868.0" + ], + [ + "07:10", + "11808.0" + ], + [ + "07:19", + "12588.0" + ], + [ + "07:30", + "14136.0" + ], + [ + "07:40", + "14316.0" + ], + [ + "07:49", + "14754.0" + ], + [ + "08:00", + "13380.0" + ], + [ + "08:10", + "13566.0" + ], + [ + "08:19", + "13194.0" + ], + [ + "08:30", + "11910.0" + ], + [ + "08:40", + "11706.0" + ], + [ + "08:49", + "12402.0" + ], + [ + "09:00", + "11388.0" + ], + [ + "09:10", + "11586.0" + ], + [ + "09:19", + "11946.0" + ], + [ + "09:30", + "13188.0" + ], + [ + "09:40", + "13608.0" + ], + [ + "09:49", + "13674.0" + ], + [ + "10:00", + "13218.0" + ], + [ + "10:10", + "12618.0" + ], + [ + "10:19", + "12756.0" + ], + [ + "10:30", + "14190.0" + ], + [ + "10:40", + "14154.0" + ], + [ + "10:49", + "14196.0" + ], + [ + "11:00", + "11970.0" + ], + [ + "11:10", + "11556.0" + ], + [ + "11:19", + "11790.0" + ], + [ + "11:30", + "9576.0" + ], + [ + "11:40", + "9594.0" + ], + [ + "11:49", + "9450.0" + ], + [ + "12:00", + "7464.0" + ], + [ + "12:10", + "7428.0" + ], + [ + "12:19", + "7698.0" + ], + [ + "12:30", + "7650.0" + ], + [ + "12:40", + "7632.0" + ], + [ + "12:49", + "7200.0" + ], + [ + "13:00", + "7974.0" + ], + [ + "13:10", + "8124.0" + ], + [ + "13:19", + "7842.0" + ], + [ + "13:30", + "8346.0" + ], + [ + "13:40", + "8292.0" + ], + [ + "13:49", + "8820.0" + ], + [ + "14:00", + "10356.0" + ], + [ + "14:10", + "9840.0" + ], + [ + "14:19", + "9648.0" + ], + [ + "14:30", + "11832.0" + ], + [ + "14:40", + "12450.0" + ], + [ + "14:49", + "12480.0" + ], + [ + "15:00", + "15150.0" + ], + [ + "15:10", + "15414.0" + ], + [ + "15:19", + "15048.0" + ], + [ + "15:30", + "14574.0" + ], + [ + "15:40", + "14562.0" + ], + [ + "15:49", + "14580.0" + ], + [ + "16:00", + "15984.0" + ], + [ + "16:10", + "16854.0" + ], + [ + "16:19", + "17166.0" + ], + [ + "16:30", + "12972.0" + ], + [ + "16:40", + "12918.0" + ], + [ + "16:49", + "12990.0" + ], + [ + "17:00", + "13176.0" + ], + [ + "17:10", + "13482.0" + ], + [ + "17:19", + "14160.0" + ], + [ + "17:30", + "14646.0" + ], + [ + "17:40", + "13662.0" + ], + [ + "17:49", + "13914.0" + ], + [ + "18:00", + "13248.0" + ], + [ + "18:10", + "12540.0" + ], + [ + "18:19", + "12804.0" + ], + [ + "18:30", + "12918.0" + ], + [ + "18:40", + "12630.0" + ], + [ + "18:49", + "12552.0" + ], + [ + "19:00", + "12852.0" + ], + [ + "19:10", + "12522.0" + ], + [ + "19:19", + "12642.0" + ], + [ + "19:30", + "10296.0" + ], + [ + "19:40", + "10728.0" + ], + [ + "19:49", + "10272.0" + ], + [ + "20:00", + "9852.0" + ], + [ + "20:10", + "10560.0" + ], + [ + "20:19", + "10080.0" + ], + [ + "20:30", + "9000.0" + ], + [ + "20:40", + "8730.0" + ], + [ + "20:49", + "9192.0" + ], + [ + "21:00", + "8778.0" + ], + [ + "21:10", + "8958.0" + ], + [ + "21:19", + "9402.0" + ], + [ + "21:30", + "5808.0" + ], + [ + "21:40", + "5532.0" + ], + [ + "21:49", + "5724.0" + ], + [ + "22:00", + "5232.0" + ], + [ + "22:10", + "5760.0" + ], + [ + "22:19", + "5202.0" + ], + [ + "22:30", + "3384.0" + ], + [ + "22:40", + "3372.0" + ], + [ + "22:49", + "4176.0" + ], + [ + "23:00", + "3750.0" + ], + [ + "23:10", + "3738.0" + ], + [ + "23:19", + "3510.0" + ], + [ + "23:30", + "2934.0" + ], + [ + "23:40", + "2688.0" + ], + [ + "23:49", + "2838.0" + ], + [ + "00:00", + "1104.0" + ], + [ + "00:10", + "1080.0" + ], + [ + "00:19", + "1062.0" + ], + [ + "00:30", + "678.0" + ], + [ + "00:40", + "660.0" + ], + [ + "00:49", + "732.0" + ], + [ + "01:00", + "630.0" + ], + [ + "01:10", + "546.0" + ], + [ + "01:19", + "522.0" + ], + [ + "01:30", + "528.0" + ], + [ + "01:40", + "528.0" + ], + [ + "01:49", + "468.0" + ], + [ + "02:00", + "360.0" + ], + [ + "02:10", + "450.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "342.0" + ], + [ + "02:40", + "402.0" + ], + [ + "02:49", + "408.0" + ], + [ + "03:00", + "12.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 240, + 288, + 258, + 300, + 306, + 348, + 348, + 438, + 360, + 516, + 528, + 462, + 1080, + 1224, + 1284, + 1806, + 1842, + 1938, + 3000, + 3774, + 3474, + 7926, + 8622, + 8208, + 11868, + 11808, + 12588, + 14136, + 14316, + 14754, + 13380, + 13566, + 13194, + 11910, + 11706, + 12402, + 11388, + 11586, + 11946, + 13188, + 13608, + 13674, + 13218, + 12618, + 12756, + 14190, + 14154, + 14196, + 11970, + 11556, + 11790, + 9576, + 9594, + 9450, + 7464, + 7428, + 7698, + 7650, + 7632, + 7200, + 7974, + 8124, + 7842, + 8346, + 8292, + 8820, + 10356, + 9840, + 9648, + 11832, + 12450, + 12480, + 15150, + 15414, + 15048, + 14574, + 14562, + 14580, + 15984, + 16854, + 17166, + 12972, + 12918, + 12990, + 13176, + 13482, + 14160, + 14646, + 13662, + 13914, + 13248, + 12540, + 12804, + 12918, + 12630, + 12552, + 12852, + 12522, + 12642, + 10296, + 10728, + 10272, + 9852, + 10560, + 10080, + 9000, + 8730, + 9192, + 8778, + 8958, + 9402, + 5808, + 5532, + 5724, + 5232, + 5760, + 5202, + 3384, + 3372, + 4176, + 3750, + 3738, + 3510, + 2934, + 2688, + 2838, + 1104, + 1080, + 1062, + 678, + 660, + 732, + 630, + 546, + 522, + 528, + 528, + 468, + 360, + 450, + 426, + 342, + 402, + 408, + 12 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Number of vehicle trips serviced (REAL) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Veh trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "300.0" + ], + [ + "03:10", + "282.0" + ], + [ + "03:19", + "234.0" + ], + [ + "03:30", + "270.0" + ], + [ + "03:40", + "342.0" + ], + [ + "03:49", + "330.0" + ], + [ + "04:00", + "384.0" + ], + [ + "04:10", + "360.0" + ], + [ + "04:19", + "450.0" + ], + [ + "04:30", + "480.0" + ], + [ + "04:40", + "498.0" + ], + [ + "04:49", + "576.0" + ], + [ + "05:00", + "1014.0" + ], + [ + "05:10", + "1302.0" + ], + [ + "05:19", + "1296.0" + ], + [ + "05:30", + "2016.0" + ], + [ + "05:40", + "1644.0" + ], + [ + "05:49", + "2028.0" + ], + [ + "06:00", + "3042.0" + ], + [ + "06:10", + "3402.0" + ], + [ + "06:19", + "3744.0" + ], + [ + "06:30", + "8136.0" + ], + [ + "06:40", + "8430.0" + ], + [ + "06:49", + "8478.0" + ], + [ + "07:00", + "12432.0" + ], + [ + "07:10", + "12216.0" + ], + [ + "07:19", + "12546.0" + ], + [ + "07:30", + "14910.0" + ], + [ + "07:40", + "14982.0" + ], + [ + "07:49", + "14856.0" + ], + [ + "08:00", + "14022.0" + ], + [ + "08:10", + "13818.0" + ], + [ + "08:19", + "14448.0" + ], + [ + "08:30", + "13050.0" + ], + [ + "08:40", + "12876.0" + ], + [ + "08:49", + "13326.0" + ], + [ + "09:00", + "12780.0" + ], + [ + "09:10", + "13242.0" + ], + [ + "09:19", + "12834.0" + ], + [ + "09:30", + "15090.0" + ], + [ + "09:40", + "15396.0" + ], + [ + "09:49", + "15480.0" + ], + [ + "10:00", + "15306.0" + ], + [ + "10:10", + "15174.0" + ], + [ + "10:19", + "14628.0" + ], + [ + "10:30", + "16152.0" + ], + [ + "10:40", + "16536.0" + ], + [ + "10:49", + "16584.0" + ], + [ + "11:00", + "14514.0" + ], + [ + "11:10", + "12984.0" + ], + [ + "11:19", + "13344.0" + ], + [ + "11:30", + "10836.0" + ], + [ + "11:40", + "10410.0" + ], + [ + "11:49", + "10752.0" + ], + [ + "12:00", + "7770.0" + ], + [ + "12:10", + "7818.0" + ], + [ + "12:19", + "8202.0" + ], + [ + "12:30", + "7902.0" + ], + [ + "12:40", + "8166.0" + ], + [ + "12:49", + "7788.0" + ], + [ + "13:00", + "8634.0" + ], + [ + "13:10", + "8412.0" + ], + [ + "13:19", + "8832.0" + ], + [ + "13:30", + "8892.0" + ], + [ + "13:40", + "9390.0" + ], + [ + "13:49", + "9312.0" + ], + [ + "14:00", + "10572.0" + ], + [ + "14:10", + "10848.0" + ], + [ + "14:19", + "10578.0" + ], + [ + "14:30", + "12906.0" + ], + [ + "14:40", + "13248.0" + ], + [ + "14:49", + "13338.0" + ], + [ + "15:00", + "16362.0" + ], + [ + "15:10", + "16206.0" + ], + [ + "15:19", + "17142.0" + ], + [ + "15:30", + "16152.0" + ], + [ + "15:40", + "15510.0" + ], + [ + "15:49", + "15978.0" + ], + [ + "16:00", + "18336.0" + ], + [ + "16:10", + "18156.0" + ], + [ + "16:19", + "18168.0" + ], + [ + "16:30", + "14376.0" + ], + [ + "16:40", + "14388.0" + ], + [ + "16:49", + "14310.0" + ], + [ + "17:00", + "15294.0" + ], + [ + "17:10", + "15126.0" + ], + [ + "17:19", + "15882.0" + ], + [ + "17:30", + "16320.0" + ], + [ + "17:40", + "15726.0" + ], + [ + "17:49", + "15798.0" + ], + [ + "18:00", + "14802.0" + ], + [ + "18:10", + "14646.0" + ], + [ + "18:19", + "14628.0" + ], + [ + "18:30", + "14142.0" + ], + [ + "18:40", + "14844.0" + ], + [ + "18:49", + "14862.0" + ], + [ + "19:00", + "14838.0" + ], + [ + "19:10", + "14886.0" + ], + [ + "19:19", + "15006.0" + ], + [ + "19:30", + "12102.0" + ], + [ + "19:40", + "12054.0" + ], + [ + "19:49", + "12732.0" + ], + [ + "20:00", + "12090.0" + ], + [ + "20:10", + "12036.0" + ], + [ + "20:19", + "12096.0" + ], + [ + "20:30", + "9792.0" + ], + [ + "20:40", + "10584.0" + ], + [ + "20:49", + "10536.0" + ], + [ + "21:00", + "10242.0" + ], + [ + "21:10", + "11400.0" + ], + [ + "21:19", + "10530.0" + ], + [ + "21:30", + "6924.0" + ], + [ + "21:40", + "6780.0" + ], + [ + "21:49", + "6570.0" + ], + [ + "22:00", + "5808.0" + ], + [ + "22:10", + "6840.0" + ], + [ + "22:19", + "6264.0" + ], + [ + "22:30", + "4332.0" + ], + [ + "22:40", + "3852.0" + ], + [ + "22:49", + "4008.0" + ], + [ + "23:00", + "4794.0" + ], + [ + "23:10", + "4512.0" + ], + [ + "23:19", + "4380.0" + ], + [ + "23:30", + "3366.0" + ], + [ + "23:40", + "3222.0" + ], + [ + "23:49", + "3348.0" + ], + [ + "00:00", + "1308.0" + ], + [ + "00:10", + "1134.0" + ], + [ + "00:19", + "1122.0" + ], + [ + "00:30", + "666.0" + ], + [ + "00:40", + "720.0" + ], + [ + "00:49", + "702.0" + ], + [ + "01:00", + "510.0" + ], + [ + "01:10", + "570.0" + ], + [ + "01:19", + "618.0" + ], + [ + "01:30", + "606.0" + ], + [ + "01:40", + "408.0" + ], + [ + "01:49", + "528.0" + ], + [ + "02:00", + "474.0" + ], + [ + "02:10", + "342.0" + ], + [ + "02:19", + "426.0" + ], + [ + "02:30", + "384.0" + ], + [ + "02:40", + "396.0" + ], + [ + "02:49", + "390.0" + ], + [ + "03:00", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 300, + 282, + 234, + 270, + 342, + 330, + 384, + 360, + 450, + 480, + 498, + 576, + 1014, + 1302, + 1296, + 2016, + 1644, + 2028, + 3042, + 3402, + 3744, + 8136, + 8430, + 8478, + 12432, + 12216, + 12546, + 14910, + 14982, + 14856, + 14022, + 13818, + 14448, + 13050, + 12876, + 13326, + 12780, + 13242, + 12834, + 15090, + 15396, + 15480, + 15306, + 15174, + 14628, + 16152, + 16536, + 16584, + 14514, + 12984, + 13344, + 10836, + 10410, + 10752, + 7770, + 7818, + 8202, + 7902, + 8166, + 7788, + 8634, + 8412, + 8832, + 8892, + 9390, + 9312, + 10572, + 10848, + 10578, + 12906, + 13248, + 13338, + 16362, + 16206, + 17142, + 16152, + 15510, + 15978, + 18336, + 18156, + 18168, + 14376, + 14388, + 14310, + 15294, + 15126, + 15882, + 16320, + 15726, + 15798, + 14802, + 14646, + 14628, + 14142, + 14844, + 14862, + 14838, + 14886, + 15006, + 12102, + 12054, + 12732, + 12090, + 12036, + 12096, + 9792, + 10584, + 10536, + 10242, + 11400, + 10530, + 6924, + 6780, + 6570, + 5808, + 6840, + 6264, + 4332, + 3852, + 4008, + 4794, + 4512, + 4380, + 3366, + 3222, + 3348, + 1308, + 1134, + 1122, + 666, + 720, + 702, + 510, + 570, + 618, + 606, + 408, + 528, + 474, + 342, + 426, + 384, + 396, + 390, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "15108.0" + ], + [ + "03:10", + "16686.0" + ], + [ + "03:19", + "17430.0" + ], + [ + "03:30", + "21738.0" + ], + [ + "03:40", + "22500.0" + ], + [ + "03:49", + "22878.0" + ], + [ + "04:00", + "32250.0" + ], + [ + "04:10", + "32772.0" + ], + [ + "04:19", + "35040.0" + ], + [ + "04:30", + "51624.0" + ], + [ + "04:40", + "55566.0" + ], + [ + "04:49", + "56688.0" + ], + [ + "05:00", + "91578.0" + ], + [ + "05:10", + "98028.0" + ], + [ + "05:19", + "100716.0" + ], + [ + "05:30", + "168684.0" + ], + [ + "05:40", + "185334.0" + ], + [ + "05:49", + "190122.0" + ], + [ + "06:00", + "356964.0" + ], + [ + "06:10", + "385404.0" + ], + [ + "06:19", + "398280.0" + ], + [ + "06:30", + "951072.0" + ], + [ + "06:40", + "1032420.0" + ], + [ + "06:49", + "1062438.0" + ], + [ + "07:00", + "1486602.0" + ], + [ + "07:10", + "1546392.0" + ], + [ + "07:19", + "1596408.0" + ], + [ + "07:30", + "1856034.0" + ], + [ + "07:40", + "1922376.0" + ], + [ + "07:49", + "1910208.0" + ], + [ + "08:00", + "1545720.0" + ], + [ + "08:10", + "1474476.0" + ], + [ + "08:19", + "1450002.0" + ], + [ + "08:30", + "1244388.0" + ], + [ + "08:40", + "1192590.0" + ], + [ + "08:49", + "1179018.0" + ], + [ + "09:00", + "991614.0" + ], + [ + "09:10", + "943956.0" + ], + [ + "09:19", + "933132.0" + ], + [ + "09:30", + "874074.0" + ], + [ + "09:40", + "858438.0" + ], + [ + "09:49", + "855078.0" + ], + [ + "10:00", + "803130.0" + ], + [ + "10:10", + "793548.0" + ], + [ + "10:19", + "792876.0" + ], + [ + "10:30", + "795840.0" + ], + [ + "10:40", + "792354.0" + ], + [ + "10:49", + "793632.0" + ], + [ + "11:00", + "827196.0" + ], + [ + "11:10", + "830454.0" + ], + [ + "11:19", + "823950.0" + ], + [ + "11:30", + "903738.0" + ], + [ + "11:40", + "928734.0" + ], + [ + "11:49", + "924420.0" + ], + [ + "12:00", + "940620.0" + ], + [ + "12:10", + "938316.0" + ], + [ + "12:19", + "936966.0" + ], + [ + "12:30", + "919344.0" + ], + [ + "12:40", + "913644.0" + ], + [ + "12:49", + "911358.0" + ], + [ + "13:00", + "901662.0" + ], + [ + "13:10", + "906714.0" + ], + [ + "13:19", + "906066.0" + ], + [ + "13:30", + "889128.0" + ], + [ + "13:40", + "893358.0" + ], + [ + "13:49", + "896412.0" + ], + [ + "14:00", + "961950.0" + ], + [ + "14:10", + "990948.0" + ], + [ + "14:19", + "997038.0" + ], + [ + "14:30", + "1121838.0" + ], + [ + "14:40", + "1163148.0" + ], + [ + "14:49", + "1165158.0" + ], + [ + "15:00", + "1353432.0" + ], + [ + "15:10", + "1402662.0" + ], + [ + "15:19", + "1416876.0" + ], + [ + "15:30", + "1431684.0" + ], + [ + "15:40", + "1441548.0" + ], + [ + "15:49", + "1437936.0" + ], + [ + "16:00", + "1501938.0" + ], + [ + "16:10", + "1540290.0" + ], + [ + "16:19", + "1540914.0" + ], + [ + "16:30", + "1262040.0" + ], + [ + "16:40", + "1225374.0" + ], + [ + "16:49", + "1212678.0" + ], + [ + "17:00", + "1203348.0" + ], + [ + "17:10", + "1195398.0" + ], + [ + "17:19", + "1205922.0" + ], + [ + "17:30", + "1175514.0" + ], + [ + "17:40", + "1161246.0" + ], + [ + "17:49", + "1165902.0" + ], + [ + "18:00", + "1046286.0" + ], + [ + "18:10", + "1011696.0" + ], + [ + "18:19", + "1000950.0" + ], + [ + "18:30", + "937206.0" + ], + [ + "18:40", + "912534.0" + ], + [ + "18:49", + "903678.0" + ], + [ + "19:00", + "770502.0" + ], + [ + "19:10", + "729408.0" + ], + [ + "19:19", + "719274.0" + ], + [ + "19:30", + "644388.0" + ], + [ + "19:40", + "621594.0" + ], + [ + "19:49", + "611928.0" + ], + [ + "20:00", + "549522.0" + ], + [ + "20:10", + "533286.0" + ], + [ + "20:19", + "530340.0" + ], + [ + "20:30", + "486240.0" + ], + [ + "20:40", + "473910.0" + ], + [ + "20:49", + "471066.0" + ], + [ + "21:00", + "414732.0" + ], + [ + "21:10", + "392334.0" + ], + [ + "21:19", + "391812.0" + ], + [ + "21:30", + "292800.0" + ], + [ + "21:40", + "264372.0" + ], + [ + "21:49", + "254046.0" + ], + [ + "22:00", + "213384.0" + ], + [ + "22:10", + "202614.0" + ], + [ + "22:19", + "196950.0" + ], + [ + "22:30", + "161868.0" + ], + [ + "22:40", + "153198.0" + ], + [ + "22:49", + "148416.0" + ], + [ + "23:00", + "124794.0" + ], + [ + "23:10", + "119862.0" + ], + [ + "23:19", + "115896.0" + ], + [ + "23:30", + "99834.0" + ], + [ + "23:40", + "96594.0" + ], + [ + "23:49", + "95826.0" + ], + [ + "00:00", + "76788.0" + ], + [ + "00:10", + "69138.0" + ], + [ + "00:19", + "65136.0" + ], + [ + "00:30", + "55968.0" + ], + [ + "00:40", + "52050.0" + ], + [ + "00:49", + "51336.0" + ], + [ + "01:00", + "44562.0" + ], + [ + "01:10", + "43020.0" + ], + [ + "01:19", + "41706.0" + ], + [ + "01:30", + "34278.0" + ], + [ + "01:40", + "32988.0" + ], + [ + "01:49", + "33324.0" + ], + [ + "02:00", + "26400.0" + ], + [ + "02:10", + "25824.0" + ], + [ + "02:19", + "24822.0" + ], + [ + "02:30", + "20010.0" + ], + [ + "02:40", + "19332.0" + ], + [ + "02:49", + "18468.0" + ], + [ + "03:00", + "5754.0" + ], + [ + "03:10", + "1776.0" + ], + [ + "03:19", + "516.0" + ], + [ + "03:30", + "258.0" + ], + [ + "03:40", + "90.0" + ], + [ + "03:49", + "102.0" + ], + [ + "04:00", + "90.0" + ], + [ + "04:10", + "54.0" + ], + [ + "04:19", + "36.0" + ], + [ + "04:30", + "48.0" + ], + [ + "04:40", + "18.0" + ], + [ + "04:49", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332, + 25.5, + 25.666666666666668, + 25.833333333333332 + ], + "y": [ + 15108, + 16686, + 17430, + 21738, + 22500, + 22878, + 32250, + 32772, + 35040, + 51624, + 55566, + 56688, + 91578, + 98028, + 100716, + 168684, + 185334, + 190122, + 356964, + 385404, + 398280, + 951072, + 1032420, + 1062438, + 1486602, + 1546392, + 1596408, + 1856034, + 1922376, + 1910208, + 1545720, + 1474476, + 1450002, + 1244388, + 1192590, + 1179018, + 991614, + 943956, + 933132, + 874074, + 858438, + 855078, + 803130, + 793548, + 792876, + 795840, + 792354, + 793632, + 827196, + 830454, + 823950, + 903738, + 928734, + 924420, + 940620, + 938316, + 936966, + 919344, + 913644, + 911358, + 901662, + 906714, + 906066, + 889128, + 893358, + 896412, + 961950, + 990948, + 997038, + 1121838, + 1163148, + 1165158, + 1353432, + 1402662, + 1416876, + 1431684, + 1441548, + 1437936, + 1501938, + 1540290, + 1540914, + 1262040, + 1225374, + 1212678, + 1203348, + 1195398, + 1205922, + 1175514, + 1161246, + 1165902, + 1046286, + 1011696, + 1000950, + 937206, + 912534, + 903678, + 770502, + 729408, + 719274, + 644388, + 621594, + 611928, + 549522, + 533286, + 530340, + 486240, + 473910, + 471066, + 414732, + 392334, + 391812, + 292800, + 264372, + 254046, + 213384, + 202614, + 196950, + 161868, + 153198, + 148416, + 124794, + 119862, + 115896, + 99834, + 96594, + 95826, + 76788, + 69138, + 65136, + 55968, + 52050, + 51336, + 44562, + 43020, + 41706, + 34278, + 32988, + 33324, + 26400, + 25824, + 24822, + 20010, + 19332, + 18468, + 5754, + 1776, + 516, + 258, + 90, + 102, + 90, + 54, + 36, + 48, + 18, + 6 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Number of vehicle trips serviced (REAL) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Veh trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_requested_trips_per_hour(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " Requested veh trips/hour by time of day.\n", + " Requested veh trips = veh trips with passengers onboard:\n", + " - trip_i or trip_j non-null\n", + " - is_deadhead == False\n", + " Scaled to veh trips/hour using the scenario’s bin size.\n", + " \"\"\"\n", + " requested_mask = (\n", + " (new_df[\"trip_i\"].notna() | new_df[\"trip_j\"].notna())\n", + " & (new_df[\"is_deadhead\"] == False)\n", + " )\n", + "\n", + " bins = pd.to_numeric(new_df.loc[requested_mask, \"depart_bin\"], errors=\"coerce\").dropna().astype(int)\n", + " if bins.empty:\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " counts = (\n", + " bins.value_counts()\n", + " .sort_index()\n", + " .reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0)\n", + " )\n", + "\n", + " # normalize to trips/hour according to bin size\n", + " factor = 60.0 / bin_minutes\n", + " rate = counts * factor\n", + "\n", + " times = start_time + pd.to_timedelta(rate.index * bin_minutes, unit=\"m\")\n", + " vals = rate.values\n", + "\n", + " df = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " df[\"hover\"] = [\n", + " f\"Veh trips/hour: {v:,.2f} (bin trips: {int(c):,}, bin={bin_minutes} min)\"\n", + " for v, c in zip(vals, counts.values)\n", + " ]\n", + " return df\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_requested_trips_per_hour,\n", + " \"Number of vehicle trips serviced (REAL)\",\n", + " \"Veh trips per hour\",\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "REAL veh trips totals — time_bin_size\n", + " requested_trips all_trips share_real\n", + "scenario \n", + "base 213596 428566 49.84%\n", + "timebin_5 213329 429146 49.71%\n", + "timebin_15 213802 427906 49.96%\n", + "\n", + "REAL veh trips totals — max_detour\n", + " requested_trips all_trips share_real\n", + "scenario \n", + "base 213596 428566 49.84%\n", + "detour_5 212822 428575 49.66%\n", + "detour_10 213148 428570 49.73%\n", + "detour_20 213808 428617 49.88%\n", + "\n", + "REAL veh trips totals — max_occupancy\n", + " requested_trips all_trips share_real\n", + "scenario \n", + "base 213596 428566 49.84%\n", + "occ_6 199956 400900 49.88%\n", + "occ_8 192021 384969 49.88%\n", + "\n", + "REAL veh trips totals — tnc_shared_demand\n", + " requested_trips all_trips share_real\n", + "scenario \n", + "base 213596 428566 49.84%\n", + "shift_to_all_shared_tnc 16322851 22328970 73.1%\n" + ] + } + ], + "source": [ + "def metric_requested_trip_totals(new_df, pooled_df):\n", + " requested_mask = (\n", + " (new_df[\"trip_i\"].notna() | new_df[\"trip_j\"].notna())\n", + " & (new_df[\"is_deadhead\"] == False)\n", + " )\n", + " total_real = int(requested_mask.sum())\n", + " total_trips = len(new_df)\n", + " return {\n", + " \"requested_trips\": total_real,\n", + " \"all_trips\": total_trips,\n", + " \"share_real\": total_real / total_trips if total_trips else np.nan,\n", + " }\n", + "\n", + "run_scalar_metric(metric_requested_trip_totals, \"REAL veh trips totals\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Share of deadheading trips (by trips and VMT)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Share of deadheading trips — time_bin_size\n", + " dead_trips total_trips share_trips dead_vmt total_vmt share_vmt\n", + "scenario \n", + "base 214970 428566 50.16% 237333.623497 1.874488e+06 12.66%\n", + "timebin_5 215817 429146 50.29% 267909.644660 1.905020e+06 14.06%\n", + "timebin_15 214104 427906 50.04% 222415.540618 1.859414e+06 11.96%\n", + "\n", + "Share of deadheading trips — max_detour\n", + " dead_trips total_trips share_trips dead_vmt total_vmt share_vmt\n", + "scenario \n", + "base 214970 428566 50.16% 237333.623497 1.874488e+06 12.66%\n", + "detour_5 215753 428575 50.34% 238908.533389 1.875645e+06 12.74%\n", + "detour_10 215422 428570 50.27% 238535.462350 1.875214e+06 12.72%\n", + "detour_20 214809 428617 50.12% 238031.593581 1.875890e+06 12.69%\n", + "\n", + "Share of deadheading trips — max_occupancy\n", + " dead_trips total_trips share_trips dead_vmt total_vmt share_vmt\n", + "scenario \n", + "base 214970 428566 50.16% 237333.623497 1.874488e+06 12.66%\n", + "occ_6 200944 400900 50.12% 218815.209416 1.754936e+06 12.47%\n", + "occ_8 192948 384969 50.12% 208050.437002 1.697862e+06 12.25%\n", + "\n", + "Share of deadheading trips — tnc_shared_demand\n", + " dead_trips total_trips share_trips dead_vmt total_vmt share_vmt\n", + "scenario \n", + "base 214970 428566 50.16% 2.373336e+05 1.874488e+06 12.66%\n", + "shift_to_all_shared_tnc 6006119 22328970 26.9% 5.522598e+06 5.502521e+07 10.04%\n" + ] + } + ], + "source": [ + "def metric_deadhead_share(new_df, pooled_df):\n", + " d = new_df.copy()\n", + " d[dist_col_new] = pd.to_numeric(d[dist_col_new], errors=\"coerce\").fillna(0.0)\n", + "\n", + " total_trips = len(d)\n", + " dead_trips = int(d[\"is_deadhead\"].sum())\n", + " share_trips = dead_trips / total_trips if total_trips else np.nan\n", + "\n", + " dead_vmt = d.loc[d[\"is_deadhead\"], dist_col_new].sum()\n", + " total_vmt = d[dist_col_new].sum()\n", + " share_vmt = dead_vmt / total_vmt if total_vmt else np.nan\n", + "\n", + " return {\n", + " \"dead_trips\": dead_trips,\n", + " \"total_trips\": total_trips,\n", + " \"share_trips\": share_trips,\n", + " \"dead_vmt\": dead_vmt,\n", + " \"total_vmt\": total_vmt,\n", + " \"share_vmt\": share_vmt,\n", + " }\n", + "\n", + "run_scalar_metric(metric_deadhead_share, \"Share of deadheading trips\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Number and VMT of all veh trips made by TNCs (per hour)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "786.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "864.0" + ], + [ + "04:30", + "990.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1176.0" + ], + [ + "05:00", + "2154.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3384.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6480.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7440.0" + ], + [ + "06:30", + "16296.0" + ], + [ + "06:40", + "16722.0" + ], + [ + "06:49", + "17016.0" + ], + [ + "07:00", + "24396.0" + ], + [ + "07:10", + "24486.0" + ], + [ + "07:19", + "24936.0" + ], + [ + "07:30", + "29712.0" + ], + [ + "07:40", + "29790.0" + ], + [ + "07:49", + "29160.0" + ], + [ + "08:00", + "27996.0" + ], + [ + "08:10", + "27528.0" + ], + [ + "08:19", + "28596.0" + ], + [ + "08:30", + "25830.0" + ], + [ + "08:40", + "25776.0" + ], + [ + "08:49", + "26508.0" + ], + [ + "09:00", + "25680.0" + ], + [ + "09:10", + "26220.0" + ], + [ + "09:19", + "25602.0" + ], + [ + "09:30", + "30732.0" + ], + [ + "09:40", + "30474.0" + ], + [ + "09:49", + "31008.0" + ], + [ + "10:00", + "30210.0" + ], + [ + "10:10", + "30048.0" + ], + [ + "10:19", + "29256.0" + ], + [ + "10:30", + "32334.0" + ], + [ + "10:40", + "33186.0" + ], + [ + "10:49", + "33054.0" + ], + [ + "11:00", + "28254.0" + ], + [ + "11:10", + "25770.0" + ], + [ + "11:19", + "26694.0" + ], + [ + "11:30", + "21366.0" + ], + [ + "11:40", + "20658.0" + ], + [ + "11:49", + "21486.0" + ], + [ + "12:00", + "15354.0" + ], + [ + "12:10", + "15534.0" + ], + [ + "12:19", + "16260.0" + ], + [ + "12:30", + "15834.0" + ], + [ + "12:40", + "16224.0" + ], + [ + "12:49", + "15732.0" + ], + [ + "13:00", + "16938.0" + ], + [ + "13:10", + "16782.0" + ], + [ + "13:19", + "17430.0" + ], + [ + "13:30", + "18186.0" + ], + [ + "13:40", + "18618.0" + ], + [ + "13:49", + "18432.0" + ], + [ + "14:00", + "21084.0" + ], + [ + "14:10", + "21834.0" + ], + [ + "14:19", + "20808.0" + ], + [ + "14:30", + "26136.0" + ], + [ + "14:40", + "26226.0" + ], + [ + "14:49", + "26538.0" + ], + [ + "15:00", + "32988.0" + ], + [ + "15:10", + "32244.0" + ], + [ + "15:19", + "34296.0" + ], + [ + "15:30", + "32052.0" + ], + [ + "15:40", + "31014.0" + ], + [ + "15:49", + "31884.0" + ], + [ + "16:00", + "36690.0" + ], + [ + "16:10", + "36420.0" + ], + [ + "16:19", + "36420.0" + ], + [ + "16:30", + "28092.0" + ], + [ + "16:40", + "28866.0" + ], + [ + "16:49", + "28620.0" + ], + [ + "17:00", + "31218.0" + ], + [ + "17:10", + "30618.0" + ], + [ + "17:19", + "31866.0" + ], + [ + "17:30", + "32112.0" + ], + [ + "17:40", + "31824.0" + ], + [ + "17:49", + "32040.0" + ], + [ + "18:00", + "29592.0" + ], + [ + "18:10", + "29544.0" + ], + [ + "18:19", + "29412.0" + ], + [ + "18:30", + "28740.0" + ], + [ + "18:40", + "30060.0" + ], + [ + "18:49", + "30138.0" + ], + [ + "19:00", + "30312.0" + ], + [ + "19:10", + "30048.0" + ], + [ + "19:19", + "30498.0" + ], + [ + "19:30", + "24486.0" + ], + [ + "19:40", + "24588.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24486.0" + ], + [ + "20:10", + "24750.0" + ], + [ + "20:19", + "24216.0" + ], + [ + "20:30", + "20298.0" + ], + [ + "20:40", + "21474.0" + ], + [ + "20:49", + "21396.0" + ], + [ + "21:00", + "21270.0" + ], + [ + "21:10", + "23052.0" + ], + [ + "21:19", + "21462.0" + ], + [ + "21:30", + "13836.0" + ], + [ + "21:40", + "14346.0" + ], + [ + "21:49", + "13614.0" + ], + [ + "22:00", + "12006.0" + ], + [ + "22:10", + "13608.0" + ], + [ + "22:19", + "12732.0" + ], + [ + "22:30", + "8760.0" + ], + [ + "22:40", + "8364.0" + ], + [ + "22:49", + "8340.0" + ], + [ + "23:00", + "9390.0" + ], + [ + "23:10", + "9264.0" + ], + [ + "23:19", + "8982.0" + ], + [ + "23:30", + "6834.0" + ], + [ + "23:40", + "6570.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2382.0" + ], + [ + "00:19", + "2346.0" + ], + [ + "00:30", + "1416.0" + ], + [ + "00:40", + "1506.0" + ], + [ + "00:49", + "1470.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1206.0" + ], + [ + "01:19", + "1278.0" + ], + [ + "01:30", + "1260.0" + ], + [ + "01:40", + "858.0" + ], + [ + "01:49", + "1086.0" + ], + [ + "02:00", + "984.0" + ], + [ + "02:10", + "738.0" + ], + [ + "02:19", + "906.0" + ], + [ + "02:30", + "780.0" + ], + [ + "02:40", + "846.0" + ], + [ + "02:49", + "816.0" + ], + [ + "03:00", + "54.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 786, + 762, + 864, + 990, + 1008, + 1176, + 2154, + 2592, + 2544, + 4086, + 3384, + 3912, + 6480, + 6798, + 7440, + 16296, + 16722, + 17016, + 24396, + 24486, + 24936, + 29712, + 29790, + 29160, + 27996, + 27528, + 28596, + 25830, + 25776, + 26508, + 25680, + 26220, + 25602, + 30732, + 30474, + 31008, + 30210, + 30048, + 29256, + 32334, + 33186, + 33054, + 28254, + 25770, + 26694, + 21366, + 20658, + 21486, + 15354, + 15534, + 16260, + 15834, + 16224, + 15732, + 16938, + 16782, + 17430, + 18186, + 18618, + 18432, + 21084, + 21834, + 20808, + 26136, + 26226, + 26538, + 32988, + 32244, + 34296, + 32052, + 31014, + 31884, + 36690, + 36420, + 36420, + 28092, + 28866, + 28620, + 31218, + 30618, + 31866, + 32112, + 31824, + 32040, + 29592, + 29544, + 29412, + 28740, + 30060, + 30138, + 30312, + 30048, + 30498, + 24486, + 24588, + 25842, + 24486, + 24750, + 24216, + 20298, + 21474, + 21396, + 21270, + 23052, + 21462, + 13836, + 14346, + 13614, + 12006, + 13608, + 12732, + 8760, + 8364, + 8340, + 9390, + 9264, + 8982, + 6834, + 6570, + 6972, + 2526, + 2382, + 2346, + 1416, + 1506, + 1470, + 1068, + 1206, + 1278, + 1260, + 858, + 1086, + 984, + 738, + 906, + 780, + 846, + 816, + 54, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "372.0" + ], + [ + "03:04", + "828.0" + ], + [ + "03:10", + "624.0" + ], + [ + "03:15", + "516.0" + ], + [ + "03:19", + "348.0" + ], + [ + "03:25", + "588.0" + ], + [ + "03:30", + "612.0" + ], + [ + "03:34", + "588.0" + ], + [ + "03:40", + "768.0" + ], + [ + "03:45", + "504.0" + ], + [ + "03:49", + "744.0" + ], + [ + "03:55", + "588.0" + ], + [ + "04:00", + "636.0" + ], + [ + "04:04", + "852.0" + ], + [ + "04:10", + "840.0" + ], + [ + "04:15", + "804.0" + ], + [ + "04:19", + "732.0" + ], + [ + "04:25", + "936.0" + ], + [ + "04:30", + "1104.0" + ], + [ + "04:34", + "852.0" + ], + [ + "04:40", + "948.0" + ], + [ + "04:45", + "1044.0" + ], + [ + "04:49", + "1164.0" + ], + [ + "04:55", + "1152.0" + ], + [ + "05:00", + "1992.0" + ], + [ + "05:04", + "2196.0" + ], + [ + "05:10", + "2712.0" + ], + [ + "05:15", + "2400.0" + ], + [ + "05:19", + "2364.0" + ], + [ + "05:25", + "2592.0" + ], + [ + "05:30", + "3600.0" + ], + [ + "05:34", + "4644.0" + ], + [ + "05:40", + "3432.0" + ], + [ + "05:45", + "3084.0" + ], + [ + "05:49", + "4080.0" + ], + [ + "05:55", + "3792.0" + ], + [ + "06:00", + "6228.0" + ], + [ + "06:04", + "6372.0" + ], + [ + "06:10", + "7128.0" + ], + [ + "06:15", + "6696.0" + ], + [ + "06:19", + "7020.0" + ], + [ + "06:25", + "8004.0" + ], + [ + "06:30", + "15420.0" + ], + [ + "06:34", + "16140.0" + ], + [ + "06:40", + "16656.0" + ], + [ + "06:45", + "17424.0" + ], + [ + "06:49", + "16740.0" + ], + [ + "06:55", + "16764.0" + ], + [ + "07:00", + "24312.0" + ], + [ + "07:04", + "24072.0" + ], + [ + "07:10", + "24576.0" + ], + [ + "07:15", + "24240.0" + ], + [ + "07:19", + "24384.0" + ], + [ + "07:25", + "24948.0" + ], + [ + "07:30", + "29172.0" + ], + [ + "07:34", + "30636.0" + ], + [ + "07:40", + "29868.0" + ], + [ + "07:45", + "29604.0" + ], + [ + "07:49", + "29244.0" + ], + [ + "07:55", + "29256.0" + ], + [ + "08:00", + "27612.0" + ], + [ + "08:04", + "28488.0" + ], + [ + "08:10", + "27720.0" + ], + [ + "08:15", + "28008.0" + ], + [ + "08:19", + "27840.0" + ], + [ + "08:25", + "28308.0" + ], + [ + "08:30", + "26532.0" + ], + [ + "08:34", + "25932.0" + ], + [ + "08:40", + "25968.0" + ], + [ + "08:45", + "25080.0" + ], + [ + "08:49", + "27048.0" + ], + [ + "08:55", + "26172.0" + ], + [ + "09:00", + "25836.0" + ], + [ + "09:04", + "25500.0" + ], + [ + "09:10", + "25740.0" + ], + [ + "09:15", + "26652.0" + ], + [ + "09:19", + "24708.0" + ], + [ + "09:25", + "25776.0" + ], + [ + "09:30", + "31056.0" + ], + [ + "09:34", + "30900.0" + ], + [ + "09:40", + "29892.0" + ], + [ + "09:45", + "30420.0" + ], + [ + "09:49", + "31920.0" + ], + [ + "09:55", + "30036.0" + ], + [ + "10:00", + "30744.0" + ], + [ + "10:04", + "29892.0" + ], + [ + "10:10", + "30204.0" + ], + [ + "10:15", + "29652.0" + ], + [ + "10:19", + "29028.0" + ], + [ + "10:25", + "29520.0" + ], + [ + "10:30", + "32292.0" + ], + [ + "10:34", + "31920.0" + ], + [ + "10:40", + "33348.0" + ], + [ + "10:45", + "32724.0" + ], + [ + "10:49", + "33732.0" + ], + [ + "10:55", + "32868.0" + ], + [ + "11:00", + "28812.0" + ], + [ + "11:04", + "28536.0" + ], + [ + "11:10", + "27456.0" + ], + [ + "11:15", + "24876.0" + ], + [ + "11:19", + "27072.0" + ], + [ + "11:25", + "26196.0" + ], + [ + "11:30", + "21792.0" + ], + [ + "11:34", + "21456.0" + ], + [ + "11:40", + "21396.0" + ], + [ + "11:45", + "20136.0" + ], + [ + "11:49", + "20928.0" + ], + [ + "11:55", + "21864.0" + ], + [ + "12:00", + "15096.0" + ], + [ + "12:04", + "16140.0" + ], + [ + "12:10", + "15384.0" + ], + [ + "12:15", + "15780.0" + ], + [ + "12:19", + "16584.0" + ], + [ + "12:25", + "15648.0" + ], + [ + "12:30", + "16068.0" + ], + [ + "12:34", + "16116.0" + ], + [ + "12:40", + "15972.0" + ], + [ + "12:45", + "16296.0" + ], + [ + "12:49", + "15744.0" + ], + [ + "12:55", + "15996.0" + ], + [ + "13:00", + "16992.0" + ], + [ + "13:04", + "16452.0" + ], + [ + "13:10", + "17604.0" + ], + [ + "13:15", + "16284.0" + ], + [ + "13:19", + "18156.0" + ], + [ + "13:25", + "16704.0" + ], + [ + "13:30", + "18660.0" + ], + [ + "13:34", + "17928.0" + ], + [ + "13:40", + "18792.0" + ], + [ + "13:45", + "18696.0" + ], + [ + "13:49", + "17268.0" + ], + [ + "13:55", + "19020.0" + ], + [ + "14:00", + "21168.0" + ], + [ + "14:04", + "20640.0" + ], + [ + "14:10", + "22068.0" + ], + [ + "14:15", + "22296.0" + ], + [ + "14:19", + "20856.0" + ], + [ + "14:25", + "20712.0" + ], + [ + "14:30", + "26460.0" + ], + [ + "14:34", + "25584.0" + ], + [ + "14:40", + "26088.0" + ], + [ + "14:45", + "26484.0" + ], + [ + "14:49", + "26940.0" + ], + [ + "14:55", + "26316.0" + ], + [ + "15:00", + "31968.0" + ], + [ + "15:04", + "33252.0" + ], + [ + "15:10", + "32172.0" + ], + [ + "15:15", + "32292.0" + ], + [ + "15:19", + "35256.0" + ], + [ + "15:25", + "33372.0" + ], + [ + "15:30", + "33684.0" + ], + [ + "15:34", + "30936.0" + ], + [ + "15:40", + "30696.0" + ], + [ + "15:45", + "32172.0" + ], + [ + "15:49", + "31776.0" + ], + [ + "15:55", + "31632.0" + ], + [ + "16:00", + "37116.0" + ], + [ + "16:04", + "36048.0" + ], + [ + "16:10", + "35556.0" + ], + [ + "16:15", + "37332.0" + ], + [ + "16:19", + "37368.0" + ], + [ + "16:25", + "36084.0" + ], + [ + "16:30", + "29352.0" + ], + [ + "16:34", + "28788.0" + ], + [ + "16:40", + "29496.0" + ], + [ + "16:45", + "28788.0" + ], + [ + "16:49", + "28524.0" + ], + [ + "16:55", + "28668.0" + ], + [ + "17:00", + "30312.0" + ], + [ + "17:04", + "31200.0" + ], + [ + "17:10", + "30972.0" + ], + [ + "17:15", + "30672.0" + ], + [ + "17:19", + "33372.0" + ], + [ + "17:25", + "31992.0" + ], + [ + "17:30", + "32208.0" + ], + [ + "17:34", + "32028.0" + ], + [ + "17:40", + "31860.0" + ], + [ + "17:45", + "31884.0" + ], + [ + "17:49", + "33228.0" + ], + [ + "17:55", + "31548.0" + ], + [ + "18:00", + "30048.0" + ], + [ + "18:04", + "29748.0" + ], + [ + "18:10", + "28956.0" + ], + [ + "18:15", + "30600.0" + ], + [ + "18:19", + "29448.0" + ], + [ + "18:25", + "29436.0" + ], + [ + "18:30", + "27744.0" + ], + [ + "18:34", + "30096.0" + ], + [ + "18:40", + "29352.0" + ], + [ + "18:45", + "30852.0" + ], + [ + "18:49", + "30000.0" + ], + [ + "18:55", + "30432.0" + ], + [ + "19:00", + "30984.0" + ], + [ + "19:04", + "29964.0" + ], + [ + "19:10", + "29928.0" + ], + [ + "19:15", + "30216.0" + ], + [ + "19:19", + "30480.0" + ], + [ + "19:25", + "30708.0" + ], + [ + "19:30", + "25908.0" + ], + [ + "19:34", + "23904.0" + ], + [ + "19:40", + "24600.0" + ], + [ + "19:45", + "24708.0" + ], + [ + "19:49", + "25356.0" + ], + [ + "19:55", + "25608.0" + ], + [ + "20:00", + "24252.0" + ], + [ + "20:04", + "24900.0" + ], + [ + "20:10", + "24996.0" + ], + [ + "20:15", + "24876.0" + ], + [ + "20:19", + "23100.0" + ], + [ + "20:25", + "24492.0" + ], + [ + "20:30", + "20664.0" + ], + [ + "20:34", + "21024.0" + ], + [ + "20:40", + "21804.0" + ], + [ + "20:45", + "21600.0" + ], + [ + "20:49", + "20808.0" + ], + [ + "20:55", + "21108.0" + ], + [ + "21:00", + "22296.0" + ], + [ + "21:04", + "20544.0" + ], + [ + "21:10", + "22824.0" + ], + [ + "21:15", + "22932.0" + ], + [ + "21:19", + "21324.0" + ], + [ + "21:25", + "21672.0" + ], + [ + "21:30", + "14148.0" + ], + [ + "21:34", + "13632.0" + ], + [ + "21:40", + "14976.0" + ], + [ + "21:45", + "13572.0" + ], + [ + "21:49", + "12960.0" + ], + [ + "21:55", + "14328.0" + ], + [ + "22:00", + "11988.0" + ], + [ + "22:04", + "13128.0" + ], + [ + "22:10", + "12936.0" + ], + [ + "22:15", + "13116.0" + ], + [ + "22:19", + "12264.0" + ], + [ + "22:25", + "12888.0" + ], + [ + "22:30", + "9216.0" + ], + [ + "22:34", + "8052.0" + ], + [ + "22:40", + "8832.0" + ], + [ + "22:45", + "8448.0" + ], + [ + "22:49", + "8232.0" + ], + [ + "22:55", + "8808.0" + ], + [ + "23:00", + "9432.0" + ], + [ + "23:04", + "8592.0" + ], + [ + "23:10", + "9696.0" + ], + [ + "23:15", + "8844.0" + ], + [ + "23:19", + "8868.0" + ], + [ + "23:25", + "9396.0" + ], + [ + "23:30", + "6936.0" + ], + [ + "23:34", + "6696.0" + ], + [ + "23:40", + "6600.0" + ], + [ + "23:45", + "6420.0" + ], + [ + "23:49", + "6552.0" + ], + [ + "23:55", + "6972.0" + ], + [ + "00:00", + "3168.0" + ], + [ + "00:04", + "2364.0" + ], + [ + "00:10", + "2496.0" + ], + [ + "00:15", + "2328.0" + ], + [ + "00:19", + "2304.0" + ], + [ + "00:25", + "2184.0" + ], + [ + "00:30", + "1476.0" + ], + [ + "00:34", + "1392.0" + ], + [ + "00:40", + "1536.0" + ], + [ + "00:45", + "1476.0" + ], + [ + "00:49", + "1404.0" + ], + [ + "00:55", + "1440.0" + ], + [ + "01:00", + "984.0" + ], + [ + "01:04", + "1140.0" + ], + [ + "01:10", + "1176.0" + ], + [ + "01:15", + "1128.0" + ], + [ + "01:19", + "1164.0" + ], + [ + "01:25", + "1272.0" + ], + [ + "01:30", + "1188.0" + ], + [ + "01:34", + "1308.0" + ], + [ + "01:40", + "900.0" + ], + [ + "01:45", + "696.0" + ], + [ + "01:49", + "1044.0" + ], + [ + "01:55", + "1152.0" + ], + [ + "02:00", + "996.0" + ], + [ + "02:04", + "924.0" + ], + [ + "02:10", + "696.0" + ], + [ + "02:15", + "696.0" + ], + [ + "02:19", + "912.0" + ], + [ + "02:25", + "828.0" + ], + [ + "02:30", + "708.0" + ], + [ + "02:34", + "876.0" + ], + [ + "02:40", + "840.0" + ], + [ + "02:45", + "828.0" + ], + [ + "02:49", + "744.0" + ], + [ + "02:55", + "792.0" + ], + [ + "03:00", + "120.0" + ], + [ + "03:04", + "36.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:15", + "24.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:25", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:34", + "12.0" + ], + [ + "03:40", + "12.0" + ], + [ + "03:45", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "03:55", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:04", + "12.0" + ], + [ + "04:10", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25, + 23.333333333333332, + 23.416666666666668, + 23.5, + 23.583333333333332, + 23.666666666666668, + 23.75, + 23.833333333333332, + 23.916666666666668, + 24, + 24.083333333333332, + 24.166666666666668, + 24.25, + 24.333333333333332, + 24.416666666666668, + 24.5, + 24.583333333333332, + 24.666666666666668, + 24.75, + 24.833333333333332, + 24.916666666666668, + 25, + 25.083333333333332, + 25.166666666666668 + ], + "y": [ + 372, + 828, + 624, + 516, + 348, + 588, + 612, + 588, + 768, + 504, + 744, + 588, + 636, + 852, + 840, + 804, + 732, + 936, + 1104, + 852, + 948, + 1044, + 1164, + 1152, + 1992, + 2196, + 2712, + 2400, + 2364, + 2592, + 3600, + 4644, + 3432, + 3084, + 4080, + 3792, + 6228, + 6372, + 7128, + 6696, + 7020, + 8004, + 15420, + 16140, + 16656, + 17424, + 16740, + 16764, + 24312, + 24072, + 24576, + 24240, + 24384, + 24948, + 29172, + 30636, + 29868, + 29604, + 29244, + 29256, + 27612, + 28488, + 27720, + 28008, + 27840, + 28308, + 26532, + 25932, + 25968, + 25080, + 27048, + 26172, + 25836, + 25500, + 25740, + 26652, + 24708, + 25776, + 31056, + 30900, + 29892, + 30420, + 31920, + 30036, + 30744, + 29892, + 30204, + 29652, + 29028, + 29520, + 32292, + 31920, + 33348, + 32724, + 33732, + 32868, + 28812, + 28536, + 27456, + 24876, + 27072, + 26196, + 21792, + 21456, + 21396, + 20136, + 20928, + 21864, + 15096, + 16140, + 15384, + 15780, + 16584, + 15648, + 16068, + 16116, + 15972, + 16296, + 15744, + 15996, + 16992, + 16452, + 17604, + 16284, + 18156, + 16704, + 18660, + 17928, + 18792, + 18696, + 17268, + 19020, + 21168, + 20640, + 22068, + 22296, + 20856, + 20712, + 26460, + 25584, + 26088, + 26484, + 26940, + 26316, + 31968, + 33252, + 32172, + 32292, + 35256, + 33372, + 33684, + 30936, + 30696, + 32172, + 31776, + 31632, + 37116, + 36048, + 35556, + 37332, + 37368, + 36084, + 29352, + 28788, + 29496, + 28788, + 28524, + 28668, + 30312, + 31200, + 30972, + 30672, + 33372, + 31992, + 32208, + 32028, + 31860, + 31884, + 33228, + 31548, + 30048, + 29748, + 28956, + 30600, + 29448, + 29436, + 27744, + 30096, + 29352, + 30852, + 30000, + 30432, + 30984, + 29964, + 29928, + 30216, + 30480, + 30708, + 25908, + 23904, + 24600, + 24708, + 25356, + 25608, + 24252, + 24900, + 24996, + 24876, + 23100, + 24492, + 20664, + 21024, + 21804, + 21600, + 20808, + 21108, + 22296, + 20544, + 22824, + 22932, + 21324, + 21672, + 14148, + 13632, + 14976, + 13572, + 12960, + 14328, + 11988, + 13128, + 12936, + 13116, + 12264, + 12888, + 9216, + 8052, + 8832, + 8448, + 8232, + 8808, + 9432, + 8592, + 9696, + 8844, + 8868, + 9396, + 6936, + 6696, + 6600, + 6420, + 6552, + 6972, + 3168, + 2364, + 2496, + 2328, + 2304, + 2184, + 1476, + 1392, + 1536, + 1476, + 1404, + 1440, + 984, + 1140, + 1176, + 1128, + 1164, + 1272, + 1188, + 1308, + 900, + 696, + 1044, + 1152, + 996, + 924, + 696, + 696, + 912, + 828, + 708, + 876, + 840, + 828, + 744, + 792, + 120, + 36, + 12, + 24, + 0, + 0, + 0, + 12, + 12, + 0, + 0, + 0, + 0, + 12, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "640.0" + ], + [ + "03:15", + "504.0" + ], + [ + "03:30", + "680.0" + ], + [ + "03:45", + "616.0" + ], + [ + "04:00", + "820.0" + ], + [ + "04:15", + "812.0" + ], + [ + "04:30", + "1024.0" + ], + [ + "04:45", + "1136.0" + ], + [ + "05:00", + "2464.0" + ], + [ + "05:15", + "2448.0" + ], + [ + "05:30", + "3976.0" + ], + [ + "05:45", + "3620.0" + ], + [ + "06:00", + "6964.0" + ], + [ + "06:15", + "7128.0" + ], + [ + "06:30", + "16296.0" + ], + [ + "06:45", + "17148.0" + ], + [ + "07:00", + "24172.0" + ], + [ + "07:15", + "24888.0" + ], + [ + "07:30", + "29916.0" + ], + [ + "07:45", + "29056.0" + ], + [ + "08:00", + "27964.0" + ], + [ + "08:15", + "28076.0" + ], + [ + "08:30", + "25880.0" + ], + [ + "08:45", + "26152.0" + ], + [ + "09:00", + "25728.0" + ], + [ + "09:15", + "26012.0" + ], + [ + "09:30", + "30988.0" + ], + [ + "09:45", + "30924.0" + ], + [ + "10:00", + "29836.0" + ], + [ + "10:15", + "29528.0" + ], + [ + "10:30", + "32828.0" + ], + [ + "10:45", + "33132.0" + ], + [ + "11:00", + "27376.0" + ], + [ + "11:15", + "25996.0" + ], + [ + "11:30", + "21228.0" + ], + [ + "11:45", + "21004.0" + ], + [ + "12:00", + "15260.0" + ], + [ + "12:15", + "16116.0" + ], + [ + "12:30", + "16040.0" + ], + [ + "12:45", + "16084.0" + ], + [ + "13:00", + "16824.0" + ], + [ + "13:15", + "17068.0" + ], + [ + "13:30", + "18652.0" + ], + [ + "13:45", + "18292.0" + ], + [ + "14:00", + "21460.0" + ], + [ + "14:15", + "20880.0" + ], + [ + "14:30", + "26248.0" + ], + [ + "14:45", + "26348.0" + ], + [ + "15:00", + "32792.0" + ], + [ + "15:15", + "33568.0" + ], + [ + "15:30", + "31160.0" + ], + [ + "15:45", + "31916.0" + ], + [ + "16:00", + "36316.0" + ], + [ + "16:15", + "36856.0" + ], + [ + "16:30", + "28100.0" + ], + [ + "16:45", + "28424.0" + ], + [ + "17:00", + "31336.0" + ], + [ + "17:15", + "31388.0" + ], + [ + "17:30", + "31724.0" + ], + [ + "17:45", + "31920.0" + ], + [ + "18:00", + "28948.0" + ], + [ + "18:15", + "29528.0" + ], + [ + "18:30", + "28788.0" + ], + [ + "18:45", + "30228.0" + ], + [ + "19:00", + "30088.0" + ], + [ + "19:15", + "30272.0" + ], + [ + "19:30", + "24284.0" + ], + [ + "19:45", + "25120.0" + ], + [ + "20:00", + "24648.0" + ], + [ + "20:15", + "23948.0" + ], + [ + "20:30", + "20876.0" + ], + [ + "20:45", + "21184.0" + ], + [ + "21:00", + "21948.0" + ], + [ + "21:15", + "21920.0" + ], + [ + "21:30", + "13984.0" + ], + [ + "21:45", + "13872.0" + ], + [ + "22:00", + "12448.0" + ], + [ + "22:15", + "12888.0" + ], + [ + "22:30", + "8604.0" + ], + [ + "22:45", + "8660.0" + ], + [ + "23:00", + "9256.0" + ], + [ + "23:15", + "9088.0" + ], + [ + "23:30", + "6652.0" + ], + [ + "23:45", + "6988.0" + ], + [ + "00:00", + "2344.0" + ], + [ + "00:15", + "2308.0" + ], + [ + "00:30", + "1460.0" + ], + [ + "00:45", + "1492.0" + ], + [ + "01:00", + "1200.0" + ], + [ + "01:15", + "1272.0" + ], + [ + "01:30", + "1136.0" + ], + [ + "01:45", + "1032.0" + ], + [ + "02:00", + "880.0" + ], + [ + "02:15", + "836.0" + ], + [ + "02:30", + "808.0" + ], + [ + "02:45", + "844.0" + ], + [ + "03:00", + "24.0" + ], + [ + "03:15", + "8.0" + ], + [ + "03:30", + "4.0" + ], + [ + "03:45", + "4.0" + ], + [ + "04:00", + "20.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25, + 23.5, + 23.75, + 24, + 24.25, + 24.5, + 24.75, + 25 + ], + "y": [ + 640, + 504, + 680, + 616, + 820, + 812, + 1024, + 1136, + 2464, + 2448, + 3976, + 3620, + 6964, + 7128, + 16296, + 17148, + 24172, + 24888, + 29916, + 29056, + 27964, + 28076, + 25880, + 26152, + 25728, + 26012, + 30988, + 30924, + 29836, + 29528, + 32828, + 33132, + 27376, + 25996, + 21228, + 21004, + 15260, + 16116, + 16040, + 16084, + 16824, + 17068, + 18652, + 18292, + 21460, + 20880, + 26248, + 26348, + 32792, + 33568, + 31160, + 31916, + 36316, + 36856, + 28100, + 28424, + 31336, + 31388, + 31724, + 31920, + 28948, + 29528, + 28788, + 30228, + 30088, + 30272, + 24284, + 25120, + 24648, + 23948, + 20876, + 21184, + 21948, + 21920, + 13984, + 13872, + 12448, + 12888, + 8604, + 8660, + 9256, + 9088, + 6652, + 6988, + 2344, + 2308, + 1460, + 1492, + 1200, + 1272, + 1136, + 1032, + 880, + 836, + 808, + 844, + 24, + 8, + 4, + 4, + 20 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC trips (normalized to trips/hour) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "786.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "864.0" + ], + [ + "04:30", + "990.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1176.0" + ], + [ + "05:00", + "2154.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3384.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6480.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7440.0" + ], + [ + "06:30", + "16296.0" + ], + [ + "06:40", + "16722.0" + ], + [ + "06:49", + "17016.0" + ], + [ + "07:00", + "24396.0" + ], + [ + "07:10", + "24486.0" + ], + [ + "07:19", + "24936.0" + ], + [ + "07:30", + "29712.0" + ], + [ + "07:40", + "29790.0" + ], + [ + "07:49", + "29160.0" + ], + [ + "08:00", + "27996.0" + ], + [ + "08:10", + "27528.0" + ], + [ + "08:19", + "28596.0" + ], + [ + "08:30", + "25830.0" + ], + [ + "08:40", + "25776.0" + ], + [ + "08:49", + "26508.0" + ], + [ + "09:00", + "25680.0" + ], + [ + "09:10", + "26220.0" + ], + [ + "09:19", + "25602.0" + ], + [ + "09:30", + "30732.0" + ], + [ + "09:40", + "30474.0" + ], + [ + "09:49", + "31008.0" + ], + [ + "10:00", + "30210.0" + ], + [ + "10:10", + "30048.0" + ], + [ + "10:19", + "29256.0" + ], + [ + "10:30", + "32334.0" + ], + [ + "10:40", + "33186.0" + ], + [ + "10:49", + "33054.0" + ], + [ + "11:00", + "28254.0" + ], + [ + "11:10", + "25770.0" + ], + [ + "11:19", + "26694.0" + ], + [ + "11:30", + "21366.0" + ], + [ + "11:40", + "20658.0" + ], + [ + "11:49", + "21486.0" + ], + [ + "12:00", + "15354.0" + ], + [ + "12:10", + "15534.0" + ], + [ + "12:19", + "16260.0" + ], + [ + "12:30", + "15834.0" + ], + [ + "12:40", + "16224.0" + ], + [ + "12:49", + "15732.0" + ], + [ + "13:00", + "16938.0" + ], + [ + "13:10", + "16782.0" + ], + [ + "13:19", + "17430.0" + ], + [ + "13:30", + "18186.0" + ], + [ + "13:40", + "18618.0" + ], + [ + "13:49", + "18432.0" + ], + [ + "14:00", + "21084.0" + ], + [ + "14:10", + "21834.0" + ], + [ + "14:19", + "20808.0" + ], + [ + "14:30", + "26136.0" + ], + [ + "14:40", + "26226.0" + ], + [ + "14:49", + "26538.0" + ], + [ + "15:00", + "32988.0" + ], + [ + "15:10", + "32244.0" + ], + [ + "15:19", + "34296.0" + ], + [ + "15:30", + "32052.0" + ], + [ + "15:40", + "31014.0" + ], + [ + "15:49", + "31884.0" + ], + [ + "16:00", + "36690.0" + ], + [ + "16:10", + "36420.0" + ], + [ + "16:19", + "36420.0" + ], + [ + "16:30", + "28092.0" + ], + [ + "16:40", + "28866.0" + ], + [ + "16:49", + "28620.0" + ], + [ + "17:00", + "31218.0" + ], + [ + "17:10", + "30618.0" + ], + [ + "17:19", + "31866.0" + ], + [ + "17:30", + "32112.0" + ], + [ + "17:40", + "31824.0" + ], + [ + "17:49", + "32040.0" + ], + [ + "18:00", + "29592.0" + ], + [ + "18:10", + "29544.0" + ], + [ + "18:19", + "29412.0" + ], + [ + "18:30", + "28740.0" + ], + [ + "18:40", + "30060.0" + ], + [ + "18:49", + "30138.0" + ], + [ + "19:00", + "30312.0" + ], + [ + "19:10", + "30048.0" + ], + [ + "19:19", + "30498.0" + ], + [ + "19:30", + "24486.0" + ], + [ + "19:40", + "24588.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24486.0" + ], + [ + "20:10", + "24750.0" + ], + [ + "20:19", + "24216.0" + ], + [ + "20:30", + "20298.0" + ], + [ + "20:40", + "21474.0" + ], + [ + "20:49", + "21396.0" + ], + [ + "21:00", + "21270.0" + ], + [ + "21:10", + "23052.0" + ], + [ + "21:19", + "21462.0" + ], + [ + "21:30", + "13836.0" + ], + [ + "21:40", + "14346.0" + ], + [ + "21:49", + "13614.0" + ], + [ + "22:00", + "12006.0" + ], + [ + "22:10", + "13608.0" + ], + [ + "22:19", + "12732.0" + ], + [ + "22:30", + "8760.0" + ], + [ + "22:40", + "8364.0" + ], + [ + "22:49", + "8340.0" + ], + [ + "23:00", + "9390.0" + ], + [ + "23:10", + "9264.0" + ], + [ + "23:19", + "8982.0" + ], + [ + "23:30", + "6834.0" + ], + [ + "23:40", + "6570.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2382.0" + ], + [ + "00:19", + "2346.0" + ], + [ + "00:30", + "1416.0" + ], + [ + "00:40", + "1506.0" + ], + [ + "00:49", + "1470.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1206.0" + ], + [ + "01:19", + "1278.0" + ], + [ + "01:30", + "1260.0" + ], + [ + "01:40", + "858.0" + ], + [ + "01:49", + "1086.0" + ], + [ + "02:00", + "984.0" + ], + [ + "02:10", + "738.0" + ], + [ + "02:19", + "906.0" + ], + [ + "02:30", + "780.0" + ], + [ + "02:40", + "846.0" + ], + [ + "02:49", + "816.0" + ], + [ + "03:00", + "54.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 786, + 762, + 864, + 990, + 1008, + 1176, + 2154, + 2592, + 2544, + 4086, + 3384, + 3912, + 6480, + 6798, + 7440, + 16296, + 16722, + 17016, + 24396, + 24486, + 24936, + 29712, + 29790, + 29160, + 27996, + 27528, + 28596, + 25830, + 25776, + 26508, + 25680, + 26220, + 25602, + 30732, + 30474, + 31008, + 30210, + 30048, + 29256, + 32334, + 33186, + 33054, + 28254, + 25770, + 26694, + 21366, + 20658, + 21486, + 15354, + 15534, + 16260, + 15834, + 16224, + 15732, + 16938, + 16782, + 17430, + 18186, + 18618, + 18432, + 21084, + 21834, + 20808, + 26136, + 26226, + 26538, + 32988, + 32244, + 34296, + 32052, + 31014, + 31884, + 36690, + 36420, + 36420, + 28092, + 28866, + 28620, + 31218, + 30618, + 31866, + 32112, + 31824, + 32040, + 29592, + 29544, + 29412, + 28740, + 30060, + 30138, + 30312, + 30048, + 30498, + 24486, + 24588, + 25842, + 24486, + 24750, + 24216, + 20298, + 21474, + 21396, + 21270, + 23052, + 21462, + 13836, + 14346, + 13614, + 12006, + 13608, + 12732, + 8760, + 8364, + 8340, + 9390, + 9264, + 8982, + 6834, + 6570, + 6972, + 2526, + 2382, + 2346, + 1416, + 1506, + 1470, + 1068, + 1206, + 1278, + 1260, + 858, + 1086, + 984, + 738, + 906, + 780, + 846, + 816, + 54, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "792.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "852.0" + ], + [ + "04:30", + "996.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1182.0" + ], + [ + "05:00", + "2148.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3390.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6468.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7482.0" + ], + [ + "06:30", + "16278.0" + ], + [ + "06:40", + "16716.0" + ], + [ + "06:49", + "17106.0" + ], + [ + "07:00", + "24408.0" + ], + [ + "07:10", + "24432.0" + ], + [ + "07:19", + "24834.0" + ], + [ + "07:30", + "29832.0" + ], + [ + "07:40", + "29700.0" + ], + [ + "07:49", + "29226.0" + ], + [ + "08:00", + "28008.0" + ], + [ + "08:10", + "27474.0" + ], + [ + "08:19", + "28620.0" + ], + [ + "08:30", + "25764.0" + ], + [ + "08:40", + "25824.0" + ], + [ + "08:49", + "26538.0" + ], + [ + "09:00", + "25734.0" + ], + [ + "09:10", + "26058.0" + ], + [ + "09:19", + "25686.0" + ], + [ + "09:30", + "30672.0" + ], + [ + "09:40", + "30594.0" + ], + [ + "09:49", + "30960.0" + ], + [ + "10:00", + "30270.0" + ], + [ + "10:10", + "29964.0" + ], + [ + "10:19", + "29184.0" + ], + [ + "10:30", + "32436.0" + ], + [ + "10:40", + "33222.0" + ], + [ + "10:49", + "33018.0" + ], + [ + "11:00", + "28260.0" + ], + [ + "11:10", + "25716.0" + ], + [ + "11:19", + "26742.0" + ], + [ + "11:30", + "21378.0" + ], + [ + "11:40", + "20652.0" + ], + [ + "11:49", + "21420.0" + ], + [ + "12:00", + "15438.0" + ], + [ + "12:10", + "15528.0" + ], + [ + "12:19", + "16236.0" + ], + [ + "12:30", + "15822.0" + ], + [ + "12:40", + "16206.0" + ], + [ + "12:49", + "15726.0" + ], + [ + "13:00", + "16944.0" + ], + [ + "13:10", + "16830.0" + ], + [ + "13:19", + "17370.0" + ], + [ + "13:30", + "18246.0" + ], + [ + "13:40", + "18666.0" + ], + [ + "13:49", + "18378.0" + ], + [ + "14:00", + "21108.0" + ], + [ + "14:10", + "21882.0" + ], + [ + "14:19", + "20724.0" + ], + [ + "14:30", + "26220.0" + ], + [ + "14:40", + "26184.0" + ], + [ + "14:49", + "26460.0" + ], + [ + "15:00", + "33030.0" + ], + [ + "15:10", + "32310.0" + ], + [ + "15:19", + "34248.0" + ], + [ + "15:30", + "31980.0" + ], + [ + "15:40", + "31050.0" + ], + [ + "15:49", + "31926.0" + ], + [ + "16:00", + "36702.0" + ], + [ + "16:10", + "36366.0" + ], + [ + "16:19", + "36402.0" + ], + [ + "16:30", + "28128.0" + ], + [ + "16:40", + "28914.0" + ], + [ + "16:49", + "28716.0" + ], + [ + "17:00", + "31104.0" + ], + [ + "17:10", + "30612.0" + ], + [ + "17:19", + "31782.0" + ], + [ + "17:30", + "32244.0" + ], + [ + "17:40", + "31890.0" + ], + [ + "17:49", + "31872.0" + ], + [ + "18:00", + "29688.0" + ], + [ + "18:10", + "29610.0" + ], + [ + "18:19", + "29352.0" + ], + [ + "18:30", + "28662.0" + ], + [ + "18:40", + "30048.0" + ], + [ + "18:49", + "30018.0" + ], + [ + "19:00", + "30228.0" + ], + [ + "19:10", + "30162.0" + ], + [ + "19:19", + "30432.0" + ], + [ + "19:30", + "24402.0" + ], + [ + "19:40", + "24600.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24510.0" + ], + [ + "20:10", + "24666.0" + ], + [ + "20:19", + "24276.0" + ], + [ + "20:30", + "20532.0" + ], + [ + "20:40", + "21534.0" + ], + [ + "20:49", + "21264.0" + ], + [ + "21:00", + "21354.0" + ], + [ + "21:10", + "23112.0" + ], + [ + "21:19", + "21582.0" + ], + [ + "21:30", + "13794.0" + ], + [ + "21:40", + "14340.0" + ], + [ + "21:49", + "13614.0" + ], + [ + "22:00", + "11964.0" + ], + [ + "22:10", + "13674.0" + ], + [ + "22:19", + "12732.0" + ], + [ + "22:30", + "8640.0" + ], + [ + "22:40", + "8424.0" + ], + [ + "22:49", + "8322.0" + ], + [ + "23:00", + "9426.0" + ], + [ + "23:10", + "9198.0" + ], + [ + "23:19", + "9000.0" + ], + [ + "23:30", + "6792.0" + ], + [ + "23:40", + "6612.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2418.0" + ], + [ + "00:19", + "2316.0" + ], + [ + "00:30", + "1440.0" + ], + [ + "00:40", + "1500.0" + ], + [ + "00:49", + "1482.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1206.0" + ], + [ + "01:19", + "1266.0" + ], + [ + "01:30", + "1248.0" + ], + [ + "01:40", + "858.0" + ], + [ + "01:49", + "1098.0" + ], + [ + "02:00", + "960.0" + ], + [ + "02:10", + "726.0" + ], + [ + "02:19", + "858.0" + ], + [ + "02:30", + "804.0" + ], + [ + "02:40", + "864.0" + ], + [ + "02:49", + "810.0" + ], + [ + "03:00", + "42.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 792, + 762, + 852, + 996, + 1008, + 1182, + 2148, + 2592, + 2544, + 4086, + 3390, + 3912, + 6468, + 6798, + 7482, + 16278, + 16716, + 17106, + 24408, + 24432, + 24834, + 29832, + 29700, + 29226, + 28008, + 27474, + 28620, + 25764, + 25824, + 26538, + 25734, + 26058, + 25686, + 30672, + 30594, + 30960, + 30270, + 29964, + 29184, + 32436, + 33222, + 33018, + 28260, + 25716, + 26742, + 21378, + 20652, + 21420, + 15438, + 15528, + 16236, + 15822, + 16206, + 15726, + 16944, + 16830, + 17370, + 18246, + 18666, + 18378, + 21108, + 21882, + 20724, + 26220, + 26184, + 26460, + 33030, + 32310, + 34248, + 31980, + 31050, + 31926, + 36702, + 36366, + 36402, + 28128, + 28914, + 28716, + 31104, + 30612, + 31782, + 32244, + 31890, + 31872, + 29688, + 29610, + 29352, + 28662, + 30048, + 30018, + 30228, + 30162, + 30432, + 24402, + 24600, + 25842, + 24510, + 24666, + 24276, + 20532, + 21534, + 21264, + 21354, + 23112, + 21582, + 13794, + 14340, + 13614, + 11964, + 13674, + 12732, + 8640, + 8424, + 8322, + 9426, + 9198, + 9000, + 6792, + 6612, + 6972, + 2526, + 2418, + 2316, + 1440, + 1500, + 1482, + 1068, + 1206, + 1266, + 1248, + 858, + 1098, + 960, + 726, + 858, + 804, + 864, + 810, + 42, + 6, + 0, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "792.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "852.0" + ], + [ + "04:30", + "996.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1182.0" + ], + [ + "05:00", + "2148.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3390.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6468.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7482.0" + ], + [ + "06:30", + "16254.0" + ], + [ + "06:40", + "16722.0" + ], + [ + "06:49", + "17118.0" + ], + [ + "07:00", + "24384.0" + ], + [ + "07:10", + "24450.0" + ], + [ + "07:19", + "24852.0" + ], + [ + "07:30", + "29772.0" + ], + [ + "07:40", + "29712.0" + ], + [ + "07:49", + "29322.0" + ], + [ + "08:00", + "27960.0" + ], + [ + "08:10", + "27504.0" + ], + [ + "08:19", + "28560.0" + ], + [ + "08:30", + "25818.0" + ], + [ + "08:40", + "25830.0" + ], + [ + "08:49", + "26484.0" + ], + [ + "09:00", + "25698.0" + ], + [ + "09:10", + "26130.0" + ], + [ + "09:19", + "25662.0" + ], + [ + "09:30", + "30666.0" + ], + [ + "09:40", + "30576.0" + ], + [ + "09:49", + "30924.0" + ], + [ + "10:00", + "30264.0" + ], + [ + "10:10", + "30054.0" + ], + [ + "10:19", + "29172.0" + ], + [ + "10:30", + "32430.0" + ], + [ + "10:40", + "33138.0" + ], + [ + "10:49", + "33072.0" + ], + [ + "11:00", + "28302.0" + ], + [ + "11:10", + "25704.0" + ], + [ + "11:19", + "26748.0" + ], + [ + "11:30", + "21372.0" + ], + [ + "11:40", + "20634.0" + ], + [ + "11:49", + "21462.0" + ], + [ + "12:00", + "15378.0" + ], + [ + "12:10", + "15546.0" + ], + [ + "12:19", + "16224.0" + ], + [ + "12:30", + "15852.0" + ], + [ + "12:40", + "16206.0" + ], + [ + "12:49", + "15708.0" + ], + [ + "13:00", + "16968.0" + ], + [ + "13:10", + "16800.0" + ], + [ + "13:19", + "17382.0" + ], + [ + "13:30", + "18252.0" + ], + [ + "13:40", + "18648.0" + ], + [ + "13:49", + "18372.0" + ], + [ + "14:00", + "21102.0" + ], + [ + "14:10", + "21834.0" + ], + [ + "14:19", + "20790.0" + ], + [ + "14:30", + "26142.0" + ], + [ + "14:40", + "26262.0" + ], + [ + "14:49", + "26490.0" + ], + [ + "15:00", + "32994.0" + ], + [ + "15:10", + "32298.0" + ], + [ + "15:19", + "34188.0" + ], + [ + "15:30", + "32028.0" + ], + [ + "15:40", + "31080.0" + ], + [ + "15:49", + "31890.0" + ], + [ + "16:00", + "36768.0" + ], + [ + "16:10", + "36408.0" + ], + [ + "16:19", + "36366.0" + ], + [ + "16:30", + "28224.0" + ], + [ + "16:40", + "28920.0" + ], + [ + "16:49", + "28668.0" + ], + [ + "17:00", + "31122.0" + ], + [ + "17:10", + "30630.0" + ], + [ + "17:19", + "31872.0" + ], + [ + "17:30", + "32268.0" + ], + [ + "17:40", + "31782.0" + ], + [ + "17:49", + "32172.0" + ], + [ + "18:00", + "29538.0" + ], + [ + "18:10", + "29538.0" + ], + [ + "18:19", + "29340.0" + ], + [ + "18:30", + "28686.0" + ], + [ + "18:40", + "30006.0" + ], + [ + "18:49", + "30000.0" + ], + [ + "19:00", + "30318.0" + ], + [ + "19:10", + "30162.0" + ], + [ + "19:19", + "30408.0" + ], + [ + "19:30", + "24438.0" + ], + [ + "19:40", + "24558.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24450.0" + ], + [ + "20:10", + "24672.0" + ], + [ + "20:19", + "24306.0" + ], + [ + "20:30", + "20400.0" + ], + [ + "20:40", + "21552.0" + ], + [ + "20:49", + "21312.0" + ], + [ + "21:00", + "21330.0" + ], + [ + "21:10", + "22968.0" + ], + [ + "21:19", + "21636.0" + ], + [ + "21:30", + "13752.0" + ], + [ + "21:40", + "14304.0" + ], + [ + "21:49", + "13620.0" + ], + [ + "22:00", + "11874.0" + ], + [ + "22:10", + "13710.0" + ], + [ + "22:19", + "12720.0" + ], + [ + "22:30", + "8700.0" + ], + [ + "22:40", + "8382.0" + ], + [ + "22:49", + "8370.0" + ], + [ + "23:00", + "9390.0" + ], + [ + "23:10", + "9330.0" + ], + [ + "23:19", + "8970.0" + ], + [ + "23:30", + "6840.0" + ], + [ + "23:40", + "6558.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2556.0" + ], + [ + "00:10", + "2388.0" + ], + [ + "00:19", + "2316.0" + ], + [ + "00:30", + "1386.0" + ], + [ + "00:40", + "1506.0" + ], + [ + "00:49", + "1464.0" + ], + [ + "01:00", + "1074.0" + ], + [ + "01:10", + "1218.0" + ], + [ + "01:19", + "1278.0" + ], + [ + "01:30", + "1254.0" + ], + [ + "01:40", + "840.0" + ], + [ + "01:49", + "1116.0" + ], + [ + "02:00", + "960.0" + ], + [ + "02:10", + "702.0" + ], + [ + "02:19", + "870.0" + ], + [ + "02:30", + "780.0" + ], + [ + "02:40", + "852.0" + ], + [ + "02:49", + "822.0" + ], + [ + "03:00", + "48.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "12.0" + ], + [ + "04:00", + "18.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 792, + 762, + 852, + 996, + 1008, + 1182, + 2148, + 2592, + 2544, + 4086, + 3390, + 3912, + 6468, + 6798, + 7482, + 16254, + 16722, + 17118, + 24384, + 24450, + 24852, + 29772, + 29712, + 29322, + 27960, + 27504, + 28560, + 25818, + 25830, + 26484, + 25698, + 26130, + 25662, + 30666, + 30576, + 30924, + 30264, + 30054, + 29172, + 32430, + 33138, + 33072, + 28302, + 25704, + 26748, + 21372, + 20634, + 21462, + 15378, + 15546, + 16224, + 15852, + 16206, + 15708, + 16968, + 16800, + 17382, + 18252, + 18648, + 18372, + 21102, + 21834, + 20790, + 26142, + 26262, + 26490, + 32994, + 32298, + 34188, + 32028, + 31080, + 31890, + 36768, + 36408, + 36366, + 28224, + 28920, + 28668, + 31122, + 30630, + 31872, + 32268, + 31782, + 32172, + 29538, + 29538, + 29340, + 28686, + 30006, + 30000, + 30318, + 30162, + 30408, + 24438, + 24558, + 25842, + 24450, + 24672, + 24306, + 20400, + 21552, + 21312, + 21330, + 22968, + 21636, + 13752, + 14304, + 13620, + 11874, + 13710, + 12720, + 8700, + 8382, + 8370, + 9390, + 9330, + 8970, + 6840, + 6558, + 6972, + 2556, + 2388, + 2316, + 1386, + 1506, + 1464, + 1074, + 1218, + 1278, + 1254, + 840, + 1116, + 960, + 702, + 870, + 780, + 852, + 822, + 48, + 6, + 6, + 6, + 0, + 12, + 18, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "786.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "864.0" + ], + [ + "04:30", + "990.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1176.0" + ], + [ + "05:00", + "2154.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3384.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6480.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7446.0" + ], + [ + "06:30", + "16272.0" + ], + [ + "06:40", + "16740.0" + ], + [ + "06:49", + "16974.0" + ], + [ + "07:00", + "24444.0" + ], + [ + "07:10", + "24390.0" + ], + [ + "07:19", + "25026.0" + ], + [ + "07:30", + "29706.0" + ], + [ + "07:40", + "29790.0" + ], + [ + "07:49", + "29148.0" + ], + [ + "08:00", + "28044.0" + ], + [ + "08:10", + "27462.0" + ], + [ + "08:19", + "28590.0" + ], + [ + "08:30", + "25800.0" + ], + [ + "08:40", + "25806.0" + ], + [ + "08:49", + "26520.0" + ], + [ + "09:00", + "25722.0" + ], + [ + "09:10", + "26178.0" + ], + [ + "09:19", + "25620.0" + ], + [ + "09:30", + "30672.0" + ], + [ + "09:40", + "30516.0" + ], + [ + "09:49", + "30936.0" + ], + [ + "10:00", + "30288.0" + ], + [ + "10:10", + "30042.0" + ], + [ + "10:19", + "29226.0" + ], + [ + "10:30", + "32322.0" + ], + [ + "10:40", + "33276.0" + ], + [ + "10:49", + "33000.0" + ], + [ + "11:00", + "28284.0" + ], + [ + "11:10", + "25734.0" + ], + [ + "11:19", + "26712.0" + ], + [ + "11:30", + "21396.0" + ], + [ + "11:40", + "20646.0" + ], + [ + "11:49", + "21450.0" + ], + [ + "12:00", + "15366.0" + ], + [ + "12:10", + "15570.0" + ], + [ + "12:19", + "16218.0" + ], + [ + "12:30", + "15846.0" + ], + [ + "12:40", + "16230.0" + ], + [ + "12:49", + "15714.0" + ], + [ + "13:00", + "16938.0" + ], + [ + "13:10", + "16758.0" + ], + [ + "13:19", + "17460.0" + ], + [ + "13:30", + "18264.0" + ], + [ + "13:40", + "18576.0" + ], + [ + "13:49", + "18420.0" + ], + [ + "14:00", + "21120.0" + ], + [ + "14:10", + "21810.0" + ], + [ + "14:19", + "20790.0" + ], + [ + "14:30", + "26160.0" + ], + [ + "14:40", + "26220.0" + ], + [ + "14:49", + "26544.0" + ], + [ + "15:00", + "32958.0" + ], + [ + "15:10", + "32286.0" + ], + [ + "15:19", + "34146.0" + ], + [ + "15:30", + "32076.0" + ], + [ + "15:40", + "31008.0" + ], + [ + "15:49", + "31962.0" + ], + [ + "16:00", + "36780.0" + ], + [ + "16:10", + "36342.0" + ], + [ + "16:19", + "36426.0" + ], + [ + "16:30", + "28206.0" + ], + [ + "16:40", + "28872.0" + ], + [ + "16:49", + "28692.0" + ], + [ + "17:00", + "31260.0" + ], + [ + "17:10", + "30540.0" + ], + [ + "17:19", + "31950.0" + ], + [ + "17:30", + "32124.0" + ], + [ + "17:40", + "31866.0" + ], + [ + "17:49", + "32016.0" + ], + [ + "18:00", + "29574.0" + ], + [ + "18:10", + "29616.0" + ], + [ + "18:19", + "29358.0" + ], + [ + "18:30", + "28614.0" + ], + [ + "18:40", + "30126.0" + ], + [ + "18:49", + "30030.0" + ], + [ + "19:00", + "30222.0" + ], + [ + "19:10", + "30102.0" + ], + [ + "19:19", + "30426.0" + ], + [ + "19:30", + "24408.0" + ], + [ + "19:40", + "24546.0" + ], + [ + "19:49", + "25740.0" + ], + [ + "20:00", + "24612.0" + ], + [ + "20:10", + "24534.0" + ], + [ + "20:19", + "24420.0" + ], + [ + "20:30", + "20448.0" + ], + [ + "20:40", + "21624.0" + ], + [ + "20:49", + "21456.0" + ], + [ + "21:00", + "21390.0" + ], + [ + "21:10", + "23034.0" + ], + [ + "21:19", + "21690.0" + ], + [ + "21:30", + "13782.0" + ], + [ + "21:40", + "14286.0" + ], + [ + "21:49", + "13716.0" + ], + [ + "22:00", + "12030.0" + ], + [ + "22:10", + "13566.0" + ], + [ + "22:19", + "12786.0" + ], + [ + "22:30", + "8586.0" + ], + [ + "22:40", + "8388.0" + ], + [ + "22:49", + "8256.0" + ], + [ + "23:00", + "9504.0" + ], + [ + "23:10", + "9246.0" + ], + [ + "23:19", + "9012.0" + ], + [ + "23:30", + "6750.0" + ], + [ + "23:40", + "6510.0" + ], + [ + "23:49", + "6960.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2394.0" + ], + [ + "00:19", + "2298.0" + ], + [ + "00:30", + "1434.0" + ], + [ + "00:40", + "1494.0" + ], + [ + "00:49", + "1458.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1242.0" + ], + [ + "01:19", + "1284.0" + ], + [ + "01:30", + "1278.0" + ], + [ + "01:40", + "840.0" + ], + [ + "01:49", + "1098.0" + ], + [ + "02:00", + "1008.0" + ], + [ + "02:10", + "720.0" + ], + [ + "02:19", + "870.0" + ], + [ + "02:30", + "768.0" + ], + [ + "02:40", + "846.0" + ], + [ + "02:49", + "822.0" + ], + [ + "03:00", + "42.0" + ], + [ + "03:10", + "24.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "6.0" + ], + [ + "03:49", + "6.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 786, + 762, + 864, + 990, + 1008, + 1176, + 2154, + 2592, + 2544, + 4086, + 3384, + 3912, + 6480, + 6798, + 7446, + 16272, + 16740, + 16974, + 24444, + 24390, + 25026, + 29706, + 29790, + 29148, + 28044, + 27462, + 28590, + 25800, + 25806, + 26520, + 25722, + 26178, + 25620, + 30672, + 30516, + 30936, + 30288, + 30042, + 29226, + 32322, + 33276, + 33000, + 28284, + 25734, + 26712, + 21396, + 20646, + 21450, + 15366, + 15570, + 16218, + 15846, + 16230, + 15714, + 16938, + 16758, + 17460, + 18264, + 18576, + 18420, + 21120, + 21810, + 20790, + 26160, + 26220, + 26544, + 32958, + 32286, + 34146, + 32076, + 31008, + 31962, + 36780, + 36342, + 36426, + 28206, + 28872, + 28692, + 31260, + 30540, + 31950, + 32124, + 31866, + 32016, + 29574, + 29616, + 29358, + 28614, + 30126, + 30030, + 30222, + 30102, + 30426, + 24408, + 24546, + 25740, + 24612, + 24534, + 24420, + 20448, + 21624, + 21456, + 21390, + 23034, + 21690, + 13782, + 14286, + 13716, + 12030, + 13566, + 12786, + 8586, + 8388, + 8256, + 9504, + 9246, + 9012, + 6750, + 6510, + 6960, + 2526, + 2394, + 2298, + 1434, + 1494, + 1458, + 1068, + 1242, + 1284, + 1278, + 840, + 1098, + 1008, + 720, + 870, + 768, + 846, + 822, + 42, + 24, + 0, + 6, + 6, + 6, + 0, + 0, + 6 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC trips (normalized to trips/hour) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "786.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "864.0" + ], + [ + "04:30", + "990.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1176.0" + ], + [ + "05:00", + "2154.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3384.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6480.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7440.0" + ], + [ + "06:30", + "16296.0" + ], + [ + "06:40", + "16722.0" + ], + [ + "06:49", + "17016.0" + ], + [ + "07:00", + "24396.0" + ], + [ + "07:10", + "24486.0" + ], + [ + "07:19", + "24936.0" + ], + [ + "07:30", + "29712.0" + ], + [ + "07:40", + "29790.0" + ], + [ + "07:49", + "29160.0" + ], + [ + "08:00", + "27996.0" + ], + [ + "08:10", + "27528.0" + ], + [ + "08:19", + "28596.0" + ], + [ + "08:30", + "25830.0" + ], + [ + "08:40", + "25776.0" + ], + [ + "08:49", + "26508.0" + ], + [ + "09:00", + "25680.0" + ], + [ + "09:10", + "26220.0" + ], + [ + "09:19", + "25602.0" + ], + [ + "09:30", + "30732.0" + ], + [ + "09:40", + "30474.0" + ], + [ + "09:49", + "31008.0" + ], + [ + "10:00", + "30210.0" + ], + [ + "10:10", + "30048.0" + ], + [ + "10:19", + "29256.0" + ], + [ + "10:30", + "32334.0" + ], + [ + "10:40", + "33186.0" + ], + [ + "10:49", + "33054.0" + ], + [ + "11:00", + "28254.0" + ], + [ + "11:10", + "25770.0" + ], + [ + "11:19", + "26694.0" + ], + [ + "11:30", + "21366.0" + ], + [ + "11:40", + "20658.0" + ], + [ + "11:49", + "21486.0" + ], + [ + "12:00", + "15354.0" + ], + [ + "12:10", + "15534.0" + ], + [ + "12:19", + "16260.0" + ], + [ + "12:30", + "15834.0" + ], + [ + "12:40", + "16224.0" + ], + [ + "12:49", + "15732.0" + ], + [ + "13:00", + "16938.0" + ], + [ + "13:10", + "16782.0" + ], + [ + "13:19", + "17430.0" + ], + [ + "13:30", + "18186.0" + ], + [ + "13:40", + "18618.0" + ], + [ + "13:49", + "18432.0" + ], + [ + "14:00", + "21084.0" + ], + [ + "14:10", + "21834.0" + ], + [ + "14:19", + "20808.0" + ], + [ + "14:30", + "26136.0" + ], + [ + "14:40", + "26226.0" + ], + [ + "14:49", + "26538.0" + ], + [ + "15:00", + "32988.0" + ], + [ + "15:10", + "32244.0" + ], + [ + "15:19", + "34296.0" + ], + [ + "15:30", + "32052.0" + ], + [ + "15:40", + "31014.0" + ], + [ + "15:49", + "31884.0" + ], + [ + "16:00", + "36690.0" + ], + [ + "16:10", + "36420.0" + ], + [ + "16:19", + "36420.0" + ], + [ + "16:30", + "28092.0" + ], + [ + "16:40", + "28866.0" + ], + [ + "16:49", + "28620.0" + ], + [ + "17:00", + "31218.0" + ], + [ + "17:10", + "30618.0" + ], + [ + "17:19", + "31866.0" + ], + [ + "17:30", + "32112.0" + ], + [ + "17:40", + "31824.0" + ], + [ + "17:49", + "32040.0" + ], + [ + "18:00", + "29592.0" + ], + [ + "18:10", + "29544.0" + ], + [ + "18:19", + "29412.0" + ], + [ + "18:30", + "28740.0" + ], + [ + "18:40", + "30060.0" + ], + [ + "18:49", + "30138.0" + ], + [ + "19:00", + "30312.0" + ], + [ + "19:10", + "30048.0" + ], + [ + "19:19", + "30498.0" + ], + [ + "19:30", + "24486.0" + ], + [ + "19:40", + "24588.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24486.0" + ], + [ + "20:10", + "24750.0" + ], + [ + "20:19", + "24216.0" + ], + [ + "20:30", + "20298.0" + ], + [ + "20:40", + "21474.0" + ], + [ + "20:49", + "21396.0" + ], + [ + "21:00", + "21270.0" + ], + [ + "21:10", + "23052.0" + ], + [ + "21:19", + "21462.0" + ], + [ + "21:30", + "13836.0" + ], + [ + "21:40", + "14346.0" + ], + [ + "21:49", + "13614.0" + ], + [ + "22:00", + "12006.0" + ], + [ + "22:10", + "13608.0" + ], + [ + "22:19", + "12732.0" + ], + [ + "22:30", + "8760.0" + ], + [ + "22:40", + "8364.0" + ], + [ + "22:49", + "8340.0" + ], + [ + "23:00", + "9390.0" + ], + [ + "23:10", + "9264.0" + ], + [ + "23:19", + "8982.0" + ], + [ + "23:30", + "6834.0" + ], + [ + "23:40", + "6570.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2382.0" + ], + [ + "00:19", + "2346.0" + ], + [ + "00:30", + "1416.0" + ], + [ + "00:40", + "1506.0" + ], + [ + "00:49", + "1470.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1206.0" + ], + [ + "01:19", + "1278.0" + ], + [ + "01:30", + "1260.0" + ], + [ + "01:40", + "858.0" + ], + [ + "01:49", + "1086.0" + ], + [ + "02:00", + "984.0" + ], + [ + "02:10", + "738.0" + ], + [ + "02:19", + "906.0" + ], + [ + "02:30", + "780.0" + ], + [ + "02:40", + "846.0" + ], + [ + "02:49", + "816.0" + ], + [ + "03:00", + "54.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 786, + 762, + 864, + 990, + 1008, + 1176, + 2154, + 2592, + 2544, + 4086, + 3384, + 3912, + 6480, + 6798, + 7440, + 16296, + 16722, + 17016, + 24396, + 24486, + 24936, + 29712, + 29790, + 29160, + 27996, + 27528, + 28596, + 25830, + 25776, + 26508, + 25680, + 26220, + 25602, + 30732, + 30474, + 31008, + 30210, + 30048, + 29256, + 32334, + 33186, + 33054, + 28254, + 25770, + 26694, + 21366, + 20658, + 21486, + 15354, + 15534, + 16260, + 15834, + 16224, + 15732, + 16938, + 16782, + 17430, + 18186, + 18618, + 18432, + 21084, + 21834, + 20808, + 26136, + 26226, + 26538, + 32988, + 32244, + 34296, + 32052, + 31014, + 31884, + 36690, + 36420, + 36420, + 28092, + 28866, + 28620, + 31218, + 30618, + 31866, + 32112, + 31824, + 32040, + 29592, + 29544, + 29412, + 28740, + 30060, + 30138, + 30312, + 30048, + 30498, + 24486, + 24588, + 25842, + 24486, + 24750, + 24216, + 20298, + 21474, + 21396, + 21270, + 23052, + 21462, + 13836, + 14346, + 13614, + 12006, + 13608, + 12732, + 8760, + 8364, + 8340, + 9390, + 9264, + 8982, + 6834, + 6570, + 6972, + 2526, + 2382, + 2346, + 1416, + 1506, + 1470, + 1068, + 1206, + 1278, + 1260, + 858, + 1086, + 984, + 738, + 906, + 780, + 846, + 816, + 54, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "528.0" + ], + [ + "03:10", + "582.0" + ], + [ + "03:19", + "522.0" + ], + [ + "03:30", + "516.0" + ], + [ + "03:40", + "672.0" + ], + [ + "03:49", + "702.0" + ], + [ + "04:00", + "810.0" + ], + [ + "04:10", + "774.0" + ], + [ + "04:19", + "756.0" + ], + [ + "04:30", + "1170.0" + ], + [ + "04:40", + "984.0" + ], + [ + "04:49", + "1032.0" + ], + [ + "05:00", + "2202.0" + ], + [ + "05:10", + "2184.0" + ], + [ + "05:19", + "2808.0" + ], + [ + "05:30", + "3708.0" + ], + [ + "05:40", + "3858.0" + ], + [ + "05:49", + "3684.0" + ], + [ + "06:00", + "6792.0" + ], + [ + "06:10", + "6828.0" + ], + [ + "06:19", + "7068.0" + ], + [ + "06:30", + "15882.0" + ], + [ + "06:40", + "17556.0" + ], + [ + "06:49", + "16206.0" + ], + [ + "07:00", + "24552.0" + ], + [ + "07:10", + "24264.0" + ], + [ + "07:19", + "24186.0" + ], + [ + "07:30", + "28422.0" + ], + [ + "07:40", + "29118.0" + ], + [ + "07:49", + "29154.0" + ], + [ + "08:00", + "27714.0" + ], + [ + "08:10", + "26328.0" + ], + [ + "08:19", + "28080.0" + ], + [ + "08:30", + "24966.0" + ], + [ + "08:40", + "24342.0" + ], + [ + "08:49", + "24636.0" + ], + [ + "09:00", + "23604.0" + ], + [ + "09:10", + "24462.0" + ], + [ + "09:19", + "24798.0" + ], + [ + "09:30", + "28116.0" + ], + [ + "09:40", + "27816.0" + ], + [ + "09:49", + "28578.0" + ], + [ + "10:00", + "26334.0" + ], + [ + "10:10", + "27036.0" + ], + [ + "10:19", + "27378.0" + ], + [ + "10:30", + "30024.0" + ], + [ + "10:40", + "29868.0" + ], + [ + "10:49", + "29412.0" + ], + [ + "11:00", + "25098.0" + ], + [ + "11:10", + "23712.0" + ], + [ + "11:19", + "24474.0" + ], + [ + "11:30", + "19626.0" + ], + [ + "11:40", + "19830.0" + ], + [ + "11:49", + "19710.0" + ], + [ + "12:00", + "14706.0" + ], + [ + "12:10", + "14976.0" + ], + [ + "12:19", + "15582.0" + ], + [ + "12:30", + "15924.0" + ], + [ + "12:40", + "15102.0" + ], + [ + "12:49", + "14748.0" + ], + [ + "13:00", + "17076.0" + ], + [ + "13:10", + "15672.0" + ], + [ + "13:19", + "16236.0" + ], + [ + "13:30", + "17178.0" + ], + [ + "13:40", + "17352.0" + ], + [ + "13:49", + "17922.0" + ], + [ + "14:00", + "20796.0" + ], + [ + "14:10", + "20100.0" + ], + [ + "14:19", + "20094.0" + ], + [ + "14:30", + "24852.0" + ], + [ + "14:40", + "25170.0" + ], + [ + "14:49", + "25302.0" + ], + [ + "15:00", + "30354.0" + ], + [ + "15:10", + "32826.0" + ], + [ + "15:19", + "31680.0" + ], + [ + "15:30", + "29646.0" + ], + [ + "15:40", + "30222.0" + ], + [ + "15:49", + "30132.0" + ], + [ + "16:00", + "34446.0" + ], + [ + "16:10", + "34428.0" + ], + [ + "16:19", + "34398.0" + ], + [ + "16:30", + "26274.0" + ], + [ + "16:40", + "27510.0" + ], + [ + "16:49", + "27102.0" + ], + [ + "17:00", + "28512.0" + ], + [ + "17:10", + "28908.0" + ], + [ + "17:19", + "29766.0" + ], + [ + "17:30", + "29838.0" + ], + [ + "17:40", + "29208.0" + ], + [ + "17:49", + "29544.0" + ], + [ + "18:00", + "26772.0" + ], + [ + "18:10", + "28062.0" + ], + [ + "18:19", + "27126.0" + ], + [ + "18:30", + "26712.0" + ], + [ + "18:40", + "27348.0" + ], + [ + "18:49", + "27636.0" + ], + [ + "19:00", + "27624.0" + ], + [ + "19:10", + "27144.0" + ], + [ + "19:19", + "27234.0" + ], + [ + "19:30", + "22524.0" + ], + [ + "19:40", + "22536.0" + ], + [ + "19:49", + "22542.0" + ], + [ + "20:00", + "21186.0" + ], + [ + "20:10", + "21822.0" + ], + [ + "20:19", + "22626.0" + ], + [ + "20:30", + "19374.0" + ], + [ + "20:40", + "19644.0" + ], + [ + "20:49", + "19386.0" + ], + [ + "21:00", + "19560.0" + ], + [ + "21:10", + "19446.0" + ], + [ + "21:19", + "19782.0" + ], + [ + "21:30", + "12552.0" + ], + [ + "21:40", + "12642.0" + ], + [ + "21:49", + "12582.0" + ], + [ + "22:00", + "11634.0" + ], + [ + "22:10", + "11694.0" + ], + [ + "22:19", + "11292.0" + ], + [ + "22:30", + "7950.0" + ], + [ + "22:40", + "7962.0" + ], + [ + "22:49", + "8010.0" + ], + [ + "23:00", + "8232.0" + ], + [ + "23:10", + "8130.0" + ], + [ + "23:19", + "8220.0" + ], + [ + "23:30", + "6168.0" + ], + [ + "23:40", + "5850.0" + ], + [ + "23:49", + "6348.0" + ], + [ + "00:00", + "2238.0" + ], + [ + "00:10", + "2430.0" + ], + [ + "00:19", + "2262.0" + ], + [ + "00:30", + "1278.0" + ], + [ + "00:40", + "1362.0" + ], + [ + "00:49", + "1698.0" + ], + [ + "01:00", + "1284.0" + ], + [ + "01:10", + "1092.0" + ], + [ + "01:19", + "1158.0" + ], + [ + "01:30", + "1098.0" + ], + [ + "01:40", + "906.0" + ], + [ + "01:49", + "1194.0" + ], + [ + "02:00", + "828.0" + ], + [ + "02:10", + "876.0" + ], + [ + "02:19", + "828.0" + ], + [ + "02:30", + "684.0" + ], + [ + "02:40", + "882.0" + ], + [ + "02:49", + "810.0" + ], + [ + "03:00", + "48.0" + ], + [ + "03:10", + "18.0" + ], + [ + "03:19", + "12.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "6.0" + ], + [ + "03:49", + "6.0" + ], + [ + "04:00", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 528, + 582, + 522, + 516, + 672, + 702, + 810, + 774, + 756, + 1170, + 984, + 1032, + 2202, + 2184, + 2808, + 3708, + 3858, + 3684, + 6792, + 6828, + 7068, + 15882, + 17556, + 16206, + 24552, + 24264, + 24186, + 28422, + 29118, + 29154, + 27714, + 26328, + 28080, + 24966, + 24342, + 24636, + 23604, + 24462, + 24798, + 28116, + 27816, + 28578, + 26334, + 27036, + 27378, + 30024, + 29868, + 29412, + 25098, + 23712, + 24474, + 19626, + 19830, + 19710, + 14706, + 14976, + 15582, + 15924, + 15102, + 14748, + 17076, + 15672, + 16236, + 17178, + 17352, + 17922, + 20796, + 20100, + 20094, + 24852, + 25170, + 25302, + 30354, + 32826, + 31680, + 29646, + 30222, + 30132, + 34446, + 34428, + 34398, + 26274, + 27510, + 27102, + 28512, + 28908, + 29766, + 29838, + 29208, + 29544, + 26772, + 28062, + 27126, + 26712, + 27348, + 27636, + 27624, + 27144, + 27234, + 22524, + 22536, + 22542, + 21186, + 21822, + 22626, + 19374, + 19644, + 19386, + 19560, + 19446, + 19782, + 12552, + 12642, + 12582, + 11634, + 11694, + 11292, + 7950, + 7962, + 8010, + 8232, + 8130, + 8220, + 6168, + 5850, + 6348, + 2238, + 2430, + 2262, + 1278, + 1362, + 1698, + 1284, + 1092, + 1158, + 1098, + 906, + 1194, + 828, + 876, + 828, + 684, + 882, + 810, + 48, + 18, + 12, + 0, + 6, + 6, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "480.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "558.0" + ], + [ + "03:30", + "606.0" + ], + [ + "03:40", + "618.0" + ], + [ + "03:49", + "690.0" + ], + [ + "04:00", + "738.0" + ], + [ + "04:10", + "888.0" + ], + [ + "04:19", + "714.0" + ], + [ + "04:30", + "1074.0" + ], + [ + "04:40", + "1026.0" + ], + [ + "04:49", + "990.0" + ], + [ + "05:00", + "2322.0" + ], + [ + "05:10", + "2370.0" + ], + [ + "05:19", + "2568.0" + ], + [ + "05:30", + "3660.0" + ], + [ + "05:40", + "3660.0" + ], + [ + "05:49", + "3918.0" + ], + [ + "06:00", + "6336.0" + ], + [ + "06:10", + "7446.0" + ], + [ + "06:19", + "6840.0" + ], + [ + "06:30", + "16044.0" + ], + [ + "06:40", + "16914.0" + ], + [ + "06:49", + "16446.0" + ], + [ + "07:00", + "23460.0" + ], + [ + "07:10", + "23724.0" + ], + [ + "07:19", + "24876.0" + ], + [ + "07:30", + "28050.0" + ], + [ + "07:40", + "28560.0" + ], + [ + "07:49", + "29148.0" + ], + [ + "08:00", + "26418.0" + ], + [ + "08:10", + "26892.0" + ], + [ + "08:19", + "26184.0" + ], + [ + "08:30", + "23568.0" + ], + [ + "08:40", + "23412.0" + ], + [ + "08:49", + "24594.0" + ], + [ + "09:00", + "22824.0" + ], + [ + "09:10", + "23136.0" + ], + [ + "09:19", + "23838.0" + ], + [ + "09:30", + "26628.0" + ], + [ + "09:40", + "27006.0" + ], + [ + "09:49", + "27000.0" + ], + [ + "10:00", + "26322.0" + ], + [ + "10:10", + "25176.0" + ], + [ + "10:19", + "25488.0" + ], + [ + "10:30", + "28290.0" + ], + [ + "10:40", + "28152.0" + ], + [ + "10:49", + "28056.0" + ], + [ + "11:00", + "23556.0" + ], + [ + "11:10", + "23112.0" + ], + [ + "11:19", + "23430.0" + ], + [ + "11:30", + "18942.0" + ], + [ + "11:40", + "19152.0" + ], + [ + "11:49", + "19062.0" + ], + [ + "12:00", + "14448.0" + ], + [ + "12:10", + "14754.0" + ], + [ + "12:19", + "15462.0" + ], + [ + "12:30", + "15252.0" + ], + [ + "12:40", + "15072.0" + ], + [ + "12:49", + "14238.0" + ], + [ + "13:00", + "16062.0" + ], + [ + "13:10", + "15912.0" + ], + [ + "13:19", + "15660.0" + ], + [ + "13:30", + "16968.0" + ], + [ + "13:40", + "16434.0" + ], + [ + "13:49", + "17604.0" + ], + [ + "14:00", + "20544.0" + ], + [ + "14:10", + "19476.0" + ], + [ + "14:19", + "19254.0" + ], + [ + "14:30", + "23880.0" + ], + [ + "14:40", + "24642.0" + ], + [ + "14:49", + "24918.0" + ], + [ + "15:00", + "30576.0" + ], + [ + "15:10", + "30612.0" + ], + [ + "15:19", + "30192.0" + ], + [ + "15:30", + "28836.0" + ], + [ + "15:40", + "29232.0" + ], + [ + "15:49", + "29040.0" + ], + [ + "16:00", + "31920.0" + ], + [ + "16:10", + "33624.0" + ], + [ + "16:19", + "34314.0" + ], + [ + "16:30", + "25578.0" + ], + [ + "16:40", + "25824.0" + ], + [ + "16:49", + "26124.0" + ], + [ + "17:00", + "26502.0" + ], + [ + "17:10", + "27660.0" + ], + [ + "17:19", + "28596.0" + ], + [ + "17:30", + "29142.0" + ], + [ + "17:40", + "27462.0" + ], + [ + "17:49", + "27792.0" + ], + [ + "18:00", + "26508.0" + ], + [ + "18:10", + "25428.0" + ], + [ + "18:19", + "25806.0" + ], + [ + "18:30", + "25986.0" + ], + [ + "18:40", + "25560.0" + ], + [ + "18:49", + "25428.0" + ], + [ + "19:00", + "26244.0" + ], + [ + "19:10", + "25464.0" + ], + [ + "19:19", + "25524.0" + ], + [ + "19:30", + "21102.0" + ], + [ + "19:40", + "21522.0" + ], + [ + "19:49", + "20844.0" + ], + [ + "20:00", + "20016.0" + ], + [ + "20:10", + "21234.0" + ], + [ + "20:19", + "20850.0" + ], + [ + "20:30", + "18294.0" + ], + [ + "20:40", + "17898.0" + ], + [ + "20:49", + "18690.0" + ], + [ + "21:00", + "18138.0" + ], + [ + "21:10", + "18372.0" + ], + [ + "21:19", + "19008.0" + ], + [ + "21:30", + "11652.0" + ], + [ + "21:40", + "11832.0" + ], + [ + "21:49", + "11766.0" + ], + [ + "22:00", + "10614.0" + ], + [ + "22:10", + "11274.0" + ], + [ + "22:19", + "10734.0" + ], + [ + "22:30", + "6774.0" + ], + [ + "22:40", + "7332.0" + ], + [ + "22:49", + "8190.0" + ], + [ + "23:00", + "7854.0" + ], + [ + "23:10", + "7458.0" + ], + [ + "23:19", + "7404.0" + ], + [ + "23:30", + "5886.0" + ], + [ + "23:40", + "5490.0" + ], + [ + "23:49", + "5766.0" + ], + [ + "00:00", + "2232.0" + ], + [ + "00:10", + "2208.0" + ], + [ + "00:19", + "2208.0" + ], + [ + "00:30", + "1470.0" + ], + [ + "00:40", + "1350.0" + ], + [ + "00:49", + "1500.0" + ], + [ + "01:00", + "1326.0" + ], + [ + "01:10", + "1164.0" + ], + [ + "01:19", + "1092.0" + ], + [ + "01:30", + "1116.0" + ], + [ + "01:40", + "1086.0" + ], + [ + "01:49", + "1002.0" + ], + [ + "02:00", + "744.0" + ], + [ + "02:10", + "912.0" + ], + [ + "02:19", + "852.0" + ], + [ + "02:30", + "720.0" + ], + [ + "02:40", + "804.0" + ], + [ + "02:49", + "858.0" + ], + [ + "03:00", + "54.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 480, + 588, + 558, + 606, + 618, + 690, + 738, + 888, + 714, + 1074, + 1026, + 990, + 2322, + 2370, + 2568, + 3660, + 3660, + 3918, + 6336, + 7446, + 6840, + 16044, + 16914, + 16446, + 23460, + 23724, + 24876, + 28050, + 28560, + 29148, + 26418, + 26892, + 26184, + 23568, + 23412, + 24594, + 22824, + 23136, + 23838, + 26628, + 27006, + 27000, + 26322, + 25176, + 25488, + 28290, + 28152, + 28056, + 23556, + 23112, + 23430, + 18942, + 19152, + 19062, + 14448, + 14754, + 15462, + 15252, + 15072, + 14238, + 16062, + 15912, + 15660, + 16968, + 16434, + 17604, + 20544, + 19476, + 19254, + 23880, + 24642, + 24918, + 30576, + 30612, + 30192, + 28836, + 29232, + 29040, + 31920, + 33624, + 34314, + 25578, + 25824, + 26124, + 26502, + 27660, + 28596, + 29142, + 27462, + 27792, + 26508, + 25428, + 25806, + 25986, + 25560, + 25428, + 26244, + 25464, + 25524, + 21102, + 21522, + 20844, + 20016, + 21234, + 20850, + 18294, + 17898, + 18690, + 18138, + 18372, + 19008, + 11652, + 11832, + 11766, + 10614, + 11274, + 10734, + 6774, + 7332, + 8190, + 7854, + 7458, + 7404, + 5886, + 5490, + 5766, + 2232, + 2208, + 2208, + 1470, + 1350, + 1500, + 1326, + 1164, + 1092, + 1116, + 1086, + 1002, + 744, + 912, + 852, + 720, + 804, + 858, + 54, + 6, + 0, + 6, + 0, + 0, + 0, + 6 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC trips (normalized to trips/hour) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "600.0" + ], + [ + "03:10", + "588.0" + ], + [ + "03:19", + "486.0" + ], + [ + "03:30", + "588.0" + ], + [ + "03:40", + "660.0" + ], + [ + "03:49", + "666.0" + ], + [ + "04:00", + "786.0" + ], + [ + "04:10", + "762.0" + ], + [ + "04:19", + "864.0" + ], + [ + "04:30", + "990.0" + ], + [ + "04:40", + "1008.0" + ], + [ + "04:49", + "1176.0" + ], + [ + "05:00", + "2154.0" + ], + [ + "05:10", + "2592.0" + ], + [ + "05:19", + "2544.0" + ], + [ + "05:30", + "4086.0" + ], + [ + "05:40", + "3384.0" + ], + [ + "05:49", + "3912.0" + ], + [ + "06:00", + "6480.0" + ], + [ + "06:10", + "6798.0" + ], + [ + "06:19", + "7440.0" + ], + [ + "06:30", + "16296.0" + ], + [ + "06:40", + "16722.0" + ], + [ + "06:49", + "17016.0" + ], + [ + "07:00", + "24396.0" + ], + [ + "07:10", + "24486.0" + ], + [ + "07:19", + "24936.0" + ], + [ + "07:30", + "29712.0" + ], + [ + "07:40", + "29790.0" + ], + [ + "07:49", + "29160.0" + ], + [ + "08:00", + "27996.0" + ], + [ + "08:10", + "27528.0" + ], + [ + "08:19", + "28596.0" + ], + [ + "08:30", + "25830.0" + ], + [ + "08:40", + "25776.0" + ], + [ + "08:49", + "26508.0" + ], + [ + "09:00", + "25680.0" + ], + [ + "09:10", + "26220.0" + ], + [ + "09:19", + "25602.0" + ], + [ + "09:30", + "30732.0" + ], + [ + "09:40", + "30474.0" + ], + [ + "09:49", + "31008.0" + ], + [ + "10:00", + "30210.0" + ], + [ + "10:10", + "30048.0" + ], + [ + "10:19", + "29256.0" + ], + [ + "10:30", + "32334.0" + ], + [ + "10:40", + "33186.0" + ], + [ + "10:49", + "33054.0" + ], + [ + "11:00", + "28254.0" + ], + [ + "11:10", + "25770.0" + ], + [ + "11:19", + "26694.0" + ], + [ + "11:30", + "21366.0" + ], + [ + "11:40", + "20658.0" + ], + [ + "11:49", + "21486.0" + ], + [ + "12:00", + "15354.0" + ], + [ + "12:10", + "15534.0" + ], + [ + "12:19", + "16260.0" + ], + [ + "12:30", + "15834.0" + ], + [ + "12:40", + "16224.0" + ], + [ + "12:49", + "15732.0" + ], + [ + "13:00", + "16938.0" + ], + [ + "13:10", + "16782.0" + ], + [ + "13:19", + "17430.0" + ], + [ + "13:30", + "18186.0" + ], + [ + "13:40", + "18618.0" + ], + [ + "13:49", + "18432.0" + ], + [ + "14:00", + "21084.0" + ], + [ + "14:10", + "21834.0" + ], + [ + "14:19", + "20808.0" + ], + [ + "14:30", + "26136.0" + ], + [ + "14:40", + "26226.0" + ], + [ + "14:49", + "26538.0" + ], + [ + "15:00", + "32988.0" + ], + [ + "15:10", + "32244.0" + ], + [ + "15:19", + "34296.0" + ], + [ + "15:30", + "32052.0" + ], + [ + "15:40", + "31014.0" + ], + [ + "15:49", + "31884.0" + ], + [ + "16:00", + "36690.0" + ], + [ + "16:10", + "36420.0" + ], + [ + "16:19", + "36420.0" + ], + [ + "16:30", + "28092.0" + ], + [ + "16:40", + "28866.0" + ], + [ + "16:49", + "28620.0" + ], + [ + "17:00", + "31218.0" + ], + [ + "17:10", + "30618.0" + ], + [ + "17:19", + "31866.0" + ], + [ + "17:30", + "32112.0" + ], + [ + "17:40", + "31824.0" + ], + [ + "17:49", + "32040.0" + ], + [ + "18:00", + "29592.0" + ], + [ + "18:10", + "29544.0" + ], + [ + "18:19", + "29412.0" + ], + [ + "18:30", + "28740.0" + ], + [ + "18:40", + "30060.0" + ], + [ + "18:49", + "30138.0" + ], + [ + "19:00", + "30312.0" + ], + [ + "19:10", + "30048.0" + ], + [ + "19:19", + "30498.0" + ], + [ + "19:30", + "24486.0" + ], + [ + "19:40", + "24588.0" + ], + [ + "19:49", + "25842.0" + ], + [ + "20:00", + "24486.0" + ], + [ + "20:10", + "24750.0" + ], + [ + "20:19", + "24216.0" + ], + [ + "20:30", + "20298.0" + ], + [ + "20:40", + "21474.0" + ], + [ + "20:49", + "21396.0" + ], + [ + "21:00", + "21270.0" + ], + [ + "21:10", + "23052.0" + ], + [ + "21:19", + "21462.0" + ], + [ + "21:30", + "13836.0" + ], + [ + "21:40", + "14346.0" + ], + [ + "21:49", + "13614.0" + ], + [ + "22:00", + "12006.0" + ], + [ + "22:10", + "13608.0" + ], + [ + "22:19", + "12732.0" + ], + [ + "22:30", + "8760.0" + ], + [ + "22:40", + "8364.0" + ], + [ + "22:49", + "8340.0" + ], + [ + "23:00", + "9390.0" + ], + [ + "23:10", + "9264.0" + ], + [ + "23:19", + "8982.0" + ], + [ + "23:30", + "6834.0" + ], + [ + "23:40", + "6570.0" + ], + [ + "23:49", + "6972.0" + ], + [ + "00:00", + "2526.0" + ], + [ + "00:10", + "2382.0" + ], + [ + "00:19", + "2346.0" + ], + [ + "00:30", + "1416.0" + ], + [ + "00:40", + "1506.0" + ], + [ + "00:49", + "1470.0" + ], + [ + "01:00", + "1068.0" + ], + [ + "01:10", + "1206.0" + ], + [ + "01:19", + "1278.0" + ], + [ + "01:30", + "1260.0" + ], + [ + "01:40", + "858.0" + ], + [ + "01:49", + "1086.0" + ], + [ + "02:00", + "984.0" + ], + [ + "02:10", + "738.0" + ], + [ + "02:19", + "906.0" + ], + [ + "02:30", + "780.0" + ], + [ + "02:40", + "846.0" + ], + [ + "02:49", + "816.0" + ], + [ + "03:00", + "54.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 600, + 588, + 486, + 588, + 660, + 666, + 786, + 762, + 864, + 990, + 1008, + 1176, + 2154, + 2592, + 2544, + 4086, + 3384, + 3912, + 6480, + 6798, + 7440, + 16296, + 16722, + 17016, + 24396, + 24486, + 24936, + 29712, + 29790, + 29160, + 27996, + 27528, + 28596, + 25830, + 25776, + 26508, + 25680, + 26220, + 25602, + 30732, + 30474, + 31008, + 30210, + 30048, + 29256, + 32334, + 33186, + 33054, + 28254, + 25770, + 26694, + 21366, + 20658, + 21486, + 15354, + 15534, + 16260, + 15834, + 16224, + 15732, + 16938, + 16782, + 17430, + 18186, + 18618, + 18432, + 21084, + 21834, + 20808, + 26136, + 26226, + 26538, + 32988, + 32244, + 34296, + 32052, + 31014, + 31884, + 36690, + 36420, + 36420, + 28092, + 28866, + 28620, + 31218, + 30618, + 31866, + 32112, + 31824, + 32040, + 29592, + 29544, + 29412, + 28740, + 30060, + 30138, + 30312, + 30048, + 30498, + 24486, + 24588, + 25842, + 24486, + 24750, + 24216, + 20298, + 21474, + 21396, + 21270, + 23052, + 21462, + 13836, + 14346, + 13614, + 12006, + 13608, + 12732, + 8760, + 8364, + 8340, + 9390, + 9264, + 8982, + 6834, + 6570, + 6972, + 2526, + 2382, + 2346, + 1416, + 1506, + 1470, + 1068, + 1206, + 1278, + 1260, + 858, + 1086, + 984, + 738, + 906, + 780, + 846, + 816, + 54, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "24588.0" + ], + [ + "03:10", + "25938.0" + ], + [ + "03:19", + "26820.0" + ], + [ + "03:30", + "32754.0" + ], + [ + "03:40", + "33360.0" + ], + [ + "03:49", + "33552.0" + ], + [ + "04:00", + "47640.0" + ], + [ + "04:10", + "47550.0" + ], + [ + "04:19", + "50220.0" + ], + [ + "04:30", + "75288.0" + ], + [ + "04:40", + "79890.0" + ], + [ + "04:49", + "80238.0" + ], + [ + "05:00", + "132072.0" + ], + [ + "05:10", + "138810.0" + ], + [ + "05:19", + "141666.0" + ], + [ + "05:30", + "241500.0" + ], + [ + "05:40", + "258882.0" + ], + [ + "05:49", + "263706.0" + ], + [ + "06:00", + "505632.0" + ], + [ + "06:10", + "533958.0" + ], + [ + "06:19", + "546036.0" + ], + [ + "06:30", + "1342422.0" + ], + [ + "06:40", + "1423170.0" + ], + [ + "06:49", + "1452966.0" + ], + [ + "07:00", + "2050326.0" + ], + [ + "07:10", + "2113128.0" + ], + [ + "07:19", + "2163108.0" + ], + [ + "07:30", + "2523504.0" + ], + [ + "07:40", + "2587740.0" + ], + [ + "07:49", + "2573634.0" + ], + [ + "08:00", + "2061486.0" + ], + [ + "08:10", + "1987320.0" + ], + [ + "08:19", + "1963326.0" + ], + [ + "08:30", + "1658646.0" + ], + [ + "08:40", + "1606374.0" + ], + [ + "08:49", + "1593426.0" + ], + [ + "09:00", + "1325244.0" + ], + [ + "09:10", + "1277838.0" + ], + [ + "09:19", + "1267140.0" + ], + [ + "09:30", + "1181208.0" + ], + [ + "09:40", + "1166178.0" + ], + [ + "09:49", + "1162584.0" + ], + [ + "10:00", + "1088328.0" + ], + [ + "10:10", + "1081110.0" + ], + [ + "10:19", + "1078224.0" + ], + [ + "10:30", + "1085778.0" + ], + [ + "10:40", + "1079778.0" + ], + [ + "10:49", + "1082808.0" + ], + [ + "11:00", + "1123212.0" + ], + [ + "11:10", + "1128654.0" + ], + [ + "11:19", + "1121832.0" + ], + [ + "11:30", + "1232970.0" + ], + [ + "11:40", + "1258722.0" + ], + [ + "11:49", + "1254588.0" + ], + [ + "12:00", + "1271928.0" + ], + [ + "12:10", + "1271874.0" + ], + [ + "12:19", + "1270626.0" + ], + [ + "12:30", + "1243224.0" + ], + [ + "12:40", + "1238766.0" + ], + [ + "12:49", + "1236054.0" + ], + [ + "13:00", + "1225098.0" + ], + [ + "13:10", + "1230486.0" + ], + [ + "13:19", + "1228782.0" + ], + [ + "13:30", + "1208694.0" + ], + [ + "13:40", + "1212726.0" + ], + [ + "13:49", + "1215984.0" + ], + [ + "14:00", + "1315752.0" + ], + [ + "14:10", + "1345284.0" + ], + [ + "14:19", + "1352646.0" + ], + [ + "14:30", + "1538586.0" + ], + [ + "14:40", + "1581066.0" + ], + [ + "14:49", + "1581978.0" + ], + [ + "15:00", + "1856130.0" + ], + [ + "15:10", + "1908756.0" + ], + [ + "15:19", + "1920324.0" + ], + [ + "15:30", + "1946484.0" + ], + [ + "15:40", + "1956582.0" + ], + [ + "15:49", + "1951788.0" + ], + [ + "16:00", + "2054004.0" + ], + [ + "16:10", + "2096760.0" + ], + [ + "16:19", + "2096424.0" + ], + [ + "16:30", + "1700280.0" + ], + [ + "16:40", + "1668114.0" + ], + [ + "16:49", + "1656306.0" + ], + [ + "17:00", + "1651380.0" + ], + [ + "17:10", + "1643880.0" + ], + [ + "17:19", + "1656024.0" + ], + [ + "17:30", + "1617528.0" + ], + [ + "17:40", + "1602114.0" + ], + [ + "17:49", + "1614228.0" + ], + [ + "18:00", + "1436952.0" + ], + [ + "18:10", + "1403916.0" + ], + [ + "18:19", + "1395696.0" + ], + [ + "18:30", + "1300422.0" + ], + [ + "18:40", + "1274448.0" + ], + [ + "18:49", + "1265196.0" + ], + [ + "19:00", + "1066998.0" + ], + [ + "19:10", + "1021950.0" + ], + [ + "19:19", + "1009236.0" + ], + [ + "19:30", + "895344.0" + ], + [ + "19:40", + "870582.0" + ], + [ + "19:49", + "858234.0" + ], + [ + "20:00", + "764604.0" + ], + [ + "20:10", + "746760.0" + ], + [ + "20:19", + "741330.0" + ], + [ + "20:30", + "672582.0" + ], + [ + "20:40", + "659580.0" + ], + [ + "20:49", + "655998.0" + ], + [ + "21:00", + "573576.0" + ], + [ + "21:10", + "548304.0" + ], + [ + "21:19", + "548580.0" + ], + [ + "21:30", + "397254.0" + ], + [ + "21:40", + "369162.0" + ], + [ + "21:49", + "357558.0" + ], + [ + "22:00", + "296676.0" + ], + [ + "22:10", + "286518.0" + ], + [ + "22:19", + "280158.0" + ], + [ + "22:30", + "225870.0" + ], + [ + "22:40", + "218076.0" + ], + [ + "22:49", + "212910.0" + ], + [ + "23:00", + "177576.0" + ], + [ + "23:10", + "173880.0" + ], + [ + "23:19", + "169488.0" + ], + [ + "23:30", + "144684.0" + ], + [ + "23:40", + "141120.0" + ], + [ + "23:49", + "140670.0" + ], + [ + "00:00", + "108732.0" + ], + [ + "00:10", + "101082.0" + ], + [ + "00:19", + "95634.0" + ], + [ + "00:30", + "80946.0" + ], + [ + "00:40", + "76638.0" + ], + [ + "00:49", + "75294.0" + ], + [ + "01:00", + "64884.0" + ], + [ + "01:10", + "63444.0" + ], + [ + "01:19", + "61566.0" + ], + [ + "01:30", + "50286.0" + ], + [ + "01:40", + "49074.0" + ], + [ + "01:49", + "49428.0" + ], + [ + "02:00", + "38544.0" + ], + [ + "02:10", + "38124.0" + ], + [ + "02:19", + "36624.0" + ], + [ + "02:30", + "29544.0" + ], + [ + "02:40", + "29100.0" + ], + [ + "02:49", + "27612.0" + ], + [ + "03:00", + "6630.0" + ], + [ + "03:10", + "2460.0" + ], + [ + "03:19", + "1086.0" + ], + [ + "03:30", + "558.0" + ], + [ + "03:40", + "276.0" + ], + [ + "03:49", + "246.0" + ], + [ + "04:00", + "234.0" + ], + [ + "04:10", + "144.0" + ], + [ + "04:19", + "96.0" + ], + [ + "04:30", + "60.0" + ], + [ + "04:40", + "36.0" + ], + [ + "04:49", + "18.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332, + 25.5, + 25.666666666666668, + 25.833333333333332 + ], + "y": [ + 24588, + 25938, + 26820, + 32754, + 33360, + 33552, + 47640, + 47550, + 50220, + 75288, + 79890, + 80238, + 132072, + 138810, + 141666, + 241500, + 258882, + 263706, + 505632, + 533958, + 546036, + 1342422, + 1423170, + 1452966, + 2050326, + 2113128, + 2163108, + 2523504, + 2587740, + 2573634, + 2061486, + 1987320, + 1963326, + 1658646, + 1606374, + 1593426, + 1325244, + 1277838, + 1267140, + 1181208, + 1166178, + 1162584, + 1088328, + 1081110, + 1078224, + 1085778, + 1079778, + 1082808, + 1123212, + 1128654, + 1121832, + 1232970, + 1258722, + 1254588, + 1271928, + 1271874, + 1270626, + 1243224, + 1238766, + 1236054, + 1225098, + 1230486, + 1228782, + 1208694, + 1212726, + 1215984, + 1315752, + 1345284, + 1352646, + 1538586, + 1581066, + 1581978, + 1856130, + 1908756, + 1920324, + 1946484, + 1956582, + 1951788, + 2054004, + 2096760, + 2096424, + 1700280, + 1668114, + 1656306, + 1651380, + 1643880, + 1656024, + 1617528, + 1602114, + 1614228, + 1436952, + 1403916, + 1395696, + 1300422, + 1274448, + 1265196, + 1066998, + 1021950, + 1009236, + 895344, + 870582, + 858234, + 764604, + 746760, + 741330, + 672582, + 659580, + 655998, + 573576, + 548304, + 548580, + 397254, + 369162, + 357558, + 296676, + 286518, + 280158, + 225870, + 218076, + 212910, + 177576, + 173880, + 169488, + 144684, + 141120, + 140670, + 108732, + 101082, + 95634, + 80946, + 76638, + 75294, + 64884, + 63444, + 61566, + 50286, + 49074, + 49428, + 38544, + 38124, + 36624, + 29544, + 29100, + 27612, + 6630, + 2460, + 1086, + 558, + 276, + 246, + 234, + 144, + 96, + 60, + 36, + 18 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC trips (normalized to trips/hour) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_all_trips_per_hour(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " All veh trips/hour (requested + deadhead + refuel), scaled by bin size.\n", + " \"\"\"\n", + " bins = pd.to_numeric(new_df[\"depart_bin\"], errors=\"coerce\").dropna().astype(int)\n", + " if bins.empty:\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " counts = (\n", + " bins.value_counts()\n", + " .sort_index()\n", + " .reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0)\n", + " )\n", + "\n", + " factor = 60.0 / bin_minutes\n", + " rate = counts * factor\n", + "\n", + " times = start_time + pd.to_timedelta(rate.index * bin_minutes, unit=\"m\")\n", + " vals = rate.values\n", + "\n", + " df = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " df[\"hover\"] = [\n", + " f\"Trips/hour: {v:,.2f} (bin legs: {int(c):,}, bin={bin_minutes} min)\"\n", + " for v, c in zip(vals, counts.values)\n", + " ]\n", + " return df\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_all_trips_per_hour,\n", + " \"All TNC trips (normalized to trips/hour)\",\n", + " \"Trips per hour\",\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6545.189950123429" + ], + [ + "04:10", + "6547.63733536005" + ], + [ + "04:19", + "6831.531698405743" + ], + [ + "04:30", + "7917.918021798134" + ], + [ + "04:40", + "7749.150493249297" + ], + [ + "04:49", + "10240.911189079285" + ], + [ + "05:00", + "14747.59193265438" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20364.247886538506" + ], + [ + "05:30", + "28459.98631489277" + ], + [ + "05:40", + "25730.680422976613" + ], + [ + "05:49", + "27020.28838004172" + ], + [ + "06:00", + "36028.31477924064" + ], + [ + "06:10", + "43611.85952364653" + ], + [ + "06:19", + "44809.230216991156" + ], + [ + "06:30", + "84425.27709580958" + ], + [ + "06:40", + "82493.299576208" + ], + [ + "06:49", + "88236.05687234178" + ], + [ + "07:00", + "116652.43129101768" + ], + [ + "07:10", + "118311.24182028696" + ], + [ + "07:19", + "122550.91666447744" + ], + [ + "07:30", + "120680.99991070479" + ], + [ + "07:40", + "125823.76901327446" + ], + [ + "07:49", + "117770.40686918423" + ], + [ + "08:00", + "122151.47995305061" + ], + [ + "08:10", + "112554.267947115" + ], + [ + "08:19", + "130849.85913445428" + ], + [ + "08:30", + "102335.97105936706" + ], + [ + "08:40", + "102159.07312686369" + ], + [ + "08:49", + "107317.45056152344" + ], + [ + "09:00", + "107087.94615885615" + ], + [ + "09:10", + "117479.2766706571" + ], + [ + "09:19", + "123910.1672979109" + ], + [ + "09:30", + "129940.61579728872" + ], + [ + "09:40", + "129135.27079512924" + ], + [ + "09:49", + "131717.1171552278" + ], + [ + "10:00", + "124023.95888963342" + ], + [ + "10:10", + "131488.02519186214" + ], + [ + "10:19", + "119981.13164405152" + ], + [ + "10:30", + "142663.99847487733" + ], + [ + "10:40", + "141939.49763879925" + ], + [ + "10:49", + "140620.72027832642" + ], + [ + "11:00", + "121510.95984230563" + ], + [ + "11:10", + "106107.00804445893" + ], + [ + "11:19", + "107144.45218217745" + ], + [ + "11:30", + "86173.86165357381" + ], + [ + "11:40", + "80756.30324059725" + ], + [ + "11:49", + "83026.9595419541" + ], + [ + "12:00", + "66499.82963436842" + ], + [ + "12:10", + "66522.10454239324" + ], + [ + "12:19", + "66767.47853575274" + ], + [ + "12:30", + "64797.937318291515" + ], + [ + "12:40", + "67540.4185876809" + ], + [ + "12:49", + "65817.49586266279" + ], + [ + "13:00", + "78893.71533411741" + ], + [ + "13:10", + "73186.95984994993" + ], + [ + "13:19", + "70820.12788375095" + ], + [ + "13:30", + "70141.49779724702" + ], + [ + "13:40", + "84438.92533489689" + ], + [ + "13:49", + "84645.03119849414" + ], + [ + "14:00", + "92751.94683626667" + ], + [ + "14:10", + "87159.73329018429" + ], + [ + "14:19", + "93246.05263940245" + ], + [ + "14:30", + "114421.92231094837" + ], + [ + "14:40", + "108935.24962072447" + ], + [ + "14:49", + "105085.34844318777" + ], + [ + "15:00", + "134634.76266261935" + ], + [ + "15:10", + "133594.49480363354" + ], + [ + "15:19", + "139617.18787082657" + ], + [ + "15:30", + "128217.16166194528" + ], + [ + "15:40", + "127250.38479238003" + ], + [ + "15:49", + "127925.5896627903" + ], + [ + "16:00", + "152510.46986863017" + ], + [ + "16:10", + "148874.2583978176" + ], + [ + "16:19", + "151230.81790877134" + ], + [ + "16:30", + "107271.56698781624" + ], + [ + "16:40", + "106096.95737218112" + ], + [ + "16:49", + "106781.60374093428" + ], + [ + "17:00", + "122290.48391813412" + ], + [ + "17:10", + "123406.75806841627" + ], + [ + "17:19", + "135934.28426523507" + ], + [ + "17:30", + "144874.6012623757" + ], + [ + "17:40", + "128595.86153997481" + ], + [ + "17:49", + "132427.4469172731" + ], + [ + "18:00", + "124987.8809068501" + ], + [ + "18:10", + "125323.04861487821" + ], + [ + "18:19", + "122169.98825505003" + ], + [ + "18:30", + "120369.02038862184" + ], + [ + "18:40", + "129061.70185616612" + ], + [ + "18:49", + "121210.32663008943" + ], + [ + "19:00", + "129968.94652555883" + ], + [ + "19:10", + "131935.00063871965" + ], + [ + "19:19", + "133914.28902984783" + ], + [ + "19:30", + "105752.50942078605" + ], + [ + "19:40", + "102922.43924526125" + ], + [ + "19:49", + "118489.34243253618" + ], + [ + "20:00", + "111287.41973752901" + ], + [ + "20:10", + "114647.97871280462" + ], + [ + "20:19", + "109956.89612265676" + ], + [ + "20:30", + "90391.92895484716" + ], + [ + "20:40", + "105613.34460686892" + ], + [ + "20:49", + "102467.60150550306" + ], + [ + "21:00", + "98823.85649678484" + ], + [ + "21:10", + "106246.67787430063" + ], + [ + "21:19", + "102564.0241005756" + ], + [ + "21:30", + "68453.44811526686" + ], + [ + "21:40", + "63265.85060498491" + ], + [ + "21:49", + "68141.74796426296" + ], + [ + "22:00", + "69350.52440794185" + ], + [ + "22:10", + "76802.08567362651" + ], + [ + "22:19", + "65153.63947523385" + ], + [ + "22:30", + "41843.99157308042" + ], + [ + "22:40", + "39165.55959096551" + ], + [ + "22:49", + "51238.52599506453" + ], + [ + "23:00", + "51276.68657583743" + ], + [ + "23:10", + "41077.39914666116" + ], + [ + "23:19", + "42151.66996664554" + ], + [ + "23:30", + "30736.063846215606" + ], + [ + "23:40", + "36045.196448497474" + ], + [ + "23:49", + "38385.81055063382" + ], + [ + "00:00", + "21591.845989063382" + ], + [ + "00:10", + "10654.732493117452" + ], + [ + "00:19", + "10611.375357069075" + ], + [ + "00:30", + "5985.382693145424" + ], + [ + "00:40", + "6057.369140423834" + ], + [ + "00:49", + "7414.433489698917" + ], + [ + "01:00", + "5372.706222161651" + ], + [ + "01:10", + "6427.535049766302" + ], + [ + "01:19", + "6284.730732411146" + ], + [ + "01:30", + "6337.76782887429" + ], + [ + "01:40", + "4290.477592796087" + ], + [ + "01:49", + "5177.2016314566135" + ], + [ + "02:00", + "6058.832576304674" + ], + [ + "02:10", + "4773.717004671693" + ], + [ + "02:19", + "4721.482507389039" + ], + [ + "02:30", + "5093.498391665518" + ], + [ + "02:40", + "4175.626140207052" + ], + [ + "02:49", + "5613.475714121014" + ], + [ + "03:00", + "1450.455493569374" + ], + [ + "03:10", + "7.14672714471817" + ], + [ + "03:19", + "7.662584066390989" + ], + [ + "03:30", + "15.863901615142826" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "5.607187271118163" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6545.189950123429, + 6547.63733536005, + 6831.531698405743, + 7917.918021798134, + 7749.150493249297, + 10240.911189079285, + 14747.59193265438, + 19564.96947826445, + 20364.247886538506, + 28459.98631489277, + 25730.680422976613, + 27020.28838004172, + 36028.31477924064, + 43611.85952364653, + 44809.230216991156, + 84425.27709580958, + 82493.299576208, + 88236.05687234178, + 116652.43129101768, + 118311.24182028696, + 122550.91666447744, + 120680.99991070479, + 125823.76901327446, + 117770.40686918423, + 122151.47995305061, + 112554.267947115, + 130849.85913445428, + 102335.97105936706, + 102159.07312686369, + 107317.45056152344, + 107087.94615885615, + 117479.2766706571, + 123910.1672979109, + 129940.61579728872, + 129135.27079512924, + 131717.1171552278, + 124023.95888963342, + 131488.02519186214, + 119981.13164405152, + 142663.99847487733, + 141939.49763879925, + 140620.72027832642, + 121510.95984230563, + 106107.00804445893, + 107144.45218217745, + 86173.86165357381, + 80756.30324059725, + 83026.9595419541, + 66499.82963436842, + 66522.10454239324, + 66767.47853575274, + 64797.937318291515, + 67540.4185876809, + 65817.49586266279, + 78893.71533411741, + 73186.95984994993, + 70820.12788375095, + 70141.49779724702, + 84438.92533489689, + 84645.03119849414, + 92751.94683626667, + 87159.73329018429, + 93246.05263940245, + 114421.92231094837, + 108935.24962072447, + 105085.34844318777, + 134634.76266261935, + 133594.49480363354, + 139617.18787082657, + 128217.16166194528, + 127250.38479238003, + 127925.5896627903, + 152510.46986863017, + 148874.2583978176, + 151230.81790877134, + 107271.56698781624, + 106096.95737218112, + 106781.60374093428, + 122290.48391813412, + 123406.75806841627, + 135934.28426523507, + 144874.6012623757, + 128595.86153997481, + 132427.4469172731, + 124987.8809068501, + 125323.04861487821, + 122169.98825505003, + 120369.02038862184, + 129061.70185616612, + 121210.32663008943, + 129968.94652555883, + 131935.00063871965, + 133914.28902984783, + 105752.50942078605, + 102922.43924526125, + 118489.34243253618, + 111287.41973752901, + 114647.97871280462, + 109956.89612265676, + 90391.92895484716, + 105613.34460686892, + 102467.60150550306, + 98823.85649678484, + 106246.67787430063, + 102564.0241005756, + 68453.44811526686, + 63265.85060498491, + 68141.74796426296, + 69350.52440794185, + 76802.08567362651, + 65153.63947523385, + 41843.99157308042, + 39165.55959096551, + 51238.52599506453, + 51276.68657583743, + 41077.39914666116, + 42151.66996664554, + 30736.063846215606, + 36045.196448497474, + 38385.81055063382, + 21591.845989063382, + 10654.732493117452, + 10611.375357069075, + 5985.382693145424, + 6057.369140423834, + 7414.433489698917, + 5372.706222161651, + 6427.535049766302, + 6284.730732411146, + 6337.76782887429, + 4290.477592796087, + 5177.2016314566135, + 6058.832576304674, + 4773.717004671693, + 4721.482507389039, + 5093.498391665518, + 4175.626140207052, + 5613.475714121014, + 1450.455493569374, + 7.14672714471817, + 7.662584066390989, + 15.863901615142826, + 0, + 0, + 0, + 5.607187271118163 + ] + }, + { + "customdata": [ + [ + "03:00", + "2442.159960307181" + ], + [ + "03:04", + "6101.76404106617" + ], + [ + "03:10", + "4096.84218621254" + ], + [ + "03:15", + "3993.5988091528416" + ], + [ + "03:19", + "3126.721272736788" + ], + [ + "03:25", + "5465.715449810028" + ], + [ + "03:30", + "5089.945628464222" + ], + [ + "03:34", + "5688.559496194124" + ], + [ + "03:40", + "6723.306904256344" + ], + [ + "03:45", + "4690.288877427578" + ], + [ + "03:49", + "6085.737823963165" + ], + [ + "03:55", + "4283.7068502902985" + ], + [ + "04:00", + "5101.243597000837" + ], + [ + "04:04", + "6466.667730510235" + ], + [ + "04:10", + "8500.7641299963" + ], + [ + "04:15", + "6714.211458384991" + ], + [ + "04:19", + "5791.346609741449" + ], + [ + "04:25", + "8004.908908009529" + ], + [ + "04:30", + "8393.852798223495" + ], + [ + "04:34", + "7430.817796647549" + ], + [ + "04:40", + "7555.4690218269825" + ], + [ + "04:45", + "7414.5700498223305" + ], + [ + "04:49", + "10203.112193226814" + ], + [ + "04:55", + "10176.470433533192" + ], + [ + "05:00", + "13261.239642262459" + ], + [ + "05:04", + "16175.50711414218" + ], + [ + "05:10", + "19223.32828053832" + ], + [ + "05:15", + "18330.48909366131" + ], + [ + "05:19", + "19876.531479746103" + ], + [ + "05:25", + "21772.77336037159" + ], + [ + "05:30", + "24298.180496782064" + ], + [ + "05:34", + "32329.95630785823" + ], + [ + "05:40", + "26033.78880929947" + ], + [ + "05:45", + "24567.817966282368" + ], + [ + "05:49", + "27876.194976836443" + ], + [ + "05:55", + "26587.557391941547" + ], + [ + "06:00", + "35969.47717731446" + ], + [ + "06:04", + "37623.14236611128" + ], + [ + "06:10", + "42955.84823973477" + ], + [ + "06:15", + "43184.211517721415" + ], + [ + "06:19", + "42747.49138042331" + ], + [ + "06:25", + "51048.90474676341" + ], + [ + "06:30", + "83735.81762811542" + ], + [ + "06:34", + "85709.50152549148" + ], + [ + "06:40", + "81129.73899111897" + ], + [ + "06:45", + "90927.46608906984" + ], + [ + "06:49", + "81034.02995708585" + ], + [ + "06:55", + "88572.18544084579" + ], + [ + "07:00", + "124660.40519640595" + ], + [ + "07:04", + "116904.58920110017" + ], + [ + "07:10", + "119343.42921218276" + ], + [ + "07:15", + "119012.49123555422" + ], + [ + "07:19", + "126488.60886284709" + ], + [ + "07:25", + "121940.94932220876" + ], + [ + "07:30", + "127538.99263072014" + ], + [ + "07:34", + "127064.54248903692" + ], + [ + "07:40", + "130154.0633039698" + ], + [ + "07:45", + "128814.77934868634" + ], + [ + "07:49", + "121412.45690643042" + ], + [ + "07:55", + "122546.94740344584" + ], + [ + "08:00", + "116625.88461886346" + ], + [ + "08:04", + "125128.35504499823" + ], + [ + "08:10", + "125076.5391080752" + ], + [ + "08:15", + "115795.74830970168" + ], + [ + "08:19", + "127485.3109568283" + ], + [ + "08:25", + "126044.93174886703" + ], + [ + "08:30", + "108728.03611817211" + ], + [ + "08:34", + "108161.61375834793" + ], + [ + "08:40", + "105064.50407579541" + ], + [ + "08:45", + "102118.92613665015" + ], + [ + "08:49", + "106159.67208722234" + ], + [ + "08:55", + "104713.74286821485" + ], + [ + "09:00", + "109700.59095040709" + ], + [ + "09:04", + "106102.71488779038" + ], + [ + "09:10", + "110397.7230026722" + ], + [ + "09:15", + "130955.98645077646" + ], + [ + "09:19", + "119763.57505054772" + ], + [ + "09:25", + "119476.7316678688" + ], + [ + "09:30", + "141689.2346702814" + ], + [ + "09:34", + "137743.88839522004" + ], + [ + "09:40", + "130650.41707523167" + ], + [ + "09:45", + "128164.82456434518" + ], + [ + "09:49", + "134391.29973770678" + ], + [ + "09:55", + "127369.48631069809" + ], + [ + "10:00", + "132323.3252762854" + ], + [ + "10:04", + "124883.4271255061" + ], + [ + "10:10", + "131660.0024594441" + ], + [ + "10:15", + "125729.97113484889" + ], + [ + "10:19", + "120806.97001571953" + ], + [ + "10:25", + "124340.46271202713" + ], + [ + "10:30", + "151175.25510500371" + ], + [ + "10:34", + "136245.2093012184" + ], + [ + "10:40", + "146775.95488639176" + ], + [ + "10:45", + "138499.7812634334" + ], + [ + "10:49", + "149466.7578696236" + ], + [ + "10:55", + "140526.67628169805" + ], + [ + "11:00", + "122007.00126611441" + ], + [ + "11:04", + "122865.15792513639" + ], + [ + "11:10", + "119273.83925369382" + ], + [ + "11:15", + "106582.90568782389" + ], + [ + "11:19", + "108305.56482186913" + ], + [ + "11:25", + "107744.24759978056" + ], + [ + "11:30", + "88099.09427782148" + ], + [ + "11:34", + "85685.08781933784" + ], + [ + "11:40", + "86463.36082188785" + ], + [ + "11:45", + "81954.31189394742" + ], + [ + "11:49", + "83061.75641287118" + ], + [ + "11:55", + "85340.56330756098" + ], + [ + "12:00", + "59956.420608244836" + ], + [ + "12:04", + "76164.33885392547" + ], + [ + "12:10", + "67119.8515715003" + ], + [ + "12:15", + "64970.918949857354" + ], + [ + "12:19", + "71042.46189916134" + ], + [ + "12:25", + "62139.49437189102" + ], + [ + "12:30", + "75243.36745876819" + ], + [ + "12:34", + "67754.55264924467" + ], + [ + "12:40", + "66328.1141545996" + ], + [ + "12:45", + "63618.18822777271" + ], + [ + "12:49", + "70061.66395148635" + ], + [ + "12:55", + "70031.08401348442" + ], + [ + "13:00", + "73604.83869089931" + ], + [ + "13:04", + "75796.39972237498" + ], + [ + "13:10", + "88397.98636418581" + ], + [ + "13:15", + "64762.33725193888" + ], + [ + "13:19", + "77096.89882732183" + ], + [ + "13:25", + "66134.02285377681" + ], + [ + "13:30", + "78957.52077908814" + ], + [ + "13:34", + "65920.05561447144" + ], + [ + "13:40", + "85297.38350980729" + ], + [ + "13:45", + "83998.50582329929" + ], + [ + "13:49", + "80681.96422091872" + ], + [ + "13:55", + "82501.70465471596" + ], + [ + "14:00", + "94231.08453194797" + ], + [ + "14:04", + "96997.16412623227" + ], + [ + "14:10", + "90040.8505306989" + ], + [ + "14:15", + "92302.82563901693" + ], + [ + "14:19", + "93978.2457601726" + ], + [ + "14:25", + "94053.0474903211" + ], + [ + "14:30", + "112098.62743484974" + ], + [ + "14:34", + "114847.64016640931" + ], + [ + "14:40", + "115024.11887412518" + ], + [ + "14:45", + "110981.68294604123" + ], + [ + "14:49", + "108123.12041328102" + ], + [ + "14:55", + "103304.00379145145" + ], + [ + "15:00", + "127781.37377467006" + ], + [ + "15:04", + "144584.79420083016" + ], + [ + "15:10", + "133237.65544961393" + ], + [ + "15:15", + "135602.5360186547" + ], + [ + "15:19", + "150155.37222386152" + ], + [ + "15:25", + "134485.15917744488" + ], + [ + "15:30", + "149563.4833671078" + ], + [ + "15:34", + "117269.12600393593" + ], + [ + "15:40", + "123921.3278889656" + ], + [ + "15:45", + "137988.383302778" + ], + [ + "15:49", + "122636.04209205508" + ], + [ + "15:55", + "135109.10547765344" + ], + [ + "16:00", + "159514.65452136844" + ], + [ + "16:04", + "147768.0811148286" + ], + [ + "16:10", + "147563.59453578293" + ], + [ + "16:15", + "155505.28014720976" + ], + [ + "16:19", + "153057.6689326018" + ], + [ + "16:25", + "149146.46730510145" + ], + [ + "16:30", + "119419.63546977192" + ], + [ + "16:34", + "118327.16562252492" + ], + [ + "16:40", + "110301.16407678276" + ], + [ + "16:45", + "109048.75903496146" + ], + [ + "16:49", + "106006.96316309273" + ], + [ + "16:55", + "107160.03734267503" + ], + [ + "17:00", + "120523.45299042016" + ], + [ + "17:04", + "121285.25514936447" + ], + [ + "17:10", + "126114.21617165208" + ], + [ + "17:15", + "129844.19807162136" + ], + [ + "17:19", + "156767.44842123985" + ], + [ + "17:25", + "135655.3715422824" + ], + [ + "17:30", + "139532.15956914425" + ], + [ + "17:34", + "142962.0831612423" + ], + [ + "17:40", + "125594.47365074605" + ], + [ + "17:45", + "131002.14585652202" + ], + [ + "17:49", + "149251.20131067932" + ], + [ + "17:55", + "129703.8017790243" + ], + [ + "18:00", + "133149.9636822939" + ], + [ + "18:04", + "121689.37213777006" + ], + [ + "18:10", + "124537.75486222655" + ], + [ + "18:15", + "130241.6926182881" + ], + [ + "18:19", + "117882.3039938584" + ], + [ + "18:25", + "127883.14960511774" + ], + [ + "18:30", + "117176.94523823261" + ], + [ + "18:34", + "130392.52203941345" + ], + [ + "18:40", + "128664.3219338134" + ], + [ + "18:45", + "132710.53314813226" + ], + [ + "18:49", + "124541.21405442059" + ], + [ + "18:55", + "123036.89000228047" + ], + [ + "19:00", + "136620.8825027123" + ], + [ + "19:04", + "126777.15106918663" + ], + [ + "19:10", + "133615.4372830689" + ], + [ + "19:15", + "131867.83353006095" + ], + [ + "19:19", + "135065.65061149746" + ], + [ + "19:25", + "137679.74942676723" + ], + [ + "19:30", + "118393.324091658" + ], + [ + "19:34", + "100384.6061874032" + ], + [ + "19:40", + "100131.69933532923" + ], + [ + "19:45", + "111484.06697865576" + ], + [ + "19:49", + "118040.95872724056" + ], + [ + "19:55", + "118956.45714826137" + ], + [ + "20:00", + "110418.13855873793" + ], + [ + "20:04", + "117404.6205926612" + ], + [ + "20:10", + "120113.88420615345" + ], + [ + "20:15", + "113954.48816167563" + ], + [ + "20:19", + "105464.0087928772" + ], + [ + "20:25", + "114903.04009086639" + ], + [ + "20:30", + "90582.76298531145" + ], + [ + "20:34", + "99977.28023725748" + ], + [ + "20:40", + "111648.63689944893" + ], + [ + "20:45", + "111073.29131430387" + ], + [ + "20:49", + "93350.96177005023" + ], + [ + "20:55", + "99777.66455516964" + ], + [ + "21:00", + "104445.18437719345" + ], + [ + "21:04", + "99716.15071322769" + ], + [ + "21:10", + "107342.17645637691" + ], + [ + "21:15", + "107169.76542824507" + ], + [ + "21:19", + "99286.43326109648" + ], + [ + "21:25", + "103921.33797734231" + ], + [ + "21:30", + "67096.39472863823" + ], + [ + "21:34", + "68431.62763381004" + ], + [ + "21:40", + "72172.02985315025" + ], + [ + "21:45", + "61287.53478645533" + ], + [ + "21:49", + "67930.70524203032" + ], + [ + "21:55", + "80373.74432064593" + ], + [ + "22:00", + "65956.21784037352" + ], + [ + "22:04", + "83583.05131521821" + ], + [ + "22:10", + "63187.834031648934" + ], + [ + "22:15", + "72082.73197634518" + ], + [ + "22:19", + "61087.43166703731" + ], + [ + "22:25", + "70804.4464006573" + ], + [ + "22:30", + "44266.9039362967" + ], + [ + "22:34", + "34819.01328326762" + ], + [ + "22:40", + "48097.2586908862" + ], + [ + "22:45", + "41138.89569917321" + ], + [ + "22:49", + "52781.80184108019" + ], + [ + "22:55", + "60510.71275509149" + ], + [ + "23:00", + "45011.91629482806" + ], + [ + "23:04", + "43279.417712531984" + ], + [ + "23:10", + "45475.11655046046" + ], + [ + "23:15", + "37594.81166553497" + ], + [ + "23:19", + "42930.88209553063" + ], + [ + "23:25", + "40929.38628291339" + ], + [ + "23:30", + "33160.784819841385" + ], + [ + "23:34", + "31388.137028709054" + ], + [ + "23:40", + "38113.18020924926" + ], + [ + "23:45", + "34160.550609871745" + ], + [ + "23:49", + "36192.269059717655" + ], + [ + "23:55", + "37386.37595676631" + ], + [ + "00:00", + "28652.36933925748" + ], + [ + "00:04", + "19040.519249796867" + ], + [ + "00:10", + "13433.548933625221" + ], + [ + "00:15", + "9125.798127382994" + ], + [ + "00:19", + "10214.753816708922" + ], + [ + "00:25", + "9024.98402774334" + ], + [ + "00:30", + "7004.370533198118" + ], + [ + "00:34", + "7340.190939724445" + ], + [ + "00:40", + "6784.986977130175" + ], + [ + "00:45", + "4987.887875542045" + ], + [ + "00:49", + "7601.605780877173" + ], + [ + "00:55", + "6202.862804621458" + ], + [ + "01:00", + "5181.262627825141" + ], + [ + "01:04", + "5869.1110798716545" + ], + [ + "01:10", + "6018.820188224316" + ], + [ + "01:15", + "6715.892774373293" + ], + [ + "01:19", + "5985.611427694559" + ], + [ + "01:25", + "5101.61710730195" + ], + [ + "01:30", + "6182.105372965336" + ], + [ + "01:34", + "6876.544570147991" + ], + [ + "01:40", + "4929.652284443378" + ], + [ + "01:45", + "3392.4147528111935" + ], + [ + "01:49", + "4852.815797388554" + ], + [ + "01:55", + "5736.038982242346" + ], + [ + "02:00", + "4955.5584652125835" + ], + [ + "02:04", + "7322.8105791807175" + ], + [ + "02:10", + "5507.61053609848" + ], + [ + "02:15", + "3723.8851978182793" + ], + [ + "02:19", + "4048.386190675199" + ], + [ + "02:25", + "6019.224536776543" + ], + [ + "02:30", + "4825.895241558552" + ], + [ + "02:34", + "5790.674214497209" + ], + [ + "02:40", + "6023.2846865057945" + ], + [ + "02:45", + "4219.018591403961" + ], + [ + "02:49", + "3611.283351369202" + ], + [ + "02:55", + "5198.9147554636" + ], + [ + "03:00", + "3392.709280014038" + ], + [ + "03:04", + "528.8130862712861" + ], + [ + "03:10", + "10.362660884857178" + ], + [ + "03:15", + "286.13176131248474" + ], + [ + "03:19", + "0.0" + ], + [ + "03:25", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:34", + "280.83453369140625" + ], + [ + "03:40", + "280.83453369140625" + ], + [ + "03:45", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "03:55", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:04", + "280.83453369140625" + ], + [ + "04:10", + "292.0489082336426" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25, + 23.333333333333332, + 23.416666666666668, + 23.5, + 23.583333333333332, + 23.666666666666668, + 23.75, + 23.833333333333332, + 23.916666666666668, + 24, + 24.083333333333332, + 24.166666666666668, + 24.25, + 24.333333333333332, + 24.416666666666668, + 24.5, + 24.583333333333332, + 24.666666666666668, + 24.75, + 24.833333333333332, + 24.916666666666668, + 25, + 25.083333333333332, + 25.166666666666668 + ], + "y": [ + 2442.159960307181, + 6101.76404106617, + 4096.84218621254, + 3993.5988091528416, + 3126.721272736788, + 5465.715449810028, + 5089.945628464222, + 5688.559496194124, + 6723.306904256344, + 4690.288877427578, + 6085.737823963165, + 4283.7068502902985, + 5101.243597000837, + 6466.667730510235, + 8500.7641299963, + 6714.211458384991, + 5791.346609741449, + 8004.908908009529, + 8393.852798223495, + 7430.817796647549, + 7555.4690218269825, + 7414.5700498223305, + 10203.112193226814, + 10176.470433533192, + 13261.239642262459, + 16175.50711414218, + 19223.32828053832, + 18330.48909366131, + 19876.531479746103, + 21772.77336037159, + 24298.180496782064, + 32329.95630785823, + 26033.78880929947, + 24567.817966282368, + 27876.194976836443, + 26587.557391941547, + 35969.47717731446, + 37623.14236611128, + 42955.84823973477, + 43184.211517721415, + 42747.49138042331, + 51048.90474676341, + 83735.81762811542, + 85709.50152549148, + 81129.73899111897, + 90927.46608906984, + 81034.02995708585, + 88572.18544084579, + 124660.40519640595, + 116904.58920110017, + 119343.42921218276, + 119012.49123555422, + 126488.60886284709, + 121940.94932220876, + 127538.99263072014, + 127064.54248903692, + 130154.0633039698, + 128814.77934868634, + 121412.45690643042, + 122546.94740344584, + 116625.88461886346, + 125128.35504499823, + 125076.5391080752, + 115795.74830970168, + 127485.3109568283, + 126044.93174886703, + 108728.03611817211, + 108161.61375834793, + 105064.50407579541, + 102118.92613665015, + 106159.67208722234, + 104713.74286821485, + 109700.59095040709, + 106102.71488779038, + 110397.7230026722, + 130955.98645077646, + 119763.57505054772, + 119476.7316678688, + 141689.2346702814, + 137743.88839522004, + 130650.41707523167, + 128164.82456434518, + 134391.29973770678, + 127369.48631069809, + 132323.3252762854, + 124883.4271255061, + 131660.0024594441, + 125729.97113484889, + 120806.97001571953, + 124340.46271202713, + 151175.25510500371, + 136245.2093012184, + 146775.95488639176, + 138499.7812634334, + 149466.7578696236, + 140526.67628169805, + 122007.00126611441, + 122865.15792513639, + 119273.83925369382, + 106582.90568782389, + 108305.56482186913, + 107744.24759978056, + 88099.09427782148, + 85685.08781933784, + 86463.36082188785, + 81954.31189394742, + 83061.75641287118, + 85340.56330756098, + 59956.420608244836, + 76164.33885392547, + 67119.8515715003, + 64970.918949857354, + 71042.46189916134, + 62139.49437189102, + 75243.36745876819, + 67754.55264924467, + 66328.1141545996, + 63618.18822777271, + 70061.66395148635, + 70031.08401348442, + 73604.83869089931, + 75796.39972237498, + 88397.98636418581, + 64762.33725193888, + 77096.89882732183, + 66134.02285377681, + 78957.52077908814, + 65920.05561447144, + 85297.38350980729, + 83998.50582329929, + 80681.96422091872, + 82501.70465471596, + 94231.08453194797, + 96997.16412623227, + 90040.8505306989, + 92302.82563901693, + 93978.2457601726, + 94053.0474903211, + 112098.62743484974, + 114847.64016640931, + 115024.11887412518, + 110981.68294604123, + 108123.12041328102, + 103304.00379145145, + 127781.37377467006, + 144584.79420083016, + 133237.65544961393, + 135602.5360186547, + 150155.37222386152, + 134485.15917744488, + 149563.4833671078, + 117269.12600393593, + 123921.3278889656, + 137988.383302778, + 122636.04209205508, + 135109.10547765344, + 159514.65452136844, + 147768.0811148286, + 147563.59453578293, + 155505.28014720976, + 153057.6689326018, + 149146.46730510145, + 119419.63546977192, + 118327.16562252492, + 110301.16407678276, + 109048.75903496146, + 106006.96316309273, + 107160.03734267503, + 120523.45299042016, + 121285.25514936447, + 126114.21617165208, + 129844.19807162136, + 156767.44842123985, + 135655.3715422824, + 139532.15956914425, + 142962.0831612423, + 125594.47365074605, + 131002.14585652202, + 149251.20131067932, + 129703.8017790243, + 133149.9636822939, + 121689.37213777006, + 124537.75486222655, + 130241.6926182881, + 117882.3039938584, + 127883.14960511774, + 117176.94523823261, + 130392.52203941345, + 128664.3219338134, + 132710.53314813226, + 124541.21405442059, + 123036.89000228047, + 136620.8825027123, + 126777.15106918663, + 133615.4372830689, + 131867.83353006095, + 135065.65061149746, + 137679.74942676723, + 118393.324091658, + 100384.6061874032, + 100131.69933532923, + 111484.06697865576, + 118040.95872724056, + 118956.45714826137, + 110418.13855873793, + 117404.6205926612, + 120113.88420615345, + 113954.48816167563, + 105464.0087928772, + 114903.04009086639, + 90582.76298531145, + 99977.28023725748, + 111648.63689944893, + 111073.29131430387, + 93350.96177005023, + 99777.66455516964, + 104445.18437719345, + 99716.15071322769, + 107342.17645637691, + 107169.76542824507, + 99286.43326109648, + 103921.33797734231, + 67096.39472863823, + 68431.62763381004, + 72172.02985315025, + 61287.53478645533, + 67930.70524203032, + 80373.74432064593, + 65956.21784037352, + 83583.05131521821, + 63187.834031648934, + 72082.73197634518, + 61087.43166703731, + 70804.4464006573, + 44266.9039362967, + 34819.01328326762, + 48097.2586908862, + 41138.89569917321, + 52781.80184108019, + 60510.71275509149, + 45011.91629482806, + 43279.417712531984, + 45475.11655046046, + 37594.81166553497, + 42930.88209553063, + 40929.38628291339, + 33160.784819841385, + 31388.137028709054, + 38113.18020924926, + 34160.550609871745, + 36192.269059717655, + 37386.37595676631, + 28652.36933925748, + 19040.519249796867, + 13433.548933625221, + 9125.798127382994, + 10214.753816708922, + 9024.98402774334, + 7004.370533198118, + 7340.190939724445, + 6784.986977130175, + 4987.887875542045, + 7601.605780877173, + 6202.862804621458, + 5181.262627825141, + 5869.1110798716545, + 6018.820188224316, + 6715.892774373293, + 5985.611427694559, + 5101.61710730195, + 6182.105372965336, + 6876.544570147991, + 4929.652284443378, + 3392.4147528111935, + 4852.815797388554, + 5736.038982242346, + 4955.5584652125835, + 7322.8105791807175, + 5507.61053609848, + 3723.8851978182793, + 4048.386190675199, + 6019.224536776543, + 4825.895241558552, + 5790.674214497209, + 6023.2846865057945, + 4219.018591403961, + 3611.283351369202, + 5198.9147554636, + 3392.709280014038, + 528.8130862712861, + 10.362660884857178, + 286.13176131248474, + 0, + 0, + 0, + 280.83453369140625, + 280.83453369140625, + 0, + 0, + 0, + 0, + 280.83453369140625, + 292.0489082336426 + ] + }, + { + "customdata": [ + [ + "03:00", + "4485.755118459463" + ], + [ + "03:15", + "4557.913561761379" + ], + [ + "03:30", + "5988.271899431944" + ], + [ + "03:45", + "4822.989013969898" + ], + [ + "04:00", + "6956.778880864382" + ], + [ + "04:15", + "6367.618642926216" + ], + [ + "04:30", + "8126.923464357853" + ], + [ + "04:45", + "9691.798774063587" + ], + [ + "05:00", + "17089.880058139563" + ], + [ + "05:15", + "19568.821277737617" + ], + [ + "05:30", + "27738.935208916664" + ], + [ + "05:45", + "25188.611421078444" + ], + [ + "06:00", + "40534.23557115346" + ], + [ + "06:15", + "44201.45986075699" + ], + [ + "06:30", + "79169.73386166245" + ], + [ + "06:45", + "87452.66169828922" + ], + [ + "07:00", + "113885.13113545626" + ], + [ + "07:15", + "118884.21564413607" + ], + [ + "07:30", + "121380.37281801552" + ], + [ + "07:45", + "119103.61916820705" + ], + [ + "08:00", + "120032.91322673857" + ], + [ + "08:15", + "118578.36023744196" + ], + [ + "08:30", + "101266.07582936436" + ], + [ + "08:45", + "104215.2040271312" + ], + [ + "09:00", + "110842.19760840386" + ], + [ + "09:15", + "121646.57342371345" + ], + [ + "09:30", + "130184.57588984072" + ], + [ + "09:45", + "130972.4649060443" + ], + [ + "10:00", + "123494.1735746488" + ], + [ + "10:15", + "124046.40502565354" + ], + [ + "10:30", + "141743.8639087677" + ], + [ + "10:45", + "141043.99079396576" + ], + [ + "11:00", + "111279.7785282135" + ], + [ + "11:15", + "104633.79055214673" + ], + [ + "11:30", + "83731.66694052517" + ], + [ + "11:45", + "83820.61348812282" + ], + [ + "12:00", + "63062.240612626076" + ], + [ + "12:15", + "67394.8071359843" + ], + [ + "12:30", + "70603.26218471676" + ], + [ + "12:45", + "69509.97431639582" + ], + [ + "13:00", + "72644.00493396074" + ], + [ + "13:15", + "68761.91197061539" + ], + [ + "13:30", + "80571.4309020415" + ], + [ + "13:45", + "81409.43620730937" + ], + [ + "14:00", + "90541.9850595817" + ], + [ + "14:15", + "90250.35380654782" + ], + [ + "14:30", + "110822.05694682151" + ], + [ + "14:45", + "103577.43951606005" + ], + [ + "15:00", + "133431.11001945287" + ], + [ + "15:15", + "136558.45506640524" + ], + [ + "15:30", + "124206.29655195773" + ], + [ + "15:45", + "132366.9923855886" + ], + [ + "16:00", + "145999.3775229007" + ], + [ + "16:15", + "149464.55615804344" + ], + [ + "16:30", + "102960.25752492994" + ], + [ + "16:45", + "105251.25050286204" + ], + [ + "17:00", + "129330.82350979745" + ], + [ + "17:15", + "132740.209937118" + ], + [ + "17:30", + "131700.91199414432" + ], + [ + "17:45", + "132745.6601632759" + ], + [ + "18:00", + "121407.93565369397" + ], + [ + "18:15", + "123123.39313645661" + ], + [ + "18:30", + "119328.59956365079" + ], + [ + "18:45", + "124503.53632238507" + ], + [ + "19:00", + "132192.60184065253" + ], + [ + "19:15", + "133297.48297838122" + ], + [ + "19:30", + "104651.03494750708" + ], + [ + "19:45", + "107630.94857145846" + ], + [ + "20:00", + "114643.02101349086" + ], + [ + "20:15", + "107152.88148698956" + ], + [ + "20:30", + "98472.76967474073" + ], + [ + "20:45", + "97909.33504038304" + ], + [ + "21:00", + "102957.72591420263" + ], + [ + "21:15", + "103267.4614707008" + ], + [ + "21:30", + "68526.00731284916" + ], + [ + "21:45", + "69351.27075580508" + ], + [ + "22:00", + "68050.5000955984" + ], + [ + "22:15", + "67571.79631021619" + ], + [ + "22:30", + "42063.43487236649" + ], + [ + "22:45", + "52407.897122204304" + ], + [ + "23:00", + "41270.982170298696" + ], + [ + "23:15", + "40404.327856719494" + ], + [ + "23:30", + "35413.332149513066" + ], + [ + "23:45", + "39626.20618624985" + ], + [ + "00:00", + "10845.067101120949" + ], + [ + "00:15", + "9881.245077759027" + ], + [ + "00:30", + "6566.969636745751" + ], + [ + "00:45", + "6444.5699575170875" + ], + [ + "01:00", + "7661.199453279376" + ], + [ + "01:15", + "6452.405355259776" + ], + [ + "01:30", + "5303.7677501142025" + ], + [ + "01:45", + "6025.500093609095" + ], + [ + "02:00", + "4952.930771321058" + ], + [ + "02:15", + "4871.247457593679" + ], + [ + "02:30", + "5139.492730304599" + ], + [ + "02:45", + "5386.579685077071" + ], + [ + "03:00", + "26.88139772415161" + ], + [ + "03:15", + "33.96258068084717" + ], + [ + "03:30", + "4.40873908996582" + ], + [ + "03:45", + "93.61151123046875" + ], + [ + "04:00", + "108.56401062011719" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25, + 23.5, + 23.75, + 24, + 24.25, + 24.5, + 24.75, + 25 + ], + "y": [ + 4485.755118459463, + 4557.913561761379, + 5988.271899431944, + 4822.989013969898, + 6956.778880864382, + 6367.618642926216, + 8126.923464357853, + 9691.798774063587, + 17089.880058139563, + 19568.821277737617, + 27738.935208916664, + 25188.611421078444, + 40534.23557115346, + 44201.45986075699, + 79169.73386166245, + 87452.66169828922, + 113885.13113545626, + 118884.21564413607, + 121380.37281801552, + 119103.61916820705, + 120032.91322673857, + 118578.36023744196, + 101266.07582936436, + 104215.2040271312, + 110842.19760840386, + 121646.57342371345, + 130184.57588984072, + 130972.4649060443, + 123494.1735746488, + 124046.40502565354, + 141743.8639087677, + 141043.99079396576, + 111279.7785282135, + 104633.79055214673, + 83731.66694052517, + 83820.61348812282, + 63062.240612626076, + 67394.8071359843, + 70603.26218471676, + 69509.97431639582, + 72644.00493396074, + 68761.91197061539, + 80571.4309020415, + 81409.43620730937, + 90541.9850595817, + 90250.35380654782, + 110822.05694682151, + 103577.43951606005, + 133431.11001945287, + 136558.45506640524, + 124206.29655195773, + 132366.9923855886, + 145999.3775229007, + 149464.55615804344, + 102960.25752492994, + 105251.25050286204, + 129330.82350979745, + 132740.209937118, + 131700.91199414432, + 132745.6601632759, + 121407.93565369397, + 123123.39313645661, + 119328.59956365079, + 124503.53632238507, + 132192.60184065253, + 133297.48297838122, + 104651.03494750708, + 107630.94857145846, + 114643.02101349086, + 107152.88148698956, + 98472.76967474073, + 97909.33504038304, + 102957.72591420263, + 103267.4614707008, + 68526.00731284916, + 69351.27075580508, + 68050.5000955984, + 67571.79631021619, + 42063.43487236649, + 52407.897122204304, + 41270.982170298696, + 40404.327856719494, + 35413.332149513066, + 39626.20618624985, + 10845.067101120949, + 9881.245077759027, + 6566.969636745751, + 6444.5699575170875, + 7661.199453279376, + 6452.405355259776, + 5303.7677501142025, + 6025.500093609095, + 4952.930771321058, + 4871.247457593679, + 5139.492730304599, + 5386.579685077071, + 26.88139772415161, + 33.96258068084717, + 4.40873908996582, + 93.61151123046875, + 108.56401062011719 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC VMT (normalized to per-hour) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6545.189950123429" + ], + [ + "04:10", + "6547.63733536005" + ], + [ + "04:19", + "6831.531698405743" + ], + [ + "04:30", + "7917.918021798134" + ], + [ + "04:40", + "7749.150493249297" + ], + [ + "04:49", + "10240.911189079285" + ], + [ + "05:00", + "14747.59193265438" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20364.247886538506" + ], + [ + "05:30", + "28459.98631489277" + ], + [ + "05:40", + "25730.680422976613" + ], + [ + "05:49", + "27020.28838004172" + ], + [ + "06:00", + "36028.31477924064" + ], + [ + "06:10", + "43611.85952364653" + ], + [ + "06:19", + "44809.230216991156" + ], + [ + "06:30", + "84425.27709580958" + ], + [ + "06:40", + "82493.299576208" + ], + [ + "06:49", + "88236.05687234178" + ], + [ + "07:00", + "116652.43129101768" + ], + [ + "07:10", + "118311.24182028696" + ], + [ + "07:19", + "122550.91666447744" + ], + [ + "07:30", + "120680.99991070479" + ], + [ + "07:40", + "125823.76901327446" + ], + [ + "07:49", + "117770.40686918423" + ], + [ + "08:00", + "122151.47995305061" + ], + [ + "08:10", + "112554.267947115" + ], + [ + "08:19", + "130849.85913445428" + ], + [ + "08:30", + "102335.97105936706" + ], + [ + "08:40", + "102159.07312686369" + ], + [ + "08:49", + "107317.45056152344" + ], + [ + "09:00", + "107087.94615885615" + ], + [ + "09:10", + "117479.2766706571" + ], + [ + "09:19", + "123910.1672979109" + ], + [ + "09:30", + "129940.61579728872" + ], + [ + "09:40", + "129135.27079512924" + ], + [ + "09:49", + "131717.1171552278" + ], + [ + "10:00", + "124023.95888963342" + ], + [ + "10:10", + "131488.02519186214" + ], + [ + "10:19", + "119981.13164405152" + ], + [ + "10:30", + "142663.99847487733" + ], + [ + "10:40", + "141939.49763879925" + ], + [ + "10:49", + "140620.72027832642" + ], + [ + "11:00", + "121510.95984230563" + ], + [ + "11:10", + "106107.00804445893" + ], + [ + "11:19", + "107144.45218217745" + ], + [ + "11:30", + "86173.86165357381" + ], + [ + "11:40", + "80756.30324059725" + ], + [ + "11:49", + "83026.9595419541" + ], + [ + "12:00", + "66499.82963436842" + ], + [ + "12:10", + "66522.10454239324" + ], + [ + "12:19", + "66767.47853575274" + ], + [ + "12:30", + "64797.937318291515" + ], + [ + "12:40", + "67540.4185876809" + ], + [ + "12:49", + "65817.49586266279" + ], + [ + "13:00", + "78893.71533411741" + ], + [ + "13:10", + "73186.95984994993" + ], + [ + "13:19", + "70820.12788375095" + ], + [ + "13:30", + "70141.49779724702" + ], + [ + "13:40", + "84438.92533489689" + ], + [ + "13:49", + "84645.03119849414" + ], + [ + "14:00", + "92751.94683626667" + ], + [ + "14:10", + "87159.73329018429" + ], + [ + "14:19", + "93246.05263940245" + ], + [ + "14:30", + "114421.92231094837" + ], + [ + "14:40", + "108935.24962072447" + ], + [ + "14:49", + "105085.34844318777" + ], + [ + "15:00", + "134634.76266261935" + ], + [ + "15:10", + "133594.49480363354" + ], + [ + "15:19", + "139617.18787082657" + ], + [ + "15:30", + "128217.16166194528" + ], + [ + "15:40", + "127250.38479238003" + ], + [ + "15:49", + "127925.5896627903" + ], + [ + "16:00", + "152510.46986863017" + ], + [ + "16:10", + "148874.2583978176" + ], + [ + "16:19", + "151230.81790877134" + ], + [ + "16:30", + "107271.56698781624" + ], + [ + "16:40", + "106096.95737218112" + ], + [ + "16:49", + "106781.60374093428" + ], + [ + "17:00", + "122290.48391813412" + ], + [ + "17:10", + "123406.75806841627" + ], + [ + "17:19", + "135934.28426523507" + ], + [ + "17:30", + "144874.6012623757" + ], + [ + "17:40", + "128595.86153997481" + ], + [ + "17:49", + "132427.4469172731" + ], + [ + "18:00", + "124987.8809068501" + ], + [ + "18:10", + "125323.04861487821" + ], + [ + "18:19", + "122169.98825505003" + ], + [ + "18:30", + "120369.02038862184" + ], + [ + "18:40", + "129061.70185616612" + ], + [ + "18:49", + "121210.32663008943" + ], + [ + "19:00", + "129968.94652555883" + ], + [ + "19:10", + "131935.00063871965" + ], + [ + "19:19", + "133914.28902984783" + ], + [ + "19:30", + "105752.50942078605" + ], + [ + "19:40", + "102922.43924526125" + ], + [ + "19:49", + "118489.34243253618" + ], + [ + "20:00", + "111287.41973752901" + ], + [ + "20:10", + "114647.97871280462" + ], + [ + "20:19", + "109956.89612265676" + ], + [ + "20:30", + "90391.92895484716" + ], + [ + "20:40", + "105613.34460686892" + ], + [ + "20:49", + "102467.60150550306" + ], + [ + "21:00", + "98823.85649678484" + ], + [ + "21:10", + "106246.67787430063" + ], + [ + "21:19", + "102564.0241005756" + ], + [ + "21:30", + "68453.44811526686" + ], + [ + "21:40", + "63265.85060498491" + ], + [ + "21:49", + "68141.74796426296" + ], + [ + "22:00", + "69350.52440794185" + ], + [ + "22:10", + "76802.08567362651" + ], + [ + "22:19", + "65153.63947523385" + ], + [ + "22:30", + "41843.99157308042" + ], + [ + "22:40", + "39165.55959096551" + ], + [ + "22:49", + "51238.52599506453" + ], + [ + "23:00", + "51276.68657583743" + ], + [ + "23:10", + "41077.39914666116" + ], + [ + "23:19", + "42151.66996664554" + ], + [ + "23:30", + "30736.063846215606" + ], + [ + "23:40", + "36045.196448497474" + ], + [ + "23:49", + "38385.81055063382" + ], + [ + "00:00", + "21591.845989063382" + ], + [ + "00:10", + "10654.732493117452" + ], + [ + "00:19", + "10611.375357069075" + ], + [ + "00:30", + "5985.382693145424" + ], + [ + "00:40", + "6057.369140423834" + ], + [ + "00:49", + "7414.433489698917" + ], + [ + "01:00", + "5372.706222161651" + ], + [ + "01:10", + "6427.535049766302" + ], + [ + "01:19", + "6284.730732411146" + ], + [ + "01:30", + "6337.76782887429" + ], + [ + "01:40", + "4290.477592796087" + ], + [ + "01:49", + "5177.2016314566135" + ], + [ + "02:00", + "6058.832576304674" + ], + [ + "02:10", + "4773.717004671693" + ], + [ + "02:19", + "4721.482507389039" + ], + [ + "02:30", + "5093.498391665518" + ], + [ + "02:40", + "4175.626140207052" + ], + [ + "02:49", + "5613.475714121014" + ], + [ + "03:00", + "1450.455493569374" + ], + [ + "03:10", + "7.14672714471817" + ], + [ + "03:19", + "7.662584066390989" + ], + [ + "03:30", + "15.863901615142826" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "5.607187271118163" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6545.189950123429, + 6547.63733536005, + 6831.531698405743, + 7917.918021798134, + 7749.150493249297, + 10240.911189079285, + 14747.59193265438, + 19564.96947826445, + 20364.247886538506, + 28459.98631489277, + 25730.680422976613, + 27020.28838004172, + 36028.31477924064, + 43611.85952364653, + 44809.230216991156, + 84425.27709580958, + 82493.299576208, + 88236.05687234178, + 116652.43129101768, + 118311.24182028696, + 122550.91666447744, + 120680.99991070479, + 125823.76901327446, + 117770.40686918423, + 122151.47995305061, + 112554.267947115, + 130849.85913445428, + 102335.97105936706, + 102159.07312686369, + 107317.45056152344, + 107087.94615885615, + 117479.2766706571, + 123910.1672979109, + 129940.61579728872, + 129135.27079512924, + 131717.1171552278, + 124023.95888963342, + 131488.02519186214, + 119981.13164405152, + 142663.99847487733, + 141939.49763879925, + 140620.72027832642, + 121510.95984230563, + 106107.00804445893, + 107144.45218217745, + 86173.86165357381, + 80756.30324059725, + 83026.9595419541, + 66499.82963436842, + 66522.10454239324, + 66767.47853575274, + 64797.937318291515, + 67540.4185876809, + 65817.49586266279, + 78893.71533411741, + 73186.95984994993, + 70820.12788375095, + 70141.49779724702, + 84438.92533489689, + 84645.03119849414, + 92751.94683626667, + 87159.73329018429, + 93246.05263940245, + 114421.92231094837, + 108935.24962072447, + 105085.34844318777, + 134634.76266261935, + 133594.49480363354, + 139617.18787082657, + 128217.16166194528, + 127250.38479238003, + 127925.5896627903, + 152510.46986863017, + 148874.2583978176, + 151230.81790877134, + 107271.56698781624, + 106096.95737218112, + 106781.60374093428, + 122290.48391813412, + 123406.75806841627, + 135934.28426523507, + 144874.6012623757, + 128595.86153997481, + 132427.4469172731, + 124987.8809068501, + 125323.04861487821, + 122169.98825505003, + 120369.02038862184, + 129061.70185616612, + 121210.32663008943, + 129968.94652555883, + 131935.00063871965, + 133914.28902984783, + 105752.50942078605, + 102922.43924526125, + 118489.34243253618, + 111287.41973752901, + 114647.97871280462, + 109956.89612265676, + 90391.92895484716, + 105613.34460686892, + 102467.60150550306, + 98823.85649678484, + 106246.67787430063, + 102564.0241005756, + 68453.44811526686, + 63265.85060498491, + 68141.74796426296, + 69350.52440794185, + 76802.08567362651, + 65153.63947523385, + 41843.99157308042, + 39165.55959096551, + 51238.52599506453, + 51276.68657583743, + 41077.39914666116, + 42151.66996664554, + 30736.063846215606, + 36045.196448497474, + 38385.81055063382, + 21591.845989063382, + 10654.732493117452, + 10611.375357069075, + 5985.382693145424, + 6057.369140423834, + 7414.433489698917, + 5372.706222161651, + 6427.535049766302, + 6284.730732411146, + 6337.76782887429, + 4290.477592796087, + 5177.2016314566135, + 6058.832576304674, + 4773.717004671693, + 4721.482507389039, + 5093.498391665518, + 4175.626140207052, + 5613.475714121014, + 1450.455493569374, + 7.14672714471817, + 7.662584066390989, + 15.863901615142826, + 0, + 0, + 0, + 5.607187271118163 + ] + }, + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6588.2267049103975" + ], + [ + "04:10", + "6587.856102526188" + ], + [ + "04:19", + "6812.534496545792" + ], + [ + "04:30", + "7969.2893253564835" + ], + [ + "04:40", + "7879.3395750671625" + ], + [ + "04:49", + "10196.498922228813" + ], + [ + "05:00", + "14652.384609550238" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20355.99275779724" + ], + [ + "05:30", + "28488.71261626482" + ], + [ + "05:40", + "25575.99373139441" + ], + [ + "05:49", + "27278.6989890486" + ], + [ + "06:00", + "36266.62487374619" + ], + [ + "06:10", + "43446.70004674047" + ], + [ + "06:19", + "44588.7249420248" + ], + [ + "06:30", + "84042.5329053551" + ], + [ + "06:40", + "82995.78483706713" + ], + [ + "06:49", + "88806.87232778594" + ], + [ + "07:00", + "117812.18942685798" + ], + [ + "07:10", + "116945.58462246135" + ], + [ + "07:19", + "121613.67801458761" + ], + [ + "07:30", + "121559.20003021136" + ], + [ + "07:40", + "125328.94741408154" + ], + [ + "07:49", + "119797.89487463236" + ], + [ + "08:00", + "120796.24983779714" + ], + [ + "08:10", + "111820.86610364914" + ], + [ + "08:19", + "132396.80731078237" + ], + [ + "08:30", + "102030.63455875218" + ], + [ + "08:40", + "102588.72410837933" + ], + [ + "08:49", + "107734.27281019092" + ], + [ + "09:00", + "106958.96883501112" + ], + [ + "09:10", + "117116.89392151684" + ], + [ + "09:19", + "124343.97394574806" + ], + [ + "09:30", + "129383.25742889196" + ], + [ + "09:40", + "129464.49567063153" + ], + [ + "09:49", + "132323.98019122705" + ], + [ + "10:00", + "125026.05913446844" + ], + [ + "10:10", + "130020.94712875038" + ], + [ + "10:19", + "119702.68101676181" + ], + [ + "10:30", + "143461.1895073615" + ], + [ + "10:40", + "141156.49481161684" + ], + [ + "10:49", + "141513.08245549724" + ], + [ + "11:00", + "121800.07290284336" + ], + [ + "11:10", + "105889.63351698965" + ], + [ + "11:19", + "107460.069493521" + ], + [ + "11:30", + "86234.24087299034" + ], + [ + "11:40", + "80785.86040474847" + ], + [ + "11:49", + "81276.17716001719" + ], + [ + "12:00", + "68121.35402615368" + ], + [ + "12:10", + "66467.80396551266" + ], + [ + "12:19", + "66696.0633356832" + ], + [ + "12:30", + "64656.02962170169" + ], + [ + "12:40", + "67905.5658463575" + ], + [ + "12:49", + "65212.49370268732" + ], + [ + "13:00", + "78933.63050495088" + ], + [ + "13:10", + "73962.47519343719" + ], + [ + "13:19", + "70020.87525280192" + ], + [ + "13:30", + "70435.60739105567" + ], + [ + "13:40", + "84985.78875910118" + ], + [ + "13:49", + "84093.83458945155" + ], + [ + "14:00", + "93043.64722226188" + ], + [ + "14:10", + "87255.40960873291" + ], + [ + "14:19", + "92652.44461027533" + ], + [ + "14:30", + "114069.79166570306" + ], + [ + "14:40", + "110178.34952470288" + ], + [ + "14:49", + "104681.21053155139" + ], + [ + "15:00", + "134319.73918294162" + ], + [ + "15:10", + "133367.79213075712" + ], + [ + "15:19", + "138892.65962101892" + ], + [ + "15:30", + "127581.89280737936" + ], + [ + "15:40", + "127574.14805406332" + ], + [ + "15:49", + "127870.46099546179" + ], + [ + "16:00", + "152135.83390329033" + ], + [ + "16:10", + "148967.22834568843" + ], + [ + "16:19", + "150902.9462108016" + ], + [ + "16:30", + "106995.86898420006" + ], + [ + "16:40", + "106719.18037262186" + ], + [ + "16:49", + "107256.70510021225" + ], + [ + "17:00", + "121605.69822283834" + ], + [ + "17:10", + "123895.78124672547" + ], + [ + "17:19", + "135859.61765816063" + ], + [ + "17:30", + "145333.1326195076" + ], + [ + "17:40", + "129150.90777393803" + ], + [ + "17:49", + "132342.50095316023" + ], + [ + "18:00", + "125641.56007234007" + ], + [ + "18:10", + "125892.09404256195" + ], + [ + "18:19", + "119119.29484905303" + ], + [ + "18:30", + "121925.1019734107" + ], + [ + "18:40", + "129921.35806950554" + ], + [ + "18:49", + "121701.2831667848" + ], + [ + "19:00", + "129397.12202323973" + ], + [ + "19:10", + "131260.27600645646" + ], + [ + "19:19", + "134276.87806740403" + ], + [ + "19:30", + "101716.13986157253" + ], + [ + "19:40", + "106731.88547841087" + ], + [ + "19:49", + "119262.01610685512" + ], + [ + "20:00", + "110974.78006079793" + ], + [ + "20:10", + "114972.12357295677" + ], + [ + "20:19", + "110832.9146430865" + ], + [ + "20:30", + "91863.24573882669" + ], + [ + "20:40", + "104650.96884545311" + ], + [ + "20:49", + "101699.7771261558" + ], + [ + "21:00", + "98864.67618725449" + ], + [ + "21:10", + "106238.30559277162" + ], + [ + "21:19", + "103009.22097430006" + ], + [ + "21:30", + "68324.54706971347" + ], + [ + "21:40", + "63074.50511204079" + ], + [ + "21:49", + "67631.23757197335" + ], + [ + "22:00", + "66010.35183664039" + ], + [ + "22:10", + "81193.29943551868" + ], + [ + "22:19", + "65963.40355385095" + ], + [ + "22:30", + "40750.92218104005" + ], + [ + "22:40", + "40442.22869282216" + ], + [ + "22:49", + "49230.13599900529" + ], + [ + "23:00", + "52824.714661203325" + ], + [ + "23:10", + "40674.395221844316" + ], + [ + "23:19", + "42557.248402141035" + ], + [ + "23:30", + "30458.950007110834" + ], + [ + "23:40", + "36094.37464457005" + ], + [ + "23:49", + "38321.63756296411" + ], + [ + "00:00", + "21602.028520703316" + ], + [ + "00:10", + "11412.163044825196" + ], + [ + "00:19", + "10334.302857019007" + ], + [ + "00:30", + "6216.977395299822" + ], + [ + "00:40", + "5938.550318129361" + ], + [ + "00:49", + "7859.005390036851" + ], + [ + "01:00", + "5287.5050562769175" + ], + [ + "01:10", + "6979.709929078817" + ], + [ + "01:19", + "6369.80161459744" + ], + [ + "01:30", + "6010.015026904643" + ], + [ + "01:40", + "5071.76369959116" + ], + [ + "01:49", + "5167.877876400948" + ], + [ + "02:00", + "5871.128858238459" + ], + [ + "02:10", + "4956.626012340188" + ], + [ + "02:19", + "4497.120995040983" + ], + [ + "02:30", + "5409.539449341595" + ], + [ + "02:40", + "4612.677140682936" + ], + [ + "02:49", + "5152.345154676586" + ], + [ + "03:00", + "1540.2483973503113" + ], + [ + "03:10", + "140.41726684570312" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "140.41726684570312" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6588.2267049103975, + 6587.856102526188, + 6812.534496545792, + 7969.2893253564835, + 7879.3395750671625, + 10196.498922228813, + 14652.384609550238, + 19564.96947826445, + 20355.99275779724, + 28488.71261626482, + 25575.99373139441, + 27278.6989890486, + 36266.62487374619, + 43446.70004674047, + 44588.7249420248, + 84042.5329053551, + 82995.78483706713, + 88806.87232778594, + 117812.18942685798, + 116945.58462246135, + 121613.67801458761, + 121559.20003021136, + 125328.94741408154, + 119797.89487463236, + 120796.24983779714, + 111820.86610364914, + 132396.80731078237, + 102030.63455875218, + 102588.72410837933, + 107734.27281019092, + 106958.96883501112, + 117116.89392151684, + 124343.97394574806, + 129383.25742889196, + 129464.49567063153, + 132323.98019122705, + 125026.05913446844, + 130020.94712875038, + 119702.68101676181, + 143461.1895073615, + 141156.49481161684, + 141513.08245549724, + 121800.07290284336, + 105889.63351698965, + 107460.069493521, + 86234.24087299034, + 80785.86040474847, + 81276.17716001719, + 68121.35402615368, + 66467.80396551266, + 66696.0633356832, + 64656.02962170169, + 67905.5658463575, + 65212.49370268732, + 78933.63050495088, + 73962.47519343719, + 70020.87525280192, + 70435.60739105567, + 84985.78875910118, + 84093.83458945155, + 93043.64722226188, + 87255.40960873291, + 92652.44461027533, + 114069.79166570306, + 110178.34952470288, + 104681.21053155139, + 134319.73918294162, + 133367.79213075712, + 138892.65962101892, + 127581.89280737936, + 127574.14805406332, + 127870.46099546179, + 152135.83390329033, + 148967.22834568843, + 150902.9462108016, + 106995.86898420006, + 106719.18037262186, + 107256.70510021225, + 121605.69822283834, + 123895.78124672547, + 135859.61765816063, + 145333.1326195076, + 129150.90777393803, + 132342.50095316023, + 125641.56007234007, + 125892.09404256195, + 119119.29484905303, + 121925.1019734107, + 129921.35806950554, + 121701.2831667848, + 129397.12202323973, + 131260.27600645646, + 134276.87806740403, + 101716.13986157253, + 106731.88547841087, + 119262.01610685512, + 110974.78006079793, + 114972.12357295677, + 110832.9146430865, + 91863.24573882669, + 104650.96884545311, + 101699.7771261558, + 98864.67618725449, + 106238.30559277162, + 103009.22097430006, + 68324.54706971347, + 63074.50511204079, + 67631.23757197335, + 66010.35183664039, + 81193.29943551868, + 65963.40355385095, + 40750.92218104005, + 40442.22869282216, + 49230.13599900529, + 52824.714661203325, + 40674.395221844316, + 42557.248402141035, + 30458.950007110834, + 36094.37464457005, + 38321.63756296411, + 21602.028520703316, + 11412.163044825196, + 10334.302857019007, + 6216.977395299822, + 5938.550318129361, + 7859.005390036851, + 5287.5050562769175, + 6979.709929078817, + 6369.80161459744, + 6010.015026904643, + 5071.76369959116, + 5167.877876400948, + 5871.128858238459, + 4956.626012340188, + 4497.120995040983, + 5409.539449341595, + 4612.677140682936, + 5152.345154676586, + 1540.2483973503113, + 140.41726684570312, + 0, + 0, + 0, + 0, + 140.41726684570312 + ] + }, + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6588.2267049103975" + ], + [ + "04:10", + "6587.856102526188" + ], + [ + "04:19", + "6812.534496545792" + ], + [ + "04:30", + "7969.2893253564835" + ], + [ + "04:40", + "7879.3395750671625" + ], + [ + "04:49", + "10196.498922228813" + ], + [ + "05:00", + "14652.384609550238" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20355.99275779724" + ], + [ + "05:30", + "28488.71261626482" + ], + [ + "05:40", + "25575.99373139441" + ], + [ + "05:49", + "27278.6989890486" + ], + [ + "06:00", + "36266.62487374619" + ], + [ + "06:10", + "43446.70004674047" + ], + [ + "06:19", + "44570.01564114913" + ], + [ + "06:30", + "84085.9447631836" + ], + [ + "06:40", + "82902.46970947087" + ], + [ + "06:49", + "88936.26852763072" + ], + [ + "07:00", + "117485.06641511992" + ], + [ + "07:10", + "117100.43441255763" + ], + [ + "07:19", + "121714.02516904101" + ], + [ + "07:30", + "121451.7046839036" + ], + [ + "07:40", + "125398.24390546605" + ], + [ + "07:49", + "119985.2288406752" + ], + [ + "08:00", + "120447.62249667943" + ], + [ + "08:10", + "112341.4448216781" + ], + [ + "08:19", + "131060.65872061998" + ], + [ + "08:30", + "102590.21300847083" + ], + [ + "08:40", + "102829.4953257814" + ], + [ + "08:49", + "107368.84576870501" + ], + [ + "09:00", + "106800.02171799168" + ], + [ + "09:10", + "117178.53368217498" + ], + [ + "09:19", + "123435.55583919212" + ], + [ + "09:30", + "130058.27114412189" + ], + [ + "09:40", + "129458.14050585777" + ], + [ + "09:49", + "131567.12267780676" + ], + [ + "10:00", + "124899.61108361185" + ], + [ + "10:10", + "131043.57778754085" + ], + [ + "10:19", + "119659.59111659601" + ], + [ + "10:30", + "143208.98749415204" + ], + [ + "10:40", + "141591.33315950632" + ], + [ + "10:49", + "141143.5270189382" + ], + [ + "11:00", + "122069.92432156205" + ], + [ + "11:10", + "105699.48102564365" + ], + [ + "11:19", + "107516.68840479478" + ], + [ + "11:30", + "86198.47803157568" + ], + [ + "11:40", + "80763.29787831008" + ], + [ + "11:49", + "82785.32666223496" + ], + [ + "12:00", + "66543.3209219724" + ], + [ + "12:10", + "66488.31547615305" + ], + [ + "12:19", + "66635.13273638114" + ], + [ + "12:30", + "64933.77695758268" + ], + [ + "12:40", + "68115.77737707272" + ], + [ + "12:49", + "64764.46046362817" + ], + [ + "13:00", + "79006.53280650079" + ], + [ + "13:10", + "73648.38812306151" + ], + [ + "13:19", + "70283.10589643195" + ], + [ + "13:30", + "70343.24312108383" + ], + [ + "13:40", + "85378.35059558228" + ], + [ + "13:49", + "83675.48020876944" + ], + [ + "14:00", + "93046.80153915659" + ], + [ + "14:10", + "86574.16343225911" + ], + [ + "14:19", + "93545.05466873199" + ], + [ + "14:30", + "113514.0998705998" + ], + [ + "14:40", + "110206.30795052648" + ], + [ + "14:49", + "104672.29511478916" + ], + [ + "15:00", + "134825.21227712184" + ], + [ + "15:10", + "132906.80968746543" + ], + [ + "15:19", + "139333.188284643" + ], + [ + "15:30", + "128261.59995299578" + ], + [ + "15:40", + "127533.0708751604" + ], + [ + "15:49", + "128008.26080295816" + ], + [ + "16:00", + "152549.79101682454" + ], + [ + "16:10", + "148466.13966681808" + ], + [ + "16:19", + "150756.89288233593" + ], + [ + "16:30", + "108151.8835102357" + ], + [ + "16:40", + "106724.93501713872" + ], + [ + "16:49", + "107092.96528839692" + ], + [ + "17:00", + "121337.56945925206" + ], + [ + "17:10", + "124295.98592089489" + ], + [ + "17:19", + "137158.27888344973" + ], + [ + "17:30", + "144777.92183068022" + ], + [ + "17:40", + "128565.05157545954" + ], + [ + "17:49", + "132616.17221391946" + ], + [ + "18:00", + "124555.44215560332" + ], + [ + "18:10", + "125607.12720903754" + ], + [ + "18:19", + "121651.72349438444" + ], + [ + "18:30", + "118763.13622501865" + ], + [ + "18:40", + "130333.97260155156" + ], + [ + "18:49", + "121798.4182648547" + ], + [ + "19:00", + "129762.31639100611" + ], + [ + "19:10", + "132005.35414544865" + ], + [ + "19:19", + "133358.81135239452" + ], + [ + "19:30", + "101696.3850302361" + ], + [ + "19:40", + "107237.41029259935" + ], + [ + "19:49", + "118717.35289536417" + ], + [ + "20:00", + "111289.1458954364" + ], + [ + "20:10", + "114035.3992253691" + ], + [ + "20:19", + "111083.6965931654" + ], + [ + "20:30", + "89980.33408007026" + ], + [ + "20:40", + "105379.2158473134" + ], + [ + "20:49", + "102533.8927885294" + ], + [ + "21:00", + "97782.59140694886" + ], + [ + "21:10", + "106710.53461571038" + ], + [ + "21:19", + "103211.13194982335" + ], + [ + "21:30", + "68007.85332240164" + ], + [ + "21:40", + "62978.75491472706" + ], + [ + "21:49", + "68688.75670158863" + ], + [ + "22:00", + "62530.10488252714" + ], + [ + "22:10", + "84289.27404457703" + ], + [ + "22:19", + "65433.24510305375" + ], + [ + "22:30", + "41402.25396417081" + ], + [ + "22:40", + "38985.95762959868" + ], + [ + "22:49", + "49661.59036442265" + ], + [ + "23:00", + "53348.11629020423" + ], + [ + "23:10", + "41292.48801586032" + ], + [ + "23:19", + "42342.230552606285" + ], + [ + "23:30", + "30809.123900894076" + ], + [ + "23:40", + "36066.13261646032" + ], + [ + "23:49", + "38398.26704643667" + ], + [ + "00:00", + "21301.404405757785" + ], + [ + "00:10", + "11092.721335843205" + ], + [ + "00:19", + "10467.83884037286" + ], + [ + "00:30", + "6083.240446005017" + ], + [ + "00:40", + "5798.539848558605" + ], + [ + "00:49", + "7388.775953818113" + ], + [ + "01:00", + "5312.6765664070845" + ], + [ + "01:10", + "6735.186851888895" + ], + [ + "01:19", + "6257.128656193614" + ], + [ + "01:30", + "5855.0763233453035" + ], + [ + "01:40", + "4311.5007111132145" + ], + [ + "01:49", + "5182.467184156179" + ], + [ + "02:00", + "5961.186391666532" + ], + [ + "02:10", + "4737.497930064797" + ], + [ + "02:19", + "4745.30666872859" + ], + [ + "02:30", + "4991.621037326753" + ], + [ + "02:40", + "4183.883064329624" + ], + [ + "02:49", + "5803.604305118322" + ], + [ + "03:00", + "1397.0531099438667" + ], + [ + "03:10", + "140.41726684570312" + ], + [ + "03:19", + "4.055323004722595" + ], + [ + "03:30", + "140.41726684570312" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "280.83453369140625" + ], + [ + "04:00", + "286.4417209625244" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "140.41726684570312" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6588.2267049103975, + 6587.856102526188, + 6812.534496545792, + 7969.2893253564835, + 7879.3395750671625, + 10196.498922228813, + 14652.384609550238, + 19564.96947826445, + 20355.99275779724, + 28488.71261626482, + 25575.99373139441, + 27278.6989890486, + 36266.62487374619, + 43446.70004674047, + 44570.01564114913, + 84085.9447631836, + 82902.46970947087, + 88936.26852763072, + 117485.06641511992, + 117100.43441255763, + 121714.02516904101, + 121451.7046839036, + 125398.24390546605, + 119985.2288406752, + 120447.62249667943, + 112341.4448216781, + 131060.65872061998, + 102590.21300847083, + 102829.4953257814, + 107368.84576870501, + 106800.02171799168, + 117178.53368217498, + 123435.55583919212, + 130058.27114412189, + 129458.14050585777, + 131567.12267780676, + 124899.61108361185, + 131043.57778754085, + 119659.59111659601, + 143208.98749415204, + 141591.33315950632, + 141143.5270189382, + 122069.92432156205, + 105699.48102564365, + 107516.68840479478, + 86198.47803157568, + 80763.29787831008, + 82785.32666223496, + 66543.3209219724, + 66488.31547615305, + 66635.13273638114, + 64933.77695758268, + 68115.77737707272, + 64764.46046362817, + 79006.53280650079, + 73648.38812306151, + 70283.10589643195, + 70343.24312108383, + 85378.35059558228, + 83675.48020876944, + 93046.80153915659, + 86574.16343225911, + 93545.05466873199, + 113514.0998705998, + 110206.30795052648, + 104672.29511478916, + 134825.21227712184, + 132906.80968746543, + 139333.188284643, + 128261.59995299578, + 127533.0708751604, + 128008.26080295816, + 152549.79101682454, + 148466.13966681808, + 150756.89288233593, + 108151.8835102357, + 106724.93501713872, + 107092.96528839692, + 121337.56945925206, + 124295.98592089489, + 137158.27888344973, + 144777.92183068022, + 128565.05157545954, + 132616.17221391946, + 124555.44215560332, + 125607.12720903754, + 121651.72349438444, + 118763.13622501865, + 130333.97260155156, + 121798.4182648547, + 129762.31639100611, + 132005.35414544865, + 133358.81135239452, + 101696.3850302361, + 107237.41029259935, + 118717.35289536417, + 111289.1458954364, + 114035.3992253691, + 111083.6965931654, + 89980.33408007026, + 105379.2158473134, + 102533.8927885294, + 97782.59140694886, + 106710.53461571038, + 103211.13194982335, + 68007.85332240164, + 62978.75491472706, + 68688.75670158863, + 62530.10488252714, + 84289.27404457703, + 65433.24510305375, + 41402.25396417081, + 38985.95762959868, + 49661.59036442265, + 53348.11629020423, + 41292.48801586032, + 42342.230552606285, + 30809.123900894076, + 36066.13261646032, + 38398.26704643667, + 21301.404405757785, + 11092.721335843205, + 10467.83884037286, + 6083.240446005017, + 5798.539848558605, + 7388.775953818113, + 5312.6765664070845, + 6735.186851888895, + 6257.128656193614, + 5855.0763233453035, + 4311.5007111132145, + 5182.467184156179, + 5961.186391666532, + 4737.497930064797, + 4745.30666872859, + 4991.621037326753, + 4183.883064329624, + 5803.604305118322, + 1397.0531099438667, + 140.41726684570312, + 4.055323004722595, + 140.41726684570312, + 0, + 280.83453369140625, + 286.4417209625244, + 0, + 140.41726684570312 + ] + }, + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6545.189950123429" + ], + [ + "04:10", + "6547.63733536005" + ], + [ + "04:19", + "6831.531698405743" + ], + [ + "04:30", + "7917.918021798134" + ], + [ + "04:40", + "7749.150493249297" + ], + [ + "04:49", + "10240.911189079285" + ], + [ + "05:00", + "14747.59193265438" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20364.247886538506" + ], + [ + "05:30", + "28459.98631489277" + ], + [ + "05:40", + "25730.680422976613" + ], + [ + "05:49", + "27020.28838004172" + ], + [ + "06:00", + "36034.09038098529" + ], + [ + "06:10", + "43407.061711125076" + ], + [ + "06:19", + "44966.93362436816" + ], + [ + "06:30", + "84140.86421477795" + ], + [ + "06:40", + "82465.20328898728" + ], + [ + "06:49", + "87812.0508246012" + ], + [ + "07:00", + "117416.7655193992" + ], + [ + "07:10", + "117662.7906604372" + ], + [ + "07:19", + "122876.79524451122" + ], + [ + "07:30", + "121106.22047319263" + ], + [ + "07:40", + "124996.64233398065" + ], + [ + "07:49", + "118958.59468268976" + ], + [ + "08:00", + "119752.19921455532" + ], + [ + "08:10", + "115052.19525953382" + ], + [ + "08:19", + "130015.45882735401" + ], + [ + "08:30", + "102371.30065754056" + ], + [ + "08:40", + "102577.336131569" + ], + [ + "08:49", + "107640.87006904185" + ], + [ + "09:00", + "107292.97912683338" + ], + [ + "09:10", + "118041.5429540053" + ], + [ + "09:19", + "122728.24685169384" + ], + [ + "09:30", + "130247.6947434023" + ], + [ + "09:40", + "129131.2069055289" + ], + [ + "09:49", + "131520.88953661546" + ], + [ + "10:00", + "125046.70342603326" + ], + [ + "10:10", + "131720.65994887054" + ], + [ + "10:19", + "120540.7869011052" + ], + [ + "10:30", + "141397.56281676516" + ], + [ + "10:40", + "142939.2789318636" + ], + [ + "10:49", + "141773.07485276833" + ], + [ + "11:00", + "120354.60181817785" + ], + [ + "11:10", + "106085.91495922208" + ], + [ + "11:19", + "107175.87901130319" + ], + [ + "11:30", + "86543.80936916918" + ], + [ + "11:40", + "80726.22082981467" + ], + [ + "11:49", + "82276.22797328979" + ], + [ + "12:00", + "67258.95766809583" + ], + [ + "12:10", + "66588.15107107535" + ], + [ + "12:19", + "66693.21523615345" + ], + [ + "12:30", + "64955.52888103947" + ], + [ + "12:40", + "67752.5153321363" + ], + [ + "12:49", + "65635.2029670775" + ], + [ + "13:00", + "78832.57731485367" + ], + [ + "13:10", + "73485.28957120702" + ], + [ + "13:19", + "70655.22882220522" + ], + [ + "13:30", + "70302.68805233762" + ], + [ + "13:40", + "84537.38355055824" + ], + [ + "13:49", + "84687.12005328387" + ], + [ + "14:00", + "92918.45892996714" + ], + [ + "14:10", + "86761.98472734913" + ], + [ + "14:19", + "93290.74674455076" + ], + [ + "14:30", + "114136.90394818783" + ], + [ + "14:40", + "109850.20692073926" + ], + [ + "14:49", + "104962.86470117792" + ], + [ + "15:00", + "133709.7534806952" + ], + [ + "15:10", + "133419.82266804948" + ], + [ + "15:19", + "140261.38598344848" + ], + [ + "15:30", + "126893.72059111297" + ], + [ + "15:40", + "127973.798548311" + ], + [ + "15:49", + "128611.88480510563" + ], + [ + "16:00", + "152646.28651449457" + ], + [ + "16:10", + "148769.7824093923" + ], + [ + "16:19", + "151705.4716514647" + ], + [ + "16:30", + "107786.38815867528" + ], + [ + "16:40", + "106171.09775018692" + ], + [ + "16:49", + "107091.12713613734" + ], + [ + "17:00", + "122651.66044440866" + ], + [ + "17:10", + "123520.95439212397" + ], + [ + "17:19", + "135721.91252714396" + ], + [ + "17:30", + "144852.0924479887" + ], + [ + "17:40", + "128387.01309013367" + ], + [ + "17:49", + "133681.14649531245" + ], + [ + "18:00", + "124844.33079873025" + ], + [ + "18:10", + "126575.73092078045" + ], + [ + "18:19", + "120803.68387867883" + ], + [ + "18:30", + "119799.23154195026" + ], + [ + "18:40", + "131154.5416624099" + ], + [ + "18:49", + "121343.97418133542" + ], + [ + "19:00", + "129632.5303623341" + ], + [ + "19:10", + "131122.07799293473" + ], + [ + "19:19", + "133571.31345251575" + ], + [ + "19:30", + "101932.12061231956" + ], + [ + "19:40", + "106220.61601674557" + ], + [ + "19:49", + "118258.39471623302" + ], + [ + "20:00", + "111692.88340294361" + ], + [ + "20:10", + "114485.60977637395" + ], + [ + "20:19", + "111640.1688367948" + ], + [ + "20:30", + "90300.53535743058" + ], + [ + "20:40", + "105866.9102111645" + ], + [ + "20:49", + "101796.13389703631" + ], + [ + "21:00", + "98175.0175944753" + ], + [ + "21:10", + "106569.33016389236" + ], + [ + "21:19", + "103497.89609886333" + ], + [ + "21:30", + "68340.18715763837" + ], + [ + "21:40", + "63287.67906914279" + ], + [ + "21:49", + "67784.00768494606" + ], + [ + "22:00", + "67533.95171940699" + ], + [ + "22:10", + "79806.24292714521" + ], + [ + "22:19", + "65599.93695824593" + ], + [ + "22:30", + "40531.44509732723" + ], + [ + "22:40", + "39188.380272075534" + ], + [ + "22:49", + "48928.27350299433" + ], + [ + "23:00", + "54715.12900482863" + ], + [ + "23:10", + "40747.56639446318" + ], + [ + "23:19", + "42457.0615702942" + ], + [ + "23:30", + "30408.091023869812" + ], + [ + "23:40", + "35638.931788913906" + ], + [ + "23:49", + "38181.236112926155" + ], + [ + "00:00", + "21559.475962758064" + ], + [ + "00:10", + "10747.686006456614" + ], + [ + "00:19", + "10575.084622867405" + ], + [ + "00:30", + "6186.674249175936" + ], + [ + "00:40", + "5953.7820130214095" + ], + [ + "00:49", + "7233.373425800353" + ], + [ + "01:00", + "5247.136103108525" + ], + [ + "01:10", + "7201.0894286334515" + ], + [ + "01:19", + "6389.685632899404" + ], + [ + "01:30", + "6092.980116762221" + ], + [ + "01:40", + "4760.842970699072" + ], + [ + "01:49", + "5061.460052847862" + ], + [ + "02:00", + "6441.151672393084" + ], + [ + "02:10", + "4735.194346323609" + ], + [ + "02:19", + "4689.894938081503" + ], + [ + "02:30", + "5197.525923795998" + ], + [ + "02:40", + "4590.372514307499" + ], + [ + "02:49", + "5251.431083500385" + ], + [ + "03:00", + "1546.0599628686905" + ], + [ + "03:10", + "165.9459947347641" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "6.6131086349487305" + ], + [ + "03:40", + "140.41726684570312" + ], + [ + "03:49", + "105.07097625732422" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "140.41726684570312" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6545.189950123429, + 6547.63733536005, + 6831.531698405743, + 7917.918021798134, + 7749.150493249297, + 10240.911189079285, + 14747.59193265438, + 19564.96947826445, + 20364.247886538506, + 28459.98631489277, + 25730.680422976613, + 27020.28838004172, + 36034.09038098529, + 43407.061711125076, + 44966.93362436816, + 84140.86421477795, + 82465.20328898728, + 87812.0508246012, + 117416.7655193992, + 117662.7906604372, + 122876.79524451122, + 121106.22047319263, + 124996.64233398065, + 118958.59468268976, + 119752.19921455532, + 115052.19525953382, + 130015.45882735401, + 102371.30065754056, + 102577.336131569, + 107640.87006904185, + 107292.97912683338, + 118041.5429540053, + 122728.24685169384, + 130247.6947434023, + 129131.2069055289, + 131520.88953661546, + 125046.70342603326, + 131720.65994887054, + 120540.7869011052, + 141397.56281676516, + 142939.2789318636, + 141773.07485276833, + 120354.60181817785, + 106085.91495922208, + 107175.87901130319, + 86543.80936916918, + 80726.22082981467, + 82276.22797328979, + 67258.95766809583, + 66588.15107107535, + 66693.21523615345, + 64955.52888103947, + 67752.5153321363, + 65635.2029670775, + 78832.57731485367, + 73485.28957120702, + 70655.22882220522, + 70302.68805233762, + 84537.38355055824, + 84687.12005328387, + 92918.45892996714, + 86761.98472734913, + 93290.74674455076, + 114136.90394818783, + 109850.20692073926, + 104962.86470117792, + 133709.7534806952, + 133419.82266804948, + 140261.38598344848, + 126893.72059111297, + 127973.798548311, + 128611.88480510563, + 152646.28651449457, + 148769.7824093923, + 151705.4716514647, + 107786.38815867528, + 106171.09775018692, + 107091.12713613734, + 122651.66044440866, + 123520.95439212397, + 135721.91252714396, + 144852.0924479887, + 128387.01309013367, + 133681.14649531245, + 124844.33079873025, + 126575.73092078045, + 120803.68387867883, + 119799.23154195026, + 131154.5416624099, + 121343.97418133542, + 129632.5303623341, + 131122.07799293473, + 133571.31345251575, + 101932.12061231956, + 106220.61601674557, + 118258.39471623302, + 111692.88340294361, + 114485.60977637395, + 111640.1688367948, + 90300.53535743058, + 105866.9102111645, + 101796.13389703631, + 98175.0175944753, + 106569.33016389236, + 103497.89609886333, + 68340.18715763837, + 63287.67906914279, + 67784.00768494606, + 67533.95171940699, + 79806.24292714521, + 65599.93695824593, + 40531.44509732723, + 39188.380272075534, + 48928.27350299433, + 54715.12900482863, + 40747.56639446318, + 42457.0615702942, + 30408.091023869812, + 35638.931788913906, + 38181.236112926155, + 21559.475962758064, + 10747.686006456614, + 10575.084622867405, + 6186.674249175936, + 5953.7820130214095, + 7233.373425800353, + 5247.136103108525, + 7201.0894286334515, + 6389.685632899404, + 6092.980116762221, + 4760.842970699072, + 5061.460052847862, + 6441.151672393084, + 4735.194346323609, + 4689.894938081503, + 5197.525923795998, + 4590.372514307499, + 5251.431083500385, + 1546.0599628686905, + 165.9459947347641, + 0, + 6.6131086349487305, + 140.41726684570312, + 105.07097625732422, + 0, + 0, + 140.41726684570312 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC VMT (normalized to per-hour) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6545.189950123429" + ], + [ + "04:10", + "6547.63733536005" + ], + [ + "04:19", + "6831.531698405743" + ], + [ + "04:30", + "7917.918021798134" + ], + [ + "04:40", + "7749.150493249297" + ], + [ + "04:49", + "10240.911189079285" + ], + [ + "05:00", + "14747.59193265438" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20364.247886538506" + ], + [ + "05:30", + "28459.98631489277" + ], + [ + "05:40", + "25730.680422976613" + ], + [ + "05:49", + "27020.28838004172" + ], + [ + "06:00", + "36028.31477924064" + ], + [ + "06:10", + "43611.85952364653" + ], + [ + "06:19", + "44809.230216991156" + ], + [ + "06:30", + "84425.27709580958" + ], + [ + "06:40", + "82493.299576208" + ], + [ + "06:49", + "88236.05687234178" + ], + [ + "07:00", + "116652.43129101768" + ], + [ + "07:10", + "118311.24182028696" + ], + [ + "07:19", + "122550.91666447744" + ], + [ + "07:30", + "120680.99991070479" + ], + [ + "07:40", + "125823.76901327446" + ], + [ + "07:49", + "117770.40686918423" + ], + [ + "08:00", + "122151.47995305061" + ], + [ + "08:10", + "112554.267947115" + ], + [ + "08:19", + "130849.85913445428" + ], + [ + "08:30", + "102335.97105936706" + ], + [ + "08:40", + "102159.07312686369" + ], + [ + "08:49", + "107317.45056152344" + ], + [ + "09:00", + "107087.94615885615" + ], + [ + "09:10", + "117479.2766706571" + ], + [ + "09:19", + "123910.1672979109" + ], + [ + "09:30", + "129940.61579728872" + ], + [ + "09:40", + "129135.27079512924" + ], + [ + "09:49", + "131717.1171552278" + ], + [ + "10:00", + "124023.95888963342" + ], + [ + "10:10", + "131488.02519186214" + ], + [ + "10:19", + "119981.13164405152" + ], + [ + "10:30", + "142663.99847487733" + ], + [ + "10:40", + "141939.49763879925" + ], + [ + "10:49", + "140620.72027832642" + ], + [ + "11:00", + "121510.95984230563" + ], + [ + "11:10", + "106107.00804445893" + ], + [ + "11:19", + "107144.45218217745" + ], + [ + "11:30", + "86173.86165357381" + ], + [ + "11:40", + "80756.30324059725" + ], + [ + "11:49", + "83026.9595419541" + ], + [ + "12:00", + "66499.82963436842" + ], + [ + "12:10", + "66522.10454239324" + ], + [ + "12:19", + "66767.47853575274" + ], + [ + "12:30", + "64797.937318291515" + ], + [ + "12:40", + "67540.4185876809" + ], + [ + "12:49", + "65817.49586266279" + ], + [ + "13:00", + "78893.71533411741" + ], + [ + "13:10", + "73186.95984994993" + ], + [ + "13:19", + "70820.12788375095" + ], + [ + "13:30", + "70141.49779724702" + ], + [ + "13:40", + "84438.92533489689" + ], + [ + "13:49", + "84645.03119849414" + ], + [ + "14:00", + "92751.94683626667" + ], + [ + "14:10", + "87159.73329018429" + ], + [ + "14:19", + "93246.05263940245" + ], + [ + "14:30", + "114421.92231094837" + ], + [ + "14:40", + "108935.24962072447" + ], + [ + "14:49", + "105085.34844318777" + ], + [ + "15:00", + "134634.76266261935" + ], + [ + "15:10", + "133594.49480363354" + ], + [ + "15:19", + "139617.18787082657" + ], + [ + "15:30", + "128217.16166194528" + ], + [ + "15:40", + "127250.38479238003" + ], + [ + "15:49", + "127925.5896627903" + ], + [ + "16:00", + "152510.46986863017" + ], + [ + "16:10", + "148874.2583978176" + ], + [ + "16:19", + "151230.81790877134" + ], + [ + "16:30", + "107271.56698781624" + ], + [ + "16:40", + "106096.95737218112" + ], + [ + "16:49", + "106781.60374093428" + ], + [ + "17:00", + "122290.48391813412" + ], + [ + "17:10", + "123406.75806841627" + ], + [ + "17:19", + "135934.28426523507" + ], + [ + "17:30", + "144874.6012623757" + ], + [ + "17:40", + "128595.86153997481" + ], + [ + "17:49", + "132427.4469172731" + ], + [ + "18:00", + "124987.8809068501" + ], + [ + "18:10", + "125323.04861487821" + ], + [ + "18:19", + "122169.98825505003" + ], + [ + "18:30", + "120369.02038862184" + ], + [ + "18:40", + "129061.70185616612" + ], + [ + "18:49", + "121210.32663008943" + ], + [ + "19:00", + "129968.94652555883" + ], + [ + "19:10", + "131935.00063871965" + ], + [ + "19:19", + "133914.28902984783" + ], + [ + "19:30", + "105752.50942078605" + ], + [ + "19:40", + "102922.43924526125" + ], + [ + "19:49", + "118489.34243253618" + ], + [ + "20:00", + "111287.41973752901" + ], + [ + "20:10", + "114647.97871280462" + ], + [ + "20:19", + "109956.89612265676" + ], + [ + "20:30", + "90391.92895484716" + ], + [ + "20:40", + "105613.34460686892" + ], + [ + "20:49", + "102467.60150550306" + ], + [ + "21:00", + "98823.85649678484" + ], + [ + "21:10", + "106246.67787430063" + ], + [ + "21:19", + "102564.0241005756" + ], + [ + "21:30", + "68453.44811526686" + ], + [ + "21:40", + "63265.85060498491" + ], + [ + "21:49", + "68141.74796426296" + ], + [ + "22:00", + "69350.52440794185" + ], + [ + "22:10", + "76802.08567362651" + ], + [ + "22:19", + "65153.63947523385" + ], + [ + "22:30", + "41843.99157308042" + ], + [ + "22:40", + "39165.55959096551" + ], + [ + "22:49", + "51238.52599506453" + ], + [ + "23:00", + "51276.68657583743" + ], + [ + "23:10", + "41077.39914666116" + ], + [ + "23:19", + "42151.66996664554" + ], + [ + "23:30", + "30736.063846215606" + ], + [ + "23:40", + "36045.196448497474" + ], + [ + "23:49", + "38385.81055063382" + ], + [ + "00:00", + "21591.845989063382" + ], + [ + "00:10", + "10654.732493117452" + ], + [ + "00:19", + "10611.375357069075" + ], + [ + "00:30", + "5985.382693145424" + ], + [ + "00:40", + "6057.369140423834" + ], + [ + "00:49", + "7414.433489698917" + ], + [ + "01:00", + "5372.706222161651" + ], + [ + "01:10", + "6427.535049766302" + ], + [ + "01:19", + "6284.730732411146" + ], + [ + "01:30", + "6337.76782887429" + ], + [ + "01:40", + "4290.477592796087" + ], + [ + "01:49", + "5177.2016314566135" + ], + [ + "02:00", + "6058.832576304674" + ], + [ + "02:10", + "4773.717004671693" + ], + [ + "02:19", + "4721.482507389039" + ], + [ + "02:30", + "5093.498391665518" + ], + [ + "02:40", + "4175.626140207052" + ], + [ + "02:49", + "5613.475714121014" + ], + [ + "03:00", + "1450.455493569374" + ], + [ + "03:10", + "7.14672714471817" + ], + [ + "03:19", + "7.662584066390989" + ], + [ + "03:30", + "15.863901615142826" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "5.607187271118163" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6545.189950123429, + 6547.63733536005, + 6831.531698405743, + 7917.918021798134, + 7749.150493249297, + 10240.911189079285, + 14747.59193265438, + 19564.96947826445, + 20364.247886538506, + 28459.98631489277, + 25730.680422976613, + 27020.28838004172, + 36028.31477924064, + 43611.85952364653, + 44809.230216991156, + 84425.27709580958, + 82493.299576208, + 88236.05687234178, + 116652.43129101768, + 118311.24182028696, + 122550.91666447744, + 120680.99991070479, + 125823.76901327446, + 117770.40686918423, + 122151.47995305061, + 112554.267947115, + 130849.85913445428, + 102335.97105936706, + 102159.07312686369, + 107317.45056152344, + 107087.94615885615, + 117479.2766706571, + 123910.1672979109, + 129940.61579728872, + 129135.27079512924, + 131717.1171552278, + 124023.95888963342, + 131488.02519186214, + 119981.13164405152, + 142663.99847487733, + 141939.49763879925, + 140620.72027832642, + 121510.95984230563, + 106107.00804445893, + 107144.45218217745, + 86173.86165357381, + 80756.30324059725, + 83026.9595419541, + 66499.82963436842, + 66522.10454239324, + 66767.47853575274, + 64797.937318291515, + 67540.4185876809, + 65817.49586266279, + 78893.71533411741, + 73186.95984994993, + 70820.12788375095, + 70141.49779724702, + 84438.92533489689, + 84645.03119849414, + 92751.94683626667, + 87159.73329018429, + 93246.05263940245, + 114421.92231094837, + 108935.24962072447, + 105085.34844318777, + 134634.76266261935, + 133594.49480363354, + 139617.18787082657, + 128217.16166194528, + 127250.38479238003, + 127925.5896627903, + 152510.46986863017, + 148874.2583978176, + 151230.81790877134, + 107271.56698781624, + 106096.95737218112, + 106781.60374093428, + 122290.48391813412, + 123406.75806841627, + 135934.28426523507, + 144874.6012623757, + 128595.86153997481, + 132427.4469172731, + 124987.8809068501, + 125323.04861487821, + 122169.98825505003, + 120369.02038862184, + 129061.70185616612, + 121210.32663008943, + 129968.94652555883, + 131935.00063871965, + 133914.28902984783, + 105752.50942078605, + 102922.43924526125, + 118489.34243253618, + 111287.41973752901, + 114647.97871280462, + 109956.89612265676, + 90391.92895484716, + 105613.34460686892, + 102467.60150550306, + 98823.85649678484, + 106246.67787430063, + 102564.0241005756, + 68453.44811526686, + 63265.85060498491, + 68141.74796426296, + 69350.52440794185, + 76802.08567362651, + 65153.63947523385, + 41843.99157308042, + 39165.55959096551, + 51238.52599506453, + 51276.68657583743, + 41077.39914666116, + 42151.66996664554, + 30736.063846215606, + 36045.196448497474, + 38385.81055063382, + 21591.845989063382, + 10654.732493117452, + 10611.375357069075, + 5985.382693145424, + 6057.369140423834, + 7414.433489698917, + 5372.706222161651, + 6427.535049766302, + 6284.730732411146, + 6337.76782887429, + 4290.477592796087, + 5177.2016314566135, + 6058.832576304674, + 4773.717004671693, + 4721.482507389039, + 5093.498391665518, + 4175.626140207052, + 5613.475714121014, + 1450.455493569374, + 7.14672714471817, + 7.662584066390989, + 15.863901615142826, + 0, + 0, + 0, + 5.607187271118163 + ] + }, + { + "customdata": [ + [ + "03:00", + "3535.2006765045226" + ], + [ + "03:10", + "4732.263008750975" + ], + [ + "03:19", + "4453.947615891695" + ], + [ + "03:30", + "4033.8789966255426" + ], + [ + "03:40", + "5576.492805451155" + ], + [ + "03:49", + "5929.67486473918" + ], + [ + "04:00", + "6373.333038836718" + ], + [ + "04:10", + "6445.87233223021" + ], + [ + "04:19", + "7099.12048342824" + ], + [ + "04:30", + "10000.878990098834" + ], + [ + "04:40", + "7850.96715053916" + ], + [ + "04:49", + "8398.630299434066" + ], + [ + "05:00", + "16689.94063049555" + ], + [ + "05:10", + "15764.625612348318" + ], + [ + "05:19", + "20034.125304982066" + ], + [ + "05:30", + "28068.352504849434" + ], + [ + "05:40", + "25183.26613135636" + ], + [ + "05:49", + "26961.56097266078" + ], + [ + "06:00", + "41453.556111730635" + ], + [ + "06:10", + "41078.99202619493" + ], + [ + "06:19", + "42450.296562463045" + ], + [ + "06:30", + "79454.53524690494" + ], + [ + "06:40", + "89194.81713596731" + ], + [ + "06:49", + "82895.00105700642" + ], + [ + "07:00", + "115843.5457212925" + ], + [ + "07:10", + "119716.86675763875" + ], + [ + "07:19", + "118156.0957345292" + ], + [ + "07:30", + "117680.66978211701" + ], + [ + "07:40", + "122044.72662815452" + ], + [ + "07:49", + "119308.34325111285" + ], + [ + "08:00", + "113076.20409381017" + ], + [ + "08:10", + "123906.27262561396" + ], + [ + "08:19", + "118631.50704707578" + ], + [ + "08:30", + "99577.82927735522" + ], + [ + "08:40", + "98188.04500278085" + ], + [ + "08:49", + "96231.1857814528" + ], + [ + "09:00", + "100714.34275909513" + ], + [ + "09:10", + "106036.37840720639" + ], + [ + "09:19", + "116002.06822847575" + ], + [ + "09:30", + "125185.3551992923" + ], + [ + "09:40", + "118140.99019219726" + ], + [ + "09:49", + "116858.92272627354" + ], + [ + "10:00", + "109885.77920349687" + ], + [ + "10:10", + "107728.34697382897" + ], + [ + "10:19", + "117114.86393430457" + ], + [ + "10:30", + "133325.55195760354" + ], + [ + "10:40", + "127555.1152350828" + ], + [ + "10:49", + "124333.59838921577" + ], + [ + "11:00", + "107565.750947088" + ], + [ + "11:10", + "99124.04751632363" + ], + [ + "11:19", + "96163.83336053789" + ], + [ + "11:30", + "75164.46985040233" + ], + [ + "11:40", + "80790.63240445778" + ], + [ + "11:49", + "72846.1493678391" + ], + [ + "12:00", + "66090.25716143847" + ], + [ + "12:10", + "62991.541504796594" + ], + [ + "12:19", + "62500.571458462626" + ], + [ + "12:30", + "66744.11573616788" + ], + [ + "12:40", + "66019.77170996368" + ], + [ + "12:49", + "65135.72668128088" + ], + [ + "13:00", + "69602.43603894487" + ], + [ + "13:10", + "71488.69321654737" + ], + [ + "13:19", + "68214.02372400463" + ], + [ + "13:30", + "70177.66953590512" + ], + [ + "13:40", + "76074.20963127539" + ], + [ + "13:49", + "79945.73994715512" + ], + [ + "14:00", + "91838.647313755" + ], + [ + "14:10", + "87530.86652487516" + ], + [ + "14:19", + "89546.8459672071" + ], + [ + "14:30", + "101329.6688812226" + ], + [ + "14:40", + "100789.01850897074" + ], + [ + "14:49", + "102090.95315875858" + ], + [ + "15:00", + "132701.4609279558" + ], + [ + "15:10", + "131018.19161114842" + ], + [ + "15:19", + "126908.4687772058" + ], + [ + "15:30", + "119395.1811372377" + ], + [ + "15:40", + "127613.16182204336" + ], + [ + "15:49", + "122516.20948529989" + ], + [ + "16:00", + "138706.2926781848" + ], + [ + "16:10", + "136977.0566062443" + ], + [ + "16:19", + "141043.65815053135" + ], + [ + "16:30", + "103759.70517375693" + ], + [ + "16:40", + "102164.62867128477" + ], + [ + "16:49", + "100478.31905826554" + ], + [ + "17:00", + "112870.9818520993" + ], + [ + "17:10", + "116715.64550917223" + ], + [ + "17:19", + "130354.37325083837" + ], + [ + "17:30", + "132495.58821609244" + ], + [ + "17:40", + "122240.58284158632" + ], + [ + "17:49", + "120823.71711019054" + ], + [ + "18:00", + "106689.84618316591" + ], + [ + "18:10", + "120910.14483418688" + ], + [ + "18:19", + "114536.34694329277" + ], + [ + "18:30", + "107269.33409374952" + ], + [ + "18:40", + "113612.4285245575" + ], + [ + "18:49", + "115473.39697475731" + ], + [ + "19:00", + "123358.72447411716" + ], + [ + "19:10", + "117263.10995584354" + ], + [ + "19:19", + "119844.32474832237" + ], + [ + "19:30", + "90618.31201191992" + ], + [ + "19:40", + "101688.06957837939" + ], + [ + "19:49", + "102232.97926458344" + ], + [ + "20:00", + "94353.26826123521" + ], + [ + "20:10", + "102380.41981715709" + ], + [ + "20:19", + "107666.53529309481" + ], + [ + "20:30", + "91219.48527367786" + ], + [ + "20:40", + "91224.61273056641" + ], + [ + "20:49", + "94456.60205192864" + ], + [ + "21:00", + "92585.46685682237" + ], + [ + "21:10", + "89918.9928566739" + ], + [ + "21:19", + "93597.00545469671" + ], + [ + "21:30", + "56601.49598121643" + ], + [ + "21:40", + "62104.827372416854" + ], + [ + "21:49", + "64195.81813744828" + ], + [ + "22:00", + "67391.30676179007" + ], + [ + "22:10", + "67510.93652378395" + ], + [ + "22:19", + "58338.13937686756" + ], + [ + "22:30", + "40445.98109052703" + ], + [ + "22:40", + "36332.24628318474" + ], + [ + "22:49", + "53287.03005516529" + ], + [ + "23:00", + "37981.13647707179" + ], + [ + "23:10", + "36090.10724523291" + ], + [ + "23:19", + "39016.325585871935" + ], + [ + "23:30", + "29181.021342359483" + ], + [ + "23:40", + "33818.26158166677" + ], + [ + "23:49", + "35165.95508409664" + ], + [ + "00:00", + "17782.383690532297" + ], + [ + "00:10", + "10694.723252892494" + ], + [ + "00:19", + "10675.207295313478" + ], + [ + "00:30", + "4948.12674690038" + ], + [ + "00:40", + "5290.431093368679" + ], + [ + "00:49", + "9064.83048889786" + ], + [ + "01:00", + "6281.208898834884" + ], + [ + "01:10", + "5459.2631944566965" + ], + [ + "01:19", + "6116.58806052804" + ], + [ + "01:30", + "5351.391442045569" + ], + [ + "01:40", + "5537.556818962097" + ], + [ + "01:49", + "6391.766580104828" + ], + [ + "02:00", + "3880.0612274855375" + ], + [ + "02:10", + "5230.703649535775" + ], + [ + "02:19", + "4014.262443177402" + ], + [ + "02:30", + "5218.417096674442" + ], + [ + "02:40", + "7196.513788942248" + ], + [ + "02:49", + "3574.574805557728" + ], + [ + "03:00", + "478.1301788985729" + ], + [ + "03:10", + "92.82393282651901" + ], + [ + "03:19", + "280.83453369140625" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "98.43082809448242" + ], + [ + "03:49", + "5.607187271118163" + ], + [ + "04:00", + "140.41726684570312" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 3535.2006765045226, + 4732.263008750975, + 4453.947615891695, + 4033.8789966255426, + 5576.492805451155, + 5929.67486473918, + 6373.333038836718, + 6445.87233223021, + 7099.12048342824, + 10000.878990098834, + 7850.96715053916, + 8398.630299434066, + 16689.94063049555, + 15764.625612348318, + 20034.125304982066, + 28068.352504849434, + 25183.26613135636, + 26961.56097266078, + 41453.556111730635, + 41078.99202619493, + 42450.296562463045, + 79454.53524690494, + 89194.81713596731, + 82895.00105700642, + 115843.5457212925, + 119716.86675763875, + 118156.0957345292, + 117680.66978211701, + 122044.72662815452, + 119308.34325111285, + 113076.20409381017, + 123906.27262561396, + 118631.50704707578, + 99577.82927735522, + 98188.04500278085, + 96231.1857814528, + 100714.34275909513, + 106036.37840720639, + 116002.06822847575, + 125185.3551992923, + 118140.99019219726, + 116858.92272627354, + 109885.77920349687, + 107728.34697382897, + 117114.86393430457, + 133325.55195760354, + 127555.1152350828, + 124333.59838921577, + 107565.750947088, + 99124.04751632363, + 96163.83336053789, + 75164.46985040233, + 80790.63240445778, + 72846.1493678391, + 66090.25716143847, + 62991.541504796594, + 62500.571458462626, + 66744.11573616788, + 66019.77170996368, + 65135.72668128088, + 69602.43603894487, + 71488.69321654737, + 68214.02372400463, + 70177.66953590512, + 76074.20963127539, + 79945.73994715512, + 91838.647313755, + 87530.86652487516, + 89546.8459672071, + 101329.6688812226, + 100789.01850897074, + 102090.95315875858, + 132701.4609279558, + 131018.19161114842, + 126908.4687772058, + 119395.1811372377, + 127613.16182204336, + 122516.20948529989, + 138706.2926781848, + 136977.0566062443, + 141043.65815053135, + 103759.70517375693, + 102164.62867128477, + 100478.31905826554, + 112870.9818520993, + 116715.64550917223, + 130354.37325083837, + 132495.58821609244, + 122240.58284158632, + 120823.71711019054, + 106689.84618316591, + 120910.14483418688, + 114536.34694329277, + 107269.33409374952, + 113612.4285245575, + 115473.39697475731, + 123358.72447411716, + 117263.10995584354, + 119844.32474832237, + 90618.31201191992, + 101688.06957837939, + 102232.97926458344, + 94353.26826123521, + 102380.41981715709, + 107666.53529309481, + 91219.48527367786, + 91224.61273056641, + 94456.60205192864, + 92585.46685682237, + 89918.9928566739, + 93597.00545469671, + 56601.49598121643, + 62104.827372416854, + 64195.81813744828, + 67391.30676179007, + 67510.93652378395, + 58338.13937686756, + 40445.98109052703, + 36332.24628318474, + 53287.03005516529, + 37981.13647707179, + 36090.10724523291, + 39016.325585871935, + 29181.021342359483, + 33818.26158166677, + 35165.95508409664, + 17782.383690532297, + 10694.723252892494, + 10675.207295313478, + 4948.12674690038, + 5290.431093368679, + 9064.83048889786, + 6281.208898834884, + 5459.2631944566965, + 6116.58806052804, + 5351.391442045569, + 5537.556818962097, + 6391.766580104828, + 3880.0612274855375, + 5230.703649535775, + 4014.262443177402, + 5218.417096674442, + 7196.513788942248, + 3574.574805557728, + 478.1301788985729, + 92.82393282651901, + 280.83453369140625, + 0, + 98.43082809448242, + 5.607187271118163, + 140.41726684570312 + ] + }, + { + "customdata": [ + [ + "03:00", + "3442.384509433061" + ], + [ + "03:10", + "4660.923109419644" + ], + [ + "03:19", + "4536.775215268135" + ], + [ + "03:30", + "4037.8456299751997" + ], + [ + "03:40", + "6301.205305069685" + ], + [ + "03:49", + "5423.217442899942" + ], + [ + "04:00", + "5890.9865894168615" + ], + [ + "04:10", + "7241.061887741089" + ], + [ + "04:19", + "6337.797223135829" + ], + [ + "04:30", + "9682.02780868113" + ], + [ + "04:40", + "7998.242441833019" + ], + [ + "04:49", + "7626.135917365551" + ], + [ + "05:00", + "17285.81791846454" + ], + [ + "05:10", + "16897.427952602506" + ], + [ + "05:19", + "20359.354472860694" + ], + [ + "05:30", + "27239.160832107067" + ], + [ + "05:40", + "23110.323057085276" + ], + [ + "05:49", + "28284.40341179073" + ], + [ + "06:00", + "39145.93961716443" + ], + [ + "06:10", + "42780.99075977504" + ], + [ + "06:19", + "43167.895669318736" + ], + [ + "06:30", + "81823.577030316" + ], + [ + "06:40", + "86596.50856287405" + ], + [ + "06:49", + "83422.98232579976" + ], + [ + "07:00", + "111179.66300734878" + ], + [ + "07:10", + "118894.86403407902" + ], + [ + "07:19", + "120612.0628534779" + ], + [ + "07:30", + "113471.63386816531" + ], + [ + "07:40", + "117941.44330849126" + ], + [ + "07:49", + "125082.91587718204" + ], + [ + "08:00", + "107690.31920171902" + ], + [ + "08:10", + "122667.44545595348" + ], + [ + "08:19", + "115027.17767517641" + ], + [ + "08:30", + "94811.90229886025" + ], + [ + "08:40", + "94076.69821335375" + ], + [ + "08:49", + "98538.9123166278" + ], + [ + "09:00", + "93678.79068023711" + ], + [ + "09:10", + "103658.98556750268" + ], + [ + "09:19", + "113246.65687994286" + ], + [ + "09:30", + "121329.07386798039" + ], + [ + "09:40", + "114984.78028085455" + ], + [ + "09:49", + "113612.50893778726" + ], + [ + "10:00", + "106737.8780869022" + ], + [ + "10:10", + "106847.90772599727" + ], + [ + "10:19", + "108876.14093564451" + ], + [ + "10:30", + "125350.62258694321" + ], + [ + "10:40", + "125589.97454448044" + ], + [ + "10:49", + "118225.82423445582" + ], + [ + "11:00", + "97103.41299146041" + ], + [ + "11:10", + "97093.14284622297" + ], + [ + "11:19", + "94717.3701469414" + ], + [ + "11:30", + "72043.17796939239" + ], + [ + "11:40", + "76113.10754306987" + ], + [ + "11:49", + "72301.01216869801" + ], + [ + "12:00", + "66877.3333055824" + ], + [ + "12:10", + "64629.209538090974" + ], + [ + "12:19", + "60157.287822861224" + ], + [ + "12:30", + "66612.40560090914" + ], + [ + "12:40", + "66149.56772144884" + ], + [ + "12:49", + "62768.497506234795" + ], + [ + "13:00", + "65945.33371458203" + ], + [ + "13:10", + "72746.38561493531" + ], + [ + "13:19", + "65309.893486540765" + ], + [ + "13:30", + "69568.01752893627" + ], + [ + "13:40", + "72883.59254357591" + ], + [ + "13:49", + "80014.9725795351" + ], + [ + "14:00", + "96024.48726280779" + ], + [ + "14:10", + "84653.84228440002" + ], + [ + "14:19", + "81100.20564772189" + ], + [ + "14:30", + "96984.15850222483" + ], + [ + "14:40", + "98758.0521460846" + ], + [ + "14:49", + "105401.51147983968" + ], + [ + "15:00", + "126995.98639918864" + ], + [ + "15:10", + "124400.80168718845" + ], + [ + "15:19", + "123861.61107815802" + ], + [ + "15:30", + "116712.0298952423" + ], + [ + "15:40", + "118726.14824774489" + ], + [ + "15:49", + "123962.26776881889" + ], + [ + "16:00", + "126094.99115571007" + ], + [ + "16:10", + "135810.12897903845" + ], + [ + "16:19", + "139569.41727619618" + ], + [ + "16:30", + "100202.1322218664" + ], + [ + "16:40", + "96442.06404827535" + ], + [ + "16:49", + "96752.83156482875" + ], + [ + "17:00", + "106735.23732349277" + ], + [ + "17:10", + "109278.57597476989" + ], + [ + "17:19", + "123205.67687240615" + ], + [ + "17:30", + "126233.97742068395" + ], + [ + "17:40", + "110536.86950919405" + ], + [ + "17:49", + "120259.40779707581" + ], + [ + "18:00", + "116015.26628325507" + ], + [ + "18:10", + "104371.19324880838" + ], + [ + "18:19", + "109923.63975673914" + ], + [ + "18:30", + "106545.6991661936" + ], + [ + "18:40", + "111323.96988614649" + ], + [ + "18:49", + "105258.29104404151" + ], + [ + "19:00", + "114188.46552625671" + ], + [ + "19:10", + "110988.76401039585" + ], + [ + "19:19", + "114742.63576189801" + ], + [ + "19:30", + "88294.64109637588" + ], + [ + "19:40", + "103493.86197632924" + ], + [ + "19:49", + "88238.24517643824" + ], + [ + "20:00", + "87841.82879174128" + ], + [ + "20:10", + "104285.23479437828" + ], + [ + "20:19", + "97695.50044217706" + ], + [ + "20:30", + "83909.26894932613" + ], + [ + "20:40", + "87584.88320814818" + ], + [ + "20:49", + "91737.0342211537" + ], + [ + "21:00", + "85779.88016800582" + ], + [ + "21:10", + "90814.72423275188" + ], + [ + "21:19", + "87936.11673031747" + ], + [ + "21:30", + "59457.33918175846" + ], + [ + "21:40", + "48577.22210017964" + ], + [ + "21:49", + "63449.702304627746" + ], + [ + "22:00", + "65676.31490787864" + ], + [ + "22:10", + "64719.15255513042" + ], + [ + "22:19", + "55044.54831370711" + ], + [ + "22:30", + "39067.76348075643" + ], + [ + "22:40", + "36235.66201511398" + ], + [ + "22:49", + "55796.930831462145" + ], + [ + "23:00", + "33594.882832121104" + ], + [ + "23:10", + "34209.6003219299" + ], + [ + "23:19", + "33751.12430859357" + ], + [ + "23:30", + "31281.17239711806" + ], + [ + "23:40", + "31373.936990752816" + ], + [ + "23:49", + "32412.12023279071" + ], + [ + "00:00", + "18141.654482848942" + ], + [ + "00:10", + "10894.996656104922" + ], + [ + "00:19", + "9864.419285349548" + ], + [ + "00:30", + "5674.769491352141" + ], + [ + "00:40", + "5922.88975931704" + ], + [ + "00:49", + "7679.966312684119" + ], + [ + "01:00", + "6896.369511343539" + ], + [ + "01:10", + "6473.328018911183" + ], + [ + "01:19", + "5460.4207954108715" + ], + [ + "01:30", + "5686.254019618034" + ], + [ + "01:40", + "5442.428535729647" + ], + [ + "01:49", + "4715.117139279842" + ], + [ + "02:00", + "5033.811931796372" + ], + [ + "02:10", + "4785.466249287128" + ], + [ + "02:19", + "4495.498864531517" + ], + [ + "02:30", + "5643.314301967621" + ], + [ + "02:40", + "6032.946739286184" + ], + [ + "02:49", + "4837.306187197566" + ], + [ + "03:00", + "291.8482305407524" + ], + [ + "03:10", + "140.41726684570312" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "140.41726684570312" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "140.41726684570312" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 3442.384509433061, + 4660.923109419644, + 4536.775215268135, + 4037.8456299751997, + 6301.205305069685, + 5423.217442899942, + 5890.9865894168615, + 7241.061887741089, + 6337.797223135829, + 9682.02780868113, + 7998.242441833019, + 7626.135917365551, + 17285.81791846454, + 16897.427952602506, + 20359.354472860694, + 27239.160832107067, + 23110.323057085276, + 28284.40341179073, + 39145.93961716443, + 42780.99075977504, + 43167.895669318736, + 81823.577030316, + 86596.50856287405, + 83422.98232579976, + 111179.66300734878, + 118894.86403407902, + 120612.0628534779, + 113471.63386816531, + 117941.44330849126, + 125082.91587718204, + 107690.31920171902, + 122667.44545595348, + 115027.17767517641, + 94811.90229886025, + 94076.69821335375, + 98538.9123166278, + 93678.79068023711, + 103658.98556750268, + 113246.65687994286, + 121329.07386798039, + 114984.78028085455, + 113612.50893778726, + 106737.8780869022, + 106847.90772599727, + 108876.14093564451, + 125350.62258694321, + 125589.97454448044, + 118225.82423445582, + 97103.41299146041, + 97093.14284622297, + 94717.3701469414, + 72043.17796939239, + 76113.10754306987, + 72301.01216869801, + 66877.3333055824, + 64629.209538090974, + 60157.287822861224, + 66612.40560090914, + 66149.56772144884, + 62768.497506234795, + 65945.33371458203, + 72746.38561493531, + 65309.893486540765, + 69568.01752893627, + 72883.59254357591, + 80014.9725795351, + 96024.48726280779, + 84653.84228440002, + 81100.20564772189, + 96984.15850222483, + 98758.0521460846, + 105401.51147983968, + 126995.98639918864, + 124400.80168718845, + 123861.61107815802, + 116712.0298952423, + 118726.14824774489, + 123962.26776881889, + 126094.99115571007, + 135810.12897903845, + 139569.41727619618, + 100202.1322218664, + 96442.06404827535, + 96752.83156482875, + 106735.23732349277, + 109278.57597476989, + 123205.67687240615, + 126233.97742068395, + 110536.86950919405, + 120259.40779707581, + 116015.26628325507, + 104371.19324880838, + 109923.63975673914, + 106545.6991661936, + 111323.96988614649, + 105258.29104404151, + 114188.46552625671, + 110988.76401039585, + 114742.63576189801, + 88294.64109637588, + 103493.86197632924, + 88238.24517643824, + 87841.82879174128, + 104285.23479437828, + 97695.50044217706, + 83909.26894932613, + 87584.88320814818, + 91737.0342211537, + 85779.88016800582, + 90814.72423275188, + 87936.11673031747, + 59457.33918175846, + 48577.22210017964, + 63449.702304627746, + 65676.31490787864, + 64719.15255513042, + 55044.54831370711, + 39067.76348075643, + 36235.66201511398, + 55796.930831462145, + 33594.882832121104, + 34209.6003219299, + 33751.12430859357, + 31281.17239711806, + 31373.936990752816, + 32412.12023279071, + 18141.654482848942, + 10894.996656104922, + 9864.419285349548, + 5674.769491352141, + 5922.88975931704, + 7679.966312684119, + 6896.369511343539, + 6473.328018911183, + 5460.4207954108715, + 5686.254019618034, + 5442.428535729647, + 4715.117139279842, + 5033.811931796372, + 4785.466249287128, + 4495.498864531517, + 5643.314301967621, + 6032.946739286184, + 4837.306187197566, + 291.8482305407524, + 140.41726684570312, + 0, + 140.41726684570312, + 0, + 0, + 0, + 140.41726684570312 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC VMT (normalized to per-hour) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "4271.962000686675" + ], + [ + "03:10", + "4258.906500801444" + ], + [ + "03:19", + "4612.874580949545" + ], + [ + "03:30", + "4927.015667483211" + ], + [ + "03:40", + "6310.966763913631" + ], + [ + "03:49", + "4829.365607589483" + ], + [ + "04:00", + "6545.189950123429" + ], + [ + "04:10", + "6547.63733536005" + ], + [ + "04:19", + "6831.531698405743" + ], + [ + "04:30", + "7917.918021798134" + ], + [ + "04:40", + "7749.150493249297" + ], + [ + "04:49", + "10240.911189079285" + ], + [ + "05:00", + "14747.59193265438" + ], + [ + "05:10", + "19564.96947826445" + ], + [ + "05:19", + "20364.247886538506" + ], + [ + "05:30", + "28459.98631489277" + ], + [ + "05:40", + "25730.680422976613" + ], + [ + "05:49", + "27020.28838004172" + ], + [ + "06:00", + "36028.31477924064" + ], + [ + "06:10", + "43611.85952364653" + ], + [ + "06:19", + "44809.230216991156" + ], + [ + "06:30", + "84425.27709580958" + ], + [ + "06:40", + "82493.299576208" + ], + [ + "06:49", + "88236.05687234178" + ], + [ + "07:00", + "116652.43129101768" + ], + [ + "07:10", + "118311.24182028696" + ], + [ + "07:19", + "122550.91666447744" + ], + [ + "07:30", + "120680.99991070479" + ], + [ + "07:40", + "125823.76901327446" + ], + [ + "07:49", + "117770.40686918423" + ], + [ + "08:00", + "122151.47995305061" + ], + [ + "08:10", + "112554.267947115" + ], + [ + "08:19", + "130849.85913445428" + ], + [ + "08:30", + "102335.97105936706" + ], + [ + "08:40", + "102159.07312686369" + ], + [ + "08:49", + "107317.45056152344" + ], + [ + "09:00", + "107087.94615885615" + ], + [ + "09:10", + "117479.2766706571" + ], + [ + "09:19", + "123910.1672979109" + ], + [ + "09:30", + "129940.61579728872" + ], + [ + "09:40", + "129135.27079512924" + ], + [ + "09:49", + "131717.1171552278" + ], + [ + "10:00", + "124023.95888963342" + ], + [ + "10:10", + "131488.02519186214" + ], + [ + "10:19", + "119981.13164405152" + ], + [ + "10:30", + "142663.99847487733" + ], + [ + "10:40", + "141939.49763879925" + ], + [ + "10:49", + "140620.72027832642" + ], + [ + "11:00", + "121510.95984230563" + ], + [ + "11:10", + "106107.00804445893" + ], + [ + "11:19", + "107144.45218217745" + ], + [ + "11:30", + "86173.86165357381" + ], + [ + "11:40", + "80756.30324059725" + ], + [ + "11:49", + "83026.9595419541" + ], + [ + "12:00", + "66499.82963436842" + ], + [ + "12:10", + "66522.10454239324" + ], + [ + "12:19", + "66767.47853575274" + ], + [ + "12:30", + "64797.937318291515" + ], + [ + "12:40", + "67540.4185876809" + ], + [ + "12:49", + "65817.49586266279" + ], + [ + "13:00", + "78893.71533411741" + ], + [ + "13:10", + "73186.95984994993" + ], + [ + "13:19", + "70820.12788375095" + ], + [ + "13:30", + "70141.49779724702" + ], + [ + "13:40", + "84438.92533489689" + ], + [ + "13:49", + "84645.03119849414" + ], + [ + "14:00", + "92751.94683626667" + ], + [ + "14:10", + "87159.73329018429" + ], + [ + "14:19", + "93246.05263940245" + ], + [ + "14:30", + "114421.92231094837" + ], + [ + "14:40", + "108935.24962072447" + ], + [ + "14:49", + "105085.34844318777" + ], + [ + "15:00", + "134634.76266261935" + ], + [ + "15:10", + "133594.49480363354" + ], + [ + "15:19", + "139617.18787082657" + ], + [ + "15:30", + "128217.16166194528" + ], + [ + "15:40", + "127250.38479238003" + ], + [ + "15:49", + "127925.5896627903" + ], + [ + "16:00", + "152510.46986863017" + ], + [ + "16:10", + "148874.2583978176" + ], + [ + "16:19", + "151230.81790877134" + ], + [ + "16:30", + "107271.56698781624" + ], + [ + "16:40", + "106096.95737218112" + ], + [ + "16:49", + "106781.60374093428" + ], + [ + "17:00", + "122290.48391813412" + ], + [ + "17:10", + "123406.75806841627" + ], + [ + "17:19", + "135934.28426523507" + ], + [ + "17:30", + "144874.6012623757" + ], + [ + "17:40", + "128595.86153997481" + ], + [ + "17:49", + "132427.4469172731" + ], + [ + "18:00", + "124987.8809068501" + ], + [ + "18:10", + "125323.04861487821" + ], + [ + "18:19", + "122169.98825505003" + ], + [ + "18:30", + "120369.02038862184" + ], + [ + "18:40", + "129061.70185616612" + ], + [ + "18:49", + "121210.32663008943" + ], + [ + "19:00", + "129968.94652555883" + ], + [ + "19:10", + "131935.00063871965" + ], + [ + "19:19", + "133914.28902984783" + ], + [ + "19:30", + "105752.50942078605" + ], + [ + "19:40", + "102922.43924526125" + ], + [ + "19:49", + "118489.34243253618" + ], + [ + "20:00", + "111287.41973752901" + ], + [ + "20:10", + "114647.97871280462" + ], + [ + "20:19", + "109956.89612265676" + ], + [ + "20:30", + "90391.92895484716" + ], + [ + "20:40", + "105613.34460686892" + ], + [ + "20:49", + "102467.60150550306" + ], + [ + "21:00", + "98823.85649678484" + ], + [ + "21:10", + "106246.67787430063" + ], + [ + "21:19", + "102564.0241005756" + ], + [ + "21:30", + "68453.44811526686" + ], + [ + "21:40", + "63265.85060498491" + ], + [ + "21:49", + "68141.74796426296" + ], + [ + "22:00", + "69350.52440794185" + ], + [ + "22:10", + "76802.08567362651" + ], + [ + "22:19", + "65153.63947523385" + ], + [ + "22:30", + "41843.99157308042" + ], + [ + "22:40", + "39165.55959096551" + ], + [ + "22:49", + "51238.52599506453" + ], + [ + "23:00", + "51276.68657583743" + ], + [ + "23:10", + "41077.39914666116" + ], + [ + "23:19", + "42151.66996664554" + ], + [ + "23:30", + "30736.063846215606" + ], + [ + "23:40", + "36045.196448497474" + ], + [ + "23:49", + "38385.81055063382" + ], + [ + "00:00", + "21591.845989063382" + ], + [ + "00:10", + "10654.732493117452" + ], + [ + "00:19", + "10611.375357069075" + ], + [ + "00:30", + "5985.382693145424" + ], + [ + "00:40", + "6057.369140423834" + ], + [ + "00:49", + "7414.433489698917" + ], + [ + "01:00", + "5372.706222161651" + ], + [ + "01:10", + "6427.535049766302" + ], + [ + "01:19", + "6284.730732411146" + ], + [ + "01:30", + "6337.76782887429" + ], + [ + "01:40", + "4290.477592796087" + ], + [ + "01:49", + "5177.2016314566135" + ], + [ + "02:00", + "6058.832576304674" + ], + [ + "02:10", + "4773.717004671693" + ], + [ + "02:19", + "4721.482507389039" + ], + [ + "02:30", + "5093.498391665518" + ], + [ + "02:40", + "4175.626140207052" + ], + [ + "02:49", + "5613.475714121014" + ], + [ + "03:00", + "1450.455493569374" + ], + [ + "03:10", + "7.14672714471817" + ], + [ + "03:19", + "7.662584066390989" + ], + [ + "03:30", + "15.863901615142826" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "5.607187271118163" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 4271.962000686675, + 4258.906500801444, + 4612.874580949545, + 4927.015667483211, + 6310.966763913631, + 4829.365607589483, + 6545.189950123429, + 6547.63733536005, + 6831.531698405743, + 7917.918021798134, + 7749.150493249297, + 10240.911189079285, + 14747.59193265438, + 19564.96947826445, + 20364.247886538506, + 28459.98631489277, + 25730.680422976613, + 27020.28838004172, + 36028.31477924064, + 43611.85952364653, + 44809.230216991156, + 84425.27709580958, + 82493.299576208, + 88236.05687234178, + 116652.43129101768, + 118311.24182028696, + 122550.91666447744, + 120680.99991070479, + 125823.76901327446, + 117770.40686918423, + 122151.47995305061, + 112554.267947115, + 130849.85913445428, + 102335.97105936706, + 102159.07312686369, + 107317.45056152344, + 107087.94615885615, + 117479.2766706571, + 123910.1672979109, + 129940.61579728872, + 129135.27079512924, + 131717.1171552278, + 124023.95888963342, + 131488.02519186214, + 119981.13164405152, + 142663.99847487733, + 141939.49763879925, + 140620.72027832642, + 121510.95984230563, + 106107.00804445893, + 107144.45218217745, + 86173.86165357381, + 80756.30324059725, + 83026.9595419541, + 66499.82963436842, + 66522.10454239324, + 66767.47853575274, + 64797.937318291515, + 67540.4185876809, + 65817.49586266279, + 78893.71533411741, + 73186.95984994993, + 70820.12788375095, + 70141.49779724702, + 84438.92533489689, + 84645.03119849414, + 92751.94683626667, + 87159.73329018429, + 93246.05263940245, + 114421.92231094837, + 108935.24962072447, + 105085.34844318777, + 134634.76266261935, + 133594.49480363354, + 139617.18787082657, + 128217.16166194528, + 127250.38479238003, + 127925.5896627903, + 152510.46986863017, + 148874.2583978176, + 151230.81790877134, + 107271.56698781624, + 106096.95737218112, + 106781.60374093428, + 122290.48391813412, + 123406.75806841627, + 135934.28426523507, + 144874.6012623757, + 128595.86153997481, + 132427.4469172731, + 124987.8809068501, + 125323.04861487821, + 122169.98825505003, + 120369.02038862184, + 129061.70185616612, + 121210.32663008943, + 129968.94652555883, + 131935.00063871965, + 133914.28902984783, + 105752.50942078605, + 102922.43924526125, + 118489.34243253618, + 111287.41973752901, + 114647.97871280462, + 109956.89612265676, + 90391.92895484716, + 105613.34460686892, + 102467.60150550306, + 98823.85649678484, + 106246.67787430063, + 102564.0241005756, + 68453.44811526686, + 63265.85060498491, + 68141.74796426296, + 69350.52440794185, + 76802.08567362651, + 65153.63947523385, + 41843.99157308042, + 39165.55959096551, + 51238.52599506453, + 51276.68657583743, + 41077.39914666116, + 42151.66996664554, + 30736.063846215606, + 36045.196448497474, + 38385.81055063382, + 21591.845989063382, + 10654.732493117452, + 10611.375357069075, + 5985.382693145424, + 6057.369140423834, + 7414.433489698917, + 5372.706222161651, + 6427.535049766302, + 6284.730732411146, + 6337.76782887429, + 4290.477592796087, + 5177.2016314566135, + 6058.832576304674, + 4773.717004671693, + 4721.482507389039, + 5093.498391665518, + 4175.626140207052, + 5613.475714121014, + 1450.455493569374, + 7.14672714471817, + 7.662584066390989, + 15.863901615142826, + 0, + 0, + 0, + 5.607187271118163 + ] + }, + { + "customdata": [ + [ + "03:00", + "202483.67546946555" + ], + [ + "03:10", + "207964.793791987" + ], + [ + "03:19", + "215429.55483202636" + ], + [ + "03:30", + "220185.7967853248" + ], + [ + "03:40", + "223262.9589457065" + ], + [ + "03:49", + "227323.32332722843" + ], + [ + "04:00", + "282366.5992379375" + ], + [ + "04:10", + "289410.375766173" + ], + [ + "04:19", + "297349.08612891287" + ], + [ + "04:30", + "409227.85351711884" + ], + [ + "04:40", + "420815.7900074981" + ], + [ + "04:49", + "412959.889227815" + ], + [ + "05:00", + "634104.343729198" + ], + [ + "05:10", + "652257.6922595724" + ], + [ + "05:19", + "662430.2988489345" + ], + [ + "05:30", + "1048780.8315955773" + ], + [ + "05:40", + "1087784.5770037137" + ], + [ + "05:49", + "1098706.7091422193" + ], + [ + "06:00", + "1845507.307951402" + ], + [ + "06:10", + "1885935.1432195902" + ], + [ + "06:19", + "1888471.5674939565" + ], + [ + "06:30", + "4141091.0170596913" + ], + [ + "06:40", + "4222925.786394261" + ], + [ + "06:49", + "4312329.885335047" + ], + [ + "07:00", + "5657638.357203651" + ], + [ + "07:10", + "5805646.691167854" + ], + [ + "07:19", + "5847626.79397757" + ], + [ + "07:30", + "6160672.062355276" + ], + [ + "07:40", + "5966366.770891026" + ], + [ + "07:49", + "6097678.448670387" + ], + [ + "08:00", + "4967105.863185916" + ], + [ + "08:10", + "4772780.0750460215" + ], + [ + "08:19", + "4751184.712116726" + ], + [ + "08:30", + "3926683.0716890953" + ], + [ + "08:40", + "3746213.874040559" + ], + [ + "08:49", + "3733070.7811219767" + ], + [ + "09:00", + "3169386.441801455" + ], + [ + "09:10", + "3084112.857298281" + ], + [ + "09:19", + "3084382.49455392" + ], + [ + "09:30", + "2812984.550361246" + ], + [ + "09:40", + "2760962.9954183623" + ], + [ + "09:49", + "2754829.780979868" + ], + [ + "10:00", + "2571813.201857418" + ], + [ + "10:10", + "2554150.1967459284" + ], + [ + "10:19", + "2530066.0675300844" + ], + [ + "10:30", + "2552220.804772541" + ], + [ + "10:40", + "2528443.036898017" + ], + [ + "10:49", + "2520395.3819548488" + ], + [ + "11:00", + "2479196.2085439563" + ], + [ + "11:10", + "2485451.059557315" + ], + [ + "11:19", + "2478473.294903543" + ], + [ + "11:30", + "2598983.3537890054" + ], + [ + "11:40", + "2656365.604278758" + ], + [ + "11:49", + "2614324.3886278085" + ], + [ + "12:00", + "2605620.363618236" + ], + [ + "12:10", + "2606866.0826333463" + ], + [ + "12:19", + "2598144.822972022" + ], + [ + "12:30", + "2523026.8903808556" + ], + [ + "12:40", + "2516928.9626043923" + ], + [ + "12:49", + "2508788.194059357" + ], + [ + "13:00", + "2530406.007704135" + ], + [ + "13:10", + "2529134.438474223" + ], + [ + "13:19", + "2525326.8491950035" + ], + [ + "13:30", + "2564987.3306071423" + ], + [ + "13:40", + "2561308.984936025" + ], + [ + "13:49", + "2550074.489951525" + ], + [ + "14:00", + "2848062.4899502024" + ], + [ + "14:10", + "2894942.331476748" + ], + [ + "14:19", + "2896280.626639098" + ], + [ + "14:30", + "3351891.627381239" + ], + [ + "14:40", + "3414661.9865601584" + ], + [ + "14:49", + "3434356.0540978834" + ], + [ + "15:00", + "4053284.8158542365" + ], + [ + "15:10", + "4191216.840246409" + ], + [ + "15:19", + "4170384.086128872" + ], + [ + "15:30", + "4204467.841552701" + ], + [ + "15:40", + "4263706.342861734" + ], + [ + "15:49", + "4244091.62029957" + ], + [ + "16:00", + "4626969.003706053" + ], + [ + "16:10", + "4704430.060930487" + ], + [ + "16:19", + "4662428.542429872" + ], + [ + "16:30", + "3987207.5110942908" + ], + [ + "16:40", + "3953901.219799664" + ], + [ + "16:49", + "3931781.479612671" + ], + [ + "17:00", + "4120594.799821917" + ], + [ + "17:10", + "4131811.8260307983" + ], + [ + "17:19", + "4175756.384371262" + ], + [ + "17:30", + "4176198.0113367364" + ], + [ + "17:40", + "4158245.527146209" + ], + [ + "17:49", + "4181319.042422399" + ], + [ + "18:00", + "3690744.8696454987" + ], + [ + "18:10", + "3613647.669892486" + ], + [ + "18:19", + "3611658.250221893" + ], + [ + "18:30", + "3326439.9155103117" + ], + [ + "18:40", + "3267208.9949302487" + ], + [ + "18:49", + "3277962.2417889163" + ], + [ + "19:00", + "2775496.6166865528" + ], + [ + "19:10", + "2662113.0506313555" + ], + [ + "19:19", + "2694022.3208579533" + ], + [ + "19:30", + "2315201.100131415" + ], + [ + "19:40", + "2241689.0333389565" + ], + [ + "19:49", + "2241062.1041612662" + ], + [ + "20:00", + "2079136.2381364927" + ], + [ + "20:10", + "1984025.2933335006" + ], + [ + "20:19", + "2002628.3092134856" + ], + [ + "20:30", + "1816657.7364036106" + ], + [ + "20:40", + "1803136.0340270363" + ], + [ + "20:49", + "1782525.3171411306" + ], + [ + "21:00", + "1626780.4815560728" + ], + [ + "21:10", + "1579288.9857170507" + ], + [ + "21:19", + "1596478.7821398675" + ], + [ + "21:30", + "1207212.27572513" + ], + [ + "21:40", + "1107908.315473996" + ], + [ + "21:49", + "1085751.4879883341" + ], + [ + "22:00", + "933758.82533722" + ], + [ + "22:10", + "905613.5693180189" + ], + [ + "22:19", + "909856.2206089944" + ], + [ + "22:30", + "751240.4833002202" + ], + [ + "22:40", + "724821.2104088478" + ], + [ + "22:49", + "718686.7646661066" + ], + [ + "23:00", + "620396.4827525541" + ], + [ + "23:10", + "596388.2529610321" + ], + [ + "23:19", + "575175.0580477305" + ], + [ + "23:30", + "524962.9734238945" + ], + [ + "23:40", + "531773.518642243" + ], + [ + "23:49", + "545526.7851555459" + ], + [ + "00:00", + "416569.26171794906" + ], + [ + "00:10", + "367127.08554925025" + ], + [ + "00:19", + "354544.7536158487" + ], + [ + "00:30", + "306578.1435560435" + ], + [ + "00:40", + "296147.5070534572" + ], + [ + "00:49", + "287654.4324884601" + ], + [ + "01:00", + "256261.8631091863" + ], + [ + "01:10", + "252647.87992087752" + ], + [ + "01:19", + "254209.75587961078" + ], + [ + "01:30", + "214131.70323514938" + ], + [ + "01:40", + "219130.2676699385" + ], + [ + "01:49", + "213168.9435093999" + ], + [ + "02:00", + "171203.12835586444" + ], + [ + "02:10", + "181033.8165052794" + ], + [ + "02:19", + "170476.59822077304" + ], + [ + "02:30", + "152255.51506089047" + ], + [ + "02:40", + "156774.60078562796" + ], + [ + "02:49", + "143964.43625041097" + ], + [ + "03:00", + "30504.600361704826" + ], + [ + "03:10", + "7458.944065667689" + ], + [ + "03:19", + "5314.255055844784" + ], + [ + "03:30", + "3017.855228036642" + ], + [ + "03:40", + "1574.002866357565" + ], + [ + "03:49", + "1457.9976925849915" + ], + [ + "04:00", + "1361.1322812438011" + ], + [ + "04:10", + "949.3914828300476" + ], + [ + "04:19", + "1438.77050614357" + ], + [ + "04:30", + "289.898775100708" + ], + [ + "04:40", + "75.2706538438797" + ], + [ + "04:49", + "20.35190176963806" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332, + 25.5, + 25.666666666666668, + 25.833333333333332 + ], + "y": [ + 202483.67546946555, + 207964.793791987, + 215429.55483202636, + 220185.7967853248, + 223262.9589457065, + 227323.32332722843, + 282366.5992379375, + 289410.375766173, + 297349.08612891287, + 409227.85351711884, + 420815.7900074981, + 412959.889227815, + 634104.343729198, + 652257.6922595724, + 662430.2988489345, + 1048780.8315955773, + 1087784.5770037137, + 1098706.7091422193, + 1845507.307951402, + 1885935.1432195902, + 1888471.5674939565, + 4141091.0170596913, + 4222925.786394261, + 4312329.885335047, + 5657638.357203651, + 5805646.691167854, + 5847626.79397757, + 6160672.062355276, + 5966366.770891026, + 6097678.448670387, + 4967105.863185916, + 4772780.0750460215, + 4751184.712116726, + 3926683.0716890953, + 3746213.874040559, + 3733070.7811219767, + 3169386.441801455, + 3084112.857298281, + 3084382.49455392, + 2812984.550361246, + 2760962.9954183623, + 2754829.780979868, + 2571813.201857418, + 2554150.1967459284, + 2530066.0675300844, + 2552220.804772541, + 2528443.036898017, + 2520395.3819548488, + 2479196.2085439563, + 2485451.059557315, + 2478473.294903543, + 2598983.3537890054, + 2656365.604278758, + 2614324.3886278085, + 2605620.363618236, + 2606866.0826333463, + 2598144.822972022, + 2523026.8903808556, + 2516928.9626043923, + 2508788.194059357, + 2530406.007704135, + 2529134.438474223, + 2525326.8491950035, + 2564987.3306071423, + 2561308.984936025, + 2550074.489951525, + 2848062.4899502024, + 2894942.331476748, + 2896280.626639098, + 3351891.627381239, + 3414661.9865601584, + 3434356.0540978834, + 4053284.8158542365, + 4191216.840246409, + 4170384.086128872, + 4204467.841552701, + 4263706.342861734, + 4244091.62029957, + 4626969.003706053, + 4704430.060930487, + 4662428.542429872, + 3987207.5110942908, + 3953901.219799664, + 3931781.479612671, + 4120594.799821917, + 4131811.8260307983, + 4175756.384371262, + 4176198.0113367364, + 4158245.527146209, + 4181319.042422399, + 3690744.8696454987, + 3613647.669892486, + 3611658.250221893, + 3326439.9155103117, + 3267208.9949302487, + 3277962.2417889163, + 2775496.6166865528, + 2662113.0506313555, + 2694022.3208579533, + 2315201.100131415, + 2241689.0333389565, + 2241062.1041612662, + 2079136.2381364927, + 1984025.2933335006, + 2002628.3092134856, + 1816657.7364036106, + 1803136.0340270363, + 1782525.3171411306, + 1626780.4815560728, + 1579288.9857170507, + 1596478.7821398675, + 1207212.27572513, + 1107908.315473996, + 1085751.4879883341, + 933758.82533722, + 905613.5693180189, + 909856.2206089944, + 751240.4833002202, + 724821.2104088478, + 718686.7646661066, + 620396.4827525541, + 596388.2529610321, + 575175.0580477305, + 524962.9734238945, + 531773.518642243, + 545526.7851555459, + 416569.26171794906, + 367127.08554925025, + 354544.7536158487, + 306578.1435560435, + 296147.5070534572, + 287654.4324884601, + 256261.8631091863, + 252647.87992087752, + 254209.75587961078, + 214131.70323514938, + 219130.2676699385, + 213168.9435093999, + 171203.12835586444, + 181033.8165052794, + 170476.59822077304, + 152255.51506089047, + 156774.60078562796, + 143964.43625041097, + 30504.600361704826, + 7458.944065667689, + 5314.255055844784, + 3017.855228036642, + 1574.002866357565, + 1457.9976925849915, + 1361.1322812438011, + 949.3914828300476, + 1438.77050614357, + 289.898775100708, + 75.2706538438797, + 20.35190176963806 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "All TNC VMT (normalized to per-hour) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "VMT per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_all_vmt_per_hour(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " VMT/hour for all veh trips, using dist_col_new (OD_dist) and bin size.\n", + " \"\"\"\n", + " dist = pd.to_numeric(new_df[dist_col_new], errors=\"coerce\")\n", + " bins = pd.to_numeric(new_df[\"depart_bin\"], errors=\"coerce\")\n", + "\n", + " valid = bins.notna() & dist.notna()\n", + " if not valid.any():\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " bins = bins[valid].astype(int)\n", + " dist = dist[valid]\n", + "\n", + " vmt_by_bin = (\n", + " pd.Series(dist.values, index=bins.values)\n", + " .groupby(level=0).sum()\n", + " .sort_index()\n", + " .reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0.0)\n", + " )\n", + "\n", + " factor = 60.0 / bin_minutes\n", + " vmt_rate = vmt_by_bin * factor\n", + "\n", + " times = start_time + pd.to_timedelta(vmt_rate.index * bin_minutes, unit=\"m\")\n", + " vals = vmt_rate.values\n", + "\n", + " df = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " df[\"hover\"] = [\n", + " f\"VMT/hour: {v:,.1f} (bin VMT: {b:,.1f}, bin={bin_minutes} min)\"\n", + " for v, b in zip(vals, vmt_by_bin.values)\n", + " ]\n", + " return df\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_all_vmt_per_hour,\n", + " \"All TNC VMT (normalized to per-hour)\",\n", + " \"VMT per hour\",\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "All TNC trips totals — time_bin_size\n", + " total_trips total_vmt\n", + "scenario \n", + "base 428566 1.874488e+06\n", + "timebin_5 429146 1.905020e+06\n", + "timebin_15 427906 1.859414e+06\n", + "\n", + "All TNC trips totals — max_detour\n", + " total_trips total_vmt\n", + "scenario \n", + "base 428566 1.874488e+06\n", + "detour_5 428575 1.875645e+06\n", + "detour_10 428570 1.875214e+06\n", + "detour_20 428617 1.875890e+06\n", + "\n", + "All TNC trips totals — max_occupancy\n", + " total_trips total_vmt\n", + "scenario \n", + "base 428566 1.874488e+06\n", + "occ_6 400900 1.754936e+06\n", + "occ_8 384969 1.697862e+06\n", + "\n", + "All TNC trips totals — tnc_shared_demand\n", + " total_trips total_vmt\n", + "scenario \n", + "base 428566 1.874488e+06\n", + "shift_to_all_shared_tnc 22328970 5.502521e+07\n" + ] + } + ], + "source": [ + "def metric_all_trips_totals(new_df, pooled_df):\n", + " d = new_df.copy()\n", + " d[dist_col_new] = pd.to_numeric(d[dist_col_new], errors=\"coerce\").fillna(0.0)\n", + " return {\n", + " \"total_trips\": len(d),\n", + " \"total_vmt\": d[dist_col_new].sum(),\n", + " }\n", + "\n", + "run_scalar_metric(metric_all_trips_totals, \"All TNC trips totals\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Avg initial wait time by hour (ignoring first pickup by each vehicle)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.82247365422939" + ], + [ + "05:00", + "7.452575404359935" + ], + [ + "06:00", + "5.0356318731386684" + ], + [ + "07:00", + "2.8909968451333263" + ], + [ + "08:00", + "2.5515270619156176" + ], + [ + "09:00", + "3.000666246161384" + ], + [ + "10:00", + "3.074771294384598" + ], + [ + "11:00", + "2.33365060429997" + ], + [ + "12:00", + "1.941646616499216" + ], + [ + "13:00", + "2.138553692024344" + ], + [ + "14:00", + "2.28318726501699" + ], + [ + "15:00", + "2.33630073768549" + ], + [ + "16:00", + "2.1477586714870482" + ], + [ + "17:00", + "2.476529226879483" + ], + [ + "18:00", + "2.317659431387918" + ], + [ + "19:00", + "2.5017195268022303" + ], + [ + "20:00", + "2.5958785810399787" + ], + [ + "21:00", + "2.989526777348285" + ], + [ + "22:00", + "3.383885977501816" + ], + [ + "23:00", + "3.1962807626471794" + ], + [ + "00:00", + "2.2429890820423717" + ], + [ + "01:00", + "2.537521186415796" + ], + [ + "02:00", + "3.0018359573734044" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.82247365422939, + 7.452575404359935, + 5.0356318731386684, + 2.8909968451333263, + 2.5515270619156176, + 3.000666246161384, + 3.074771294384598, + 2.33365060429997, + 1.941646616499216, + 2.138553692024344, + 2.28318726501699, + 2.33630073768549, + 2.1477586714870482, + 2.476529226879483, + 2.317659431387918, + 2.5017195268022303, + 2.5958785810399787, + 2.989526777348285, + 3.383885977501816, + 3.1962807626471794, + 2.2429890820423717, + 2.537521186415796, + 3.0018359573734044 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.680615906321675" + ], + [ + "04:00", + "9.221186789792853" + ], + [ + "05:00", + "8.04941856776699" + ], + [ + "06:00", + "5.3979149856075805" + ], + [ + "07:00", + "3.395000167054707" + ], + [ + "08:00", + "2.8542903576020273" + ], + [ + "09:00", + "3.303227853187103" + ], + [ + "10:00", + "3.3609537936318983" + ], + [ + "11:00", + "2.577394199524433" + ], + [ + "12:00", + "2.1105806112005436" + ], + [ + "13:00", + "2.3321077265843555" + ], + [ + "14:00", + "2.5998654433113395" + ], + [ + "15:00", + "2.7078614845936055" + ], + [ + "16:00", + "2.475144103736841" + ], + [ + "17:00", + "2.8713448720527306" + ], + [ + "18:00", + "2.6607715214156253" + ], + [ + "19:00", + "2.8261413740350627" + ], + [ + "20:00", + "2.976932189609172" + ], + [ + "21:00", + "3.2851326298205423" + ], + [ + "22:00", + "3.405732750319637" + ], + [ + "23:00", + "3.4187026319444835" + ], + [ + "00:00", + "2.3536423441605616" + ], + [ + "01:00", + "2.606247871370501" + ], + [ + "02:00", + "3.115630545593168" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.680615906321675, + 9.221186789792853, + 8.04941856776699, + 5.3979149856075805, + 3.395000167054707, + 2.8542903576020273, + 3.303227853187103, + 3.3609537936318983, + 2.577394199524433, + 2.1105806112005436, + 2.3321077265843555, + 2.5998654433113395, + 2.7078614845936055, + 2.475144103736841, + 2.8713448720527306, + 2.6607715214156253, + 2.8261413740350627, + 2.976932189609172, + 3.2851326298205423, + 3.405732750319637, + 3.4187026319444835, + 2.3536423441605616, + 2.606247871370501, + 3.115630545593168 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.340422625853636" + ], + [ + "04:00", + "8.296070121485611" + ], + [ + "05:00", + "7.108592459360343" + ], + [ + "06:00", + "4.675197851102467" + ], + [ + "07:00", + "2.6632290173813757" + ], + [ + "08:00", + "2.352195743520121" + ], + [ + "09:00", + "2.8330237465366626" + ], + [ + "10:00", + "2.9449886898279534" + ], + [ + "11:00", + "2.2084705381080547" + ], + [ + "12:00", + "1.8223708882034766" + ], + [ + "13:00", + "2.0187501787792415" + ], + [ + "14:00", + "2.20103269191485" + ], + [ + "15:00", + "2.1946276924080945" + ], + [ + "16:00", + "1.9756129566552552" + ], + [ + "17:00", + "2.3735336472482724" + ], + [ + "18:00", + "2.1648576540198174" + ], + [ + "19:00", + "2.3291032727801295" + ], + [ + "20:00", + "2.4301019238095316" + ], + [ + "21:00", + "2.820514734600594" + ], + [ + "22:00", + "3.351812505693419" + ], + [ + "23:00", + "3.1081278575696616" + ], + [ + "00:00", + "2.031931422667371" + ], + [ + "01:00", + "2.466132684519207" + ], + [ + "02:00", + "2.908515508847302" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.340422625853636, + 8.296070121485611, + 7.108592459360343, + 4.675197851102467, + 2.6632290173813757, + 2.352195743520121, + 2.8330237465366626, + 2.9449886898279534, + 2.2084705381080547, + 1.8223708882034766, + 2.0187501787792415, + 2.20103269191485, + 2.1946276924080945, + 1.9756129566552552, + 2.3735336472482724, + 2.1648576540198174, + 2.3291032727801295, + 2.4301019238095316, + 2.820514734600594, + 3.351812505693419, + 3.1081278575696616, + 2.031931422667371, + 2.466132684519207, + 2.908515508847302 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average initial wait time (excluding first pickup per vehicle) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Minutes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.82247365422939" + ], + [ + "05:00", + "7.452575404359935" + ], + [ + "06:00", + "5.0356318731386684" + ], + [ + "07:00", + "2.8909968451333263" + ], + [ + "08:00", + "2.5515270619156176" + ], + [ + "09:00", + "3.000666246161384" + ], + [ + "10:00", + "3.074771294384598" + ], + [ + "11:00", + "2.33365060429997" + ], + [ + "12:00", + "1.941646616499216" + ], + [ + "13:00", + "2.138553692024344" + ], + [ + "14:00", + "2.28318726501699" + ], + [ + "15:00", + "2.33630073768549" + ], + [ + "16:00", + "2.1477586714870482" + ], + [ + "17:00", + "2.476529226879483" + ], + [ + "18:00", + "2.317659431387918" + ], + [ + "19:00", + "2.5017195268022303" + ], + [ + "20:00", + "2.5958785810399787" + ], + [ + "21:00", + "2.989526777348285" + ], + [ + "22:00", + "3.383885977501816" + ], + [ + "23:00", + "3.1962807626471794" + ], + [ + "00:00", + "2.2429890820423717" + ], + [ + "01:00", + "2.537521186415796" + ], + [ + "02:00", + "3.0018359573734044" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.82247365422939, + 7.452575404359935, + 5.0356318731386684, + 2.8909968451333263, + 2.5515270619156176, + 3.000666246161384, + 3.074771294384598, + 2.33365060429997, + 1.941646616499216, + 2.138553692024344, + 2.28318726501699, + 2.33630073768549, + 2.1477586714870482, + 2.476529226879483, + 2.317659431387918, + 2.5017195268022303, + 2.5958785810399787, + 2.989526777348285, + 3.383885977501816, + 3.1962807626471794, + 2.2429890820423717, + 2.537521186415796, + 3.0018359573734044 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.870583308411904" + ], + [ + "05:00", + "7.479297511196124" + ], + [ + "06:00", + "5.037234375248604" + ], + [ + "07:00", + "2.8673254175677267" + ], + [ + "08:00", + "2.549642787724778" + ], + [ + "09:00", + "2.9799704919588814" + ], + [ + "10:00", + "3.0617046141872217" + ], + [ + "11:00", + "2.326506885287524" + ], + [ + "12:00", + "1.9141881531267835" + ], + [ + "13:00", + "2.1172148143940683" + ], + [ + "14:00", + "2.2684502553729677" + ], + [ + "15:00", + "2.287468973332304" + ], + [ + "16:00", + "2.125184567759758" + ], + [ + "17:00", + "2.4879033197349414" + ], + [ + "18:00", + "2.313914560522234" + ], + [ + "19:00", + "2.4924531987161926" + ], + [ + "20:00", + "2.5831181806294903" + ], + [ + "21:00", + "2.974472453455981" + ], + [ + "22:00", + "3.414556863936645" + ], + [ + "23:00", + "3.219340363049294" + ], + [ + "00:00", + "2.2548653177181044" + ], + [ + "01:00", + "2.4830569079397127" + ], + [ + "02:00", + "3.1341900868313526" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.870583308411904, + 7.479297511196124, + 5.037234375248604, + 2.8673254175677267, + 2.549642787724778, + 2.9799704919588814, + 3.0617046141872217, + 2.326506885287524, + 1.9141881531267835, + 2.1172148143940683, + 2.2684502553729677, + 2.287468973332304, + 2.125184567759758, + 2.4879033197349414, + 2.313914560522234, + 2.4924531987161926, + 2.5831181806294903, + 2.974472453455981, + 3.414556863936645, + 3.219340363049294, + 2.2548653177181044, + 2.4830569079397127, + 3.1341900868313526 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.870583308411904" + ], + [ + "05:00", + "7.479297511196124" + ], + [ + "06:00", + "5.044929581933801" + ], + [ + "07:00", + "2.866025634723461" + ], + [ + "08:00", + "2.548613648492328" + ], + [ + "09:00", + "2.991680106380352" + ], + [ + "10:00", + "3.0778491161942214" + ], + [ + "11:00", + "2.3239122379091643" + ], + [ + "12:00", + "1.9233984820761947" + ], + [ + "13:00", + "2.1315998721410043" + ], + [ + "14:00", + "2.2688862716410663" + ], + [ + "15:00", + "2.325828986186245" + ], + [ + "16:00", + "2.1404730185352423" + ], + [ + "17:00", + "2.486031033563847" + ], + [ + "18:00", + "2.3161148823909015" + ], + [ + "19:00", + "2.502167865532142" + ], + [ + "20:00", + "2.583476820525503" + ], + [ + "21:00", + "2.9709276524241086" + ], + [ + "22:00", + "3.4517765292924847" + ], + [ + "23:00", + "3.2155513522043027" + ], + [ + "00:00", + "2.2604599884410415" + ], + [ + "01:00", + "2.4561873448248916" + ], + [ + "02:00", + "3.012211918942074" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.870583308411904, + 7.479297511196124, + 5.044929581933801, + 2.866025634723461, + 2.548613648492328, + 2.991680106380352, + 3.0778491161942214, + 2.3239122379091643, + 1.9233984820761947, + 2.1315998721410043, + 2.2688862716410663, + 2.325828986186245, + 2.1404730185352423, + 2.486031033563847, + 2.3161148823909015, + 2.502167865532142, + 2.583476820525503, + 2.9709276524241086, + 3.4517765292924847, + 3.2155513522043027, + 2.2604599884410415, + 2.4561873448248916, + 3.012211918942074 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.82247365422939" + ], + [ + "05:00", + "7.452575404359935" + ], + [ + "06:00", + "5.034455225557502" + ], + [ + "07:00", + "2.8930362264400684" + ], + [ + "08:00", + "2.569735787118427" + ], + [ + "09:00", + "3.014700976201159" + ], + [ + "10:00", + "3.0839377041312868" + ], + [ + "11:00", + "2.341778235480961" + ], + [ + "12:00", + "1.9515076522933674" + ], + [ + "13:00", + "2.147299062863623" + ], + [ + "14:00", + "2.287355767210231" + ], + [ + "15:00", + "2.344247586622367" + ], + [ + "16:00", + "2.170259587719732" + ], + [ + "17:00", + "2.5024308564624818" + ], + [ + "18:00", + "2.3342166532747286" + ], + [ + "19:00", + "2.484686324284971" + ], + [ + "20:00", + "2.611481436160283" + ], + [ + "21:00", + "2.994360216984456" + ], + [ + "22:00", + "3.4403776187476383" + ], + [ + "23:00", + "3.1916822295589875" + ], + [ + "00:00", + "2.24958251926895" + ], + [ + "01:00", + "2.5135998693821824" + ], + [ + "02:00", + "3.0599066972065327" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.82247365422939, + 7.452575404359935, + 5.034455225557502, + 2.8930362264400684, + 2.569735787118427, + 3.014700976201159, + 3.0839377041312868, + 2.341778235480961, + 1.9515076522933674, + 2.147299062863623, + 2.287355767210231, + 2.344247586622367, + 2.170259587719732, + 2.5024308564624818, + 2.3342166532747286, + 2.484686324284971, + 2.611481436160283, + 2.994360216984456, + 3.4403776187476383, + 3.1916822295589875, + 2.24958251926895, + 2.5135998693821824, + 3.0599066972065327 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average initial wait time (excluding first pickup per vehicle) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Minutes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.82247365422939" + ], + [ + "05:00", + "7.452575404359935" + ], + [ + "06:00", + "5.0356318731386684" + ], + [ + "07:00", + "2.8909968451333263" + ], + [ + "08:00", + "2.5515270619156176" + ], + [ + "09:00", + "3.000666246161384" + ], + [ + "10:00", + "3.074771294384598" + ], + [ + "11:00", + "2.33365060429997" + ], + [ + "12:00", + "1.941646616499216" + ], + [ + "13:00", + "2.138553692024344" + ], + [ + "14:00", + "2.28318726501699" + ], + [ + "15:00", + "2.33630073768549" + ], + [ + "16:00", + "2.1477586714870482" + ], + [ + "17:00", + "2.476529226879483" + ], + [ + "18:00", + "2.317659431387918" + ], + [ + "19:00", + "2.5017195268022303" + ], + [ + "20:00", + "2.5958785810399787" + ], + [ + "21:00", + "2.989526777348285" + ], + [ + "22:00", + "3.383885977501816" + ], + [ + "23:00", + "3.1962807626471794" + ], + [ + "00:00", + "2.2429890820423717" + ], + [ + "01:00", + "2.537521186415796" + ], + [ + "02:00", + "3.0018359573734044" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.82247365422939, + 7.452575404359935, + 5.0356318731386684, + 2.8909968451333263, + 2.5515270619156176, + 3.000666246161384, + 3.074771294384598, + 2.33365060429997, + 1.941646616499216, + 2.138553692024344, + 2.28318726501699, + 2.33630073768549, + 2.1477586714870482, + 2.476529226879483, + 2.317659431387918, + 2.5017195268022303, + 2.5958785810399787, + 2.989526777348285, + 3.383885977501816, + 3.1962807626471794, + 2.2429890820423717, + 2.537521186415796, + 3.0018359573734044 + ] + }, + { + "customdata": [ + [ + "03:00", + "9.547460290146809" + ], + [ + "04:00", + "8.99655940128585" + ], + [ + "05:00", + "7.302084593653259" + ], + [ + "06:00", + "4.955402883191624" + ], + [ + "07:00", + "2.9826831772342786" + ], + [ + "08:00", + "2.4871397960386004" + ], + [ + "09:00", + "2.844131236662293" + ], + [ + "10:00", + "2.974600057925102" + ], + [ + "11:00", + "2.2645459902090503" + ], + [ + "12:00", + "1.9007309692240666" + ], + [ + "13:00", + "2.232360107335889" + ], + [ + "14:00", + "2.328872611899618" + ], + [ + "15:00", + "2.3874418394395716" + ], + [ + "16:00", + "2.1263340276461817" + ], + [ + "17:00", + "2.5028772554246386" + ], + [ + "18:00", + "2.2552800240099824" + ], + [ + "19:00", + "2.437504782701686" + ], + [ + "20:00", + "2.5747973370059283" + ], + [ + "21:00", + "2.901700948197248" + ], + [ + "22:00", + "3.3010721552726703" + ], + [ + "23:00", + "3.1749434417905733" + ], + [ + "00:00", + "2.18886361266034" + ], + [ + "01:00", + "2.490129470051109" + ], + [ + "02:00", + "3.1257479045577723" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.547460290146809, + 8.99655940128585, + 7.302084593653259, + 4.955402883191624, + 2.9826831772342786, + 2.4871397960386004, + 2.844131236662293, + 2.974600057925102, + 2.2645459902090503, + 1.9007309692240666, + 2.232360107335889, + 2.328872611899618, + 2.3874418394395716, + 2.1263340276461817, + 2.5028772554246386, + 2.2552800240099824, + 2.437504782701686, + 2.5747973370059283, + 2.901700948197248, + 3.3010721552726703, + 3.1749434417905733, + 2.18886361266034, + 2.490129470051109, + 3.1257479045577723 + ] + }, + { + "customdata": [ + [ + "03:00", + "8.994628927418004" + ], + [ + "04:00", + "9.149722861746946" + ], + [ + "05:00", + "7.530986669458993" + ], + [ + "06:00", + "4.944168010669266" + ], + [ + "07:00", + "2.959100908156744" + ], + [ + "08:00", + "2.4453792886340047" + ], + [ + "09:00", + "2.865288853068788" + ], + [ + "10:00", + "2.898208124289511" + ], + [ + "11:00", + "2.264051708275472" + ], + [ + "12:00", + "1.9474022100062636" + ], + [ + "13:00", + "2.2033308844140174" + ], + [ + "14:00", + "2.2996351035446394" + ], + [ + "15:00", + "2.3685690961479935" + ], + [ + "16:00", + "2.0773302874380577" + ], + [ + "17:00", + "2.424863957197935" + ], + [ + "18:00", + "2.2613663308281367" + ], + [ + "19:00", + "2.447010539251069" + ], + [ + "20:00", + "2.5281580057543827" + ], + [ + "21:00", + "2.9416290849980578" + ], + [ + "22:00", + "3.2842549721740975" + ], + [ + "23:00", + "3.1179026442508375" + ], + [ + "00:00", + "2.270749593225153" + ], + [ + "01:00", + "2.6759284196535966" + ], + [ + "02:00", + "3.264096653187455" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 8.994628927418004, + 9.149722861746946, + 7.530986669458993, + 4.944168010669266, + 2.959100908156744, + 2.4453792886340047, + 2.865288853068788, + 2.898208124289511, + 2.264051708275472, + 1.9474022100062636, + 2.2033308844140174, + 2.2996351035446394, + 2.3685690961479935, + 2.0773302874380577, + 2.424863957197935, + 2.2613663308281367, + 2.447010539251069, + 2.5281580057543827, + 2.9416290849980578, + 3.2842549721740975, + 3.1179026442508375, + 2.270749593225153, + 2.6759284196535966, + 3.264096653187455 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average initial wait time (excluding first pickup per vehicle) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Minutes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "9.524375188918341" + ], + [ + "04:00", + "8.82247365422939" + ], + [ + "05:00", + "7.452575404359935" + ], + [ + "06:00", + "5.0356318731386684" + ], + [ + "07:00", + "2.8909968451333263" + ], + [ + "08:00", + "2.5515270619156176" + ], + [ + "09:00", + "3.000666246161384" + ], + [ + "10:00", + "3.074771294384598" + ], + [ + "11:00", + "2.33365060429997" + ], + [ + "12:00", + "1.941646616499216" + ], + [ + "13:00", + "2.138553692024344" + ], + [ + "14:00", + "2.28318726501699" + ], + [ + "15:00", + "2.33630073768549" + ], + [ + "16:00", + "2.1477586714870482" + ], + [ + "17:00", + "2.476529226879483" + ], + [ + "18:00", + "2.317659431387918" + ], + [ + "19:00", + "2.5017195268022303" + ], + [ + "20:00", + "2.5958785810399787" + ], + [ + "21:00", + "2.989526777348285" + ], + [ + "22:00", + "3.383885977501816" + ], + [ + "23:00", + "3.1962807626471794" + ], + [ + "00:00", + "2.2429890820423717" + ], + [ + "01:00", + "2.537521186415796" + ], + [ + "02:00", + "3.0018359573734044" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ], + "y": [ + 9.524375188918341, + 8.82247365422939, + 7.452575404359935, + 5.0356318731386684, + 2.8909968451333263, + 2.5515270619156176, + 3.000666246161384, + 3.074771294384598, + 2.33365060429997, + 1.941646616499216, + 2.138553692024344, + 2.28318726501699, + 2.33630073768549, + 2.1477586714870482, + 2.476529226879483, + 2.317659431387918, + 2.5017195268022303, + 2.5958785810399787, + 2.989526777348285, + 3.383885977501816, + 3.1962807626471794, + 2.2429890820423717, + 2.537521186415796, + 3.0018359573734044 + ] + }, + { + "customdata": [ + [ + "03:00", + "3.9670721674515415" + ], + [ + "04:00", + "3.802334157866411" + ], + [ + "05:00", + "3.429752809499593" + ], + [ + "06:00", + "2.80412172802146" + ], + [ + "07:00", + "2.481486662138915" + ], + [ + "08:00", + "2.362359535917506" + ], + [ + "09:00", + "2.3079827973650477" + ], + [ + "10:00", + "2.1887835812277143" + ], + [ + "11:00", + "2.0956823578170893" + ], + [ + "12:00", + "1.9646871479952592" + ], + [ + "13:00", + "1.9370889564036788" + ], + [ + "14:00", + "2.0265965782493645" + ], + [ + "15:00", + "2.131423088407655" + ], + [ + "16:00", + "2.2442285026263176" + ], + [ + "17:00", + "2.3615547685253073" + ], + [ + "18:00", + "2.3741614619718434" + ], + [ + "19:00", + "2.422684924397958" + ], + [ + "20:00", + "2.5130080825796988" + ], + [ + "21:00", + "2.6594170674016495" + ], + [ + "22:00", + "2.7695313051191444" + ], + [ + "23:00", + "3.009008765318796" + ], + [ + "00:00", + "3.1246436880827684" + ], + [ + "01:00", + "3.4299154067388913" + ], + [ + "02:00", + "3.8279362180369847" + ], + [ + "03:00", + "4.8660690151154995" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "y": [ + 3.9670721674515415, + 3.802334157866411, + 3.429752809499593, + 2.80412172802146, + 2.481486662138915, + 2.362359535917506, + 2.3079827973650477, + 2.1887835812277143, + 2.0956823578170893, + 1.9646871479952592, + 1.9370889564036788, + 2.0265965782493645, + 2.131423088407655, + 2.2442285026263176, + 2.3615547685253073, + 2.3741614619718434, + 2.422684924397958, + 2.5130080825796988, + 2.6594170674016495, + 2.7695313051191444, + 3.009008765318796, + 3.1246436880827684, + 3.4299154067388913, + 3.8279362180369847, + 4.8660690151154995 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average initial wait time (excluding first pickup per vehicle) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Minutes" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_initial_wait_by_hour(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " Average initial wait time by hour of day, excluding each vehicle's first pickup (when it gets spawned).\n", + " Uses OD_time on pickup legs.\n", + " \"\"\"\n", + " df = new_df.copy()\n", + "\n", + " # pickups only\n", + " pickup_mask = df[\"trip_type\"].astype(str).str.lower().eq(\"pickup\")\n", + " df = df.loc[pickup_mask].copy()\n", + "\n", + " df[\"depart_bin\"] = pd.to_numeric(df[\"depart_bin\"], errors=\"coerce\")\n", + " df[\"OD_time\"] = pd.to_numeric(df[\"OD_time\"], errors=\"coerce\")\n", + "\n", + " valid = df[\"depart_bin\"].notna() & df[\"OD_time\"].notna()\n", + " df = df.loc[valid].copy()\n", + "\n", + " if df.empty:\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " # drop first pickup per vehicle\n", + " df[\"depart_bin_int\"] = df[\"depart_bin\"].astype(int)\n", + " first_per_vehicle = (\n", + " df.groupby(\"vehicle_id\")[\"depart_bin_int\"].transform(\"min\")\n", + " )\n", + " df = df[df[\"depart_bin_int\"] > first_per_vehicle]\n", + "\n", + " if df.empty:\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " # hour_from_3am = floor( (depart_bin * bin_minutes) / 60 )\n", + " df[\"hour_from_3am\"] = ((df[\"depart_bin_int\"] * bin_minutes) // 60).astype(int)\n", + "\n", + " wait_by_hour = (\n", + " df.groupby(\"hour_from_3am\")[\"OD_time\"]\n", + " .mean()\n", + " .rename(\"avg_wait\")\n", + " .reset_index()\n", + " )\n", + "\n", + " times = start_time + pd.to_timedelta(wait_by_hour[\"hour_from_3am\"] * 60, unit=\"m\")\n", + " vals = wait_by_hour[\"avg_wait\"].values\n", + "\n", + " out = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " out[\"hover\"] = [\n", + " f\"Avg wait: {v:.2f} min\"\n", + " for v in vals\n", + " ]\n", + " return out\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_initial_wait_by_hour,\n", + " \"Average initial wait time (excluding first pickup per vehicle)\",\n", + " \"Minutes\",\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Avg detour time" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Average detour time (pooled trips) — time_bin_size\n", + " avg_detour\n", + "scenario \n", + "base 8.676728\n", + "timebin_5 8.751975\n", + "timebin_15 8.468652\n", + "\n", + "Average detour time (pooled trips) — max_detour\n", + " avg_detour\n", + "scenario \n", + "base 8.676728\n", + "detour_5 2.915697\n", + "detour_10 6.210723\n", + "detour_20 10.034144\n", + "\n", + "Average detour time (pooled trips) — max_occupancy\n", + " avg_detour\n", + "scenario \n", + "base 8.676728\n", + "occ_6 8.956039\n", + "occ_8 8.942742\n", + "\n", + "Average detour time (pooled trips) — tnc_shared_demand\n", + " avg_detour\n", + "scenario \n", + "base 8.676728\n", + "shift_to_all_shared_tnc 3.937055\n" + ] + } + ], + "source": [ + "def metric_avg_detour(new_df, pooled_df):\n", + " mask_pooled = pooled_df[\"trip_j\"].notna()\n", + "\n", + " d_i = pd.to_numeric(pooled_df.loc[mask_pooled, \"detour_i\"], errors=\"coerce\")\n", + " d_j = pd.to_numeric(pooled_df.loc[mask_pooled, \"detour_j\"], errors=\"coerce\")\n", + "\n", + " vals = pd.concat([d_i, d_j], ignore_index=True).dropna()\n", + " avg_detour = vals.mean() if not vals.empty else np.nan\n", + "\n", + " return {\"avg_detour\": avg_detour}\n", + "\n", + "run_scalar_metric(metric_avg_detour, \"Average detour time (pooled trips)\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Too few data points\n", + "\n", + "# def run_detour_histograms():\n", + "# \"\"\"\n", + "# For each test group, plot detour distributions for base + its variants.\n", + "# Detours come from pooled trips where trip_j is not null, using detour_i and detour_j.\n", + "# \"\"\"\n", + "# for test_name, scen_list in TEST_GROUPS.items():\n", + "# fig = go.Figure()\n", + "\n", + "# for scen in scen_list:\n", + "# _, pooled_df = load_outputs(scen)\n", + "\n", + "# mask_pooled = pooled_df[\"trip_j\"].notna()\n", + "\n", + "# d_i = pd.to_numeric(pooled_df.loc[mask_pooled, \"detour_i\"], errors=\"coerce\")\n", + "# d_j = pd.to_numeric(pooled_df.loc[mask_pooled, \"detour_j\"], errors=\"coerce\")\n", + "\n", + "# vals = pd.concat([d_i, d_j], ignore_index=True).dropna()\n", + "# if vals.empty:\n", + "# continue\n", + "\n", + "# fig.add_trace(\n", + "# go.Histogram(\n", + "# x=vals,\n", + "# name=scen,\n", + "# opacity=0.45,\n", + "# nbinsx=40,\n", + "# hovertemplate=\"Scenario: %{meta}
Detour: %{x:.2f} min
Count: %{y}\",\n", + "# meta=scen,\n", + "# )\n", + "# )\n", + "\n", + "# fig.update_layout(\n", + "# title=f\"Detour time distribution — {test_name}\",\n", + "# xaxis_title=\"Detour time (minutes)\",\n", + "# yaxis_title=\"Count\",\n", + "# barmode=\"overlay\",\n", + "# )\n", + "# fig.show()\n", + "\n", + "# # Call once to generate histograms for all three tests\n", + "# run_detour_histograms()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Avg occupancy by hour" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1269347057339092" + ], + [ + "04:10", + "1.183315922030218" + ], + [ + "04:19", + "1.020977082138179" + ], + [ + "04:30", + "1.1270128806263786" + ], + [ + "04:40", + "1.1263681399418604" + ], + [ + "04:49", + "1.118083187971494" + ], + [ + "05:00", + "0.9897878521213063" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0818312572990452" + ], + [ + "05:30", + "1.0856437631284126" + ], + [ + "05:40", + "1.0674782599651953" + ], + [ + "05:49", + "0.9811777087669468" + ], + [ + "06:00", + "0.9688417647786189" + ], + [ + "06:10", + "0.9251838620543567" + ], + [ + "06:19", + "0.9683619696413023" + ], + [ + "06:30", + "1.0209246384536417" + ], + [ + "06:40", + "0.9779619172742089" + ], + [ + "06:49", + "0.9256885449852714" + ], + [ + "07:00", + "1.061987673659908" + ], + [ + "07:10", + "1.036518467324717" + ], + [ + "07:19", + "1.0321799612950202" + ], + [ + "07:30", + "1.0951012329242487" + ], + [ + "07:40", + "1.0645670515151604" + ], + [ + "07:49", + "1.1199188585361046" + ], + [ + "08:00", + "1.296708106715972" + ], + [ + "08:10", + "1.2910624251454585" + ], + [ + "08:19", + "1.2848943927871044" + ], + [ + "08:30", + "1.442780474793665" + ], + [ + "08:40", + "1.4349704104992251" + ], + [ + "08:49", + "1.4401307976454372" + ], + [ + "09:00", + "1.5087555110510038" + ], + [ + "09:10", + "1.5891807749918847" + ], + [ + "09:19", + "1.5555066872545613" + ], + [ + "09:30", + "1.6482125215395373" + ], + [ + "09:40", + "1.6927817938564795" + ], + [ + "09:49", + "1.6642632986145796" + ], + [ + "10:00", + "1.7255967433933863" + ], + [ + "10:10", + "1.7615758260972627" + ], + [ + "10:19", + "1.6954755490847238" + ], + [ + "10:30", + "1.8345978388881383" + ], + [ + "10:40", + "1.6912542690332335" + ], + [ + "10:49", + "1.7828530739005293" + ], + [ + "11:00", + "1.7882051207781073" + ], + [ + "11:10", + "1.6964001929007024" + ], + [ + "11:19", + "1.7344908755574489" + ], + [ + "11:30", + "1.6457586680994094" + ], + [ + "11:40", + "1.5859841301566848" + ], + [ + "11:49", + "1.5376239137665637" + ], + [ + "12:00", + "1.406096761351721" + ], + [ + "12:10", + "1.3849373042627509" + ], + [ + "12:19", + "1.368628588171102" + ], + [ + "12:30", + "1.4867019672825126" + ], + [ + "12:40", + "1.438708240345497" + ], + [ + "12:49", + "1.5602385095048719" + ], + [ + "13:00", + "1.5669961325676882" + ], + [ + "13:10", + "1.42494421695802" + ], + [ + "13:19", + "1.3873811114046888" + ], + [ + "13:30", + "1.4680296664950658" + ], + [ + "13:40", + "1.511599784000429" + ], + [ + "13:49", + "1.4935745743916866" + ], + [ + "14:00", + "1.4060332951717749" + ], + [ + "14:10", + "1.5017317613473715" + ], + [ + "14:19", + "1.4703927740714626" + ], + [ + "14:30", + "1.4371220011099988" + ], + [ + "14:40", + "1.5068676690735445" + ], + [ + "14:49", + "1.4478117357821705" + ], + [ + "15:00", + "1.4196435727071088" + ], + [ + "15:10", + "1.4903427569533385" + ], + [ + "15:19", + "1.4698244938793883" + ], + [ + "15:30", + "1.5505846863487387" + ], + [ + "15:40", + "1.533519879787878" + ], + [ + "15:49", + "1.5667786069174539" + ], + [ + "16:00", + "1.5778047809114366" + ], + [ + "16:10", + "1.5555200473410558" + ], + [ + "16:19", + "1.564869119125043" + ], + [ + "16:30", + "1.698682981767884" + ], + [ + "16:40", + "1.6872971414285893" + ], + [ + "16:49", + "1.6493481770759535" + ], + [ + "17:00", + "1.7060311521985225" + ], + [ + "17:10", + "1.7137124903923262" + ], + [ + "17:19", + "1.6376606553417676" + ], + [ + "17:30", + "1.7895981600845021" + ], + [ + "17:40", + "1.7412522178219008" + ], + [ + "17:49", + "1.715352448907016" + ], + [ + "18:00", + "1.7857796975493536" + ], + [ + "18:10", + "1.7331170595870433" + ], + [ + "18:19", + "1.791502017081316" + ], + [ + "18:30", + "1.8519412914338227" + ], + [ + "18:40", + "1.8291994298199865" + ], + [ + "18:49", + "1.823260530908403" + ], + [ + "19:00", + "1.8865026719965499" + ], + [ + "19:10", + "1.901366011141666" + ], + [ + "19:19", + "1.938707110039195" + ], + [ + "19:30", + "1.97263533191086" + ], + [ + "19:40", + "1.8903750453346955" + ], + [ + "19:49", + "1.8792997080904943" + ], + [ + "20:00", + "1.9818921649480923" + ], + [ + "20:10", + "1.879964175983358" + ], + [ + "20:19", + "1.9345212266640923" + ], + [ + "20:30", + "1.9041762738192747" + ], + [ + "20:40", + "1.8202001845845146" + ], + [ + "20:49", + "1.8602091573942137" + ], + [ + "21:00", + "1.9046104065816931" + ], + [ + "21:10", + "1.9458201089413423" + ], + [ + "21:19", + "1.8657575666693111" + ], + [ + "21:30", + "1.9123086016829915" + ], + [ + "21:40", + "1.890408253433916" + ], + [ + "21:49", + "1.860057532127748" + ], + [ + "22:00", + "1.768405111248504" + ], + [ + "22:10", + "1.7228262662065983" + ], + [ + "22:19", + "1.7600741446233072" + ], + [ + "22:30", + "1.7351119281990313" + ], + [ + "22:40", + "1.627579637809477" + ], + [ + "22:49", + "1.5026127534180285" + ], + [ + "23:00", + "1.8668294834726493" + ], + [ + "23:10", + "1.921586028950252" + ], + [ + "23:19", + "1.859944045343084" + ], + [ + "23:30", + "1.9421573552577784" + ], + [ + "23:40", + "1.9996994539344555" + ], + [ + "23:49", + "1.8589087984770138" + ], + [ + "00:00", + "1.6627462508277173" + ], + [ + "00:10", + "1.4912009784351483" + ], + [ + "00:19", + "1.5628532968400852" + ], + [ + "00:30", + "0.9781458275090296" + ], + [ + "00:40", + "0.9812069092694643" + ], + [ + "00:49", + "1.0182492746801393" + ], + [ + "01:00", + "1.0080667767153983" + ], + [ + "01:10", + "1.1416978645073563" + ], + [ + "01:19", + "1.1811130366714149" + ], + [ + "01:30", + "1.0561868544820934" + ], + [ + "01:40", + "1.0768999151158571" + ], + [ + "01:49", + "0.9842344139042237" + ], + [ + "02:00", + "1.5838487306115105" + ], + [ + "02:10", + "1.1065686921529496" + ], + [ + "02:19", + "1.2924803345972495" + ], + [ + "02:30", + "0.9596692985545329" + ], + [ + "02:40", + "0.9956463783304861" + ], + [ + "02:49", + "1.17815968919917" + ], + [ + "03:00", + "2.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1269347057339092, + 1.183315922030218, + 1.020977082138179, + 1.1270128806263786, + 1.1263681399418604, + 1.118083187971494, + 0.9897878521213063, + 0.9699007539618653, + 1.0818312572990452, + 1.0856437631284126, + 1.0674782599651953, + 0.9811777087669468, + 0.9688417647786189, + 0.9251838620543567, + 0.9683619696413023, + 1.0209246384536417, + 0.9779619172742089, + 0.9256885449852714, + 1.061987673659908, + 1.036518467324717, + 1.0321799612950202, + 1.0951012329242487, + 1.0645670515151604, + 1.1199188585361046, + 1.296708106715972, + 1.2910624251454585, + 1.2848943927871044, + 1.442780474793665, + 1.4349704104992251, + 1.4401307976454372, + 1.5087555110510038, + 1.5891807749918847, + 1.5555066872545613, + 1.6482125215395373, + 1.6927817938564795, + 1.6642632986145796, + 1.7255967433933863, + 1.7615758260972627, + 1.6954755490847238, + 1.8345978388881383, + 1.6912542690332335, + 1.7828530739005293, + 1.7882051207781073, + 1.6964001929007024, + 1.7344908755574489, + 1.6457586680994094, + 1.5859841301566848, + 1.5376239137665637, + 1.406096761351721, + 1.3849373042627509, + 1.368628588171102, + 1.4867019672825126, + 1.438708240345497, + 1.5602385095048719, + 1.5669961325676882, + 1.42494421695802, + 1.3873811114046888, + 1.4680296664950658, + 1.511599784000429, + 1.4935745743916866, + 1.4060332951717749, + 1.5017317613473715, + 1.4703927740714626, + 1.4371220011099988, + 1.5068676690735445, + 1.4478117357821705, + 1.4196435727071088, + 1.4903427569533385, + 1.4698244938793883, + 1.5505846863487387, + 1.533519879787878, + 1.5667786069174539, + 1.5778047809114366, + 1.5555200473410558, + 1.564869119125043, + 1.698682981767884, + 1.6872971414285893, + 1.6493481770759535, + 1.7060311521985225, + 1.7137124903923262, + 1.6376606553417676, + 1.7895981600845021, + 1.7412522178219008, + 1.715352448907016, + 1.7857796975493536, + 1.7331170595870433, + 1.791502017081316, + 1.8519412914338227, + 1.8291994298199865, + 1.823260530908403, + 1.8865026719965499, + 1.901366011141666, + 1.938707110039195, + 1.97263533191086, + 1.8903750453346955, + 1.8792997080904943, + 1.9818921649480923, + 1.879964175983358, + 1.9345212266640923, + 1.9041762738192747, + 1.8202001845845146, + 1.8602091573942137, + 1.9046104065816931, + 1.9458201089413423, + 1.8657575666693111, + 1.9123086016829915, + 1.890408253433916, + 1.860057532127748, + 1.768405111248504, + 1.7228262662065983, + 1.7600741446233072, + 1.7351119281990313, + 1.627579637809477, + 1.5026127534180285, + 1.8668294834726493, + 1.921586028950252, + 1.859944045343084, + 1.9421573552577784, + 1.9996994539344555, + 1.8589087984770138, + 1.6627462508277173, + 1.4912009784351483, + 1.5628532968400852, + 0.9781458275090296, + 0.9812069092694643, + 1.0182492746801393, + 1.0080667767153983, + 1.1416978645073563, + 1.1811130366714149, + 1.0561868544820934, + 1.0768999151158571, + 0.9842344139042237, + 1.5838487306115105, + 1.1065686921529496, + 1.2924803345972495, + 0.9596692985545329, + 0.9956463783304861, + 1.17815968919917, + 2 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.977200135042227" + ], + [ + "03:04", + "1.364773405130411" + ], + [ + "03:10", + "1.0912708368423045" + ], + [ + "03:15", + "1.049172405223965" + ], + [ + "03:19", + "1.375691157616599" + ], + [ + "03:25", + "1.2844306086642086" + ], + [ + "03:30", + "1.3585194853475155" + ], + [ + "03:34", + "1.486577781928745" + ], + [ + "03:40", + "1.1605608256667599" + ], + [ + "03:45", + "1.1323986788610836" + ], + [ + "03:49", + "1.0695210353084896" + ], + [ + "03:55", + "1.060795878892077" + ], + [ + "04:00", + "1.2744198084743454" + ], + [ + "04:04", + "0.9165560174080761" + ], + [ + "04:10", + "1.1594593841948269" + ], + [ + "04:15", + "1.1143778741036605" + ], + [ + "04:19", + "0.9709613298367429" + ], + [ + "04:25", + "1.206211700245525" + ], + [ + "04:30", + "1.1249356218391338" + ], + [ + "04:34", + "1.200141859034063" + ], + [ + "04:40", + "1.1029689246446606" + ], + [ + "04:45", + "0.8636177457090134" + ], + [ + "04:49", + "1.12832326385938" + ], + [ + "04:55", + "1.079882904441947" + ], + [ + "05:00", + "0.9852442551038312" + ], + [ + "05:04", + "0.9504896405816661" + ], + [ + "05:10", + "0.9306101018089854" + ], + [ + "05:15", + "0.9168301321486039" + ], + [ + "05:19", + "1.0210834384604475" + ], + [ + "05:25", + "0.989566172024492" + ], + [ + "05:30", + "1.0362451210734789" + ], + [ + "05:34", + "1.0600335970628416" + ], + [ + "05:40", + "1.088831064627536" + ], + [ + "05:45", + "1.0875760453193806" + ], + [ + "05:49", + "1.0437419557228278" + ], + [ + "05:55", + "0.9389554226772169" + ], + [ + "06:00", + "0.903216140603335" + ], + [ + "06:04", + "0.9269732932222777" + ], + [ + "06:10", + "0.9310795125146163" + ], + [ + "06:15", + "0.9665071634892614" + ], + [ + "06:19", + "0.9360614312967209" + ], + [ + "06:25", + "0.9697518292748493" + ], + [ + "06:30", + "0.93233435358404" + ], + [ + "06:34", + "1.0311617739627217" + ], + [ + "06:40", + "1.0167758490841925" + ], + [ + "06:45", + "0.941038251080044" + ], + [ + "06:49", + "0.8990064497307929" + ], + [ + "06:55", + "0.8848352198264895" + ], + [ + "07:00", + "1.0468586839805423" + ], + [ + "07:04", + "1.0233676356611094" + ], + [ + "07:10", + "1.0563742058386794" + ], + [ + "07:15", + "0.9767857821755778" + ], + [ + "07:19", + "1.0039688606365544" + ], + [ + "07:25", + "0.9687346585454616" + ], + [ + "07:30", + "1.043078511832571" + ], + [ + "07:34", + "1.0758549028529822" + ], + [ + "07:40", + "1.0530235911327885" + ], + [ + "07:45", + "1.0481922366703056" + ], + [ + "07:49", + "1.0476388300625135" + ], + [ + "07:55", + "1.0761126422464147" + ], + [ + "08:00", + "1.2430897958404918" + ], + [ + "08:04", + "1.2513612347754839" + ], + [ + "08:10", + "1.3247810249338547" + ], + [ + "08:15", + "1.2931723489089515" + ], + [ + "08:19", + "1.2680730734796983" + ], + [ + "08:25", + "1.2121013403549379" + ], + [ + "08:30", + "1.379508140953201" + ], + [ + "08:34", + "1.4539339032641874" + ], + [ + "08:40", + "1.3924211512644245" + ], + [ + "08:45", + "1.4163630000860488" + ], + [ + "08:49", + "1.4773067801106203" + ], + [ + "08:55", + "1.3946935825320117" + ], + [ + "09:00", + "1.4483335230478365" + ], + [ + "09:04", + "1.4999850742579457" + ], + [ + "09:10", + "1.5320365900934687" + ], + [ + "09:15", + "1.6198217192409863" + ], + [ + "09:19", + "1.492742982927618" + ], + [ + "09:25", + "1.4656926024317394" + ], + [ + "09:30", + "1.5675883152523604" + ], + [ + "09:34", + "1.6565610713233552" + ], + [ + "09:40", + "1.6198738956144259" + ], + [ + "09:45", + "1.661759131463312" + ], + [ + "09:49", + "1.6626081624327278" + ], + [ + "09:55", + "1.6658961192175479" + ], + [ + "10:00", + "1.7265321015511452" + ], + [ + "10:04", + "1.6969901868998656" + ], + [ + "10:10", + "1.751946178268612" + ], + [ + "10:15", + "1.6876815611119071" + ], + [ + "10:19", + "1.737111545213489" + ], + [ + "10:25", + "1.6009738138327476" + ], + [ + "10:30", + "1.7786662945754392" + ], + [ + "10:34", + "1.7332377202550664" + ], + [ + "10:40", + "1.7592493981774664" + ], + [ + "10:45", + "1.62296967417944" + ], + [ + "10:49", + "1.763618006776357" + ], + [ + "10:55", + "1.814321798551875" + ], + [ + "11:00", + "1.7708953627012147" + ], + [ + "11:04", + "1.7459762652192783" + ], + [ + "11:10", + "1.6774005124549758" + ], + [ + "11:15", + "1.708019330656493" + ], + [ + "11:19", + "1.7235575704963177" + ], + [ + "11:25", + "1.7006444877420588" + ], + [ + "11:30", + "1.7291062413908302" + ], + [ + "11:34", + "1.6111694437506212" + ], + [ + "11:40", + "1.5756048316404987" + ], + [ + "11:45", + "1.5213689347742678" + ], + [ + "11:49", + "1.6038066469759709" + ], + [ + "11:55", + "1.454022647743493" + ], + [ + "12:00", + "1.428643333110638" + ], + [ + "12:04", + "1.424767528942905" + ], + [ + "12:10", + "1.4436593065511933" + ], + [ + "12:15", + "1.3280886219934673" + ], + [ + "12:19", + "1.3785987059244202" + ], + [ + "12:25", + "1.3462231134599554" + ], + [ + "12:30", + "1.438849861655532" + ], + [ + "12:34", + "1.4471601612618556" + ], + [ + "12:40", + "1.4843810360659633" + ], + [ + "12:45", + "1.354888129304856" + ], + [ + "12:49", + "1.575469453568649" + ], + [ + "12:55", + "1.5787245599286486" + ], + [ + "13:00", + "1.4746305936031634" + ], + [ + "13:04", + "1.5884600869126946" + ], + [ + "13:10", + "1.449593923606905" + ], + [ + "13:15", + "1.409710261247643" + ], + [ + "13:19", + "1.3846037797243744" + ], + [ + "13:25", + "1.3825346663262836" + ], + [ + "13:30", + "1.454638145824504" + ], + [ + "13:34", + "1.4981373792901" + ], + [ + "13:40", + "1.4979503905453628" + ], + [ + "13:45", + "1.4449025087382839" + ], + [ + "13:49", + "1.4854910912776889" + ], + [ + "13:55", + "1.4309453843265818" + ], + [ + "14:00", + "1.4011480708491457" + ], + [ + "14:04", + "1.3295793745937436" + ], + [ + "14:10", + "1.5346007890563826" + ], + [ + "14:15", + "1.4254627044006143" + ], + [ + "14:19", + "1.5103400930124236" + ], + [ + "14:25", + "1.392766554540842" + ], + [ + "14:30", + "1.3826401485557724" + ], + [ + "14:34", + "1.366089364930569" + ], + [ + "14:40", + "1.575002421352546" + ], + [ + "14:45", + "1.4749960629957168" + ], + [ + "14:49", + "1.4695312565467513" + ], + [ + "14:55", + "1.3844401410103027" + ], + [ + "15:00", + "1.4027142159098416" + ], + [ + "15:04", + "1.373350847204267" + ], + [ + "15:10", + "1.4994337713200088" + ], + [ + "15:15", + "1.4159815138220981" + ], + [ + "15:19", + "1.4047582959540592" + ], + [ + "15:25", + "1.4545819782662208" + ], + [ + "15:30", + "1.5663541523841413" + ], + [ + "15:34", + "1.4759755148742917" + ], + [ + "15:40", + "1.4830216137628427" + ], + [ + "15:45", + "1.5229488706218015" + ], + [ + "15:49", + "1.483616757888696" + ], + [ + "15:55", + "1.5385436445842462" + ], + [ + "16:00", + "1.5610180579636015" + ], + [ + "16:04", + "1.5320094154892874" + ], + [ + "16:10", + "1.5718631228830975" + ], + [ + "16:15", + "1.5374414272734236" + ], + [ + "16:19", + "1.5465363609912217" + ], + [ + "16:25", + "1.4781826244383987" + ], + [ + "16:30", + "1.6440941716151038" + ], + [ + "16:34", + "1.7146724116139889" + ], + [ + "16:40", + "1.6222622598818932" + ], + [ + "16:45", + "1.716219845444694" + ], + [ + "16:49", + "1.5373386972585712" + ], + [ + "16:55", + "1.6572283091966356" + ], + [ + "17:00", + "1.6627411808435097" + ], + [ + "17:04", + "1.6200122743017666" + ], + [ + "17:10", + "1.6644167273881596" + ], + [ + "17:15", + "1.6629276858842017" + ], + [ + "17:19", + "1.6476494071707852" + ], + [ + "17:25", + "1.6133256470167647" + ], + [ + "17:30", + "1.7983734348414009" + ], + [ + "17:34", + "1.7456387975986951" + ], + [ + "17:40", + "1.6459577723217542" + ], + [ + "17:45", + "1.7385424970113421" + ], + [ + "17:49", + "1.7149662945563442" + ], + [ + "17:55", + "1.6964401913497442" + ], + [ + "18:00", + "1.7402782811796613" + ], + [ + "18:04", + "1.7233931840912176" + ], + [ + "18:10", + "1.744911169832978" + ], + [ + "18:15", + "1.7064568086239393" + ], + [ + "18:19", + "1.7756170022192588" + ], + [ + "18:25", + "1.741026895932323" + ], + [ + "18:30", + "1.8065246842151312" + ], + [ + "18:34", + "1.8157252912280448" + ], + [ + "18:40", + "1.8655514561553979" + ], + [ + "18:45", + "1.718122418031144" + ], + [ + "18:49", + "1.818471179909937" + ], + [ + "18:55", + "1.790613621454832" + ], + [ + "19:00", + "1.8382599126201757" + ], + [ + "19:04", + "1.8996481189135528" + ], + [ + "19:10", + "1.8328029432977666" + ], + [ + "19:15", + "1.877738636240845" + ], + [ + "19:19", + "1.9283789615336973" + ], + [ + "19:25", + "1.8796606637567488" + ], + [ + "19:30", + "1.9069702410012375" + ], + [ + "19:34", + "2.048939696209111" + ], + [ + "19:40", + "1.9161021620136311" + ], + [ + "19:45", + "1.8431128681529119" + ], + [ + "19:49", + "1.8338507686387338" + ], + [ + "19:55", + "1.8254170315944371" + ], + [ + "20:00", + "1.917180399917886" + ], + [ + "20:04", + "1.8812860828273867" + ], + [ + "20:10", + "1.8321149593101733" + ], + [ + "20:15", + "1.9213005127703544" + ], + [ + "20:19", + "1.8851050263355218" + ], + [ + "20:25", + "1.8506521007301378" + ], + [ + "20:30", + "1.9140154622604517" + ], + [ + "20:34", + "1.8879147244024592" + ], + [ + "20:40", + "1.8259926992489128" + ], + [ + "20:45", + "1.797951432922386" + ], + [ + "20:49", + "1.8057306795814279" + ], + [ + "20:55", + "1.8226185886984325" + ], + [ + "21:00", + "1.9362126373138995" + ], + [ + "21:04", + "1.9075604885161954" + ], + [ + "21:10", + "1.928589911830941" + ], + [ + "21:15", + "1.8769415017327973" + ], + [ + "21:19", + "1.763130206848513" + ], + [ + "21:25", + "1.9651379673261196" + ], + [ + "21:30", + "1.968232114585967" + ], + [ + "21:34", + "1.8965956327630695" + ], + [ + "21:40", + "1.7899872220750368" + ], + [ + "21:45", + "1.8787174101198658" + ], + [ + "21:49", + "1.8646039588559449" + ], + [ + "21:55", + "1.6866461839619529" + ], + [ + "22:00", + "1.893014895498119" + ], + [ + "22:04", + "1.8787582831619842" + ], + [ + "22:10", + "1.7672615744647553" + ], + [ + "22:15", + "1.6198038532509536" + ], + [ + "22:19", + "1.7130926677672664" + ], + [ + "22:25", + "1.7874419577981548" + ], + [ + "22:30", + "1.607669314457688" + ], + [ + "22:34", + "1.7080646458894069" + ], + [ + "22:40", + "1.6565549782192999" + ], + [ + "22:45", + "1.6207597280602397" + ], + [ + "22:49", + "1.4317006975861637" + ], + [ + "22:55", + "1.6412697919088266" + ], + [ + "23:00", + "1.8176446749241824" + ], + [ + "23:04", + "1.8650623961713209" + ], + [ + "23:10", + "1.9896638071440296" + ], + [ + "23:15", + "1.822978826318127" + ], + [ + "23:19", + "1.883984139781599" + ], + [ + "23:25", + "1.8918714980080387" + ], + [ + "23:30", + "1.9145687095925892" + ], + [ + "23:34", + "1.9132046249260186" + ], + [ + "23:40", + "1.829253708166391" + ], + [ + "23:45", + "2.1077024634637147" + ], + [ + "23:49", + "1.9131400150567415" + ], + [ + "23:55", + "1.8440964581972574" + ], + [ + "00:00", + "1.8900039225835445" + ], + [ + "00:04", + "1.4991074250192218" + ], + [ + "00:10", + "1.6213153916115224" + ], + [ + "00:15", + "1.1961303174786577" + ], + [ + "00:19", + "1.632257677430147" + ], + [ + "00:25", + "1.5019940943712868" + ], + [ + "00:30", + "1.1682631545133741" + ], + [ + "00:34", + "1.0632349575273707" + ], + [ + "00:40", + "0.9956411810917739" + ], + [ + "00:45", + "0.965171990520745" + ], + [ + "00:49", + "1.0729696152228885" + ], + [ + "00:55", + "0.9365347645952949" + ], + [ + "01:00", + "0.9771164962613471" + ], + [ + "01:04", + "1.052162348594074" + ], + [ + "01:10", + "1.2058315715844963" + ], + [ + "01:15", + "1.3167066793326487" + ], + [ + "01:19", + "0.8657137953618194" + ], + [ + "01:25", + "1.0026825899042062" + ], + [ + "01:30", + "1.2185098459648909" + ], + [ + "01:34", + "1.0903952640202321" + ], + [ + "01:40", + "1.1763122409103788" + ], + [ + "01:45", + "0.8886249263871334" + ], + [ + "01:49", + "0.8494370210246283" + ], + [ + "01:55", + "1.0798700836370165" + ], + [ + "02:00", + "1.1226960286254806" + ], + [ + "02:04", + "1.807934060078492" + ], + [ + "02:10", + "1.3823269118301516" + ], + [ + "02:15", + "0.7815477287527169" + ], + [ + "02:19", + "0.9408794361546182" + ], + [ + "02:25", + "1.5026343614078526" + ], + [ + "02:30", + "0.9757472531359527" + ], + [ + "02:34", + "0.9627906006607075" + ], + [ + "02:40", + "1.3630295035574893" + ], + [ + "02:45", + "0.958690065095109" + ], + [ + "02:49", + "0.9627020706066425" + ], + [ + "02:55", + "1.023027200664911" + ], + [ + "03:00", + "1.7438848590902027" + ], + [ + "03:04", + "1.4279716626367573" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25, + 23.333333333333332, + 23.416666666666668, + 23.5, + 23.583333333333332, + 23.666666666666668, + 23.75, + 23.833333333333332, + 23.916666666666668, + 24, + 24.083333333333332 + ], + "y": [ + 0.977200135042227, + 1.364773405130411, + 1.0912708368423045, + 1.049172405223965, + 1.375691157616599, + 1.2844306086642086, + 1.3585194853475155, + 1.486577781928745, + 1.1605608256667599, + 1.1323986788610836, + 1.0695210353084896, + 1.060795878892077, + 1.2744198084743454, + 0.9165560174080761, + 1.1594593841948269, + 1.1143778741036605, + 0.9709613298367429, + 1.206211700245525, + 1.1249356218391338, + 1.200141859034063, + 1.1029689246446606, + 0.8636177457090134, + 1.12832326385938, + 1.079882904441947, + 0.9852442551038312, + 0.9504896405816661, + 0.9306101018089854, + 0.9168301321486039, + 1.0210834384604475, + 0.989566172024492, + 1.0362451210734789, + 1.0600335970628416, + 1.088831064627536, + 1.0875760453193806, + 1.0437419557228278, + 0.9389554226772169, + 0.903216140603335, + 0.9269732932222777, + 0.9310795125146163, + 0.9665071634892614, + 0.9360614312967209, + 0.9697518292748493, + 0.93233435358404, + 1.0311617739627217, + 1.0167758490841925, + 0.941038251080044, + 0.8990064497307929, + 0.8848352198264895, + 1.0468586839805423, + 1.0233676356611094, + 1.0563742058386794, + 0.9767857821755778, + 1.0039688606365544, + 0.9687346585454616, + 1.043078511832571, + 1.0758549028529822, + 1.0530235911327885, + 1.0481922366703056, + 1.0476388300625135, + 1.0761126422464147, + 1.2430897958404918, + 1.2513612347754839, + 1.3247810249338547, + 1.2931723489089515, + 1.2680730734796983, + 1.2121013403549379, + 1.379508140953201, + 1.4539339032641874, + 1.3924211512644245, + 1.4163630000860488, + 1.4773067801106203, + 1.3946935825320117, + 1.4483335230478365, + 1.4999850742579457, + 1.5320365900934687, + 1.6198217192409863, + 1.492742982927618, + 1.4656926024317394, + 1.5675883152523604, + 1.6565610713233552, + 1.6198738956144259, + 1.661759131463312, + 1.6626081624327278, + 1.6658961192175479, + 1.7265321015511452, + 1.6969901868998656, + 1.751946178268612, + 1.6876815611119071, + 1.737111545213489, + 1.6009738138327476, + 1.7786662945754392, + 1.7332377202550664, + 1.7592493981774664, + 1.62296967417944, + 1.763618006776357, + 1.814321798551875, + 1.7708953627012147, + 1.7459762652192783, + 1.6774005124549758, + 1.708019330656493, + 1.7235575704963177, + 1.7006444877420588, + 1.7291062413908302, + 1.6111694437506212, + 1.5756048316404987, + 1.5213689347742678, + 1.6038066469759709, + 1.454022647743493, + 1.428643333110638, + 1.424767528942905, + 1.4436593065511933, + 1.3280886219934673, + 1.3785987059244202, + 1.3462231134599554, + 1.438849861655532, + 1.4471601612618556, + 1.4843810360659633, + 1.354888129304856, + 1.575469453568649, + 1.5787245599286486, + 1.4746305936031634, + 1.5884600869126946, + 1.449593923606905, + 1.409710261247643, + 1.3846037797243744, + 1.3825346663262836, + 1.454638145824504, + 1.4981373792901, + 1.4979503905453628, + 1.4449025087382839, + 1.4854910912776889, + 1.4309453843265818, + 1.4011480708491457, + 1.3295793745937436, + 1.5346007890563826, + 1.4254627044006143, + 1.5103400930124236, + 1.392766554540842, + 1.3826401485557724, + 1.366089364930569, + 1.575002421352546, + 1.4749960629957168, + 1.4695312565467513, + 1.3844401410103027, + 1.4027142159098416, + 1.373350847204267, + 1.4994337713200088, + 1.4159815138220981, + 1.4047582959540592, + 1.4545819782662208, + 1.5663541523841413, + 1.4759755148742917, + 1.4830216137628427, + 1.5229488706218015, + 1.483616757888696, + 1.5385436445842462, + 1.5610180579636015, + 1.5320094154892874, + 1.5718631228830975, + 1.5374414272734236, + 1.5465363609912217, + 1.4781826244383987, + 1.6440941716151038, + 1.7146724116139889, + 1.6222622598818932, + 1.716219845444694, + 1.5373386972585712, + 1.6572283091966356, + 1.6627411808435097, + 1.6200122743017666, + 1.6644167273881596, + 1.6629276858842017, + 1.6476494071707852, + 1.6133256470167647, + 1.7983734348414009, + 1.7456387975986951, + 1.6459577723217542, + 1.7385424970113421, + 1.7149662945563442, + 1.6964401913497442, + 1.7402782811796613, + 1.7233931840912176, + 1.744911169832978, + 1.7064568086239393, + 1.7756170022192588, + 1.741026895932323, + 1.8065246842151312, + 1.8157252912280448, + 1.8655514561553979, + 1.718122418031144, + 1.818471179909937, + 1.790613621454832, + 1.8382599126201757, + 1.8996481189135528, + 1.8328029432977666, + 1.877738636240845, + 1.9283789615336973, + 1.8796606637567488, + 1.9069702410012375, + 2.048939696209111, + 1.9161021620136311, + 1.8431128681529119, + 1.8338507686387338, + 1.8254170315944371, + 1.917180399917886, + 1.8812860828273867, + 1.8321149593101733, + 1.9213005127703544, + 1.8851050263355218, + 1.8506521007301378, + 1.9140154622604517, + 1.8879147244024592, + 1.8259926992489128, + 1.797951432922386, + 1.8057306795814279, + 1.8226185886984325, + 1.9362126373138995, + 1.9075604885161954, + 1.928589911830941, + 1.8769415017327973, + 1.763130206848513, + 1.9651379673261196, + 1.968232114585967, + 1.8965956327630695, + 1.7899872220750368, + 1.8787174101198658, + 1.8646039588559449, + 1.6866461839619529, + 1.893014895498119, + 1.8787582831619842, + 1.7672615744647553, + 1.6198038532509536, + 1.7130926677672664, + 1.7874419577981548, + 1.607669314457688, + 1.7080646458894069, + 1.6565549782192999, + 1.6207597280602397, + 1.4317006975861637, + 1.6412697919088266, + 1.8176446749241824, + 1.8650623961713209, + 1.9896638071440296, + 1.822978826318127, + 1.883984139781599, + 1.8918714980080387, + 1.9145687095925892, + 1.9132046249260186, + 1.829253708166391, + 2.1077024634637147, + 1.9131400150567415, + 1.8440964581972574, + 1.8900039225835445, + 1.4991074250192218, + 1.6213153916115224, + 1.1961303174786577, + 1.632257677430147, + 1.5019940943712868, + 1.1682631545133741, + 1.0632349575273707, + 0.9956411810917739, + 0.965171990520745, + 1.0729696152228885, + 0.9365347645952949, + 0.9771164962613471, + 1.052162348594074, + 1.2058315715844963, + 1.3167066793326487, + 0.8657137953618194, + 1.0026825899042062, + 1.2185098459648909, + 1.0903952640202321, + 1.1763122409103788, + 0.8886249263871334, + 0.8494370210246283, + 1.0798700836370165, + 1.1226960286254806, + 1.807934060078492, + 1.3823269118301516, + 0.7815477287527169, + 0.9408794361546182, + 1.5026343614078526, + 0.9757472531359527, + 0.9627906006607075, + 1.3630295035574893, + 0.958690065095109, + 0.9627020706066425, + 1.023027200664911, + 1.7438848590902027, + 1.4279716626367573 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.2606697963467377" + ], + [ + "03:15", + "1.2751965066779807" + ], + [ + "03:30", + "1.3200261693665603" + ], + [ + "03:45", + "1.073259255589472" + ], + [ + "04:00", + "1.2219213028744484" + ], + [ + "04:15", + "1.0572510279431864" + ], + [ + "04:30", + "1.2033964590849133" + ], + [ + "04:45", + "1.0805863929785555" + ], + [ + "05:00", + "0.9725992481119361" + ], + [ + "05:15", + "1.0534175383662052" + ], + [ + "05:30", + "1.1171766490917585" + ], + [ + "05:45", + "1.0035478662794428" + ], + [ + "06:00", + "0.9793798491267811" + ], + [ + "06:15", + "0.9604450171008416" + ], + [ + "06:30", + "1.0462605875762825" + ], + [ + "06:45", + "0.9501157143866441" + ], + [ + "07:00", + "1.0774149435742346" + ], + [ + "07:15", + "1.0479985167042207" + ], + [ + "07:30", + "1.1104707581431208" + ], + [ + "07:45", + "1.1326165121428857" + ], + [ + "08:00", + "1.3054126160364596" + ], + [ + "08:15", + "1.286414951204812" + ], + [ + "08:30", + "1.469095116265166" + ], + [ + "08:45", + "1.462841518473796" + ], + [ + "09:00", + "1.5471912298369273" + ], + [ + "09:15", + "1.575084212159018" + ], + [ + "09:30", + "1.685221343473361" + ], + [ + "09:45", + "1.7127784568809061" + ], + [ + "10:00", + "1.7457232877750175" + ], + [ + "10:15", + "1.725050203280497" + ], + [ + "10:30", + "1.8048726006577445" + ], + [ + "10:45", + "1.7697349670018114" + ], + [ + "11:00", + "1.7197782310851564" + ], + [ + "11:15", + "1.757628792857521" + ], + [ + "11:30", + "1.6010615902288943" + ], + [ + "11:45", + "1.5822478554564054" + ], + [ + "12:00", + "1.3982752927903237" + ], + [ + "12:15", + "1.3707122381466927" + ], + [ + "12:30", + "1.5103197031464342" + ], + [ + "12:45", + "1.579924485742861" + ], + [ + "13:00", + "1.4793794819078228" + ], + [ + "13:15", + "1.390293128199957" + ], + [ + "13:30", + "1.543038873982552" + ], + [ + "13:45", + "1.4701223334387337" + ], + [ + "14:00", + "1.4910302545623764" + ], + [ + "14:15", + "1.4393209812284657" + ], + [ + "14:30", + "1.5088250242037813" + ], + [ + "14:45", + "1.4375064669943598" + ], + [ + "15:00", + "1.4741498619547166" + ], + [ + "15:15", + "1.4924448240703292" + ], + [ + "15:30", + "1.5464650902692323" + ], + [ + "15:45", + "1.5561228027246525" + ], + [ + "16:00", + "1.5953746150805805" + ], + [ + "16:15", + "1.5899123589618174" + ], + [ + "16:30", + "1.680734932538564" + ], + [ + "16:45", + "1.6645167245176358" + ], + [ + "17:00", + "1.7259617553774587" + ], + [ + "17:15", + "1.6772084393142563" + ], + [ + "17:30", + "1.7747319341391088" + ], + [ + "17:45", + "1.7582376307015588" + ], + [ + "18:00", + "1.752512830570924" + ], + [ + "18:15", + "1.795258657140824" + ], + [ + "18:30", + "1.8735576200130095" + ], + [ + "18:45", + "1.826609170139562" + ], + [ + "19:00", + "1.908936173408292" + ], + [ + "19:15", + "1.9365789597398846" + ], + [ + "19:30", + "1.9538059188078196" + ], + [ + "19:45", + "1.9032627675360876" + ], + [ + "20:00", + "1.9320954839505782" + ], + [ + "20:15", + "1.927960887160643" + ], + [ + "20:30", + "1.886767095536217" + ], + [ + "20:45", + "1.8914448674969617" + ], + [ + "21:00", + "1.9643413651062864" + ], + [ + "21:15", + "1.865361321898436" + ], + [ + "21:30", + "1.8927675503797932" + ], + [ + "21:45", + "1.885567970527686" + ], + [ + "22:00", + "1.7215493494891798" + ], + [ + "22:15", + "1.7579133444927777" + ], + [ + "22:30", + "1.6379839606643793" + ], + [ + "22:45", + "1.6190794196034282" + ], + [ + "23:00", + "1.9924491864228344" + ], + [ + "23:15", + "1.8386860231711695" + ], + [ + "23:30", + "1.97292348154526" + ], + [ + "23:45", + "1.8696507127518425" + ], + [ + "00:00", + "1.5201577007331757" + ], + [ + "00:15", + "1.5247105283679734" + ], + [ + "00:30", + "0.9960970161675283" + ], + [ + "00:45", + "1.0093902055570039" + ], + [ + "01:00", + "1.1877617987932418" + ], + [ + "01:15", + "1.1172542467258024" + ], + [ + "01:30", + "1.036330975779366" + ], + [ + "01:45", + "1.217924197719783" + ], + [ + "02:00", + "1.2854840150309346" + ], + [ + "02:15", + "1.1387742213135323" + ], + [ + "02:30", + "1.113621534319913" + ], + [ + "02:45", + "1.1700304152482628" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25, + 23.5, + 23.75 + ], + "y": [ + 1.2606697963467377, + 1.2751965066779807, + 1.3200261693665603, + 1.073259255589472, + 1.2219213028744484, + 1.0572510279431864, + 1.2033964590849133, + 1.0805863929785555, + 0.9725992481119361, + 1.0534175383662052, + 1.1171766490917585, + 1.0035478662794428, + 0.9793798491267811, + 0.9604450171008416, + 1.0462605875762825, + 0.9501157143866441, + 1.0774149435742346, + 1.0479985167042207, + 1.1104707581431208, + 1.1326165121428857, + 1.3054126160364596, + 1.286414951204812, + 1.469095116265166, + 1.462841518473796, + 1.5471912298369273, + 1.575084212159018, + 1.685221343473361, + 1.7127784568809061, + 1.7457232877750175, + 1.725050203280497, + 1.8048726006577445, + 1.7697349670018114, + 1.7197782310851564, + 1.757628792857521, + 1.6010615902288943, + 1.5822478554564054, + 1.3982752927903237, + 1.3707122381466927, + 1.5103197031464342, + 1.579924485742861, + 1.4793794819078228, + 1.390293128199957, + 1.543038873982552, + 1.4701223334387337, + 1.4910302545623764, + 1.4393209812284657, + 1.5088250242037813, + 1.4375064669943598, + 1.4741498619547166, + 1.4924448240703292, + 1.5464650902692323, + 1.5561228027246525, + 1.5953746150805805, + 1.5899123589618174, + 1.680734932538564, + 1.6645167245176358, + 1.7259617553774587, + 1.6772084393142563, + 1.7747319341391088, + 1.7582376307015588, + 1.752512830570924, + 1.795258657140824, + 1.8735576200130095, + 1.826609170139562, + 1.908936173408292, + 1.9365789597398846, + 1.9538059188078196, + 1.9032627675360876, + 1.9320954839505782, + 1.927960887160643, + 1.886767095536217, + 1.8914448674969617, + 1.9643413651062864, + 1.865361321898436, + 1.8927675503797932, + 1.885567970527686, + 1.7215493494891798, + 1.7579133444927777, + 1.6379839606643793, + 1.6190794196034282, + 1.9924491864228344, + 1.8386860231711695, + 1.97292348154526, + 1.8696507127518425, + 1.5201577007331757, + 1.5247105283679734, + 0.9960970161675283, + 1.0093902055570039, + 1.1877617987932418, + 1.1172542467258024, + 1.036330975779366, + 1.217924197719783, + 1.2854840150309346, + 1.1387742213135323, + 1.113621534319913, + 1.1700304152482628 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average occupancy by time bin (OD_dist-weighted) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Average occupancy" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1269347057339092" + ], + [ + "04:10", + "1.183315922030218" + ], + [ + "04:19", + "1.020977082138179" + ], + [ + "04:30", + "1.1270128806263786" + ], + [ + "04:40", + "1.1263681399418604" + ], + [ + "04:49", + "1.118083187971494" + ], + [ + "05:00", + "0.9897878521213063" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0818312572990452" + ], + [ + "05:30", + "1.0856437631284126" + ], + [ + "05:40", + "1.0674782599651953" + ], + [ + "05:49", + "0.9811777087669468" + ], + [ + "06:00", + "0.9688417647786189" + ], + [ + "06:10", + "0.9251838620543567" + ], + [ + "06:19", + "0.9683619696413023" + ], + [ + "06:30", + "1.0209246384536417" + ], + [ + "06:40", + "0.9779619172742089" + ], + [ + "06:49", + "0.9256885449852714" + ], + [ + "07:00", + "1.061987673659908" + ], + [ + "07:10", + "1.036518467324717" + ], + [ + "07:19", + "1.0321799612950202" + ], + [ + "07:30", + "1.0951012329242487" + ], + [ + "07:40", + "1.0645670515151604" + ], + [ + "07:49", + "1.1199188585361046" + ], + [ + "08:00", + "1.296708106715972" + ], + [ + "08:10", + "1.2910624251454585" + ], + [ + "08:19", + "1.2848943927871044" + ], + [ + "08:30", + "1.442780474793665" + ], + [ + "08:40", + "1.4349704104992251" + ], + [ + "08:49", + "1.4401307976454372" + ], + [ + "09:00", + "1.5087555110510038" + ], + [ + "09:10", + "1.5891807749918847" + ], + [ + "09:19", + "1.5555066872545613" + ], + [ + "09:30", + "1.6482125215395373" + ], + [ + "09:40", + "1.6927817938564795" + ], + [ + "09:49", + "1.6642632986145796" + ], + [ + "10:00", + "1.7255967433933863" + ], + [ + "10:10", + "1.7615758260972627" + ], + [ + "10:19", + "1.6954755490847238" + ], + [ + "10:30", + "1.8345978388881383" + ], + [ + "10:40", + "1.6912542690332335" + ], + [ + "10:49", + "1.7828530739005293" + ], + [ + "11:00", + "1.7882051207781073" + ], + [ + "11:10", + "1.6964001929007024" + ], + [ + "11:19", + "1.7344908755574489" + ], + [ + "11:30", + "1.6457586680994094" + ], + [ + "11:40", + "1.5859841301566848" + ], + [ + "11:49", + "1.5376239137665637" + ], + [ + "12:00", + "1.406096761351721" + ], + [ + "12:10", + "1.3849373042627509" + ], + [ + "12:19", + "1.368628588171102" + ], + [ + "12:30", + "1.4867019672825126" + ], + [ + "12:40", + "1.438708240345497" + ], + [ + "12:49", + "1.5602385095048719" + ], + [ + "13:00", + "1.5669961325676882" + ], + [ + "13:10", + "1.42494421695802" + ], + [ + "13:19", + "1.3873811114046888" + ], + [ + "13:30", + "1.4680296664950658" + ], + [ + "13:40", + "1.511599784000429" + ], + [ + "13:49", + "1.4935745743916866" + ], + [ + "14:00", + "1.4060332951717749" + ], + [ + "14:10", + "1.5017317613473715" + ], + [ + "14:19", + "1.4703927740714626" + ], + [ + "14:30", + "1.4371220011099988" + ], + [ + "14:40", + "1.5068676690735445" + ], + [ + "14:49", + "1.4478117357821705" + ], + [ + "15:00", + "1.4196435727071088" + ], + [ + "15:10", + "1.4903427569533385" + ], + [ + "15:19", + "1.4698244938793883" + ], + [ + "15:30", + "1.5505846863487387" + ], + [ + "15:40", + "1.533519879787878" + ], + [ + "15:49", + "1.5667786069174539" + ], + [ + "16:00", + "1.5778047809114366" + ], + [ + "16:10", + "1.5555200473410558" + ], + [ + "16:19", + "1.564869119125043" + ], + [ + "16:30", + "1.698682981767884" + ], + [ + "16:40", + "1.6872971414285893" + ], + [ + "16:49", + "1.6493481770759535" + ], + [ + "17:00", + "1.7060311521985225" + ], + [ + "17:10", + "1.7137124903923262" + ], + [ + "17:19", + "1.6376606553417676" + ], + [ + "17:30", + "1.7895981600845021" + ], + [ + "17:40", + "1.7412522178219008" + ], + [ + "17:49", + "1.715352448907016" + ], + [ + "18:00", + "1.7857796975493536" + ], + [ + "18:10", + "1.7331170595870433" + ], + [ + "18:19", + "1.791502017081316" + ], + [ + "18:30", + "1.8519412914338227" + ], + [ + "18:40", + "1.8291994298199865" + ], + [ + "18:49", + "1.823260530908403" + ], + [ + "19:00", + "1.8865026719965499" + ], + [ + "19:10", + "1.901366011141666" + ], + [ + "19:19", + "1.938707110039195" + ], + [ + "19:30", + "1.97263533191086" + ], + [ + "19:40", + "1.8903750453346955" + ], + [ + "19:49", + "1.8792997080904943" + ], + [ + "20:00", + "1.9818921649480923" + ], + [ + "20:10", + "1.879964175983358" + ], + [ + "20:19", + "1.9345212266640923" + ], + [ + "20:30", + "1.9041762738192747" + ], + [ + "20:40", + "1.8202001845845146" + ], + [ + "20:49", + "1.8602091573942137" + ], + [ + "21:00", + "1.9046104065816931" + ], + [ + "21:10", + "1.9458201089413423" + ], + [ + "21:19", + "1.8657575666693111" + ], + [ + "21:30", + "1.9123086016829915" + ], + [ + "21:40", + "1.890408253433916" + ], + [ + "21:49", + "1.860057532127748" + ], + [ + "22:00", + "1.768405111248504" + ], + [ + "22:10", + "1.7228262662065983" + ], + [ + "22:19", + "1.7600741446233072" + ], + [ + "22:30", + "1.7351119281990313" + ], + [ + "22:40", + "1.627579637809477" + ], + [ + "22:49", + "1.5026127534180285" + ], + [ + "23:00", + "1.8668294834726493" + ], + [ + "23:10", + "1.921586028950252" + ], + [ + "23:19", + "1.859944045343084" + ], + [ + "23:30", + "1.9421573552577784" + ], + [ + "23:40", + "1.9996994539344555" + ], + [ + "23:49", + "1.8589087984770138" + ], + [ + "00:00", + "1.6627462508277173" + ], + [ + "00:10", + "1.4912009784351483" + ], + [ + "00:19", + "1.5628532968400852" + ], + [ + "00:30", + "0.9781458275090296" + ], + [ + "00:40", + "0.9812069092694643" + ], + [ + "00:49", + "1.0182492746801393" + ], + [ + "01:00", + "1.0080667767153983" + ], + [ + "01:10", + "1.1416978645073563" + ], + [ + "01:19", + "1.1811130366714149" + ], + [ + "01:30", + "1.0561868544820934" + ], + [ + "01:40", + "1.0768999151158571" + ], + [ + "01:49", + "0.9842344139042237" + ], + [ + "02:00", + "1.5838487306115105" + ], + [ + "02:10", + "1.1065686921529496" + ], + [ + "02:19", + "1.2924803345972495" + ], + [ + "02:30", + "0.9596692985545329" + ], + [ + "02:40", + "0.9956463783304861" + ], + [ + "02:49", + "1.17815968919917" + ], + [ + "03:00", + "2.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1269347057339092, + 1.183315922030218, + 1.020977082138179, + 1.1270128806263786, + 1.1263681399418604, + 1.118083187971494, + 0.9897878521213063, + 0.9699007539618653, + 1.0818312572990452, + 1.0856437631284126, + 1.0674782599651953, + 0.9811777087669468, + 0.9688417647786189, + 0.9251838620543567, + 0.9683619696413023, + 1.0209246384536417, + 0.9779619172742089, + 0.9256885449852714, + 1.061987673659908, + 1.036518467324717, + 1.0321799612950202, + 1.0951012329242487, + 1.0645670515151604, + 1.1199188585361046, + 1.296708106715972, + 1.2910624251454585, + 1.2848943927871044, + 1.442780474793665, + 1.4349704104992251, + 1.4401307976454372, + 1.5087555110510038, + 1.5891807749918847, + 1.5555066872545613, + 1.6482125215395373, + 1.6927817938564795, + 1.6642632986145796, + 1.7255967433933863, + 1.7615758260972627, + 1.6954755490847238, + 1.8345978388881383, + 1.6912542690332335, + 1.7828530739005293, + 1.7882051207781073, + 1.6964001929007024, + 1.7344908755574489, + 1.6457586680994094, + 1.5859841301566848, + 1.5376239137665637, + 1.406096761351721, + 1.3849373042627509, + 1.368628588171102, + 1.4867019672825126, + 1.438708240345497, + 1.5602385095048719, + 1.5669961325676882, + 1.42494421695802, + 1.3873811114046888, + 1.4680296664950658, + 1.511599784000429, + 1.4935745743916866, + 1.4060332951717749, + 1.5017317613473715, + 1.4703927740714626, + 1.4371220011099988, + 1.5068676690735445, + 1.4478117357821705, + 1.4196435727071088, + 1.4903427569533385, + 1.4698244938793883, + 1.5505846863487387, + 1.533519879787878, + 1.5667786069174539, + 1.5778047809114366, + 1.5555200473410558, + 1.564869119125043, + 1.698682981767884, + 1.6872971414285893, + 1.6493481770759535, + 1.7060311521985225, + 1.7137124903923262, + 1.6376606553417676, + 1.7895981600845021, + 1.7412522178219008, + 1.715352448907016, + 1.7857796975493536, + 1.7331170595870433, + 1.791502017081316, + 1.8519412914338227, + 1.8291994298199865, + 1.823260530908403, + 1.8865026719965499, + 1.901366011141666, + 1.938707110039195, + 1.97263533191086, + 1.8903750453346955, + 1.8792997080904943, + 1.9818921649480923, + 1.879964175983358, + 1.9345212266640923, + 1.9041762738192747, + 1.8202001845845146, + 1.8602091573942137, + 1.9046104065816931, + 1.9458201089413423, + 1.8657575666693111, + 1.9123086016829915, + 1.890408253433916, + 1.860057532127748, + 1.768405111248504, + 1.7228262662065983, + 1.7600741446233072, + 1.7351119281990313, + 1.627579637809477, + 1.5026127534180285, + 1.8668294834726493, + 1.921586028950252, + 1.859944045343084, + 1.9421573552577784, + 1.9996994539344555, + 1.8589087984770138, + 1.6627462508277173, + 1.4912009784351483, + 1.5628532968400852, + 0.9781458275090296, + 0.9812069092694643, + 1.0182492746801393, + 1.0080667767153983, + 1.1416978645073563, + 1.1811130366714149, + 1.0561868544820934, + 1.0768999151158571, + 0.9842344139042237, + 1.5838487306115105, + 1.1065686921529496, + 1.2924803345972495, + 0.9596692985545329, + 0.9956463783304861, + 1.17815968919917, + 2 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1047943789569705" + ], + [ + "04:10", + "1.1883017666310987" + ], + [ + "04:19", + "1.0142650203051602" + ], + [ + "04:30", + "1.1261941354434528" + ], + [ + "04:40", + "1.1215528640811856" + ], + [ + "04:49", + "1.123777977179432" + ], + [ + "05:00", + "0.9882266801920959" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0808466735711024" + ], + [ + "05:30", + "1.0855660588666805" + ], + [ + "05:40", + "1.0601101960948967" + ], + [ + "05:49", + "0.9848024633599429" + ], + [ + "06:00", + "0.9765561102534407" + ], + [ + "06:10", + "0.9119154822308351" + ], + [ + "06:19", + "0.972482336364256" + ], + [ + "06:30", + "1.0202065289219322" + ], + [ + "06:40", + "0.9725331279371819" + ], + [ + "06:49", + "0.9261779086060292" + ], + [ + "07:00", + "1.0632695259807021" + ], + [ + "07:10", + "1.0339391138613918" + ], + [ + "07:19", + "1.0236572172795426" + ], + [ + "07:30", + "1.1006780610742664" + ], + [ + "07:40", + "1.0575505118892772" + ], + [ + "07:49", + "1.114940646414758" + ], + [ + "08:00", + "1.3014173734410066" + ], + [ + "08:10", + "1.2696756256675363" + ], + [ + "08:19", + "1.2965877484768953" + ], + [ + "08:30", + "1.4341715787408271" + ], + [ + "08:40", + "1.430042309477122" + ], + [ + "08:49", + "1.4380137786545435" + ], + [ + "09:00", + "1.51399122481316" + ], + [ + "09:10", + "1.5847006040270823" + ], + [ + "09:19", + "1.5562176749254824" + ], + [ + "09:30", + "1.6407752060106144" + ], + [ + "09:40", + "1.6994202153182405" + ], + [ + "09:49", + "1.6640126025420001" + ], + [ + "10:00", + "1.7251395058579841" + ], + [ + "10:10", + "1.7525517194747418" + ], + [ + "10:19", + "1.6873331213928526" + ], + [ + "10:30", + "1.8334453624071898" + ], + [ + "10:40", + "1.693668235138805" + ], + [ + "10:49", + "1.7859891406406136" + ], + [ + "11:00", + "1.7795501166727645" + ], + [ + "11:10", + "1.691847810965162" + ], + [ + "11:19", + "1.7343094400313146" + ], + [ + "11:30", + "1.6429979727425528" + ], + [ + "11:40", + "1.5871194978874017" + ], + [ + "11:49", + "1.546006640817828" + ], + [ + "12:00", + "1.3953132777658983" + ], + [ + "12:10", + "1.3826133358004693" + ], + [ + "12:19", + "1.3668006368479524" + ], + [ + "12:30", + "1.4846488389806105" + ], + [ + "12:40", + "1.4393407285551885" + ], + [ + "12:49", + "1.5639695192762437" + ], + [ + "13:00", + "1.5613427863052345" + ], + [ + "13:10", + "1.4248213569615025" + ], + [ + "13:19", + "1.38645194277324" + ], + [ + "13:30", + "1.4680138338204818" + ], + [ + "13:40", + "1.5135488972516147" + ], + [ + "13:49", + "1.4881802659589993" + ], + [ + "14:00", + "1.4023551340359355" + ], + [ + "14:10", + "1.5013838506332775" + ], + [ + "14:19", + "1.4648357612990703" + ], + [ + "14:30", + "1.4311985015441322" + ], + [ + "14:40", + "1.516740774495766" + ], + [ + "14:49", + "1.4386649795356425" + ], + [ + "15:00", + "1.42165574341497" + ], + [ + "15:10", + "1.4962301527252777" + ], + [ + "15:19", + "1.4733333998309337" + ], + [ + "15:30", + "1.5649200192682766" + ], + [ + "15:40", + "1.5340813547248355" + ], + [ + "15:49", + "1.5651635251608118" + ], + [ + "16:00", + "1.5708273315573937" + ], + [ + "16:10", + "1.5519529163355583" + ], + [ + "16:19", + "1.566904243194357" + ], + [ + "16:30", + "1.6969412739944085" + ], + [ + "16:40", + "1.6811443417260956" + ], + [ + "16:49", + "1.6415844876116314" + ], + [ + "17:00", + "1.710522439052927" + ], + [ + "17:10", + "1.7046339200151728" + ], + [ + "17:19", + "1.6275761959462534" + ], + [ + "17:30", + "1.7846931879107075" + ], + [ + "17:40", + "1.7485532414247638" + ], + [ + "17:49", + "1.694820429886836" + ], + [ + "18:00", + "1.7928881359388897" + ], + [ + "18:10", + "1.7290242564158707" + ], + [ + "18:19", + "1.792775883504344" + ], + [ + "18:30", + "1.8456329434682042" + ], + [ + "18:40", + "1.8311686647261587" + ], + [ + "18:49", + "1.8206918667931573" + ], + [ + "19:00", + "1.8955131075514289" + ], + [ + "19:10", + "1.8962856747679528" + ], + [ + "19:19", + "1.9427811449375454" + ], + [ + "19:30", + "1.984900889417502" + ], + [ + "19:40", + "1.8709525476448663" + ], + [ + "19:49", + "1.8668034785116996" + ], + [ + "20:00", + "1.9771690305974159" + ], + [ + "20:10", + "1.878614121133621" + ], + [ + "20:19", + "1.936911790303976" + ], + [ + "20:30", + "1.8917147494741715" + ], + [ + "20:40", + "1.837296798470076" + ], + [ + "20:49", + "1.8693167099155221" + ], + [ + "21:00", + "1.9169677248084704" + ], + [ + "21:10", + "1.921932938522009" + ], + [ + "21:19", + "1.8798497339476843" + ], + [ + "21:30", + "1.905715168124015" + ], + [ + "21:40", + "1.893181203133364" + ], + [ + "21:49", + "1.8617453164116233" + ], + [ + "22:00", + "1.7550234773197868" + ], + [ + "22:10", + "1.7084678306863534" + ], + [ + "22:19", + "1.7681571397839972" + ], + [ + "22:30", + "1.7344961668132806" + ], + [ + "22:40", + "1.6365375769543882" + ], + [ + "22:49", + "1.5113369482378676" + ], + [ + "23:00", + "1.847115009394817" + ], + [ + "23:10", + "1.8970647542561716" + ], + [ + "23:19", + "1.861599442746066" + ], + [ + "23:30", + "1.9427360914729772" + ], + [ + "23:40", + "1.998653960244702" + ], + [ + "23:49", + "1.8743745287917795" + ], + [ + "00:00", + "1.6352720417982047" + ], + [ + "00:10", + "1.485414484190452" + ], + [ + "00:19", + "1.5706949210855135" + ], + [ + "00:30", + "0.9766095879949893" + ], + [ + "00:40", + "0.9821807673090218" + ], + [ + "00:49", + "1.017567406578456" + ], + [ + "01:00", + "1.0191363887274218" + ], + [ + "01:10", + "1.283939509979537" + ], + [ + "01:19", + "1.1522076015971365" + ], + [ + "01:30", + "0.9078177845905282" + ], + [ + "01:40", + "1.0715741109753536" + ], + [ + "01:49", + "0.9889496039667814" + ], + [ + "02:00", + "1.5007136655051716" + ], + [ + "02:10", + "1.2073326377175864" + ], + [ + "02:19", + "1.2848702876399642" + ], + [ + "02:30", + "0.9600689531114455" + ], + [ + "02:40", + "1.2025682887203437" + ], + [ + "02:49", + "0.9406502908123711" + ], + [ + "03:00", + "2.1002028742157735" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1047943789569705, + 1.1883017666310987, + 1.0142650203051602, + 1.1261941354434528, + 1.1215528640811856, + 1.123777977179432, + 0.9882266801920959, + 0.9699007539618653, + 1.0808466735711024, + 1.0855660588666805, + 1.0601101960948967, + 0.9848024633599429, + 0.9765561102534407, + 0.9119154822308351, + 0.972482336364256, + 1.0202065289219322, + 0.9725331279371819, + 0.9261779086060292, + 1.0632695259807021, + 1.0339391138613918, + 1.0236572172795426, + 1.1006780610742664, + 1.0575505118892772, + 1.114940646414758, + 1.3014173734410066, + 1.2696756256675363, + 1.2965877484768953, + 1.4341715787408271, + 1.430042309477122, + 1.4380137786545435, + 1.51399122481316, + 1.5847006040270823, + 1.5562176749254824, + 1.6407752060106144, + 1.6994202153182405, + 1.6640126025420001, + 1.7251395058579841, + 1.7525517194747418, + 1.6873331213928526, + 1.8334453624071898, + 1.693668235138805, + 1.7859891406406136, + 1.7795501166727645, + 1.691847810965162, + 1.7343094400313146, + 1.6429979727425528, + 1.5871194978874017, + 1.546006640817828, + 1.3953132777658983, + 1.3826133358004693, + 1.3668006368479524, + 1.4846488389806105, + 1.4393407285551885, + 1.5639695192762437, + 1.5613427863052345, + 1.4248213569615025, + 1.38645194277324, + 1.4680138338204818, + 1.5135488972516147, + 1.4881802659589993, + 1.4023551340359355, + 1.5013838506332775, + 1.4648357612990703, + 1.4311985015441322, + 1.516740774495766, + 1.4386649795356425, + 1.42165574341497, + 1.4962301527252777, + 1.4733333998309337, + 1.5649200192682766, + 1.5340813547248355, + 1.5651635251608118, + 1.5708273315573937, + 1.5519529163355583, + 1.566904243194357, + 1.6969412739944085, + 1.6811443417260956, + 1.6415844876116314, + 1.710522439052927, + 1.7046339200151728, + 1.6275761959462534, + 1.7846931879107075, + 1.7485532414247638, + 1.694820429886836, + 1.7928881359388897, + 1.7290242564158707, + 1.792775883504344, + 1.8456329434682042, + 1.8311686647261587, + 1.8206918667931573, + 1.8955131075514289, + 1.8962856747679528, + 1.9427811449375454, + 1.984900889417502, + 1.8709525476448663, + 1.8668034785116996, + 1.9771690305974159, + 1.878614121133621, + 1.936911790303976, + 1.8917147494741715, + 1.837296798470076, + 1.8693167099155221, + 1.9169677248084704, + 1.921932938522009, + 1.8798497339476843, + 1.905715168124015, + 1.893181203133364, + 1.8617453164116233, + 1.7550234773197868, + 1.7084678306863534, + 1.7681571397839972, + 1.7344961668132806, + 1.6365375769543882, + 1.5113369482378676, + 1.847115009394817, + 1.8970647542561716, + 1.861599442746066, + 1.9427360914729772, + 1.998653960244702, + 1.8743745287917795, + 1.6352720417982047, + 1.485414484190452, + 1.5706949210855135, + 0.9766095879949893, + 0.9821807673090218, + 1.017567406578456, + 1.0191363887274218, + 1.283939509979537, + 1.1522076015971365, + 0.9078177845905282, + 1.0715741109753536, + 0.9889496039667814, + 1.5007136655051716, + 1.2073326377175864, + 1.2848702876399642, + 0.9600689531114455, + 1.2025682887203437, + 0.9406502908123711, + 2.1002028742157735 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1047943789569705" + ], + [ + "04:10", + "1.1883017666310987" + ], + [ + "04:19", + "1.0142650203051602" + ], + [ + "04:30", + "1.1261941354434528" + ], + [ + "04:40", + "1.1215528640811856" + ], + [ + "04:49", + "1.123777977179432" + ], + [ + "05:00", + "0.9882266801920959" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0808466735711024" + ], + [ + "05:30", + "1.0855660588666805" + ], + [ + "05:40", + "1.0601101960948967" + ], + [ + "05:49", + "0.9848024633599429" + ], + [ + "06:00", + "0.9765561102534407" + ], + [ + "06:10", + "0.9119154822308351" + ], + [ + "06:19", + "0.9729962586086075" + ], + [ + "06:30", + "1.0194487381972455" + ], + [ + "06:40", + "0.9726281681054523" + ], + [ + "06:49", + "0.9264660984291495" + ], + [ + "07:00", + "1.0642702123044254" + ], + [ + "07:10", + "1.0339840423508844" + ], + [ + "07:19", + "1.0249766249768082" + ], + [ + "07:30", + "1.096680899416543" + ], + [ + "07:40", + "1.059791787949299" + ], + [ + "07:49", + "1.1311002165102784" + ], + [ + "08:00", + "1.2908885441686746" + ], + [ + "08:10", + "1.2825680605859393" + ], + [ + "08:19", + "1.2876230387547933" + ], + [ + "08:30", + "1.440266103777849" + ], + [ + "08:40", + "1.4386513884640761" + ], + [ + "08:49", + "1.4397553977906188" + ], + [ + "09:00", + "1.5005177246867532" + ], + [ + "09:10", + "1.5879726056810461" + ], + [ + "09:19", + "1.5546973910105537" + ], + [ + "09:30", + "1.6447418905028213" + ], + [ + "09:40", + "1.6996935098705164" + ], + [ + "09:49", + "1.6654891856438048" + ], + [ + "10:00", + "1.7148858018258737" + ], + [ + "10:10", + "1.7624559466426784" + ], + [ + "10:19", + "1.6905292020665665" + ], + [ + "10:30", + "1.8322316443655013" + ], + [ + "10:40", + "1.6827216291798317" + ], + [ + "10:49", + "1.791534246134415" + ], + [ + "11:00", + "1.7867701989868228" + ], + [ + "11:10", + "1.6887686378784057" + ], + [ + "11:19", + "1.7331860297241073" + ], + [ + "11:30", + "1.6455082769718508" + ], + [ + "11:40", + "1.5866816557908274" + ], + [ + "11:49", + "1.5364449092640564" + ], + [ + "12:00", + "1.405541384246915" + ], + [ + "12:10", + "1.3831819421118776" + ], + [ + "12:19", + "1.3682362320722716" + ], + [ + "12:30", + "1.4850549117623466" + ], + [ + "12:40", + "1.4403880467742893" + ], + [ + "12:49", + "1.5629662366306054" + ], + [ + "13:00", + "1.5625794049262998" + ], + [ + "13:10", + "1.4242473519391148" + ], + [ + "13:19", + "1.3882255123204985" + ], + [ + "13:30", + "1.463940442587454" + ], + [ + "13:40", + "1.5137500110773519" + ], + [ + "13:49", + "1.4921124823702157" + ], + [ + "14:00", + "1.4040877772606009" + ], + [ + "14:10", + "1.4945545934226876" + ], + [ + "14:19", + "1.474979441443249" + ], + [ + "14:30", + "1.4270908917109228" + ], + [ + "14:40", + "1.5195651430425507" + ], + [ + "14:49", + "1.4477508707927003" + ], + [ + "15:00", + "1.4145830864752562" + ], + [ + "15:10", + "1.491947927658131" + ], + [ + "15:19", + "1.469079335809095" + ], + [ + "15:30", + "1.5458992617455247" + ], + [ + "15:40", + "1.5435553412337275" + ], + [ + "15:49", + "1.558598411733489" + ], + [ + "16:00", + "1.5780700153711371" + ], + [ + "16:10", + "1.5619773209903285" + ], + [ + "16:19", + "1.55629583362381" + ], + [ + "16:30", + "1.6986545257945012" + ], + [ + "16:40", + "1.6792560187099421" + ], + [ + "16:49", + "1.6424715500876714" + ], + [ + "17:00", + "1.710651716218577" + ], + [ + "17:10", + "1.7004222374375098" + ], + [ + "17:19", + "1.6278335528399184" + ], + [ + "17:30", + "1.7945932296232903" + ], + [ + "17:40", + "1.7416195691241478" + ], + [ + "17:49", + "1.7102067875553235" + ], + [ + "18:00", + "1.7862533663677158" + ], + [ + "18:10", + "1.7407351135853129" + ], + [ + "18:19", + "1.78799181714888" + ], + [ + "18:30", + "1.853445187300798" + ], + [ + "18:40", + "1.825833258740307" + ], + [ + "18:49", + "1.809468591279298" + ], + [ + "19:00", + "1.8906499268965187" + ], + [ + "19:10", + "1.902338770534634" + ], + [ + "19:19", + "1.9383208049239784" + ], + [ + "19:30", + "1.998273348994049" + ], + [ + "19:40", + "1.8666836440721777" + ], + [ + "19:49", + "1.8744356003622384" + ], + [ + "20:00", + "1.9757887399275524" + ], + [ + "20:10", + "1.8721306790111045" + ], + [ + "20:19", + "1.9462677023168422" + ], + [ + "20:30", + "1.907486771059141" + ], + [ + "20:40", + "1.8235362259860508" + ], + [ + "20:49", + "1.8625659266610506" + ], + [ + "21:00", + "1.9072469237826044" + ], + [ + "21:10", + "1.924348391061679" + ], + [ + "21:19", + "1.8940315220247954" + ], + [ + "21:30", + "1.9019910472184078" + ], + [ + "21:40", + "1.8902949079701652" + ], + [ + "21:49", + "1.8589345241570256" + ], + [ + "22:00", + "1.7402430651895469" + ], + [ + "22:10", + "1.7222045710140885" + ], + [ + "22:19", + "1.7648254259079579" + ], + [ + "22:30", + "1.7296771941292808" + ], + [ + "22:40", + "1.6251650263634603" + ], + [ + "22:49", + "1.516577538076878" + ], + [ + "23:00", + "1.8412245495424808" + ], + [ + "23:10", + "1.9136370418497044" + ], + [ + "23:19", + "1.8542928402715548" + ], + [ + "23:30", + "1.9453439515100865" + ], + [ + "23:40", + "1.989869019400556" + ], + [ + "23:49", + "1.8626102971998753" + ], + [ + "00:00", + "1.662410462357551" + ], + [ + "00:10", + "1.4858707762634744" + ], + [ + "00:19", + "1.5414978146312293" + ], + [ + "00:30", + "1.0188599513280487" + ], + [ + "00:40", + "0.9850569449264881" + ], + [ + "00:49", + "1.0204393507967415" + ], + [ + "01:00", + "1.0205250508239634" + ], + [ + "01:10", + "1.2829992310930993" + ], + [ + "01:19", + "1.154290800151939" + ], + [ + "01:30", + "0.9426322946425192" + ], + [ + "01:40", + "1.0716543488653647" + ], + [ + "01:49", + "0.9894490806054449" + ], + [ + "02:00", + "1.578841250620199" + ], + [ + "02:10", + "1.1070575595435153" + ], + [ + "02:19", + "1.2972990747988666" + ], + [ + "02:30", + "0.9592678525865996" + ], + [ + "02:40", + "0.9962053941806114" + ], + [ + "02:49", + "1.1699188512138818" + ], + [ + "03:00", + "2.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1047943789569705, + 1.1883017666310987, + 1.0142650203051602, + 1.1261941354434528, + 1.1215528640811856, + 1.123777977179432, + 0.9882266801920959, + 0.9699007539618653, + 1.0808466735711024, + 1.0855660588666805, + 1.0601101960948967, + 0.9848024633599429, + 0.9765561102534407, + 0.9119154822308351, + 0.9729962586086075, + 1.0194487381972455, + 0.9726281681054523, + 0.9264660984291495, + 1.0642702123044254, + 1.0339840423508844, + 1.0249766249768082, + 1.096680899416543, + 1.059791787949299, + 1.1311002165102784, + 1.2908885441686746, + 1.2825680605859393, + 1.2876230387547933, + 1.440266103777849, + 1.4386513884640761, + 1.4397553977906188, + 1.5005177246867532, + 1.5879726056810461, + 1.5546973910105537, + 1.6447418905028213, + 1.6996935098705164, + 1.6654891856438048, + 1.7148858018258737, + 1.7624559466426784, + 1.6905292020665665, + 1.8322316443655013, + 1.6827216291798317, + 1.791534246134415, + 1.7867701989868228, + 1.6887686378784057, + 1.7331860297241073, + 1.6455082769718508, + 1.5866816557908274, + 1.5364449092640564, + 1.405541384246915, + 1.3831819421118776, + 1.3682362320722716, + 1.4850549117623466, + 1.4403880467742893, + 1.5629662366306054, + 1.5625794049262998, + 1.4242473519391148, + 1.3882255123204985, + 1.463940442587454, + 1.5137500110773519, + 1.4921124823702157, + 1.4040877772606009, + 1.4945545934226876, + 1.474979441443249, + 1.4270908917109228, + 1.5195651430425507, + 1.4477508707927003, + 1.4145830864752562, + 1.491947927658131, + 1.469079335809095, + 1.5458992617455247, + 1.5435553412337275, + 1.558598411733489, + 1.5780700153711371, + 1.5619773209903285, + 1.55629583362381, + 1.6986545257945012, + 1.6792560187099421, + 1.6424715500876714, + 1.710651716218577, + 1.7004222374375098, + 1.6278335528399184, + 1.7945932296232903, + 1.7416195691241478, + 1.7102067875553235, + 1.7862533663677158, + 1.7407351135853129, + 1.78799181714888, + 1.853445187300798, + 1.825833258740307, + 1.809468591279298, + 1.8906499268965187, + 1.902338770534634, + 1.9383208049239784, + 1.998273348994049, + 1.8666836440721777, + 1.8744356003622384, + 1.9757887399275524, + 1.8721306790111045, + 1.9462677023168422, + 1.907486771059141, + 1.8235362259860508, + 1.8625659266610506, + 1.9072469237826044, + 1.924348391061679, + 1.8940315220247954, + 1.9019910472184078, + 1.8902949079701652, + 1.8589345241570256, + 1.7402430651895469, + 1.7222045710140885, + 1.7648254259079579, + 1.7296771941292808, + 1.6251650263634603, + 1.516577538076878, + 1.8412245495424808, + 1.9136370418497044, + 1.8542928402715548, + 1.9453439515100865, + 1.989869019400556, + 1.8626102971998753, + 1.662410462357551, + 1.4858707762634744, + 1.5414978146312293, + 1.0188599513280487, + 0.9850569449264881, + 1.0204393507967415, + 1.0205250508239634, + 1.2829992310930993, + 1.154290800151939, + 0.9426322946425192, + 1.0716543488653647, + 0.9894490806054449, + 1.578841250620199, + 1.1070575595435153, + 1.2972990747988666, + 0.9592678525865996, + 0.9962053941806114, + 1.1699188512138818, + 2 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1269347057339092" + ], + [ + "04:10", + "1.183315922030218" + ], + [ + "04:19", + "1.020977082138179" + ], + [ + "04:30", + "1.1270128806263786" + ], + [ + "04:40", + "1.1263681399418604" + ], + [ + "04:49", + "1.118083187971494" + ], + [ + "05:00", + "0.9897878521213063" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0818312572990452" + ], + [ + "05:30", + "1.0856437631284126" + ], + [ + "05:40", + "1.0674782599651953" + ], + [ + "05:49", + "0.9811777087669468" + ], + [ + "06:00", + "0.9711832231640755" + ], + [ + "06:10", + "0.9278965616725434" + ], + [ + "06:19", + "0.9720003350418066" + ], + [ + "06:30", + "1.0204068257882464" + ], + [ + "06:40", + "0.979319443115786" + ], + [ + "06:49", + "0.9236513173771458" + ], + [ + "07:00", + "1.0636518999395794" + ], + [ + "07:10", + "1.0369947820775907" + ], + [ + "07:19", + "1.0322528262719026" + ], + [ + "07:30", + "1.0969952307069828" + ], + [ + "07:40", + "1.0676946431776058" + ], + [ + "07:49", + "1.1143865635033674" + ], + [ + "08:00", + "1.2876337841769665" + ], + [ + "08:10", + "1.3136689496109661" + ], + [ + "08:19", + "1.2772364551371465" + ], + [ + "08:30", + "1.4370263327382162" + ], + [ + "08:40", + "1.4327658404691148" + ], + [ + "08:49", + "1.4396187797529865" + ], + [ + "09:00", + "1.5178278489159327" + ], + [ + "09:10", + "1.5821074111865883" + ], + [ + "09:19", + "1.5608309616568052" + ], + [ + "09:30", + "1.6423885280272865" + ], + [ + "09:40", + "1.694180891868229" + ], + [ + "09:49", + "1.6572397848489153" + ], + [ + "10:00", + "1.724148932694864" + ], + [ + "10:10", + "1.7588880309538015" + ], + [ + "10:19", + "1.6944374463986" + ], + [ + "10:30", + "1.8281584389303678" + ], + [ + "10:40", + "1.6978752257051153" + ], + [ + "10:49", + "1.7885907871117392" + ], + [ + "11:00", + "1.785172874724185" + ], + [ + "11:10", + "1.6972809962487765" + ], + [ + "11:19", + "1.7370186055055306" + ], + [ + "11:30", + "1.643384647117527" + ], + [ + "11:40", + "1.5876670396613597" + ], + [ + "11:49", + "1.540245515260227" + ], + [ + "12:00", + "1.4015738911386681" + ], + [ + "12:10", + "1.38500069782615" + ], + [ + "12:19", + "1.3700616797212801" + ], + [ + "12:30", + "1.4860904325363737" + ], + [ + "12:40", + "1.4379497193330755" + ], + [ + "12:49", + "1.5627624395501907" + ], + [ + "13:00", + "1.5665536034050933" + ], + [ + "13:10", + "1.4250217387535715" + ], + [ + "13:19", + "1.389420730974661" + ], + [ + "13:30", + "1.4692161359944884" + ], + [ + "13:40", + "1.510510368421014" + ], + [ + "13:49", + "1.4929088676486868" + ], + [ + "14:00", + "1.4022145318109638" + ], + [ + "14:10", + "1.5066608434640645" + ], + [ + "14:19", + "1.475596846042855" + ], + [ + "14:30", + "1.4286452596518688" + ], + [ + "14:40", + "1.517588063521507" + ], + [ + "14:49", + "1.454962229808327" + ], + [ + "15:00", + "1.4187770443855323" + ], + [ + "15:10", + "1.4923041279693436" + ], + [ + "15:19", + "1.4721483568018694" + ], + [ + "15:30", + "1.5405780380124174" + ], + [ + "15:40", + "1.5405786156971404" + ], + [ + "15:49", + "1.5650692304838636" + ], + [ + "16:00", + "1.5775992744813878" + ], + [ + "16:10", + "1.5529699256339955" + ], + [ + "16:19", + "1.5603210048752216" + ], + [ + "16:30", + "1.6964329823860496" + ], + [ + "16:40", + "1.6879416923480586" + ], + [ + "16:49", + "1.647874652528703" + ], + [ + "17:00", + "1.7121856288918553" + ], + [ + "17:10", + "1.705009825231168" + ], + [ + "17:19", + "1.6404680290839062" + ], + [ + "17:30", + "1.7819281310063246" + ], + [ + "17:40", + "1.744658573505704" + ], + [ + "17:49", + "1.7060713209800857" + ], + [ + "18:00", + "1.7923262148890406" + ], + [ + "18:10", + "1.7305219137173546" + ], + [ + "18:19", + "1.7884340358953115" + ], + [ + "18:30", + "1.8417685175440042" + ], + [ + "18:40", + "1.831620035430378" + ], + [ + "18:49", + "1.8275066290381754" + ], + [ + "19:00", + "1.899166249470119" + ], + [ + "19:10", + "1.898120828051651" + ], + [ + "19:19", + "1.9474756698894329" + ], + [ + "19:30", + "1.9903981909806305" + ], + [ + "19:40", + "1.8731647755064493" + ], + [ + "19:49", + "1.8807270456910439" + ], + [ + "20:00", + "1.9799831598163649" + ], + [ + "20:10", + "1.8634497328857036" + ], + [ + "20:19", + "1.9420122327247837" + ], + [ + "20:30", + "1.8938199876305126" + ], + [ + "20:40", + "1.8238117834343386" + ], + [ + "20:49", + "1.879453717813514" + ], + [ + "21:00", + "1.9089543038172716" + ], + [ + "21:10", + "1.9213488096142068" + ], + [ + "21:19", + "1.8774302945144492" + ], + [ + "21:30", + "1.908203311163047" + ], + [ + "21:40", + "1.8843393162265158" + ], + [ + "21:49", + "1.8698028090230276" + ], + [ + "22:00", + "1.754107235677" + ], + [ + "22:10", + "1.708613320387488" + ], + [ + "22:19", + "1.7711570534561452" + ], + [ + "22:30", + "1.7362999334486722" + ], + [ + "22:40", + "1.6346503257938487" + ], + [ + "22:49", + "1.4816524206328603" + ], + [ + "23:00", + "1.8621148272686927" + ], + [ + "23:10", + "1.9022643786751918" + ], + [ + "23:19", + "1.8658594371091242" + ], + [ + "23:30", + "1.9381818448969377" + ], + [ + "23:40", + "2.0083224374037205" + ], + [ + "23:49", + "1.8550213646131826" + ], + [ + "00:00", + "1.6671212940323261" + ], + [ + "00:10", + "1.4861050729482748" + ], + [ + "00:19", + "1.5708928106253155" + ], + [ + "00:30", + "0.981318405443875" + ], + [ + "00:40", + "0.9806132387425643" + ], + [ + "00:49", + "1.018008916885152" + ], + [ + "01:00", + "1.0203795317595858" + ], + [ + "01:10", + "1.2734835912817806" + ], + [ + "01:19", + "1.1458531615845116" + ], + [ + "01:30", + "0.9262628633421433" + ], + [ + "01:40", + "1.064468057025245" + ], + [ + "01:49", + "0.9814088522019572" + ], + [ + "02:00", + "1.5469866327739488" + ], + [ + "02:10", + "1.1081757494556261" + ], + [ + "02:19", + "1.2881932544432466" + ], + [ + "02:30", + "0.9581428647264629" + ], + [ + "02:40", + "1.20595000680463" + ], + [ + "02:49", + "0.9455494676797531" + ], + [ + "03:00", + "2.1002028742157735" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1269347057339092, + 1.183315922030218, + 1.020977082138179, + 1.1270128806263786, + 1.1263681399418604, + 1.118083187971494, + 0.9897878521213063, + 0.9699007539618653, + 1.0818312572990452, + 1.0856437631284126, + 1.0674782599651953, + 0.9811777087669468, + 0.9711832231640755, + 0.9278965616725434, + 0.9720003350418066, + 1.0204068257882464, + 0.979319443115786, + 0.9236513173771458, + 1.0636518999395794, + 1.0369947820775907, + 1.0322528262719026, + 1.0969952307069828, + 1.0676946431776058, + 1.1143865635033674, + 1.2876337841769665, + 1.3136689496109661, + 1.2772364551371465, + 1.4370263327382162, + 1.4327658404691148, + 1.4396187797529865, + 1.5178278489159327, + 1.5821074111865883, + 1.5608309616568052, + 1.6423885280272865, + 1.694180891868229, + 1.6572397848489153, + 1.724148932694864, + 1.7588880309538015, + 1.6944374463986, + 1.8281584389303678, + 1.6978752257051153, + 1.7885907871117392, + 1.785172874724185, + 1.6972809962487765, + 1.7370186055055306, + 1.643384647117527, + 1.5876670396613597, + 1.540245515260227, + 1.4015738911386681, + 1.38500069782615, + 1.3700616797212801, + 1.4860904325363737, + 1.4379497193330755, + 1.5627624395501907, + 1.5665536034050933, + 1.4250217387535715, + 1.389420730974661, + 1.4692161359944884, + 1.510510368421014, + 1.4929088676486868, + 1.4022145318109638, + 1.5066608434640645, + 1.475596846042855, + 1.4286452596518688, + 1.517588063521507, + 1.454962229808327, + 1.4187770443855323, + 1.4923041279693436, + 1.4721483568018694, + 1.5405780380124174, + 1.5405786156971404, + 1.5650692304838636, + 1.5775992744813878, + 1.5529699256339955, + 1.5603210048752216, + 1.6964329823860496, + 1.6879416923480586, + 1.647874652528703, + 1.7121856288918553, + 1.705009825231168, + 1.6404680290839062, + 1.7819281310063246, + 1.744658573505704, + 1.7060713209800857, + 1.7923262148890406, + 1.7305219137173546, + 1.7884340358953115, + 1.8417685175440042, + 1.831620035430378, + 1.8275066290381754, + 1.899166249470119, + 1.898120828051651, + 1.9474756698894329, + 1.9903981909806305, + 1.8731647755064493, + 1.8807270456910439, + 1.9799831598163649, + 1.8634497328857036, + 1.9420122327247837, + 1.8938199876305126, + 1.8238117834343386, + 1.879453717813514, + 1.9089543038172716, + 1.9213488096142068, + 1.8774302945144492, + 1.908203311163047, + 1.8843393162265158, + 1.8698028090230276, + 1.754107235677, + 1.708613320387488, + 1.7711570534561452, + 1.7362999334486722, + 1.6346503257938487, + 1.4816524206328603, + 1.8621148272686927, + 1.9022643786751918, + 1.8658594371091242, + 1.9381818448969377, + 2.0083224374037205, + 1.8550213646131826, + 1.6671212940323261, + 1.4861050729482748, + 1.5708928106253155, + 0.981318405443875, + 0.9806132387425643, + 1.018008916885152, + 1.0203795317595858, + 1.2734835912817806, + 1.1458531615845116, + 0.9262628633421433, + 1.064468057025245, + 0.9814088522019572, + 1.5469866327739488, + 1.1081757494556261, + 1.2881932544432466, + 0.9581428647264629, + 1.20595000680463, + 0.9455494676797531, + 2.1002028742157735 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average occupancy by time bin (OD_dist-weighted) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Average occupancy" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1269347057339092" + ], + [ + "04:10", + "1.183315922030218" + ], + [ + "04:19", + "1.020977082138179" + ], + [ + "04:30", + "1.1270128806263786" + ], + [ + "04:40", + "1.1263681399418604" + ], + [ + "04:49", + "1.118083187971494" + ], + [ + "05:00", + "0.9897878521213063" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0818312572990452" + ], + [ + "05:30", + "1.0856437631284126" + ], + [ + "05:40", + "1.0674782599651953" + ], + [ + "05:49", + "0.9811777087669468" + ], + [ + "06:00", + "0.9688417647786189" + ], + [ + "06:10", + "0.9251838620543567" + ], + [ + "06:19", + "0.9683619696413023" + ], + [ + "06:30", + "1.0209246384536417" + ], + [ + "06:40", + "0.9779619172742089" + ], + [ + "06:49", + "0.9256885449852714" + ], + [ + "07:00", + "1.061987673659908" + ], + [ + "07:10", + "1.036518467324717" + ], + [ + "07:19", + "1.0321799612950202" + ], + [ + "07:30", + "1.0951012329242487" + ], + [ + "07:40", + "1.0645670515151604" + ], + [ + "07:49", + "1.1199188585361046" + ], + [ + "08:00", + "1.296708106715972" + ], + [ + "08:10", + "1.2910624251454585" + ], + [ + "08:19", + "1.2848943927871044" + ], + [ + "08:30", + "1.442780474793665" + ], + [ + "08:40", + "1.4349704104992251" + ], + [ + "08:49", + "1.4401307976454372" + ], + [ + "09:00", + "1.5087555110510038" + ], + [ + "09:10", + "1.5891807749918847" + ], + [ + "09:19", + "1.5555066872545613" + ], + [ + "09:30", + "1.6482125215395373" + ], + [ + "09:40", + "1.6927817938564795" + ], + [ + "09:49", + "1.6642632986145796" + ], + [ + "10:00", + "1.7255967433933863" + ], + [ + "10:10", + "1.7615758260972627" + ], + [ + "10:19", + "1.6954755490847238" + ], + [ + "10:30", + "1.8345978388881383" + ], + [ + "10:40", + "1.6912542690332335" + ], + [ + "10:49", + "1.7828530739005293" + ], + [ + "11:00", + "1.7882051207781073" + ], + [ + "11:10", + "1.6964001929007024" + ], + [ + "11:19", + "1.7344908755574489" + ], + [ + "11:30", + "1.6457586680994094" + ], + [ + "11:40", + "1.5859841301566848" + ], + [ + "11:49", + "1.5376239137665637" + ], + [ + "12:00", + "1.406096761351721" + ], + [ + "12:10", + "1.3849373042627509" + ], + [ + "12:19", + "1.368628588171102" + ], + [ + "12:30", + "1.4867019672825126" + ], + [ + "12:40", + "1.438708240345497" + ], + [ + "12:49", + "1.5602385095048719" + ], + [ + "13:00", + "1.5669961325676882" + ], + [ + "13:10", + "1.42494421695802" + ], + [ + "13:19", + "1.3873811114046888" + ], + [ + "13:30", + "1.4680296664950658" + ], + [ + "13:40", + "1.511599784000429" + ], + [ + "13:49", + "1.4935745743916866" + ], + [ + "14:00", + "1.4060332951717749" + ], + [ + "14:10", + "1.5017317613473715" + ], + [ + "14:19", + "1.4703927740714626" + ], + [ + "14:30", + "1.4371220011099988" + ], + [ + "14:40", + "1.5068676690735445" + ], + [ + "14:49", + "1.4478117357821705" + ], + [ + "15:00", + "1.4196435727071088" + ], + [ + "15:10", + "1.4903427569533385" + ], + [ + "15:19", + "1.4698244938793883" + ], + [ + "15:30", + "1.5505846863487387" + ], + [ + "15:40", + "1.533519879787878" + ], + [ + "15:49", + "1.5667786069174539" + ], + [ + "16:00", + "1.5778047809114366" + ], + [ + "16:10", + "1.5555200473410558" + ], + [ + "16:19", + "1.564869119125043" + ], + [ + "16:30", + "1.698682981767884" + ], + [ + "16:40", + "1.6872971414285893" + ], + [ + "16:49", + "1.6493481770759535" + ], + [ + "17:00", + "1.7060311521985225" + ], + [ + "17:10", + "1.7137124903923262" + ], + [ + "17:19", + "1.6376606553417676" + ], + [ + "17:30", + "1.7895981600845021" + ], + [ + "17:40", + "1.7412522178219008" + ], + [ + "17:49", + "1.715352448907016" + ], + [ + "18:00", + "1.7857796975493536" + ], + [ + "18:10", + "1.7331170595870433" + ], + [ + "18:19", + "1.791502017081316" + ], + [ + "18:30", + "1.8519412914338227" + ], + [ + "18:40", + "1.8291994298199865" + ], + [ + "18:49", + "1.823260530908403" + ], + [ + "19:00", + "1.8865026719965499" + ], + [ + "19:10", + "1.901366011141666" + ], + [ + "19:19", + "1.938707110039195" + ], + [ + "19:30", + "1.97263533191086" + ], + [ + "19:40", + "1.8903750453346955" + ], + [ + "19:49", + "1.8792997080904943" + ], + [ + "20:00", + "1.9818921649480923" + ], + [ + "20:10", + "1.879964175983358" + ], + [ + "20:19", + "1.9345212266640923" + ], + [ + "20:30", + "1.9041762738192747" + ], + [ + "20:40", + "1.8202001845845146" + ], + [ + "20:49", + "1.8602091573942137" + ], + [ + "21:00", + "1.9046104065816931" + ], + [ + "21:10", + "1.9458201089413423" + ], + [ + "21:19", + "1.8657575666693111" + ], + [ + "21:30", + "1.9123086016829915" + ], + [ + "21:40", + "1.890408253433916" + ], + [ + "21:49", + "1.860057532127748" + ], + [ + "22:00", + "1.768405111248504" + ], + [ + "22:10", + "1.7228262662065983" + ], + [ + "22:19", + "1.7600741446233072" + ], + [ + "22:30", + "1.7351119281990313" + ], + [ + "22:40", + "1.627579637809477" + ], + [ + "22:49", + "1.5026127534180285" + ], + [ + "23:00", + "1.8668294834726493" + ], + [ + "23:10", + "1.921586028950252" + ], + [ + "23:19", + "1.859944045343084" + ], + [ + "23:30", + "1.9421573552577784" + ], + [ + "23:40", + "1.9996994539344555" + ], + [ + "23:49", + "1.8589087984770138" + ], + [ + "00:00", + "1.6627462508277173" + ], + [ + "00:10", + "1.4912009784351483" + ], + [ + "00:19", + "1.5628532968400852" + ], + [ + "00:30", + "0.9781458275090296" + ], + [ + "00:40", + "0.9812069092694643" + ], + [ + "00:49", + "1.0182492746801393" + ], + [ + "01:00", + "1.0080667767153983" + ], + [ + "01:10", + "1.1416978645073563" + ], + [ + "01:19", + "1.1811130366714149" + ], + [ + "01:30", + "1.0561868544820934" + ], + [ + "01:40", + "1.0768999151158571" + ], + [ + "01:49", + "0.9842344139042237" + ], + [ + "02:00", + "1.5838487306115105" + ], + [ + "02:10", + "1.1065686921529496" + ], + [ + "02:19", + "1.2924803345972495" + ], + [ + "02:30", + "0.9596692985545329" + ], + [ + "02:40", + "0.9956463783304861" + ], + [ + "02:49", + "1.17815968919917" + ], + [ + "03:00", + "2.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1269347057339092, + 1.183315922030218, + 1.020977082138179, + 1.1270128806263786, + 1.1263681399418604, + 1.118083187971494, + 0.9897878521213063, + 0.9699007539618653, + 1.0818312572990452, + 1.0856437631284126, + 1.0674782599651953, + 0.9811777087669468, + 0.9688417647786189, + 0.9251838620543567, + 0.9683619696413023, + 1.0209246384536417, + 0.9779619172742089, + 0.9256885449852714, + 1.061987673659908, + 1.036518467324717, + 1.0321799612950202, + 1.0951012329242487, + 1.0645670515151604, + 1.1199188585361046, + 1.296708106715972, + 1.2910624251454585, + 1.2848943927871044, + 1.442780474793665, + 1.4349704104992251, + 1.4401307976454372, + 1.5087555110510038, + 1.5891807749918847, + 1.5555066872545613, + 1.6482125215395373, + 1.6927817938564795, + 1.6642632986145796, + 1.7255967433933863, + 1.7615758260972627, + 1.6954755490847238, + 1.8345978388881383, + 1.6912542690332335, + 1.7828530739005293, + 1.7882051207781073, + 1.6964001929007024, + 1.7344908755574489, + 1.6457586680994094, + 1.5859841301566848, + 1.5376239137665637, + 1.406096761351721, + 1.3849373042627509, + 1.368628588171102, + 1.4867019672825126, + 1.438708240345497, + 1.5602385095048719, + 1.5669961325676882, + 1.42494421695802, + 1.3873811114046888, + 1.4680296664950658, + 1.511599784000429, + 1.4935745743916866, + 1.4060332951717749, + 1.5017317613473715, + 1.4703927740714626, + 1.4371220011099988, + 1.5068676690735445, + 1.4478117357821705, + 1.4196435727071088, + 1.4903427569533385, + 1.4698244938793883, + 1.5505846863487387, + 1.533519879787878, + 1.5667786069174539, + 1.5778047809114366, + 1.5555200473410558, + 1.564869119125043, + 1.698682981767884, + 1.6872971414285893, + 1.6493481770759535, + 1.7060311521985225, + 1.7137124903923262, + 1.6376606553417676, + 1.7895981600845021, + 1.7412522178219008, + 1.715352448907016, + 1.7857796975493536, + 1.7331170595870433, + 1.791502017081316, + 1.8519412914338227, + 1.8291994298199865, + 1.823260530908403, + 1.8865026719965499, + 1.901366011141666, + 1.938707110039195, + 1.97263533191086, + 1.8903750453346955, + 1.8792997080904943, + 1.9818921649480923, + 1.879964175983358, + 1.9345212266640923, + 1.9041762738192747, + 1.8202001845845146, + 1.8602091573942137, + 1.9046104065816931, + 1.9458201089413423, + 1.8657575666693111, + 1.9123086016829915, + 1.890408253433916, + 1.860057532127748, + 1.768405111248504, + 1.7228262662065983, + 1.7600741446233072, + 1.7351119281990313, + 1.627579637809477, + 1.5026127534180285, + 1.8668294834726493, + 1.921586028950252, + 1.859944045343084, + 1.9421573552577784, + 1.9996994539344555, + 1.8589087984770138, + 1.6627462508277173, + 1.4912009784351483, + 1.5628532968400852, + 0.9781458275090296, + 0.9812069092694643, + 1.0182492746801393, + 1.0080667767153983, + 1.1416978645073563, + 1.1811130366714149, + 1.0561868544820934, + 1.0768999151158571, + 0.9842344139042237, + 1.5838487306115105, + 1.1065686921529496, + 1.2924803345972495, + 0.9596692985545329, + 0.9956463783304861, + 1.17815968919917, + 2 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.4735682599548785" + ], + [ + "03:10", + "1.1627080364349767" + ], + [ + "03:19", + "1.2465504888940537" + ], + [ + "03:30", + "1.4053565113133744" + ], + [ + "03:40", + "1.2271221162888657" + ], + [ + "03:49", + "1.1191358383786965" + ], + [ + "04:00", + "1.0687282447075008" + ], + [ + "04:10", + "1.260806888906587" + ], + [ + "04:19", + "1.0538831636839776" + ], + [ + "04:30", + "1.0350438003366582" + ], + [ + "04:40", + "1.2088289335328226" + ], + [ + "04:49", + "1.2417654995474776" + ], + [ + "05:00", + "1.0501726795940944" + ], + [ + "05:10", + "1.0632910912633315" + ], + [ + "05:19", + "0.978560955856779" + ], + [ + "05:30", + "1.033348615849195" + ], + [ + "05:40", + "1.0569710247148674" + ], + [ + "05:49", + "1.0457797945656429" + ], + [ + "06:00", + "0.9864900296866216" + ], + [ + "06:10", + "0.9640847806336262" + ], + [ + "06:19", + "0.9889258453706244" + ], + [ + "06:30", + "0.9695942360407832" + ], + [ + "06:40", + "1.0056338980205985" + ], + [ + "06:49", + "0.9698900964725339" + ], + [ + "07:00", + "1.0445785792367646" + ], + [ + "07:10", + "1.0898839556952493" + ], + [ + "07:19", + "1.0289550497461877" + ], + [ + "07:30", + "1.0878124361464963" + ], + [ + "07:40", + "1.084683834684128" + ], + [ + "07:49", + "1.1329150126338705" + ], + [ + "08:00", + "1.2800355559697736" + ], + [ + "08:10", + "1.337034933403239" + ], + [ + "08:19", + "1.3819699457109595" + ], + [ + "08:30", + "1.5357075637276179" + ], + [ + "08:40", + "1.5173312313097327" + ], + [ + "08:49", + "1.555867077674955" + ], + [ + "09:00", + "1.6565394114155505" + ], + [ + "09:10", + "1.5932236664592245" + ], + [ + "09:19", + "1.6836534864917674" + ], + [ + "09:30", + "1.8572112400574607" + ], + [ + "09:40", + "1.8206871463679144" + ], + [ + "09:49", + "1.9245828914340635" + ], + [ + "10:00", + "1.8668829652186454" + ], + [ + "10:10", + "1.8201128160191045" + ], + [ + "10:19", + "1.978268682426275" + ], + [ + "10:30", + "1.8701458370455029" + ], + [ + "10:40", + "2.094771812403172" + ], + [ + "10:49", + "1.9264996391243223" + ], + [ + "11:00", + "2.0115241697801376" + ], + [ + "11:10", + "1.8890528447297328" + ], + [ + "11:19", + "1.8718602822932393" + ], + [ + "11:30", + "1.729244934706874" + ], + [ + "11:40", + "1.7023371519765633" + ], + [ + "11:49", + "1.6852820872051961" + ], + [ + "12:00", + "1.4877141262980942" + ], + [ + "12:10", + "1.4041030359272098" + ], + [ + "12:19", + "1.3916597772096988" + ], + [ + "12:30", + "1.5800211518972136" + ], + [ + "12:40", + "1.5396355244035203" + ], + [ + "12:49", + "1.7364645113452641" + ], + [ + "13:00", + "1.4859850478550898" + ], + [ + "13:10", + "1.4481423400894637" + ], + [ + "13:19", + "1.5463817717064134" + ], + [ + "13:30", + "1.5411816502228" + ], + [ + "13:40", + "1.606190140708574" + ], + [ + "13:49", + "1.5469754366518655" + ], + [ + "14:00", + "1.458988393457431" + ], + [ + "14:10", + "1.4792725095894197" + ], + [ + "14:19", + "1.5973796659088193" + ], + [ + "14:30", + "1.4963646438377962" + ], + [ + "14:40", + "1.5870088246759642" + ], + [ + "14:49", + "1.525772785332651" + ], + [ + "15:00", + "1.5845486996291345" + ], + [ + "15:10", + "1.4641870415507012" + ], + [ + "15:19", + "1.5979920421858518" + ], + [ + "15:30", + "1.6262551940346897" + ], + [ + "15:40", + "1.6183069940118966" + ], + [ + "15:49", + "1.6383451963939863" + ], + [ + "16:00", + "1.6666069805711012" + ], + [ + "16:10", + "1.7036955309428907" + ], + [ + "16:19", + "1.6157148544427709" + ], + [ + "16:30", + "1.8381354147209306" + ], + [ + "16:40", + "1.7345567482082735" + ], + [ + "16:49", + "1.7784448382045" + ], + [ + "17:00", + "1.8288072447417083" + ], + [ + "17:10", + "1.7667539680301856" + ], + [ + "17:19", + "1.8130468627633731" + ], + [ + "17:30", + "1.8767733170777265" + ], + [ + "17:40", + "1.9268140521293229" + ], + [ + "17:49", + "1.9199828741229807" + ], + [ + "18:00", + "1.8954803494948487" + ], + [ + "18:10", + "1.9145866788871222" + ], + [ + "18:19", + "1.903699092110373" + ], + [ + "18:30", + "2.0490404031354275" + ], + [ + "18:40", + "1.9828850314147952" + ], + [ + "18:49", + "1.9860499666788953" + ], + [ + "19:00", + "2.0802926632169596" + ], + [ + "19:10", + "2.146242781855394" + ], + [ + "19:19", + "2.0962429868217276" + ], + [ + "19:30", + "2.2321383203588465" + ], + [ + "19:40", + "2.007982825755445" + ], + [ + "19:49", + "2.119825115336382" + ], + [ + "20:00", + "2.1996567854886178" + ], + [ + "20:10", + "2.0895753135488246" + ], + [ + "20:19", + "1.9900030676360159" + ], + [ + "20:30", + "2.1176693744781003" + ], + [ + "20:40", + "1.9634044936072348" + ], + [ + "20:49", + "2.075551515661376" + ], + [ + "21:00", + "2.1192695963571753" + ], + [ + "21:10", + "2.1736824798759424" + ], + [ + "21:19", + "2.04861481796552" + ], + [ + "21:30", + "2.1103086982002024" + ], + [ + "21:40", + "2.0678824814407175" + ], + [ + "21:49", + "2.0673722653872346" + ], + [ + "22:00", + "1.8563407736797657" + ], + [ + "22:10", + "1.9093581361218963" + ], + [ + "22:19", + "2.031922690457993" + ], + [ + "22:30", + "1.8602962519389283" + ], + [ + "22:40", + "1.6780076181083035" + ], + [ + "22:49", + "1.6713634455842434" + ], + [ + "23:00", + "2.105295594892128" + ], + [ + "23:10", + "2.117148895186397" + ], + [ + "23:19", + "1.9808076671988857" + ], + [ + "23:30", + "2.151492533493434" + ], + [ + "23:40", + "2.1221418327576953" + ], + [ + "23:49", + "2.1486143696321593" + ], + [ + "00:00", + "1.7302448546099445" + ], + [ + "00:10", + "1.5080911231066974" + ], + [ + "00:19", + "1.5723201346514966" + ], + [ + "00:30", + "0.9780203191886598" + ], + [ + "00:40", + "0.9803448116902195" + ], + [ + "00:49", + "1.0309986371408735" + ], + [ + "01:00", + "1.0205067778089834" + ], + [ + "01:10", + "1.5608210214898168" + ], + [ + "01:19", + "1.0026579582359862" + ], + [ + "01:30", + "0.9993831483729843" + ], + [ + "01:40", + "1.4112562624743754" + ], + [ + "01:49", + "1.0383126327558878" + ], + [ + "02:00", + "0.908494451252358" + ], + [ + "02:10", + "1.4455518369326954" + ], + [ + "02:19", + "1.2918471070136617" + ], + [ + "02:30", + "1.0367842711574613" + ], + [ + "02:40", + "1.4442764402848374" + ], + [ + "02:49", + "0.8972925495822492" + ], + [ + "03:00", + "1.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.4735682599548785, + 1.1627080364349767, + 1.2465504888940537, + 1.4053565113133744, + 1.2271221162888657, + 1.1191358383786965, + 1.0687282447075008, + 1.260806888906587, + 1.0538831636839776, + 1.0350438003366582, + 1.2088289335328226, + 1.2417654995474776, + 1.0501726795940944, + 1.0632910912633315, + 0.978560955856779, + 1.033348615849195, + 1.0569710247148674, + 1.0457797945656429, + 0.9864900296866216, + 0.9640847806336262, + 0.9889258453706244, + 0.9695942360407832, + 1.0056338980205985, + 0.9698900964725339, + 1.0445785792367646, + 1.0898839556952493, + 1.0289550497461877, + 1.0878124361464963, + 1.084683834684128, + 1.1329150126338705, + 1.2800355559697736, + 1.337034933403239, + 1.3819699457109595, + 1.5357075637276179, + 1.5173312313097327, + 1.555867077674955, + 1.6565394114155505, + 1.5932236664592245, + 1.6836534864917674, + 1.8572112400574607, + 1.8206871463679144, + 1.9245828914340635, + 1.8668829652186454, + 1.8201128160191045, + 1.978268682426275, + 1.8701458370455029, + 2.094771812403172, + 1.9264996391243223, + 2.0115241697801376, + 1.8890528447297328, + 1.8718602822932393, + 1.729244934706874, + 1.7023371519765633, + 1.6852820872051961, + 1.4877141262980942, + 1.4041030359272098, + 1.3916597772096988, + 1.5800211518972136, + 1.5396355244035203, + 1.7364645113452641, + 1.4859850478550898, + 1.4481423400894637, + 1.5463817717064134, + 1.5411816502228, + 1.606190140708574, + 1.5469754366518655, + 1.458988393457431, + 1.4792725095894197, + 1.5973796659088193, + 1.4963646438377962, + 1.5870088246759642, + 1.525772785332651, + 1.5845486996291345, + 1.4641870415507012, + 1.5979920421858518, + 1.6262551940346897, + 1.6183069940118966, + 1.6383451963939863, + 1.6666069805711012, + 1.7036955309428907, + 1.6157148544427709, + 1.8381354147209306, + 1.7345567482082735, + 1.7784448382045, + 1.8288072447417083, + 1.7667539680301856, + 1.8130468627633731, + 1.8767733170777265, + 1.9268140521293229, + 1.9199828741229807, + 1.8954803494948487, + 1.9145866788871222, + 1.903699092110373, + 2.0490404031354275, + 1.9828850314147952, + 1.9860499666788953, + 2.0802926632169596, + 2.146242781855394, + 2.0962429868217276, + 2.2321383203588465, + 2.007982825755445, + 2.119825115336382, + 2.1996567854886178, + 2.0895753135488246, + 1.9900030676360159, + 2.1176693744781003, + 1.9634044936072348, + 2.075551515661376, + 2.1192695963571753, + 2.1736824798759424, + 2.04861481796552, + 2.1103086982002024, + 2.0678824814407175, + 2.0673722653872346, + 1.8563407736797657, + 1.9093581361218963, + 2.031922690457993, + 1.8602962519389283, + 1.6780076181083035, + 1.6713634455842434, + 2.105295594892128, + 2.117148895186397, + 1.9808076671988857, + 2.151492533493434, + 2.1221418327576953, + 2.1486143696321593, + 1.7302448546099445, + 1.5080911231066974, + 1.5723201346514966, + 0.9780203191886598, + 0.9803448116902195, + 1.0309986371408735, + 1.0205067778089834, + 1.5608210214898168, + 1.0026579582359862, + 0.9993831483729843, + 1.4112562624743754, + 1.0383126327558878, + 0.908494451252358, + 1.4455518369326954, + 1.2918471070136617, + 1.0367842711574613, + 1.4442764402848374, + 0.8972925495822492, + 1 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.497537774500297" + ], + [ + "03:10", + "1.1817928504857826" + ], + [ + "03:19", + "1.2766435346710838" + ], + [ + "03:30", + "1.3323730830628802" + ], + [ + "03:40", + "1.2057317103003986" + ], + [ + "03:49", + "1.160999464547712" + ], + [ + "04:00", + "1.049300805091383" + ], + [ + "04:10", + "1.340708981564071" + ], + [ + "04:19", + "0.9980044360629458" + ], + [ + "04:30", + "1.1891718399153004" + ], + [ + "04:40", + "1.094050981581155" + ], + [ + "04:49", + "0.9998950879406915" + ], + [ + "05:00", + "1.1092515268133802" + ], + [ + "05:10", + "1.002363745727555" + ], + [ + "05:19", + "0.9710674217695762" + ], + [ + "05:30", + "1.092025457125229" + ], + [ + "05:40", + "1.0330506546073885" + ], + [ + "05:49", + "1.0971971179371407" + ], + [ + "06:00", + "0.9602957436791891" + ], + [ + "06:10", + "0.9722331126133861" + ], + [ + "06:19", + "0.98928598584624" + ], + [ + "06:30", + "0.9610328940202467" + ], + [ + "06:40", + "1.0074415021688572" + ], + [ + "06:49", + "0.9816883189436112" + ], + [ + "07:00", + "1.0418757560408571" + ], + [ + "07:10", + "1.114364868545904" + ], + [ + "07:19", + "1.0302412614753498" + ], + [ + "07:30", + "1.1209060092778642" + ], + [ + "07:40", + "1.0615890405714081" + ], + [ + "07:49", + "1.1394676793979195" + ], + [ + "08:00", + "1.3331175965201931" + ], + [ + "08:10", + "1.383132526481189" + ], + [ + "08:19", + "1.3920273196945023" + ], + [ + "08:30", + "1.5921645099770985" + ], + [ + "08:40", + "1.5972915570524246" + ], + [ + "08:49", + "1.5431510485175166" + ], + [ + "09:00", + "1.6730688601553674" + ], + [ + "09:10", + "1.6159325900088517" + ], + [ + "09:19", + "1.7756006257057177" + ], + [ + "09:30", + "1.8731181408066673" + ], + [ + "09:40", + "1.9013102239537858" + ], + [ + "09:49", + "2.0107132692922303" + ], + [ + "10:00", + "1.9829468802025634" + ], + [ + "10:10", + "1.9249198401075907" + ], + [ + "10:19", + "2.0338254692443405" + ], + [ + "10:30", + "1.9902002867033752" + ], + [ + "10:40", + "2.1390484150075415" + ], + [ + "10:49", + "2.0708125058932088" + ], + [ + "11:00", + "2.036981208360699" + ], + [ + "11:10", + "1.9378609678946725" + ], + [ + "11:19", + "1.9837868780893626" + ], + [ + "11:30", + "1.702746697453721" + ], + [ + "11:40", + "1.7952352227301756" + ], + [ + "11:49", + "1.764085981467898" + ], + [ + "12:00", + "1.4978266055958152" + ], + [ + "12:10", + "1.3771843817207152" + ], + [ + "12:19", + "1.4519898191200091" + ], + [ + "12:30", + "1.650497814573258" + ], + [ + "12:40", + "1.6053194557822068" + ], + [ + "12:49", + "1.6684821611550504" + ], + [ + "13:00", + "1.5366142273036" + ], + [ + "13:10", + "1.4973408224716749" + ], + [ + "13:19", + "1.5352040336322414" + ], + [ + "13:30", + "1.549701728970609" + ], + [ + "13:40", + "1.6619580239184026" + ], + [ + "13:49", + "1.5817425660545623" + ], + [ + "14:00", + "1.5159611699739863" + ], + [ + "14:10", + "1.6222118870015005" + ], + [ + "14:19", + "1.5554666992132227" + ], + [ + "14:30", + "1.5464850855084031" + ], + [ + "14:40", + "1.5989472066590777" + ], + [ + "14:49", + "1.612446848864446" + ], + [ + "15:00", + "1.5120213872839574" + ], + [ + "15:10", + "1.663481010338613" + ], + [ + "15:19", + "1.5434567676510342" + ], + [ + "15:30", + "1.7240328327367505" + ], + [ + "15:40", + "1.6184859738478838" + ], + [ + "15:49", + "1.706549683695357" + ], + [ + "16:00", + "1.6786078411948302" + ], + [ + "16:10", + "1.8041224690606381" + ], + [ + "16:19", + "1.7426858812796824" + ], + [ + "16:30", + "1.8433818574196936" + ], + [ + "16:40", + "1.8093681711198824" + ], + [ + "16:49", + "1.8335513239856847" + ], + [ + "17:00", + "1.991148810137012" + ], + [ + "17:10", + "1.8685148937233738" + ], + [ + "17:19", + "1.8732634078255235" + ], + [ + "17:30", + "1.9535946585793005" + ], + [ + "17:40", + "2.091152238534487" + ], + [ + "17:49", + "1.9611691523232846" + ], + [ + "18:00", + "1.9591293278643156" + ], + [ + "18:10", + "2.0718475166968764" + ], + [ + "18:19", + "1.8811475712341292" + ], + [ + "18:30", + "2.163499257948448" + ], + [ + "18:40", + "2.08224191013266" + ], + [ + "18:49", + "2.126871316726106" + ], + [ + "19:00", + "2.186251747319234" + ], + [ + "19:10", + "2.25383663668643" + ], + [ + "19:19", + "2.192869120323812" + ], + [ + "19:30", + "2.328162457214567" + ], + [ + "19:40", + "2.1420354469755556" + ], + [ + "19:49", + "2.233006574678219" + ], + [ + "20:00", + "2.2920777185621515" + ], + [ + "20:10", + "2.147110377440079" + ], + [ + "20:19", + "2.178193001898934" + ], + [ + "20:30", + "2.2056864094783055" + ], + [ + "20:40", + "2.1932638109067297" + ], + [ + "20:49", + "2.0714948939280897" + ], + [ + "21:00", + "2.1879722277570246" + ], + [ + "21:10", + "2.2275056080547224" + ], + [ + "21:19", + "2.2150691559402094" + ], + [ + "21:30", + "2.1946503158534165" + ], + [ + "21:40", + "2.2836215269865794" + ], + [ + "21:49", + "2.1084921915662163" + ], + [ + "22:00", + "1.8780189250497412" + ], + [ + "22:10", + "1.9686565917347358" + ], + [ + "22:19", + "2.1807647261134733" + ], + [ + "22:30", + "1.8432839001983967" + ], + [ + "22:40", + "1.8053180054692333" + ], + [ + "22:49", + "1.7132558689555086" + ], + [ + "23:00", + "2.3185084925599697" + ], + [ + "23:10", + "2.2995215208836886" + ], + [ + "23:19", + "2.072716460295491" + ], + [ + "23:30", + "2.273112626186331" + ], + [ + "23:40", + "2.2719658042132598" + ], + [ + "23:49", + "2.22433043749901" + ], + [ + "00:00", + "1.6923947969899042" + ], + [ + "00:10", + "1.6380023318396586" + ], + [ + "00:19", + "1.5972156613208333" + ], + [ + "00:30", + "0.9479027624190814" + ], + [ + "00:40", + "1.0282400677999928" + ], + [ + "00:49", + "1.0238436839055907" + ], + [ + "01:00", + "1.054060856966717" + ], + [ + "01:10", + "1.4741204591681352" + ], + [ + "01:19", + "1.0074061577729512" + ], + [ + "01:30", + "0.9820513065318871" + ], + [ + "01:40", + "1.3648845097964393" + ], + [ + "01:49", + "0.9492511398107996" + ], + [ + "02:00", + "1.3120941072185168" + ], + [ + "02:10", + "1.2053603049820807" + ], + [ + "02:19", + "1.2113281986788214" + ], + [ + "02:30", + "1.2241246301395452" + ], + [ + "02:40", + "1.0474702735957315" + ], + [ + "02:49", + "1.2889616109419222" + ], + [ + "03:00", + "1.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.497537774500297, + 1.1817928504857826, + 1.2766435346710838, + 1.3323730830628802, + 1.2057317103003986, + 1.160999464547712, + 1.049300805091383, + 1.340708981564071, + 0.9980044360629458, + 1.1891718399153004, + 1.094050981581155, + 0.9998950879406915, + 1.1092515268133802, + 1.002363745727555, + 0.9710674217695762, + 1.092025457125229, + 1.0330506546073885, + 1.0971971179371407, + 0.9602957436791891, + 0.9722331126133861, + 0.98928598584624, + 0.9610328940202467, + 1.0074415021688572, + 0.9816883189436112, + 1.0418757560408571, + 1.114364868545904, + 1.0302412614753498, + 1.1209060092778642, + 1.0615890405714081, + 1.1394676793979195, + 1.3331175965201931, + 1.383132526481189, + 1.3920273196945023, + 1.5921645099770985, + 1.5972915570524246, + 1.5431510485175166, + 1.6730688601553674, + 1.6159325900088517, + 1.7756006257057177, + 1.8731181408066673, + 1.9013102239537858, + 2.0107132692922303, + 1.9829468802025634, + 1.9249198401075907, + 2.0338254692443405, + 1.9902002867033752, + 2.1390484150075415, + 2.0708125058932088, + 2.036981208360699, + 1.9378609678946725, + 1.9837868780893626, + 1.702746697453721, + 1.7952352227301756, + 1.764085981467898, + 1.4978266055958152, + 1.3771843817207152, + 1.4519898191200091, + 1.650497814573258, + 1.6053194557822068, + 1.6684821611550504, + 1.5366142273036, + 1.4973408224716749, + 1.5352040336322414, + 1.549701728970609, + 1.6619580239184026, + 1.5817425660545623, + 1.5159611699739863, + 1.6222118870015005, + 1.5554666992132227, + 1.5464850855084031, + 1.5989472066590777, + 1.612446848864446, + 1.5120213872839574, + 1.663481010338613, + 1.5434567676510342, + 1.7240328327367505, + 1.6184859738478838, + 1.706549683695357, + 1.6786078411948302, + 1.8041224690606381, + 1.7426858812796824, + 1.8433818574196936, + 1.8093681711198824, + 1.8335513239856847, + 1.991148810137012, + 1.8685148937233738, + 1.8732634078255235, + 1.9535946585793005, + 2.091152238534487, + 1.9611691523232846, + 1.9591293278643156, + 2.0718475166968764, + 1.8811475712341292, + 2.163499257948448, + 2.08224191013266, + 2.126871316726106, + 2.186251747319234, + 2.25383663668643, + 2.192869120323812, + 2.328162457214567, + 2.1420354469755556, + 2.233006574678219, + 2.2920777185621515, + 2.147110377440079, + 2.178193001898934, + 2.2056864094783055, + 2.1932638109067297, + 2.0714948939280897, + 2.1879722277570246, + 2.2275056080547224, + 2.2150691559402094, + 2.1946503158534165, + 2.2836215269865794, + 2.1084921915662163, + 1.8780189250497412, + 1.9686565917347358, + 2.1807647261134733, + 1.8432839001983967, + 1.8053180054692333, + 1.7132558689555086, + 2.3185084925599697, + 2.2995215208836886, + 2.072716460295491, + 2.273112626186331, + 2.2719658042132598, + 2.22433043749901, + 1.6923947969899042, + 1.6380023318396586, + 1.5972156613208333, + 0.9479027624190814, + 1.0282400677999928, + 1.0238436839055907, + 1.054060856966717, + 1.4741204591681352, + 1.0074061577729512, + 0.9820513065318871, + 1.3648845097964393, + 0.9492511398107996, + 1.3120941072185168, + 1.2053603049820807, + 1.2113281986788214, + 1.2241246301395452, + 1.0474702735957315, + 1.2889616109419222, + 1 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average occupancy by time bin (OD_dist-weighted) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Average occupancy" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "1.2539910618250936" + ], + [ + "03:10", + "1.0856753728996447" + ], + [ + "03:19", + "1.4506045788554864" + ], + [ + "03:30", + "1.39893283658915" + ], + [ + "03:40", + "1.1213347276884802" + ], + [ + "03:49", + "1.0548218043388635" + ], + [ + "04:00", + "1.1269347057339092" + ], + [ + "04:10", + "1.183315922030218" + ], + [ + "04:19", + "1.020977082138179" + ], + [ + "04:30", + "1.1270128806263786" + ], + [ + "04:40", + "1.1263681399418604" + ], + [ + "04:49", + "1.118083187971494" + ], + [ + "05:00", + "0.9897878521213063" + ], + [ + "05:10", + "0.9699007539618653" + ], + [ + "05:19", + "1.0818312572990452" + ], + [ + "05:30", + "1.0856437631284126" + ], + [ + "05:40", + "1.0674782599651953" + ], + [ + "05:49", + "0.9811777087669468" + ], + [ + "06:00", + "0.9688417647786189" + ], + [ + "06:10", + "0.9251838620543567" + ], + [ + "06:19", + "0.9683619696413023" + ], + [ + "06:30", + "1.0209246384536417" + ], + [ + "06:40", + "0.9779619172742089" + ], + [ + "06:49", + "0.9256885449852714" + ], + [ + "07:00", + "1.061987673659908" + ], + [ + "07:10", + "1.036518467324717" + ], + [ + "07:19", + "1.0321799612950202" + ], + [ + "07:30", + "1.0951012329242487" + ], + [ + "07:40", + "1.0645670515151604" + ], + [ + "07:49", + "1.1199188585361046" + ], + [ + "08:00", + "1.296708106715972" + ], + [ + "08:10", + "1.2910624251454585" + ], + [ + "08:19", + "1.2848943927871044" + ], + [ + "08:30", + "1.442780474793665" + ], + [ + "08:40", + "1.4349704104992251" + ], + [ + "08:49", + "1.4401307976454372" + ], + [ + "09:00", + "1.5087555110510038" + ], + [ + "09:10", + "1.5891807749918847" + ], + [ + "09:19", + "1.5555066872545613" + ], + [ + "09:30", + "1.6482125215395373" + ], + [ + "09:40", + "1.6927817938564795" + ], + [ + "09:49", + "1.6642632986145796" + ], + [ + "10:00", + "1.7255967433933863" + ], + [ + "10:10", + "1.7615758260972627" + ], + [ + "10:19", + "1.6954755490847238" + ], + [ + "10:30", + "1.8345978388881383" + ], + [ + "10:40", + "1.6912542690332335" + ], + [ + "10:49", + "1.7828530739005293" + ], + [ + "11:00", + "1.7882051207781073" + ], + [ + "11:10", + "1.6964001929007024" + ], + [ + "11:19", + "1.7344908755574489" + ], + [ + "11:30", + "1.6457586680994094" + ], + [ + "11:40", + "1.5859841301566848" + ], + [ + "11:49", + "1.5376239137665637" + ], + [ + "12:00", + "1.406096761351721" + ], + [ + "12:10", + "1.3849373042627509" + ], + [ + "12:19", + "1.368628588171102" + ], + [ + "12:30", + "1.4867019672825126" + ], + [ + "12:40", + "1.438708240345497" + ], + [ + "12:49", + "1.5602385095048719" + ], + [ + "13:00", + "1.5669961325676882" + ], + [ + "13:10", + "1.42494421695802" + ], + [ + "13:19", + "1.3873811114046888" + ], + [ + "13:30", + "1.4680296664950658" + ], + [ + "13:40", + "1.511599784000429" + ], + [ + "13:49", + "1.4935745743916866" + ], + [ + "14:00", + "1.4060332951717749" + ], + [ + "14:10", + "1.5017317613473715" + ], + [ + "14:19", + "1.4703927740714626" + ], + [ + "14:30", + "1.4371220011099988" + ], + [ + "14:40", + "1.5068676690735445" + ], + [ + "14:49", + "1.4478117357821705" + ], + [ + "15:00", + "1.4196435727071088" + ], + [ + "15:10", + "1.4903427569533385" + ], + [ + "15:19", + "1.4698244938793883" + ], + [ + "15:30", + "1.5505846863487387" + ], + [ + "15:40", + "1.533519879787878" + ], + [ + "15:49", + "1.5667786069174539" + ], + [ + "16:00", + "1.5778047809114366" + ], + [ + "16:10", + "1.5555200473410558" + ], + [ + "16:19", + "1.564869119125043" + ], + [ + "16:30", + "1.698682981767884" + ], + [ + "16:40", + "1.6872971414285893" + ], + [ + "16:49", + "1.6493481770759535" + ], + [ + "17:00", + "1.7060311521985225" + ], + [ + "17:10", + "1.7137124903923262" + ], + [ + "17:19", + "1.6376606553417676" + ], + [ + "17:30", + "1.7895981600845021" + ], + [ + "17:40", + "1.7412522178219008" + ], + [ + "17:49", + "1.715352448907016" + ], + [ + "18:00", + "1.7857796975493536" + ], + [ + "18:10", + "1.7331170595870433" + ], + [ + "18:19", + "1.791502017081316" + ], + [ + "18:30", + "1.8519412914338227" + ], + [ + "18:40", + "1.8291994298199865" + ], + [ + "18:49", + "1.823260530908403" + ], + [ + "19:00", + "1.8865026719965499" + ], + [ + "19:10", + "1.901366011141666" + ], + [ + "19:19", + "1.938707110039195" + ], + [ + "19:30", + "1.97263533191086" + ], + [ + "19:40", + "1.8903750453346955" + ], + [ + "19:49", + "1.8792997080904943" + ], + [ + "20:00", + "1.9818921649480923" + ], + [ + "20:10", + "1.879964175983358" + ], + [ + "20:19", + "1.9345212266640923" + ], + [ + "20:30", + "1.9041762738192747" + ], + [ + "20:40", + "1.8202001845845146" + ], + [ + "20:49", + "1.8602091573942137" + ], + [ + "21:00", + "1.9046104065816931" + ], + [ + "21:10", + "1.9458201089413423" + ], + [ + "21:19", + "1.8657575666693111" + ], + [ + "21:30", + "1.9123086016829915" + ], + [ + "21:40", + "1.890408253433916" + ], + [ + "21:49", + "1.860057532127748" + ], + [ + "22:00", + "1.768405111248504" + ], + [ + "22:10", + "1.7228262662065983" + ], + [ + "22:19", + "1.7600741446233072" + ], + [ + "22:30", + "1.7351119281990313" + ], + [ + "22:40", + "1.627579637809477" + ], + [ + "22:49", + "1.5026127534180285" + ], + [ + "23:00", + "1.8668294834726493" + ], + [ + "23:10", + "1.921586028950252" + ], + [ + "23:19", + "1.859944045343084" + ], + [ + "23:30", + "1.9421573552577784" + ], + [ + "23:40", + "1.9996994539344555" + ], + [ + "23:49", + "1.8589087984770138" + ], + [ + "00:00", + "1.6627462508277173" + ], + [ + "00:10", + "1.4912009784351483" + ], + [ + "00:19", + "1.5628532968400852" + ], + [ + "00:30", + "0.9781458275090296" + ], + [ + "00:40", + "0.9812069092694643" + ], + [ + "00:49", + "1.0182492746801393" + ], + [ + "01:00", + "1.0080667767153983" + ], + [ + "01:10", + "1.1416978645073563" + ], + [ + "01:19", + "1.1811130366714149" + ], + [ + "01:30", + "1.0561868544820934" + ], + [ + "01:40", + "1.0768999151158571" + ], + [ + "01:49", + "0.9842344139042237" + ], + [ + "02:00", + "1.5838487306115105" + ], + [ + "02:10", + "1.1065686921529496" + ], + [ + "02:19", + "1.2924803345972495" + ], + [ + "02:30", + "0.9596692985545329" + ], + [ + "02:40", + "0.9956463783304861" + ], + [ + "02:49", + "1.17815968919917" + ], + [ + "03:00", + "2.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24 + ], + "y": [ + 1.2539910618250936, + 1.0856753728996447, + 1.4506045788554864, + 1.39893283658915, + 1.1213347276884802, + 1.0548218043388635, + 1.1269347057339092, + 1.183315922030218, + 1.020977082138179, + 1.1270128806263786, + 1.1263681399418604, + 1.118083187971494, + 0.9897878521213063, + 0.9699007539618653, + 1.0818312572990452, + 1.0856437631284126, + 1.0674782599651953, + 0.9811777087669468, + 0.9688417647786189, + 0.9251838620543567, + 0.9683619696413023, + 1.0209246384536417, + 0.9779619172742089, + 0.9256885449852714, + 1.061987673659908, + 1.036518467324717, + 1.0321799612950202, + 1.0951012329242487, + 1.0645670515151604, + 1.1199188585361046, + 1.296708106715972, + 1.2910624251454585, + 1.2848943927871044, + 1.442780474793665, + 1.4349704104992251, + 1.4401307976454372, + 1.5087555110510038, + 1.5891807749918847, + 1.5555066872545613, + 1.6482125215395373, + 1.6927817938564795, + 1.6642632986145796, + 1.7255967433933863, + 1.7615758260972627, + 1.6954755490847238, + 1.8345978388881383, + 1.6912542690332335, + 1.7828530739005293, + 1.7882051207781073, + 1.6964001929007024, + 1.7344908755574489, + 1.6457586680994094, + 1.5859841301566848, + 1.5376239137665637, + 1.406096761351721, + 1.3849373042627509, + 1.368628588171102, + 1.4867019672825126, + 1.438708240345497, + 1.5602385095048719, + 1.5669961325676882, + 1.42494421695802, + 1.3873811114046888, + 1.4680296664950658, + 1.511599784000429, + 1.4935745743916866, + 1.4060332951717749, + 1.5017317613473715, + 1.4703927740714626, + 1.4371220011099988, + 1.5068676690735445, + 1.4478117357821705, + 1.4196435727071088, + 1.4903427569533385, + 1.4698244938793883, + 1.5505846863487387, + 1.533519879787878, + 1.5667786069174539, + 1.5778047809114366, + 1.5555200473410558, + 1.564869119125043, + 1.698682981767884, + 1.6872971414285893, + 1.6493481770759535, + 1.7060311521985225, + 1.7137124903923262, + 1.6376606553417676, + 1.7895981600845021, + 1.7412522178219008, + 1.715352448907016, + 1.7857796975493536, + 1.7331170595870433, + 1.791502017081316, + 1.8519412914338227, + 1.8291994298199865, + 1.823260530908403, + 1.8865026719965499, + 1.901366011141666, + 1.938707110039195, + 1.97263533191086, + 1.8903750453346955, + 1.8792997080904943, + 1.9818921649480923, + 1.879964175983358, + 1.9345212266640923, + 1.9041762738192747, + 1.8202001845845146, + 1.8602091573942137, + 1.9046104065816931, + 1.9458201089413423, + 1.8657575666693111, + 1.9123086016829915, + 1.890408253433916, + 1.860057532127748, + 1.768405111248504, + 1.7228262662065983, + 1.7600741446233072, + 1.7351119281990313, + 1.627579637809477, + 1.5026127534180285, + 1.8668294834726493, + 1.921586028950252, + 1.859944045343084, + 1.9421573552577784, + 1.9996994539344555, + 1.8589087984770138, + 1.6627462508277173, + 1.4912009784351483, + 1.5628532968400852, + 0.9781458275090296, + 0.9812069092694643, + 1.0182492746801393, + 1.0080667767153983, + 1.1416978645073563, + 1.1811130366714149, + 1.0561868544820934, + 1.0768999151158571, + 0.9842344139042237, + 1.5838487306115105, + 1.1065686921529496, + 1.2924803345972495, + 0.9596692985545329, + 0.9956463783304861, + 1.17815968919917, + 2 + ] + }, + { + "customdata": [ + [ + "03:00", + "1.3615753017291958" + ], + [ + "03:10", + "1.389739804348231" + ], + [ + "03:19", + "1.3592087610331118" + ], + [ + "03:30", + "1.3699744360969899" + ], + [ + "03:40", + "1.351603507683002" + ], + [ + "03:49", + "1.3560761784751378" + ], + [ + "04:00", + "1.3670678662858355" + ], + [ + "04:10", + "1.367431288353108" + ], + [ + "04:19", + "1.3686899446787122" + ], + [ + "04:30", + "1.4160722468930547" + ], + [ + "04:40", + "1.3948248318327239" + ], + [ + "04:49", + "1.3857203539251335" + ], + [ + "05:00", + "1.4483823604164425" + ], + [ + "05:10", + "1.461824411501473" + ], + [ + "05:19", + "1.435192487985569" + ], + [ + "05:30", + "1.4869944895544924" + ], + [ + "05:40", + "1.4940469429216614" + ], + [ + "05:49", + "1.4695108492452076" + ], + [ + "06:00", + "1.5005146609812483" + ], + [ + "06:10", + "1.4871024682339369" + ], + [ + "06:19", + "1.4728661813400317" + ], + [ + "06:30", + "1.5250940758424465" + ], + [ + "06:40", + "1.493488345211369" + ], + [ + "06:49", + "1.4647902403679294" + ], + [ + "07:00", + "1.4783320609722683" + ], + [ + "07:10", + "1.4593610142958786" + ], + [ + "07:19", + "1.4696314847141734" + ], + [ + "07:30", + "1.4323747041883952" + ], + [ + "07:40", + "1.4438437143038163" + ], + [ + "07:49", + "1.449264710416674" + ], + [ + "08:00", + "1.4757347990708745" + ], + [ + "08:10", + "1.4661268897059905" + ], + [ + "08:19", + "1.4539696975531067" + ], + [ + "08:30", + "1.4979778901537626" + ], + [ + "08:40", + "1.4777341236490114" + ], + [ + "08:49", + "1.4853334349648455" + ], + [ + "09:00", + "1.5297685840268649" + ], + [ + "09:10", + "1.5124564701114105" + ], + [ + "09:19", + "1.5145939454067305" + ], + [ + "09:30", + "1.5524477846463114" + ], + [ + "09:40", + "1.5433542903778446" + ], + [ + "09:49", + "1.5565424188036203" + ], + [ + "10:00", + "1.5825943881146671" + ], + [ + "10:10", + "1.5753406724671217" + ], + [ + "10:19", + "1.5905322462721283" + ], + [ + "10:30", + "1.5969833076846534" + ], + [ + "10:40", + "1.6197120159895104" + ], + [ + "10:49", + "1.6175820458433425" + ], + [ + "11:00", + "1.6042922794782197" + ], + [ + "11:10", + "1.5943417082968108" + ], + [ + "11:19", + "1.5862790461230423" + ], + [ + "11:30", + "1.5126897827130315" + ], + [ + "11:40", + "1.5357057988522744" + ], + [ + "11:49", + "1.532132776781461" + ], + [ + "12:00", + "1.528923013018114" + ], + [ + "12:10", + "1.5291342221264328" + ], + [ + "12:19", + "1.5246450070672655" + ], + [ + "12:30", + "1.5440525432798584" + ], + [ + "12:40", + "1.547536897254248" + ], + [ + "12:49", + "1.547632675967562" + ], + [ + "13:00", + "1.5603979684858351" + ], + [ + "13:10", + "1.558014333153263" + ], + [ + "13:19", + "1.558400802953865" + ], + [ + "13:30", + "1.5754976311638247" + ], + [ + "13:40", + "1.5704909807393885" + ], + [ + "13:49", + "1.5757325441064978" + ], + [ + "14:00", + "1.5531412604696946" + ], + [ + "14:10", + "1.555850164222135" + ], + [ + "14:19", + "1.5589675006694272" + ], + [ + "14:30", + "1.5332534021667967" + ], + [ + "14:40", + "1.5322930791487532" + ], + [ + "14:49", + "1.5323228634091415" + ], + [ + "15:00", + "1.5127799730416744" + ], + [ + "15:10", + "1.513162002321217" + ], + [ + "15:19", + "1.5297909674999586" + ], + [ + "15:30", + "1.5236197127467836" + ], + [ + "15:40", + "1.5230818456310893" + ], + [ + "15:49", + "1.5210194903051024" + ], + [ + "16:00", + "1.5184193483846415" + ], + [ + "16:10", + "1.521695027675504" + ], + [ + "16:19", + "1.5145904776556025" + ], + [ + "16:30", + "1.530671153362508" + ], + [ + "16:40", + "1.5348961692728338" + ], + [ + "16:49", + "1.5357525436124895" + ], + [ + "17:00", + "1.5613234803731053" + ], + [ + "17:10", + "1.5570032169185053" + ], + [ + "17:19", + "1.5618154249955811" + ], + [ + "17:30", + "1.5821954464982289" + ], + [ + "17:40", + "1.5785709244011552" + ], + [ + "17:49", + "1.5779378339967691" + ], + [ + "18:00", + "1.5955086370374687" + ], + [ + "18:10", + "1.5914876506119395" + ], + [ + "18:19", + "1.5864569105172939" + ], + [ + "18:30", + "1.6163363923885594" + ], + [ + "18:40", + "1.5965499209794607" + ], + [ + "18:49", + "1.5974185724522159" + ], + [ + "19:00", + "1.6384041240191214" + ], + [ + "19:10", + "1.6259374612751334" + ], + [ + "19:19", + "1.637117824132755" + ], + [ + "19:30", + "1.6460771430840793" + ], + [ + "19:40", + "1.6298790923488153" + ], + [ + "19:49", + "1.629862751380065" + ], + [ + "20:00", + "1.6362759296863796" + ], + [ + "20:10", + "1.6188758579089737" + ], + [ + "20:19", + "1.6139391291643364" + ], + [ + "20:30", + "1.621073776694557" + ], + [ + "20:40", + "1.6230403039791794" + ], + [ + "20:49", + "1.6164668795820798" + ], + [ + "21:00", + "1.6554284512527242" + ], + [ + "21:10", + "1.6493856701780198" + ], + [ + "21:19", + "1.6408790756547469" + ], + [ + "21:30", + "1.6814940720469378" + ], + [ + "21:40", + "1.6449782505502561" + ], + [ + "21:49", + "1.6455014488762392" + ], + [ + "22:00", + "1.6631891135574748" + ], + [ + "22:10", + "1.6487286850205267" + ], + [ + "22:19", + "1.6399527013584803" + ], + [ + "22:30", + "1.59059202216658" + ], + [ + "22:40", + "1.5880115827939922" + ], + [ + "22:49", + "1.5734931533373724" + ], + [ + "23:00", + "1.5879525072908254" + ], + [ + "23:10", + "1.5773396019668393" + ], + [ + "23:19", + "1.5812858577563096" + ], + [ + "23:30", + "1.5426492293585319" + ], + [ + "23:40", + "1.5982270981753899" + ], + [ + "23:49", + "1.5943012584060525" + ], + [ + "00:00", + "1.5486669672908038" + ], + [ + "00:10", + "1.4507513367906235" + ], + [ + "00:19", + "1.4358359072802205" + ], + [ + "00:30", + "1.4275160659662933" + ], + [ + "00:40", + "1.4068704867102597" + ], + [ + "00:49", + "1.402708587010174" + ], + [ + "01:00", + "1.3689098493561362" + ], + [ + "01:10", + "1.361045025070265" + ], + [ + "01:19", + "1.3455641478978617" + ], + [ + "01:30", + "1.3298174959758797" + ], + [ + "01:40", + "1.3535491614771749" + ], + [ + "01:49", + "1.3765090111868459" + ], + [ + "02:00", + "1.3516830063104097" + ], + [ + "02:10", + "1.3533935915889959" + ], + [ + "02:19", + "1.3539303029670404" + ], + [ + "02:30", + "1.3350546109124148" + ], + [ + "02:40", + "1.350147632173103" + ], + [ + "02:49", + "1.336920396627511" + ], + [ + "03:00", + "1.475160350771077" + ], + [ + "03:10", + "1.109813014871216" + ], + [ + "03:19", + "1.0546658240158486" + ], + [ + "03:30", + "1.1864513339666507" + ], + [ + "03:40", + "1.0616992235774967" + ], + [ + "03:49", + "1.1939076999708644" + ], + [ + "04:00", + "1.11084571112157" + ], + [ + "04:10", + "1.0" + ], + [ + "04:19", + "1.1536316973559988" + ], + [ + "04:30", + "1.0" + ], + [ + "04:40", + "1.0" + ], + [ + "04:49", + "1.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332, + 25.5, + 25.666666666666668, + 25.833333333333332 + ], + "y": [ + 1.3615753017291958, + 1.389739804348231, + 1.3592087610331118, + 1.3699744360969899, + 1.351603507683002, + 1.3560761784751378, + 1.3670678662858355, + 1.367431288353108, + 1.3686899446787122, + 1.4160722468930547, + 1.3948248318327239, + 1.3857203539251335, + 1.4483823604164425, + 1.461824411501473, + 1.435192487985569, + 1.4869944895544924, + 1.4940469429216614, + 1.4695108492452076, + 1.5005146609812483, + 1.4871024682339369, + 1.4728661813400317, + 1.5250940758424465, + 1.493488345211369, + 1.4647902403679294, + 1.4783320609722683, + 1.4593610142958786, + 1.4696314847141734, + 1.4323747041883952, + 1.4438437143038163, + 1.449264710416674, + 1.4757347990708745, + 1.4661268897059905, + 1.4539696975531067, + 1.4979778901537626, + 1.4777341236490114, + 1.4853334349648455, + 1.5297685840268649, + 1.5124564701114105, + 1.5145939454067305, + 1.5524477846463114, + 1.5433542903778446, + 1.5565424188036203, + 1.5825943881146671, + 1.5753406724671217, + 1.5905322462721283, + 1.5969833076846534, + 1.6197120159895104, + 1.6175820458433425, + 1.6042922794782197, + 1.5943417082968108, + 1.5862790461230423, + 1.5126897827130315, + 1.5357057988522744, + 1.532132776781461, + 1.528923013018114, + 1.5291342221264328, + 1.5246450070672655, + 1.5440525432798584, + 1.547536897254248, + 1.547632675967562, + 1.5603979684858351, + 1.558014333153263, + 1.558400802953865, + 1.5754976311638247, + 1.5704909807393885, + 1.5757325441064978, + 1.5531412604696946, + 1.555850164222135, + 1.5589675006694272, + 1.5332534021667967, + 1.5322930791487532, + 1.5323228634091415, + 1.5127799730416744, + 1.513162002321217, + 1.5297909674999586, + 1.5236197127467836, + 1.5230818456310893, + 1.5210194903051024, + 1.5184193483846415, + 1.521695027675504, + 1.5145904776556025, + 1.530671153362508, + 1.5348961692728338, + 1.5357525436124895, + 1.5613234803731053, + 1.5570032169185053, + 1.5618154249955811, + 1.5821954464982289, + 1.5785709244011552, + 1.5779378339967691, + 1.5955086370374687, + 1.5914876506119395, + 1.5864569105172939, + 1.6163363923885594, + 1.5965499209794607, + 1.5974185724522159, + 1.6384041240191214, + 1.6259374612751334, + 1.637117824132755, + 1.6460771430840793, + 1.6298790923488153, + 1.629862751380065, + 1.6362759296863796, + 1.6188758579089737, + 1.6139391291643364, + 1.621073776694557, + 1.6230403039791794, + 1.6164668795820798, + 1.6554284512527242, + 1.6493856701780198, + 1.6408790756547469, + 1.6814940720469378, + 1.6449782505502561, + 1.6455014488762392, + 1.6631891135574748, + 1.6487286850205267, + 1.6399527013584803, + 1.59059202216658, + 1.5880115827939922, + 1.5734931533373724, + 1.5879525072908254, + 1.5773396019668393, + 1.5812858577563096, + 1.5426492293585319, + 1.5982270981753899, + 1.5943012584060525, + 1.5486669672908038, + 1.4507513367906235, + 1.4358359072802205, + 1.4275160659662933, + 1.4068704867102597, + 1.402708587010174, + 1.3689098493561362, + 1.361045025070265, + 1.3455641478978617, + 1.3298174959758797, + 1.3535491614771749, + 1.3765090111868459, + 1.3516830063104097, + 1.3533935915889959, + 1.3539303029670404, + 1.3350546109124148, + 1.350147632173103, + 1.336920396627511, + 1.475160350771077, + 1.109813014871216, + 1.0546658240158486, + 1.1864513339666507, + 1.0616992235774967, + 1.1939076999708644, + 1.11084571112157, + 1, + 1.1536316973559988, + 1, + 1, + 1 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Average occupancy by time bin (OD_dist-weighted) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Average occupancy" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_occupancy_by_time_bin(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " OD_dist-weighted average occupancy by *native time bin* (depart_bin),\n", + " including deadheading trips.\n", + " \"\"\"\n", + " occ = pd.to_numeric(new_df[\"occupancy\"], errors=\"coerce\")\n", + " dist = pd.to_numeric(new_df[dist_col_new], errors=\"coerce\")\n", + " bins = pd.to_numeric(new_df[\"depart_bin\"], errors=\"coerce\")\n", + "\n", + " valid = (\n", + " bins.notna()\n", + " & dist.notna()\n", + " & occ.notna()\n", + " )\n", + " if not valid.any():\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " df = pd.DataFrame({\n", + " \"depart_bin_int\": bins[valid].astype(int),\n", + " \"occ\": occ[valid].astype(float),\n", + " \"dist\": dist[valid].astype(float),\n", + " })\n", + "\n", + " # OD_dist-weighted average occupancy per *depart_bin*\n", + " df[\"wv\"] = df[\"occ\"] * df[\"dist\"]\n", + "\n", + " agg = (\n", + " df.groupby(\"depart_bin_int\")\n", + " .agg(sum_w=(\"dist\", \"sum\"), sum_wv=(\"wv\", \"sum\"), n=(\"occ\", \"size\"))\n", + " .reset_index()\n", + " )\n", + " agg = agg[agg[\"sum_w\"] > 0]\n", + " agg[\"avg_occupancy\"] = (agg[\"sum_wv\"] / agg[\"sum_w\"]).astype(float)\n", + "\n", + " # Native time bins → clock time using bin_minutes\n", + " # Example: bin 0 = 3:00, bin 1 = 3:00 + bin_minutes, etc.\n", + " times = start_time + pd.to_timedelta(agg[\"depart_bin_int\"] * bin_minutes, unit=\"m\")\n", + " vals = agg[\"avg_occupancy\"].values\n", + "\n", + " out = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " out[\"hover\"] = [\n", + " f\"Time: {t:%H:%M} | Avg occ: {v:.3f} (legs: {int(n):,}, total OD_dist: {w:,.1f})\"\n", + " for t, v, n, w in zip(times, vals, agg[\"n\"], agg[\"sum_w\"])\n", + " ]\n", + " return out\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_occupancy_by_time_bin,\n", + " \"Average occupancy by time bin (OD_dist-weighted)\",\n", + " \"Average occupancy\",\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# def metric_occupancy_by_hour(new_df, pooled_df, scenario, bin_minutes):\n", + "# \"\"\"\n", + "# OD_dist-weighted average occupancy by hour of day, including deadheading trips.\n", + "# \"\"\"\n", + "# occ = pd.to_numeric(new_df[\"occupancy\"], errors=\"coerce\")\n", + "# dist = pd.to_numeric(new_df[dist_col_new], errors=\"coerce\")\n", + "# bins = pd.to_numeric(new_df[\"depart_bin\"], errors=\"coerce\")\n", + "\n", + "# valid = (\n", + "# bins.notna()\n", + "# & dist.notna() \n", + "# & occ.notna() \n", + "# )\n", + "# if not valid.any():\n", + "# return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + "# df = pd.DataFrame({\n", + "# \"depart_bin_int\": bins[valid].astype(int),\n", + "# \"occ\": occ[valid].astype(float),\n", + "# \"dist\": dist[valid].astype(float),\n", + "# })\n", + "\n", + "# # hour_from_3am based on elapsed minutes = depart_bin * bin_minutes\n", + "# df[\"hour_from_3am\"] = ((df[\"depart_bin_int\"] * bin_minutes) // 60).astype(int)\n", + "# df[\"wv\"] = df[\"occ\"] * df[\"dist\"]\n", + "\n", + "# agg = (\n", + "# df.groupby(\"hour_from_3am\")\n", + "# .agg(sum_w=(\"dist\", \"sum\"), sum_wv=(\"wv\", \"sum\"), n=(\"occ\", \"size\"))\n", + "# .reset_index()\n", + "# )\n", + "# agg = agg[agg[\"sum_w\"] > 0]\n", + "# agg[\"avg_occupancy\"] = (agg[\"sum_wv\"] / agg[\"sum_w\"]).astype(float)\n", + "\n", + "# times = start_time + pd.to_timedelta(agg[\"hour_from_3am\"] * 60, unit=\"m\")\n", + "# vals = agg[\"avg_occupancy\"].values\n", + "\n", + "# out = pd.DataFrame({\"x\": times, \"y\": vals})\n", + "# out[\"hover\"] = [\n", + "# f\"Avg occ: {v:.3f} (legs: {int(n):,}, total OD_dist: {w:,.1f})\"\n", + "# for v, n, w in zip(vals, agg[\"n\"], agg[\"sum_w\"])\n", + "# ]\n", + "# return out\n", + "\n", + "\n", + "# run_timeseries_metric(\n", + "# metric_occupancy_by_hour,\n", + "# \"Average occupancy by hour (OD_dist-weighted)\",\n", + "# \"Average occupancy\",\n", + "# )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Occupancy by veh trips and VMT — time_bin_size\n", + " avg_occ_by_trip avg_occ_by_vmt\n", + "scenario \n", + "base 0.933701 1.589033\n", + "timebin_5 0.932447 1.564145\n", + "timebin_15 0.934670 1.601782\n", + "\n", + "Occupancy by veh trips and VMT — max_detour\n", + " avg_occ_by_trip avg_occ_by_vmt\n", + "scenario \n", + "base 0.933701 1.589033\n", + "detour_5 0.930064 1.587440\n", + "detour_10 0.931596 1.587707\n", + "detour_20 0.934698 1.588779\n", + "\n", + "Occupancy by veh trips and VMT — max_occupancy\n", + " avg_occ_by_trip avg_occ_by_vmt\n", + "scenario \n", + "base 0.933701 1.589033\n", + "occ_6 0.998006 1.697590\n", + "occ_8 1.039218 1.754532\n", + "\n", + "Occupancy by veh trips and VMT — tnc_shared_demand\n", + " avg_occ_by_trip avg_occ_by_vmt\n", + "scenario \n", + "base 0.933701 1.589033\n", + "shift_to_all_shared_tnc 1.041364 1.537540\n" + ] + } + ], + "source": [ + "def metric_occupancy_trip_vmt(new_df, pooled_df):\n", + " occ = pd.to_numeric(new_df[\"occupancy\"], errors=\"coerce\")\n", + " dist = pd.to_numeric(new_df[dist_col_new], errors=\"coerce\")\n", + "\n", + " valid = occ.notna() & dist.notna() & (dist >= 0)\n", + " occ = occ[valid]\n", + " dist = dist[valid]\n", + "\n", + " avg_trip_occ = occ.mean()\n", + " w_sum = dist.sum()\n", + " avg_vmt_occ = (dist * occ).sum() / w_sum if w_sum > 0 else np.nan\n", + "\n", + " return {\n", + " \"avg_occ_by_trip\": avg_trip_occ,\n", + " \"avg_occ_by_vmt\": avg_vmt_occ,\n", + " }\n", + "\n", + "run_scalar_metric(metric_occupancy_trip_vmt, \"Occupancy by veh trips and VMT\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Share and profile of refueling trips" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "12.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "30.0" + ], + [ + "12:49", + "18.0" + ], + [ + "13:00", + "18.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "12.0" + ], + [ + "13:30", + "18.0" + ], + [ + "13:40", + "30.0" + ], + [ + "13:49", + "30.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:10", + "48.0" + ], + [ + "14:19", + "84.0" + ], + [ + "14:30", + "78.0" + ], + [ + "14:40", + "54.0" + ], + [ + "14:49", + "96.0" + ], + [ + "15:00", + "78.0" + ], + [ + "15:10", + "66.0" + ], + [ + "15:19", + "150.0" + ], + [ + "15:30", + "150.0" + ], + [ + "15:40", + "90.0" + ], + [ + "15:49", + "126.0" + ], + [ + "16:00", + "102.0" + ], + [ + "16:10", + "198.0" + ], + [ + "16:19", + "138.0" + ], + [ + "16:30", + "144.0" + ], + [ + "16:40", + "192.0" + ], + [ + "16:49", + "186.0" + ], + [ + "17:00", + "234.0" + ], + [ + "17:10", + "300.0" + ], + [ + "17:19", + "168.0" + ], + [ + "17:30", + "168.0" + ], + [ + "17:40", + "330.0" + ], + [ + "17:49", + "330.0" + ], + [ + "18:00", + "372.0" + ], + [ + "18:10", + "324.0" + ], + [ + "18:19", + "378.0" + ], + [ + "18:30", + "372.0" + ], + [ + "18:40", + "474.0" + ], + [ + "18:49", + "480.0" + ], + [ + "19:00", + "498.0" + ], + [ + "19:10", + "372.0" + ], + [ + "19:19", + "498.0" + ], + [ + "19:30", + "474.0" + ], + [ + "19:40", + "504.0" + ], + [ + "19:49", + "534.0" + ], + [ + "20:00", + "426.0" + ], + [ + "20:10", + "474.0" + ], + [ + "20:19", + "444.0" + ], + [ + "20:30", + "360.0" + ], + [ + "20:40", + "432.0" + ], + [ + "20:49", + "534.0" + ], + [ + "21:00", + "444.0" + ], + [ + "21:10", + "384.0" + ], + [ + "21:19", + "468.0" + ], + [ + "21:30", + "420.0" + ], + [ + "21:40", + "378.0" + ], + [ + "21:49", + "300.0" + ], + [ + "22:00", + "264.0" + ], + [ + "22:10", + "312.0" + ], + [ + "22:19", + "330.0" + ], + [ + "22:30", + "294.0" + ], + [ + "22:40", + "252.0" + ], + [ + "22:49", + "174.0" + ], + [ + "23:00", + "162.0" + ], + [ + "23:10", + "198.0" + ], + [ + "23:19", + "228.0" + ], + [ + "23:30", + "240.0" + ], + [ + "23:40", + "186.0" + ], + [ + "23:49", + "156.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "108.0" + ], + [ + "00:19", + "108.0" + ], + [ + "00:30", + "84.0" + ], + [ + "00:40", + "66.0" + ], + [ + "00:49", + "66.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "54.0" + ], + [ + "01:19", + "42.0" + ], + [ + "01:30", + "54.0" + ], + [ + "01:40", + "48.0" + ], + [ + "01:49", + "12.0" + ], + [ + "02:00", + "42.0" + ], + [ + "02:10", + "48.0" + ], + [ + "02:19", + "48.0" + ], + [ + "02:30", + "36.0" + ], + [ + "02:40", + "36.0" + ], + [ + "02:49", + "30.0" + ], + [ + "03:00", + "30.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 6, + 0, + 12, + 6, + 6, + 30, + 18, + 18, + 18, + 12, + 18, + 30, + 30, + 24, + 48, + 84, + 78, + 54, + 96, + 78, + 66, + 150, + 150, + 90, + 126, + 102, + 198, + 138, + 144, + 192, + 186, + 234, + 300, + 168, + 168, + 330, + 330, + 372, + 324, + 378, + 372, + 474, + 480, + 498, + 372, + 498, + 474, + 504, + 534, + 426, + 474, + 444, + 360, + 432, + 534, + 444, + 384, + 468, + 420, + 378, + 300, + 264, + 312, + 330, + 294, + 252, + 174, + 162, + 198, + 228, + 240, + 186, + 156, + 156, + 108, + 108, + 84, + 66, + 66, + 48, + 54, + 42, + 54, + 48, + 12, + 42, + 48, + 48, + 36, + 36, + 30, + 30, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:04", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:15", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:25", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:34", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:45", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "03:55", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:04", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:15", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:25", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:34", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:45", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "04:55", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:04", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:15", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:25", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:34", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:45", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "05:55", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:04", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:15", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:25", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:34", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:45", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "06:55", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:04", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:15", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:25", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:34", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:45", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "07:55", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:04", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:15", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:25", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:34", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:45", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "08:55", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:04", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:15", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:25", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:34", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:45", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "09:55", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:04", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:15", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:25", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:34", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:45", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "10:55", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:04", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:15", + "12.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:25", + "0.0" + ], + [ + "11:30", + "24.0" + ], + [ + "11:34", + "0.0" + ], + [ + "11:40", + "12.0" + ], + [ + "11:45", + "12.0" + ], + [ + "11:49", + "12.0" + ], + [ + "11:55", + "12.0" + ], + [ + "12:00", + "12.0" + ], + [ + "12:04", + "24.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:15", + "36.0" + ], + [ + "12:19", + "12.0" + ], + [ + "12:25", + "0.0" + ], + [ + "12:30", + "12.0" + ], + [ + "12:34", + "36.0" + ], + [ + "12:40", + "48.0" + ], + [ + "12:45", + "48.0" + ], + [ + "12:49", + "48.0" + ], + [ + "12:55", + "48.0" + ], + [ + "13:00", + "24.0" + ], + [ + "13:04", + "24.0" + ], + [ + "13:10", + "24.0" + ], + [ + "13:15", + "48.0" + ], + [ + "13:19", + "48.0" + ], + [ + "13:25", + "84.0" + ], + [ + "13:30", + "48.0" + ], + [ + "13:34", + "36.0" + ], + [ + "13:40", + "96.0" + ], + [ + "13:45", + "84.0" + ], + [ + "13:49", + "60.0" + ], + [ + "13:55", + "72.0" + ], + [ + "14:00", + "60.0" + ], + [ + "14:04", + "60.0" + ], + [ + "14:10", + "72.0" + ], + [ + "14:15", + "84.0" + ], + [ + "14:19", + "84.0" + ], + [ + "14:25", + "108.0" + ], + [ + "14:30", + "108.0" + ], + [ + "14:34", + "72.0" + ], + [ + "14:40", + "156.0" + ], + [ + "14:45", + "132.0" + ], + [ + "14:49", + "108.0" + ], + [ + "14:55", + "72.0" + ], + [ + "15:00", + "192.0" + ], + [ + "15:04", + "180.0" + ], + [ + "15:10", + "132.0" + ], + [ + "15:15", + "156.0" + ], + [ + "15:19", + "216.0" + ], + [ + "15:25", + "180.0" + ], + [ + "15:30", + "252.0" + ], + [ + "15:34", + "168.0" + ], + [ + "15:40", + "300.0" + ], + [ + "15:45", + "288.0" + ], + [ + "15:49", + "204.0" + ], + [ + "15:55", + "180.0" + ], + [ + "16:00", + "240.0" + ], + [ + "16:04", + "360.0" + ], + [ + "16:10", + "168.0" + ], + [ + "16:15", + "276.0" + ], + [ + "16:19", + "324.0" + ], + [ + "16:25", + "324.0" + ], + [ + "16:30", + "456.0" + ], + [ + "16:34", + "324.0" + ], + [ + "16:40", + "444.0" + ], + [ + "16:45", + "336.0" + ], + [ + "16:49", + "420.0" + ], + [ + "16:55", + "312.0" + ], + [ + "17:00", + "228.0" + ], + [ + "17:04", + "456.0" + ], + [ + "17:10", + "420.0" + ], + [ + "17:15", + "564.0" + ], + [ + "17:19", + "648.0" + ], + [ + "17:25", + "528.0" + ], + [ + "17:30", + "372.0" + ], + [ + "17:34", + "540.0" + ], + [ + "17:40", + "408.0" + ], + [ + "17:45", + "408.0" + ], + [ + "17:49", + "468.0" + ], + [ + "17:55", + "588.0" + ], + [ + "18:00", + "540.0" + ], + [ + "18:04", + "504.0" + ], + [ + "18:10", + "492.0" + ], + [ + "18:15", + "564.0" + ], + [ + "18:19", + "480.0" + ], + [ + "18:25", + "576.0" + ], + [ + "18:30", + "576.0" + ], + [ + "18:34", + "504.0" + ], + [ + "18:40", + "444.0" + ], + [ + "18:45", + "660.0" + ], + [ + "18:49", + "684.0" + ], + [ + "18:55", + "492.0" + ], + [ + "19:00", + "768.0" + ], + [ + "19:04", + "444.0" + ], + [ + "19:10", + "540.0" + ], + [ + "19:15", + "612.0" + ], + [ + "19:19", + "576.0" + ], + [ + "19:25", + "672.0" + ], + [ + "19:30", + "492.0" + ], + [ + "19:34", + "396.0" + ], + [ + "19:40", + "540.0" + ], + [ + "19:45", + "588.0" + ], + [ + "19:49", + "372.0" + ], + [ + "19:55", + "456.0" + ], + [ + "20:00", + "588.0" + ], + [ + "20:04", + "492.0" + ], + [ + "20:10", + "576.0" + ], + [ + "20:15", + "480.0" + ], + [ + "20:19", + "348.0" + ], + [ + "20:25", + "444.0" + ], + [ + "20:30", + "396.0" + ], + [ + "20:34", + "588.0" + ], + [ + "20:40", + "516.0" + ], + [ + "20:45", + "348.0" + ], + [ + "20:49", + "468.0" + ], + [ + "20:55", + "360.0" + ], + [ + "21:00", + "408.0" + ], + [ + "21:04", + "432.0" + ], + [ + "21:10", + "480.0" + ], + [ + "21:15", + "360.0" + ], + [ + "21:19", + "312.0" + ], + [ + "21:25", + "528.0" + ], + [ + "21:30", + "348.0" + ], + [ + "21:34", + "300.0" + ], + [ + "21:40", + "396.0" + ], + [ + "21:45", + "240.0" + ], + [ + "21:49", + "336.0" + ], + [ + "21:55", + "228.0" + ], + [ + "22:00", + "216.0" + ], + [ + "22:04", + "216.0" + ], + [ + "22:10", + "264.0" + ], + [ + "22:15", + "144.0" + ], + [ + "22:19", + "264.0" + ], + [ + "22:25", + "264.0" + ], + [ + "22:30", + "228.0" + ], + [ + "22:34", + "180.0" + ], + [ + "22:40", + "180.0" + ], + [ + "22:45", + "180.0" + ], + [ + "22:49", + "204.0" + ], + [ + "22:55", + "192.0" + ], + [ + "23:00", + "228.0" + ], + [ + "23:04", + "120.0" + ], + [ + "23:10", + "120.0" + ], + [ + "23:15", + "168.0" + ], + [ + "23:19", + "264.0" + ], + [ + "23:25", + "228.0" + ], + [ + "23:30", + "192.0" + ], + [ + "23:34", + "204.0" + ], + [ + "23:40", + "168.0" + ], + [ + "23:45", + "96.0" + ], + [ + "23:49", + "120.0" + ], + [ + "23:55", + "108.0" + ], + [ + "00:00", + "144.0" + ], + [ + "00:04", + "84.0" + ], + [ + "00:10", + "84.0" + ], + [ + "00:15", + "120.0" + ], + [ + "00:19", + "36.0" + ], + [ + "00:25", + "48.0" + ], + [ + "00:30", + "60.0" + ], + [ + "00:34", + "96.0" + ], + [ + "00:40", + "48.0" + ], + [ + "00:45", + "36.0" + ], + [ + "00:49", + "48.0" + ], + [ + "00:55", + "48.0" + ], + [ + "01:00", + "24.0" + ], + [ + "01:04", + "12.0" + ], + [ + "01:10", + "0.0" + ], + [ + "01:15", + "0.0" + ], + [ + "01:19", + "0.0" + ], + [ + "01:25", + "0.0" + ], + [ + "01:30", + "12.0" + ], + [ + "01:34", + "48.0" + ], + [ + "01:40", + "0.0" + ], + [ + "01:45", + "24.0" + ], + [ + "01:49", + "12.0" + ], + [ + "01:55", + "0.0" + ], + [ + "02:00", + "0.0" + ], + [ + "02:04", + "0.0" + ], + [ + "02:10", + "24.0" + ], + [ + "02:15", + "12.0" + ], + [ + "02:19", + "12.0" + ], + [ + "02:25", + "36.0" + ], + [ + "02:30", + "12.0" + ], + [ + "02:34", + "12.0" + ], + [ + "02:40", + "12.0" + ], + [ + "02:45", + "48.0" + ], + [ + "02:49", + "36.0" + ], + [ + "02:55", + "0.0" + ], + [ + "03:00", + "0.0" + ], + [ + "03:04", + "12.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:15", + "24.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:25", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:34", + "12.0" + ], + [ + "03:40", + "12.0" + ], + [ + "03:45", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "03:55", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:04", + "12.0" + ], + [ + "04:10", + "24.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_5", + "mode": "lines", + "name": "timebin_5", + "type": "scatter", + "x": [ + 0, + 0.08333333333333333, + 0.16666666666666666, + 0.25, + 0.3333333333333333, + 0.4166666666666667, + 0.5, + 0.5833333333333334, + 0.6666666666666666, + 0.75, + 0.8333333333333334, + 0.9166666666666666, + 1, + 1.0833333333333333, + 1.1666666666666667, + 1.25, + 1.3333333333333333, + 1.4166666666666667, + 1.5, + 1.5833333333333333, + 1.6666666666666667, + 1.75, + 1.8333333333333333, + 1.9166666666666667, + 2, + 2.0833333333333335, + 2.1666666666666665, + 2.25, + 2.3333333333333335, + 2.4166666666666665, + 2.5, + 2.5833333333333335, + 2.6666666666666665, + 2.75, + 2.8333333333333335, + 2.9166666666666665, + 3, + 3.0833333333333335, + 3.1666666666666665, + 3.25, + 3.3333333333333335, + 3.4166666666666665, + 3.5, + 3.5833333333333335, + 3.6666666666666665, + 3.75, + 3.8333333333333335, + 3.9166666666666665, + 4, + 4.083333333333333, + 4.166666666666667, + 4.25, + 4.333333333333333, + 4.416666666666667, + 4.5, + 4.583333333333333, + 4.666666666666667, + 4.75, + 4.833333333333333, + 4.916666666666667, + 5, + 5.083333333333333, + 5.166666666666667, + 5.25, + 5.333333333333333, + 5.416666666666667, + 5.5, + 5.583333333333333, + 5.666666666666667, + 5.75, + 5.833333333333333, + 5.916666666666667, + 6, + 6.083333333333333, + 6.166666666666667, + 6.25, + 6.333333333333333, + 6.416666666666667, + 6.5, + 6.583333333333333, + 6.666666666666667, + 6.75, + 6.833333333333333, + 6.916666666666667, + 7, + 7.083333333333333, + 7.166666666666667, + 7.25, + 7.333333333333333, + 7.416666666666667, + 7.5, + 7.583333333333333, + 7.666666666666667, + 7.75, + 7.833333333333333, + 7.916666666666667, + 8, + 8.083333333333334, + 8.166666666666666, + 8.25, + 8.333333333333334, + 8.416666666666666, + 8.5, + 8.583333333333334, + 8.666666666666666, + 8.75, + 8.833333333333334, + 8.916666666666666, + 9, + 9.083333333333334, + 9.166666666666666, + 9.25, + 9.333333333333334, + 9.416666666666666, + 9.5, + 9.583333333333334, + 9.666666666666666, + 9.75, + 9.833333333333334, + 9.916666666666666, + 10, + 10.083333333333334, + 10.166666666666666, + 10.25, + 10.333333333333334, + 10.416666666666666, + 10.5, + 10.583333333333334, + 10.666666666666666, + 10.75, + 10.833333333333334, + 10.916666666666666, + 11, + 11.083333333333334, + 11.166666666666666, + 11.25, + 11.333333333333334, + 11.416666666666666, + 11.5, + 11.583333333333334, + 11.666666666666666, + 11.75, + 11.833333333333334, + 11.916666666666666, + 12, + 12.083333333333334, + 12.166666666666666, + 12.25, + 12.333333333333334, + 12.416666666666666, + 12.5, + 12.583333333333334, + 12.666666666666666, + 12.75, + 12.833333333333334, + 12.916666666666666, + 13, + 13.083333333333334, + 13.166666666666666, + 13.25, + 13.333333333333334, + 13.416666666666666, + 13.5, + 13.583333333333334, + 13.666666666666666, + 13.75, + 13.833333333333334, + 13.916666666666666, + 14, + 14.083333333333334, + 14.166666666666666, + 14.25, + 14.333333333333334, + 14.416666666666666, + 14.5, + 14.583333333333334, + 14.666666666666666, + 14.75, + 14.833333333333334, + 14.916666666666666, + 15, + 15.083333333333334, + 15.166666666666666, + 15.25, + 15.333333333333334, + 15.416666666666666, + 15.5, + 15.583333333333334, + 15.666666666666666, + 15.75, + 15.833333333333334, + 15.916666666666666, + 16, + 16.083333333333332, + 16.166666666666668, + 16.25, + 16.333333333333332, + 16.416666666666668, + 16.5, + 16.583333333333332, + 16.666666666666668, + 16.75, + 16.833333333333332, + 16.916666666666668, + 17, + 17.083333333333332, + 17.166666666666668, + 17.25, + 17.333333333333332, + 17.416666666666668, + 17.5, + 17.583333333333332, + 17.666666666666668, + 17.75, + 17.833333333333332, + 17.916666666666668, + 18, + 18.083333333333332, + 18.166666666666668, + 18.25, + 18.333333333333332, + 18.416666666666668, + 18.5, + 18.583333333333332, + 18.666666666666668, + 18.75, + 18.833333333333332, + 18.916666666666668, + 19, + 19.083333333333332, + 19.166666666666668, + 19.25, + 19.333333333333332, + 19.416666666666668, + 19.5, + 19.583333333333332, + 19.666666666666668, + 19.75, + 19.833333333333332, + 19.916666666666668, + 20, + 20.083333333333332, + 20.166666666666668, + 20.25, + 20.333333333333332, + 20.416666666666668, + 20.5, + 20.583333333333332, + 20.666666666666668, + 20.75, + 20.833333333333332, + 20.916666666666668, + 21, + 21.083333333333332, + 21.166666666666668, + 21.25, + 21.333333333333332, + 21.416666666666668, + 21.5, + 21.583333333333332, + 21.666666666666668, + 21.75, + 21.833333333333332, + 21.916666666666668, + 22, + 22.083333333333332, + 22.166666666666668, + 22.25, + 22.333333333333332, + 22.416666666666668, + 22.5, + 22.583333333333332, + 22.666666666666668, + 22.75, + 22.833333333333332, + 22.916666666666668, + 23, + 23.083333333333332, + 23.166666666666668, + 23.25, + 23.333333333333332, + 23.416666666666668, + 23.5, + 23.583333333333332, + 23.666666666666668, + 23.75, + 23.833333333333332, + 23.916666666666668, + 24, + 24.083333333333332, + 24.166666666666668, + 24.25, + 24.333333333333332, + 24.416666666666668, + 24.5, + 24.583333333333332, + 24.666666666666668, + 24.75, + 24.833333333333332, + 24.916666666666668, + 25, + 25.083333333333332, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 0, + 0, + 24, + 0, + 12, + 12, + 12, + 12, + 12, + 24, + 12, + 36, + 12, + 0, + 12, + 36, + 48, + 48, + 48, + 48, + 24, + 24, + 24, + 48, + 48, + 84, + 48, + 36, + 96, + 84, + 60, + 72, + 60, + 60, + 72, + 84, + 84, + 108, + 108, + 72, + 156, + 132, + 108, + 72, + 192, + 180, + 132, + 156, + 216, + 180, + 252, + 168, + 300, + 288, + 204, + 180, + 240, + 360, + 168, + 276, + 324, + 324, + 456, + 324, + 444, + 336, + 420, + 312, + 228, + 456, + 420, + 564, + 648, + 528, + 372, + 540, + 408, + 408, + 468, + 588, + 540, + 504, + 492, + 564, + 480, + 576, + 576, + 504, + 444, + 660, + 684, + 492, + 768, + 444, + 540, + 612, + 576, + 672, + 492, + 396, + 540, + 588, + 372, + 456, + 588, + 492, + 576, + 480, + 348, + 444, + 396, + 588, + 516, + 348, + 468, + 360, + 408, + 432, + 480, + 360, + 312, + 528, + 348, + 300, + 396, + 240, + 336, + 228, + 216, + 216, + 264, + 144, + 264, + 264, + 228, + 180, + 180, + 180, + 204, + 192, + 228, + 120, + 120, + 168, + 264, + 228, + 192, + 204, + 168, + 96, + 120, + 108, + 144, + 84, + 84, + 120, + 36, + 48, + 60, + 96, + 48, + 36, + 48, + 48, + 24, + 12, + 0, + 0, + 0, + 0, + 12, + 48, + 0, + 24, + 12, + 0, + 0, + 0, + 24, + 12, + 12, + 36, + 12, + 12, + 12, + 48, + 36, + 0, + 0, + 12, + 12, + 24, + 0, + 0, + 0, + 12, + 12, + 0, + 0, + 0, + 0, + 12, + 24 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:15", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:45", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:15", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:45", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:15", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:45", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:15", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:45", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:15", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:45", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:15", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:45", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:15", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:45", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:15", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:45", + "0.0" + ], + [ + "11:00", + "4.0" + ], + [ + "11:15", + "0.0" + ], + [ + "11:30", + "4.0" + ], + [ + "11:45", + "0.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:15", + "8.0" + ], + [ + "12:30", + "12.0" + ], + [ + "12:45", + "4.0" + ], + [ + "13:00", + "0.0" + ], + [ + "13:15", + "16.0" + ], + [ + "13:30", + "12.0" + ], + [ + "13:45", + "0.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:15", + "16.0" + ], + [ + "14:30", + "36.0" + ], + [ + "14:45", + "48.0" + ], + [ + "15:00", + "12.0" + ], + [ + "15:15", + "52.0" + ], + [ + "15:30", + "64.0" + ], + [ + "15:45", + "76.0" + ], + [ + "16:00", + "108.0" + ], + [ + "16:15", + "112.0" + ], + [ + "16:30", + "108.0" + ], + [ + "16:45", + "132.0" + ], + [ + "17:00", + "64.0" + ], + [ + "17:15", + "144.0" + ], + [ + "17:30", + "160.0" + ], + [ + "17:45", + "208.0" + ], + [ + "18:00", + "188.0" + ], + [ + "18:15", + "184.0" + ], + [ + "18:30", + "292.0" + ], + [ + "18:45", + "264.0" + ], + [ + "19:00", + "292.0" + ], + [ + "19:15", + "292.0" + ], + [ + "19:30", + "320.0" + ], + [ + "19:45", + "320.0" + ], + [ + "20:00", + "308.0" + ], + [ + "20:15", + "340.0" + ], + [ + "20:30", + "392.0" + ], + [ + "20:45", + "368.0" + ], + [ + "21:00", + "368.0" + ], + [ + "21:15", + "392.0" + ], + [ + "21:30", + "336.0" + ], + [ + "21:45", + "248.0" + ], + [ + "22:00", + "304.0" + ], + [ + "22:15", + "320.0" + ], + [ + "22:30", + "256.0" + ], + [ + "22:45", + "256.0" + ], + [ + "23:00", + "248.0" + ], + [ + "23:15", + "280.0" + ], + [ + "23:30", + "244.0" + ], + [ + "23:45", + "252.0" + ], + [ + "00:00", + "144.0" + ], + [ + "00:15", + "88.0" + ], + [ + "00:30", + "92.0" + ], + [ + "00:45", + "72.0" + ], + [ + "01:00", + "120.0" + ], + [ + "01:15", + "72.0" + ], + [ + "01:30", + "56.0" + ], + [ + "01:45", + "48.0" + ], + [ + "02:00", + "32.0" + ], + [ + "02:15", + "20.0" + ], + [ + "02:30", + "40.0" + ], + [ + "02:45", + "52.0" + ], + [ + "03:00", + "24.0" + ], + [ + "03:15", + "8.0" + ], + [ + "03:30", + "4.0" + ], + [ + "03:45", + "4.0" + ], + [ + "04:00", + "20.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "timebin_15", + "mode": "lines", + "name": "timebin_15", + "type": "scatter", + "x": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2, + 2.25, + 2.5, + 2.75, + 3, + 3.25, + 3.5, + 3.75, + 4, + 4.25, + 4.5, + 4.75, + 5, + 5.25, + 5.5, + 5.75, + 6, + 6.25, + 6.5, + 6.75, + 7, + 7.25, + 7.5, + 7.75, + 8, + 8.25, + 8.5, + 8.75, + 9, + 9.25, + 9.5, + 9.75, + 10, + 10.25, + 10.5, + 10.75, + 11, + 11.25, + 11.5, + 11.75, + 12, + 12.25, + 12.5, + 12.75, + 13, + 13.25, + 13.5, + 13.75, + 14, + 14.25, + 14.5, + 14.75, + 15, + 15.25, + 15.5, + 15.75, + 16, + 16.25, + 16.5, + 16.75, + 17, + 17.25, + 17.5, + 17.75, + 18, + 18.25, + 18.5, + 18.75, + 19, + 19.25, + 19.5, + 19.75, + 20, + 20.25, + 20.5, + 20.75, + 21, + 21.25, + 21.5, + 21.75, + 22, + 22.25, + 22.5, + 22.75, + 23, + 23.25, + 23.5, + 23.75, + 24, + 24.25, + 24.5, + 24.75, + 25 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 4, + 0, + 0, + 8, + 12, + 4, + 0, + 16, + 12, + 0, + 24, + 16, + 36, + 48, + 12, + 52, + 64, + 76, + 108, + 112, + 108, + 132, + 64, + 144, + 160, + 208, + 188, + 184, + 292, + 264, + 292, + 292, + 320, + 320, + 308, + 340, + 392, + 368, + 368, + 392, + 336, + 248, + 304, + 320, + 256, + 256, + 248, + 280, + 244, + 252, + 144, + 88, + 92, + 72, + 120, + 72, + 56, + 48, + 32, + 20, + 40, + 52, + 24, + 8, + 4, + 4, + 20 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Refuel trips (per hour) — time_bin_size" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "12.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "30.0" + ], + [ + "12:49", + "18.0" + ], + [ + "13:00", + "18.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "12.0" + ], + [ + "13:30", + "18.0" + ], + [ + "13:40", + "30.0" + ], + [ + "13:49", + "30.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:10", + "48.0" + ], + [ + "14:19", + "84.0" + ], + [ + "14:30", + "78.0" + ], + [ + "14:40", + "54.0" + ], + [ + "14:49", + "96.0" + ], + [ + "15:00", + "78.0" + ], + [ + "15:10", + "66.0" + ], + [ + "15:19", + "150.0" + ], + [ + "15:30", + "150.0" + ], + [ + "15:40", + "90.0" + ], + [ + "15:49", + "126.0" + ], + [ + "16:00", + "102.0" + ], + [ + "16:10", + "198.0" + ], + [ + "16:19", + "138.0" + ], + [ + "16:30", + "144.0" + ], + [ + "16:40", + "192.0" + ], + [ + "16:49", + "186.0" + ], + [ + "17:00", + "234.0" + ], + [ + "17:10", + "300.0" + ], + [ + "17:19", + "168.0" + ], + [ + "17:30", + "168.0" + ], + [ + "17:40", + "330.0" + ], + [ + "17:49", + "330.0" + ], + [ + "18:00", + "372.0" + ], + [ + "18:10", + "324.0" + ], + [ + "18:19", + "378.0" + ], + [ + "18:30", + "372.0" + ], + [ + "18:40", + "474.0" + ], + [ + "18:49", + "480.0" + ], + [ + "19:00", + "498.0" + ], + [ + "19:10", + "372.0" + ], + [ + "19:19", + "498.0" + ], + [ + "19:30", + "474.0" + ], + [ + "19:40", + "504.0" + ], + [ + "19:49", + "534.0" + ], + [ + "20:00", + "426.0" + ], + [ + "20:10", + "474.0" + ], + [ + "20:19", + "444.0" + ], + [ + "20:30", + "360.0" + ], + [ + "20:40", + "432.0" + ], + [ + "20:49", + "534.0" + ], + [ + "21:00", + "444.0" + ], + [ + "21:10", + "384.0" + ], + [ + "21:19", + "468.0" + ], + [ + "21:30", + "420.0" + ], + [ + "21:40", + "378.0" + ], + [ + "21:49", + "300.0" + ], + [ + "22:00", + "264.0" + ], + [ + "22:10", + "312.0" + ], + [ + "22:19", + "330.0" + ], + [ + "22:30", + "294.0" + ], + [ + "22:40", + "252.0" + ], + [ + "22:49", + "174.0" + ], + [ + "23:00", + "162.0" + ], + [ + "23:10", + "198.0" + ], + [ + "23:19", + "228.0" + ], + [ + "23:30", + "240.0" + ], + [ + "23:40", + "186.0" + ], + [ + "23:49", + "156.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "108.0" + ], + [ + "00:19", + "108.0" + ], + [ + "00:30", + "84.0" + ], + [ + "00:40", + "66.0" + ], + [ + "00:49", + "66.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "54.0" + ], + [ + "01:19", + "42.0" + ], + [ + "01:30", + "54.0" + ], + [ + "01:40", + "48.0" + ], + [ + "01:49", + "12.0" + ], + [ + "02:00", + "42.0" + ], + [ + "02:10", + "48.0" + ], + [ + "02:19", + "48.0" + ], + [ + "02:30", + "36.0" + ], + [ + "02:40", + "36.0" + ], + [ + "02:49", + "30.0" + ], + [ + "03:00", + "30.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 6, + 0, + 12, + 6, + 6, + 30, + 18, + 18, + 18, + 12, + 18, + 30, + 30, + 24, + 48, + 84, + 78, + 54, + 96, + 78, + 66, + 150, + 150, + 90, + 126, + 102, + 198, + 138, + 144, + 192, + 186, + 234, + 300, + 168, + 168, + 330, + 330, + 372, + 324, + 378, + 372, + 474, + 480, + 498, + 372, + 498, + 474, + 504, + 534, + 426, + 474, + 444, + 360, + 432, + 534, + 444, + 384, + 468, + 420, + 378, + 300, + 264, + 312, + 330, + 294, + 252, + 174, + 162, + 198, + 228, + 240, + 186, + 156, + 156, + 108, + 108, + 84, + 66, + 66, + 48, + 54, + 42, + 54, + 48, + 12, + 42, + 48, + 48, + 36, + 36, + 30, + 30, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "18.0" + ], + [ + "11:49", + "12.0" + ], + [ + "12:00", + "12.0" + ], + [ + "12:10", + "6.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "0.0" + ], + [ + "12:49", + "6.0" + ], + [ + "13:00", + "18.0" + ], + [ + "13:10", + "24.0" + ], + [ + "13:19", + "18.0" + ], + [ + "13:30", + "42.0" + ], + [ + "13:40", + "48.0" + ], + [ + "13:49", + "42.0" + ], + [ + "14:00", + "36.0" + ], + [ + "14:10", + "48.0" + ], + [ + "14:19", + "60.0" + ], + [ + "14:30", + "78.0" + ], + [ + "14:40", + "66.0" + ], + [ + "14:49", + "60.0" + ], + [ + "15:00", + "66.0" + ], + [ + "15:10", + "84.0" + ], + [ + "15:19", + "132.0" + ], + [ + "15:30", + "114.0" + ], + [ + "15:40", + "90.0" + ], + [ + "15:49", + "120.0" + ], + [ + "16:00", + "156.0" + ], + [ + "16:10", + "120.0" + ], + [ + "16:19", + "174.0" + ], + [ + "16:30", + "198.0" + ], + [ + "16:40", + "198.0" + ], + [ + "16:49", + "258.0" + ], + [ + "17:00", + "192.0" + ], + [ + "17:10", + "228.0" + ], + [ + "17:19", + "216.0" + ], + [ + "17:30", + "282.0" + ], + [ + "17:40", + "288.0" + ], + [ + "17:49", + "288.0" + ], + [ + "18:00", + "366.0" + ], + [ + "18:10", + "390.0" + ], + [ + "18:19", + "330.0" + ], + [ + "18:30", + "342.0" + ], + [ + "18:40", + "384.0" + ], + [ + "18:49", + "402.0" + ], + [ + "19:00", + "420.0" + ], + [ + "19:10", + "468.0" + ], + [ + "19:19", + "426.0" + ], + [ + "19:30", + "498.0" + ], + [ + "19:40", + "486.0" + ], + [ + "19:49", + "534.0" + ], + [ + "20:00", + "408.0" + ], + [ + "20:10", + "432.0" + ], + [ + "20:19", + "468.0" + ], + [ + "20:30", + "570.0" + ], + [ + "20:40", + "426.0" + ], + [ + "20:49", + "462.0" + ], + [ + "21:00", + "528.0" + ], + [ + "21:10", + "504.0" + ], + [ + "21:19", + "480.0" + ], + [ + "21:30", + "450.0" + ], + [ + "21:40", + "390.0" + ], + [ + "21:49", + "306.0" + ], + [ + "22:00", + "288.0" + ], + [ + "22:10", + "348.0" + ], + [ + "22:19", + "258.0" + ], + [ + "22:30", + "234.0" + ], + [ + "22:40", + "246.0" + ], + [ + "22:49", + "222.0" + ], + [ + "23:00", + "174.0" + ], + [ + "23:10", + "180.0" + ], + [ + "23:19", + "192.0" + ], + [ + "23:30", + "192.0" + ], + [ + "23:40", + "228.0" + ], + [ + "23:49", + "156.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "138.0" + ], + [ + "00:19", + "84.0" + ], + [ + "00:30", + "108.0" + ], + [ + "00:40", + "60.0" + ], + [ + "00:49", + "78.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "48.0" + ], + [ + "01:19", + "24.0" + ], + [ + "01:30", + "66.0" + ], + [ + "01:40", + "36.0" + ], + [ + "01:49", + "24.0" + ], + [ + "02:00", + "24.0" + ], + [ + "02:10", + "30.0" + ], + [ + "02:19", + "12.0" + ], + [ + "02:30", + "48.0" + ], + [ + "02:40", + "48.0" + ], + [ + "02:49", + "36.0" + ], + [ + "03:00", + "12.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_5", + "mode": "lines", + "name": "detour_5", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 18, + 12, + 12, + 6, + 6, + 6, + 0, + 6, + 18, + 24, + 18, + 42, + 48, + 42, + 36, + 48, + 60, + 78, + 66, + 60, + 66, + 84, + 132, + 114, + 90, + 120, + 156, + 120, + 174, + 198, + 198, + 258, + 192, + 228, + 216, + 282, + 288, + 288, + 366, + 390, + 330, + 342, + 384, + 402, + 420, + 468, + 426, + 498, + 486, + 534, + 408, + 432, + 468, + 570, + 426, + 462, + 528, + 504, + 480, + 450, + 390, + 306, + 288, + 348, + 258, + 234, + 246, + 222, + 174, + 180, + 192, + 192, + 228, + 156, + 156, + 138, + 84, + 108, + 60, + 78, + 48, + 48, + 24, + 66, + 36, + 24, + 24, + 30, + 12, + 48, + 48, + 36, + 12, + 6, + 0, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "6.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "6.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "12.0" + ], + [ + "12:40", + "12.0" + ], + [ + "12:49", + "6.0" + ], + [ + "13:00", + "30.0" + ], + [ + "13:10", + "24.0" + ], + [ + "13:19", + "12.0" + ], + [ + "13:30", + "48.0" + ], + [ + "13:40", + "18.0" + ], + [ + "13:49", + "18.0" + ], + [ + "14:00", + "48.0" + ], + [ + "14:10", + "24.0" + ], + [ + "14:19", + "96.0" + ], + [ + "14:30", + "60.0" + ], + [ + "14:40", + "78.0" + ], + [ + "14:49", + "72.0" + ], + [ + "15:00", + "84.0" + ], + [ + "15:10", + "108.0" + ], + [ + "15:19", + "102.0" + ], + [ + "15:30", + "60.0" + ], + [ + "15:40", + "144.0" + ], + [ + "15:49", + "162.0" + ], + [ + "16:00", + "150.0" + ], + [ + "16:10", + "168.0" + ], + [ + "16:19", + "174.0" + ], + [ + "16:30", + "228.0" + ], + [ + "16:40", + "222.0" + ], + [ + "16:49", + "204.0" + ], + [ + "17:00", + "246.0" + ], + [ + "17:10", + "240.0" + ], + [ + "17:19", + "228.0" + ], + [ + "17:30", + "288.0" + ], + [ + "17:40", + "294.0" + ], + [ + "17:49", + "438.0" + ], + [ + "18:00", + "336.0" + ], + [ + "18:10", + "282.0" + ], + [ + "18:19", + "318.0" + ], + [ + "18:30", + "378.0" + ], + [ + "18:40", + "372.0" + ], + [ + "18:49", + "414.0" + ], + [ + "19:00", + "462.0" + ], + [ + "19:10", + "432.0" + ], + [ + "19:19", + "450.0" + ], + [ + "19:30", + "522.0" + ], + [ + "19:40", + "414.0" + ], + [ + "19:49", + "468.0" + ], + [ + "20:00", + "408.0" + ], + [ + "20:10", + "486.0" + ], + [ + "20:19", + "426.0" + ], + [ + "20:30", + "474.0" + ], + [ + "20:40", + "522.0" + ], + [ + "20:49", + "468.0" + ], + [ + "21:00", + "480.0" + ], + [ + "21:10", + "402.0" + ], + [ + "21:19", + "480.0" + ], + [ + "21:30", + "426.0" + ], + [ + "21:40", + "360.0" + ], + [ + "21:49", + "270.0" + ], + [ + "22:00", + "300.0" + ], + [ + "22:10", + "306.0" + ], + [ + "22:19", + "270.0" + ], + [ + "22:30", + "246.0" + ], + [ + "22:40", + "264.0" + ], + [ + "22:49", + "216.0" + ], + [ + "23:00", + "174.0" + ], + [ + "23:10", + "234.0" + ], + [ + "23:19", + "222.0" + ], + [ + "23:30", + "234.0" + ], + [ + "23:40", + "186.0" + ], + [ + "23:49", + "144.0" + ], + [ + "00:00", + "192.0" + ], + [ + "00:10", + "108.0" + ], + [ + "00:19", + "90.0" + ], + [ + "00:30", + "48.0" + ], + [ + "00:40", + "66.0" + ], + [ + "00:49", + "60.0" + ], + [ + "01:00", + "54.0" + ], + [ + "01:10", + "60.0" + ], + [ + "01:19", + "36.0" + ], + [ + "01:30", + "60.0" + ], + [ + "01:40", + "30.0" + ], + [ + "01:49", + "42.0" + ], + [ + "02:00", + "18.0" + ], + [ + "02:10", + "12.0" + ], + [ + "02:19", + "6.0" + ], + [ + "02:30", + "42.0" + ], + [ + "02:40", + "42.0" + ], + [ + "02:49", + "36.0" + ], + [ + "03:00", + "24.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "12.0" + ], + [ + "04:00", + "18.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_10", + "mode": "lines", + "name": "detour_10", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 6, + 6, + 12, + 6, + 12, + 12, + 6, + 30, + 24, + 12, + 48, + 18, + 18, + 48, + 24, + 96, + 60, + 78, + 72, + 84, + 108, + 102, + 60, + 144, + 162, + 150, + 168, + 174, + 228, + 222, + 204, + 246, + 240, + 228, + 288, + 294, + 438, + 336, + 282, + 318, + 378, + 372, + 414, + 462, + 432, + 450, + 522, + 414, + 468, + 408, + 486, + 426, + 474, + 522, + 468, + 480, + 402, + 480, + 426, + 360, + 270, + 300, + 306, + 270, + 246, + 264, + 216, + 174, + 234, + 222, + 234, + 186, + 144, + 192, + 108, + 90, + 48, + 66, + 60, + 54, + 60, + 36, + 60, + 30, + 42, + 18, + 12, + 6, + 42, + 42, + 36, + 24, + 6, + 6, + 6, + 0, + 12, + 18, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "18.0" + ], + [ + "11:49", + "0.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "18.0" + ], + [ + "12:19", + "0.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "18.0" + ], + [ + "12:49", + "12.0" + ], + [ + "13:00", + "12.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "42.0" + ], + [ + "13:30", + "48.0" + ], + [ + "13:40", + "18.0" + ], + [ + "13:49", + "24.0" + ], + [ + "14:00", + "48.0" + ], + [ + "14:10", + "42.0" + ], + [ + "14:19", + "72.0" + ], + [ + "14:30", + "66.0" + ], + [ + "14:40", + "54.0" + ], + [ + "14:49", + "78.0" + ], + [ + "15:00", + "66.0" + ], + [ + "15:10", + "90.0" + ], + [ + "15:19", + "102.0" + ], + [ + "15:30", + "144.0" + ], + [ + "15:40", + "72.0" + ], + [ + "15:49", + "168.0" + ], + [ + "16:00", + "174.0" + ], + [ + "16:10", + "198.0" + ], + [ + "16:19", + "156.0" + ], + [ + "16:30", + "198.0" + ], + [ + "16:40", + "228.0" + ], + [ + "16:49", + "216.0" + ], + [ + "17:00", + "228.0" + ], + [ + "17:10", + "270.0" + ], + [ + "17:19", + "294.0" + ], + [ + "17:30", + "222.0" + ], + [ + "17:40", + "336.0" + ], + [ + "17:49", + "318.0" + ], + [ + "18:00", + "342.0" + ], + [ + "18:10", + "318.0" + ], + [ + "18:19", + "390.0" + ], + [ + "18:30", + "312.0" + ], + [ + "18:40", + "390.0" + ], + [ + "18:49", + "396.0" + ], + [ + "19:00", + "372.0" + ], + [ + "19:10", + "444.0" + ], + [ + "19:19", + "426.0" + ], + [ + "19:30", + "486.0" + ], + [ + "19:40", + "462.0" + ], + [ + "19:49", + "390.0" + ], + [ + "20:00", + "540.0" + ], + [ + "20:10", + "432.0" + ], + [ + "20:19", + "468.0" + ], + [ + "20:30", + "528.0" + ], + [ + "20:40", + "540.0" + ], + [ + "20:49", + "588.0" + ], + [ + "21:00", + "552.0" + ], + [ + "21:10", + "462.0" + ], + [ + "21:19", + "618.0" + ], + [ + "21:30", + "396.0" + ], + [ + "21:40", + "336.0" + ], + [ + "21:49", + "384.0" + ], + [ + "22:00", + "336.0" + ], + [ + "22:10", + "246.0" + ], + [ + "22:19", + "330.0" + ], + [ + "22:30", + "192.0" + ], + [ + "22:40", + "246.0" + ], + [ + "22:49", + "138.0" + ], + [ + "23:00", + "210.0" + ], + [ + "23:10", + "222.0" + ], + [ + "23:19", + "216.0" + ], + [ + "23:30", + "162.0" + ], + [ + "23:40", + "126.0" + ], + [ + "23:49", + "150.0" + ], + [ + "00:00", + "150.0" + ], + [ + "00:10", + "114.0" + ], + [ + "00:19", + "66.0" + ], + [ + "00:30", + "102.0" + ], + [ + "00:40", + "54.0" + ], + [ + "00:49", + "54.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "84.0" + ], + [ + "01:19", + "48.0" + ], + [ + "01:30", + "84.0" + ], + [ + "01:40", + "24.0" + ], + [ + "01:49", + "30.0" + ], + [ + "02:00", + "60.0" + ], + [ + "02:10", + "30.0" + ], + [ + "02:19", + "12.0" + ], + [ + "02:30", + "24.0" + ], + [ + "02:40", + "30.0" + ], + [ + "02:49", + "48.0" + ], + [ + "03:00", + "12.0" + ], + [ + "03:10", + "24.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "6.0" + ], + [ + "03:49", + "6.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "detour_20", + "mode": "lines", + "name": "detour_20", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 18, + 0, + 0, + 18, + 0, + 6, + 18, + 12, + 12, + 18, + 42, + 48, + 18, + 24, + 48, + 42, + 72, + 66, + 54, + 78, + 66, + 90, + 102, + 144, + 72, + 168, + 174, + 198, + 156, + 198, + 228, + 216, + 228, + 270, + 294, + 222, + 336, + 318, + 342, + 318, + 390, + 312, + 390, + 396, + 372, + 444, + 426, + 486, + 462, + 390, + 540, + 432, + 468, + 528, + 540, + 588, + 552, + 462, + 618, + 396, + 336, + 384, + 336, + 246, + 330, + 192, + 246, + 138, + 210, + 222, + 216, + 162, + 126, + 150, + 150, + 114, + 66, + 102, + 54, + 54, + 48, + 84, + 48, + 84, + 24, + 30, + 60, + 30, + 12, + 24, + 30, + 48, + 12, + 24, + 0, + 6, + 6, + 6, + 0, + 0, + 6 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Refuel trips (per hour) — max_detour" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "12.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "30.0" + ], + [ + "12:49", + "18.0" + ], + [ + "13:00", + "18.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "12.0" + ], + [ + "13:30", + "18.0" + ], + [ + "13:40", + "30.0" + ], + [ + "13:49", + "30.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:10", + "48.0" + ], + [ + "14:19", + "84.0" + ], + [ + "14:30", + "78.0" + ], + [ + "14:40", + "54.0" + ], + [ + "14:49", + "96.0" + ], + [ + "15:00", + "78.0" + ], + [ + "15:10", + "66.0" + ], + [ + "15:19", + "150.0" + ], + [ + "15:30", + "150.0" + ], + [ + "15:40", + "90.0" + ], + [ + "15:49", + "126.0" + ], + [ + "16:00", + "102.0" + ], + [ + "16:10", + "198.0" + ], + [ + "16:19", + "138.0" + ], + [ + "16:30", + "144.0" + ], + [ + "16:40", + "192.0" + ], + [ + "16:49", + "186.0" + ], + [ + "17:00", + "234.0" + ], + [ + "17:10", + "300.0" + ], + [ + "17:19", + "168.0" + ], + [ + "17:30", + "168.0" + ], + [ + "17:40", + "330.0" + ], + [ + "17:49", + "330.0" + ], + [ + "18:00", + "372.0" + ], + [ + "18:10", + "324.0" + ], + [ + "18:19", + "378.0" + ], + [ + "18:30", + "372.0" + ], + [ + "18:40", + "474.0" + ], + [ + "18:49", + "480.0" + ], + [ + "19:00", + "498.0" + ], + [ + "19:10", + "372.0" + ], + [ + "19:19", + "498.0" + ], + [ + "19:30", + "474.0" + ], + [ + "19:40", + "504.0" + ], + [ + "19:49", + "534.0" + ], + [ + "20:00", + "426.0" + ], + [ + "20:10", + "474.0" + ], + [ + "20:19", + "444.0" + ], + [ + "20:30", + "360.0" + ], + [ + "20:40", + "432.0" + ], + [ + "20:49", + "534.0" + ], + [ + "21:00", + "444.0" + ], + [ + "21:10", + "384.0" + ], + [ + "21:19", + "468.0" + ], + [ + "21:30", + "420.0" + ], + [ + "21:40", + "378.0" + ], + [ + "21:49", + "300.0" + ], + [ + "22:00", + "264.0" + ], + [ + "22:10", + "312.0" + ], + [ + "22:19", + "330.0" + ], + [ + "22:30", + "294.0" + ], + [ + "22:40", + "252.0" + ], + [ + "22:49", + "174.0" + ], + [ + "23:00", + "162.0" + ], + [ + "23:10", + "198.0" + ], + [ + "23:19", + "228.0" + ], + [ + "23:30", + "240.0" + ], + [ + "23:40", + "186.0" + ], + [ + "23:49", + "156.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "108.0" + ], + [ + "00:19", + "108.0" + ], + [ + "00:30", + "84.0" + ], + [ + "00:40", + "66.0" + ], + [ + "00:49", + "66.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "54.0" + ], + [ + "01:19", + "42.0" + ], + [ + "01:30", + "54.0" + ], + [ + "01:40", + "48.0" + ], + [ + "01:49", + "12.0" + ], + [ + "02:00", + "42.0" + ], + [ + "02:10", + "48.0" + ], + [ + "02:19", + "48.0" + ], + [ + "02:30", + "36.0" + ], + [ + "02:40", + "36.0" + ], + [ + "02:49", + "30.0" + ], + [ + "03:00", + "30.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 6, + 0, + 12, + 6, + 6, + 30, + 18, + 18, + 18, + 12, + 18, + 30, + 30, + 24, + 48, + 84, + 78, + 54, + 96, + 78, + 66, + 150, + 150, + 90, + 126, + 102, + 198, + 138, + 144, + 192, + 186, + 234, + 300, + 168, + 168, + 330, + 330, + 372, + 324, + 378, + 372, + 474, + 480, + 498, + 372, + 498, + 474, + 504, + 534, + 426, + 474, + 444, + 360, + 432, + 534, + 444, + 384, + 468, + 420, + 378, + 300, + 264, + 312, + 330, + 294, + 252, + 174, + 162, + 198, + 228, + 240, + 186, + 156, + 156, + 108, + 108, + 84, + 66, + 66, + 48, + 54, + 42, + 54, + 48, + 12, + 42, + 48, + 48, + 36, + 36, + 30, + 30, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "6.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "6.0" + ], + [ + "11:40", + "0.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "6.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "12.0" + ], + [ + "12:40", + "6.0" + ], + [ + "12:49", + "6.0" + ], + [ + "13:00", + "24.0" + ], + [ + "13:10", + "30.0" + ], + [ + "13:19", + "30.0" + ], + [ + "13:30", + "18.0" + ], + [ + "13:40", + "30.0" + ], + [ + "13:49", + "12.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:10", + "42.0" + ], + [ + "14:19", + "54.0" + ], + [ + "14:30", + "54.0" + ], + [ + "14:40", + "72.0" + ], + [ + "14:49", + "108.0" + ], + [ + "15:00", + "90.0" + ], + [ + "15:10", + "84.0" + ], + [ + "15:19", + "120.0" + ], + [ + "15:30", + "114.0" + ], + [ + "15:40", + "120.0" + ], + [ + "15:49", + "180.0" + ], + [ + "16:00", + "96.0" + ], + [ + "16:10", + "150.0" + ], + [ + "16:19", + "168.0" + ], + [ + "16:30", + "186.0" + ], + [ + "16:40", + "246.0" + ], + [ + "16:49", + "180.0" + ], + [ + "17:00", + "246.0" + ], + [ + "17:10", + "234.0" + ], + [ + "17:19", + "252.0" + ], + [ + "17:30", + "204.0" + ], + [ + "17:40", + "288.0" + ], + [ + "17:49", + "264.0" + ], + [ + "18:00", + "324.0" + ], + [ + "18:10", + "324.0" + ], + [ + "18:19", + "390.0" + ], + [ + "18:30", + "384.0" + ], + [ + "18:40", + "408.0" + ], + [ + "18:49", + "372.0" + ], + [ + "19:00", + "318.0" + ], + [ + "19:10", + "318.0" + ], + [ + "19:19", + "456.0" + ], + [ + "19:30", + "444.0" + ], + [ + "19:40", + "384.0" + ], + [ + "19:49", + "402.0" + ], + [ + "20:00", + "366.0" + ], + [ + "20:10", + "378.0" + ], + [ + "20:19", + "360.0" + ], + [ + "20:30", + "330.0" + ], + [ + "20:40", + "474.0" + ], + [ + "20:49", + "426.0" + ], + [ + "21:00", + "456.0" + ], + [ + "21:10", + "318.0" + ], + [ + "21:19", + "342.0" + ], + [ + "21:30", + "324.0" + ], + [ + "21:40", + "276.0" + ], + [ + "21:49", + "276.0" + ], + [ + "22:00", + "300.0" + ], + [ + "22:10", + "216.0" + ], + [ + "22:19", + "270.0" + ], + [ + "22:30", + "270.0" + ], + [ + "22:40", + "246.0" + ], + [ + "22:49", + "186.0" + ], + [ + "23:00", + "156.0" + ], + [ + "23:10", + "138.0" + ], + [ + "23:19", + "204.0" + ], + [ + "23:30", + "138.0" + ], + [ + "23:40", + "120.0" + ], + [ + "23:49", + "210.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "132.0" + ], + [ + "00:19", + "84.0" + ], + [ + "00:30", + "90.0" + ], + [ + "00:40", + "18.0" + ], + [ + "00:49", + "90.0" + ], + [ + "01:00", + "72.0" + ], + [ + "01:10", + "30.0" + ], + [ + "01:19", + "36.0" + ], + [ + "01:30", + "30.0" + ], + [ + "01:40", + "36.0" + ], + [ + "01:49", + "48.0" + ], + [ + "02:00", + "30.0" + ], + [ + "02:10", + "12.0" + ], + [ + "02:19", + "30.0" + ], + [ + "02:30", + "18.0" + ], + [ + "02:40", + "36.0" + ], + [ + "02:49", + "24.0" + ], + [ + "03:00", + "42.0" + ], + [ + "03:10", + "18.0" + ], + [ + "03:19", + "12.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "6.0" + ], + [ + "03:49", + "6.0" + ], + [ + "04:00", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_6", + "mode": "lines", + "name": "occ_6", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 6, + 0, + 6, + 0, + 6, + 6, + 12, + 6, + 6, + 24, + 30, + 30, + 18, + 30, + 12, + 24, + 42, + 54, + 54, + 72, + 108, + 90, + 84, + 120, + 114, + 120, + 180, + 96, + 150, + 168, + 186, + 246, + 180, + 246, + 234, + 252, + 204, + 288, + 264, + 324, + 324, + 390, + 384, + 408, + 372, + 318, + 318, + 456, + 444, + 384, + 402, + 366, + 378, + 360, + 330, + 474, + 426, + 456, + 318, + 342, + 324, + 276, + 276, + 300, + 216, + 270, + 270, + 246, + 186, + 156, + 138, + 204, + 138, + 120, + 210, + 156, + 132, + 84, + 90, + 18, + 90, + 72, + 30, + 36, + 30, + 36, + 48, + 30, + 12, + 30, + 18, + 36, + 24, + 42, + 18, + 12, + 0, + 6, + 6, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "6.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "0.0" + ], + [ + "11:49", + "0.0" + ], + [ + "12:00", + "6.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "12.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "6.0" + ], + [ + "12:49", + "0.0" + ], + [ + "13:00", + "30.0" + ], + [ + "13:10", + "12.0" + ], + [ + "13:19", + "24.0" + ], + [ + "13:30", + "30.0" + ], + [ + "13:40", + "42.0" + ], + [ + "13:49", + "60.0" + ], + [ + "14:00", + "18.0" + ], + [ + "14:10", + "66.0" + ], + [ + "14:19", + "54.0" + ], + [ + "14:30", + "84.0" + ], + [ + "14:40", + "60.0" + ], + [ + "14:49", + "96.0" + ], + [ + "15:00", + "102.0" + ], + [ + "15:10", + "84.0" + ], + [ + "15:19", + "126.0" + ], + [ + "15:30", + "96.0" + ], + [ + "15:40", + "150.0" + ], + [ + "15:49", + "120.0" + ], + [ + "16:00", + "120.0" + ], + [ + "16:10", + "126.0" + ], + [ + "16:19", + "132.0" + ], + [ + "16:30", + "156.0" + ], + [ + "16:40", + "156.0" + ], + [ + "16:49", + "198.0" + ], + [ + "17:00", + "138.0" + ], + [ + "17:10", + "198.0" + ], + [ + "17:19", + "312.0" + ], + [ + "17:30", + "270.0" + ], + [ + "17:40", + "276.0" + ], + [ + "17:49", + "270.0" + ], + [ + "18:00", + "294.0" + ], + [ + "18:10", + "264.0" + ], + [ + "18:19", + "288.0" + ], + [ + "18:30", + "306.0" + ], + [ + "18:40", + "408.0" + ], + [ + "18:49", + "384.0" + ], + [ + "19:00", + "354.0" + ], + [ + "19:10", + "396.0" + ], + [ + "19:19", + "420.0" + ], + [ + "19:30", + "414.0" + ], + [ + "19:40", + "354.0" + ], + [ + "19:49", + "360.0" + ], + [ + "20:00", + "342.0" + ], + [ + "20:10", + "294.0" + ], + [ + "20:19", + "426.0" + ], + [ + "20:30", + "462.0" + ], + [ + "20:40", + "414.0" + ], + [ + "20:49", + "540.0" + ], + [ + "21:00", + "390.0" + ], + [ + "21:10", + "378.0" + ], + [ + "21:19", + "336.0" + ], + [ + "21:30", + "360.0" + ], + [ + "21:40", + "300.0" + ], + [ + "21:49", + "240.0" + ], + [ + "22:00", + "204.0" + ], + [ + "22:10", + "222.0" + ], + [ + "22:19", + "204.0" + ], + [ + "22:30", + "156.0" + ], + [ + "22:40", + "168.0" + ], + [ + "22:49", + "192.0" + ], + [ + "23:00", + "270.0" + ], + [ + "23:10", + "162.0" + ], + [ + "23:19", + "138.0" + ], + [ + "23:30", + "180.0" + ], + [ + "23:40", + "156.0" + ], + [ + "23:49", + "102.0" + ], + [ + "00:00", + "180.0" + ], + [ + "00:10", + "54.0" + ], + [ + "00:19", + "84.0" + ], + [ + "00:30", + "114.0" + ], + [ + "00:40", + "30.0" + ], + [ + "00:49", + "36.0" + ], + [ + "01:00", + "66.0" + ], + [ + "01:10", + "66.0" + ], + [ + "01:19", + "54.0" + ], + [ + "01:30", + "60.0" + ], + [ + "01:40", + "24.0" + ], + [ + "01:49", + "54.0" + ], + [ + "02:00", + "18.0" + ], + [ + "02:10", + "18.0" + ], + [ + "02:19", + "0.0" + ], + [ + "02:30", + "30.0" + ], + [ + "02:40", + "12.0" + ], + [ + "02:49", + "42.0" + ], + [ + "03:00", + "42.0" + ], + [ + "03:10", + "6.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "occ_8", + "mode": "lines", + "name": "occ_8", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 6, + 12, + 12, + 6, + 6, + 0, + 30, + 12, + 24, + 30, + 42, + 60, + 18, + 66, + 54, + 84, + 60, + 96, + 102, + 84, + 126, + 96, + 150, + 120, + 120, + 126, + 132, + 156, + 156, + 198, + 138, + 198, + 312, + 270, + 276, + 270, + 294, + 264, + 288, + 306, + 408, + 384, + 354, + 396, + 420, + 414, + 354, + 360, + 342, + 294, + 426, + 462, + 414, + 540, + 390, + 378, + 336, + 360, + 300, + 240, + 204, + 222, + 204, + 156, + 168, + 192, + 270, + 162, + 138, + 180, + 156, + 102, + 180, + 54, + 84, + 114, + 30, + 36, + 66, + 66, + 54, + 60, + 24, + 54, + 18, + 18, + 0, + 30, + 12, + 42, + 42, + 6, + 0, + 6, + 0, + 0, + 0, + 6 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Refuel trips (per hour) — max_occupancy" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "0.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "0.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "0.0" + ], + [ + "11:40", + "12.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "0.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "6.0" + ], + [ + "12:30", + "6.0" + ], + [ + "12:40", + "30.0" + ], + [ + "12:49", + "18.0" + ], + [ + "13:00", + "18.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "12.0" + ], + [ + "13:30", + "18.0" + ], + [ + "13:40", + "30.0" + ], + [ + "13:49", + "30.0" + ], + [ + "14:00", + "24.0" + ], + [ + "14:10", + "48.0" + ], + [ + "14:19", + "84.0" + ], + [ + "14:30", + "78.0" + ], + [ + "14:40", + "54.0" + ], + [ + "14:49", + "96.0" + ], + [ + "15:00", + "78.0" + ], + [ + "15:10", + "66.0" + ], + [ + "15:19", + "150.0" + ], + [ + "15:30", + "150.0" + ], + [ + "15:40", + "90.0" + ], + [ + "15:49", + "126.0" + ], + [ + "16:00", + "102.0" + ], + [ + "16:10", + "198.0" + ], + [ + "16:19", + "138.0" + ], + [ + "16:30", + "144.0" + ], + [ + "16:40", + "192.0" + ], + [ + "16:49", + "186.0" + ], + [ + "17:00", + "234.0" + ], + [ + "17:10", + "300.0" + ], + [ + "17:19", + "168.0" + ], + [ + "17:30", + "168.0" + ], + [ + "17:40", + "330.0" + ], + [ + "17:49", + "330.0" + ], + [ + "18:00", + "372.0" + ], + [ + "18:10", + "324.0" + ], + [ + "18:19", + "378.0" + ], + [ + "18:30", + "372.0" + ], + [ + "18:40", + "474.0" + ], + [ + "18:49", + "480.0" + ], + [ + "19:00", + "498.0" + ], + [ + "19:10", + "372.0" + ], + [ + "19:19", + "498.0" + ], + [ + "19:30", + "474.0" + ], + [ + "19:40", + "504.0" + ], + [ + "19:49", + "534.0" + ], + [ + "20:00", + "426.0" + ], + [ + "20:10", + "474.0" + ], + [ + "20:19", + "444.0" + ], + [ + "20:30", + "360.0" + ], + [ + "20:40", + "432.0" + ], + [ + "20:49", + "534.0" + ], + [ + "21:00", + "444.0" + ], + [ + "21:10", + "384.0" + ], + [ + "21:19", + "468.0" + ], + [ + "21:30", + "420.0" + ], + [ + "21:40", + "378.0" + ], + [ + "21:49", + "300.0" + ], + [ + "22:00", + "264.0" + ], + [ + "22:10", + "312.0" + ], + [ + "22:19", + "330.0" + ], + [ + "22:30", + "294.0" + ], + [ + "22:40", + "252.0" + ], + [ + "22:49", + "174.0" + ], + [ + "23:00", + "162.0" + ], + [ + "23:10", + "198.0" + ], + [ + "23:19", + "228.0" + ], + [ + "23:30", + "240.0" + ], + [ + "23:40", + "186.0" + ], + [ + "23:49", + "156.0" + ], + [ + "00:00", + "156.0" + ], + [ + "00:10", + "108.0" + ], + [ + "00:19", + "108.0" + ], + [ + "00:30", + "84.0" + ], + [ + "00:40", + "66.0" + ], + [ + "00:49", + "66.0" + ], + [ + "01:00", + "48.0" + ], + [ + "01:10", + "54.0" + ], + [ + "01:19", + "42.0" + ], + [ + "01:30", + "54.0" + ], + [ + "01:40", + "48.0" + ], + [ + "01:49", + "12.0" + ], + [ + "02:00", + "42.0" + ], + [ + "02:10", + "48.0" + ], + [ + "02:19", + "48.0" + ], + [ + "02:30", + "36.0" + ], + [ + "02:40", + "36.0" + ], + [ + "02:49", + "30.0" + ], + [ + "03:00", + "30.0" + ], + [ + "03:10", + "12.0" + ], + [ + "03:19", + "6.0" + ], + [ + "03:30", + "6.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "6.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "base", + "mode": "lines", + "name": "base", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 6, + 0, + 12, + 6, + 6, + 30, + 18, + 18, + 18, + 12, + 18, + 30, + 30, + 24, + 48, + 84, + 78, + 54, + 96, + 78, + 66, + 150, + 150, + 90, + 126, + 102, + 198, + 138, + 144, + 192, + 186, + 234, + 300, + 168, + 168, + 330, + 330, + 372, + 324, + 378, + 372, + 474, + 480, + 498, + 372, + 498, + 474, + 504, + 534, + 426, + 474, + 444, + 360, + 432, + 534, + 444, + 384, + 468, + 420, + 378, + 300, + 264, + 312, + 330, + 294, + 252, + 174, + 162, + 198, + 228, + 240, + 186, + 156, + 156, + 108, + 108, + 84, + 66, + 66, + 48, + 54, + 42, + 54, + 48, + 12, + 42, + 48, + 48, + 36, + 36, + 30, + 30, + 12, + 6, + 6, + 0, + 0, + 0, + 6 + ] + }, + { + "customdata": [ + [ + "03:00", + "0.0" + ], + [ + "03:10", + "0.0" + ], + [ + "03:19", + "0.0" + ], + [ + "03:30", + "0.0" + ], + [ + "03:40", + "0.0" + ], + [ + "03:49", + "0.0" + ], + [ + "04:00", + "0.0" + ], + [ + "04:10", + "0.0" + ], + [ + "04:19", + "0.0" + ], + [ + "04:30", + "0.0" + ], + [ + "04:40", + "0.0" + ], + [ + "04:49", + "0.0" + ], + [ + "05:00", + "0.0" + ], + [ + "05:10", + "0.0" + ], + [ + "05:19", + "0.0" + ], + [ + "05:30", + "0.0" + ], + [ + "05:40", + "0.0" + ], + [ + "05:49", + "0.0" + ], + [ + "06:00", + "0.0" + ], + [ + "06:10", + "0.0" + ], + [ + "06:19", + "0.0" + ], + [ + "06:30", + "0.0" + ], + [ + "06:40", + "0.0" + ], + [ + "06:49", + "0.0" + ], + [ + "07:00", + "0.0" + ], + [ + "07:10", + "0.0" + ], + [ + "07:19", + "0.0" + ], + [ + "07:30", + "0.0" + ], + [ + "07:40", + "0.0" + ], + [ + "07:49", + "0.0" + ], + [ + "08:00", + "0.0" + ], + [ + "08:10", + "0.0" + ], + [ + "08:19", + "0.0" + ], + [ + "08:30", + "0.0" + ], + [ + "08:40", + "0.0" + ], + [ + "08:49", + "0.0" + ], + [ + "09:00", + "0.0" + ], + [ + "09:10", + "0.0" + ], + [ + "09:19", + "0.0" + ], + [ + "09:30", + "0.0" + ], + [ + "09:40", + "0.0" + ], + [ + "09:49", + "0.0" + ], + [ + "10:00", + "0.0" + ], + [ + "10:10", + "0.0" + ], + [ + "10:19", + "0.0" + ], + [ + "10:30", + "6.0" + ], + [ + "10:40", + "0.0" + ], + [ + "10:49", + "6.0" + ], + [ + "11:00", + "0.0" + ], + [ + "11:10", + "0.0" + ], + [ + "11:19", + "0.0" + ], + [ + "11:30", + "6.0" + ], + [ + "11:40", + "0.0" + ], + [ + "11:49", + "6.0" + ], + [ + "12:00", + "18.0" + ], + [ + "12:10", + "12.0" + ], + [ + "12:19", + "24.0" + ], + [ + "12:30", + "18.0" + ], + [ + "12:40", + "12.0" + ], + [ + "12:49", + "36.0" + ], + [ + "13:00", + "24.0" + ], + [ + "13:10", + "18.0" + ], + [ + "13:19", + "42.0" + ], + [ + "13:30", + "114.0" + ], + [ + "13:40", + "90.0" + ], + [ + "13:49", + "198.0" + ], + [ + "14:00", + "210.0" + ], + [ + "14:10", + "318.0" + ], + [ + "14:19", + "564.0" + ], + [ + "14:30", + "618.0" + ], + [ + "14:40", + "840.0" + ], + [ + "14:49", + "1026.0" + ], + [ + "15:00", + "1470.0" + ], + [ + "15:10", + "1716.0" + ], + [ + "15:19", + "2370.0" + ], + [ + "15:30", + "2448.0" + ], + [ + "15:40", + "3078.0" + ], + [ + "15:49", + "3696.0" + ], + [ + "16:00", + "4248.0" + ], + [ + "16:10", + "5412.0" + ], + [ + "16:19", + "6264.0" + ], + [ + "16:30", + "7440.0" + ], + [ + "16:40", + "9168.0" + ], + [ + "16:49", + "11256.0" + ], + [ + "17:00", + "12714.0" + ], + [ + "17:10", + "14550.0" + ], + [ + "17:19", + "16650.0" + ], + [ + "17:30", + "19842.0" + ], + [ + "17:40", + "22308.0" + ], + [ + "17:49", + "24894.0" + ], + [ + "18:00", + "27864.0" + ], + [ + "18:10", + "30180.0" + ], + [ + "18:19", + "31392.0" + ], + [ + "18:30", + "32898.0" + ], + [ + "18:40", + "32748.0" + ], + [ + "18:49", + "32766.0" + ], + [ + "19:00", + "30324.0" + ], + [ + "19:10", + "28650.0" + ], + [ + "19:19", + "25680.0" + ], + [ + "19:30", + "24060.0" + ], + [ + "19:40", + "22056.0" + ], + [ + "19:49", + "19842.0" + ], + [ + "20:00", + "18084.0" + ], + [ + "20:10", + "16596.0" + ], + [ + "20:19", + "14304.0" + ], + [ + "20:30", + "12114.0" + ], + [ + "20:40", + "11292.0" + ], + [ + "20:49", + "10410.0" + ], + [ + "21:00", + "9108.0" + ], + [ + "21:10", + "8490.0" + ], + [ + "21:19", + "7800.0" + ], + [ + "21:30", + "7218.0" + ], + [ + "21:40", + "7008.0" + ], + [ + "21:49", + "7332.0" + ], + [ + "22:00", + "7152.0" + ], + [ + "22:10", + "6828.0" + ], + [ + "22:19", + "6828.0" + ], + [ + "22:30", + "7200.0" + ], + [ + "22:40", + "7116.0" + ], + [ + "22:49", + "7308.0" + ], + [ + "23:00", + "6648.0" + ], + [ + "23:10", + "7338.0" + ], + [ + "23:19", + "7278.0" + ], + [ + "23:30", + "7056.0" + ], + [ + "23:40", + "6672.0" + ], + [ + "23:49", + "6708.0" + ], + [ + "00:00", + "6114.0" + ], + [ + "00:10", + "5784.0" + ], + [ + "00:19", + "5028.0" + ], + [ + "00:30", + "4710.0" + ], + [ + "00:40", + "4494.0" + ], + [ + "00:49", + "3822.0" + ], + [ + "01:00", + "3462.0" + ], + [ + "01:10", + "3468.0" + ], + [ + "01:19", + "3282.0" + ], + [ + "01:30", + "2850.0" + ], + [ + "01:40", + "2652.0" + ], + [ + "01:49", + "2304.0" + ], + [ + "02:00", + "1968.0" + ], + [ + "02:10", + "1698.0" + ], + [ + "02:19", + "1302.0" + ], + [ + "02:30", + "1350.0" + ], + [ + "02:40", + "1356.0" + ], + [ + "02:49", + "990.0" + ], + [ + "03:00", + "876.0" + ], + [ + "03:10", + "684.0" + ], + [ + "03:19", + "570.0" + ], + [ + "03:30", + "300.0" + ], + [ + "03:40", + "186.0" + ], + [ + "03:49", + "144.0" + ], + [ + "04:00", + "144.0" + ], + [ + "04:10", + "90.0" + ], + [ + "04:19", + "60.0" + ], + [ + "04:30", + "12.0" + ], + [ + "04:40", + "18.0" + ], + [ + "04:49", + "12.0" + ] + ], + "hovertemplate": "Scenario: %{meta}
Time: %{customdata[0]}
%{customdata[1]}", + "meta": "shift_to_all_shared_tnc", + "mode": "lines", + "name": "shift_to_all_shared_tnc", + "type": "scatter", + "x": [ + 0, + 0.16666666666666666, + 0.3333333333333333, + 0.5, + 0.6666666666666666, + 0.8333333333333334, + 1, + 1.1666666666666667, + 1.3333333333333333, + 1.5, + 1.6666666666666667, + 1.8333333333333333, + 2, + 2.1666666666666665, + 2.3333333333333335, + 2.5, + 2.6666666666666665, + 2.8333333333333335, + 3, + 3.1666666666666665, + 3.3333333333333335, + 3.5, + 3.6666666666666665, + 3.8333333333333335, + 4, + 4.166666666666667, + 4.333333333333333, + 4.5, + 4.666666666666667, + 4.833333333333333, + 5, + 5.166666666666667, + 5.333333333333333, + 5.5, + 5.666666666666667, + 5.833333333333333, + 6, + 6.166666666666667, + 6.333333333333333, + 6.5, + 6.666666666666667, + 6.833333333333333, + 7, + 7.166666666666667, + 7.333333333333333, + 7.5, + 7.666666666666667, + 7.833333333333333, + 8, + 8.166666666666666, + 8.333333333333334, + 8.5, + 8.666666666666666, + 8.833333333333334, + 9, + 9.166666666666666, + 9.333333333333334, + 9.5, + 9.666666666666666, + 9.833333333333334, + 10, + 10.166666666666666, + 10.333333333333334, + 10.5, + 10.666666666666666, + 10.833333333333334, + 11, + 11.166666666666666, + 11.333333333333334, + 11.5, + 11.666666666666666, + 11.833333333333334, + 12, + 12.166666666666666, + 12.333333333333334, + 12.5, + 12.666666666666666, + 12.833333333333334, + 13, + 13.166666666666666, + 13.333333333333334, + 13.5, + 13.666666666666666, + 13.833333333333334, + 14, + 14.166666666666666, + 14.333333333333334, + 14.5, + 14.666666666666666, + 14.833333333333334, + 15, + 15.166666666666666, + 15.333333333333334, + 15.5, + 15.666666666666666, + 15.833333333333334, + 16, + 16.166666666666668, + 16.333333333333332, + 16.5, + 16.666666666666668, + 16.833333333333332, + 17, + 17.166666666666668, + 17.333333333333332, + 17.5, + 17.666666666666668, + 17.833333333333332, + 18, + 18.166666666666668, + 18.333333333333332, + 18.5, + 18.666666666666668, + 18.833333333333332, + 19, + 19.166666666666668, + 19.333333333333332, + 19.5, + 19.666666666666668, + 19.833333333333332, + 20, + 20.166666666666668, + 20.333333333333332, + 20.5, + 20.666666666666668, + 20.833333333333332, + 21, + 21.166666666666668, + 21.333333333333332, + 21.5, + 21.666666666666668, + 21.833333333333332, + 22, + 22.166666666666668, + 22.333333333333332, + 22.5, + 22.666666666666668, + 22.833333333333332, + 23, + 23.166666666666668, + 23.333333333333332, + 23.5, + 23.666666666666668, + 23.833333333333332, + 24, + 24.166666666666668, + 24.333333333333332, + 24.5, + 24.666666666666668, + 24.833333333333332, + 25, + 25.166666666666668, + 25.333333333333332, + 25.5, + 25.666666666666668, + 25.833333333333332 + ], + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 6, + 0, + 0, + 0, + 6, + 0, + 6, + 18, + 12, + 24, + 18, + 12, + 36, + 24, + 18, + 42, + 114, + 90, + 198, + 210, + 318, + 564, + 618, + 840, + 1026, + 1470, + 1716, + 2370, + 2448, + 3078, + 3696, + 4248, + 5412, + 6264, + 7440, + 9168, + 11256, + 12714, + 14550, + 16650, + 19842, + 22308, + 24894, + 27864, + 30180, + 31392, + 32898, + 32748, + 32766, + 30324, + 28650, + 25680, + 24060, + 22056, + 19842, + 18084, + 16596, + 14304, + 12114, + 11292, + 10410, + 9108, + 8490, + 7800, + 7218, + 7008, + 7332, + 7152, + 6828, + 6828, + 7200, + 7116, + 7308, + 6648, + 7338, + 7278, + 7056, + 6672, + 6708, + 6114, + 5784, + 5028, + 4710, + 4494, + 3822, + 3462, + 3468, + 3282, + 2850, + 2652, + 2304, + 1968, + 1698, + 1302, + 1350, + 1356, + 990, + 876, + 684, + 570, + 300, + 186, + 144, + 144, + 90, + 60, + 12, + 18, + 12 + ] + } + ], + "layout": { + "hovermode": "x unified", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Refuel trips (per hour) — tnc_shared_demand" + }, + "xaxis": { + "tickmode": "array", + "ticktext": [ + "03:00", + "04:00", + "05:00", + "06:00", + "07:00", + "08:00", + "09:00", + "10:00", + "11:00", + "12:00", + "13:00", + "14:00", + "15:00", + "16:00", + "17:00", + "18:00", + "19:00", + "20:00", + "21:00", + "22:00", + "23:00", + "00:00", + "01:00", + "02:00", + "03:00", + "04:00", + "05:00" + ], + "tickvals": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26 + ], + "title": { + "text": "Time of day" + } + }, + "yaxis": { + "title": { + "text": "Trips per hour" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def metric_refuel_trips_by_time_bin(new_df, pooled_df, scenario, bin_minutes):\n", + " \"\"\"\n", + " Refuel trips/hour by time of day.\n", + " trip_type == 'refuel'\n", + " \"\"\"\n", + " refuel_mask = new_df[\"trip_type\"].astype(str).str.lower().eq(\"refuel\")\n", + " bins = pd.to_numeric(new_df.loc[refuel_mask, \"depart_bin\"], errors=\"coerce\").dropna().astype(int)\n", + "\n", + " if bins.empty:\n", + " return pd.DataFrame({\"x\": [], \"y\": [], \"hover\": []})\n", + "\n", + " counts = (\n", + " bins.value_counts()\n", + " .sort_index()\n", + " .reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0)\n", + " )\n", + "\n", + " factor = 60.0 / bin_minutes\n", + " rate = counts * factor\n", + "\n", + " times = start_time + pd.to_timedelta(rate.index * bin_minutes, unit=\"m\")\n", + " vals = rate.values\n", + "\n", + " df = pd.DataFrame({\"x\": times, \"y\": vals})\n", + " df[\"hover\"] = [\n", + " f\"Refuel trips/hour: {v:,.2f} (bin trips: {int(c):,}, bin={bin_minutes} min)\"\n", + " for v, c in zip(vals, counts.values)\n", + " ]\n", + " return df\n", + "\n", + "\n", + "run_timeseries_metric(\n", + " metric_refuel_trips_by_time_bin,\n", + " \"Refuel trips (per hour)\",\n", + " \"Trips per hour\",\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Share of refueling trips — time_bin_size\n", + " refuel_trips all_trips share_trips refuel_vmt all_vmt share_vmt\n", + "scenario \n", + "base 3006 428566 0.7% 5779.081723 1.874488e+06 0.31%\n", + "timebin_5 3586 429146 0.84% 6948.751708 1.905020e+06 0.36%\n", + "timebin_15 2346 427906 0.55% 5349.993074 1.859414e+06 0.29%\n", + "\n", + "Share of refueling trips — max_detour\n", + " refuel_trips all_trips share_trips refuel_vmt all_vmt share_vmt\n", + "scenario \n", + "base 3006 428566 0.7% 5779.081723 1.874488e+06 0.31%\n", + "detour_5 3015 428575 0.7% 6221.878565 1.875645e+06 0.33%\n", + "detour_10 3010 428570 0.7% 5815.520398 1.875214e+06 0.31%\n", + "detour_20 3057 428617 0.71% 6135.046131 1.875890e+06 0.33%\n", + "\n", + "Share of refueling trips — max_occupancy\n", + " refuel_trips all_trips share_trips refuel_vmt all_vmt share_vmt\n", + "scenario \n", + "base 3006 428566 0.7% 5779.081723 1.874488e+06 0.31%\n", + "occ_6 2690 400900 0.67% 5594.973175 1.754936e+06 0.32%\n", + "occ_8 2589 384969 0.67% 5350.687942 1.697862e+06 0.32%\n", + "\n", + "Share of refueling trips — tnc_shared_demand\n", + " refuel_trips all_trips share_trips refuel_vmt all_vmt share_vmt\n", + "scenario \n", + "base 3006 428566 0.7% 5779.081723 1.874488e+06 0.31%\n", + "shift_to_all_shared_tnc 130968 22328970 0.59% 228872.181351 5.502521e+07 0.42%\n" + ] + } + ], + "source": [ + "def metric_refuel_share(new_df, pooled_df):\n", + " tt = new_df[\"trip_type\"].astype(str).str.lower()\n", + " is_refuel = tt.eq(\"refuel\")\n", + "\n", + " dist = pd.to_numeric(new_df[dist_col_new], errors=\"coerce\").fillna(0.0)\n", + "\n", + " n_ref = int(is_refuel.sum())\n", + " n_all = len(new_df)\n", + " share_trips = n_ref / n_all if n_all else np.nan\n", + "\n", + " vmt_ref = dist[is_refuel].sum()\n", + " vmt_all = dist.sum()\n", + " share_vmt = vmt_ref / vmt_all if vmt_all else np.nan\n", + "\n", + " return {\n", + " \"refuel_trips\": n_ref,\n", + " \"all_trips\": n_all,\n", + " \"share_trips\": share_trips,\n", + " \"refuel_vmt\": vmt_ref,\n", + " \"all_vmt\": vmt_all,\n", + " \"share_vmt\": share_vmt,\n", + " }\n", + "\n", + "run_scalar_metric(metric_refuel_share, \"Share of refueling trips\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### QAQC refuel trips" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "histnorm": "probability", + "hovertemplate": "Scenario: base
Dist since last refuel: %{x:,.1f}
Bin share: %{y:.3f}", + "name": "base", + "nbinsx": 40, + "opacity": 0.5, + "type": "histogram", + "x": [ + 303.05935077369213, + 302.0277832970023, + 328.4583800211549, + 312.3170074522495, + 302.500984326005, + 305.6483811736107, + 300.7809719592333, + 309.0178837329149, + 305.9600202292204, + 314.36535021290183, + 311.3285228610039, + 301.2832396514714, + 300.9688795953989, + 302.5571282431483, + 301.1913935672492, + 304.5419755447656, + 311.95037150382996, + 304.8479542732239, + 310.1887593381107, + 335.043269880116, + 307.87894505262375, + 304.19128730893135, + 319.12602354213595, + 319.61751952022314, + 313.6995066702366, + 308.05375488102436, + 307.96177234500647, + 312.57877600193024, + 300.36383923888206, + 302.4437962025404, + 343.75546382181346, + 310.5111052468419, + 301.97086971998215, + 305.7736021652818, + 311.59876960515976, + 310.2180900722742, + 316.70033866912127, + 309.2534953728318, + 303.6213539689779, + 306.87880551815033, + 308.78246125765145, + 307.36643739044666, + 311.8447312116623, + 308.1272594258189, + 305.66150472685695, + 300.7901064231992, + 326.6785190925002, + 303.49772671610117, + 307.9254451841116, + 312.08853758871555, + 310.9732748121023, + 303.6930218990892, + 306.91004710644484, + 303.9603032693267, + 307.0782024990767, + 305.51488280296326, + 301.1524461582303, + 323.6031653881073, + 305.24971674382687, + 302.15315029397607, + 306.0283553376794, + 301.62222325988114, + 324.9693411812186, + 304.6466093733907, + 302.33178248256445, + 308.4011985063553, + 309.6786765176803, + 303.30243913829327, + 302.7448989972472, + 323.1225180029869, + 304.88270218484104, + 308.9237494599074, + 321.00638941675425, + 302.5698648765683, + 311.05923310667276, + 302.99641375243664, + 314.6590048093349, + 300.2332567870617, + 304.2764569725841, + 351.0890743136406, + 319.6011737212539, + 319.40625468827784, + 303.42675479501486, + 318.0485939010978, + 316.38236552476883, + 304.03108432888985, + 301.6547641605139, + 305.8403547909111, + 302.8016467690468, + 307.55617136508226, + 302.7959830313921, + 315.8652979377657, + 319.0523448884487, + 313.14549069851637, + 309.6547255702317, + 306.47862482070923, + 320.8329273313284, + 310.1553524918854, + 312.21151746064425, + 318.2790237739682, + 309.270659474656, + 312.46332196705043, + 338.43791285157204, + 308.16235522925854, + 301.5627426356077, + 309.61365386098623, + 311.72839760035276, + 304.7653804346919, + 302.7746298983693, + 311.0695480592549, + 302.10578379034996, + 310.13251220434904, + 305.05472461879253, + 300.3834171369672, + 314.6545832082629, + 312.0213568210602, + 301.470994643867, + 305.11174804344773, + 300.47224608436227, + 311.7386389747262, + 303.58863177895546, + 325.31609412282705, + 307.8580992333591, + 304.83571030944586, + 334.95575720630586, + 308.4330621920526, + 307.7646146863699, + 304.22346837073565, + 301.9849043264985, + 308.24136650562286, + 305.22428319603205, + 322.6147562302649, + 329.5096691250801, + 315.8713607415557, + 310.1419327184558, + 324.4522842988372, + 309.819569632411, + 303.18776259571314, + 319.02547485008836, + 318.5547391921282, + 312.26369090378284, + 306.0426619723439, + 313.14772672206163, + 307.0486485436559, + 304.019351311028, + 303.55992729216814, + 306.21284763514996, + 322.0965342670679, + 308.72747288644314, + 305.2456266358495, + 304.13440285623074, + 300.6103611588478, + 301.05425895005465, + 311.75650069117546, + 303.6848474740982, + 310.55475664138794, + 302.1965455748141, + 302.4253742881119, + 312.82555916905403, + 305.8414139561355, + 301.9848632402718, + 308.6080617457628, + 314.51171595416963, + 302.1019004583359, + 302.3027833085507, + 300.8685479387641, + 303.3737695515156, + 315.38831147551537, + 302.559328943491, + 313.5683509558439, + 353.52415975928307, + 300.64745868742466, + 303.3601732701063, + 303.23471523076296, + 317.74146420508623, + 313.20218562707305, + 304.858241610229, + 309.5162803195417, + 302.5020260922611, + 316.07957288622856, + 324.7833179682493, + 313.61081886291504, + 303.5642926543951, + 319.3996091373265, + 316.87243001163006, + 303.2511771917343, + 302.3622083067894, + 304.799329765141, + 306.2370705679059, + 312.86552783846855, + 325.65443319268525, + 303.27021887153387, + 303.99290785193443, + 364.0318616852164, + 310.4132724311203, + 300.82330261170864, + 300.90348318219185, + 301.6341687887907, + 305.0318106971681, + 301.0415097028017, + 302.8542994558811, + 305.382523778826, + 321.01786617934704, + 303.9109229594469, + 305.4837296642363, + 302.94288386404514, + 303.40426011383533, + 313.3314496874809, + 323.40099601075053, + 308.85758674889803, + 311.4984999895096, + 301.1887626051903, + 302.0374231040478, + 302.5204994827509, + 302.72897017002106, + 313.54354601353407, + 310.88004916906357, + 307.54498525336385, + 308.1879484858364, + 313.38196786493063, + 315.0524936262518, + 300.9325694292784, + 350.3046523332596, + 304.0702700763941, + 313.66074392199516, + 302.8382567316294, + 314.7155269086361, + 343.41310543194413, + 327.7112807184458, + 311.4234161116183, + 301.1736772581935, + 304.4975567404181, + 326.94743125513196, + 311.0725500602275, + 300.7089400291443, + 301.8185060247779, + 307.8512169122696, + 319.14377285540104, + 361.1791851744056, + 301.64985270798206, + 314.44221287220716, + 323.9303357973695, + 339.62650415301323, + 317.6018003895879, + 303.5780913978815, + 310.5991051644087, + 303.779848523438, + 300.3905310407281, + 308.0158751010895, + 346.98956637084484, + 313.37977546453476, + 312.24720142781734, + 304.56138587743044, + 301.34345658123493, + 328.78198102116585, + 307.5633948892355, + 304.1249355003238, + 302.7294314876199, + 303.04590753652155, + 313.3384571969509, + 314.5902655683458, + 305.72430909983814, + 301.123735640198, + 361.6096513867378, + 307.04844979941845, + 344.13156416267157, + 323.5225539430976, + 301.63281237334013, + 306.4178882483393, + 301.65455218032, + 304.2593291234225, + 307.5543700866401, + 309.9837406128645, + 302.6390942260623, + 314.13132905960083, + 304.6637527644634, + 308.6856186017394, + 305.93682307749987, + 310.37053382210433, + 304.6368846409023, + 304.50316151976585, + 300.7137396633625, + 304.36634475179017, + 306.4602628201246, + 301.72426629811525, + 313.280293636024, + 321.65547184087336, + 317.20420175790787, + 308.53483635932207, + 304.89269402623177, + 306.30446115881205, + 304.6399410665035, + 300.9154546353966, + 306.1022778302431, + 301.87629088386893, + 302.6929132658988, + 303.3514776006341, + 300.6593281812966, + 304.7414313107729, + 306.29699454829097, + 325.20643223822117, + 306.8776340633631, + 305.68122409284115, + 306.14575599879026, + 303.7830290198326, + 300.48038940131664, + 304.81044202297926, + 308.44190663844347, + 319.09261275082827, + 313.5202496945858, + 305.54037909954786, + 303.79289385676384, + 313.369119156152, + 302.8591178357601, + 305.815437681973, + 320.3531769029796, + 303.47327372059226, + 302.14817257225513, + 311.65909323468804, + 306.6705843899399, + 311.2419026121497, + 326.9374008253217, + 300.64452992752194, + 300.5158621519804, + 339.00467900186777, + 302.7000363692641, + 304.80386413633823, + 337.149787992239, + 311.5595486983657, + 312.5188779979944, + 302.44924483820796, + 301.28871751204133, + 304.9654672443867, + 304.2403876706958, + 308.6535895168781, + 307.81316904723644, + 305.21350575238466, + 316.45804662257433, + 302.4978824406862, + 301.5243395008147, + 308.42291185073555, + 308.5886851102114, + 303.8844919577241, + 305.5082997381687, + 304.53022211045027, + 308.0670230463147, + 368.12055318802595, + 303.64203160628676, + 307.9140286296606, + 301.55349979922175, + 305.8535031825304, + 317.0179797410965, + 306.7610377315432, + 301.1573091596365, + 324.3339904714376, + 303.19633761048317, + 325.8157117366791, + 301.80318553745747, + 305.51391495764256, + 321.23406464606524, + 305.1605892330408, + 309.9105415046215, + 304.9820691868663, + 312.51314198970795, + 300.8588388264179, + 308.6895478963852, + 300.29892510175705, + 302.12421356886625, + 310.9218749627471, + 308.84900736808777, + 305.5338641703129, + 300.59567484259605, + 304.593999966979, + 303.45319944247603, + 300.916278898716, + 300.93448980152607, + 315.22160256654024, + 302.1884065940976, + 304.16329549998045, + 320.6648793518543, + 314.0417132228613, + 319.8622509986162, + 326.0590899400413, + 318.0978051945567, + 300.7528107240796, + 305.82639157027006, + 304.19050092063844, + 312.0535492300987, + 311.2089769244194, + 311.22262201085687, + 310.5009533315897, + 306.2846059985459, + 309.6189572736621, + 305.0872354656458, + 314.6730389147997, + 305.31359376199543, + 315.7647892571986, + 324.22728983312845, + 303.6022804323584, + 317.8224330339581, + 333.6809972524643, + 323.0351615771651, + 302.9893321171403, + 305.10837035626173, + 309.6192399561405, + 307.43271121382713, + 312.70689287781715, + 310.95546574890614, + 303.89759860932827, + 303.26603147387505, + 309.94527108967304, + 302.92584685236216, + 305.25695111602545, + 308.71746188774705, + 312.3177189230919, + 303.8727502524853, + 305.74611408263445, + 302.5065714083612, + 317.6693177521229, + 303.8194375131279, + 304.2209090143442, + 301.37774407304823, + 311.8302362188697, + 309.791634991765, + 301.0376371592283, + 301.1889255717397, + 310.9263251014054, + 308.7937367334962, + 303.7749871984124, + 308.7587036266923, + 309.0108539685607, + 304.44472311623394, + 310.979107901454, + 311.4313468448818, + 303.1052142623812, + 304.48211873322725, + 304.75325498729944, + 305.1886183694005, + 367.58411814272404, + 308.87622633576393, + 302.1932651232928, + 301.9311950728297, + 301.03338795900345, + 331.02259112894535, + 305.49716828018427, + 322.1832425445318, + 301.1117838397622, + 304.03071492910385, + 301.2035632021725, + 303.2082785665989, + 301.64283622801304, + 308.8116062730551, + 311.3149590604007, + 304.1887896731496, + 301.0186753645539, + 303.22611504793167, + 305.9375632442534, + 310.01461028307676, + 301.5931568518281, + 309.6833669990301, + 303.01782873272896, + 304.0169597417116, + 308.1501164585352, + 305.13371773064137, + 302.1315890401602, + 307.06815138459206, + 315.9098388031125, + 328.3397514820099, + 301.62357682548463, + 309.69330184161663, + 305.86357236653566, + 339.52486185729504, + 320.75336830317974, + 315.48134283721447, + 301.46130665391684, + 333.6768909841776, + 301.3160840123892, + 302.7454975694418, + 314.73429387807846, + 305.48094190098345, + 314.51660822331905, + 302.7048512585461, + 311.89381029084325, + 301.61303763091564, + 305.0586597248912, + 301.5932202935219, + 302.52575865387917, + 303.92876655980945, + 302.94047152996063, + 301.41465190052986, + 303.4168940000236, + 308.28199360892177, + 309.2755982801318, + 305.63820569217205, + 309.6780370399356, + 333.6591239646077, + 305.0275115519762, + 304.66713866591454, + 305.306040327996, + 330.0772547312081, + 312.15104008466005, + 306.0667606666684, + 309.1100794672966, + 305.86068607866764, + 301.54124853014946, + 301.5502326115966, + 301.7683228570968, + 309.97727709263563, + 322.84720827639103, + 302.96323473751545, + 305.3819745182991, + 302.854737136513, + 307.4965050444007, + 318.2889935839921, + 306.81314579211175, + 308.64644081890583, + 303.5639638453722, + 309.02913236245513, + 301.26020778156817, + 318.6792843490839, + 305.7177343405783, + 302.4322088882327, + 300.36351707950234, + 301.33667282760143, + 304.2679138481617, + 303.8570327349007, + 302.44632770866156, + 307.0796595662832, + 316.34775848686695, + 316.5507122129202, + 350.0149428397417, + 304.6523360013962, + 308.0663896650076, + 302.62830924987793, + 307.1120621263981, + 302.59100610762835, + 313.23770536109805, + 311.51394541561604, + 325.1251261495054, + 306.2806640267372, + 304.9493908844888, + 305.85043198242784, + 302.79859928041697, + 313.09618621505797, + 300.89870543032885, + 300.7813545316458, + 301.75890174508095, + 326.7339008152485, + 302.4546654894948, + 300.80320558696985, + 303.02751837670803, + 323.8524117320776, + 307.31519662588835, + 301.52453898638487, + 321.9728167504072, + 325.7739123478532, + 322.28119517862797, + 365.2596457377076, + 307.3802812099457, + 304.32800617814064, + 313.3101145848632, + 309.2315970361233, + 307.26197185739875, + 309.65889060497284, + 321.32821560651064, + 340.8619062900543, + 307.5574792176485, + 304.3800691962242, + 302.85177110880613, + 324.3459995985031, + 314.0375318080187, + 318.16530337929726, + 302.5340092089027, + 313.8953899629414, + 310.89630917459726, + 307.78624553978443, + 313.0837125852704, + 311.15786289796233, + 316.49844790250063, + 306.4535994902253, + 300.9231566786766, + 302.4948533568531, + 301.44382488168776, + 307.52409689873457, + 310.2925183624029, + 303.20455603301525, + 302.62292637676, + 309.4509262815118, + 306.9402848780155, + 302.09874987974763, + 307.90301401913166, + 310.02807925641537, + 303.2893670909107, + 302.1366039477289, + 301.51607562974095, + 306.003452911973, + 309.95483274012804, + 303.1744133979082, + 308.417264662683, + 308.41268426924944, + 324.2990426495671, + 302.8921535909176, + 305.4011514931917, + 322.1167204603553, + 302.10818411409855, + 302.4593282416463, + 306.48667860776186, + 305.5888133812696, + 302.8786298632622, + 351.3478811532259, + 301.4868436306715, + 330.9269219711423, + 312.58714666217566, + 302.80031507462263, + 310.44015357643366, + 301.20191537961364, + 303.9860670119524, + 303.5677570849657, + 307.02355770021677, + 317.72128952667117, + 312.2112650722265, + 309.53594349324703, + 308.20837192982435, + 321.9923782721162, + 312.1833504214883, + 301.5955509990454, + 309.7816281579435, + 301.62718196213245, + 308.9799487441778, + 325.0306099280715, + 309.71460161730647, + 328.94924961030483, + 302.11107644438744, + 312.18251375854015, + 305.74933858960867, + 301.46173890680075, + 302.5465731918812, + 326.0223877131939, + 302.09866232424974, + 310.5196674950421, + 315.9220798127353, + 300.46981159597635, + 306.4569214731455, + 317.67015977203846, + 305.99039256572723, + 301.27405074983835, + 301.59098798409104, + 303.802366964519, + 302.78717087209225, + 333.99844006448984, + 302.63059703074396, + 305.42089304327965, + 307.2805146127939, + 319.90703025460243, + 329.4490562006831, + 311.5240097269416, + 307.8867827709764, + 303.19341680407524, + 338.5686809569597, + 308.2382209971547, + 309.8169636428356, + 315.1679041944444, + 317.02409505844116, + 321.0253547206521, + 303.7198351584375, + 301.89565248787403, + 303.2948269098997, + 308.3608982935548, + 304.2859699167311, + 305.54158648103476, + 305.37851671501994, + 302.43432219326496, + 303.0630951076746, + 316.8214093744755, + 311.06381469778717, + 319.7989133223891, + 315.70018772780895, + 321.4893788397312, + 301.4755376800895, + 313.20534285344183, + 301.6593679487705, + 300.3777375295758, + 313.81962034106255, + 306.2141845282167, + 301.00967767089605, + 306.4636991098523, + 314.1331076398492, + 324.43989384919405, + 315.362716563046, + 306.49094343930483, + 304.3139332383871, + 306.0767945423722, + 307.61839410848916, + 307.7601996064186, + 329.4329764097929, + 316.4092822149396, + 326.1675454862416, + 313.9942143894732, + 310.3924823626876, + 303.1565811634064, + 307.9640837162733, + 307.3645620793104, + 303.1919396594167, + 306.0804755408317, + 311.6934756860137, + 301.8153341412544, + 301.4486770108342, + 313.80055267736316, + 323.2138752788305, + 307.5942720025778, + 303.7275437787175, + 339.0762415230274, + 307.59737346321344, + 301.08688946813345, + 302.9721023738384, + 307.36096773296595, + 329.46138595044613, + 301.42665876448154, + 314.544711753726, + 313.42030892521143, + 311.2251798734069, + 322.23336593806744, + 313.9016944169998, + 301.06797018647194, + 361.8487813696265, + 305.252677410841, + 300.6267145052552, + 302.0119873508811, + 300.54121628403664, + 307.24237833172083, + 306.57270312309265, + 306.87564580887556, + 306.2622981071472, + 316.6492492184043, + 302.1921287998557, + 304.26397124677896, + 302.6946150958538, + 305.5958093069494, + 304.1163820028305, + 304.1869967877865, + 304.49746488034725, + 302.0104611515999, + 305.4714135862887, + 303.20658065006137, + 304.6542682349682, + 309.74038287997246, + 304.54357704892755, + 314.1216376237571, + 310.22221767902374, + 312.7932930737734, + 304.3538213968277, + 304.8186970539391, + 311.0105442106724, + 324.71143666654825, + 307.1190021112561, + 309.8720204010606, + 313.92452047020197, + 311.29730567894876, + 301.96073089540005, + 306.8793219476938, + 305.8206690400839, + 309.4142152220011, + 303.6294138804078, + 300.79137175530195, + 303.58108308166265, + 307.3116775751114, + 303.88229101896286, + 307.3924115821719, + 301.2490521967411, + 302.08301996439695, + 305.45533245801926, + 310.35894668102264, + 311.5144855324179, + 301.37019281089306, + 306.03432742506266, + 308.9408590309322, + 302.8851176574826, + 308.1730433553457, + 304.51977175474167, + 301.05309188365936, + 304.4002259373665, + 303.63880304805934, + 314.490521915257, + 302.29496578872204, + 308.0586333498359, + 305.8886557519436, + 310.0567803606391, + 314.44556693546474, + 304.7984720170498, + 301.5903087556362, + 320.7846977747977, + 303.30583130940795, + 300.5740794464946, + 310.94973466545343, + 304.7451131939888, + 305.463300563395, + 303.9556446671486, + 305.01009991019964, + 301.693236425519, + 303.72400166094303, + 300.9397060573101, + 305.12806260585785, + 310.11063093319535, + 329.24493626505136, + 310.9585796967149, + 305.6924711763859, + 302.3978827409446, + 306.24287198483944, + 307.9920205771923, + 306.59721606224775, + 317.36330449581146, + 308.33659118413925, + 310.35995772480965, + 304.7767466660589, + 302.1398792825639, + 301.15778141096234, + 305.17700123786926, + 304.1887920089066, + 320.020301386714, + 326.4366592466831, + 304.66940942406654, + 311.26594918221235, + 300.93059941381216, + 331.3915504962206, + 303.4591506291181, + 301.9795444905758, + 303.4274310618639, + 314.24462300539017, + 301.69329925626516, + 304.58451132290065, + 308.33607252687216, + 303.1216837987304, + 302.43522630631924, + 302.83321461826563, + 301.9015920907259, + 312.58984128013253, + 329.41295152902603, + 303.7368832603097, + 303.5797980129719, + 319.54441675543785, + 315.2830762844533, + 301.92864812910557, + 306.12577022612095, + 303.8041648566723, + 314.0512157678604, + 315.92380183935165, + 347.0796128362417, + 301.7467767447233, + 304.5983079858124, + 301.01870370283723, + 307.9838101565838, + 301.5937547236681, + 301.6798574104905, + 302.80737805366516, + 305.32740157470107, + 307.51106083393097, + 306.2399645522237, + 308.0692430101335, + 307.2489248737693, + 307.4074510112405, + 303.56639993190765, + 311.3859347552061, + 304.80552799999714, + 316.46853629499674, + 315.4333622548729, + 304.18323174491525, + 301.17614047415555, + 309.0086632221937, + 301.54457599669695, + 308.97051960229874, + 314.8736403360963, + 300.2998760640621, + 305.71316681057215, + 316.92086263000965, + 301.41544680297375, + 305.4518686570227, + 303.1812968403101, + 305.61035662703216, + 312.261826524511, + 310.079233571887, + 307.8740791436285, + 304.35413064062595, + 304.88051281124353, + 304.94027335196733, + 315.6650934368372, + 302.0108522698283, + 315.14844278246164, + 303.10371796786785, + 307.8859871532768, + 332.05465142428875, + 311.29355794750154, + 314.2699292898178, + 301.57419092953205, + 318.9079586863518, + 322.0435811728239, + 301.6710683181882, + 309.4614132344723, + 301.63799461722374, + 303.15202429518104, + 302.929664850235, + 310.3303339071572, + 311.83468225598335, + 313.6166155934334, + 304.9255526214838, + 310.63667199760675, + 307.87796676903963, + 309.8784531056881, + 302.06441773474216, + 312.2064738459885, + 333.4655105341226, + 306.1125112324953, + 303.7119631189853, + 300.9967786297202, + 309.60839176364243, + 331.328827066347, + 302.1045407727361, + 308.9366780668497, + 304.7138926833868, + 311.5704955458641, + 305.2498303949833, + 321.28311816602945, + 304.0949927046895, + 305.1884592548013, + 314.6367562264204, + 344.8535831272602, + 311.644866079092, + 314.02907609939575, + 308.5517600774765, + 302.34857366234064, + 303.20426032692194, + 311.2520308084786, + 304.80608016997576, + 327.46338026225567, + 306.28586681187153, + 364.4701738655567, + 307.54983735084534, + 302.83728041499853, + 313.1436867788434, + 306.1288618594408, + 301.52881506830454, + 314.4642710722983, + 310.4544987156987, + 302.36206133663654, + 302.9565177336335, + 317.746598623693, + 302.22288478165865, + 304.4102264530957, + 301.9381352290511, + 313.74411795288324, + 301.53095508366823, + 339.2882057055831, + 307.77290365844965, + 303.1091097891331, + 308.0440583880991, + 301.89238081872463, + 312.5612943805754, + 313.2416712194681, + 322.15335250645876, + 305.20809319615364, + 320.16620747745037, + 310.0878194645047, + 304.7903878521174, + 335.4429065436125, + 304.22172071784735, + 300.9783055484295, + 319.01435190439224, + 313.298799354583, + 319.76489689946175, + 352.92646707594395, + 320.03090661019087, + 300.4754358381033, + 303.48441588133574, + 305.1087667271495, + 303.56682854890823, + 300.5229952558875, + 316.74337796121836, + 305.88408306986094, + 329.7830640487373, + 310.3610748760402, + 312.2324337437749, + 302.29636585712433, + 313.4123653843999, + 305.02410883829, + 305.10130701959133, + 308.69727712869644, + 359.44816052913666, + 308.2675048559904, + 310.4412025138736, + 314.1004318445921, + 301.24273040145636, + 305.4942214936018, + 303.2248316258192, + 301.0287575721741, + 303.67102386802435, + 310.1443803012371, + 343.4707837626338, + 309.2516732811928, + 308.33791988343, + 302.0704319626093, + 310.0365254022181, + 303.3789193816483, + 307.44387006014585, + 311.1431686729193, + 304.22778341919184, + 329.8196378201246, + 304.20776081830263, + 310.7801279146224, + 303.94828825443983, + 306.96146159619093, + 305.51232220977545, + 304.2091942317784, + 310.53613640740514, + 311.4252375513315, + 305.52201778814197, + 342.0600756779313, + 305.7882998883724, + 302.1818530969322, + 306.8602861184627, + 302.61211950331926, + 301.376795463264, + 310.5170283615589, + 304.6781157627702, + 313.6716280281544, + 307.2490106523037, + 305.3693317472935, + 308.146233830601, + 314.9731426797807, + 308.9434025939554, + 307.3841607607901, + 364.96422965824604, + 304.1041366904974, + 302.8834086507559, + 307.0675763487816, + 356.2786010764539, + 322.63041929900646, + 304.9154870659113, + 312.278480887413, + 330.515834916383, + 367.13765128701925, + 303.2218512445688, + 306.8056754209101, + 305.27714942395687, + 303.14016699790955, + 300.6309834420681, + 301.5619219839573, + 308.05179864168167, + 310.63764283806086, + 303.0145359709859, + 309.84925179183483, + 309.6541614830494, + 314.6859191507101, + 322.84272629767656, + 328.62462133169174, + 301.3101035170257, + 304.6456905603409, + 301.5069991648197, + 300.52050767093897, + 331.41255075484514, + 333.30702725052834, + 341.8453113846481, + 312.2839056625962, + 300.41083396971226, + 315.37411256320775, + 312.47322089225054, + 305.4710648730397, + 302.64141783490777, + 302.9362802952528, + 305.27037866413593, + 304.2490750178695, + 307.09168316051364, + 358.4822908490896, + 311.1666688993573, + 304.2102560698986, + 302.5915804877877, + 381.1551387254149, + 322.35213066264987, + 330.4059078656137, + 304.8481403402984, + 303.9492008648813, + 320.49785290658474, + 305.04401180148125, + 367.7705344930291, + 303.5018324367702, + 328.63411658257246, + 305.18567352741957, + 304.2346335723996, + 303.01508608460426, + 312.95609624683857, + 307.9536724742502, + 303.7133989408612, + 301.008959621191, + 304.66184344887733, + 384.90426011383533, + 301.74844375252724, + 314.05921383574605, + 339.91899264603853, + 300.98505130410194, + 302.96635438501835, + 302.14383551478386, + 302.69991889595985, + 305.46872583404183, + 300.7961363233626, + 305.10707572102547, + 303.96800500154495, + 306.9785723350942, + 307.58418344706297, + 304.89581164717674, + 304.7986173518002, + 364.5559302903712, + 305.5787981748581, + 328.8963644057512, + 305.46172150969505, + 302.49743281304836, + 300.74935860186815, + 302.6406224220991, + 321.52066876366735, + 301.8605128750205, + 306.3382166326046, + 302.3799777328968, + 311.14249423518777, + 301.93968664109707, + 311.44094717502594, + 309.04055741243064, + 304.8934363760054, + 305.24910593032837, + 370.0352419987321, + 334.58929091505706, + 313.8216400742531, + 302.7630339972675, + 304.1640191450715, + 312.4194559454918, + 310.0894523784518, + 305.9013965576887, + 303.74438259005547, + 309.312300093472, + 316.689929112792, + 305.3405205719173, + 305.499167278409, + 301.6511349529028, + 304.6675712391734, + 319.509220674634, + 322.7335572093725, + 318.9881608337164, + 300.5964840725064, + 303.2109457589686, + 307.1165948845446, + 312.8515947908163, + 304.7383938729763, + 303.16785398870707, + 302.9578877687454, + 313.08237463980913, + 303.65041971579194, + 311.0123017579317, + 314.09590299613774, + 302.29029136151075, + 302.33553775958717, + 313.37397722527385, + 305.1885837428272, + 306.1509875319898, + 324.9002990424633, + 303.0040639284998, + 301.890173073858, + 303.55358662456274, + 303.49932819604874, + 309.6813327614218, + 300.53482765704393, + 304.86472970992327, + 316.7652690038085, + 309.8881036490202, + 304.20929896086454, + 318.1875386312604, + 328.995164681226, + 301.23077541589737, + 304.95151218771935, + 308.65081233531237, + 305.4777181558311, + 306.0699672922492, + 300.5816023387015, + 306.1698761507869, + 307.37784038484097, + 305.98889968544245, + 301.49924190342426, + 305.04839141853154, + 313.74923218786716, + 345.7375178039074, + 317.04104755818844, + 309.9297976307571, + 300.67400641925633, + 304.53096954524517, + 300.43755772709846, + 320.2899943217635, + 305.7453814893961, + 301.40949000418186, + 309.5150822661817, + 304.37000446766615, + 311.08623813837767, + 313.590813703835, + 308.4602317549288, + 303.8275277093053, + 304.96976760588586, + 304.30495254695415, + 303.56531700491905, + 301.2871139459312, + 302.91538194566965, + 310.63053277879953, + 308.1757777258754, + 305.08773607574403, + 322.14638401195407, + 302.6972572952509, + 305.3950717113912, + 301.6549288276583, + 314.08019652962685, + 309.8647929057479, + 314.8648149445653, + 315.4887049533427, + 303.5149546414614, + 304.39744620770216, + 310.83917312324047, + 306.97198912501335, + 308.28057458251715, + 302.2296952512115, + 301.2285970672965, + 302.12651228904724, + 313.4045026898384, + 307.0490252748132, + 309.4923234824091, + 323.23536515422165, + 311.311135802418, + 345.8127315938473, + 304.31711902469397, + 303.20159658789635, + 307.62829245626926, + 303.2875824831426, + 311.8300316631794, + 314.46518309414387, + 380.44697999954224, + 301.0799572058022, + 306.23592937737703, + 308.07662987709045, + 304.4440327882767, + 313.75984942913055, + 300.9725761860609, + 309.8100030273199, + 310.69199572503567, + 302.8322867527604, + 305.4483730047941, + 314.5315066128969, + 304.6205532029271, + 303.69028589874506, + 312.7600840572268, + 314.11091559380293, + 302.85983107984066, + 304.61940640956163, + 316.34054885804653, + 302.03190246224403, + 303.2539746388793, + 303.6987125389278, + 303.61232862994075, + 307.0573357902467, + 304.80188155174255, + 307.6866783350706, + 313.50927598029375, + 302.607290700078, + 310.96804190054536, + 327.26697540283203, + 303.2692765221, + 302.22620256245136, + 310.28100292384624, + 314.61274281330407, + 311.80835311487317, + 303.18819658458233, + 306.76433454826474, + 302.61512934975326, + 302.96837592311203, + 309.30962163954973, + 300.6989971138537, + 304.83917025104165, + 301.1516717635095, + 309.704179674387, + 308.556990981102, + 321.92059391736984, + 301.3392286784947, + 301.6441782042384, + 333.8863871693611, + 310.4641307108104, + 309.060127183795, + 304.3002411723137, + 305.37086982280016, + 301.769061177969, + 333.2598794847727, + 362.95118901878595, + 302.67649801820517, + 300.7041023746133, + 302.10747013427317, + 300.24890292808414, + 304.4319409132004, + 311.8892135322094, + 325.8965906351805, + 302.8832120075822, + 306.30458407104015, + 309.02783531695604, + 307.68877974152565, + 302.67985935136676, + 345.9116207957268, + 309.08296363055706, + 302.9928424656391, + 313.19056318700314, + 317.96800306998193, + 313.7246911749244, + 304.72012642398477, + 311.319212436676, + 325.855926156044, + 308.540533952415, + 317.4295966401696, + 309.2271316871047, + 302.3875446729362, + 315.14393608644605, + 302.4419170022011, + 306.1198914051056, + 301.6504400409758, + 321.8491648212075, + 310.66850177943707, + 304.5172809101641, + 301.49231696128845, + 305.76169260405004, + 315.9818366467953, + 301.3049231618643, + 304.48658400774, + 302.8317494690418, + 314.9164013490081, + 319.7906412035227, + 302.7894261777401, + 316.2893355116248, + 305.2380993589759, + 307.0065959431231, + 311.42048827558756, + 312.9727383852005, + 304.44141629338264, + 315.0866126790643, + 301.601801417768, + 328.3146339505911, + 302.6919857338071, + 307.5509105324745, + 303.16681978292763, + 303.0500014424324, + 328.1421328485012, + 302.88450636714697, + 304.8707088083029, + 305.0486140884459, + 300.9167197421193, + 305.7896354049444, + 314.33886724710464, + 302.4463737234473, + 302.4983743019402, + 304.7171312570572, + 304.7239869683981, + 306.31278762221336, + 308.15456291660666, + 304.5535044502467, + 307.7456778474152, + 327.45367710106075, + 303.1847587376833, + 307.3626740425825, + 301.48787454515696, + 309.6625984162092, + 302.4025100544095, + 308.6158360540867, + 309.9260560646653, + 311.09382282570004, + 307.30791698396206, + 327.2735057733953, + 319.10498182475567, + 302.0625552982092, + 304.49559124559164, + 304.8465978652239, + 300.4389399792999, + 303.55438663065434, + 308.55329117178917, + 308.08815909177065, + 306.4449860304594, + 301.6812011897564, + 305.79101579636335, + 324.48262701928616, + 303.58088878542185, + 302.2000432163477, + 302.2628626450896, + 304.7663800418377, + 304.114139970392, + 304.3989152312279, + 301.33263067901134, + 302.76781296916306, + 306.96989884227514, + 308.8073088824749, + 309.57820458710194, + 304.1046134121716, + 301.043085873127, + 303.39819955825806, + 332.03718116134405, + 301.5849022269249, + 304.31986802071333, + 300.9218352586031, + 307.4497577100992, + 304.79509399831295, + 303.2506413757801, + 303.63740272819996, + 305.4383760690689, + 323.0053456649184, + 308.16422060877085, + 305.3774112164974, + 310.1323313973844, + 311.3566163480282, + 303.9681664817035, + 304.2024905383587, + 303.1883701235056, + 311.71979904174805, + 305.96255715191364, + 302.20627112686634, + 304.6431068405509, + 303.1778177469969, + 304.7344357147813, + 303.7412983812392, + 303.0866835769266, + 303.9696259498596, + 302.91820815205574, + 302.268897280097, + 303.19841301068664, + 301.52517656981945, + 318.3750019222498, + 314.6148101389408, + 323.5017674379051, + 302.01682913303375, + 377.29089906811714, + 307.118282167241, + 307.1631728671491, + 303.2165178358555, + 300.874353794381, + 301.6919913813472, + 314.54041171073914, + 314.02734848856926, + 320.3146916255355, + 314.125765606761, + 307.0479853339493, + 306.4060687869787, + 310.23652575723827, + 315.9648989960551, + 399.9794036448002, + 303.25896717607975, + 327.12375515699387, + 303.86649535037577, + 320.9643602967262, + 358.7457107305527, + 332.3697212487459, + 300.9159571826458, + 303.4176079109311, + 305.4440139643848, + 302.0499808806926, + 303.3459393531084, + 303.1275321729481, + 300.90803959965706, + 303.483314037323, + 300.61349407583475, + 305.8875271715224, + 305.2053425386548, + 304.59920388646424, + 304.5574158281088, + 305.16054931282997, + 304.2055994570255, + 302.7120390124619, + 312.9497370608151, + 301.8927700817585, + 318.5120520424098, + 308.1074741985649, + 308.66745080053806, + 302.98905289173126, + 309.8183339089155, + 307.95743621885777, + 304.2192176617682, + 308.97907615453005, + 307.07226103171706, + 351.1217365041375, + 305.8010656274855, + 304.8341627717018, + 305.53938510268927, + 312.3103174865246, + 307.3939663618803, + 315.5470474548638, + 304.38826863467693, + 301.005611397326, + 303.6272678524256, + 317.17615877091885, + 302.65269408375025, + 303.97911719977856, + 302.14451889693737, + 302.5393681898713, + 309.88776022195816, + 316.8007758911699, + 301.95328086055815, + 326.53101566433907, + 311.6153608560562, + 317.01155713386834, + 307.0129415206611, + 306.8442041743547, + 369.22236830741167, + 322.78240513801575, + 301.88387826643884, + 302.80223486572504, + 313.9278541430831, + 315.2970326244831, + 301.29725210368633, + 329.87898701429367, + 301.8907338902354, + 307.1596405804157, + 302.9039510395378, + 302.23960806429386, + 309.5316803306341, + 301.7777248173952, + 323.0753921121359, + 303.52124685794115, + 313.5956540107727, + 315.0203542485833, + 317.68906162679195, + 310.7227234467864, + 308.9665172211826, + 303.0459874756634, + 308.4348424524069, + 315.14861702919006, + 304.50824520364404, + 309.1594973951578, + 335.0233848169446, + 315.13867746293545, + 302.3139502108097, + 300.9621217250824, + 303.3991121724248, + 320.471889808774, + 322.10579843074083, + 312.3369500786066, + 317.2282725572586, + 304.49954681657255, + 309.57444055378437, + 307.30854158848524, + 309.335498418659, + 312.0830901861191, + 303.9317440316081, + 303.34008696489036, + 340.91838635876775, + 302.6356541290879, + 307.9670849367976, + 346.1554331108928, + 304.4625002294779, + 310.64375972002745, + 302.2796090692282, + 315.2448088377714, + 303.01291754096746, + 322.4228566735983, + 312.2639865539968, + 313.4130019135773, + 305.39472345262766, + 306.7323497980833, + 302.1896633859724, + 302.0379854366183, + 307.1580410953611, + 309.43962704762816, + 320.3508848492056, + 308.92805468291044, + 304.04693353548646, + 308.17067435383797, + 339.76785980165005, + 306.27767403423786, + 343.7605008929968, + 305.1850061714649, + 308.3902816325426, + 331.0869243219495, + 317.50767267495394, + 304.43142411857843, + 302.184946667403, + 304.95693247020245, + 316.3763310685754, + 309.3836962785572, + 304.2103288769722, + 302.8033078685403, + 304.16989919543266, + 305.8138383626938, + 303.4507056530565, + 307.0135293006897, + 311.8237083218992, + 331.5245272219181, + 360.08227983117104, + 306.0644129496068, + 328.4927734658122, + 302.7187648396939, + 315.74017041921616, + 307.1908412128687, + 304.2189573571086, + 309.4289473183453, + 308.31568652391434, + 304.15340718999505, + 317.7337819188833, + 302.6779075935483, + 308.4716599583626, + 307.22384829074144, + 341.7542639374733, + 320.99383910000324, + 304.9721439704299, + 301.6868716478348, + 309.4183586537838, + 302.9258105829358, + 305.7105395793915, + 304.1673382371664, + 308.3001284599304, + 304.2583088018, + 309.60336485505104, + 305.9064978659153, + 310.87086962908506, + 302.77823278307915, + 306.8294441625476, + 317.4649229552597, + 302.1024968698621, + 309.88597080111504, + 305.6254580914974, + 305.6317399702966, + 302.2321076616645, + 319.03706657886505, + 313.53626155108213, + 311.31637622602284, + 320.54780085384846, + 305.6659243106842, + 306.5500505566597, + 314.1785897836089, + 301.3880215212703, + 302.71842769533396, + 313.099317073822, + 301.94252364337444, + 317.51410735026, + 303.0897506326437, + 305.5870239287615, + 304.52822675183415, + 305.53320311009884, + 301.25649855285883, + 312.9445781856775, + 308.5032142922282, + 308.36492807790637, + 312.00830360129476, + 330.17377385497093, + 302.37096229940653, + 307.17525067180395, + 300.9917612466961, + 307.61924185603857, + 302.9122327081859, + 310.6072776019573, + 302.16520657762885, + 301.15929713845253, + 330.35259418189526, + 303.75519121438265, + 300.8591423481703, + 314.71720457077026, + 305.18931689858437, + 303.12042181380093, + 308.6519345343113, + 303.3237192593515, + 304.06862008571625, + 330.5038336291909, + 308.25534227862954, + 326.5389874279499, + 308.19999120756984, + 316.52895916998386, + 303.5820761024952, + 302.9278328344226, + 302.3370190206915, + 306.9986295700073, + 328.06524347513914, + 317.4977290853858, + 300.8708493337035, + 302.0321440771222, + 378.58815512806177, + 306.75933519005775, + 341.76379292458296, + 323.33767725527287, + 316.33946480229497, + 301.87998158857226, + 300.94696157984436, + 301.77729474008083, + 311.23824915103614, + 319.01269875466824, + 325.34620060026646, + 323.1824647244066, + 304.5232585966587, + 308.52702556177974, + 301.25259949080646, + 312.387616366148, + 305.913126623258, + 304.1088727489114, + 302.90976222604513, + 303.04975926317275, + 308.79820693284273, + 304.40640611201525, + 313.1842635422945, + 314.03201233781874, + 309.3292340859771, + 309.0797558054328, + 309.1204374358058, + 320.08456689864397, + 303.2689637206495, + 308.39925841614604, + 306.5054923482239, + 313.7283558379859, + 305.1585729494691, + 302.49304059147835, + 302.5944823101163, + 301.36436512321234, + 302.5568432509899, + 311.1952177360654, + 310.6690302491188, + 314.2082608770579, + 304.3471612855792, + 308.6621835678816, + 306.23565243184566, + 312.2100947201252, + 309.58291724696755, + 305.7152502927929, + 306.5832863152027, + 310.9170688316226, + 308.15224920399487, + 312.6622135192156, + 313.4117963425815, + 306.0614335387945, + 307.84179248288274, + 322.367907717824, + 313.9649983420968, + 309.1668638885021, + 313.18685660511255, + 312.6519751511514, + 305.08749234490097, + 315.1827608924359, + 303.47964030504227, + 322.59685276448727, + 311.02865855395794, + 307.60430958494544, + 307.3620763402432, + 303.57649636268616, + 301.2545139044523, + 307.15888257324696, + 301.0990225896239, + 300.6920734010637, + 319.3188392147422, + 303.4257702343166, + 301.35923755168915, + 301.10455486923456, + 305.37224198691547, + 302.72785652056336, + 306.8123085126281, + 332.0257559455931, + 311.2987677715719, + 304.097560800612, + 303.8845285028219, + 302.44714304059744, + 300.6740035265684, + 342.4550674036145, + 302.0201671048999, + 301.1673773676157, + 311.15060694515705, + 312.07625410705805, + 301.57468888536096, + 307.42343655228615, + 306.55095767974854, + 308.26036666333675, + 308.87154606357217, + 319.41397666186094, + 317.87883853912354, + 304.32275004684925, + 308.1049850657582, + 304.12133729457855, + 311.87843925878406, + 301.49794009141624, + 311.6931681185961, + 309.23527780734, + 322.8385427594185, + 316.2688863873482, + 306.2146433368325, + 311.7301471196115, + 327.0305105596781, + 336.6115408837795, + 313.4080862849951, + 305.7035667896271, + 302.98574716597795, + 321.7209101691842, + 301.0959176979959, + 388.8277653492987, + 309.72061635553837, + 308.57687935233116, + 301.3590775486082, + 304.1777658164501, + 301.21078332699835, + 302.2243401799351, + 300.57034074887633, + 307.8868543431163, + 303.43474458530545, + 312.76389203965664, + 302.1040465272963, + 301.260877026245, + 304.45881893485785, + 301.88774617016315, + 303.9068257585168, + 329.63930813223124, + 304.98694898188114, + 302.87025152146816, + 304.7301557920873, + 300.714516736567, + 303.97516702488065, + 300.76313208043575, + 303.40114307403564, + 304.83183067291975, + 311.4337053671479, + 311.17744790017605, + 302.7684772014618, + 305.751458004117, + 310.7938692420721, + 306.8568130284548, + 320.3901561051607, + 308.01784725673497, + 302.8626073040068, + 305.25322791934013, + 308.2048449218273, + 301.0458589717746, + 306.01689705997705, + 300.9110474139452, + 308.77079337090254, + 363.2633922174573, + 312.7547261416912, + 306.39413671940565, + 301.0780231002718, + 303.4747374076396, + 305.5727122463286, + 303.65283615887165, + 302.1038670949638, + 310.90598797798157, + 302.88477797061205, + 328.41112305969, + 300.86047099903226, + 310.6237518824637, + 312.95034912228584, + 311.47232186049223, + 308.94855469465256, + 309.73488872498274, + 305.56036934256554, + 331.8832144141197, + 332.8573058769107, + 303.25764774903655, + 302.97489578835666, + 301.9709981381893, + 303.92301720380783, + 305.2345905881375, + 314.03227580338717, + 301.6786540299654, + 305.5313202366233, + 313.7945281267166, + 307.2292007766664, + 310.57112453877926, + 310.73860412836075, + 300.91394893825054, + 307.4091914370656, + 304.1661786362529, + 300.9880875945091, + 316.2517461255193, + 304.53569078445435, + 302.4453411027789, + 306.61178482323885, + 303.65713074058294, + 301.11216051131487, + 306.2699419334531, + 306.0890018492937, + 301.95132341980934, + 309.83940329402685, + 300.680918879807, + 305.66557584144175, + 303.6574743837118, + 300.88774295151234, + 308.4350672364235, + 312.9973969757557, + 302.0732094049454, + 301.3929114881903, + 304.41261771321297, + 304.3104585856199, + 308.7753881774843, + 302.79260156676173, + 308.8846882209182, + 309.85070042312145, + 332.42244416475296, + 314.4822103828192, + 320.17173805832863, + 303.622640684247, + 325.0228008404374, + 308.7727524191141, + 301.7748984694481, + 303.3902520351112, + 311.59785245358944, + 303.9980172943324, + 310.01884293556213, + 300.7417471855879, + 314.1306379288435, + 311.90588523447514, + 307.09328474104404, + 302.1145630441606, + 304.3469859957695, + 301.5404860675335, + 302.14663807302713, + 318.77657406032085, + 305.50502792187035, + 346.2365429736674, + 302.17621527053416, + 305.0660866498947, + 306.7322774641216, + 316.86402666568756, + 301.380025729537, + 316.5275456905365, + 305.0843161046505, + 304.04946298897266, + 309.03155025839806, + 303.9669124931097, + 318.45585995167494, + 303.962069645524, + 312.83230851590633, + 309.7857083249837, + 308.2954200040549, + 308.40846111625433, + 300.97724637389183, + 301.81147204339504, + 308.84025026857853, + 311.65392684191465, + 308.223615180701, + 313.3244410902262, + 314.2547607719898, + 304.81275545060635, + 301.2569476608187, + 311.6992294881493, + 303.45059890300035, + 320.1536803022027, + 344.1059215888381, + 358.9659701734781, + 304.86065346747637, + 311.70150538533926, + 305.55445720255375, + 306.0504770707339, + 314.3990335315466, + 310.6852714419365, + 305.6566614434123, + 309.159031547606, + 305.01578556001186, + 322.814274802804, + 303.8414657115936, + 308.73417995125055, + 309.69832345098257, + 313.46328780055046, + 307.277779892087, + 310.7412001937628, + 300.77725147269666, + 303.7062088623643, + 314.2960046455264, + 302.3537227138877, + 303.2174222506583, + 303.2224945798516, + 301.6180089227855, + 338.4800622165203, + 302.4789864923805, + 307.06824392080307, + 315.7408471405506, + 328.15431816130877, + 305.2188957966864, + 303.81091310828924, + 302.7283724695444, + 325.1312930099666, + 306.55016768723726, + 311.78455987013876, + 318.4224913343787, + 318.4207096248865, + 306.0992268398404, + 300.2921863179654, + 311.77686120569706, + 304.3379567936063, + 311.7882649451494, + 301.9072018414736, + 301.91458405554295, + 302.8775910139084, + 301.00486385822296, + 316.4728499054909, + 308.6823462545872, + 304.72517690062523, + 309.2073538079858, + 308.07365956902504, + 334.61317320354283, + 303.93023771606386, + 302.3070387169719, + 305.52497736364603, + 303.2888727709651, + 305.39623284339905, + 310.8555293343961, + 310.3483230136335, + 332.7002026811242, + 301.1053522415459, + 312.90356130898, + 310.8707281127572, + 306.0712857693434, + 320.2589534446597, + 332.02720679342747, + 302.05357480049133, + 316.83721543848515, + 313.999183870852, + 308.0559459477663, + 303.1945349611342, + 302.6408873666078, + 363.4888179600239, + 302.9381649270654, + 301.1947075687349, + 315.30739959329367, + 307.6321040838957, + 315.1319732815027, + 334.59587406367064, + 317.6641866415739, + 300.9281614627689, + 317.8672016635537, + 337.7845874596387, + 322.4196628332138, + 306.8117136284709, + 302.71769446879625, + 303.7946993485093, + 300.77561839669943, + 306.07794788107276, + 326.07478964701295, + 319.2079245224595, + 302.2521877735853, + 302.4793832600117, + 305.5885965526104, + 302.8370883539319, + 312.4880138672888, + 302.8576583582908, + 310.6963013932109, + 307.6473384052515, + 303.74310429766774, + 302.9122231155634, + 312.05244878679514, + 302.9384036511183, + 303.5878855101764, + 352.97442702949047, + 313.2356289345771, + 306.96987714245915, + 306.6884030327201, + 314.61350859701633, + 305.49129247665405, + 302.25450698286295, + 304.349388319999, + 308.55316912569106, + 305.1022791136056, + 303.9498119968921, + 303.35586582124233, + 327.71098620444536, + 322.6556877344847, + 312.968315243721, + 304.0749894231558, + 314.9602561071515, + 312.0038251131773, + 309.0343146622181, + 317.0151378195733, + 319.25253719091415, + 325.13510942459106, + 302.4105020686984, + 314.2985747009516, + 308.85949525795877, + 324.1124502643943, + 347.76147946342826, + 312.13293451070786, + 303.9694103449583, + 315.1628524437547, + 303.3564134705812, + 303.1186454575509, + 315.91231889277697, + 302.07365035638213, + 372.29762173071504, + 301.77094784379005, + 319.10407086648047, + 318.6666158810258, + 321.1429849639535, + 305.7897591087967, + 303.32897864095867, + 302.6619760580361, + 311.5460385456681, + 306.5313405394554, + 310.07678166776896, + 306.6758090816438, + 326.0911462008953, + 313.6381706148386, + 301.3162831515074, + 314.06989992409945, + 321.1659035682678, + 335.5800383500755, + 304.5999693721533, + 304.6723946109414, + 307.8023713398725, + 316.7145047560334, + 308.04466907680035, + 305.25866800919175, + 316.9138352572918, + 304.6296367943287, + 315.72525821626186, + 317.9753761328757, + 308.0628555752337, + 311.3478359878063, + 328.0385211482644, + 309.3264968749136, + 301.3730975538492, + 307.84397526830435, + 312.3615383543074, + 300.8606087323278, + 307.22119951061904, + 318.7586234193295, + 304.2183722034097, + 311.52402215451, + 303.0968837440014, + 313.2801285684109, + 303.7826645374298, + 301.579092271626, + 306.3576010465622, + 301.24427530542016, + 302.4881066791713, + 305.2911839708686, + 311.25239180773497, + 306.32666500657797, + 311.1328648030758, + 306.68482960760593, + 305.7823842279613, + 304.30878456123173, + 302.43020491860807, + 302.91756926476955, + 306.64489787071943, + 315.0122665092349, + 307.7215169519186, + 300.437702415511, + 306.91284907609224, + 303.6595917120576, + 307.9563444107771, + 303.981973875314, + 302.2696348205209, + 312.7919851318002, + 302.8578509837389, + 300.86212116479874, + 301.59875763207674, + 321.4936233535409, + 307.9841411560774, + 310.66804693453014, + 315.24919560551643, + 303.7152963578701, + 322.1268712170422, + 306.4866449534893, + 308.0473746806383, + 317.93403857573867, + 307.88156086206436, + 308.74375239014626, + 308.16369416564703, + 308.7001981921494, + 315.2698013931513, + 303.5062547624111, + 308.1686750948429, + 317.7866174355149, + 306.5228653997183, + 319.3334817420691, + 312.28272829577327, + 302.44711297750473, + 302.18163473159075, + 327.0124957039952, + 313.664838898927, + 301.9401410855353, + 313.11346170865, + 303.8535981308669, + 305.0697312168777, + 305.65960025042295, + 311.2644262909889, + 317.47847443446517, + 311.87959346175194, + 301.1359696909785, + 313.35083693265915, + 329.5752055719495, + 303.1016015969217, + 300.79303283430636, + 361.11886064708233, + 302.8540885448456, + 301.3890465721488, + 301.38914988189936, + 319.5225523598492, + 303.8617455791682, + 308.63327679783106, + 302.1841267198324, + 300.49202398210764, + 315.6001385450363, + 301.24825885146856, + 302.22143056988716, + 304.89931643754244, + 302.7106431424618, + 304.84846322238445, + 323.65032832324505, + 304.36364053189754, + 302.37284031137824, + 321.48204382508993, + 314.33715054392815, + 317.26750952750444, + 303.9361551646143, + 308.81416203826666, + 301.09260538965464, + 308.37036015838385, + 309.9783872552216, + 302.17720935307443, + 309.44209592044353, + 305.59314131736755, + 300.52916656062007, + 310.63979042880237, + 334.73843473754823, + 311.0097631253302, + 300.83872869610786, + 303.54191713035107, + 303.60761568695307, + 308.60244143381715, + 310.5276001505554, + 307.4819828905165, + 372.8536601420492, + 312.7968117967248, + 304.3818208165467, + 301.4727239795029, + 302.30943651497364, + 313.39740377664566, + 301.9720492064953, + 311.5301300343126, + 311.01312518678606, + 303.95497810840607, + 337.53234972059727, + 320.5145365521312, + 306.2479088306427, + 306.7692592423409, + 357.96673502773046, + 304.5888853855431, + 320.70368394628167, + 314.88902372308075, + 315.2983752787113, + 314.352461643517, + 313.99913024902344, + 321.25935459136963, + 303.6815261244774, + 301.3397617191076, + 316.4090907871723, + 338.4057550281286, + 322.1436112001538, + 300.79239711910486, + 305.9848810136318, + 304.24246989935637, + 304.6515705808997, + 303.82778672873974, + 306.8487294986844, + 304.62307262420654, + 302.8718797452748, + 342.9911318421364, + 309.475238725543, + 305.6001195795834, + 305.67357628792524, + 306.3496343754232, + 301.43642531335354, + 301.98563681170344, + 305.5050470121205, + 311.30971998535097, + 305.64131812751293, + 308.2527398876846, + 305.1638715788722, + 302.598290592432, + 306.02479687333107, + 305.029502408579, + 301.317256860435, + 303.95474683493376, + 319.2793967016041, + 309.641317255795, + 300.9337515756488, + 304.7525058314204, + 305.18533670157194, + 307.4254022166133, + 308.25798328220844, + 302.75397592782974, + 322.6740240380168, + 303.7030507028103, + 305.583070397377, + 302.78885336220264, + 309.16942093521357, + 303.2766422331333, + 320.7509660869837, + 302.29845781996846, + 304.6553818769753, + 309.08879002183676, + 304.6326883584261, + 318.30064810067415, + 317.1134598441422, + 302.32994432747364, + 301.65366039052606, + 302.12602193653584, + 304.3570315986872, + 306.1236618049443, + 312.7957355976105, + 303.85869533382356, + 307.14686892181635, + 313.3586907200515, + 304.1523343473673, + 302.2234262749553, + 301.774102402851, + 301.8348097167909, + 304.34208235889673, + 316.661145105958, + 307.51428082585335, + 302.5070437192917, + 305.35534630715847, + 303.7673754170537, + 304.55301490426064, + 308.05346788465977, + 311.0642244890332, + 308.1121131256223, + 366.2693178281188, + 304.0731433033943, + 300.49532083421946, + 301.95051051676273, + 311.6055647749454, + 302.65323850512505, + 305.1203320194036, + 301.9150975290686, + 304.6703851521015, + 305.97817884385586, + 323.3998862653971, + 303.3358813524246, + 300.6702058799565, + 309.6307462900877, + 301.2929973490536, + 302.51290652155876, + 420.3319882452488, + 307.3220351859927, + 314.2397764772177, + 308.4160500690341, + 314.7586539685726, + 304.1775641813874, + 300.412666708231, + 304.5111431777477, + 304.2217085957527, + 304.6919882670045, + 323.200932726264, + 305.5064518228173, + 302.25520120188594, + 325.43569404631853, + 334.9760314784944, + 303.47362507134676, + 306.9546519815922, + 324.9563781376928, + 306.8202798627317, + 304.4773855805397, + 313.22639359533787, + 302.7446556016803, + 304.78162731975317, + 305.0975013449788, + 304.2693304270506, + 304.26122910529375, + 307.7285271137953, + 305.7017005085945, + 314.9278332814574, + 302.9774820320308, + 310.7087091729045, + 300.8926304280758, + 307.04365425929427, + 303.6188121289015, + 301.9763856045902, + 308.2299401219934, + 330.62359277904034, + 307.2061792910099, + 301.62047532759607, + 305.07645385339856, + 320.1082736887038, + 305.58623829483986, + 301.3903532400727, + 308.75189588963985, + 333.5036058090627, + 313.473591953516, + 305.4995941966772, + 303.3491268828511, + 304.6699434109032, + 307.7582517564297, + 316.2946222089231, + 301.3829720392823, + 307.3587862588465, + 302.5435432419181, + 305.7560299411416, + 316.97712360322475, + 308.20963709801435, + 305.4588570911437, + 307.32267390191555, + 313.53511943668127, + 349.2674700766802, + 304.9522887542844, + 303.2768438309431, + 314.9857619330287, + 306.34201814979315, + 317.4904917962849, + 305.3285268768668, + 316.6223022118211, + 335.86742352694273, + 303.3201305344701, + 311.7800586298108, + 332.78271529078484, + 316.6919765472412, + 305.2462203875184, + 300.6706524696201, + 316.95994874089956, + 300.6123608555645, + 315.34878372401, + 302.6267256774008, + 310.90499290823936, + 301.30140291154385, + 307.5272104628384, + 302.17943996191025, + 304.3453583829105, + 302.93516425043344, + 306.029564589262, + 306.3487543016672, + 304.3048220053315, + 316.6171704828739, + 301.0055235736072, + 319.694511950016, + 300.7086825389415, + 338.950931891799, + 312.1857518032193, + 306.41136033833027, + 302.54856496304274, + 308.5006052479148, + 319.3858762383461, + 302.97825038433075, + 316.61680270172656, + 344.96546687185764, + 300.71056798659265, + 306.1901232153177, + 318.5960752815008, + 319.03938445821404, + 300.7033937871456, + 300.7989448606968, + 324.1084912121296, + 309.5316059179604, + 318.86371710151434, + 318.43736218102276, + 314.6638808734715, + 311.9047649279237, + 310.8258125334978, + 301.13688698783517, + 307.2508303672075, + 311.59949337504804, + 301.5389384366572, + 315.0855021700263, + 310.73405946046114, + 306.9437145218253, + 332.58355413377285, + 306.7551572099328, + 316.9836469963193, + 300.9067645519972, + 312.86262194253504, + 310.8470797240734, + 323.9268192499876, + 301.5035253036767, + 326.58596071600914, + 342.2796204313636, + 305.2285311371088, + 301.1155485510826, + 325.68399648182094, + 301.2263341564685, + 306.88890413194895, + 301.07625978812575, + 305.3453339524567, + 304.80671817809343, + 316.9388548210263, + 302.01110737770796, + 340.0130006223917, + 311.20703275874257, + 311.3566516637802, + 310.3226861320436, + 303.7031971924007, + 300.8198463320732, + 306.1627501100302, + 304.7846630811691, + 326.67840099334717, + 303.01049800775945, + 353.70021449774504, + 304.1681315675378, + 303.3263559937477, + 301.21224101632833, + 305.47435750067234, + 306.8189257606864, + 303.1208858639002, + 315.15173959359527, + 305.7499078065157, + 319.10340511240065, + 386.9128204714507, + 306.1012347564101, + 317.4386457875371, + 304.59233164042234, + 309.9679405167699, + 301.07446360215545, + 307.45335512049496, + 304.73919048160315, + 346.1148366332054, + 317.14988694526255, + 304.1599347218871, + 300.9554372802377, + 322.3342516720295, + 311.59406173601747, + 312.97924868017435, + 309.10350028797984, + 307.79068445414305, + 302.1977754533291, + 303.249444976449, + 319.0289933383465, + 307.2297259271145, + 305.24929962679744, + 317.75890194810927, + 301.8239714279771, + 301.62958428263664, + 362.79525639116764, + 300.6905263662338, + 310.5174822025001, + 301.95520809292793, + 308.60776080936193, + 319.54872991889715, + 319.933634147048, + 315.15799228847027, + 316.47920902073383, + 303.89488836564124, + 300.8039242401719, + 302.6320460960269, + 306.1523092389107, + 308.0507620126009, + 305.8537625670433, + 305.6407945752144, + 327.1221135780215, + 303.55194229632616, + 337.5022287964821, + 301.9542180541903, + 306.3551562447101, + 315.41758893430233, + 303.12338215857744, + 316.4167190641165, + 300.64055873453617, + 301.79262037575245, + 344.5496544986963, + 302.4195504114032, + 302.88494706712663, + 307.171985572204, + 301.5541592463851, + 327.2093682214618, + 303.24739261716604, + 304.2404471486807, + 302.8269353657961, + 304.95843440294266, + 358.1814075522125, + 303.2002412918955, + 304.120270870626, + 304.0619165673852, + 302.14154798164964, + 303.9668826572597, + 301.290276106447, + 306.63911620527506, + 326.733840636909, + 308.1053845882416, + 301.1747029200196, + 307.189500907436, + 302.2941526994109, + 304.43220875039697, + 304.2632612064481, + 302.9778022766113, + 303.18160328269005, + 302.2737883925438, + 318.0730027332902, + 304.5791262164712, + 309.3049678504467, + 309.5032134875655, + 305.46341252326965, + 308.7650857940316, + 324.7483865171671, + 301.5545999780297, + 324.25268111377954, + 314.4820646457374, + 313.3634463045746, + 308.0851709023118, + 306.8595206364989, + 307.7754977568984, + 305.9037724882364, + 323.145753480494, + 320.60439766198397, + 311.5614101961255, + 303.62791677191854, + 301.8452697061002, + 302.3538071811199, + 378.0535394176841, + 304.017451742664, + 305.91109493747354, + 305.4091096110642, + 314.96900050342083, + 306.1856670603156, + 302.5082323104143, + 303.3573182411492, + 300.58945406228304, + 316.6219897791743, + 303.4192846864462, + 311.1059964299202, + 301.06625275313854, + 302.1741452515125, + 300.92122399806976, + 315.496355291456, + 304.54722318053246, + 302.98921905457973, + 300.73332437872887, + 301.34050830826163, + 303.38343760184944, + 320.89599837362766, + 318.8935726247728, + 314.88760659843683, + 305.0951504036784, + 306.131061270833, + 310.670859945938, + 300.98943081125617, + 310.69418285787106, + 301.79748448729515, + 334.27753638476133, + 306.6880679130554, + 306.1394087895751, + 304.3503425270319, + 302.56563905254006, + 305.88267705589533, + 308.28719809278846, + 302.64751381985843, + 302.2602718099952, + 304.2057200372219, + 306.6104081645608, + 303.68775644898415, + 303.6417629607022, + 302.2854539230466, + 304.9329224526882, + 317.26542264968157, + 302.5788238439709, + 300.6737349256873, + 308.9239857234061, + 319.2812616676092, + 372.6976101323962, + 306.4228826183826, + 302.35486351698637, + 313.4350238945335, + 301.12357204407454, + 322.7463537529111, + 311.99443117529154, + 322.73951847851276, + 301.38249679654837, + 308.86016051471233, + 302.22667115554214, + 307.04745358228683, + 303.79177701100707, + 309.34309116750956, + 323.0973701290786, + 317.0645125936717, + 303.87434712052345, + 312.2505974173546, + 327.936885189265, + 334.245079793036, + 302.16253524273634, + 315.5266843046993, + 305.5160521566868, + 303.0070730857551, + 331.0163143388927, + 311.32421788945794, + 303.3005830347538, + 316.3529485464096, + 327.5298475269228, + 304.5871715787798, + 327.44522919878364, + 356.49343592487276, + 311.34159515053034, + 320.4401945397258, + 314.026356369257, + 304.89126409962773, + 315.5447567217052, + 304.0585914924741, + 306.94292080029845, + 306.6668408848345, + 309.9147393479943, + 304.4977133870125, + 316.76999547705054, + 304.8732684664428, + 302.7437940388918, + 301.97744883969426, + 304.8344645034522, + 312.34040377289057, + 302.58365374058485, + 313.526050940156, + 305.8393840305507, + 300.95681741833687, + 343.232628762722, + 301.24297016859055, + 307.1777140945196, + 303.66401951014996, + 301.3552467226982, + 302.3573550134897, + 302.5700287669897, + 308.58060785382986, + 310.8039717525244, + 341.8462703973055, + 302.80670882947743, + 302.86695688962936, + 302.3192619085312, + 316.42245058342814, + 314.43270096182823, + 307.26743157953024, + 300.62788137048483, + 307.36756575107574, + 301.46585873886943, + 309.51697355508804, + 301.53666605986655, + 308.74235256016254, + 340.6890164613724, + 301.6489418335259, + 303.7978448420763, + 305.6283271834254, + 308.37840110994875, + 323.0480755828321, + 342.18053787201643, + 304.22695522010326, + 301.81695035099983, + 306.76750312000513, + 309.1115186866373, + 301.4907686933875, + 302.24557250365615, + 308.95620569586754, + 318.569511808455, + 339.13334234058857, + 330.6793864555657, + 305.8929503932595, + 300.9758057463914, + 310.45291266590357, + 322.60470930859447, + 302.5293348133564, + 315.5975738763809, + 301.18659675866365, + 346.9382384698838, + 312.79406149685383, + 300.7376931216568, + 306.2715504541993, + 302.9663667231798, + 302.71387842297554, + 301.4341167733073, + 326.4992334470153, + 330.7815053835511, + 306.5787719413638, + 308.0207559838891, + 316.26680336892605, + 303.4937193840742, + 321.326144086197, + 305.57482262700796, + 328.202129855752, + 308.49608654528856, + 307.7318023145199, + 306.31015264987946, + 300.9154926612973, + 308.16323705017567, + 371.0833904966712, + 301.2762476056814, + 309.1914957500994, + 301.0446511153132, + 318.78397131711245, + 305.8140798062086, + 326.41052132472396, + 302.63659900426865, + 381.2750435471535, + 322.7139546331018, + 316.3612522780895, + 305.97792802006006, + 310.1494213156402, + 301.6775914747268, + 311.56523541361094, + 303.8959475979209, + 307.58231081813574, + 300.92343621701, + 304.24605083838105, + 339.8308702800423, + 302.19123297929764, + 304.36553202569485, + 306.93489852547646, + 303.7242655456066, + 305.6876952536404, + 305.78880348801613, + 309.581686809659, + 339.5061931684613, + 308.0489772222936, + 325.8693782314658, + 307.4442571438849, + 303.88230789639056, + 314.1440512910485, + 304.3213055431843, + 389.6238819286227, + 311.1880556419492, + 308.7339503262192, + 307.17868948727846, + 305.3141019642353, + 310.2723091430962, + 304.8533263709396, + 305.19923485442996, + 303.05069053918123, + 314.2765567302704, + 385.3760734088719, + 330.9410612285137, + 320.95779125764966, + 312.8744622915983, + 371.6894768178463, + 389.88401548564434, + 308.2964632604271, + 314.0220127440989, + 343.9906912520528, + 305.23198737204075, + 312.4598709791899, + 306.13548268936574, + 301.29339577257633, + 304.1148041635752, + 311.6783564016223, + 303.8922751918435, + 338.1171436160803, + 314.38240008056164, + 307.015831053257, + 307.19796085357666, + 319.35430129244924, + 303.5967704690993, + 307.12691557593644, + 331.0780139453709, + 310.1396043598652, + 303.79533533006907, + 303.19801403582096, + 301.1967178341001, + 306.29413209855556, + 300.54001327976584, + 305.63573434203863, + 303.18917119689286, + 308.8893260732293, + 306.45174292102456, + 315.21605555713177, + 305.1166305691004, + 300.9193715304136, + 304.36452944017947, + 307.45917777717113, + 300.26708302646875, + 314.47960582003, + 304.3895345926285, + 306.164194598794, + 301.657582834363, + 319.5729929804802, + 310.1530368551612, + 310.7289866656065, + 305.1618853267282, + 302.8228745497763, + 308.1974602267146, + 302.37078142911196, + 310.686572290957, + 302.4739623814821, + 311.55355140566826, + 301.9107395634055, + 309.44487304612994, + 384.31047621555626, + 305.99745504558086, + 300.65022867918015, + 302.9741157963872, + 331.13850401341915, + 306.0913289785385, + 311.03687455132604, + 309.8760197516531, + 303.0343357101083, + 304.30490435287356, + 307.9511157646775, + 336.2869989722967, + 302.6548907458782, + 301.75458445213735, + 308.4124752879143, + 302.87851941399276, + 301.2974871471524, + 316.5736793130636, + 304.8030745126307, + 310.2399298027158, + 301.7136107981205, + 300.44691260904074, + 330.44271875172853, + 312.4919992648065, + 344.82543601095676, + 301.6860302835703, + 302.10954108834267, + 302.33866734057665, + 322.7822447605431, + 309.0472654104233, + 301.37255039066076, + 312.7259999252856, + 315.5978887453675, + 305.9564233869314, + 309.81384686380625, + 301.6899910122156, + 309.43888825178146, + 349.4902488812804, + 308.86562637239695, + 303.83693683706224, + 302.0096210949123, + 303.27853824943304, + 305.78837263584137, + 308.41876949183643, + 341.9712400585413, + 314.7147686108947, + 306.6784717515111, + 323.78656708821654, + 327.23276192881167, + 302.9735716022551, + 308.8943914473057, + 303.86831303685904, + 303.0928430855274, + 304.54045790433884, + 314.2853285185993, + 301.7597065754235, + 304.98614996671677, + 304.32775750011206, + 304.00019109994173, + 301.1695023216307, + 308.3501686230302, + 307.26596278883517, + 369.8243027180433, + 302.5466282647103, + 301.57988672703505, + 302.5717533007264, + 304.6445565223694, + 306.79005436599255, + 301.7560479976237, + 306.78960582986474, + 324.82773846387863, + 323.57853155583143, + 307.62728175893426, + 308.0544365718961, + 307.2052645236254, + 303.8052637428045, + 305.1525091379881, + 383.35247828811407, + 363.60446705669165, + 302.16734316945076, + 303.0804096907377, + 301.33460480719805, + 304.30479577183723, + 302.5137368440628, + 309.894204756245, + 320.961107686162, + 313.741441398859, + 354.3436285927892, + 356.0106251835823, + 313.53226900473237, + 301.20797787234187, + 301.28616827726364, + 316.711062874645, + 304.1808569356799, + 302.26785058528185, + 303.7488432303071, + 300.7319760825485, + 304.17214927077293, + 309.2925903238356, + 303.5064492970705, + 303.46766036748886, + 319.7258700504899, + 302.8176936041564, + 318.65320845879614, + 393.2685694247484, + 328.36128707416356, + 309.33408553898335, + 311.1736368238926, + 307.9637203104794, + 314.13315127789974, + 310.4956673644483, + 307.17370314896107, + 318.4569051004946, + 301.9363325461745, + 333.0725086517632, + 381.2897524610162, + 308.8022413291037, + 303.44016318768263, + 302.2350464146584, + 301.9656039252877, + 301.90277947485447, + 306.8666114490479, + 309.8742772638798, + 308.32695695757866, + 306.4035062119365, + 301.7371689900756, + 309.3382036462426, + 376.6503342837095, + 301.8576541990042, + 335.27005798742175, + 303.0381054058671, + 300.9844983480871, + 301.4705962948501, + 350.5405826047063, + 305.418057622388, + 300.3834645077586, + 323.9497864842415, + 310.24774853885174, + 302.02948870509863, + 305.71757465973496, + 306.7180261313915, + 347.1262271590531, + 361.56673711538315, + 320.0247782096267 + ] + }, + { + "histnorm": "probability", + "hovertemplate": "Scenario: timebin_5
Dist since last refuel: %{x:,.1f}
Bin share: %{y:.3f}", + "name": "timebin_5", + "nbinsx": 40, + "opacity": 0.5, + "type": "histogram", + "x": [ + 316.7660145238042, + 307.6004516482353, + 306.2834424674511, + 310.3656107317656, + 302.69422256201506, + 309.80675803497434, + 334.2463342025876, + 325.71548557281494, + 310.43006642349064, + 307.05573858320713, + 321.76685313135386, + 300.7771765962243, + 304.3298754170537, + 303.05852396786213, + 303.11737292446196, + 300.81958233751357, + 305.70594995841384, + 357.5500718578696, + 349.07552333176136, + 300.87003744393587, + 309.38854609429836, + 317.2068584635854, + 316.90763150155544, + 304.2048480659723, + 371.54291739314795, + 301.76063016057014, + 300.8409025669098, + 300.6715645119548, + 302.3561992198229, + 307.61754938587546, + 309.27522088959813, + 302.4744134992361, + 309.41932997852564, + 379.0264274328947, + 305.8226368278265, + 306.57412995398045, + 304.0897112637758, + 306.1512080654502, + 316.26203821599483, + 302.02747440338135, + 320.8538354188204, + 346.71380058676004, + 304.91343300789595, + 301.97171527147293, + 300.2083471044898, + 324.3917339593172, + 301.1541807502508, + 301.9407445937395, + 304.2777802348137, + 311.4493640623987, + 313.00494612008333, + 319.1910460591316, + 301.7739512771368, + 303.6146834269166, + 306.8268260359764, + 317.5913856327534, + 310.51838132739067, + 305.27732771635056, + 304.1433966308832, + 333.36688559502363, + 302.4618721399456, + 309.0505621880293, + 301.6175590008497, + 305.91671811789274, + 305.68722227215767, + 300.4976351708174, + 302.3957139700651, + 304.84989712014794, + 303.89255199581385, + 332.0708780363202, + 305.94904444366693, + 312.3764371275902, + 312.0807600095868, + 307.12260070443153, + 303.6290652230382, + 319.0764776356518, + 320.25124229490757, + 310.95333582162857, + 307.5055437460542, + 302.76022827625275, + 316.96891424804926, + 355.4085265994072, + 357.3627615571022, + 313.88277662731707, + 309.0553957596421, + 305.17485189437866, + 312.99628289043903, + 314.3567025959492, + 325.8126579001546, + 328.9806780964136, + 301.954364746809, + 301.0293167978525, + 320.4344247728586, + 312.747051179409, + 301.6884656995535, + 302.0997263044119, + 321.2043120265007, + 305.3797722160816, + 323.4214373528958, + 309.9417571723461, + 308.1357677578926, + 301.98820182681084, + 314.47080697119236, + 312.40328162908554, + 309.1452978178859, + 306.1026621386409, + 337.59202617406845, + 306.00073712319136, + 304.15525545179844, + 318.87966525554657, + 301.49355190992355, + 301.42718440294266, + 303.3648858368397, + 303.3497583474964, + 313.3610387481749, + 350.373292632401, + 304.95286163687706, + 311.05463203787804, + 314.37723195552826, + 302.91512486338615, + 314.45267690718174, + 307.08866012841463, + 304.8276710808277, + 418.2078422307968, + 304.0181463137269, + 313.4226032719016, + 303.308284714818, + 306.6257066950202, + 316.82398445159197, + 320.4203051254153, + 305.35451217368245, + 301.9715847298503, + 301.0873360745609, + 316.06720673292875, + 301.7297966182232, + 306.9183397144079, + 327.65782238543034, + 303.0459187552333, + 302.3422683775425, + 301.3729654699564, + 307.02799128741026, + 318.843755684793, + 316.51399125158787, + 304.9402453675866, + 310.55248703435063, + 317.7567701637745, + 310.51988220214844, + 312.5940418988466, + 308.52951291948557, + 301.12500128149986, + 314.10439819842577, + 311.47292520850897, + 302.033530049026, + 312.2403703555465, + 319.93728648871183, + 314.4012121632695, + 305.4706992059946, + 308.3276566118002, + 314.9155302345753, + 309.58191876113415, + 312.1081694662571, + 310.19468066841364, + 301.3207786232233, + 310.13538260757923, + 301.1609506011009, + 303.6254172846675, + 329.18989654257894, + 302.0941290706396, + 303.44990012794733, + 303.57859380170703, + 308.7440820708871, + 306.2712635733187, + 302.1398316025734, + 300.582343660295, + 303.86625139415264, + 308.1940414234996, + 319.08043656498194, + 305.11952351406217, + 319.0380565524101, + 318.6784375309944, + 311.80555298924446, + 305.73188679665327, + 301.7042781561613, + 304.37434682250023, + 304.204134196043, + 312.0602548122406, + 304.2475467454642, + 311.0974965188652, + 301.31472186744213, + 308.27202751487494, + 334.5402092002332, + 314.8165312483907, + 315.9656935632229, + 308.1075454801321, + 312.01424065232277, + 325.5257959663868, + 321.73930524662137, + 315.73058773204684, + 307.41941487044096, + 306.8712809085846, + 306.7894047498703, + 306.54827728495, + 311.1431105900556, + 302.9499493986368, + 304.2545941621065, + 303.1015516128391, + 325.000343978405, + 309.704160399735, + 308.7305088862777, + 310.0120444819331, + 373.22493171691895, + 315.7289839088917, + 304.16186322271824, + 319.547490388155, + 303.5969932973385, + 320.59350145608187, + 309.064861766994, + 312.7201647311449, + 306.4684661179781, + 303.235738247633, + 312.6640054285526, + 302.1492920741439, + 315.83827170729637, + 304.4259860087186, + 301.7410456240177, + 305.7782518044114, + 310.183398231864, + 304.3116286545992, + 303.0637845825404, + 307.7598427385092, + 306.8638809863478, + 304.4446505382657, + 306.30197113752365, + 318.6947541683912, + 338.4899881593883, + 303.12701508775353, + 304.86005293019116, + 313.3225413784385, + 302.7582117319107, + 300.7701462954283, + 302.0947435721755, + 304.57714558392763, + 310.8566986322403, + 307.1091790944338, + 342.0783921033144, + 311.1848239004612, + 301.34273307211697, + 301.4232178479433, + 307.7159038335085, + 300.58990988880396, + 307.6927076280117, + 309.3212923705578, + 318.56285483017564, + 304.47254395484924, + 338.5259442497045, + 307.64409613609314, + 320.1135638281703, + 304.9710751324892, + 309.2074449509382, + 307.42420567944646, + 305.6011647284031, + 305.33160123229027, + 318.2821561843157, + 312.0395401120186, + 363.7810558229685, + 357.75899600982666, + 311.230074390769, + 301.44536994583905, + 302.6521498784423, + 375.5478569865227, + 315.36070814728737, + 306.96788427233696, + 319.3846434354782, + 317.67216219753027, + 308.8359597399831, + 320.8353940695524, + 302.3281366676092, + 307.681907877326, + 302.55234321951866, + 306.0616107136011, + 306.240495339036, + 301.2695084810257, + 301.37374533712864, + 310.1107080206275, + 303.07405223697424, + 306.9701132029295, + 339.80831180512905, + 303.1197609901428, + 309.96810103952885, + 300.97998228669167, + 304.54544289410114, + 310.33783162385225, + 313.36239117383957, + 310.18028877675533, + 309.8524502776563, + 303.2283914461732, + 306.6614045724273, + 307.0150046311319, + 304.9106381088495, + 303.79911597818136, + 327.346602961421, + 302.436611995101, + 301.00187949836254, + 303.1696597188711, + 308.13608664274216, + 322.0339961312711, + 303.5828273072839, + 308.89470214396715, + 303.556584443897, + 308.30226527154446, + 303.1398147046566, + 307.13624081760645, + 303.18725856393576, + 303.31914276629686, + 314.75063354708254, + 305.52544289827347, + 305.5070578753948, + 377.85993869416416, + 311.53462179005146, + 312.6647724211216, + 341.02641936019063, + 303.34378845244646, + 303.72172159701586, + 301.5384567603469, + 302.230882326141, + 303.8168180882931, + 301.21486611664295, + 302.43057192116976, + 300.80079796910286, + 310.7847804352641, + 306.54227962344885, + 323.74581567943096, + 301.0025002360344, + 316.03138630092144, + 302.54305006563663, + 302.84918969497085, + 303.9436824917793, + 306.97879921644926, + 300.443962931633, + 323.17987989634275, + 403.32982229441404, + 306.8669753149152, + 323.0624230802059, + 306.0951086357236, + 309.86337165534496, + 306.919650003314, + 339.56465741991997, + 313.06491665542126, + 313.78710977733135, + 314.32228146493435, + 307.43747986480594, + 310.60537883639336, + 302.3627524897456, + 305.3862217031419, + 300.62839060276747, + 344.0855491012335, + 311.74845466017723, + 303.2038462460041, + 301.1622745618224, + 307.65486592799425, + 305.69584080576897, + 302.7071791626513, + 330.37807044386864, + 308.7911952473223, + 313.22214460372925, + 302.81191019155085, + 304.76174503564835, + 304.4772444553673, + 300.64177699387074, + 304.78746880218387, + 312.45140329003334, + 303.39255071245134, + 338.05387488007545, + 348.7508352249861, + 303.0261446163058, + 300.24626310914755, + 303.35862531512976, + 305.7823445647955, + 359.47754165157676, + 309.2078800275922, + 311.9288108497858, + 306.7877896465361, + 334.63998552784324, + 304.085867613554, + 304.14560355991125, + 302.92013081908226, + 302.5897508263588, + 301.36778722703457, + 313.12481197714806, + 337.58799619972706, + 356.19430815801024, + 304.82319681346416, + 302.69454910606146, + 311.5065014027059, + 306.72728065401316, + 310.33836794644594, + 317.09291599690914, + 308.9098111689091, + 308.2625665515661, + 306.5024400651455, + 318.033034697175, + 303.9004834443331, + 323.8672678023577, + 306.59182085096836, + 359.7019952684641, + 304.14074516296387, + 310.0335685610771, + 310.91559512913227, + 315.3165447153151, + 301.7766904104501, + 319.0734649002552, + 310.940251044929, + 307.5674555078149, + 311.6288644298911, + 303.97566966712475, + 300.41082967072725, + 307.69078478962183, + 305.33912943303585, + 311.9230778813362, + 303.50126621872187, + 309.90581031888723, + 305.09791050851345, + 304.7923327535391, + 309.2472935691476, + 301.63457657396793, + 309.1344193611294, + 304.6927997767925, + 303.6575712468475, + 307.1032827347517, + 303.05998073518276, + 300.99487636983395, + 306.437757268548, + 351.8020156957209, + 304.674389988184, + 304.0626782402396, + 312.7728371247649, + 303.52052729576826, + 308.0263068471104, + 308.0204799696803, + 307.8499890640378, + 306.354853361845, + 303.85168543085456, + 313.66464452818036, + 304.15393573231995, + 301.6647827923298, + 309.33762803673744, + 313.8728272765875, + 308.87369011342525, + 326.7905943840742, + 317.7206455543637, + 311.741426743567, + 308.826426230371, + 313.7799191623926, + 305.0177268628031, + 301.4605391845107, + 322.12590439990163, + 306.1023353934288, + 306.5807826668024, + 302.7897451519966, + 331.84519305825233, + 304.6271567605436, + 309.8445663973689, + 301.95330503210425, + 315.4242115318775, + 304.0535554140806, + 301.85961435735226, + 301.5627488344908, + 315.6460221558809, + 306.7854493930936, + 309.1061322391033, + 303.8345054835081, + 312.4238227158785, + 305.0654614344239, + 302.74933642335236, + 304.3026901036501, + 302.16813430935144, + 308.1207495126873, + 304.4164808727801, + 300.6772599592805, + 309.4698234796524, + 301.8877017572522, + 331.9417256936431, + 313.24892261996865, + 315.83152167499065, + 303.73502004146576, + 304.3553541302681, + 310.54793736338615, + 301.66708167642355, + 300.7727748528123, + 311.92516681551933, + 305.77323069423437, + 345.122123003006, + 319.0083760395646, + 324.50917226821184, + 308.22185523808, + 305.88394790142775, + 301.8799178414047, + 313.93093702197075, + 309.75548619776964, + 317.13166357576847, + 305.1663925498724, + 312.8720249682665, + 310.19510061107576, + 310.04476422071457, + 301.5575703829527, + 309.5888594388962, + 305.0115722864866, + 304.3484204597771, + 300.6016462408006, + 301.6885926425457, + 302.8587987869978, + 301.76243175566196, + 303.26254810392857, + 311.61424600332975, + 310.3059762492776, + 302.8856605887413, + 305.65557204186916, + 325.0154892131686, + 347.99423006922007, + 304.63470035791397, + 307.7289504110813, + 306.24055997654796, + 311.5128950700164, + 314.40105563402176, + 309.1666049733758, + 307.93893359974027, + 306.7219287157059, + 311.2792243883014, + 305.4177394658327, + 304.5340960919857, + 302.6999380737543, + 301.58187107369304, + 307.49320378527045, + 306.9323288910091, + 307.073274679482, + 301.27124988660216, + 301.3625046312809, + 303.2943754866719, + 305.47821817547083, + 394.3081710189581, + 319.9660501256585, + 303.69028670340776, + 314.62042624503374, + 328.6099530532956, + 302.3468530103564, + 306.52784983068705, + 302.55395501479506, + 320.79047775268555, + 324.0881902165711, + 328.9372208863497, + 319.86561659164727, + 304.8404664173722, + 302.80502955429256, + 318.4374005123973, + 310.95452906936407, + 302.5050379782915, + 309.95501767098904, + 303.56958720833063, + 300.79676131159067, + 300.43078707158566, + 301.7622159868479, + 316.0052177384496, + 306.31862473115325, + 301.9361075460911, + 323.77530751377344, + 303.844816416502, + 304.283378995955, + 308.307135745883, + 306.1476201787591, + 305.4888255447149, + 304.7141389902681, + 303.5546892285347, + 310.92546119727194, + 312.8997376784682, + 302.30862917006016, + 318.32745948806405, + 320.60628489404917, + 303.6365756466985, + 316.3388713300228, + 321.2027426250279, + 306.1689927354455, + 302.6159927621484, + 303.2306940853596, + 303.1041199788451, + 315.38721614331007, + 324.63238233327866, + 304.81327157467604, + 302.8093322813511, + 321.44131392240524, + 304.85930056497455, + 310.41319847106934, + 303.7040672171861, + 318.84543393552303, + 322.1189191788435, + 308.5137463733554, + 311.9992470815778, + 301.1950253918767, + 313.41916482150555, + 307.91270524822176, + 303.47395757585764, + 305.35861802101135, + 308.66430465132, + 302.0524307843298, + 303.77603593096137, + 304.42212472856045, + 301.051048707217, + 305.56059042178094, + 305.13097047805786, + 307.39113042503595, + 301.52664973400533, + 304.5323787480593, + 318.4340122938156, + 304.0795559734106, + 302.2399139329791, + 302.42944764345884, + 313.34928642213345, + 304.60008576512337, + 305.69225796312094, + 302.0560521427542, + 302.00184243917465, + 311.4982020109892, + 315.0358866080642, + 301.9079089164734, + 309.4744875729084, + 309.274310991168, + 303.1291667856276, + 302.3478204011917, + 306.01877687871456, + 309.0119261741638, + 333.8651823922992, + 313.384533777833, + 322.97892551869154, + 305.95935286581516, + 301.49211667478085, + 308.0729496590793, + 303.43611025065184, + 303.06012399867177, + 302.3982874080539, + 301.97271452844143, + 300.969434812665, + 311.004748608917, + 303.156504355371, + 303.18033319711685, + 313.8759497925639, + 303.9494991749525, + 306.29053538292646, + 302.22526286169887, + 319.2154204789549, + 303.0551530569792, + 321.99434347450733, + 309.4882374275476, + 304.70724506676197, + 317.8142026513815, + 310.8772392272949, + 307.5770675148815, + 301.5232051201165, + 329.9682536292821, + 305.9257740005851, + 319.95706625282764, + 311.76418790221214, + 306.7539248261601, + 321.7107451632619, + 304.85685582458973, + 310.4428901001811, + 301.99633763357997, + 300.6374957226217, + 307.3280272334814, + 301.78294180333614, + 300.7350559681654, + 305.526366956532, + 300.37847796082497, + 300.4285492002964, + 301.7338856421411, + 307.14030729979277, + 302.63682655245066, + 300.7523670941591, + 300.58615086972713, + 319.5991261303425, + 315.68133890628815, + 302.3201703429222, + 304.34630043804646, + 308.03821124881506, + 309.154373370111, + 308.52297838032246, + 301.7205881550908, + 302.60137938708067, + 305.718726683408, + 308.8466323316097, + 306.0190655067563, + 302.61635772138834, + 300.2488703876734, + 310.5877050757408, + 307.8380212858319, + 302.5803012922406, + 310.86165088415146, + 306.02300089225173, + 305.72442854195833, + 312.3907017111778, + 302.0090452134609, + 304.9804181009531, + 300.656103387475, + 305.87957620993257, + 303.5191167294979, + 345.8327758722007, + 301.73613507300615, + 307.4185171574354, + 301.42531906068325, + 301.8630644083023, + 304.1705794483423, + 308.79452756792307, + 301.57289209216833, + 314.0065190345049, + 303.08875063061714, + 307.32013107836246, + 309.39828814566135, + 303.3881766870618, + 325.62795566767454, + 312.4460650384426, + 306.7440432012081, + 331.25735284388065, + 306.0597800761461, + 302.25905479863286, + 304.6920786052942, + 327.59395042061806, + 306.1355842910707, + 334.38491832464933, + 307.3792537525296, + 311.5166800171137, + 310.53048922121525, + 304.59155417233706, + 314.44509786367416, + 301.5775272101164, + 303.0725117623806, + 312.0536254942417, + 312.2574187293649, + 304.6479791942984, + 305.8183773010969, + 304.38532488048077, + 318.5715978294611, + 304.7339979708195, + 324.6162198856473, + 309.3231765925884, + 306.6957603767514, + 304.6048494055867, + 303.75340723991394, + 301.558370500803, + 306.8752936720848, + 303.9316943511367, + 301.83065496757627, + 305.5359924584627, + 312.74043916910887, + 306.3416130039841, + 301.80598752200603, + 301.4731895327568, + 301.88931991904974, + 304.14717247337103, + 301.15287847444415, + 305.08669725060463, + 303.0998235568404, + 309.99349051713943, + 301.8619170039892, + 304.51974323391914, + 387.5805930644274, + 301.8049181997776, + 304.81463124603033, + 311.90580873191357, + 305.2012448720634, + 303.26527246274054, + 301.4753588363528, + 313.77401669323444, + 308.12876871973276, + 303.07205202430487, + 328.4798564836383, + 313.51802230626345, + 308.9964637309313, + 310.47093849629164, + 301.3768517691642, + 318.96315379440784, + 306.14003129303455, + 340.9420302659273, + 346.6742020100355, + 314.3861672654748, + 307.39401541650295, + 305.9299832880497, + 318.34798665344715, + 302.61598364263773, + 303.0194118320942, + 309.5094850510359, + 300.74667758494616, + 304.11385133862495, + 303.0418728925288, + 305.9653105661273, + 308.69997772946954, + 304.94514071941376, + 301.4920662045479, + 302.5287198200822, + 312.22501527518034, + 306.2142075970769, + 314.15163112431765, + 316.5984330326319, + 303.4711141511798, + 314.57252626121044, + 318.4992524124682, + 312.8852182626724, + 313.033934827894, + 304.00573986396194, + 311.1928275823593, + 304.5828785970807, + 300.993126437068, + 310.06647223234177, + 308.13819485902786, + 349.8969603255391, + 304.83339282125235, + 334.2861088067293, + 302.3560741841793, + 314.71146158501506, + 322.991505458951, + 301.58933575451374, + 310.41739719361067, + 301.8894840925932, + 302.87571492791176, + 303.1266493871808, + 308.6286905705929, + 303.8706060349941, + 301.9864717628807, + 311.2723760083318, + 300.95932710170746, + 316.4916201233864, + 302.25481478869915, + 303.3105667978525, + 316.350290954113, + 340.33031526207924, + 306.16379119455814, + 310.5560295507312, + 311.1550377458334, + 303.3642098158598, + 313.7699143588543, + 301.26531948149204, + 302.081057369709, + 301.87965605407953, + 378.0057831183076, + 302.6098465397954, + 307.5082870423794, + 302.8197278585285, + 311.5929714143276, + 311.25762563198805, + 301.35580327548087, + 310.36911035329103, + 303.13801704347134, + 303.48304327763617, + 302.81276612728834, + 300.44433742016554, + 304.23157373070717, + 309.615811413154, + 304.30916909873486, + 305.00299802422523, + 300.5989206433296, + 309.8149980008602, + 345.92480217665434, + 301.1195013523102, + 301.0280176028609, + 306.35187163203955, + 307.86736761033535, + 321.91849617660046, + 307.0998844951391, + 306.7867816463113, + 308.3879969790578, + 316.44594602286816, + 343.8585064262152, + 301.42503022402525, + 300.9540013372898, + 304.9627622961998, + 308.3479383587837, + 303.76201704889536, + 313.32375560700893, + 332.45213414542377, + 319.79815933667123, + 305.4503422603011, + 310.46658715233207, + 306.3906796500087, + 308.0925768651068, + 308.90431344509125, + 321.417050736025, + 306.87302316725254, + 312.7271330393851, + 323.0044175609946, + 310.77644392848015, + 301.86169689148664, + 306.09227826818824, + 328.7787397801876, + 311.14226174354553, + 306.6610340476036, + 303.5105180963874, + 318.81746907532215, + 310.9619707092643, + 301.75412322580814, + 309.7244118601084, + 303.0369252860546, + 312.59237717837095, + 302.5554770603776, + 305.3244752064347, + 317.44049605727196, + 304.0513763129711, + 329.137357853353, + 303.1367248892784, + 305.4837932884693, + 304.7356834374368, + 309.02222611010075, + 301.93906620144844, + 318.3069742023945, + 317.36685831844807, + 310.81524201482534, + 313.8626172840595, + 303.92518728226423, + 302.9238784760237, + 309.36713403463364, + 304.1914939433336, + 316.4554358050227, + 302.67420810461044, + 328.4234677925706, + 303.79793190956116, + 356.40141297876835, + 301.2808419317007, + 304.75805063173175, + 385.6368549019098, + 300.9907705485821, + 311.3609322346747, + 321.7174991890788, + 307.4848760589957, + 315.74309645593166, + 303.98608465492725, + 313.6868596635759, + 313.6283461600542, + 304.9714917242527, + 330.4368861466646, + 323.8818774074316, + 313.3254326507449, + 324.0116143077612, + 301.0313629806042, + 300.8748850002885, + 302.33840990811586, + 303.6418220102787, + 307.9302578121424, + 307.8377812355757, + 300.88615800626576, + 306.2066811621189, + 303.536954022944, + 311.20064320228994, + 310.4295338988304, + 313.4237181060016, + 313.54191971570253, + 301.53340873867273, + 302.93188861757517, + 311.81267221830785, + 336.27716402709484, + 301.42364524304867, + 356.38627448678017, + 303.4651247635484, + 322.87414610385895, + 356.65974256396294, + 309.7101764678955, + 310.08423126488924, + 301.08221489936113, + 310.4497760590166, + 304.9475895576179, + 301.10923001915216, + 319.3691678792238, + 304.49743542820215, + 322.427879024297, + 309.14312690496445, + 302.98486649245024, + 315.983753092587, + 307.4034491479397, + 317.6102310717106, + 301.03630355745554, + 317.98617574572563, + 303.53846737742424, + 304.6846788972616, + 301.59058951586485, + 314.2701108157635, + 312.6110567599535, + 312.6948411986232, + 315.4946878403425, + 302.7304846793413, + 312.50685872137547, + 308.02604412287474, + 309.32934319227934, + 317.7289959862828, + 350.73086587153375, + 310.012108489871, + 306.33996146917343, + 311.2571585904807, + 304.382202193141, + 311.87054535001516, + 316.3380961753428, + 302.8700880277902, + 336.6876145154238, + 302.29855518974364, + 311.8769036382437, + 302.9518266990781, + 302.2702427431941, + 303.5533684641123, + 300.84790021926165, + 306.5722948536277, + 301.5434013456106, + 307.608354896307, + 307.4694624580443, + 305.84049385786057, + 306.60508711636066, + 304.90969559922814, + 300.4697675406933, + 301.79476629570127, + 300.5281894188374, + 336.48435889184475, + 303.4514489173889, + 309.3649313598871, + 307.1220569163561, + 306.7408154308796, + 306.3186286240816, + 301.8366924840957, + 313.29269041121006, + 333.29945734143257, + 335.0335611179471, + 305.9629935324192, + 312.57474288344383, + 307.2355060726404, + 303.58003156632185, + 303.4543378353119, + 311.04583471268415, + 301.08282431960106, + 301.8505832590163, + 312.8005380257964, + 306.4407100081444, + 307.43828500807285, + 304.6795522272587, + 308.7191895172, + 312.91833524405956, + 304.6910424903035, + 306.174347769469, + 313.7038004435599, + 308.32420624792576, + 301.39663022756577, + 310.3612283077091, + 309.01172314956784, + 308.0410816036165, + 321.8866276964545, + 322.1650658994913, + 316.5356656014919, + 326.9443223029375, + 310.0779855251312, + 304.251731980592, + 301.7996651157737, + 301.20815283060074, + 305.2015831694007, + 308.0460794530809, + 302.5281275510788, + 307.2869423609227, + 318.44056183844805, + 301.8565634936094, + 333.3212886340916, + 317.02285531908274, + 306.0564371421933, + 316.21774250268936, + 307.6649445332587, + 317.15014646202326, + 306.2620981410146, + 308.4409275576472, + 343.58995857834816, + 306.559254527092, + 321.6428223773837, + 302.01668015122414, + 302.5337888151407, + 303.05297903716564, + 307.5788054689765, + 303.207707606256, + 303.49031542241573, + 302.58883038908243, + 308.7087995707989, + 303.6995891481638, + 311.66846903786063, + 314.3495101556182, + 305.119851693511, + 311.287884645164, + 309.5335079655051, + 312.1911980807781, + 303.2590351253748, + 345.9996098577976, + 303.6494621299207, + 301.4467751979828, + 310.76397490501404, + 305.2586919888854, + 309.7168856114149, + 316.7225593328476, + 311.09197437763214, + 302.7610512673855, + 307.3629707843065, + 324.87619902193546, + 306.25420179218054, + 304.0009604692459, + 305.6047920510173, + 301.80293041467667, + 301.1507236510515, + 305.7138876244426, + 319.98279294371605, + 315.8989097364247, + 323.73821926116943, + 313.7961251065135, + 302.513330578804, + 317.90480637550354, + 309.4024380296469, + 305.32401183247566, + 305.0191507264972, + 306.95337910950184, + 301.782501809299, + 306.35682278871536, + 305.8273798674345, + 306.81153754889965, + 300.9704293012619, + 304.71963772177696, + 308.9249815940857, + 301.22398901730776, + 306.92807427607477, + 309.686992585659, + 304.2103045992553, + 302.83545809984207, + 310.00556698441505, + 307.5399892181158, + 310.4846024364233, + 310.0568221323192, + 306.7971193343401, + 309.3629991002381, + 307.92135395109653, + 301.79983726143837, + 324.534432426095, + 301.9160646274686, + 310.31771202385426, + 302.1394529491663, + 320.1788532435894, + 307.9615247696638, + 304.50043923407793, + 396.79250836744905, + 303.2848686873913, + 309.38480653613806, + 304.2834405452013, + 306.4954122528434, + 310.86069225519896, + 311.63886147737503, + 303.863894328475, + 306.23542331904173, + 320.3478603512049, + 304.19111230410635, + 316.17235968634486, + 308.5623576082289, + 308.87335312366486, + 303.8152997530997, + 303.85626745969057, + 314.46353006362915, + 303.61092249304056, + 302.9228288978338, + 301.79783856123686, + 304.07031101733446, + 325.716486915946, + 312.7004381418228, + 336.77995785325766, + 320.28300437144935, + 305.22152242064476, + 340.3739929199219, + 310.82473186403513, + 312.4348585009575, + 334.3085149079561, + 303.6149370148778, + 308.37462539225817, + 303.80364182405174, + 304.24664383754134, + 305.2880827486515, + 313.3471027314663, + 304.53133418411016, + 308.1781327985227, + 303.9308643490076, + 312.97287974506617, + 321.7690767198801, + 309.60710902512074, + 308.22117498517036, + 301.9550921395421, + 304.1442262083292, + 308.7032279111445, + 312.1817825958133, + 312.8472861945629, + 302.52257388830185, + 302.9016106277704, + 301.0601403489709, + 303.08796451985836, + 302.0588604975492, + 320.6846947930753, + 313.1201856955886, + 315.75462633371353, + 306.6615122258663, + 314.9379582181573, + 331.46861608326435, + 306.0586729198694, + 305.6211660131812, + 318.94401644170284, + 303.36671010404825, + 307.84171529486775, + 307.54553689807653, + 318.80862187966704, + 306.02586936205626, + 303.56308817863464, + 302.7162991538644, + 302.1924297735095, + 308.7729394547641, + 313.1461196616292, + 301.2280187010765, + 309.1562999114394, + 303.75355864316225, + 306.868042178452, + 306.80732207000256, + 305.0785531103611, + 306.98138216882944, + 302.75364308059216, + 309.4325538352132, + 302.8961743377149, + 301.0143579095602, + 303.7494884431362, + 309.67853546887636, + 309.24797451496124, + 306.29884704202414, + 311.38388024643064, + 308.4615423679352, + 313.7818587496877, + 313.58017188310623, + 310.9542255848646, + 315.7246028482914, + 309.20133520662785, + 311.94401271268725, + 313.7904617190361, + 312.95263151824474, + 315.9473897591233, + 308.08300590515137, + 301.95683876238763, + 304.21166241168976, + 302.2100526243448, + 319.9155853167176, + 305.00332371145487, + 303.3256288729608, + 316.9274627491832, + 310.88146719150245, + 310.1164289228618, + 306.02723717689514, + 308.0626276731491, + 310.71964817494154, + 304.13688388466835, + 313.994876742363, + 308.12214897572994, + 305.3772269189358, + 345.4944060910493, + 304.2508965060115, + 307.10437590256333, + 311.9813995361328, + 304.66023583710194, + 315.87394531443715, + 318.00284093618393, + 302.16069427132607, + 301.1139675527811, + 306.3078454360366, + 346.1838433891535, + 302.44021997600794, + 338.7761685103178, + 302.4745773524046, + 301.1980266198516, + 310.14167737960815, + 306.6175226867199, + 302.4549618586898, + 311.8796521946788, + 311.78864879347384, + 304.7712293341756, + 302.1272806376219, + 301.18951200693846, + 312.04450852423906, + 301.89961468428373, + 317.3836220577359, + 306.8035358041525, + 302.1770180910826, + 301.79970978200436, + 310.2644992917776, + 310.7752745896578, + 300.5822667144239, + 313.207306727767, + 323.08254250884056, + 305.26797031611204, + 301.71314989589155, + 311.28939278423786, + 322.2249175310135, + 311.6763626411557, + 304.787543553859, + 302.58581651747227, + 307.6556247547269, + 301.3098353892565, + 312.66397857666016, + 309.18293768912554, + 311.3919150605798, + 304.93527076393366, + 317.0533761456609, + 306.1403321623802, + 302.703261628747, + 303.1514391452074, + 315.302499987185, + 312.4842846542597, + 308.9197848290205, + 303.6957389637828, + 314.2191483452916, + 314.7150936424732, + 311.0176304727793, + 303.34967370145023, + 308.57257928699255, + 309.5880531296134, + 302.35330525040627, + 301.51088769733906, + 323.8885632008314, + 309.0852548405528, + 304.68001895584166, + 302.5376718491316, + 302.72750263661146, + 314.70554441958666, + 300.58234006911516, + 301.4126506522298, + 303.75535430014133, + 306.6437532380223, + 308.846556648612, + 305.23439541086555, + 316.219647988677, + 301.2000195980072, + 306.59872505813837, + 303.4483655542135, + 305.7223662212491, + 303.49941300973296, + 304.2445761412382, + 305.09926790744066, + 314.433837287128, + 304.0149288009852, + 330.93921653553843, + 320.68451765179634, + 304.7085720188916, + 323.70160757377744, + 302.1099243443459, + 304.64351342618465, + 303.5163979679346, + 305.08888487517834, + 308.3957169428468, + 305.81978023797274, + 313.040515512228, + 305.75042182952166, + 309.51427764445543, + 317.1398370563984, + 321.1374712139368, + 307.3858580291271, + 306.5305768866092, + 316.1292619109154, + 304.88464172929525, + 302.85480126179755, + 306.7182881012559, + 312.86826518923044, + 303.5042924582958, + 300.1941365301609, + 302.23479114472866, + 302.2735741212964, + 305.13653983175755, + 307.4660334289074, + 336.64195505715907, + 306.9582702592015, + 308.2024480048567, + 308.2610350884497, + 303.33598510175943, + 313.3636790663004, + 301.4328661337495, + 339.11574275791645, + 303.9022965244949, + 305.9217796623707, + 303.8743591532111, + 302.50729554891586, + 304.8041717335582, + 401.06882782280445, + 317.34303352981806, + 307.7829269915819, + 313.45659840106964, + 311.06853883713484, + 310.09677934646606, + 316.4217844810337, + 305.2910995185375, + 304.4027859121561, + 304.2638630568981, + 307.2823805436492, + 304.2966276407242, + 304.6669781431556, + 303.5178098529577, + 303.71225709468126, + 300.7533129416406, + 306.4867419451475, + 301.9981443360448, + 303.0984405465424, + 340.3398381397128, + 318.8569599688053, + 307.6924646794796, + 311.5340628065169, + 312.8370440993458, + 309.29323691129684, + 309.32907877862453, + 304.1981149688363, + 309.3819173127413, + 338.45092456042767, + 319.8190900683403, + 310.1628343462944, + 305.51557959616184, + 310.2542772889137, + 308.6467745602131, + 329.35848328098655, + 312.5311471298337, + 303.2480120807886, + 384.4854485206306, + 312.0172129794955, + 308.26037749648094, + 330.870952764526, + 307.0538735166192, + 300.73447750508785, + 317.5313220769167, + 321.7633351497352, + 302.9939032047987, + 301.238626383245, + 304.0556839853525, + 304.2426385395229, + 314.01431362330914, + 314.6493880003691, + 316.98070253804326, + 300.87160444259644, + 306.0886431187391, + 327.91109316796064, + 303.98512479290366, + 304.7170142233372, + 308.3070092834532, + 303.64339086413383, + 304.5542027913034, + 313.4290754273534, + 312.9364513233304, + 306.30071640759706, + 319.74398708343506, + 303.2841157987714, + 304.1748616024852, + 302.0622006058693, + 312.33075419813395, + 329.465808339417, + 327.98625552654266, + 335.03221456706524, + 303.9340384975076, + 311.33725721389055, + 319.6639705747366, + 313.74636732786894, + 309.07366351783276, + 322.4413540363312, + 308.8012252599001, + 315.1670065075159, + 305.54985673725605, + 307.88929755985737, + 301.9411006271839, + 317.31950944662094, + 318.16270235180855, + 309.8547382056713, + 306.69975442253053, + 303.61138035357, + 305.5544786453247, + 310.9228515997529, + 304.3750849291682, + 300.90987119078636, + 305.0987059660256, + 302.3006394430995, + 313.95956702530384, + 323.78793589025736, + 305.411508589983, + 343.2834556847811, + 300.5084098391235, + 331.83136849850416, + 339.91265146806836, + 345.3615923970938, + 303.039590138942, + 305.78114533796906, + 306.9711747020483, + 305.24137756228447, + 303.544449493289, + 316.9166684895754, + 315.88711005449295, + 312.68093218654394, + 301.5318797826767, + 319.72890566289425, + 319.2369144782424, + 303.02750135958195, + 316.2923201061785, + 304.26546704396605, + 314.7365305162966, + 301.5272440761328, + 301.7192527651787, + 305.361551720649, + 318.16397588700056, + 303.0163643658161, + 317.09242210537195, + 308.76476721838117, + 313.4388741403818, + 300.93545761704445, + 312.85466987639666, + 328.4925737455487, + 304.8273031376302, + 306.34455312788486, + 311.2183825764805, + 309.94872891902924, + 312.5889230929315, + 305.7675058618188, + 316.06808249652386, + 320.2888114005327, + 309.2274674382061, + 308.76387463510036, + 317.2862457931042, + 305.85767513141036, + 346.9480971544981, + 300.4721645787358, + 300.34026739001274, + 310.5778836682439, + 307.5836846604943, + 307.66842360794544, + 308.1758845150471, + 302.9202149063349, + 303.4630645364523, + 305.4933644235134, + 308.39080433547497, + 309.29341566748917, + 318.77452144026756, + 306.30183240398765, + 302.79897597432137, + 305.4883691743016, + 303.1449493467808, + 305.3541045933962, + 304.0069487914443, + 306.71508310735226, + 311.23030668497086, + 307.1555020734668, + 305.48607540130615, + 302.56834650039673, + 301.07506950199604, + 304.7940003424883, + 300.40069384127855, + 303.8763438761234, + 307.65592401474714, + 306.9835291001946, + 300.64463802427053, + 304.2690003141761, + 314.14428221434355, + 313.17699699662626, + 303.6604873538017, + 305.4710621610284, + 310.7937735244632, + 304.94232635200024, + 327.60291474312544, + 328.2077470421791, + 307.8667853344232, + 338.18952905386686, + 302.73623018711805, + 312.50623728334904, + 301.8318835608661, + 305.22113017737865, + 300.82934875041246, + 301.8750954158604, + 310.48420433700085, + 315.9699742794037, + 309.13213834166527, + 315.862429022789, + 300.7089876830578, + 309.91679652780294, + 309.0585897564888, + 312.2899636439979, + 307.7066385149956, + 309.6808993704617, + 301.1380062699318, + 310.5237337760627, + 301.20618753694, + 307.39549960941076, + 315.0077182203531, + 302.12878239154816, + 302.6582300812006, + 308.45102668739855, + 323.24402140825987, + 303.6919346228242, + 304.5304071083665, + 304.68250089883804, + 312.73679457604885, + 307.5862630903721, + 300.26982371136546, + 312.73062608391047, + 302.3417748734355, + 311.1318643949926, + 300.87780603021383, + 326.1745633110404, + 304.62091758847237, + 304.6567334905267, + 306.474965531379, + 316.35564963519573, + 314.9580618850887, + 302.70948158204556, + 302.96487779170275, + 328.35870783776045, + 307.60023483261466, + 303.97978433966637, + 307.88142129033804, + 342.5467133689672, + 304.0905951708555, + 316.21776054799557, + 308.8850179500878, + 302.0652360878885, + 301.21098716929555, + 309.76924831420183, + 329.885852009058, + 311.60723074525595, + 301.7973333746195, + 307.07299652695656, + 312.6094234511256, + 301.5483038574457, + 306.27812534570694, + 334.30995912849903, + 304.3250970393419, + 304.4390624910593, + 311.4514694958925, + 303.5188213288784, + 308.49723736569285, + 308.0807638540864, + 319.0888800919056, + 310.898318760097, + 305.3397327866405, + 305.52919989824295, + 309.75596533715725, + 304.12999441847205, + 321.20945449732244, + 301.071779564023, + 307.2607180252671, + 305.98292218893766, + 307.45210912823677, + 314.0605644248426, + 305.01555222272873, + 309.75735825300217, + 319.6074768677354, + 306.625504411757, + 304.34057941287756, + 324.19649466872215, + 307.964761428535, + 312.90776897221804, + 306.4094206430018, + 303.63400707393885, + 302.4874537587166, + 304.91752195358276, + 307.12995903752744, + 307.07630532979965, + 303.3072781264782, + 309.4330599755049, + 313.453883189708, + 304.2125022560358, + 305.4437604621053, + 300.5950629711151, + 311.0540649816394, + 305.8448890373111, + 307.58561689034104, + 308.94775246828794, + 311.1988082230091, + 323.8764725867659, + 304.8320538699627, + 300.7356820255518, + 302.7524498999119, + 310.7653528302908, + 304.80290469527245, + 304.4985054284334, + 307.06071649491787, + 302.0583017542958, + 300.74026825279, + 306.8744833469391, + 304.80019072815776, + 303.61936934664845, + 315.6817831322551, + 316.61797428131104, + 309.52718921005726, + 301.46419863402843, + 305.3060469701886, + 300.7135121487081, + 301.6430397182703, + 317.3851285241544, + 306.55473455041647, + 363.9615413993597, + 310.1359448879957, + 311.1636070087552, + 310.2543765306473, + 338.4388803243637, + 311.58678321540356, + 307.0812324360013, + 303.08464550226927, + 301.8516679927707, + 303.1595066636801, + 309.1265839487314, + 306.55636513233185, + 304.32702136039734, + 301.85989986360073, + 307.1116476356983, + 315.42173866927624, + 303.4689678866416, + 305.99842346459627, + 305.50488243997097, + 302.827654607594, + 306.41802079975605, + 318.96268282830715, + 313.01606576144695, + 319.89229841530323, + 305.2868709564209, + 300.9730666577816, + 305.40270940214396, + 307.5870000422001, + 306.2661126628518, + 305.4031700864434, + 313.8363372609019, + 304.78143937140703, + 303.9006860591471, + 303.715163461864, + 305.1052415892482, + 305.31438244879246, + 303.29968224838376, + 301.93116227537394, + 303.35873731970787, + 305.7804597020149, + 305.99360229074955, + 305.7741624414921, + 302.1773720923811, + 328.7458832077682, + 303.84334387630224, + 308.2802267819643, + 301.63556760549545, + 301.27631210535765, + 346.42315462976694, + 305.0173718072474, + 326.98716671951115, + 315.1498116850853, + 301.4075410813093, + 320.19539953023195, + 311.0104623194784, + 309.3073474429548, + 327.13480224460363, + 305.97754104435444, + 306.03984137251973, + 307.4130977168679, + 302.8394752666354, + 302.11635325849056, + 327.25311877578497, + 316.55455519258976, + 325.89584554731846, + 306.08196226507425, + 326.33543859422207, + 302.74254555627704, + 300.97490129619837, + 313.1174084097147, + 306.3420277312398, + 308.49634696915746, + 303.6422215588391, + 301.02723905816674, + 303.3638081513345, + 306.6306995525956, + 323.17985359579325, + 306.5924952439964, + 307.1509288698435, + 307.8078141286969, + 316.66428764909506, + 329.7537614777684, + 303.18337770178914, + 314.79085912555456, + 302.90778870135546, + 302.2704091127962, + 313.20647075772285, + 305.05497436225414, + 309.5324325039983, + 300.396191239357, + 306.0101376324892, + 304.1291917562485, + 309.3718437999487, + 304.985210955143, + 305.5890204310417, + 312.8254923224449, + 324.25293503701687, + 302.28979229182005, + 303.0274516791105, + 302.6727037355304, + 368.6740471608937, + 309.67066526412964, + 310.4204117283225, + 302.4736553430557, + 305.22678416222334, + 308.4608486481011, + 303.9721538424492, + 301.0446063838899, + 304.21873497217894, + 305.91327998042107, + 316.53860878944397, + 303.3201322928071, + 302.3462369441986, + 300.74770457297564, + 326.8715980499983, + 324.1796484030783, + 355.80043479055166, + 305.05840292572975, + 303.8428261131048, + 302.060388116166, + 317.62849137187004, + 321.7047117650509, + 301.7189256325364, + 301.56694693118334, + 307.9847244769335, + 301.10217021405697, + 308.6363477706909, + 306.54606483876705, + 302.9364673346281, + 314.87806111574173, + 302.9576720818877, + 310.39002392068505, + 302.55337139219046, + 323.4577555805445, + 302.3604170233011, + 301.823188200593, + 300.9415360093117, + 300.7039441615343, + 308.77942268550396, + 303.4303394407034, + 307.53156696259975, + 301.07484133541584, + 301.10586926341057, + 307.8338553160429, + 327.07165674865246, + 305.89528968930244, + 302.35148990154266, + 303.5736770108342, + 340.5831007640809, + 303.3751086741686, + 301.80309718102217, + 301.8358323946595, + 307.68257158622146, + 300.7337675318122, + 308.512657918036, + 321.84555138647556, + 370.02652752771974, + 309.36754268221557, + 317.5458298623562, + 311.75896241888404, + 309.0618697553873, + 309.48647896945477, + 309.9286267198622, + 308.39091439545155, + 304.2760826982558, + 306.46823236346245, + 313.75260512530804, + 314.02348782122135, + 302.03165777027607, + 311.91490537300706, + 303.61929509043694, + 333.1927315145731, + 303.9664089381695, + 302.85925375670195, + 307.2511135414243, + 312.47955845296383, + 306.1282205916941, + 304.48108361661434, + 309.8015540242195, + 302.6065649315715, + 302.5870514959097, + 323.2947468906641, + 306.2968934774399, + 312.76820908486843, + 306.3576267436147, + 310.707114931196, + 307.9137586057186, + 301.8561171647161, + 302.66546600311995, + 321.2014006227255, + 301.49332439899445, + 304.9257511943579, + 301.0099757127464, + 301.28085623681545, + 302.210535004735, + 307.34200954437256, + 308.4336723536253, + 303.08927144668996, + 307.72234001755714, + 300.9886228889227, + 305.90212266147137, + 308.28744637966156, + 301.9355596974492, + 307.9514597989619, + 314.573957785964, + 302.83810802549124, + 317.2418464049697, + 310.46616116538644, + 302.37779125384986, + 303.913715980947, + 303.74348606169224, + 301.8683134317398, + 301.6001742184162, + 306.4633065853268, + 302.5447977334261, + 308.31820415891707, + 310.89963049441576, + 323.39418321847916, + 302.03161396086216, + 324.5964703410864, + 301.44349336624146, + 306.3843828290701, + 315.14740749821067, + 302.67952942848206, + 307.1649696826935, + 303.94725573807955, + 312.4935895204544, + 308.00007132440805, + 304.14799328148365, + 309.1716391593218, + 301.3571230918169, + 306.24197360128164, + 307.2502010948956, + 302.6090174615383, + 304.358757160604, + 323.5412840247154, + 303.3136991262436, + 304.5356862396002, + 302.5070853140205, + 309.0154083073139, + 312.2982620447874, + 301.00488410145044, + 302.3723155707121, + 301.4654733091593, + 330.6141009628773, + 300.4612224921584, + 320.7098229881376, + 327.8329824730754, + 303.7183190062642, + 303.04349809885025, + 304.57083846628666, + 300.4154512062669, + 306.18918128311634, + 301.14784225076437, + 322.61904115229845, + 307.7984331920743, + 305.8572051897645, + 300.9537511318922, + 309.16399478912354, + 306.63513019680977, + 390.42264460772276, + 303.89495284855366, + 310.60258093103766, + 307.60640162974596, + 304.9585528448224, + 302.87433609366417, + 304.15460707992315, + 302.3444174490869, + 301.0439973138273, + 305.406921133399, + 307.0423280224204, + 318.1531775444746, + 307.11657823622227, + 300.8769796974957, + 301.1663519516587, + 313.6903201341629, + 303.29581743106246, + 308.09515514969826, + 302.76286064088345, + 305.99412151426077, + 386.2261217162013, + 315.7491255104542, + 311.65732427686453, + 329.6743949428201, + 321.00912518054247, + 318.7818668335676, + 308.768777590245, + 302.6791039407253, + 307.2852216772735, + 304.41947074234486, + 305.90382966026664, + 309.7715249694884, + 302.0302657485008, + 305.69298435747623, + 304.70600071549416, + 316.8685695081949, + 300.7455117031932, + 329.3947750851512, + 307.0089636147022, + 306.81066109240055, + 305.72955183684826, + 312.08013010397553, + 302.98670152015984, + 302.6480435729027, + 308.7863450795412, + 302.3388228844851, + 305.361973926425, + 312.18220157921314, + 304.941029176116, + 312.6118339896202, + 309.6434079837054, + 302.2249376401305, + 315.2685210183263, + 304.5598947480321, + 322.5284920129925, + 311.039980776608, + 307.36617678403854, + 301.0959759391844, + 306.65186685323715, + 300.3955841809511, + 301.2752664834261, + 319.1230724975467, + 316.24669878184795, + 315.5688640009612, + 304.0676415115595, + 334.15398766845465, + 304.56327429413795, + 301.4455182030797, + 306.3684457987547, + 309.57025357335806, + 323.04079116135836, + 314.39293821528554, + 303.3740914314985, + 307.955211635679, + 303.212369594723, + 308.04965491592884, + 300.94519278407097, + 320.1101879104972, + 307.30430134385824, + 318.3989151120186, + 301.3022821396589, + 326.93364118784666, + 301.6193569265306, + 308.3260301426053, + 302.9390524290502, + 313.9789659976959, + 302.6128911525011, + 305.8585841059685, + 306.82897709310055, + 314.1636579632759, + 302.2165154181421, + 304.67912797629833, + 310.8428757712245, + 301.23811730742455, + 312.1784426830709, + 302.13247443921864, + 300.83607506752014, + 302.9770949408412, + 308.34425580501556, + 308.5437694787979, + 311.90109372138977, + 315.4067892432213, + 307.9072656594217, + 305.23349916934967, + 306.02536368370056, + 305.5057045444846, + 311.3177732694894, + 305.6086577773094, + 307.0076570250094, + 302.74083883315325, + 337.1543748527765, + 316.2102428525686, + 302.8077806830406, + 306.8514118641615, + 303.56792216189206, + 309.1553970128298, + 319.0576904118061, + 304.92617754638195, + 377.4687402397394, + 316.4928127154708, + 302.1167809739709, + 333.9619807600975, + 303.08976316452026, + 301.897847533226, + 315.808838641271, + 315.1484027057886, + 314.9919910430908, + 300.47262981534004, + 303.4967271462083, + 305.9345471896231, + 321.8409278355539, + 302.9940343052149, + 303.1259665116668, + 300.77320613339543, + 307.0996874123812, + 307.11664163693786, + 335.74446449428797, + 303.6702860221267, + 313.04037023335695, + 309.21058239787817, + 308.8369244784117, + 304.030413672328, + 305.73038697242737, + 302.39968490600586, + 306.2367812395096, + 317.51463244110346, + 316.65661642327905, + 312.50293327122927, + 303.51749289035797, + 340.388291567564, + 300.7524104639888, + 318.39108837395906, + 312.3695218041539, + 308.5282972455025, + 306.4002430662513, + 304.6110353283584, + 313.28387388587, + 300.99618261680007, + 310.36040218919516, + 306.66857685148716, + 304.96736168302596, + 308.03722809255123, + 306.8438627868891, + 301.5795469582081, + 310.26678681373596, + 305.6633152514696, + 315.4217044040561, + 308.7368942499161, + 307.7661217600107, + 318.4056820124388, + 314.52850414067507, + 304.40335796773434, + 302.075579829514, + 311.17160991206765, + 303.20118353515863, + 306.3162615150213, + 306.31701804697514, + 302.5855111926794, + 311.65542839467525, + 302.3923661187291, + 309.0372557993978, + 306.3002924397588, + 301.35248417034745, + 305.20805272832513, + 313.1300560347736, + 324.89733320474625, + 325.5018313676119, + 303.2748560681939, + 304.57555071264505, + 308.8153494745493, + 372.1011131554842, + 305.0041010081768, + 306.77794847637415, + 301.794466689229, + 301.19780062511563, + 301.96308585628867, + 306.8294670544565, + 307.48438737913966, + 304.84937573969364, + 300.9616697356105, + 303.7966057360172, + 303.25996489822865, + 304.6784522458911, + 306.3158697336912, + 308.4458302408457, + 301.94219810143113, + 382.7168925255537, + 309.6189790815115, + 305.13015796244144, + 308.3896294385195, + 300.9019546508789, + 310.38338390365243, + 303.13911904767156, + 303.55345533043146, + 307.00657698884606, + 304.6066991239786, + 304.3744693249464, + 303.8606555387378, + 305.83140663802624, + 302.6780304312706, + 301.55011811107397, + 304.78673492372036, + 323.324757643044, + 308.4022333174944, + 301.58782237768173, + 301.82373698428273, + 301.3603678382933, + 315.02898282557726, + 307.21870582923293, + 301.9429404474795, + 301.23750369250774, + 309.10024128481746, + 332.1066564768553, + 307.7159663364291, + 303.64999717473984, + 300.9969964325428, + 304.90752866119146, + 325.6194051206112, + 309.70468631386757, + 302.0811198465526, + 301.92975380271673, + 308.7101516276598, + 307.88736460357904, + 323.7995719984174, + 346.4149025157094, + 316.5290503427386, + 300.6018628105521, + 332.7101990059018, + 307.13265251740813, + 312.814910877496, + 305.90784143283963, + 315.39969778060913, + 307.19478023052216, + 304.1856911107898, + 301.5315172765404, + 302.53129189834, + 310.396307118237, + 304.28014101088047, + 303.2272779010236, + 304.9000346623361, + 312.99909745156765, + 304.73923095315695, + 306.31254241615534, + 301.8797785192728, + 307.69840186834335, + 305.7383463084698, + 305.83189487457275, + 301.60589524172246, + 307.2547632753849, + 300.86185701191425, + 306.20611510798335, + 304.0077364221215, + 302.22189988195896, + 371.68104957044125, + 304.323909111321, + 306.0670812893659, + 312.4191209971905, + 300.89121636003256, + 306.92111034318805, + 302.13944663852453, + 306.03153635561466, + 328.5601599365473, + 303.5327598005533, + 304.81967751681805, + 309.12888257205486, + 314.1831556558609, + 302.44701550900936, + 305.723495349288, + 301.93430917710066, + 333.33159378916025, + 309.0279892683029, + 306.56669194996357, + 300.5176677554846, + 314.93444249778986, + 302.24055587500334, + 304.0390919111669, + 317.52691558003426, + 312.9595919698477, + 306.25508961081505, + 308.94080951064825, + 311.0296876579523, + 303.4263368099928, + 301.2701930999756, + 347.0575881265104, + 318.35587882995605, + 312.0946393609047, + 306.73391352035105, + 305.4674715064466, + 306.1064164787531, + 325.71836045756936, + 309.1701722256839, + 306.1738948151469, + 313.69511741027236, + 308.3689454719424, + 302.4934695586562, + 307.4664578437805, + 326.5174139738083, + 317.9233179241419, + 301.4567811116576, + 302.2501599378884, + 303.1428438127041, + 304.90094493329525, + 301.78634156286716, + 308.4457304775715, + 306.6779181063175, + 312.7446625381708, + 305.6780329942703, + 300.9189454242587, + 312.7554627843201, + 302.8775804787874, + 307.25401685386896, + 301.51523865014315, + 305.5294031575322, + 320.79166904091835, + 308.9212627578527, + 324.439087331295, + 303.1882475987077, + 305.95965963602066, + 307.54831006750464, + 303.2360982373357, + 303.96111012250185, + 320.0742860287428, + 306.5534134656191, + 308.6019262075424, + 312.1951226890087, + 306.9486451782286, + 301.51661502197385, + 317.1534370742738, + 301.81569028645754, + 307.8376979678869, + 339.1380999535322, + 312.38622553646564, + 307.83898078650236, + 308.0534465312958, + 319.1884568929672, + 323.1942051500082, + 302.05714217573404, + 302.9742667861283, + 308.3083347529173, + 322.7389754205942, + 308.0857234224677, + 310.7089175581932, + 303.1433578617871, + 301.79142815619707, + 307.20260515064, + 329.0437508150935, + 301.82211297750473, + 303.8190317824483, + 321.20297422260046, + 306.01032353937626, + 304.88058955967426, + 301.3049358204007, + 304.43753914162517, + 304.08710004389286, + 364.85476268827915, + 308.45149103552103, + 302.9213736206293, + 309.23347077704966, + 303.5359014943242, + 310.8130558207631, + 300.8816674873233, + 300.43470551259816, + 334.54014237970114, + 305.8354629725218, + 302.818372707814, + 303.8809272944927, + 322.22416203841567, + 306.1929524689913, + 300.7331209331751, + 300.9725872669369, + 314.115994207561, + 306.1932307779789, + 307.66856325790286, + 312.09457878023386, + 300.80548346042633, + 308.8799495100975, + 324.14960112422705, + 308.2264576032758, + 301.9822439700365, + 317.48872692883015, + 301.85602889582515, + 302.0005536004901, + 317.0245053470135, + 309.25273582339287, + 307.52540485560894, + 301.3609685525298, + 303.3487363010645, + 302.86950865387917, + 301.38317397236824, + 301.22536475770175, + 302.12227523326874, + 302.7220124732703, + 309.7179391235113, + 303.97252321988344, + 338.2131891697645, + 301.51011888310313, + 308.0435454696417, + 302.20802165567875, + 315.5576593782753, + 309.6029911544174, + 304.0862557031214, + 333.5635378956795, + 355.54248072206974, + 313.7632626388222, + 378.3633461892605, + 301.80969639122486, + 309.31165197491646, + 301.20801162719727, + 307.68038238584995, + 311.84014793485403, + 310.74519019573927, + 303.28121353313327, + 303.23623998090625, + 304.40229243785143, + 302.7616905719042, + 303.6299144625664, + 302.94022300839424, + 305.74800020456314, + 307.9718183130026, + 311.75822841376066, + 311.749570004642, + 308.67921037971973, + 300.9750553444028, + 322.90763311833143, + 304.7138540148735, + 311.64582592248917, + 314.91256752610207, + 307.0355245620012, + 314.08084635436535, + 307.96849593520164, + 306.3855186570436, + 302.8717501387, + 300.86599584668875, + 312.06537429243326, + 305.721293784678, + 301.867666721344, + 304.78808457404375, + 315.45667009055614, + 306.3776350952685, + 301.0778730362654, + 302.8228237219155, + 306.53098353743553, + 305.3206312954426, + 304.5237855762243, + 314.8969930782914, + 314.2112059406936, + 318.49493834376335, + 312.3457152247429, + 305.72463454306126, + 303.37614459358156, + 300.8679114729166, + 303.4574050307274, + 310.3319405540824, + 309.62216894328594, + 309.09487757086754, + 307.35175807774067, + 301.598940551281, + 325.17899153381586, + 303.4082556962967, + 308.77505891397595, + 306.63070891425014, + 313.37159114331007, + 300.69353114813566, + 300.66681556403637, + 300.859059125185, + 302.6271438151598, + 323.6259123161435, + 305.8678754642606, + 301.3839372731745, + 312.1893984377384, + 304.5997568666935, + 333.96781534701586, + 305.7484077513218, + 302.95287162810564, + 303.7178414911032, + 309.4767670929432, + 303.1442150697112, + 312.0699721723795, + 310.9274402335286, + 309.21444922685623, + 302.16662469506264, + 312.1916009783745, + 314.0992684587836, + 305.13122542575, + 308.00323471426964, + 307.04841908067465, + 306.22607681155205, + 303.67178776301444, + 310.32181110978127, + 302.6991778165102, + 305.31243435293436, + 301.21543926373124, + 303.6561962515116, + 304.28117671608925, + 301.2481402717531, + 300.7287360727787, + 307.41083035618067, + 308.8124677091837, + 316.7328977957368, + 305.80355174839497, + 303.5296052992344, + 302.20190705545247, + 305.6667077355087, + 313.17091219872236, + 305.0641104541719, + 302.51976684480906, + 316.5442049726844, + 310.4732868373394, + 313.5088918507099, + 307.7861150056124, + 301.9833128377795, + 304.5958387106657, + 305.18913746625185, + 304.0625876635313, + 306.65750539675355, + 318.05711551196873, + 309.92921826057136, + 318.5143242441118, + 306.43307664245367, + 306.3993567228317, + 300.61761923134327, + 308.219530582428, + 301.2775491774082, + 328.5478779375553, + 306.687523573637, + 305.04386430606246, + 311.33790500834584, + 305.5128058195114, + 306.8813223093748, + 307.27783511579037, + 312.4142979159951, + 304.3817966617644, + 303.1246142499149, + 301.2036204636097, + 326.2058792114258, + 305.63221172988415, + 303.38588321581483, + 317.3315177410841, + 307.04971945285797, + 332.8649989813566, + 307.20659954845905, + 302.95184779912233, + 329.65517603233457, + 303.0288744866848, + 303.49915546551347, + 306.2571194488555, + 308.9529639258981, + 303.1943546421826, + 302.66221832484007, + 322.08685908839107, + 313.8205115497112, + 310.12663584947586, + 307.475150488317, + 305.67553310096264, + 300.68538277596235, + 304.2396109253168, + 302.63353031873703, + 304.10303078591824, + 302.8346285223961, + 317.10493321716785, + 304.88222993165255, + 302.18937262892723, + 316.89699893444777, + 304.37139289826155, + 301.11469729430974, + 311.909139983356, + 303.8654483407736, + 300.5160071477294, + 328.4009803235531, + 305.60960997641087, + 305.56112498790026, + 310.55551486834884, + 308.8442037515342, + 310.99192517995834, + 303.0763939656317, + 306.31960780359805, + 302.11553875543177, + 301.50053075701, + 320.95274832099676, + 305.37246405892074, + 312.98869620263577, + 301.38265697285533, + 310.16225784644485, + 310.1660414636135, + 310.47995475679636, + 315.96817295998335, + 309.1877599209547, + 316.9438316375017, + 348.7203481197357, + 312.31083777174354, + 304.2828721664846, + 302.53320310264826, + 304.41090469807386, + 301.445695489645, + 302.9577275682241, + 305.64275742322206, + 317.32110871374607, + 372.89929362386465, + 310.7708093691617, + 343.98677408881485, + 316.20007490739226, + 305.05859702825546, + 311.51766215637326, + 313.2390592843294, + 306.67603043466806, + 305.9484346881509, + 302.5014810487628, + 319.1468371748924, + 321.44229701161385, + 303.70634544827044, + 301.745233733207, + 311.33711168169975, + 301.14586770907044, + 300.41126726567745, + 314.2733101695776, + 324.25206741690636, + 301.4915241524577, + 315.5435993075371, + 306.156626611948, + 310.7615935653448, + 302.2829238027334, + 301.21236020326614, + 344.8146548271179, + 310.7993917055428, + 307.28207090497017, + 305.51445158571005, + 330.2801840156317, + 326.2970898523927, + 306.5485259741545, + 301.45526045560837, + 306.49017183482647, + 308.4187636449933, + 310.9190103877336, + 300.1574507057667, + 300.43562264740467, + 304.3086013291031, + 306.65603271871805, + 308.88772167265415, + 310.31128488481045, + 302.5821664892137, + 301.9471508152783, + 327.0003987252712, + 363.40677216649055, + 317.82449131459, + 308.7466286942363, + 310.10897881910205, + 308.9514836035669, + 321.8386970758438, + 310.44344909489155, + 302.3883312046528, + 303.6106186211109, + 308.17059537768364, + 356.7445265054703, + 303.5911869034171, + 300.59935543872416, + 312.7133607417345, + 311.4025739133358, + 317.4246556907892, + 310.12879490479827, + 321.5190863907337, + 300.6279033124447, + 316.53098721802235, + 310.7942612618208, + 306.60871222242713, + 311.55148254334927, + 322.69983926415443, + 306.6705199088901, + 356.35688062757254, + 316.51887583732605, + 302.3571827560663, + 321.6083949804306, + 301.8311072513461, + 314.85896169394255, + 303.38669015467167, + 303.7824518531561, + 302.022852152586, + 301.20793497003615, + 307.66288935393095, + 302.63016325980425, + 318.96193002536893, + 310.6048757880926, + 310.5373354367912, + 344.3201212286949, + 301.92495400458574, + 300.9316249974072, + 329.17781323194504, + 305.23471251130104, + 302.3879020512104, + 324.18780878558755, + 309.4531458988786, + 303.7150162346661, + 313.79779876209795, + 301.679332010448, + 302.204596940428, + 301.69701776467264, + 330.2138944789767, + 305.821647785604, + 306.480262465775, + 301.8959604501724, + 309.522608820349, + 305.0279196500778, + 310.4127714037895, + 304.2290247231722, + 310.93367125838995, + 307.8561032116413, + 329.11193700507283, + 301.99601408839226, + 306.8066284507513, + 312.07099632918835, + 306.4951368421316, + 305.13067930936813, + 311.86816519498825, + 303.45618506520987, + 301.68363101780415, + 307.04288103058934, + 301.428060926497, + 306.11090500466526, + 308.84774373471737, + 307.268551915884, + 304.1488448753953, + 308.5547456741333, + 309.62614878080785, + 311.1181204393506, + 310.6477976590395, + 301.5456059426069, + 303.66793193668127, + 303.88458935171366, + 307.9897948205471, + 307.1312054283917, + 303.358731623739, + 303.2840214818716, + 307.5846636146307, + 330.29110619053245, + 301.5378146842122, + 301.81050811707973, + 302.4964707940817, + 308.4979086816311, + 302.2458455860615, + 308.1767373122275, + 307.50968382693827, + 302.7509505674243, + 316.6562230363488, + 316.3928167000413, + 304.023845218122, + 318.86373814195395, + 300.33627343177795, + 320.3666396141052, + 308.4770833104849, + 302.7726911306381, + 303.5242251250893, + 304.75009072571993, + 310.9109401702881, + 316.5513100326061, + 308.07915572077036, + 311.79950031638145, + 302.58635572344065, + 306.0946309790015, + 302.6783283725381, + 335.42470595799387, + 320.4631393775344, + 302.09732748009264, + 302.7232630196959, + 313.83459804207087, + 323.2437053285539, + 301.6690703034401, + 301.51359897851944, + 308.34325052797794, + 316.0835858974606, + 341.5265869051218, + 328.82868976704776, + 301.1171418502927, + 306.6253290101886, + 304.3078538775444, + 302.72107549756765, + 311.65945556759834, + 307.07121636532247, + 303.39374466240406, + 310.180995170027, + 304.59208835847676, + 316.5374254733324, + 317.52693954110146, + 305.491911791265, + 312.0847585052252, + 323.1811346113682, + 307.6599756106734, + 312.4586041048169, + 303.4319518953562, + 304.63008347153664, + 317.0695069208741, + 303.7599560022354, + 305.67759212851524, + 302.65542413294315, + 308.8629762157798, + 302.160896807909, + 315.08943074196577, + 301.54277580976486, + 304.3492419272661, + 307.2015034891665, + 308.44913908839226, + 364.5613085925579, + 324.1079083904624, + 305.77173554338515, + 315.61680134385824, + 307.7833977788687, + 307.58654426038265, + 306.3103651329875, + 303.97895174100995, + 331.37231930717826, + 302.1907422244549, + 306.23543068021536, + 302.1561292819679, + 304.64007603377104, + 307.12110222131014, + 312.3623737357557, + 310.03853772580624, + 308.29743088781834, + 301.85149542987347, + 313.8100929632783, + 309.6346568092704, + 301.73929051309824, + 304.7310772687197, + 304.4121221899986, + 319.7473457828164, + 306.7948559001088, + 308.2422635406256, + 309.9793807566166, + 309.1452734917402, + 310.2031655665487, + 307.4796634763479, + 302.29969630390406, + 305.4871023334563, + 303.7911406457424, + 335.0980690717697, + 342.1154540255666, + 310.6340107470751, + 302.8198762945831, + 306.16712817549706, + 306.8788531422615, + 328.68429512158036, + 304.74501398950815, + 301.38911293819547, + 308.7814608067274, + 301.30243756249547, + 316.98437452316284, + 307.39007987082005, + 300.54707698524, + 306.67441092804074, + 306.01436337828636, + 321.5740974023938, + 300.6059639900923, + 307.4240235090256, + 302.19124576449394, + 302.7043156847358, + 333.2795081809163, + 306.41801995784044, + 329.4335888288915, + 304.27631562948227, + 301.74276670254767, + 302.65257051587105, + 309.1176870763302, + 305.45986813120544, + 303.2687944099307, + 311.22213839553297, + 416.82044753432274, + 301.6200428903103, + 301.2922334372997, + 307.35984851419926, + 314.2325631454587, + 302.9514333046973, + 312.19876973330975, + 305.44771986454725, + 302.86768015287817, + 304.9549379646778, + 303.5066426284611, + 308.7748593837023, + 302.39568949490786, + 309.2159056738019, + 304.0808234140277, + 304.28521251678467, + 311.0962460730225, + 304.3542172089219, + 314.2765524685383, + 301.7005084455013, + 303.8653028588742, + 318.11216765269637, + 307.80816769599915, + 302.2114487066865, + 309.39550100266933, + 309.6361206397414, + 306.3317455947399, + 304.36510115116835, + 304.64069474488497, + 300.95413768291473, + 304.4793861322105, + 301.82991111278534, + 309.95430617779493, + 305.66767344623804, + 325.24783723056316, + 303.78478426486254, + 328.2723254561424, + 304.91716565191746, + 306.22507205605507, + 302.4829363580793, + 304.51797492802143, + 304.0025024712086, + 300.5417879745364, + 312.4347739443183, + 300.74912282824516, + 303.0146790891886, + 314.47613117843866, + 308.8714428022504, + 314.5471199899912, + 303.9485434331, + 309.1876583993435, + 303.6083176098764, + 306.1695419624448, + 310.43574047088623, + 391.9544968903065, + 304.7923315986991, + 304.10613687336445, + 301.5493629425764, + 300.64288752526045, + 307.51532891765237, + 343.08517879992723, + 306.81507437862456, + 314.1844725012779, + 301.10936499387026, + 300.38170160353184, + 310.5226054266095, + 305.17706153541803, + 311.1820936501026, + 304.1821208149195, + 300.4854075908661, + 305.5181114822626, + 315.9686829224229, + 312.34799091517925, + 304.67174265161157, + 309.95038805156946, + 329.5505417212844, + 302.9617203846574, + 309.8653458952904, + 303.0721364021301, + 321.0982597991824, + 309.2220148816705, + 304.92150067538023, + 305.32523822039366, + 305.960252776742, + 301.19267002493143, + 300.6616346016526, + 306.195201439783, + 357.65035970695317, + 301.531973650679, + 304.15562393143773, + 301.898175008595, + 320.05267878621817, + 301.68491323292255, + 304.5881449729204, + 302.74684373289347, + 338.06448144465685, + 304.3909378051758, + 300.8765900656581, + 309.00363596715033, + 310.39006216078997, + 314.52364283427596, + 310.4884849861264, + 312.75039303675294, + 315.2286881059408, + 307.00861122459173, + 374.50006069242954, + 302.82735482417047, + 308.17937035113573, + 314.48133369907737, + 309.2812649086118, + 303.5920427814126, + 302.130679063499, + 301.3567379526794, + 312.5898841805756, + 302.23566964268684, + 307.4594117552042, + 344.2182421684265, + 300.79339318722486, + 314.9381695035845, + 306.02912848442793, + 308.7643918246031, + 362.0111813992262, + 305.21754509210587, + 302.71294286847115, + 305.28139877319336, + 306.64860549755394, + 300.9546636044979, + 318.79996952041984, + 301.74322579987347, + 321.77443290129304, + 304.7439801953733, + 311.69046957045794, + 306.7164596244693, + 304.0377137027681, + 305.4332427382469, + 317.9384236186743, + 335.24812316149473, + 324.0213030129671, + 307.5821422636509, + 301.56507451087236, + 309.0109963193536, + 306.41584737598896, + 321.87709829211235, + 300.5887427199632, + 305.31303253024817, + 301.7131329551339, + 305.7511709537357, + 304.1652670316398, + 308.23845655471087, + 315.4550927877426, + 305.7273925766349, + 302.9175050109625, + 310.4542678594589, + 303.7436899803579, + 310.1834310926497, + 308.45150508359075, + 306.7327788230032, + 303.3443568497896, + 306.3548944592476, + 308.5988522525877, + 307.65838196128607, + 309.1782162040472, + 306.9325448721647, + 312.48649321496487, + 303.2926546931267, + 332.0198952332139, + 322.1592749506235, + 306.4947208687663, + 307.55637446045876, + 306.3170207180083, + 303.3546756505966, + 367.93103075027466, + 303.13710648566484, + 316.47817124426365, + 335.60799382440746, + 311.6860771328211, + 308.61841171234846, + 300.3456696718931, + 307.0661213696003, + 310.930451516062, + 301.54968727752566, + 309.0024662017822, + 302.4202868565917, + 303.3590146228671, + 308.10787411779165, + 303.439955919981, + 310.06230679154396, + 316.7943961918354, + 300.959772657603, + 302.7136592194438, + 303.668026201427, + 301.64237523823977, + 304.2352792471647, + 301.0551715269685, + 310.79739924147725, + 306.5440179556608, + 315.08809687942266, + 310.0647002607584, + 303.5105185378343, + 308.58275674283504, + 304.2175093367696, + 314.66983027383685, + 303.55144879221916, + 399.4579226374626, + 311.6224920451641, + 307.6227342709899, + 303.0319874584675, + 303.40354999899864, + 308.83148214221, + 316.05691453814507, + 302.1669016890228, + 303.8284029699862, + 355.7931281030178, + 302.16956415586174, + 313.4295183867216, + 315.0145988613367, + 305.9281915053725, + 313.79158218950033, + 302.90764693170786, + 314.14039915800095, + 317.00655806064606, + 310.72756760567427, + 308.2847945988178, + 301.5775331221521, + 307.6268916390836, + 303.9481726512313, + 319.7326930165291, + 304.30284240841866, + 304.52117566764355, + 306.88499335572124, + 310.24946815520525, + 329.2968925014138, + 315.4333475083113, + 302.2385151833296, + 304.0402657352388, + 330.64544090628624, + 302.658523414284, + 310.26695477962494, + 318.529646769166, + 301.7228495515883, + 313.4823678508401, + 303.86924044787884, + 311.6707894317806, + 304.4567382186651, + 300.88400607183576, + 307.6292063444853, + 303.1597723662853, + 301.52418445050716, + 305.3710070475936, + 315.2097835242748, + 309.65636210888624, + 313.31703604757786, + 306.30991733819246, + 320.2311890721321, + 304.01540346443653, + 305.0545330680907, + 307.1137736495584, + 395.3211914524436, + 314.6703867353499, + 301.70110377669334, + 319.2415189370513, + 303.8534288406372, + 303.92264061421156, + 321.5929098278284, + 305.98167299479246, + 310.6541989669204, + 306.7168850302696, + 303.3649907335639, + 304.13745111227036, + 323.40118588507175, + 300.5182897299528, + 303.0697602778673, + 309.2241516634822, + 304.0053559318185, + 300.94461864233017, + 308.79559959471226, + 304.15431283414364, + 307.004829749465, + 310.1420737244189, + 303.7176459506154, + 310.7476985901594, + 343.8860621601343, + 302.4985236749053, + 305.003504473716, + 304.13223231583834, + 305.5436536446214, + 300.5909035168588, + 303.05559904128313, + 306.6380413621664, + 310.255565315485, + 310.5348589159548, + 300.8216338008642, + 303.87786211818457, + 306.5753938257694, + 308.73555383086205, + 303.58505533635616, + 303.0651247650385, + 301.9923425465822, + 303.2536040209234, + 307.99435042589903, + 301.4253768287599, + 304.97345662117004, + 312.2998630069196, + 300.39801063388586, + 307.8698311187327, + 306.51887691766024, + 303.59526646882296, + 303.0467093884945, + 302.7585905492306, + 300.9845659583807, + 305.5503516755998, + 305.20626682043076, + 302.78563606739044, + 376.7346553951502, + 302.2926977649331, + 326.47912207245827, + 306.38414881005883, + 310.67380817234516, + 302.40635278075933, + 316.99041946977377, + 308.1647428572178, + 302.3320001512766, + 319.91758993268013, + 312.73799577355385, + 309.22835905849934, + 306.00085255503654, + 300.3356461748481, + 312.17326056957245, + 326.2825090661645, + 300.78065820783377, + 300.2963879778981, + 316.9373020455241, + 304.2916994057596, + 300.59651781618595, + 304.2348938956857, + 305.0064167380333, + 311.83438216149807, + 302.5825424268842, + 309.2835951335728, + 304.8437476605177, + 349.2171830162406, + 309.2551583200693, + 310.2688575554639, + 307.39415687322617, + 313.543385386467, + 327.29151912778616, + 301.93948221951723, + 307.50280844792724, + 303.7180578261614, + 308.3463310841471, + 303.7881338689476, + 310.47090319544077, + 309.3996502235532, + 306.0465895012021, + 310.46796933561563, + 319.1519105732441, + 308.0241387411952, + 309.1374143473804, + 303.77713438123465, + 311.22317691892385, + 301.3994680196047, + 305.4784608632326, + 305.67226973176, + 306.103464409709, + 317.38553878478706, + 305.4966553673148, + 304.6161012351513, + 304.24632278084755, + 323.7789228968322, + 301.9509630911052, + 311.7324143387377, + 304.2820866778493, + 300.56606724113226, + 300.97979997098446, + 310.01350251585245, + 304.25495737046003, + 302.2086296286434, + 306.7856211066246, + 307.86978751420975, + 306.75784535706043, + 312.646711923182, + 300.73208376020193, + 307.9627994596958, + 333.88007571548223, + 312.85197008401155, + 378.0619837269187, + 315.34077821299434, + 305.7352943792939, + 309.61407316476107, + 303.7329331673682, + 386.37285351008177, + 301.39230327121913, + 301.8309765830636, + 312.941692173481, + 304.2411061450839, + 327.34909755550325, + 312.16976859793067, + 302.3882667645812, + 306.77433081157506, + 341.42430003732443, + 301.09369875490665, + 301.76899264752865, + 325.9489027298987, + 303.00098659284413, + 307.55569164454937, + 307.7065726965666, + 301.43845246732235, + 304.25512028858066, + 305.24416609853506, + 305.30680099129677, + 306.25237245857716, + 301.4827401712537, + 302.7669405788183, + 303.08196802809834, + 303.9369617290795, + 301.9830661043525, + 301.746634632349, + 307.91603077948093, + 302.43126490712166, + 307.75929356366396, + 307.0497248619795, + 330.0628276076168, + 306.5131752155721, + 301.311010081321, + 308.5202541537583, + 302.61796271800995, + 319.4751095175743, + 302.2562645971775, + 307.3518746942282, + 317.09066511690617, + 307.4856946617365, + 365.65165987610817, + 302.9166493564844, + 301.82894691079855, + 307.2666062861681, + 304.62152975052595, + 302.39644312113523, + 303.00495433062315, + 340.3367389217019, + 319.3033963665366, + 302.0310657210648, + 312.2120970338583, + 305.88152101635933, + 317.57720898091793, + 302.6354679837823, + 303.7582477480173, + 307.6256429105997, + 303.38007067888975, + 301.76726876944304, + 302.524381775409, + 319.82653972506523, + 350.24694557487965, + 311.4808273091912, + 302.5532476529479, + 305.0216153115034, + 307.1480409130454, + 308.34213177859783, + 304.20534352585673, + 303.0358456224203, + 315.684188708663, + 345.20830518193543, + 310.21835684776306, + 306.8424470424652, + 307.4392704218626, + 307.22500444948673, + 315.54388186335564, + 310.01511892676353, + 312.49984880536795, + 311.38562689349055, + 316.5261323787272, + 302.0857106298208, + 342.11483922600746, + 308.6545449439436, + 320.810591340065, + 306.57110273838043, + 301.3465375043452, + 306.3758201599121, + 302.54384859651327, + 304.3074850216508, + 304.471977122128, + 303.40869407355785, + 380.2180563118309, + 303.1555345579982, + 310.91944871097803, + 319.7524440065026, + 318.2037727832794, + 305.4040424153209, + 304.10886712372303, + 309.664521291852, + 301.87392216175795, + 338.3995760679245, + 300.7961592376232, + 318.5655442830175, + 304.16267489641905, + 307.0703662112355, + 312.45957747101784, + 307.72524724528193, + 305.88985064066947, + 317.2904211804271, + 314.3781725242734, + 306.0840499550104, + 304.18717203475535, + 300.6116738393903, + 379.9813602603972, + 311.6361245661974, + 315.41395538300276, + 302.3186864554882, + 301.64878034591675, + 309.6594426892698, + 305.97290176153183, + 301.8353341035545, + 306.723392624408, + 309.9512020498514, + 303.0786857455969, + 314.0717552304268, + 306.6992979645729, + 318.67450596392155, + 309.1275431960821, + 302.2097802609205, + 321.59404833614826, + 305.86140403337777, + 302.0193884894252, + 315.508419200778, + 305.96656635403633, + 340.4029039181769, + 301.96962421387434, + 303.81527983397245, + 301.0648333542049, + 300.55451625585556, + 314.6922609154135, + 309.1730336137116, + 326.9225962422788, + 308.44335229322314, + 305.0466589182615, + 314.6456539481878, + 322.54439701139927, + 302.4855172857642, + 303.11453679203987, + 307.81943978369236, + 304.961193818599, + 319.89167384058237, + 307.89317028597, + 314.2161708548665, + 302.87863958999515, + 301.66661085933447, + 307.34651274234056, + 311.9949834048748, + 316.49513341486454, + 346.46002262085676, + 315.5100534632802, + 304.52639743871987, + 336.4220956489444, + 305.0136582329869, + 307.3377013653517, + 310.21872371435165, + 301.3476750254631, + 303.5672729462385, + 316.0607912838459, + 304.0019204095006, + 307.5840624421835, + 302.18867602571845, + 301.5352426916361, + 308.59497871622443, + 309.54025289416313, + 383.4141858369112, + 313.6161131989211, + 303.3323939796537, + 304.140910461545, + 303.20343083143234, + 305.6057410463691, + 320.2711511347443, + 313.18107791244984, + 301.4606238864362, + 301.4564084932208, + 304.83769878558815, + 313.9832816403359, + 353.2365904562175, + 313.7692151516676, + 309.8289328068495, + 305.862393707037, + 305.1804407425225, + 317.72849291935563, + 306.72550489008427, + 302.8092676177621, + 306.4110401645303, + 312.1188718751073, + 362.7273985147476, + 317.9168858230114, + 301.77394001558423, + 305.03996632248163, + 328.3006071001291, + 302.96481505967677, + 358.9187282770872, + 340.48634894937277, + 312.8884740807116, + 320.8161339983344, + 307.4104171618819, + 307.0365815460682, + 311.5006188713014, + 308.9893600344658, + 308.20471503958106, + 308.04335648193955, + 305.6012024730444, + 307.3787270784378, + 311.57647612690926, + 308.9312228783965, + 301.2076271921396, + 322.9530526548624, + 309.24546724930406, + 301.5614732503891, + 312.76797065883875, + 309.2778063863516, + 302.5637070611119, + 308.29945109412074, + 315.2914752960205, + 305.09974686801434, + 317.6121992394328, + 308.98901703208685, + 338.33057140931487, + 302.0522666051984, + 303.68452225625515, + 310.97885339707136, + 318.26357846707106, + 300.9114904142916, + 329.7943529188633, + 312.03377056121826, + 306.2725482098758, + 305.3492953553796, + 317.32079035043716, + 303.20747247338295, + 308.29731092229486, + 307.9181041829288, + 304.54835257679224, + 324.4079425036907, + 306.24200108088553, + 300.65853126347065, + 304.2509483192116, + 302.8772924914956, + 300.89625557139516, + 302.6689771860838, + 391.9473808258772, + 334.9496844485402, + 302.75849348306656, + 306.028928168118, + 304.2924796678126, + 307.98969984054565, + 309.1131554841995, + 308.1403100043535, + 313.1822231952101, + 306.46754467487335, + 301.89772509783506, + 308.1035316064954, + 306.7843502499163, + 302.2081850320101, + 332.9841753542423, + 314.8231116272509, + 303.0586135927588, + 336.252635974437, + 305.1808427795768, + 321.3540218472481, + 305.43340353854, + 300.6233523860574, + 308.2786120772362, + 309.03126241639256, + 312.4426132440567, + 308.1761762946844, + 308.24175544828176, + 304.8906434997916, + 306.60156823694706, + 306.9404873549938, + 304.51684875041246, + 357.69929099082947, + 358.9486414641142, + 304.8242894336581, + 302.8356246985495, + 317.6860573217273, + 399.82464607059956, + 316.0868339277804, + 307.53598020784557, + 308.22646176069975, + 323.4186094030738, + 301.42822763323784, + 303.02495528012514, + 313.42270952649415, + 311.54310511797667, + 390.9345150757581, + 302.54985205829144, + 309.52428824827075, + 301.95824552327394, + 300.9731022492051, + 304.56906984746456, + 322.8679246008396, + 326.2078197821975, + 321.2846377044916, + 333.11418214440346, + 305.20225162804127, + 309.0887602865696, + 319.0709435865283, + 310.838869381696, + 301.23190255463123, + 306.2919792868197, + 302.739996522665, + 348.3676441386342, + 303.47383108735085, + 326.02600886300206, + 348.10810193791986, + 312.6929789800197, + 303.7830352932215, + 302.28184547275305, + 310.599996317178, + 315.5636248886585, + 321.30469534546137, + 308.902185767889, + 303.45940586179495, + 309.6694117411971, + 300.75393068417907, + 304.6446271389723, + 304.7449014186859, + 301.9761216789484, + 302.6829492300749, + 300.4357543513179, + 381.60877077281475, + 301.07548336684704, + 311.2776542454958, + 331.0760400444269, + 302.6143119111657, + 301.06872196495533, + 306.0887282192707, + 306.36824740469456, + 338.53837563842535, + 312.8054626137018, + 318.61705269291997, + 310.13486017659307, + 304.28922582790256, + 305.2307872772217, + 312.89065919816494, + 306.41037832573056, + 308.77710288763046, + 302.69357120990753, + 302.24736822396517, + 316.1984846815467, + 307.0725309252739, + 301.9051226824522, + 334.166741296649, + 311.39826571941376, + 307.0690799802542, + 301.50193649716675, + 353.74076600559056, + 301.6986852735281, + 307.5404232367873, + 317.01313573122025, + 336.6142027974129, + 305.5760070383549, + 373.3376475870609 + ] + }, + { + "histnorm": "probability", + "hovertemplate": "Scenario: timebin_15
Dist since last refuel: %{x:,.1f}
Bin share: %{y:.3f}", + "name": "timebin_15", + "nbinsx": 40, + "opacity": 0.5, + "type": "histogram", + "x": [ + 307.8761378079653, + 310.2477586567402, + 301.6352349743247, + 304.35729967057705, + 300.7325431033969, + 320.85970444977283, + 312.8358040340245, + 326.2026565670967, + 308.12572054564953, + 333.53297314047813, + 305.8357461541891, + 302.46885880827904, + 300.83202120661736, + 305.5972102470696, + 303.0892198458314, + 312.5222806110978, + 304.0579238720238, + 305.3317773286253, + 315.28393918275833, + 304.4220207929611, + 305.7127846777439, + 308.94129935465753, + 309.0655120834708, + 311.0246589034796, + 311.0830531604588, + 303.57526481337845, + 316.3642346560955, + 304.55109921842813, + 303.9577593654394, + 307.78884817287326, + 302.2270769029856, + 301.26999431848526, + 301.31782702356577, + 302.14467050135136, + 306.15606050752103, + 302.58216051384807, + 302.0888505503535, + 301.7784555926919, + 301.2498452011496, + 310.30756399966776, + 305.5428588800132, + 309.16978477686644, + 304.20641740970314, + 307.53816121816635, + 329.2600883692503, + 303.6693227291107, + 314.6877956688404, + 317.29953561350703, + 303.60346484184265, + 300.26153072714806, + 323.1748514175415, + 301.949778676033, + 307.723758649081, + 311.3637005612254, + 303.68251380324364, + 300.9458533003926, + 310.71784553676844, + 301.95059219002724, + 305.8638828303665, + 310.31335366517305, + 330.69046675413847, + 302.29727071523666, + 302.7665432244539, + 320.15591794252396, + 315.96621322631836, + 311.4279606640339, + 312.82877510786057, + 313.79500018805265, + 310.7359293550253, + 302.8730273768306, + 303.7381737232208, + 306.08611746132374, + 330.0959519967437, + 300.66269978135824, + 308.76627742499113, + 302.7348014190793, + 310.07943576574326, + 310.4163189008832, + 304.2265581563115, + 305.08363719284534, + 305.38169245421886, + 304.5111999101937, + 308.88262690231204, + 305.154124468565, + 301.7156582977623, + 301.6454584226012, + 308.2252107709646, + 301.5620728880167, + 313.8374079987407, + 313.8517865091562, + 300.8380654454231, + 304.15358279645443, + 306.16303953528404, + 308.2695724051446, + 307.3583146184683, + 311.12982730567455, + 319.86277851462364, + 303.03687361627817, + 303.70700162649155, + 314.0297953337431, + 303.0524753332138, + 306.0661939904094, + 302.5680607035756, + 334.2086484655738, + 308.2932429462671, + 320.51934421248734, + 303.98571292310953, + 304.76880994439125, + 301.1302709132433, + 302.1964023709297, + 353.1772450506687, + 308.19082537665963, + 300.9305206909776, + 312.4628439024091, + 344.1380221322179, + 302.6371979750693, + 301.49864415079355, + 302.6722133755684, + 304.2602080106735, + 307.95988661050797, + 306.3589321896434, + 316.38895827531815, + 306.44780188798904, + 302.2011732161045, + 300.7123897317797, + 306.84597995877266, + 310.22054021060467, + 302.542510420084, + 334.00973987951875, + 309.9792381618172, + 360.528023019433, + 349.4648427069187, + 303.37440736591816, + 307.57462070323527, + 305.17609680071473, + 338.30616203695536, + 301.97917795181274, + 305.4228833913803, + 306.5590275041759, + 301.99405190721154, + 303.2499331533909, + 301.2668143361807, + 313.9508454799652, + 304.9210609383881, + 314.37217105925083, + 311.46467996016145, + 305.89308427274227, + 319.78159776329994, + 300.9976390004158, + 308.5614129602909, + 302.11568274721503, + 314.496099665761, + 301.9767045006156, + 309.40542915835977, + 322.94249130412936, + 302.9450396820903, + 303.82351492345333, + 304.3677242323756, + 310.43108812347054, + 306.0075718089938, + 327.2568456828594, + 304.08162431418896, + 310.49259592592716, + 321.6494189426303, + 303.34743770956993, + 304.7097475603223, + 301.714543633163, + 310.99913711100817, + 304.0629154480994, + 303.81847434304655, + 315.6718600615859, + 310.2236638367176, + 302.07490062713623, + 302.2322255447507, + 309.9071555137634, + 317.5803330913186, + 308.96879332885146, + 314.02409265190363, + 303.74733098596334, + 323.69624153897166, + 301.4382171817124, + 317.0277197510004, + 311.6580896228552, + 308.3883059769869, + 304.60642586275935, + 305.53685496002436, + 303.5539646074176, + 307.1312373280525, + 316.39284425228834, + 342.2958284486085, + 313.8978901654482, + 308.49516846984625, + 311.0583050698042, + 309.89766638725996, + 303.032968737185, + 304.19790552556515, + 345.09511582553387, + 308.6141706481576, + 301.30961202830076, + 318.9507184699178, + 302.5885816514492, + 342.6158357858658, + 304.47140995040536, + 304.0197333097458, + 301.748586140573, + 313.56303960829973, + 302.5065469760448, + 304.37398170121014, + 309.39740443229675, + 309.5849400162697, + 306.2726090103388, + 303.5444388091564, + 301.283720003441, + 392.26814210414886, + 303.77182491868734, + 301.0855088233948, + 305.1640085875988, + 302.0232205018401, + 304.2186733186245, + 314.4319935962558, + 304.0384346097708, + 302.9792960733175, + 306.73769764229655, + 304.3365440145135, + 307.54232962429523, + 302.42474545538425, + 313.4010748360306, + 302.65033334493637, + 304.9652671441436, + 303.5318804681301, + 302.13246708363295, + 302.2058440744877, + 302.7818466871977, + 304.3687411621213, + 308.13929042220116, + 303.65403120964766, + 306.0965400338173, + 309.2858737334609, + 307.50502117164433, + 307.2714634370059, + 302.96870348602533, + 305.84969579055905, + 304.2371565550566, + 312.70683779008687, + 314.478182464838, + 319.6968232318759, + 319.66133480519056, + 302.98547668755054, + 372.6696136891842, + 315.8217728510499, + 317.795770868659, + 308.643696680665, + 316.93313717097044, + 301.7324685752392, + 316.07361997663975, + 301.7105042077601, + 303.99775622598827, + 317.5465478077531, + 305.23170405998826, + 300.496920786798, + 316.5741482079029, + 313.4369900971651, + 302.7007577419281, + 314.9920911639929, + 312.1413935869932, + 321.2927353978157, + 327.5959524475038, + 302.64677452109754, + 310.79543409496546, + 306.31505350768566, + 304.33523527160287, + 320.0945075005293, + 309.3224299978465, + 309.6464683674276, + 304.820232687518, + 308.45136596262455, + 307.43028268404305, + 305.67007971927524, + 302.1888468004763, + 302.86413887888193, + 323.3078965693712, + 301.58590933680534, + 304.26549953594804, + 306.4183366149664, + 306.44123559072614, + 312.8531384989619, + 309.44384226575494, + 304.5725321993232, + 313.9617192745209, + 325.55200654268265, + 346.42168771103024, + 312.31554068252444, + 306.9744808524847, + 312.9341164082289, + 302.7057870142162, + 366.09472277760506, + 308.26586370915174, + 311.16121508181095, + 304.44531086087227, + 309.8671550154686, + 307.6104479059577, + 303.49475555866957, + 306.2569966837764, + 301.30691500380635, + 321.6745239738375, + 303.8369566053152, + 316.54379523545504, + 306.48316699266434, + 306.7924055121839, + 303.50239977799356, + 312.58418161422014, + 306.1625695377588, + 317.5553707703948, + 318.78430753946304, + 310.0238239169121, + 353.5675001218915, + 316.26482245884836, + 310.79244969785213, + 312.91047678887844, + 309.4244338348508, + 304.0516610443592, + 315.64851132780313, + 304.66048780456185, + 309.83206360042095, + 305.31838022731245, + 308.16216945648193, + 308.77025601267815, + 313.2427648473531, + 302.0213454719633, + 304.3050060272217, + 304.2055037692189, + 301.68298900686204, + 386.01004415005445, + 305.1753391623497, + 306.66908929497004, + 303.47062123566866, + 313.2561429142952, + 346.5650221519172, + 314.91566540300846, + 301.36022153124213, + 305.5992409400642, + 305.1740468852222, + 346.47981921955943, + 305.8174353837967, + 302.94268867373466, + 304.8135145679116, + 307.17546527832747, + 302.87891951948404, + 300.4353869855404, + 335.4908299446106, + 312.0076115485281, + 314.8974186144769, + 341.7889069020748, + 325.53437396883965, + 306.20877519994974, + 300.6338535696268, + 303.27444346249104, + 319.28693406283855, + 303.27317044883966, + 307.3051431328058, + 305.5005130134523, + 309.85551276244223, + 315.00756649672985, + 302.05120231956244, + 338.2715542986989, + 310.0456312894821, + 303.4089444670826, + 303.7037855964154, + 303.3190984688699, + 301.5623353347182, + 300.8607793711126, + 318.5458204820752, + 301.6964098792523, + 323.4144708365202, + 304.41793118044734, + 301.0003523863852, + 303.00242110714316, + 302.51220037043095, + 312.4084329083562, + 305.971623968333, + 314.7154969088733, + 301.10126470029354, + 341.9771654345095, + 307.8679590784013, + 324.757729254663, + 319.10677453130484, + 303.77906746044755, + 317.51566424034536, + 316.1050415802747, + 304.6794582605362, + 307.33510218933225, + 308.5179113894701, + 313.77375442534685, + 311.7341443542391, + 314.1341075450182, + 303.0614980906248, + 306.35703133791685, + 309.7463245764375, + 319.90972204878926, + 312.5847415328026, + 303.1041152700782, + 303.84650733321905, + 302.752324745059, + 308.41457986831665, + 331.4878174215555, + 311.1914609670639, + 300.97010923177004, + 302.8562926054001, + 307.0298613458872, + 307.2136914655566, + 303.3937513977289, + 302.3393646925688, + 320.3017371185124, + 302.6174088716507, + 350.2908341214061, + 302.44967452436686, + 303.6453228145838, + 306.4080241173506, + 300.33773571252823, + 304.99352523870766, + 301.75292325764894, + 306.24567292258143, + 302.52315954864025, + 308.96465663053095, + 302.30472172796726, + 314.845694322139, + 316.7541425675154, + 302.0953874140978, + 351.18464728817344, + 308.37741804495454, + 311.46303164586425, + 306.72163724526763, + 300.7065165415406, + 312.0550758894533, + 312.4572551473975, + 310.24863977730274, + 311.70805311203003, + 305.83924582600594, + 306.22125351428986, + 304.6039231531322, + 308.6439824551344, + 328.6985560134053, + 304.7823572680354, + 304.38492564857006, + 311.4163054060191, + 301.3085383027792, + 301.8486842364073, + 303.57446402311325, + 303.19170420616865, + 304.36809719353914, + 321.2331624738872, + 335.06254711560905, + 302.0451090633869, + 303.40331976115704, + 302.199256837368, + 304.17278802394867, + 306.46074505895376, + 306.8632494267076, + 308.4516568016261, + 312.48565276525915, + 304.20791597664356, + 300.59900468587875, + 303.4375818260014, + 309.6957476846874, + 317.5506781190634, + 309.0128778666258, + 314.88419929146767, + 305.2579119168222, + 302.3821116015315, + 303.74236950464547, + 301.9916785880923, + 305.2597420103848, + 302.5515488833189, + 313.1160566210747, + 312.2207099124789, + 302.8742495775223, + 315.120795622468, + 320.319359369576, + 315.7898935228586, + 302.66780825704336, + 341.60408040881157, + 300.92555375397205, + 309.7002172842622, + 303.2394561767578, + 301.84358874708414, + 305.6694395914674, + 302.8090774193406, + 308.1313747242093, + 306.63886891305447, + 300.47720500826836, + 305.635382629931, + 304.3639894463122, + 303.7249220237136, + 310.3141170218587, + 305.40767443180084, + 313.99940557032824, + 321.4739056825638, + 321.07495137676597, + 308.8374251127243, + 306.81106466054916, + 302.3512480389327, + 320.628115452826, + 303.8762809149921, + 308.5235850661993, + 302.85509707033634, + 324.7236333563924, + 320.44831824302673, + 301.1630218103528, + 309.2868019193411, + 318.2906500734389, + 306.1237455457449, + 304.01696848869324, + 303.71911389939487, + 304.5739280208945, + 303.73203825205564, + 301.51145815849304, + 301.38592263683677, + 301.9057780839503, + 306.6864172555506, + 320.0946565717459, + 308.954696431756, + 310.8658599704504, + 310.8287105560303, + 312.60917726531625, + 349.15345829725266, + 304.0652962476015, + 313.19428330659866, + 305.05303765274584, + 308.65617449581623, + 316.88005885481834, + 303.47737757861614, + 306.59330727159977, + 304.3435466811061, + 305.3277895245701, + 315.92016541957855, + 307.41834608465433, + 300.75091085396707, + 308.24580548889935, + 318.45564375817776, + 305.3548939526081, + 302.9116650223732, + 305.747339066118, + 309.3362205848098, + 312.2624186426401, + 304.9644323438406, + 315.57921558618546, + 301.9520725160837, + 305.1548116058111, + 338.66034343093634, + 301.44356897845864, + 300.9720627646893, + 303.73089637607336, + 300.74325090646744, + 302.26158282347023, + 311.2230252008885, + 305.1590003594756, + 303.20817825198174, + 311.74930169433355, + 304.0756441950798, + 304.83058918453753, + 305.2412375956774, + 313.87916761636734, + 303.40669021755457, + 310.0192205533385, + 305.2878862544894, + 305.3992144316435, + 307.52328411489725, + 325.4410544037819, + 302.7110299691558, + 301.93515843153, + 313.0802146345377, + 315.3211818560958, + 303.2231033593416, + 310.3917005583644, + 320.54739601910114, + 307.0774539113045, + 305.88476240076125, + 310.7892704233527, + 307.2898511812091, + 304.9024174809456, + 301.37627494707704, + 305.6798579841852, + 300.70541613176465, + 305.01818899810314, + 314.02465964108706, + 314.9137079194188, + 300.67962439358234, + 302.2925269976258, + 330.9521838128567, + 310.05642784386873, + 319.5268399119377, + 318.0625415816903, + 301.5166492201388, + 360.07097060233355, + 306.93979059159756, + 300.391717068851, + 306.0187198370695, + 307.2152593806386, + 303.1338608339429, + 311.6084164530039, + 308.43882474303246, + 309.10189775004983, + 312.58300026878715, + 304.61643566191196, + 344.9140557795763, + 301.60247221402824, + 318.46054320037365, + 304.6766204163432, + 321.11199224740267, + 337.83982026576996, + 301.6642259582877, + 303.10879031196237, + 308.7272081747651, + 304.37439021095634, + 324.1367995515466, + 311.80639296770096, + 302.44541200995445, + 316.55901278182864, + 318.58116192370653, + 305.3416355252266, + 302.97883026860654, + 313.2960813641548, + 311.3981901705265, + 377.49790723621845, + 308.236501082778, + 303.1732248067856, + 304.84769758582115, + 302.78127464838326, + 310.39037143066525, + 302.9280931428075, + 315.1327092051506, + 308.0931175034493, + 300.5581758376211, + 304.3035777043551, + 304.2716048769653, + 302.1690724864602, + 323.56338015943766, + 309.59932450577617, + 301.61187420785427, + 305.58610256016254, + 310.58805245533586, + 316.8338122628629, + 301.60672574676573, + 302.3709067441523, + 312.62735341489315, + 302.6710833758116, + 303.1757187694311, + 302.256842777133, + 331.0395535826683, + 302.5183940306306, + 303.3611548766494, + 307.5833691563457, + 301.0819875448942, + 305.8949688374996, + 311.81873673945665, + 311.18805411458015, + 301.9799827411771, + 359.1830040961504, + 301.29311816580594, + 302.566394995898, + 312.42166796699166, + 304.4839750509709, + 302.42047365009785, + 310.57408402115107, + 303.02839900553226, + 303.0088186338544, + 332.66932862997055, + 305.64890825748444, + 308.00557094067335, + 310.0403492450714, + 311.0918382704258, + 311.94165927171707, + 302.47593177482486, + 306.2975734323263, + 323.32806520164013, + 305.05775344371796, + 316.6101239696145, + 314.67180229723454, + 302.31731957755983, + 306.86199390515685, + 322.58378428965807, + 311.22859900444746, + 319.06390968710184, + 301.54301961138844, + 302.61848545074463, + 310.7947777528316, + 315.03962880373, + 306.47790126502514, + 301.03737177699804, + 303.7551994174719, + 305.1838475726545, + 305.78224002197385, + 307.4530448541045, + 319.30036598443985, + 307.21173273026943, + 310.1218813061714, + 307.5015318840742, + 305.7930860631168, + 305.02137352898717, + 310.25031780824065, + 305.24770821630955, + 308.56484881043434, + 307.56573463231325, + 300.5367976799607, + 303.1179630625993, + 303.14504147693515, + 302.3518637344241, + 306.29337920993567, + 300.83573203906417, + 307.95787131786346, + 307.5540041849017, + 304.7540012001991, + 334.8554466813803, + 317.8194156438112, + 311.3079342301935, + 311.3736774660647, + 302.8421665392816, + 305.1415925100446, + 301.31525657325983, + 310.34254267811775, + 307.6243946328759, + 304.90975016728044, + 303.98444744199514, + 304.2205852419138, + 305.22908256947994, + 309.70762449502945, + 319.0601255055517, + 304.06237134337425, + 302.78328765928745, + 305.89450373128057, + 301.34630233608186, + 318.5041153728962, + 307.5554081313312, + 302.55621349439025, + 305.53126142919064, + 302.21050929278135, + 315.9633264988661, + 303.7638662457466, + 340.925498470664, + 343.79489321261644, + 302.8659290857613, + 300.5627119317651, + 311.0727250855416, + 318.273558922112, + 300.9839893989265, + 304.4528138227761, + 340.59062288701534, + 304.69333702884614, + 302.95635832473636, + 303.58994498848915, + 303.1801648661494, + 303.7129035964608, + 306.5142780095339, + 322.46182349696755, + 317.5630297046155, + 311.9622724428773, + 316.25440396368504, + 313.8460535928607, + 315.14681893214583, + 307.22616055235267, + 302.4300256446004, + 305.2536136060953, + 304.2258507460356, + 314.13263860344887, + 312.65693145245314, + 334.1902274861932, + 313.5996577963233, + 303.28185160830617, + 301.4290804825723, + 306.0942632108927, + 324.5589841604233, + 313.01219906657934, + 308.09615290537477, + 312.55376175045967, + 306.1435359045863, + 302.39246928691864, + 303.6005875915289, + 302.039315328002, + 301.89458644390106, + 304.12555015832186, + 305.9490951411426, + 301.78168372809887, + 366.67432206869125, + 303.3849490582943, + 301.8153453618288, + 304.8087099045515, + 307.0856832116842, + 311.38566701859236, + 310.47956631332636, + 307.0521674901247, + 307.2684844210744, + 309.194332357496, + 300.9250905402005, + 317.4105105474591, + 305.6688562184572, + 304.34394297003746, + 301.6927847787738, + 325.6828994099051, + 306.58394803106785, + 307.2101179212332, + 302.9091525785625, + 309.9720004275441, + 333.489806458354, + 309.8078556843102, + 304.1009860150516, + 304.8098240867257, + 311.727559549734, + 310.1562914401293, + 304.7818565219641, + 306.1552200950682, + 315.5387301892042, + 306.22168101370335, + 302.54674630984664, + 302.1120357401669, + 336.7098540440202, + 301.6453301757574, + 302.05827473104, + 326.43350986391306, + 310.8758923448622, + 301.3692698478699, + 305.8422114737332, + 324.72186344116926, + 300.6223867684603, + 316.7726469784975, + 303.7473079636693, + 301.0824889317155, + 301.9634449481964, + 303.8904573991895, + 306.51544223725796, + 302.70005835592747, + 328.49917585402727, + 306.70056419074535, + 305.3059768266976, + 320.76791670918465, + 310.6024186424911, + 303.7255325913429, + 317.77652479708195, + 311.27202867902815, + 302.95859111845493, + 301.85737554728985, + 311.3338368907571, + 302.6088318526745, + 304.9039859510958, + 303.89674716442823, + 305.6864486336708, + 303.53043734654784, + 307.90905187278986, + 314.19452369213104, + 304.071097670123, + 312.6093066968024, + 309.39463118463755, + 347.0147044658661, + 304.34300642088056, + 303.48946513980627, + 307.1844686418772, + 326.43278190493584, + 305.2153944782913, + 323.86478897184134, + 314.35213106684387, + 304.7675721794367, + 312.0603165999055, + 302.27001292444766, + 300.5234962403774, + 304.32395704463124, + 311.2828474342823, + 324.68282186985016, + 306.32522766292095, + 304.36317430250347, + 303.3958900216967, + 317.65630829147995, + 306.8409450389445, + 324.5650869682431, + 309.6620352566242, + 304.5215054154396, + 312.0059276111424, + 310.0395795889199, + 301.53594774752855, + 320.0336879193783, + 302.2719704695046, + 305.6885840110481, + 304.18818958848715, + 302.5863753147423, + 313.3513630926609, + 306.7247673198581, + 303.6721437573433, + 306.2193002253771, + 300.7574706673622, + 306.412752777338, + 307.8787133060396, + 302.5957855284214, + 306.2483223862946, + 304.98428260535, + 315.03293542563915, + 319.16884195804596, + 324.3499074354768, + 304.5769556313753, + 303.333688467741, + 330.07860244065523, + 305.5630673468113, + 307.739051528275, + 308.41663098335266, + 302.68500528112054, + 311.7156969681382, + 301.8629413768649, + 300.5253996439278, + 302.1389402747154, + 304.8314268514514, + 319.5655890200287, + 301.297359585762, + 304.92840237915516, + 305.7231123447418, + 312.46493224427104, + 312.2173593379557, + 300.7697477787733, + 301.10112156160176, + 304.79108737409115, + 302.61148708313704, + 307.3847776502371, + 308.3846056982875, + 305.4801899846643, + 300.73498694226146, + 311.3494598045945, + 320.94667924940586, + 302.9320681542158, + 300.4856059551239, + 309.6934868693352, + 329.4870241135359, + 304.93013755977154, + 303.8003653883934, + 305.06832199543715, + 303.4164666570723, + 301.62716563791037, + 330.07794434577227, + 304.0054351016879, + 320.2763819023967, + 304.551359154284, + 305.23579037189484, + 312.8562037348747, + 316.07785473018885, + 301.1107275951654, + 304.1533147841692, + 301.8477858118713, + 305.6826579272747, + 303.47539127618074, + 307.29184606671333, + 312.9998562708497, + 314.09104221872985, + 317.6580601371825, + 317.9527306109667, + 306.14106686785817, + 303.7343417610973, + 303.78280015289783, + 309.16771826148033, + 324.66895070672035, + 322.5999365672469, + 315.35908878967166, + 318.2861232832074, + 314.6972575187683, + 303.79598017781973, + 311.98156302794814, + 308.79300759732723, + 324.8313086554408, + 303.6212759241462, + 310.10668321698904, + 390.4471935201436, + 301.40394181758165, + 302.32717974856496, + 316.5503579750657, + 316.9086611121893, + 338.6247718669474, + 307.4430177155882, + 310.103533744812, + 301.033785905689, + 307.00027161836624, + 305.4557391256094, + 355.7927412837744, + 304.3302711844444, + 302.64432433247566, + 303.719290189445, + 306.16899886727333, + 308.01072654128075, + 309.2272973638028, + 302.58398523926735, + 304.4053072631359, + 304.22671579010785, + 312.9278062954545, + 305.850132599473, + 301.0011961646378, + 321.735766723752, + 304.0032154247165, + 303.0930482521653, + 325.0465959236026, + 302.5329171009362, + 307.0066877603531, + 300.92788641154766, + 300.33583806455135, + 313.1748438626528, + 305.80177418887615, + 308.0861539915204, + 302.4713000059128, + 300.34476704895496, + 324.440179489553, + 355.48674846440554, + 308.8874383047223, + 304.98743609525263, + 317.54651168733835, + 301.7688944414258, + 301.8796388581395, + 305.51008577644825, + 301.0013078376651, + 300.92451380193233, + 330.0164692699909, + 324.03000289946795, + 301.92059979587793, + 307.4955022111535, + 308.60691671073437, + 309.35624971985817, + 331.1549145281315, + 305.39363906905055, + 303.88292100280523, + 304.45759831368923, + 300.94548116996884, + 302.5308596845716, + 321.07769080996513, + 312.543302686885, + 302.2087302058935, + 319.20399725437164, + 301.40727381035686, + 343.52561873197556, + 301.81311006844044, + 306.2920262347907, + 303.6272410713136, + 307.45240877754986, + 301.23457181081176, + 300.87184763513505, + 307.2865303941071, + 304.32395392656326, + 317.40111666172743, + 305.5559333488345, + 309.6027821712196, + 314.15726569108665, + 301.0531389005482, + 327.76266853511333, + 319.05699272453785, + 306.1797179952264, + 305.13800655305386, + 302.5431255698204, + 302.01897882670164, + 310.64781208336353, + 317.84409330785275, + 302.10113141685724, + 310.08145274966955, + 305.6400693692267, + 332.53660161420703, + 301.8834837973118, + 306.0205529034138, + 304.75184658169746, + 314.6145281996578, + 304.10610700026155, + 306.39644754864275, + 306.61554829776287, + 302.02296459674835, + 312.0476658307016, + 309.9997338652611, + 308.4891072958708, + 303.2959621399641, + 311.4983518384397, + 303.0792428404093, + 302.2464709803462, + 303.51958329975605, + 304.02076311782, + 309.892512595281, + 304.98033924400806, + 301.7113022916019, + 309.2686569932848, + 324.7596801072359, + 307.7220733743161, + 307.8959732372314, + 304.96316339820623, + 314.0815194621682, + 304.90459344536066, + 302.52530210092664, + 315.17060285806656, + 327.1596266105771, + 305.59307914972305, + 383.1574402526021, + 307.11239494010806, + 308.22053112089634, + 310.13135302066803, + 305.6002514678985, + 304.08982388675213, + 302.4169487655163, + 303.67479521781206, + 301.5524008870125, + 307.1019128449261, + 332.62803015112877, + 317.36856375075877, + 327.6759064309299, + 324.087380964309, + 303.2707090396434, + 302.41032239049673, + 303.8325240481645, + 383.294171737507, + 312.4441491290927, + 313.67767118662596, + 306.50492732971907, + 359.16827846318483, + 301.6389631330967, + 303.48647582903504, + 301.3918741121888, + 306.2442716732621, + 305.9613557457924, + 342.7848983332515, + 301.1187376566231, + 324.73274233937263, + 305.0351773779839, + 303.03740184754133, + 306.7474241666496, + 316.19954638555646, + 309.47579418309033, + 301.9581503123045, + 317.0308855064213, + 302.4988844320178, + 303.06296876072884, + 305.6758297756314, + 318.3446547091007, + 323.4769401624799, + 301.04441510885954, + 303.90157759189606, + 302.2645110487938, + 309.1441815327853, + 304.71314960718155, + 310.7297327928245, + 307.25678601302207, + 301.4000419136137, + 305.1277209147811, + 307.0206494182348, + 301.5892664119601, + 300.7265135589987, + 300.78658935427666, + 306.27139542996883, + 301.5818471312523, + 300.69814086705446, + 302.4556661210954, + 307.30155059695244, + 304.7523867543787, + 302.5007090345025, + 309.50221590697765, + 305.9031295403838, + 309.14967634528875, + 303.9812715649605, + 324.9239650145173, + 309.4499273709953, + 302.84742671251297, + 317.1700249016285, + 303.81750386953354, + 302.17607967182994, + 387.1223910972476, + 300.187367901206, + 305.0409484654665, + 304.0976150408387, + 301.0095955878496, + 345.4745816215873, + 320.237018302083, + 302.5601768270135, + 373.1199931167066, + 310.6114449072629, + 306.3617188334465, + 308.5561199374497, + 305.6080809570849, + 309.40314649417996, + 312.09554286301136, + 355.71907253563404, + 306.33022434450686, + 327.20484017953277, + 309.7723688483238, + 302.3453082963824, + 324.8620627336204, + 306.1858434602618, + 303.0629298314452, + 315.5216787867248, + 304.59329249337316, + 304.2117788940668, + 338.7494348064065, + 316.3869884349406, + 304.8407870605588, + 304.58208937197924, + 316.05013486370444, + 304.91380456089973, + 337.60938081145287, + 317.36523781344295, + 316.16326788812876, + 302.15658527612686, + 301.3787428662181, + 304.05880315601826, + 304.6617508083582, + 309.1352735348046, + 303.6342585273087, + 312.00438636541367, + 301.27583948895335, + 319.47812139987946, + 305.2735810279846, + 311.5482162758708, + 308.96267798542976, + 301.5280971862376, + 306.99156446382403, + 305.812621910125, + 308.149666659534, + 356.48018569499254, + 308.7820308804512, + 302.46506997197866, + 339.345133215189, + 305.3444986976683, + 307.1441413462162, + 313.44009565375745, + 313.3792100995779, + 303.07921249233186, + 313.27459522150457, + 309.36460990831256, + 306.2908189371228, + 364.1704940497875, + 306.45827417075634, + 302.65153167396784, + 302.02577409148216, + 302.4181682690978, + 308.68043649196625, + 302.8613541871309, + 303.088561039418, + 300.91218331456184, + 306.61940409243107, + 306.5809158682823, + 303.62207842990756, + 302.60430931672454, + 309.60322066396475, + 300.8484006077051, + 303.59882981330156, + 309.71548297815025, + 314.0493200644851, + 303.51928459107876, + 301.94042524695396, + 330.1469601672143, + 328.3347791954875, + 311.19217440858483, + 317.84961300343275, + 331.7785172313452, + 305.4757445976138, + 321.27897246927023, + 329.59184963814914, + 302.1961759328842, + 313.84188470989466, + 302.675790309906, + 301.21773982420564, + 312.225245134905, + 303.6410063505173, + 315.98333010450006, + 308.5635003298521, + 303.5942117869854, + 301.81707180291414, + 301.4828546792269, + 302.18523750826716, + 311.2283961214125, + 301.9808062463999, + 341.5020560771227, + 310.5673009008169, + 316.43594309687614, + 307.9770670682192, + 300.88360687345266, + 302.9906699601561, + 313.4487159177661, + 301.37568698078394, + 302.12157352268696, + 301.77747601270676, + 306.07774893939495, + 318.35676731169224, + 309.07338873296976, + 305.1936987116933, + 301.07176626473665, + 320.0796536374837, + 310.0536976531148, + 301.7717758715153, + 303.28348387777805, + 322.314516287297, + 306.21760460175574, + 303.0902447514236, + 312.29873515293, + 332.42639395594597, + 302.5675376020372, + 307.88526656478643, + 304.28387899696827, + 307.4441485106945, + 315.2391252592206, + 306.9305648058653, + 301.7034374624491, + 308.26774050295353, + 302.12949296832085, + 301.1712192259729, + 314.5057265236974, + 310.04280196130276, + 305.16358523629606, + 327.56852201372385, + 308.03336414694786, + 309.22139962390065, + 339.91499583795667, + 305.6130915209651, + 307.05216078832746, + 305.55480628460646, + 303.48074443638325, + 305.74048380739987, + 303.25200375914574, + 315.8143259882927, + 301.5919612944126, + 301.5313700735569, + 311.6865478157997, + 303.07661583274603, + 335.88165310025215, + 333.99215422198176, + 341.95818071067333, + 304.23222829401493, + 305.55435114353895, + 301.99313723295927, + 307.2762938849628, + 315.49121006578207, + 319.9850428402424, + 315.9164036847651, + 305.1414620876312, + 303.4546242468059, + 312.7429337054491, + 301.717062395066, + 303.663547385484, + 314.75329203903675, + 309.4382633715868, + 304.94292244128883, + 315.45983795821667, + 309.7841480374336, + 312.07229944318533, + 305.37080615758896, + 311.3647485971451, + 312.75023341551423, + 304.75047782994807, + 300.6951690129936, + 303.5721822977066, + 318.9675275757909, + 317.7947913110256, + 300.7537003401667, + 302.9019231237471, + 300.89437671750784, + 315.0961852669716, + 301.0121582224965, + 304.66771391779184, + 306.91689162887633, + 305.22415965236723, + 306.7640964835882, + 300.438001409173, + 301.1628896892071, + 303.50008678250015, + 301.8961895182729, + 332.79752468317747, + 314.9213749282062, + 302.85106809064746, + 312.0784900486469, + 315.3594433516264, + 301.5285062119365, + 310.5100095216185, + 301.8781613409519, + 306.5726331323385, + 332.9548411462456, + 303.6994644999504, + 308.1159942597151, + 302.5424820724875, + 305.44883278757334, + 303.8959847763181, + 304.6684123426676, + 309.87920655310154, + 321.6644621118903, + 308.7693171352148, + 304.4330673068762, + 305.43917015194893, + 321.0503023862839, + 306.3726083934307, + 337.973957747221, + 321.42243253067136, + 303.84762644581497, + 342.8620675839484, + 302.23708571493626, + 305.5549542699009, + 301.6629455536604, + 324.6782632917166, + 302.27287693321705, + 340.5786154791713, + 307.3627738058567, + 311.30922282487154, + 301.6995503678918, + 311.82569961994886, + 314.5465037599206, + 303.05201084911823, + 306.28988713026047, + 340.3029321208596, + 306.26388952322304, + 312.34828966856, + 305.7711961604655, + 303.5506250113249, + 321.1650073081255, + 301.1680513769388, + 311.7736352458596, + 304.66596569120884, + 303.2435678169131, + 303.72125827521086, + 311.45533516444266, + 303.15061378851533, + 311.45889424160123, + 317.920526586473, + 312.1693257242441, + 300.5518902018666, + 305.49713457748294, + 301.2899262532592, + 302.11042806506157, + 304.06759673170745, + 308.9236156642437, + 306.133691214025, + 308.1469499245286, + 309.3135549426079, + 304.0927278622985, + 322.0557620674372, + 310.37403032928705, + 305.2717886418104, + 309.2484403811395, + 316.7018162366003, + 303.7712428160012, + 302.82127041369677, + 339.88095620274544, + 305.4483678676188, + 307.065474210307, + 301.24367336928844, + 303.33573476970196, + 332.7388571202755, + 305.76461014151573, + 302.9339645989239, + 308.88146033138037, + 307.6727576851845, + 301.3677311241627, + 303.1975903213024, + 305.4627691693604, + 311.9858607798815, + 330.7667771279812, + 306.95447386056185, + 316.7159267887473, + 305.7927678376436, + 320.57259564101696, + 311.29482022486627, + 301.35912519693375, + 302.63031098246574, + 305.1305563375354, + 301.8341988697648, + 326.70030053704977, + 315.77140568196774, + 308.09142203629017, + 318.46660140901804, + 321.77578005194664, + 318.2654233239591, + 324.40515848994255, + 304.446439858526, + 300.7397479861975, + 340.1774071510881, + 300.8868776652962, + 328.00225123018026, + 300.6274781227112, + 303.7716312855482, + 306.436478972435, + 305.9726163223386, + 305.146352365613, + 316.61103255674243, + 324.3817333057523, + 303.4732793420553, + 301.7861685156822, + 323.7760086655617, + 318.4486829005182, + 300.2123687528074, + 301.46378145366907, + 301.7640539482236, + 304.2362351100892, + 326.1698898524046, + 308.87413341365755, + 304.89690155535936, + 320.03443672321737, + 300.9087633956224, + 304.67533295601606, + 307.46317426115274, + 324.1203073784709, + 302.757764801383, + 382.79480108618736, + 324.6035650148988, + 303.6116211693734, + 309.70361069589853, + 306.8790203258395, + 308.23304937779903, + 301.1949695535004, + 304.16515084542334, + 308.3473913371563, + 304.79411429166794, + 310.25552190095186, + 301.55041848123074, + 302.1290051471442, + 307.67014714330435, + 300.3255782723427, + 305.2841533869505, + 309.65088154375553, + 310.5534200929105, + 308.5132071804255, + 310.9025877788663, + 309.7701136171818, + 304.98444867134094, + 348.0558537244797, + 305.3687424957752, + 313.6628130301833, + 319.583089068532, + 312.9610427543521, + 311.19719759374857, + 316.7905776053667, + 310.5006276369095, + 302.7078384384513, + 306.0600184686482, + 305.54721038788557, + 308.9606507215649, + 303.0505183637142, + 313.3748362734914, + 311.29958663880825, + 313.4373806938529, + 301.3445185124874, + 324.92408625781536, + 309.77276431396604, + 305.90033645555377, + 341.20380748063326, + 311.56037433072925, + 315.6066750213504, + 314.12771118432283, + 312.25866302102804, + 304.4466853365302, + 304.69186486303806, + 302.38096065446734, + 304.0568100064993, + 308.82150238379836, + 302.1706743314862, + 307.68491506949067, + 304.33473129943013, + 302.1377415060997, + 305.39050218090415, + 325.67842145450413, + 306.27879579365253, + 316.4812588393688, + 316.91919239610434, + 301.0618487559259, + 301.38374834507704, + 313.92598220333457, + 308.19221929833293, + 301.0112924799323, + 314.8371088653803, + 309.013961404562, + 302.46294739842415, + 303.96458788216114, + 304.6997568961233, + 301.0760717317462, + 318.38068445026875, + 311.1833598166704, + 309.26099948585033, + 379.9419914186001, + 307.62471289746463, + 305.40915387123823, + 302.5075035095215, + 312.005835108459, + 348.74297350272536, + 314.04565681517124, + 304.13325905799866, + 302.57874093204737, + 306.86363288760185, + 305.86618577875197, + 314.35718947276473, + 306.27010525763035, + 302.0418300181627, + 301.11282795108855, + 318.7322600334883, + 302.77300187945366, + 311.73570435494184, + 320.17958878725767, + 302.80662417411804, + 304.01972756534815, + 333.72439390420914, + 302.3730187471956, + 307.5517929662019, + 307.0710008479655, + 339.7386548817158, + 301.74035215750337, + 304.2111099809408, + 308.48775297775865, + 307.1943747214973, + 315.1181789636612, + 301.50811529159546, + 300.67045898362994, + 314.5320086851716, + 304.67058854177594, + 311.13495629280806, + 310.0005017518997, + 328.73236437886953, + 306.14826046302915, + 306.3881344050169, + 304.85877007991076, + 328.3628237210214, + 328.1459126919508, + 301.5199674516916, + 310.12014849483967, + 302.70635092258453, + 314.5403644219041, + 325.6980250328779, + 311.7943469658494, + 312.0032363217324, + 307.57736561074853, + 310.2516261935234, + 319.6832871437073, + 300.51390566676855, + 316.50363602116704, + 301.41954876482487, + 305.5731855854392, + 302.7573882341385, + 305.3785127401352, + 304.94937870278955, + 322.95357359200716, + 338.36372508853674, + 308.66714437678456, + 312.1780432239175, + 302.3916624188423, + 302.15736070275307, + 302.9140687920153, + 305.2457533404231, + 302.4419820457697, + 324.25284564495087, + 306.5971909314394, + 317.60798977315426, + 307.17061963677406, + 301.7769195139408, + 310.4095114469528, + 304.1166995987296, + 306.1932636965066, + 306.8449235446751, + 313.05469766259193, + 300.4762986600399, + 309.98027285188437, + 373.0799850784242, + 301.53840260207653, + 306.2895575873554, + 383.06634176149964, + 310.8300702124834, + 304.1513087451458, + 305.60910652577877, + 303.8895394131541, + 320.4108319282532, + 305.5951352957636, + 306.720003772527, + 302.9898698758334, + 308.9636351764202, + 306.26188768446445, + 307.3727677948773, + 310.55907993763685, + 304.90298916213214, + 315.2444198131561, + 316.8869545869529, + 301.6217900775373, + 325.07079872488976, + 314.6906509138644, + 313.28933880105615, + 304.0738300997764, + 340.7418527379632, + 314.9175963588059, + 301.7724255435169, + 311.1936928331852, + 303.22210620343685, + 300.2178050428629, + 308.3156466782093, + 301.42782170698047, + 323.93298925459385, + 307.8360353112221, + 300.793185479939, + 302.5279508382082, + 310.1078661624342, + 310.2442993298173, + 305.745303504169, + 301.5995541587472, + 303.9008490294218, + 317.7705310434103, + 310.87209296785295, + 303.1525960341096, + 301.18063829652965, + 312.85425335913897, + 305.9670836776495, + 301.8729877024889, + 302.28174552321434, + 306.3993478268385, + 301.6225157380104, + 311.55732447467744, + 301.8774871118367, + 310.53846668452024, + 300.88565021008253, + 317.05901619791985, + 309.3358341753483, + 307.8864065557718, + 303.8129284232855, + 317.3442627862096, + 309.16411838680506, + 314.53422712534666, + 311.1222358494997, + 303.69074119627476, + 307.95500879362226, + 300.8125609084964, + 301.28241741657257, + 301.52617237716913, + 301.18142825365067, + 318.0102746579796, + 300.25835421308875, + 301.56866758316755, + 309.46380123496056, + 301.7909340187907, + 300.9925622716546, + 317.29889922589064, + 311.3588969260454, + 310.2553479988128, + 307.441542442888, + 322.5628523658961, + 306.2037848494947, + 301.45694763958454, + 300.6918491143733, + 360.0218336954713, + 301.33888264372945, + 307.65656984597445, + 304.7286942768842, + 304.12026278302073, + 305.6107831597328, + 303.9281861111522, + 304.36181173473597, + 301.330088712275, + 307.2039493918419, + 308.1531788036227, + 301.4950467888266, + 309.1437619253993, + 303.52078964188695, + 314.87205707654357, + 300.81029618903995, + 310.26095551997423, + 317.5118254739791, + 304.3867094889283, + 309.8212481960654, + 311.544443231076, + 304.9261712022126, + 332.4378696382046, + 302.82097962498665, + 310.3950091600418, + 307.4630215615034, + 302.0810473933816, + 314.0050924383104, + 307.3913880623877, + 301.53572629392147, + 301.73347955569625, + 346.7918800711632, + 301.83704908564687, + 301.4019815325737, + 301.74955835938454, + 304.4496898241341, + 325.5918572023511, + 304.0315329693258, + 305.98841660656035, + 304.7348581124097, + 302.12120708823204, + 301.63818433880806, + 308.108238004148, + 303.6187047660351, + 325.8717697262764, + 305.91800431907177, + 310.06853325664997, + 319.49967935681343, + 301.3301938176155, + 309.82151456177235, + 301.08082470297813, + 303.57061613351107, + 303.39206202700734, + 306.87191685289145, + 302.45705020427704, + 312.0074314698577, + 300.6146572679281, + 301.850248709321, + 306.51955238729715, + 308.3053333684802, + 307.5676634758711, + 305.07663160562515, + 305.47360269352794, + 305.4339646603912, + 302.8038182258606, + 302.3882053755224, + 302.2241881042719, + 352.4271836951375, + 322.620147831738, + 302.18323818966746, + 314.89201368391514, + 312.6520765423775, + 303.9405604749918, + 307.69682447984815, + 300.4858789667487, + 305.57174115628004, + 301.9889161661267, + 314.24793845415115, + 330.9657644145191, + 325.5475197285414, + 301.9290997441858, + 306.0482601225376, + 309.8561720177531, + 328.2341633476317, + 302.3855937756598, + 310.86770812422037, + 302.5521267801523, + 304.1732379645109, + 302.4282428994775, + 307.91569197177887, + 304.0482217371464, + 307.5807719640434, + 306.31901749596, + 311.2660409770906, + 303.87168440781534, + 332.3708840236068, + 317.2510171458125, + 305.51497404649854, + 302.9702105149627, + 303.0128096565604, + 307.43880484625697, + 394.57082077115774, + 311.79714415967464, + 307.932954095304, + 314.4534704387188, + 307.0114815682173, + 329.7028080224991, + 309.49918186850846, + 304.8040414005518, + 313.8794565051794, + 300.6071197837591, + 307.491631180048, + 304.6385824587196, + 318.92896503955126, + 303.9200680796057, + 318.0446713604033, + 330.6052198652178, + 315.32616559416056, + 304.0269773453474, + 306.6422614827752, + 302.2182627469301, + 300.86596566811204, + 301.1273443624377, + 306.4100236594677, + 305.4537945985794, + 300.5071721896529, + 304.4421207103878, + 306.0829806625843, + 302.8812338113785, + 304.0564755946398, + 302.17497257888317, + 338.28516835719347, + 311.89722926542163, + 300.4389879181981, + 302.03866170346737, + 305.9649024605751, + 319.5674938261509, + 304.2657602131367, + 312.17362286522985, + 302.1493813544512, + 303.51985753700137, + 352.4891965724528, + 300.8494439162314, + 302.40629597753286, + 301.7401956021786, + 305.0626015663147, + 301.79256857186556, + 362.5175630003214, + 306.0989959836006, + 314.817803312093, + 304.86686428263783, + 305.27227511256933, + 312.82864312827587, + 316.6156578604132, + 311.4342073649168, + 302.83792032301426, + 302.01408506929874, + 309.8896180540323, + 311.7327741011977, + 306.6718678995967, + 309.78561275452375, + 302.62159667909145, + 310.7800527755171, + 312.1457167342305, + 307.5073139593005, + 301.01621511764824, + 303.4536429531872, + 308.63544983416796, + 306.8666833601892, + 310.65895630419254, + 304.7684311121702, + 307.6741800121963, + 306.4178984500468, + 305.73297587037086, + 304.22921857610345, + 311.54970326274633, + 301.48844607546926, + 307.9878662005067, + 305.688070461154, + 307.0181584209204, + 303.8576133996248, + 323.73157635703683, + 362.56654337234795, + 313.2259223982692, + 320.99307759292424, + 306.25909389927983, + 310.3295957222581, + 302.4391274526715, + 315.2719919271767, + 305.75615406036377, + 323.79556161910295, + 317.79525369405746, + 304.68787083029747, + 321.29436871409416, + 300.34603165090084, + 302.43582517653704, + 321.98294635489583, + 311.6465219371021, + 305.7870761118829, + 311.4882613234222, + 301.31243969500065, + 305.56722738593817, + 309.13720516860485, + 354.7498469054699, + 302.5416578166187, + 304.78436959162354, + 301.96495577692986, + 304.78012919425964, + 300.3758584037423, + 319.21245021373034, + 316.1637724041939, + 313.243137171492, + 302.031801763922, + 302.2887104302645, + 325.8930905032903, + 320.31136471778154, + 304.1354659534991, + 309.5868772044778, + 310.20443911105394, + 301.740345466882, + 302.3676568977535, + 332.73059602826834, + 310.29389487951994, + 381.36859188973904, + 326.43873016163707, + 303.6597589030862, + 325.797410659492, + 309.8873588517308, + 303.709018483758, + 359.67850903607905, + 303.05080213584006, + 303.11412139236927, + 311.81317358091474, + 303.1212722659111, + 316.38751116394997, + 315.0825022421777, + 365.75102692097425, + 301.9778012782335, + 308.4924771320075, + 311.10472245514393, + 307.0704229064286, + 314.9109225310385, + 344.41637347638607, + 305.86354292184114, + 302.1084552966058, + 305.9264240786433, + 351.47055050730705, + 312.746538028121, + 308.28303238376975, + 301.5321675464511, + 348.3575389813632, + 370.6760093681514, + 304.59443438611925, + 324.7283792793751, + 303.79193119704723, + 303.4510171562433, + 303.82898215577006, + 302.55642887204885, + 302.46507063508034, + 307.02652084827423, + 302.9075605273247, + 304.36183293908834, + 306.1642866060138, + 336.8192455880344, + 311.32811200618744, + 311.192996814847, + 357.65127585828304, + 302.1276033297181, + 340.5977222658694, + 301.9085162729025, + 302.6788491681218, + 309.44718270003796, + 304.257659798488, + 310.49861846119165, + 301.3939879387617, + 306.472926042974, + 328.4395925998688, + 305.1078567504883, + 306.4206129424274, + 311.08925841003656, + 314.5548060014844, + 325.08986112847924, + 304.8785474821925, + 316.5843650326133, + 334.3630006108433, + 304.3376620039344, + 318.5466873049736, + 305.4403547421098, + 305.10647743940353, + 302.55236621946096, + 302.0523450374603, + 311.7256025746465, + 303.9186339825392, + 301.5720275193453, + 306.10963103175163, + 372.99747467041016, + 303.42159436643124, + 312.78097273781896, + 316.6987701486796, + 302.5413580387831, + 303.3038756251335, + 333.66108516044915, + 302.5697359573096, + 307.38834760710597, + 359.1032387968153, + 340.54097525030375, + 302.80044359155, + 338.688713632524, + 306.8284249007702, + 304.28049659729004, + 309.6458916775882, + 310.4380480553955, + 303.6302991658449, + 308.86738684773445, + 305.5912030041218, + 312.42925463989377, + 309.5524221248925, + 301.9075758755207, + 308.5205889940262, + 390.5102948471904, + 305.60617647506297, + 301.29590667039156, + 320.1003277152777, + 390.30191192030907, + 310.8449557721615, + 327.60614289715886, + 354.7238994203508, + 316.0730481594801, + 308.7368136793375, + 395.68229046836495, + 301.6363040134311, + 312.9402892589569, + 308.63792983442545, + 355.344461992383, + 333.09186521172523, + 312.6343961805105, + 311.5504234749824, + 344.0327010322362, + 311.3591677621007, + 309.6536748409271, + 373.74866595864296, + 302.28638753294945, + 306.28987008705735, + 306.0132203325629, + 303.9230962842703, + 306.092622384429, + 324.12727611884475, + 310.3570240288973, + 322.29764092713594, + 311.64632387831807, + 307.7469764947891, + 318.23156049102545, + 318.4284760579467, + 314.27920220047235, + 324.1082094013691, + 307.08562073111534, + 302.74405024945736, + 306.5301790833473, + 334.1974005512893, + 321.26703859865665, + 301.20642425864935, + 301.29803720116615, + 303.6945947483182, + 304.6560820490122, + 307.6056440025568, + 311.0322267226875, + 301.48321130126715, + 302.1559426523745, + 303.08926515094936, + 303.0026221461594, + 306.8634887263179, + 308.80004700645804, + 313.7370115183294, + 302.82658910006285, + 300.81142052076757, + 304.2692522481084, + 313.98277947306633, + 318.1188143789768, + 327.84995165094733, + 300.8584012500942, + 322.60294495895505, + 351.43265339545906, + 311.25435073673725, + 399.1700655594468, + 302.8904755115509, + 304.72070083767176, + 312.1549221724272, + 306.7826898396015, + 303.43137395754457, + 303.00672241300344, + 342.3459893874824, + 302.42267040349543, + 303.5061776638031, + 309.61980114504695, + 309.7329857647419, + 311.9465411826968, + 311.96292111836374, + 307.90856334753335, + 308.18569729477167, + 306.97508050501347, + 308.00503262504935, + 369.29341688007116, + 356.1081372536719, + 308.5772354528308, + 373.7489254139364, + 304.5163408704102, + 307.64014767855406, + 309.553605183959, + 308.9904074817896, + 306.5161725357175, + 304.2505584023893, + 305.7062849998474, + 300.8017456885427, + 301.4363608658314, + 314.60452231764793, + 309.0727465674281, + 307.4719426780939, + 303.8672125339508, + 304.89371472783387, + 313.78027376532555, + 399.7153619453311, + 301.78062449395657, + 311.3115887641907, + 303.0897655710578, + 302.3827082812786, + 302.0236268118024, + 300.8654361963272, + 328.3866765201092, + 309.5513566285372, + 305.5089106671512, + 340.46980479359627, + 304.4516583234072, + 304.7320727929473, + 312.4667107053101, + 310.98710568621755, + 334.1236452534795, + 301.5248890556395, + 302.38151372782886, + 304.59551742859185, + 303.61308088712394, + 309.3108284007758, + 302.5983645096421, + 305.0749708712101, + 303.2991893738508, + 304.4897047802806, + 345.95231992565095, + 317.2268085293472, + 331.07037023454905, + 302.4047133028507, + 304.80498529970646, + 307.8610502332449, + 323.08659176528454, + 302.7642087228596, + 302.3427936192602, + 301.927097633481, + 355.09197398275137, + 326.22950987517834, + 309.7642298415303, + 303.50352519005537, + 336.76524578779936, + 301.512242782861, + 302.7820084169507, + 301.06769079715014, + 396.66342953778803, + 314.7353863045573, + 304.3256816640496, + 316.90869990363717, + 302.43455458432436, + 307.76430324465036, + 307.7606058418751, + 324.53732185810804, + 360.335979886353, + 316.5290347430855, + 302.51267363876104, + 315.7311837375164, + 302.8283832222223, + 303.1718745827675, + 302.8361946158111, + 305.3695691153407, + 354.39134856313467, + 311.73133914731443, + 305.99901821650565, + 304.5355021804571, + 302.942709825933, + 306.0382079035044, + 313.7206758707762, + 302.08463971316814, + 304.2431018203497, + 363.5900533609092, + 377.523376993835, + 302.337963744998, + 311.2266582362354, + 302.1808699928224, + 301.10806763358414, + 307.1373080313206, + 302.8209403604269, + 325.4849989041686, + 330.75146746635437, + 340.5169993452728, + 308.6870157700032, + 318.4641146399081, + 303.04329738020897, + 306.8913780450821, + 317.75606799311936, + 327.2480393871665, + 303.7333836108446, + 306.4186352789402, + 306.0529977567494, + 336.5291571095586, + 307.16937927901745, + 314.2825911305845, + 302.3251778334379, + 302.1275357231498, + 308.68492232076824, + 303.64045790582895, + 371.78760953247547, + 361.18819711357355, + 316.6461225003004, + 321.95242834836245, + 302.9018623717129, + 324.72312600165606, + 304.8789761438966, + 303.91928505152464, + 305.8494013994932, + 308.7392352819443, + 340.01018941402435, + 301.30981673300266, + 302.49847389757633, + 338.4310973286629, + 304.27325159683824, + 354.784050963819, + 312.7303124964237, + 373.65295853838325, + 360.5964304730296, + 306.58719270676374, + 310.1652040332556, + 333.0577655173838, + 351.2592051681131, + 347.3949205353856, + 306.9774073436856, + 303.54173600673676, + 317.2816324457526, + 303.2853067405522, + 315.82582354545593, + 303.85148101113737, + 324.88758669793606, + 301.1820498108864, + 313.12547758966684, + 305.88956408947706, + 310.9664124548435, + 305.87889981269836, + 301.8423732891679, + 305.6473080813885, + 302.95922266691923, + 302.1907644458115, + 355.6481486670673, + 302.4091388732195, + 301.4211438111961, + 308.1927165463567, + 307.6086550503969, + 302.55716724693775, + 302.47108486294746, + 302.31978114694357, + 332.24664014950395, + 302.3635336384177, + 301.25623565912247, + 303.13341141678393, + 304.6458437256515, + 303.1454141288996, + 347.861320361495, + 310.8792281113565, + 343.64715483784676, + 308.08076572418213, + 307.05942596681416, + 305.1063610985875, + 302.8256710190326, + 311.2535689547658, + 370.61057422310114, + 303.13151148334146, + 386.9374032393098, + 360.0233398042619, + 302.4165596291423, + 339.0728701185435, + 312.65518321841955, + 303.85362613014877, + 302.08075782842934, + 304.9798467308283, + 312.6797698363662, + 360.2711809054017, + 378.49351972155273, + 311.2463335469365, + 304.23582631349564, + 327.8443396613002, + 304.44545286521316, + 302.78723115101457, + 301.47642825730145, + 319.17677745223045, + 308.37403789535165, + 300.9249026235193, + 332.0970493517816, + 315.46974281966686, + 303.71979525871575, + 338.38093000650406, + 340.2684563063085, + 302.43116468191147, + 330.7162540629506, + 308.84585916250944, + 315.35083532705903, + 305.0456559509039, + 306.39210084080696, + 322.2584559172392, + 301.35858783870935, + 306.95425349101424, + 305.1545213237405, + 379.55931505560875, + 325.8458415251225, + 336.6945756226778, + 303.26562471315265 + ] + } + ], + "layout": { + "barmode": "overlay", + "hovermode": "x unified", + "shapes": [ + { + "line": { + "dash": "dash" + }, + "type": "line", + "x0": 300, + "x1": 300, + "xref": "x", + "y0": 0, + "y1": 1, + "yref": "paper" + } + ], + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Distribution of distance since last refuel" + }, + "xaxis": { + "title": { + "text": "Distance since last refuel (miles)" + } + }, + "yaxis": { + "title": { + "text": "Share" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "OUTPUT_ROOT = Path(r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\tnc_routing_test\")\n", + "timebin_scenarios = [\"base\", \"timebin_5\", \"timebin_15\"]\n", + "\n", + "refuel_dist = {}\n", + "\n", + "for scen in timebin_scenarios:\n", + " csv_path = OUTPUT_ROOT / scen / \"output_tnc_vehicle_trips.csv\"\n", + " df = pd.read_csv(csv_path)\n", + "\n", + " df[\"OD_dist\"] = pd.to_numeric(df[\"OD_dist\"], errors=\"coerce\").fillna(0.0)\n", + " df[\"trip_type\"] = df[\"trip_type\"].astype(str).str.lower()\n", + " df = df.sort_values([\"vehicle_id\", \"vehicle_trip_id\"], kind=\"mergesort\")\n", + "\n", + " pieces = []\n", + " for vid, sub in df.groupby(\"vehicle_id\", sort=False):\n", + " od = sub[\"OD_dist\"]\n", + " cum = od.cumsum()\n", + " is_ref = sub[\"trip_type\"].eq(\"refuel\")\n", + " if not is_ref.any():\n", + " continue\n", + " cum_at_refuel = cum.where(is_ref)\n", + " prev_cum_at_refuel = cum_at_refuel.shift().ffill().fillna(0.0)\n", + " dist_since_last = cum - prev_cum_at_refuel\n", + "\n", + " out = sub.loc[is_ref, [\"vehicle_id\", \"vehicle_trip_id\"]].copy()\n", + " out[\"dist_since_last_refuel\"] = dist_since_last[is_ref].values\n", + " pieces.append(out)\n", + "\n", + " if pieces:\n", + " refuel_dist[scen] = pd.concat(pieces, ignore_index=True)\n", + " else:\n", + " refuel_dist[scen] = pd.DataFrame(\n", + " columns=[\"vehicle_id\", \"vehicle_trip_id\", \"dist_since_last_refuel\"]\n", + " )\n", + "\n", + "fig = go.Figure()\n", + "\n", + "for scen in timebin_scenarios:\n", + " d = refuel_dist[scen][\"dist_since_last_refuel\"].astype(float)\n", + " d = d[d > 0]\n", + " if d.empty:\n", + " continue\n", + "\n", + " fig.add_trace(\n", + " go.Histogram(\n", + " x=d,\n", + " nbinsx=40,\n", + " name=scen,\n", + " opacity=0.5,\n", + " histnorm=\"probability\",\n", + " hovertemplate=(\n", + " f\"Scenario: {scen}
\"\n", + " \"Dist since last refuel: %{x:,.1f}
\"\n", + " \"Bin share: %{y:.3f}\"\n", + " ),\n", + " )\n", + " )\n", + "\n", + "fig.update_layout(\n", + " barmode=\"overlay\",\n", + " title=\"Distribution of distance since last refuel\",\n", + " xaxis_title=\"Distance since last refuel (miles)\",\n", + " yaxis_title=\"Share\",\n", + " hovermode=\"x unified\",\n", + ")\n", + "\n", + "fig.add_shape(\n", + " type=\"line\",\n", + " x0=300,\n", + " x1=300,\n", + " y0=0,\n", + " y1=1,\n", + " xref=\"x\",\n", + " yref=\"paper\",\n", + " line=dict(dash=\"dash\"),\n", + ")\n", + "\n", + "fig.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb b/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb deleted file mode 100644 index bb671785f..000000000 --- a/src/asim/scripts/taxi_tnc_routing/TNC_summaries_and_comparison.ipynb +++ /dev/null @@ -1,15750 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import plotly.graph_objects as go\n", - "import openmatrix as omx" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "new_df = pd.read_csv(\n", - " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\outputs\\tnc_routing_test\\output_tnc_vehicle_trips.csv\"\n", - ")\n", - "old_df = pd.read_csv(\n", - " r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\tnc_routing_data\\TNCTrips.csv\"\n", - ").rename(columns={\n", - " \"vehicle_ID\": \"vehicle_id\",\n", - " \"totalPassengers\": \"occupancy\",\n", - " \"originMgra\": \"origin\",\n", - " \"destinationMgra\": \"destination\"\n", - "})\n", - "\n", - "start_time = pd.Timestamp(\"2000-01-01 03:00:00\")\n", - "\n", - "landuse_file = r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\tnc_routing_data\\final_land_use.csv\"\n", - "omx_path = r\"C:\\projects\\sandag\\av_tnc_routing\\av_run_dir\\input_data_full\\skims\\traffic_skims_MD.omx\"\n", - "skim_core = \"SOV_TR_H_DIST__MD\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Total number of vehicles in service" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 1 — Unique vehicles:\n", - " New: 7,528\n", - " Old: 17,615\n" - ] - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Old", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AgAIAAsAFwAdACIAJwAsADUANwA4AD8ARwBKAFYAWQBZAF0AZQBqAHIAggCIAJYAuADbAPAABgENARYBTQGFAbMB2AH9AR4CmALGAhADSQOBA5sD1wQvBl0HKQijCCYJJgoTCwQMxQxwDekNqw5aD7IP9w8+EIkQ4RAwEXYRyxEDElMSjRLKEiwTchPIExkUWxSgFPMURxWOFdEVchb/Fn0X5RdGGJkY2RgmGW8ZvhkOGkwavxpVG+wbTByuHBkdOR18HZ4d1x37HSoeSx5hHnQemB7OHgUfDR8dHzEfTh9rH38frB/YH/cfGSBAIFUgniDLIPMgGSFCIWohySEGIlEidiK1IvkiYCOrIwckfCTZJCglyiU1JrUmMieaJ+UnoyiLKR4qrioKK5ArASxiLMgsPS2RLfEtnC55LyMwvjBCMcoxEDJQMm8ymDLXMkQzwjMfNIo0DTWdNec1KjaXNvA2IzdiN5835jctOGk4xjgiOWU5ozkGOnM6yDoWO3870jszPKQ88zxWPas90D3yPRE+Mj5mPqo++T4pP4c/sT/YPxVAX0CDQJpAyEABQStBi0HQQfdBVUKeQu5C80L0Qv9CFkMuQ0JDUUNiQ3JDf0OLQ5pDpEOtQ7ZDukPDQ9xD+EMTRDFESURlRH9Ei0SORJJElUSmRLREtkS2RLdEt0S3RLdEt0S3RLlEuUS5RLxEvUS9RL5EvkS+RMBEwUTFRMVExUTFRMVExUTFRMdEx0TJRMpEy0TNRM1EzUTPRA==", - "dtype": "i2" - } - }, - { - "mode": "lines", - "name": "New", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000" - ], - "y": { - "bdata": "LABPAGgAdQCMAKsAvgDYAOYACgEfATQBeQGzAf8BcAK5AukCnQMSBE0E8wZjCJgIigpfC+wLkg2jDdENBQ4iDkoOTw5rDm8Oew7GDiQPuA87EFsQaxCXEOwQSRGtEbQRthG8Eb8RvxHBEcERwRHBEcERwhHDEcMRwxHDEcMR7REtEnMSvBLGEggTOhN+E5QTIhR4FOIUHhUwFU4V7hUvFmQWaxZuFm8WcRZ1Fn4WiBaPFs8WDRcPF1oXXReRF8MXIRhhGLoYuhi7GMcY9BhZGaQZ8BlbGrQaHhuMGxEcExwUHBQcTBy0HP4c/hwAHVkdXx1fHV8dYB1gHWMdYx1jHWMdYx1jHWMdYx1kHWQdZB1mHWcdZx1nHWgd", - "dtype": "i2" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Item 1 — Cumulative Vehicles in Service" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "title": { - "text": "Cumulative Unique Vehicles" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# NEW\n", - "new_first = (\n", - " new_df.assign(depart_bin=lambda d: d[\"depart_bin\"].astype(int))\n", - " .groupby(\"vehicle_id\")[\"depart_bin\"].min()\n", - ")\n", - "new_intro = new_first.value_counts().sort_index()\n", - "new_intro = new_intro.reindex(pd.RangeIndex(0, new_intro.index.max() + 1), fill_value=0).cumsum()\n", - "new_intro_time = new_intro.copy()\n", - "new_intro_time.index = start_time + pd.to_timedelta(new_intro_time.index * 10, unit=\"m\")\n", - "\n", - "# OLD\n", - "old_first = (\n", - " old_df.assign(startPeriod=lambda d: d[\"startPeriod\"].astype(int))\n", - " .groupby(\"vehicle_id\")[\"startPeriod\"].min()\n", - ")\n", - "old_intro = old_first.value_counts().sort_index()\n", - "old_intro = old_intro.reindex(pd.RangeIndex(0, old_intro.index.max() + 1), fill_value=0).cumsum()\n", - "old_intro_time = old_intro.copy()\n", - "old_intro_time.index = start_time + pd.to_timedelta(old_intro_time.index * 5, unit=\"m\")\n", - "\n", - "print(\"Item 1 — Unique vehicles:\")\n", - "print(f\" New: {new_first.shape[0]:,}\")\n", - "print(f\" Old: {old_first.shape[0]:,}\")\n", - "\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(x=old_intro_time.index, y=old_intro_time.values, mode=\"lines\",\n", - " name=\"Old\"))\n", - "fig.add_trace(go.Scatter(x=new_intro_time.index, y=new_intro_time.values, mode=\"lines\",\n", - " name=\"New\"))\n", - "fig.update_layout(\n", - " title=\"Item 1 — Cumulative Vehicles in Service\",\n", - " xaxis_title=\"Time of Day\",\n", - " yaxis_title=\"Cumulative Unique Vehicles\",\n", - " hovermode=\"x unified\",\n", - " xaxis=dict(tickformat=\"%H:%M\")\n", - ")\n", - "fig.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Total number of (real) trips serviced" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Old REAL trips/hour (normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "New REAL trips/hour (normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Item 2 — REAL Trips (per hour)" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 2 — REAL trips\n", - " Old REAL trips: 229,785\n", - " New REAL trips: 186,115\n" - ] - } - ], - "source": [ - "\n", - "# REAL-trip\n", - "real_new = (new_df[\"trip_i\"].notna() | new_df[\"trip_j\"].notna()) & (new_df[\"is_deadhead\"] == False)\n", - "occ_old_num = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", - "real_old = (occ_old_num > 0) & old_df[\"pickupIdsAtOrigin\"].notna() & old_df[\"dropoffIdsAtOrigin\"].isna()\n", - "\n", - "# Bin counts\n", - "old_bins = old_df.loc[real_old, \"startPeriod\"].dropna().astype(int)\n", - "new_bins = new_df.loc[real_new, \"depart_bin\"].dropna().astype(int)\n", - "\n", - "old_counts = old_bins.value_counts().sort_index().reindex(pd.RangeIndex(0, old_bins.max() + 1), fill_value=0)\n", - "new_counts = new_bins.value_counts().sort_index().reindex(pd.RangeIndex(0, new_bins.max() + 1), fill_value=0)\n", - "\n", - "# Normalize to trips/hour \n", - "old_rate = old_counts * (60 / 5) # 5-min bins : per hour\n", - "new_rate = new_counts * (60 / 10) # 10-min bins : per hour\n", - "\n", - "# Map to time \n", - "old_rate_time = start_time + pd.to_timedelta(old_rate.index * 5, unit=\"m\")\n", - "new_rate_time = start_time + pd.to_timedelta(new_rate.index * 10, unit=\"m\")\n", - "\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate.values, mode=\"lines\",\n", - " name=\"Old REAL trips/hour (normalized)\"))\n", - "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate.values, mode=\"lines\",\n", - " name=\"New REAL trips/hour (normalized)\"))\n", - "fig.update_layout(\n", - " title=\"Item 2 — REAL Trips (per hour)\",\n", - " xaxis_title=\"Time of Day\",\n", - " yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\",\n", - " xaxis=dict(tickformat=\"%H:%M\")\n", - ")\n", - "fig.show()\n", - "\n", - "\n", - "# Systemwide totals\n", - "print(\"Item 2 — REAL trips\")\n", - "print(f\" Old REAL trips: {int(real_old.sum()):,}\")\n", - "print(f\" New REAL trips: {int(real_new.sum()):,}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Old output (startPeriod, 5-min bins)\n", - "# Max possible startPeriod = 287\n", - "# This is ok\n", - "\n", - "# New output (depart_bin, 10-min bins)\n", - "# Max possible depart_bin = 143\n", - "# there are records bigger than 143. records with > 144 are all deadhead trips but there are a few = 144 that are not." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Total number of trips made by the TNC vehicles " - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Old (all trips/hour, normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "New (all trips/hour, normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T03:00:00.000000000", - "2000-01-02T03:10:00.000000000", - "2000-01-02T03:20:00.000000000", - "2000-01-02T03:30:00.000000000", - "2000-01-02T03:40:00.000000000" - ], - "y": { - "bdata": "AAAAAACAgEAAAAAAACCDQAAAAAAA4H9AAAAAAABAfUAAAAAAAFCDQAAAAAAAMIhAAAAAAABwh0AAAAAAANCKQAAAAAAA8IVAAAAAAACwkEAAAAAAAICPQAAAAAAA4I9AAAAAAABAoUAAAAAAAAShQAAAAAAAuKRAAAAAAACMrEAAAAAAAPCrQAAAAAAApKxAAAAAAADyuUAAAAAAAEC6QAAAAAAA7LlAAAAAAADVzkAAAAAAAL/PQAAAAAAA4c5AAAAAAID61UAAAAAAgITWQAAAAAAAkddAAAAAAIAW20AAAAAAgCDaQAAAAACAo9tAAAAAAABN2UAAAAAAgFLYQAAAAAAAaNlAAAAAAAA41kAAAAAAACLXQAAAAAAAntZAAAAAAIBs1kAAAAAAgPfVQAAAAACAqNZAAAAAAIA42kAAAAAAAO/ZQAAAAACARdlAAAAAAAB42EAAAAAAgN/YQAAAAACAFdlAAAAAAID020AAAAAAgNDbQAAAAAAA/tlAAAAAAIAn1kAAAAAAAALWQAAAAAAAMNhAAAAAAIBt0kAAAAAAABrTQAAAAACAh9NAAAAAAAABzUAAAAAAAC7NQAAAAAAA285AAAAAAAC6zkAAAAAAAAXPQAAAAAAAE81AAAAAAABW0EAAAAAAgKLQQAAAAAAAy9BAAAAAAACv0UAAAAAAADbSQAAAAAAA6tJAAAAAAIDs1EAAAAAAgH3UQAAAAACAM9ZAAAAAAID22UAAAAAAAP3aQAAAAAAAtdpAAAAAAABi4EAAAAAAgEXgQAAAAABA+uBAAAAAAIAG4EAAAAAAAJjfQAAAAAAAq95AAAAAAIDy4UAAAAAAAPfhQAAAAAAAS+JAAAAAAAB93EAAAAAAAEfcQAAAAAAAYtxAAAAAAID73UAAAAAAAIzfQAAAAACAi95AAAAAAIAk30AAAAAAAB3fQAAAAAAAU99AAAAAAIAv3UAAAAAAgAjdQAAAAACAv91AAAAAAIC63EAAAAAAAD3dQAAAAAAAJd1AAAAAAAAZ3UAAAAAAANndQAAAAACA6txAAAAAAAB+2EAAAAAAANjYQAAAAAAAlNdAAAAAAIA710AAAAAAAAnYQAAAAACAjNdAAAAAAICP1EAAAAAAgJXUQAAAAACAYtRAAAAAAIDL1EAAAAAAAKPUQAAAAACADdVAAAAAAACFykAAAAAAACvKQAAAAAAAD8tAAAAAAAAwyEAAAAAAAPfHQAAAAAAAxMdAAAAAAACMwEAAAAAAAJ7AQAAAAAAATcBAAAAAAADCwEAAAAAAABrAQAAAAAAAJcFAAAAAAACSuUAAAAAAAI63QAAAAAAAvLlAAAAAAABEo0AAAAAAAAijQAAAAAAA5KJAAAAAAAAIlkAAAAAAAEibQAAAAAAAyJlAAAAAAABAlEAAAAAAAPiTQAAAAAAAOJNAAAAAAACwkEAAAAAAAAiTQAAAAAAA6JFAAAAAAAAgj0AAAAAAAICMQAAAAAAAgIxAAAAAAACQi0AAAAAAAMCOQAAAAAAAcIdAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Item 3 — All TNC Trips (normalized to trips/hour)" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 3 — Systemwide (All TNC trips)\n", - " Old total trips: 381,347\n", - " New total trips: 413,065\n" - ] - } - ], - "source": [ - "old_bins_all = old_df[\"startPeriod\"].dropna().astype(int)\n", - "new_bins_all = new_df[\"depart_bin\"].dropna().astype(int)\n", - "\n", - "old_counts_all = old_bins_all.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, old_bins_all.max() + 1), fill_value=0\n", - ")\n", - "new_counts_all = new_bins_all.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, new_bins_all.max() + 1), fill_value=0\n", - ")\n", - "\n", - "# normalize to trips/hour\n", - "old_rate_all = old_counts_all * (60 / 5) # 5-min bins : per hour\n", - "new_rate_all = new_counts_all * (60 / 10) # 10-min bins : per hour\n", - "\n", - "old_rate_time = start_time + pd.to_timedelta(old_rate_all.index * 5, unit=\"m\")\n", - "new_rate_time = start_time + pd.to_timedelta(new_rate_all.index * 10, unit=\"m\")\n", - "\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_all.values, mode=\"lines\",\n", - " name=\"Old (all trips/hour, normalized)\"))\n", - "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_all.values, mode=\"lines\",\n", - " name=\"New (all trips/hour, normalized)\"))\n", - "fig.update_layout(\n", - " title=\"Item 3 — All TNC Trips (normalized to trips/hour)\",\n", - " xaxis_title=\"Time of Day\",\n", - " yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\",\n", - " xaxis=dict(tickformat=\"%H:%M\")\n", - ")\n", - "fig.show()\n", - "\n", - "\n", - "# Systemwide totals (all trips)\n", - "print(\"Item 3 — Systemwide (All TNC trips)\")\n", - "print(f\" Old total trips: {int(old_counts_all.sum()):,}\")\n", - "print(f\" New total trips: {int(new_counts_all.sum()):,}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Non-deadhead trips made by the TNC vehicles " - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Old (all trips/hour, normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "New (all trips/hour, normalized)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Non-Deadhead TNC Trips (normalized to trips/hour)" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Systemwide Non-deadhead TNC Vehicle Trips\n", - " Old total trips: 229,967\n", - " New total trips: 186,115\n" - ] - } - ], - "source": [ - "old_bins_all = old_df[old_df.occupancy > 0][\"startPeriod\"].dropna().astype(int)\n", - "new_bins_all = new_df[new_df.is_deadhead == False][\"depart_bin\"].dropna().astype(int)\n", - "\n", - "old_counts_all = old_bins_all.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, old_bins_all.max() + 1), fill_value=0\n", - ")\n", - "new_counts_all = new_bins_all.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, new_bins_all.max() + 1), fill_value=0\n", - ")\n", - "\n", - "# normalize to trips/hour\n", - "old_rate_all = old_counts_all * (60 / 5) # 5-min bins : per hour\n", - "new_rate_all = new_counts_all * (60 / 10) # 10-min bins : per hour\n", - "\n", - "old_rate_time = start_time + pd.to_timedelta(old_rate_all.index * 5, unit=\"m\")\n", - "new_rate_time = start_time + pd.to_timedelta(new_rate_all.index * 10, unit=\"m\")\n", - "\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_all.values, mode=\"lines\",\n", - " name=\"Old (all trips/hour, normalized)\"))\n", - "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_all.values, mode=\"lines\",\n", - " name=\"New (all trips/hour, normalized)\"))\n", - "fig.update_layout(\n", - " title=\"Non-Deadhead TNC Trips (normalized to trips/hour)\",\n", - " xaxis_title=\"Time of Day\",\n", - " yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\",\n", - " xaxis=dict(tickformat=\"%H:%M\")\n", - ")\n", - "fig.show()\n", - "\n", - "\n", - "# Systemwide totals (all trips)\n", - "print(\"Systemwide Non-deadhead TNC Vehicle Trips\")\n", - "print(f\" Old total trips: {int(old_counts_all.sum()):,}\")\n", - "print(f\" New total trips: {int(new_counts_all.sum()):,}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Average occupancy by number of trips and average occupancy by VMT" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 4 — Average occupancy (trip-level)\n", - "OLD By trips: 1.07 | By VMT: 1.32 \n", - "NEW By trips: 0.45 | By VMT: 0.86 \n" - ] - } - ], - "source": [ - "new_trips = new_df[[\"occupancy\", \"origin\", \"destination\"]].copy()\n", - "old_trips = old_df[[\"occupancy\", \"origin\", \"destination\"]].copy()\n", - "\n", - "lu = pd.read_csv(landuse_file, usecols=[\"mgra\", \"TAZ\"])\n", - "\n", - "new_trips = new_trips.merge(lu.rename(columns={\"mgra\":\"origin\"}), on=\"origin\", how=\"left\").rename(columns={\"TAZ\":\"oTAZ\"})\n", - "new_trips = new_trips.merge(lu.rename(columns={\"mgra\":\"destination\"}), on=\"destination\", how=\"left\").rename(columns={\"TAZ\":\"dTAZ\"})\n", - "old_trips = old_trips.merge(lu.rename(columns={\"mgra\":\"origin\"}), on=\"origin\", how=\"left\").rename(columns={\"TAZ\":\"oTAZ\"})\n", - "old_trips = old_trips.merge(lu.rename(columns={\"mgra\":\"destination\"}), on=\"destination\", how=\"left\").rename(columns={\"TAZ\":\"dTAZ\"})\n", - "\n", - "with omx.open_file(omx_path) as f:\n", - " skim = np.array(f[skim_core])\n", - " taz_map = f.mapping(f.list_mappings()[0]) # dict-like TAZ -> idx\n", - "\n", - "taz_to_idx = pd.Series(taz_map)\n", - "\n", - "# Map TAZ labels to skim indices\n", - "new_trips[\"otaz_idx\"] = taz_to_idx.reindex(new_trips[\"oTAZ\"].values).values\n", - "new_trips[\"dtaz_idx\"] = taz_to_idx.reindex(new_trips[\"dTAZ\"].values).values\n", - "old_trips[\"otaz_idx\"] = taz_to_idx.reindex(old_trips[\"oTAZ\"].values).values\n", - "old_trips[\"dtaz_idx\"] = taz_to_idx.reindex(old_trips[\"dTAZ\"].values).values\n", - "\n", - "# Compute distances o\n", - "new_pairs = new_trips[[\"otaz_idx\",\"dtaz_idx\"]].dropna().astype(\"int32\").drop_duplicates()\n", - "old_pairs = old_trips[[\"otaz_idx\",\"dtaz_idx\"]].dropna().astype(\"int32\").drop_duplicates()\n", - "pairs = pd.concat([new_pairs, old_pairs], ignore_index=True).drop_duplicates()\n", - "\n", - "pairs[\"trip_dist\"] = skim[pairs[\"otaz_idx\"].to_numpy(), pairs[\"dtaz_idx\"].to_numpy()]\n", - "\n", - "new_trips = new_trips.merge(pairs, on=[\"otaz_idx\",\"dtaz_idx\"], how=\"left\")\n", - "old_trips = old_trips.merge(pairs, on=[\"otaz_idx\",\"dtaz_idx\"], how=\"left\")\n", - "\n", - "# Clean occupancy; compute distance-weighted term\n", - "for df in (new_trips, old_trips):\n", - " df[\"occupancy\"] = pd.to_numeric(df[\"occupancy\"], errors=\"coerce\")\n", - " df[\"occ_x_dist\"] = df[\"occupancy\"] * df[\"trip_dist\"]\n", - "\n", - "# Systemwide averages\n", - "avg_occ_old_by_trips = old_trips[\"occupancy\"].mean()\n", - "avg_occ_new_by_trips = new_trips[\"occupancy\"].mean()\n", - "\n", - "avg_occ_old_by_vmt = old_trips[\"occ_x_dist\"].sum() / old_trips[\"trip_dist\"].sum()\n", - "avg_occ_new_by_vmt = new_trips[\"occ_x_dist\"].sum() / new_trips[\"trip_dist\"].sum()\n", - "\n", - "\n", - "\n", - "print(\"Item 4 — Average occupancy (trip-level)\")\n", - "print(f\"OLD By trips: {avg_occ_old_by_trips:,.2f} | By VMT: {avg_occ_old_by_vmt:,.2f} \")\n", - "print(f\"NEW By trips: {avg_occ_new_by_trips:,.2f} | By VMT: {avg_occ_new_by_vmt:,.2f} \")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Number and share of deadheading by number of trips and VMT" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 5 — Deadheading rate\n", - "OLD\n", - " By trips: 151,376 / 381,347: 39.7%\n", - " By VMT: 593,419 / 1,729,081: 34.3%\n", - "NEW\n", - " By trips: 226,950 / 413,065: 54.9%\n", - " By VMT: 248,362 / 1,716,421: 14.5%\n" - ] - } - ], - "source": [ - "new_trips = new_trips.copy()\n", - "old_trips = old_trips.copy()\n", - "\n", - "# NEW: use is_deadhead from source\n", - "new_trips[\"is_deadhead\"] = new_df[\"is_deadhead\"].values\n", - "\n", - "# OLD: deadhead => passengers==0 AND dropoffIdsAtOrigin non-null AND pickupIdsAtOrigin null\n", - "occ_old_num = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", - "old_deadhead_mask = (occ_old_num == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", - "old_trips[\"is_deadhead\"] = old_deadhead_mask.values\n", - "\n", - "# By TRIPS (simple counts)\n", - "old_total_trips = len(old_trips)\n", - "new_total_trips = len(new_trips)\n", - "old_dead_trips = int(old_trips[\"is_deadhead\"].sum())\n", - "new_dead_trips = int(new_trips[\"is_deadhead\"].sum())\n", - "old_share_trips = old_dead_trips / old_total_trips if old_total_trips else np.nan\n", - "new_share_trips = new_dead_trips / new_total_trips if new_total_trips else np.nan\n", - "\n", - "# By VMT (distance-weighted)\n", - "old_dead_vmt = old_trips.loc[old_trips[\"is_deadhead\"], \"trip_dist\"].sum()\n", - "new_dead_vmt = new_trips.loc[new_trips[\"is_deadhead\"], \"trip_dist\"].sum()\n", - "old_total_vmt = old_trips[\"trip_dist\"].sum()\n", - "new_total_vmt = new_trips[\"trip_dist\"].sum()\n", - "old_share_vmt = old_dead_vmt / old_total_vmt if old_total_vmt else np.nan\n", - "new_share_vmt = new_dead_vmt / new_total_vmt if new_total_vmt else np.nan\n", - "\n", - "# --- Report\n", - "print(\"Item 5 — Deadheading rate\")\n", - "print(\"OLD\")\n", - "print(f\" By trips: {old_dead_trips:,} / {old_total_trips:,}: {old_share_trips:,.1%}\")\n", - "print(f\" By VMT: {old_dead_vmt:,.0f} / {old_total_vmt:,.0f}: {old_share_vmt:,.1%}\")\n", - "print(\"NEW\")\n", - "print(f\" By trips: {new_dead_trips:,} / {new_total_trips:,}: {new_share_trips:,.1%}\")\n", - "print(f\" By VMT: {new_dead_vmt:,.0f} / {new_total_vmt:,.0f}: {new_share_vmt:,.1%}\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Number and share of refueling trips by number of trips and VMT" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Old refuel trips/hour", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "New refuel trips/hour", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T03:00:00.000000000", - "2000-01-02T03:10:00.000000000", - "2000-01-02T03:20:00.000000000", - "2000-01-02T03:30:00.000000000", - "2000-01-02T03:40:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Item 6 — Refueling Trips (per hour)" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Item 6 — Refueling trips\n", - "OLD\n", - " By trips: 2 / 381,347 → 0.00%\n", - " By VMT: 90 / 1,729,081 → 0.01%\n", - "NEW\n", - " By trips: 40,863 / 413,065 → 9.89%\n", - " By VMT: 48,012 / 1,716,421 → 2.80%\n" - ] - } - ], - "source": [ - "refuel_new = new_df[\"trip_type\"].astype(str).str.lower() == \"refuel\"\n", - "refuel_old = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\") == 4\n", - "\n", - "old_bins_ref = old_df.loc[refuel_old, \"startPeriod\"].dropna().astype(int)\n", - "new_bins_ref = new_df.loc[refuel_new, \"depart_bin\"].dropna().astype(int)\n", - "\n", - "old_counts_ref = old_bins_ref.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, (old_bins_ref.max() if len(old_bins_ref) else -1) + 1), fill_value=0\n", - ")\n", - "new_counts_ref = new_bins_ref.value_counts().sort_index().reindex(\n", - " pd.RangeIndex(0, (new_bins_ref.max() if len(new_bins_ref) else -1) + 1), fill_value=0\n", - ")\n", - "\n", - "old_rate_ref = old_counts_ref * (60 / 5)\n", - "new_rate_ref = new_counts_ref * (60 / 10)\n", - "\n", - "old_rate_time = start_time + pd.to_timedelta(old_rate_ref.index * 5, unit=\"m\")\n", - "new_rate_time = start_time + pd.to_timedelta(new_rate_ref.index * 10, unit=\"m\")\n", - "\n", - "fig = go.Figure()\n", - "fig.add_trace(go.Scatter(x=old_rate_time, y=old_rate_ref.values, mode=\"lines\",\n", - " name=\"Old refuel trips/hour\"))\n", - "fig.add_trace(go.Scatter(x=new_rate_time, y=new_rate_ref.values, mode=\"lines\",\n", - " name=\"New refuel trips/hour\"))\n", - "fig.update_layout(\n", - " title=\"Item 6 — Refueling Trips (per hour)\",\n", - " xaxis_title=\"Time of Day\",\n", - " yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\",\n", - " xaxis=dict(tickformat=\"%H:%M\")\n", - ")\n", - "fig.show()\n", - "\n", - "new_trips = new_trips.copy()\n", - "old_trips = old_trips.copy()\n", - "new_trips[\"is_refuel\"] = refuel_new.values\n", - "old_trips[\"is_refuel\"] = refuel_old.values\n", - "\n", - "n_ref_new = int(new_trips[\"is_refuel\"].sum())\n", - "n_ref_old = int(old_trips[\"is_refuel\"].sum())\n", - "tot_new = len(new_trips)\n", - "tot_old = len(old_trips)\n", - "share_ref_trips_new = n_ref_new / tot_new\n", - "share_ref_trips_old = n_ref_old / tot_old\n", - "\n", - "ref_vmt_new = new_trips.loc[new_trips[\"is_refuel\"], \"trip_dist\"].sum()\n", - "ref_vmt_old = old_trips.loc[old_trips[\"is_refuel\"], \"trip_dist\"].sum()\n", - "tot_vmt_new = new_trips[\"trip_dist\"].sum()\n", - "tot_vmt_old = old_trips[\"trip_dist\"].sum()\n", - "share_ref_vmt_new = ref_vmt_new / tot_vmt_new\n", - "share_ref_vmt_old = ref_vmt_old / tot_vmt_old\n", - "\n", - "print(\"Item 6 — Refueling trips\")\n", - "print(\"OLD\")\n", - "print(f\" By trips: {n_ref_old:,} / {tot_old:,} → {share_ref_trips_old:,.2%}\")\n", - "print(f\" By VMT: {ref_vmt_old:,.0f} / {tot_vmt_old:,.0f} → {share_ref_vmt_old:,.2%}\")\n", - "print(\"NEW\")\n", - "print(f\" By trips: {n_ref_new:,} / {tot_new:,} → {share_ref_trips_new:,.2%}\")\n", - "print(f\" By VMT: {ref_vmt_new:,.0f} / {tot_vmt_new:,.0f} → {share_ref_vmt_new:,.2%}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Pickup/hr (reposition)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refuel/hr", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Dropoff/hr (serviced)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "OLD — Trips per Hour by Trip Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 19769.4 - ], - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Pickup/hr (reposition)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAIHBAAAAAAAAAbkAAAAAAAIBzQAAAAAAAYHhAAAAAAADgdkAAAAAAAAB7QAAAAAAAwHVAAAAAAACwgEAAAAAAAIB/QAAAAAAAIIBAAAAAAABwkUAAAAAAAOCQQAAAAAAA6JRAAAAAAABQnEAAAAAAAFCcQAAAAAAAUJxAAAAAAABwqkAAAAAAABCqQAAAAAAAjKlAAAAAAABQv0AAAAAAAG6/QAAAAAAAwL5AAAAAAAAXxkAAAAAAAG7GQAAAAAAAjsdAAAAAAAAYy0AAAAAAABnKQAAAAAAAostAAAAAAABKyUAAAAAAAEXIQAAAAAAAZclAAAAAAAApxkAAAAAAABDHQAAAAAAAgMZAAAAAAABTxkAAAAAAANvFQAAAAAAAfcZAAAAAAAAfykAAAAAAALbJQAAAAAAADslAAAAAAABFyEAAAAAAAJnIQAAAAAAAwMhAAAAAAACWy0AAAAAAAGDLQAAAAAAAdMlAAAAAAACcxUAAAAAAAGPFQAAAAAAAfMdAAAAAAACdwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA1LxAAAAAAABovEAAAAAAAIC8QAAAAAAAUrpAAAAAAABSvUAAAAAAABK+QAAAAAAA0L1AAAAAAAA4v0AAAAAAACPAQAAAAAAAnsBAAAAAAAB+wkAAAAAAAN/BQAAAAAAAR8NAAAAAAACkxkAAAAAAAHPHQAAAAAAAQMdAAAAAAACtzEAAAAAAAMLMQAAAAAAArM1AAAAAAADky0AAAAAAAI3LQAAAAAAAuMpAAAAAAACzz0AAAAAAACzPQAAAAAAAy89AAAAAAAAMyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA6clAAAAAAAA6ykAAAAAAACjKQAAAAAAAc8pAAAAAAAAqyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA4sFAAAAAAACEtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refuel/hr", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T03:00:00.000000000", - "2000-01-02T03:10:00.000000000", - "2000-01-02T03:20:00.000000000", - "2000-01-02T03:30:00.000000000", - "2000-01-02T03:40:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Dropoff/hr (serviced)", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHCqQAAAAAAATKpAAAAAAABavkAAAAAAAAjAQAAAAAAAAr9AAAAAAADexUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACjKQAAAAAAAostAAAAAAABKyUAAAAAAAE7IQAAAAAAAX8lAAAAAAAAvxkAAAAAAAArHQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA1LxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABkvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADwy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADLPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA48lAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "NEW — Trips per Hour by Trip Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 19769.4 - ], - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Trips/hour by trip type — separate OLD vs NEW plots (same y-axis)\n", - "\n", - "# NEW: trip_type has pickup / dropoff / refuel\n", - "tt = new_df[\"trip_type\"].astype(str).str.lower()\n", - "new_pickup = tt.eq(\"pickup\")\n", - "new_dropoff = tt.eq(\"dropoff\")\n", - "new_refuel = tt.eq(\"refuel\")\n", - "\n", - "# OLD: destinationPurpose -> 1/3 = pickup, 2 = dropoff, 4 = refuel\n", - "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", - "old_pickup = dp.isin([1,3])\n", - "old_dropoff = dp.eq(2)\n", - "old_refuel = dp.eq(4)\n", - "\n", - "# Counts → trips/hour\n", - "new_pk = new_df.loc[new_pickup, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", - "new_do = new_df.loc[new_dropoff, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", - "new_rf = new_df.loc[new_refuel, \"depart_bin\"].dropna().astype(int).value_counts().sort_index()\n", - "if len(new_pk): new_pk = new_pk.reindex(pd.RangeIndex(0, new_pk.index.max()+1), fill_value=0)\n", - "if len(new_do): new_do = new_do.reindex(pd.RangeIndex(0, new_do.index.max()+1), fill_value=0)\n", - "if len(new_rf): new_rf = new_rf.reindex(pd.RangeIndex(0, new_rf.index.max()+1), fill_value=0)\n", - "new_pk_rate, new_do_rate, new_rf_rate = new_pk*(60/10), new_do*(60/10), new_rf*(60/10)\n", - "\n", - "old_pk = old_df.loc[old_pickup, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", - "old_do = old_df.loc[old_dropoff, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", - "old_rf = old_df.loc[old_refuel, \"startPeriod\"].dropna().astype(int).value_counts().sort_index()\n", - "if len(old_pk): old_pk = old_pk.reindex(pd.RangeIndex(0, old_pk.index.max()+1), fill_value=0)\n", - "if len(old_do): old_do = old_do.reindex(pd.RangeIndex(0, old_do.index.max()+1), fill_value=0)\n", - "if len(old_rf): old_rf = old_rf.reindex(pd.RangeIndex(0, old_rf.index.max()+1), fill_value=0)\n", - "old_pk_rate, old_do_rate, old_rf_rate = old_pk*(60/5), old_do*(60/5), old_rf*(60/5)\n", - "\n", - "# Common y-axis\n", - "ymax = float(pd.concat([new_pk_rate,new_do_rate,new_rf_rate,old_pk_rate,old_do_rate,old_rf_rate]).max())*1.05\n", - "\n", - "# OLD plot\n", - "fig_old = go.Figure()\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_pk_rate.index*5, unit=\"m\"),\n", - " y=old_pk_rate.values, mode=\"lines\", name=\"Pickup/hr (reposition)\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_rf_rate.index*5, unit=\"m\"),\n", - " y=old_rf_rate.values, mode=\"lines\", name=\"Refuel/hr\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(old_do_rate.index*5, unit=\"m\"),\n", - " y=old_do_rate.values, mode=\"lines\", name=\"Dropoff/hr (serviced)\"))\n", - "fig_old.update_layout(title=\"OLD — Trips per Hour by Trip Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_old.show()\n", - "\n", - "# NEW plot\n", - "fig_new = go.Figure()\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_pk_rate.index*10, unit=\"m\"),\n", - " y=new_pk_rate.values, mode=\"lines\", name=\"Pickup/hr (reposition)\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_rf_rate.index*10, unit=\"m\"),\n", - " y=new_rf_rate.values, mode=\"lines\", name=\"Refuel/hr\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(new_do_rate.index*10, unit=\"m\"),\n", - " y=new_do_rate.values, mode=\"lines\", name=\"Dropoff/hr (serviced)\"))\n", - "fig_new.update_layout(title=\"NEW — Trips per Hour by Trip Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_new.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Repositioning", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Servicing", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refueling", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "OLD — Trips per Hour by Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 21457.8 - ], - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Repositioning", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAIHBAAAAAAAAAbkAAAAAAAIBzQAAAAAAAYHhAAAAAAADgdkAAAAAAAAB7QAAAAAAAwHVAAAAAAACwgEAAAAAAAIB/QAAAAAAAIIBAAAAAAABwkUAAAAAAAOCQQAAAAAAA6JRAAAAAAABQnEAAAAAAAFCcQAAAAAAAUJxAAAAAAABwqkAAAAAAAASqQAAAAAAAjKlAAAAAAABKv0AAAAAAAG6/QAAAAAAAwL5AAAAAAAAUxkAAAAAAAG7GQAAAAAAAjsdAAAAAAAAYy0AAAAAAABbKQAAAAAAAn8tAAAAAAABKyUAAAAAAAELIQAAAAAAAZclAAAAAAAAmxkAAAAAAAA3HQAAAAAAAgMZAAAAAAABTxkAAAAAAANvFQAAAAAAAfcZAAAAAAAAfykAAAAAAALbJQAAAAAAADslAAAAAAABFyEAAAAAAAJnIQAAAAAAAwMhAAAAAAACWy0AAAAAAAGDLQAAAAAAAdMlAAAAAAACcxUAAAAAAAGPFQAAAAAAAfMdAAAAAAACdwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAAzrxAAAAAAABovEAAAAAAAIC8QAAAAAAAUrpAAAAAAABMvUAAAAAAABK+QAAAAAAA0L1AAAAAAAA4v0AAAAAAACPAQAAAAAAAnsBAAAAAAAB+wkAAAAAAAN/BQAAAAAAAR8NAAAAAAACkxkAAAAAAAHPHQAAAAAAAQMdAAAAAAACtzEAAAAAAAMLMQAAAAAAArM1AAAAAAADhy0AAAAAAAI3LQAAAAAAAuMpAAAAAAACzz0AAAAAAACbPQAAAAAAAy89AAAAAAAAMyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA6ykAAAAAAACjKQAAAAAAAc8pAAAAAAAAqyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA4sFAAAAAAACEtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Servicing", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAAAACAcEAAAAAAACBzQAAAAAAAgG9AAAAAAACAbEAAAAAAACBzQAAAAAAAAHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAAIHZAAAAAAACwgEAAAAAAAIB/QAAAAAAAgH9AAAAAAAAQkUAAAAAAACiRQAAAAAAAiJRAAAAAAADInEAAAAAAAJCbQAAAAAAA+JxAAAAAAAB0qUAAAAAAAHyqQAAAAAAATKpAAAAAAABgvkAAAAAAAAjAQAAAAAAAAr9AAAAAAADhxUAAAAAAAJvGQAAAAAAAlMdAAAAAAAAVy0AAAAAAACvKQAAAAAAApctAAAAAAABKyUAAAAAAAFHIQAAAAAAAX8lAAAAAAAAyxkAAAAAAAA3HQAAAAAAAhsZAAAAAAABTxkAAAAAAANjFQAAAAAAAgMZAAAAAAAAKykAAAAAAAMjJQAAAAAAACMlAAAAAAABFyEAAAAAAAJnIQAAAAAAAxshAAAAAAACZy0AAAAAAAF3LQAAAAAAAd8lAAAAAAACcxUAAAAAAAGPFQAAAAAAAdsdAAAAAAACjwUAAAAAAAD/CQAAAAAAAk8JAAAAAAABCu0AAAAAAAE67QAAAAAAA2rxAAAAAAABovEAAAAAAAIC8QAAAAAAAQLpAAAAAAABqvUAAAAAAABK+QAAAAAAAyr1AAAAAAAA+v0AAAAAAACPAQAAAAAAAm8BAAAAAAAB+wkAAAAAAAOLBQAAAAAAAO8NAAAAAAACVxkAAAAAAAIvHQAAAAAAAQ8dAAAAAAACkzEAAAAAAALnMQAAAAAAAr81AAAAAAADzy0AAAAAAAJDLQAAAAAAAtcpAAAAAAACqz0AAAAAAADjPQAAAAAAAy89AAAAAAAASyEAAAAAAAB7IQAAAAAAAV8hAAAAAAADmyUAAAAAAAADLQAAAAAAA5slAAAAAAAA9ykAAAAAAACvKQAAAAAAAaspAAAAAAAAzyEAAAAAAACrIQAAAAAAAychAAAAAAAC+x0AAAAAAAD/IQAAAAAAAPMhAAAAAAAAtyEAAAAAAAPnIQAAAAAAAAMhAAAAAAADyw0AAAAAAAD3EQAAAAAAAVsNAAAAAAABBw0AAAAAAAAHEQAAAAAAAesNAAAAAAADdwEAAAAAAABDBQAAAAAAADcFAAAAAAABYwUAAAAAAAGTBQAAAAAAA3MFAAAAAAACQtUAAAAAAAPC1QAAAAAAAOrdAAAAAAABktEAAAAAAAFK0QAAAAAAAdrRAAAAAAAAMq0AAAAAAAFysQAAAAAAAIKxAAAAAAADsrEAAAAAAAEirQAAAAAAAlK1AAAAAAACcpUAAAAAAAPijQAAAAAAA/KVAAAAAAADQjUAAAAAAAPCOQAAAAAAAOJBAAAAAAAAwgkAAAAAAABCHQAAAAAAAkIVAAAAAAADQgUAAAAAAAKCBQAAAAAAAsIBAAAAAAAAgfEAAAAAAALCAQAAAAAAA4H9AAAAAAACgekAAAAAAAAB4QAAAAAAAwHhAAAAAAAAAeEAAAAAAAKB6QAAAAAAA4HNA", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refueling", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T03:00:00.000000000", - "2000-01-02T03:10:00.000000000", - "2000-01-02T03:20:00.000000000", - "2000-01-02T03:30:00.000000000", - "2000-01-02T03:40:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAAAAAAAAKEAAAAAAAABCQAAAAAAAADhAAAAAAAAASEAAAAAAAABVQAAAAAAAAFtAAAAAAACAWUAAAAAAAABeQAAAAAAAAGVAAAAAAAAAYkAAAAAAAABoQAAAAAAAQG1AAAAAAACAaUAAAAAAAKBxQAAAAAAAoHRAAAAAAABAd0AAAAAAAIB8QAAAAAAAEIFAAAAAAABwgUAAAAAAAOCDQAAAAAAA4IZAAAAAAACwiUAAAAAAAGCLQAAAAAAAkI5AAAAAAADwi0AAAAAAAACOQAAAAAAAOJBAAAAAAACQkkAAAAAAACiUQAAAAAAAUJZAAAAAAACImkAAAAAAAJiZQAAAAAAASJ5AAAAAAACMoEAAAAAAAJigQAAAAAAAbKJAAAAAAAB0o0AAAAAAAOikQAAAAAAAlKdAAAAAAADQqkAAAAAAAPCrQAAAAAAAnKtAAAAAAABusEAAAAAAAGyuQAAAAAAAHLFAAAAAAACMsEAAAAAAACawQAAAAAAApK9AAAAAAADasEAAAAAAAPyyQAAAAAAALLNAAAAAAAC4sUAAAAAAAKSwQAAAAAAALLBAAAAAAABWsEAAAAAAADCyQAAAAAAAlrJAAAAAAACks0AAAAAAAM6zQAAAAAAAkrNAAAAAAAAEtEAAAAAAAHqzQAAAAAAA2rNAAAAAAADys0AAAAAAAPizQAAAAAAApLNAAAAAAACws0AAAAAAAICzQAAAAAAAqrNAAAAAAAAwskAAAAAAAGyyQAAAAAAA+LBAAAAAAADUr0AAAAAAACCwQAAAAAAASrBAAAAAAACUrUAAAAAAACysQAAAAAAArKpAAAAAAACcq0AAAAAAAPipQAAAAAAAdKlAAAAAAADso0AAAAAAAOygQAAAAAAAqJ5AAAAAAABgnkAAAAAAACidQAAAAAAAcJpAAAAAAAAwmEAAAAAAAICTQAAAAAAA6JFAAAAAAABgkkAAAAAAALCTQAAAAAAA2JJAAAAAAACwj0AAAAAAALCMQAAAAAAAAI5AAAAAAABwgUAAAAAAAIB8QAAAAAAAYHVAAAAAAADAbkAAAAAAAOBwQAAAAAAA4HBAAAAAAACAY0AAAAAAAMBiQAAAAAAAQGRAAAAAAAAAZUAAAAAAAMBiQAAAAAAAgF9AAAAAAAAAYkAAAAAAAABiQAAAAAAAAF5AAAAAAACAXEAAAAAAAIBgQAAAAAAAgFxAAAAAAAAATkAAAAAAAAAoQAAAAAAAABhAAAAAAAAAKEAAAAAAAAAYQA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "NEW — Trips per Hour by Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 21457.8 - ], - "title": { - "text": "Trips per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Trips/hour by trip type — separate OLD vs NEW plots (same y-axis)\n", - "\n", - "# NEW\n", - "trip_type = new_df[\"trip_type\"].astype(str).str.lower()\n", - "is_deadhead = new_df[\"is_deadhead\"] == True\n", - "reposition_new = trip_type.eq(\"pickup\") & is_deadhead\n", - "servicing_new = (trip_type.eq(\"pickup\") & ~is_deadhead) | trip_type.eq(\"dropoff\")\n", - "refueling_new = trip_type.eq(\"refuel\")\n", - "\n", - "# OLD\n", - "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", - "occ = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", - "is_deadhead_old = (occ == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", - "reposition_old = dp.isin([1, 3]) & is_deadhead_old\n", - "servicing_old = (dp.isin([1, 3]) & ~is_deadhead_old) | dp.eq(2)\n", - "refueling_old = dp.eq(4)\n", - "\n", - "def rate(df, mask, col, width):\n", - " bins = df.loc[mask, col].dropna().astype(int)\n", - " if not len(bins): return pd.Series(dtype=float)\n", - " counts = bins.value_counts().sort_index().reindex(pd.RangeIndex(0, bins.max() + 1), fill_value=0)\n", - " return counts * (60 / width)\n", - "\n", - "# NEW\n", - "rate_rep_new = rate(new_df, reposition_new, \"depart_bin\", 10)\n", - "rate_srv_new = rate(new_df, servicing_new, \"depart_bin\", 10)\n", - "rate_ref_new = rate(new_df, refueling_new, \"depart_bin\", 10)\n", - "# OLD\n", - "rate_rep_old = rate(old_df, reposition_old, \"startPeriod\", 5)\n", - "rate_srv_old = rate(old_df, servicing_old, \"startPeriod\", 5)\n", - "rate_ref_old = rate(old_df, refueling_old, \"startPeriod\", 5)\n", - "\n", - "ymax = float(pd.concat([\n", - " rate_rep_new, rate_srv_new, rate_ref_new,\n", - " rate_rep_old, rate_srv_old, rate_ref_old\n", - "]).max()) * 1.05\n", - "\n", - "# OLD plot\n", - "fig_old = go.Figure()\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_rep_old.index*5, unit=\"m\"),\n", - " y=rate_rep_old.values, mode=\"lines\", name=\"Repositioning\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_srv_old.index*5, unit=\"m\"),\n", - " y=rate_srv_old.values, mode=\"lines\", name=\"Servicing\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_ref_old.index*5, unit=\"m\"),\n", - " y=rate_ref_old.values, mode=\"lines\", name=\"Refueling\"))\n", - "fig_old.update_layout(title=\"OLD — Trips per Hour by Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_old.show()\n", - "\n", - "# NEW plot\n", - "fig_new = go.Figure()\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_rep_new.index*10, unit=\"m\"),\n", - " y=rate_rep_new.values, mode=\"lines\", name=\"Repositioning\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_srv_new.index*10, unit=\"m\"),\n", - " y=rate_srv_new.values, mode=\"lines\", name=\"Servicing\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time+pd.to_timedelta(rate_ref_new.index*10, unit=\"m\"),\n", - " y=rate_ref_new.values, mode=\"lines\", name=\"Refueling\"))\n", - "fig_new.update_layout(title=\"NEW — Trips per Hour by Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"Trips per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_new.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Repositioning", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Servicing", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:45:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T19:55:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:05:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:15:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:25:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:35:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:45:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T20:55:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:05:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:15:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:25:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:35:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:45:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T21:55:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:05:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:15:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:25:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:35:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:45:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T22:55:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:05:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:15:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:25:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:35:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:45:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-01T23:55:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:05:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:15:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:25:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:35:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:45:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T00:55:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:05:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:15:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:25:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:35:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:45:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T01:55:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:05:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:15:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:25:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:35:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:45:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T02:55:00.000000000" - ], - "y": { - "bdata": "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", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refueling", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:05:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:15:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:25:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:35:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:45:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T03:55:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:05:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:15:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:25:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:35:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:45:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T04:55:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:05:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:15:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:25:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:35:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:45:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T05:55:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:05:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:15:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:25:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:35:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:45:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T06:55:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:05:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:15:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:25:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:35:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:45:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T07:55:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:05:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:15:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:25:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:35:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:45:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T08:55:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:05:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:15:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:25:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:35:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:45:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T09:55:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:05:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:15:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:25:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:35:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:45:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T10:55:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:05:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:15:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:25:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:35:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:45:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T11:55:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:05:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:15:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:25:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:35:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:45:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T12:55:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:05:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:15:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:25:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:35:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:45:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T13:55:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:05:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:15:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:25:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:35:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:45:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T14:55:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:05:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:15:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:25:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:35:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:45:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T15:55:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:05:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:15:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:25:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:35:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:45:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T16:55:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:05:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:15:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:25:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:35:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:45:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T17:55:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:05:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:15:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:25:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:35:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:45:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T18:55:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:05:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:15:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:25:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:35:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBrxg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAKWZ7QA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "OLD — VMT per Hour by Trip Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 125453.2801536888 - ], - "title": { - "text": "VMT per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Repositioning", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AAAImOEET0AAADJR7nyBQAAA9mqZbIRAAADK03F4ikAAAEr6kKaRQAAA8YubWZJAAACeFpoLlUAAANifPfKVQAAA0Jn6iJJAAADLF+b8mEAAALI6bdCdQAAAmvFWv5tAAACPclMWr0AAANYHUAirQADAE4q+36tAAADpd/BLsUAAcFJ1/XW1QADAYUUPNrRAAOD2r8ycwkAAGCAXQLzBQACAtn3lHr1AANAmoLGdyUAAWKitpAbGQADQxUKlbMhAACgL3XS9zUAAENFFjtHLQAA4BcMMes5AAAjubWAay0AACOu0ncbKQACQrCe8Ps9AAChf8a80y0AAeLEUcGDIQAB4HHH3us1AANioLacNxUAAQF8IAwPGQABQkI4PjcVAAJhXPczwyEAAaN5diK3GQADw4L3SjshAAIA8jhyE0UAA/IRLbQ3QQADgdiAezs1AAGCKX4h6zEAACJmaX8nPQABIYXRikMxAAGR9VP/50kAAIGqqpZzQQACg4PZ/lc5AAGDTSoIMxEAA6L9XmGHFQADQUqFO3spAABDPas4CvkAAwBbE6ALAQAAwQR0D2MFAAFD5ha5rs0AAMEfugTS0QAAQVBBaabZAAEDaU8a5tEAAYIHLevi4QADgE2tCRblAAIDA70g7u0AAwPizn3e7QACArMKNirlAAKB2prw3vkAAAJ2Xb9O7QABA8k7HZLxAAKDCWpONvkAAEGJQjNjBQADIi4Fp9MFAAKCeaEERyEAAeBaT4pbGQAAgiOoAlsVAAMS19u5N0EAASMV0VQ/PQAAgftaar8xAAGAVnMZVykAAcJ3kiRzJQABIEg+5V8xAAOgGV9pUzkAA2LkiFKXPQAB8qCHEIdBAABg2H1eswEAAEILBw+y/QAD4TypywcFAAAhH3jyLxkAAqBTUN9DOQABYKsSXfcxAAIAzYaHOykAAkCfvyQXNQAC43aSiB8tAAJBOEwz5x0AAEO0Xj/XHQADIpuGc7cVAALhMNqxgxUAASKA6JozFQABYFd5mxsRAALCnU2kJxUAAgDI9VxjJQADgs+SNy8hAADDAkwFvxEAAOCmh3fPDQABouyw/tcJAAPCkXd1lwkAAkM03+PbBQACAO737x8RAAGDM+z+GwUAAUJT+hYm/QAAgPA3FJ8BAAECue+pAwEAAaDzjktXCQADgDRmYr8FAADAzZfM2tkAAQMtzwEy5QAAo+YXLRsNAAOAVlp3MvkAA8MiUOSq4QABQlUscjblAAFCVn5fiskAAYEyhPhy4QAAAmPqxZ61AAOAIGAMyskAAoJAUaW2qQACgOqMJ6bNAAABMq4mjrUAAIJxNSCyrQAAAUjMc7KpAAID8IJqThkAAAKejB+KJQAAAI1iR+IhAAAAI7CxGcUAAAB+lM7N+QAAAt5qbyIBAAACMn6gWe0AAAKi+lNeBQAAAvTOihIVAAADoxd6PeUAAAOrKX618QAAAUkpGMYBAAAASyqxVfkAAAJDKbQF+QAAAz8i2PnhAAACoFf/gg0AAAO8lJMqBQAAAzETUAHpA", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Servicing", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000" - ], - "y": { - "bdata": "AADQujdnq0AAAAwYYyCzQAAAoCKeya1AAAAUteJRqkAAwKZhST6zQADAfoXo2LNAAACACZ2OtEAAgOGTb0C1QAAAdCwRkbRAAID0DxKhv0AAAMOA7Uu5QACAnSR0rrlAAMC1VT7fyUAAgIG/hjXMQABgEi53y9BAAMD6uXX31EAAwGJAkubRQADgnDFECthAAEBM1kK03kAAuC9p5snfQACYxJWU/uBAANgEnuvT8EAAwIHdiz/yQABcOG+R1fBAAGD2OFmd9kAAblz+FYr4QAA4VKLQK/pAAPApSfBl+UAAqfepKxj3QABIYHjoW/lAACDQHd/W90AAzFtTEkv4QADqSOOy5fdAAFKUHFoW9EAAsNE3kDf1QACiltsFNvNAAIiAojd59kAA+EJJAhv2QABw/bAdMfdAAOwUc4MX+EAARolNCoj3QAC0BIcRyPZAAMCdpyxs9kAAKJqQBBz3QADCus5aPfZAAJ3qzZtz+UAAuDmUSqD5QAB4IcweBvhAAMwKP+9980AAlMfHA9fzQADIpLGtpfVAAN5a7p6h70AAt7RcdRrxQABkux+yMPFAAEBAGhws6kAAMB7c8ePqQACofa4Tv+xAALxO13/R7UAAeBhIATztQACIHBFlZ+pAAGhibiOP7UAATh2l4QfuQAAIOcUfpexAALhxCVC47kAA+W/sJEfxQACaEs5XlfBAAHlO0kHD8kAABM630HXxQAAqqOlJD/JAAFT7DRxg9EAABltcDY/1QAB83rnLbfVAAM5qfk/5+kAATdDNyeL5QACYL0Yp4fpAADzvjJxj+kAAZFdxvOL4QADUPtU4dPlAAKxLZ5T7/EAALSeUiZn7QADw6Qd1K/1AAAC3rYOE9EAAeNyebLv0QAAc7CXvDPVAAF4hUT7Z90AAkv7cIhH5QADoVszbM/hAAKpApVyj+EAAJtBwgoX4QABg3dZPifhAADZ/fPVm90AApHsivjn3QADYlx52d/dAAFI7DT969UAAzm+5SwP3QAC4gzdojvdAAAgymS/990AAiDRh3QL6QAAEJDDXFfhAAOCjWWLi80AADN7JkKz0QACepC/PivJAALhpwX9980AAv6+/2YT1QADMPzPpDfVAAOzr0oCI8kAARMBCC63yQABgN9xQjPJAAGynWGHX8kAAUPTezs3yQACkRMS5N/NAAJhaP0XW6EAAwOvn6JLnQABo58f55+tAALC9fiFL6UAAuPrCg6LoQABAx4o+BupAALBz1jUC4EAAENcS9VTjQACUA7LAr+JAAABev9Dg20AAcObddunZQACw4AySM95AACCCbzrD3UAAAI6wGfnXQABAwfYmz91AAABXa+2lwEAAAJ5hZ7a+QAAg5XJ6e8BAAAAc7WNmrUAAAFZWY8O0QAAAJHXZ4rxAAAA98/eetEAAgN7ln5e0QAAAZBSMJLNAAADcO+ZzpUAAAHqeYra2QAAADPdXM7dAAACaxGfbskAAAGAnkCGrQAAAXN6Iv6xAAAAn+58xtUAAgHVrPJKyQAAAMgoKTKlA", - "dtype": "f8" - } - }, - { - "mode": "lines", - "name": "Refueling", - "type": "scatter", - "x": [ - "2000-01-01T03:00:00.000000000", - "2000-01-01T03:10:00.000000000", - "2000-01-01T03:20:00.000000000", - "2000-01-01T03:30:00.000000000", - "2000-01-01T03:40:00.000000000", - "2000-01-01T03:50:00.000000000", - "2000-01-01T04:00:00.000000000", - "2000-01-01T04:10:00.000000000", - "2000-01-01T04:20:00.000000000", - "2000-01-01T04:30:00.000000000", - "2000-01-01T04:40:00.000000000", - "2000-01-01T04:50:00.000000000", - "2000-01-01T05:00:00.000000000", - "2000-01-01T05:10:00.000000000", - "2000-01-01T05:20:00.000000000", - "2000-01-01T05:30:00.000000000", - "2000-01-01T05:40:00.000000000", - "2000-01-01T05:50:00.000000000", - "2000-01-01T06:00:00.000000000", - "2000-01-01T06:10:00.000000000", - "2000-01-01T06:20:00.000000000", - "2000-01-01T06:30:00.000000000", - "2000-01-01T06:40:00.000000000", - "2000-01-01T06:50:00.000000000", - "2000-01-01T07:00:00.000000000", - "2000-01-01T07:10:00.000000000", - "2000-01-01T07:20:00.000000000", - "2000-01-01T07:30:00.000000000", - "2000-01-01T07:40:00.000000000", - "2000-01-01T07:50:00.000000000", - "2000-01-01T08:00:00.000000000", - "2000-01-01T08:10:00.000000000", - "2000-01-01T08:20:00.000000000", - "2000-01-01T08:30:00.000000000", - "2000-01-01T08:40:00.000000000", - "2000-01-01T08:50:00.000000000", - "2000-01-01T09:00:00.000000000", - "2000-01-01T09:10:00.000000000", - "2000-01-01T09:20:00.000000000", - "2000-01-01T09:30:00.000000000", - "2000-01-01T09:40:00.000000000", - "2000-01-01T09:50:00.000000000", - "2000-01-01T10:00:00.000000000", - "2000-01-01T10:10:00.000000000", - "2000-01-01T10:20:00.000000000", - "2000-01-01T10:30:00.000000000", - "2000-01-01T10:40:00.000000000", - "2000-01-01T10:50:00.000000000", - "2000-01-01T11:00:00.000000000", - "2000-01-01T11:10:00.000000000", - "2000-01-01T11:20:00.000000000", - "2000-01-01T11:30:00.000000000", - "2000-01-01T11:40:00.000000000", - "2000-01-01T11:50:00.000000000", - "2000-01-01T12:00:00.000000000", - "2000-01-01T12:10:00.000000000", - "2000-01-01T12:20:00.000000000", - "2000-01-01T12:30:00.000000000", - "2000-01-01T12:40:00.000000000", - "2000-01-01T12:50:00.000000000", - "2000-01-01T13:00:00.000000000", - "2000-01-01T13:10:00.000000000", - "2000-01-01T13:20:00.000000000", - "2000-01-01T13:30:00.000000000", - "2000-01-01T13:40:00.000000000", - "2000-01-01T13:50:00.000000000", - "2000-01-01T14:00:00.000000000", - "2000-01-01T14:10:00.000000000", - "2000-01-01T14:20:00.000000000", - "2000-01-01T14:30:00.000000000", - "2000-01-01T14:40:00.000000000", - "2000-01-01T14:50:00.000000000", - "2000-01-01T15:00:00.000000000", - "2000-01-01T15:10:00.000000000", - "2000-01-01T15:20:00.000000000", - "2000-01-01T15:30:00.000000000", - "2000-01-01T15:40:00.000000000", - "2000-01-01T15:50:00.000000000", - "2000-01-01T16:00:00.000000000", - "2000-01-01T16:10:00.000000000", - "2000-01-01T16:20:00.000000000", - "2000-01-01T16:30:00.000000000", - "2000-01-01T16:40:00.000000000", - "2000-01-01T16:50:00.000000000", - "2000-01-01T17:00:00.000000000", - "2000-01-01T17:10:00.000000000", - "2000-01-01T17:20:00.000000000", - "2000-01-01T17:30:00.000000000", - "2000-01-01T17:40:00.000000000", - "2000-01-01T17:50:00.000000000", - "2000-01-01T18:00:00.000000000", - "2000-01-01T18:10:00.000000000", - "2000-01-01T18:20:00.000000000", - "2000-01-01T18:30:00.000000000", - "2000-01-01T18:40:00.000000000", - "2000-01-01T18:50:00.000000000", - "2000-01-01T19:00:00.000000000", - "2000-01-01T19:10:00.000000000", - "2000-01-01T19:20:00.000000000", - "2000-01-01T19:30:00.000000000", - "2000-01-01T19:40:00.000000000", - "2000-01-01T19:50:00.000000000", - "2000-01-01T20:00:00.000000000", - "2000-01-01T20:10:00.000000000", - "2000-01-01T20:20:00.000000000", - "2000-01-01T20:30:00.000000000", - "2000-01-01T20:40:00.000000000", - "2000-01-01T20:50:00.000000000", - "2000-01-01T21:00:00.000000000", - "2000-01-01T21:10:00.000000000", - "2000-01-01T21:20:00.000000000", - "2000-01-01T21:30:00.000000000", - "2000-01-01T21:40:00.000000000", - "2000-01-01T21:50:00.000000000", - "2000-01-01T22:00:00.000000000", - "2000-01-01T22:10:00.000000000", - "2000-01-01T22:20:00.000000000", - "2000-01-01T22:30:00.000000000", - "2000-01-01T22:40:00.000000000", - "2000-01-01T22:50:00.000000000", - "2000-01-01T23:00:00.000000000", - "2000-01-01T23:10:00.000000000", - "2000-01-01T23:20:00.000000000", - "2000-01-01T23:30:00.000000000", - "2000-01-01T23:40:00.000000000", - "2000-01-01T23:50:00.000000000", - "2000-01-02T00:00:00.000000000", - "2000-01-02T00:10:00.000000000", - "2000-01-02T00:20:00.000000000", - "2000-01-02T00:30:00.000000000", - "2000-01-02T00:40:00.000000000", - "2000-01-02T00:50:00.000000000", - "2000-01-02T01:00:00.000000000", - "2000-01-02T01:10:00.000000000", - "2000-01-02T01:20:00.000000000", - "2000-01-02T01:30:00.000000000", - "2000-01-02T01:40:00.000000000", - "2000-01-02T01:50:00.000000000", - "2000-01-02T02:00:00.000000000", - "2000-01-02T02:10:00.000000000", - "2000-01-02T02:20:00.000000000", - "2000-01-02T02:30:00.000000000", - "2000-01-02T02:40:00.000000000", - "2000-01-02T02:50:00.000000000", - "2000-01-02T03:00:00.000000000", - "2000-01-02T03:10:00.000000000", - "2000-01-02T03:20:00.000000000", - "2000-01-02T03:30:00.000000000", - "2000-01-02T03:40:00.000000000" - ], - "y": { - "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCfXQxAAAAA5BplFEAAAEA3khlDQAAAAKqgCjRAAAAA0Sh6RkAAAEA5nntYQAAA4Hi5SGdAAABgpjmLZkAAAIDOsJhpQAAAeBAX5XFAAABgI8x8W0AAAESo+C1kQAAA8KmDkmxAAACw0GrXaEAAAOxhabRyQAAAmD3d3HhAAADoMBy+e0AAANBrCgGDQAAABM7J4YVAAAC6B2p0gUAAAKgdqAuHQAAA7zhalpFAAADs3yNejkAAACIPiaKIQAAAc0hGGJBAAABHo3iHkkAAABlZNFCSQAAAifeFsZdAAIA4SAyKoUAAAHZ6f5aXQAAAPruQ3qJAAID04WR9okAAgG/UnV+dQACAXiQDz6hAAIBB9JG3q0AAAKNl9WmjQABAWeuPAqNAAAAoNV9WpEAA4Ijn6ymlQAAAK8KUW6lAAAAMcAXnq0AAgO3HhkisQAAAPn0IKbBAAAAHxmccskAAgFKPKWGsQAAAvB9ZcbFAAEDeqmdFsUAAQBef2vCvQADA5c0aN7BAACBrPwaWsUAAIGaOK6qyQACA9k0Aa7JAAGBhUQeksUAAgDcoX+azQABA1YvrX7BAAIAH1xtysEAAQB8U94OxQADQfdU7CLRAAIAXSNGbs0AAoFWOGxa3QADQv8ek77NAAABcGey5tEAAgEKMg5W2QADAg1cAgrVAAKBLeNJ2tkAAAI7TdLC1QABADirbwLVAAGCGv+1euUAAQO9jiSO0QACAi5ITVbdAAED8hl41tUAAQN56kSG3QADgOMkMarNAAIDHkmjOskAAQHNweuqzQACg/Kuei7RAAAAyDYfds0AAMC5BBGOxQADgAETAxrFAAMBnYjKcsEAA4PruSiyvQAAA/GOPYK9AAICYM6q5qUAAQBi4mWCmQACA/yq4HaNAAEBpICvMp0AAgOjMqFagQACAnMKl/qJAAAAAcZWgo0AAgEv1ahaiQAAAbllbr5JAAAC9m8zOl0AAACt14XGbQACAYICy859AAAB5plPVnUAAAHYRtzeXQAAA1+GUqJJAAAAL5q6akEAAAJAdFR+FQAAAdFMi4YlAAAAAsKAIb0AAAIxzI0OOQAAAmPFAbJdAAABQlTuzZkAAADhfo8J6QAAA5N+xrG9AAACQsX3+YUAAABhztdZlQAAAiDsuAnhAAACgcebtcEAAAOCqDZBsQAAAgPi4IFpAAABA27bVW0AAABgGom91QAAAYCzrK1dAAAAg3KdYbkAAAADcz0JaQAAAAEBajWFAAAAAVMhAYkAAAADgikRaQA==", - "dtype": "f8" - } - } - ], - "layout": { - "hovermode": "x unified", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "NEW — VMT per Hour by Trip Type" - }, - "xaxis": { - "tickformat": "%H:%M", - "title": { - "text": "Time of Day" - } - }, - "yaxis": { - "range": [ - 0, - 125453.2801536888 - ], - "title": { - "text": "VMT per hour" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# VMT/hour by trip type — separate OLD vs NEW plots with same y-axis\n", - "\n", - "start_time = pd.Timestamp(\"2000-01-01 03:00:00\")\n", - "\n", - "# --- Categorize trips ---\n", - "# NEW: only say Repositioning, Servicing, Refueling; pickup but NOT deadhead => Servicing\n", - "tt = new_df[\"trip_type\"].astype(str).str.lower()\n", - "new_is_deadhead = (new_df[\"is_deadhead\"] == True)\n", - "new_reposition = tt.eq(\"pickup\") & new_is_deadhead\n", - "new_servicing = tt.eq(\"dropoff\") | (tt.eq(\"pickup\") & ~new_is_deadhead)\n", - "new_refueling = tt.eq(\"refuel\")\n", - "\n", - "# OLD: destinationPurpose (1/3=pickup, 2=dropoff, 4=refuel); pickup but NOT deadhead => Servicing\n", - "dp = pd.to_numeric(old_df[\" destinationPurpose\"], errors=\"coerce\")\n", - "occ = pd.to_numeric(old_df[\"occupancy\"], errors=\"coerce\").fillna(0)\n", - "old_is_deadhead = (occ == 0) & old_df[\"dropoffIdsAtOrigin\"].notna() & old_df[\"pickupIdsAtOrigin\"].isna()\n", - "old_reposition = dp.isin([1,3]) & old_is_deadhead\n", - "old_servicing = dp.eq(2) | (dp.isin([1,3]) & ~old_is_deadhead)\n", - "old_refueling = dp.eq(4)\n", - "\n", - "# ensure time columns on trip-distance tables\n", - "new_trips = new_trips.copy(); new_trips[\"depart_bin\"] = new_df[\"depart_bin\"].values\n", - "old_trips = old_trips.copy(); old_trips[\"startPeriod\"] = old_df[\"startPeriod\"].values\n", - "\n", - "# --- VMT/hour per type ---\n", - "# NEW (10-min bins)\n", - "tmp = new_trips.loc[new_reposition, [\"depart_bin\",\"trip_dist\"]].dropna()\n", - "vmt_rep_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "tmp = new_trips.loc[new_servicing, [\"depart_bin\",\"trip_dist\"]].dropna()\n", - "vmt_srv_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "tmp = new_trips.loc[new_refueling, [\"depart_bin\",\"trip_dist\"]].dropna()\n", - "vmt_ref_new = tmp.groupby(tmp[\"depart_bin\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "if len(vmt_rep_new): vmt_rep_new = vmt_rep_new.reindex(pd.RangeIndex(0, vmt_rep_new.index.max()+1), fill_value=0.0)\n", - "if len(vmt_srv_new): vmt_srv_new = vmt_srv_new.reindex(pd.RangeIndex(0, vmt_srv_new.index.max()+1), fill_value=0.0)\n", - "if len(vmt_ref_new): vmt_ref_new = vmt_ref_new.reindex(pd.RangeIndex(0, vmt_ref_new.index.max()+1), fill_value=0.0)\n", - "vmt_rep_new *= (60/10); vmt_srv_new *= (60/10); vmt_ref_new *= (60/10)\n", - "\n", - "# OLD (5-min bins)\n", - "tmp = old_trips.loc[old_reposition, [\"startPeriod\",\"trip_dist\"]].dropna()\n", - "vmt_rep_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "tmp = old_trips.loc[old_servicing, [\"startPeriod\",\"trip_dist\"]].dropna()\n", - "vmt_srv_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "tmp = old_trips.loc[old_refueling, [\"startPeriod\",\"trip_dist\"]].dropna()\n", - "vmt_ref_old = tmp.groupby(tmp[\"startPeriod\"].astype(int))[\"trip_dist\"].sum().sort_index()\n", - "if len(vmt_rep_old): vmt_rep_old = vmt_rep_old.reindex(pd.RangeIndex(0, vmt_rep_old.index.max()+1), fill_value=0.0)\n", - "if len(vmt_srv_old): vmt_srv_old = vmt_srv_old.reindex(pd.RangeIndex(0, vmt_srv_old.index.max()+1), fill_value=0.0)\n", - "if len(vmt_ref_old): vmt_ref_old = vmt_ref_old.reindex(pd.RangeIndex(0, vmt_ref_old.index.max()+1), fill_value=0.0)\n", - "vmt_rep_old *= (60/5); vmt_srv_old *= (60/5); vmt_ref_old *= (60/5)\n", - "\n", - "# common y-axis\n", - "ymax = float(pd.concat([vmt_rep_new, vmt_srv_new, vmt_ref_new, vmt_rep_old, vmt_srv_old, vmt_ref_old]).max()) * 1.05\n", - "\n", - "# OLD plot\n", - "fig_old = go.Figure()\n", - "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_rep_old.index * 5, unit=\"m\"),\n", - " y=vmt_rep_old.values, mode=\"lines\", name=\"Repositioning\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_srv_old.index * 5, unit=\"m\"),\n", - " y=vmt_srv_old.values, mode=\"lines\", name=\"Servicing\"))\n", - "fig_old.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_ref_old.index * 5, unit=\"m\"),\n", - " y=vmt_ref_old.values, mode=\"lines\", name=\"Refueling\"))\n", - "fig_old.update_layout(title=\"OLD — VMT per Hour by Trip Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"VMT per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_old.show()\n", - "\n", - "# NEW plot\n", - "fig_new = go.Figure()\n", - "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_rep_new.index * 10, unit=\"m\"),\n", - " y=vmt_rep_new.values, mode=\"lines\", name=\"Repositioning\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_srv_new.index * 10, unit=\"m\"),\n", - " y=vmt_srv_new.values, mode=\"lines\", name=\"Servicing\"))\n", - "fig_new.add_trace(go.Scatter(x=start_time + pd.to_timedelta(vmt_ref_new.index * 10, unit=\"m\"),\n", - " y=vmt_ref_new.values, mode=\"lines\", name=\"Refueling\"))\n", - "fig_new.update_layout(title=\"NEW — VMT per Hour by Trip Type\",\n", - " xaxis_title=\"Time of Day\", yaxis_title=\"VMT per hour\",\n", - " hovermode=\"x unified\", xaxis=dict(tickformat=\"%H:%M\"),\n", - " yaxis=dict(range=[0, ymax]))\n", - "fig_new.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OLD — Total VMT by trip type\n", - " Repositioning: 593,419 (34.32%)\n", - " Servicing: 1,135,572 (65.67%)\n", - " Refueling: 90 (0.01%)\n", - " Total: 1,729,081\n", - "\n", - "NEW — Total VMT by trip type\n", - " Repositioning: 200,350 (11.67%)\n", - " Servicing: 1,468,059 (85.53%)\n", - " Refueling: 48,012 (2.80%)\n", - " Total: 1,716,421\n" - ] - } - ], - "source": [ - "# Add: total distance and share by trip type (using trip_dist from earlier join)\n", - "# assumes new_trips and old_trips already have 'trip_dist' (from skim lookup)\n", - "\n", - "# --- NEW ---\n", - "reposition_new_dist = new_trips.loc[reposition_new, \"trip_dist\"].sum()\n", - "servicing_new_dist = new_trips.loc[servicing_new, \"trip_dist\"].sum()\n", - "refueling_new_dist = new_trips.loc[refueling_new, \"trip_dist\"].sum()\n", - "total_new_dist = reposition_new_dist + servicing_new_dist + refueling_new_dist\n", - "\n", - "# --- OLD ---\n", - "reposition_old_dist = old_trips.loc[reposition_old, \"trip_dist\"].sum()\n", - "servicing_old_dist = old_trips.loc[servicing_old, \"trip_dist\"].sum()\n", - "refueling_old_dist = old_trips.loc[refueling_old, \"trip_dist\"].sum()\n", - "total_old_dist = reposition_old_dist + servicing_old_dist + refueling_old_dist\n", - "\n", - "print(\"OLD — Total VMT by trip type\")\n", - "print(f\" Repositioning: {reposition_old_dist:,.0f} ({reposition_old_dist/total_old_dist:,.2%})\")\n", - "print(f\" Servicing: {servicing_old_dist:,.0f} ({servicing_old_dist/total_old_dist:,.2%})\")\n", - "print(f\" Refueling: {refueling_old_dist:,.0f} ({refueling_old_dist/total_old_dist:,.2%})\")\n", - "print(f\" Total: {total_old_dist:,.0f}\\n\")\n", - "\n", - "print(\"NEW — Total VMT by trip type\")\n", - "print(f\" Repositioning: {reposition_new_dist:,.0f} ({reposition_new_dist/total_new_dist:,.2%})\")\n", - "print(f\" Servicing: {servicing_new_dist:,.0f} ({servicing_new_dist/total_new_dist:,.2%})\")\n", - "print(f\" Refueling: {refueling_new_dist:,.0f} ({refueling_new_dist/total_new_dist:,.2%})\")\n", - "print(f\" Total: {total_new_dist:,.0f}\")\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "activitysim", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.18" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py b/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py deleted file mode 100644 index fe4e3ca70..000000000 --- a/src/asim/scripts/taxi_tnc_routing/create_test_taxi_tnc_routing_scenario.py +++ /dev/null @@ -1,69 +0,0 @@ -import numpy as np -import pandas as pd -import openmatrix as omx -import os - -# Target folder (adjust if you want elsewhere) -OUT_DIR = r"C:\Users\david.hensle\OneDrive - Resource Systems Group, Inc\Documents\projects\sandag\AV_TNC_models\tnc_data\test" -os.makedirs(OUT_DIR, exist_ok=True) - -np.random.seed(42) - -# 1. Create a 10-zone skim (minutes) – simple linear distances -# Time = 3 * |i-j| + 2 (off-diagonal), 0 on diagonal -ZONES = np.arange(1, 11) # 1..10 -n = len(ZONES) -skim = np.zeros((n, n), dtype=np.float32) -for i in range(n): - for j in range(n): - if i != j: - skim[i, j] = 3 * abs(i - j) + 2 # ensures small clusters within buffer 10 - -print(f"skim:\n{skim}") - -# 2. Write OpenMatrix file with mapping -omx_path = os.path.join(OUT_DIR, "traffic_skims_AM.omx") -if os.path.exists(omx_path): - os.remove(omx_path) - -with omx.open_file(omx_path, "w") as f: - f["SOV_TR_H_TIME__AM"] = skim - # Mapping: zone id -> index - f.create_mapping("ZONE_MAP", ZONES) - -print(f"Wrote skim to {omx_path}") - -# 3. Land use MAZ→TAZ (1:1 for this test) -land_use = pd.DataFrame({ - "MAZ": ZONES, - "taz": ZONES -}) -land_use.to_csv(os.path.join(OUT_DIR, "land_use.csv"), index=False) -print("Wrote land_use.csv") - -# 4. Create trips (half-hour depart periods, some clustered to allow pooling) -# depart is in half-hour bins (your code multiplies by 30 then adds random 0–29) -trips = pd.DataFrame([ - # group A (zones 1–4) – several close OD pairs - (1001, "TNC_SHARED", 0, 1, 3), - (1002, "TNC_SHARED", 0, 2, 4), - (1003, "TNC_SHARED", 0, 1, 4), - (1004, "TNC_SHARED", 0, 3, 2), - (1005, "TNC_SHARED", 0, 2, 1), - (1006, "TNC_SHARED", 0, 4, 1), - # group B (zones 6–8) – another cluster - (1010, "TNC_SHARED", 0, 6, 8), - (1011, "TNC_SHARED", 0, 7, 6), - (1012, "TNC_SHARED", 0, 8, 6), - (1013, "TNC_SHARED", 0, 6, 7), - # mixed / farther (some won’t pool) - (1020, "TNC_SHARED", 0, 1, 9), - (1021, "TNC_SHARED", 0, 9, 2), - (1022, "TNC_SHARED", 0, 4, 8), - (1023, "TNC_SHARED", 0, 8, 4), -], columns=["trip_id", "trip_mode", "depart", "origin", "destination"]) - -trips.to_csv(os.path.join(OUT_DIR, "final_tnc_trips.csv"), index=False) -print("Wrote final_tnc_trips.csv") - -print("Test dataset ready.") \ No newline at end of file From 5cac8ceeff75f0c1393b87ccaec78a0507da9a99 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Fri, 30 Jan 2026 15:48:47 -0800 Subject: [PATCH 44/53] integrating updated MAAS into master run --- .../taxi_tnc_routing/taxi_tnc_routing.py | 15 ++++- src/main/emme/toolbox/master_run.py | 5 +- src/main/resources/runSandagAbm_MAAS.cmd | 63 ++++--------------- 3 files changed, 27 insertions(+), 56 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 5c7bd43cb..fe13c909b 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -174,7 +174,20 @@ def load_settings( TaxiTNCSettings Validated settings object containing all TNC routing configuration. """ - with open(os.path.join(os.path.dirname(__file__), yaml_path), "r") as f: + # Try yaml_path as-is, then relative to project_dir, then relative to script dir + script_dir = os.path.dirname(os.path.abspath(__file__)) + candidates = [ + yaml_path, + os.path.join(project_dir, yaml_path), + os.path.join(script_dir, yaml_path), + ] + settings_file = next((p for p in candidates if os.path.exists(p)), None) + if settings_file is None: + raise FileNotFoundError( + f"Settings file not found: tried {candidates}" + ) + + with open(settings_file, "r") as f: data = yaml.safe_load(f) # Resolve relative paths in settings relative to project_dir diff --git a/src/main/emme/toolbox/master_run.py b/src/main/emme/toolbox/master_run.py index 464c42dbc..9d4cda3a1 100644 --- a/src/main/emme/toolbox/master_run.py +++ b/src/main/emme/toolbox/master_run.py @@ -676,11 +676,10 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, # raise Exception("Error in skim shared memory manager, view logbook for details") if not skipMAASModel[iteration]: - self.run_proc("runMtxMgr.cmd", [drive, drive + path_no_drive], "Start matrix manager") self.run_proc( "runSandagAbm_MAAS.cmd", - [drive, drive + path_forward_slash, 1, 0], - "Java-Run AV allocation model and TNC routing model", capture_output=True) + [drive, drive + path_forward_slash], + "Python Taxi and TNC routing model + AV and TNC matrix builder", capture_output=True) if (not skipCVMEstablishmentSyn) and (iteration == 0): self.run_proc("cvmEst.bat", [drive, path_no_drive, cvm_emp_input_file], diff --git a/src/main/resources/runSandagAbm_MAAS.cmd b/src/main/resources/runSandagAbm_MAAS.cmd index 61b87b7d3..66dcfd96a 100644 --- a/src/main/resources/runSandagAbm_MAAS.cmd +++ b/src/main/resources/runSandagAbm_MAAS.cmd @@ -1,61 +1,20 @@ -rem @echo off +ECHO ON set PROJECT_DRIVE=%1 set PROJECT_DIRECTORY=%2 -set SAMPLERATE=%3 -set ITERATION=%4 %PROJECT_DRIVE% -cd %PROJECT_DRIVE%%PROJECT_DIRECTORY% -call %PROJECT_DIRECTORY%\bin\CTRampEnv.bat +cd /d %PROJECT_DIRECTORY% -rem ### First save the JAVA_PATH environment variable so it s value can be restored at the end. -set OLDJAVAPATH=%JAVA_PATH% +ECHO Activate ActivitySim Python Environment.... +CALL %activate_uv_asim% -rem ### Set the directory of the jdk version desired for this model run -rem ### Note that a jdk is required; a jre is not sufficient, as the UEC class generates -rem ### and compiles code during the model run, and uses javac in the jdk to do this. -set JAVA_PATH=%JAVA_64_PATH% +:: Run Taxi/TNC Routing Model +python src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py %PROJECT_DIRECTORY% --settings src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml || exit /b 2 +ECHO Taxi / TNC routing model run complete! -rem ### Name the project directory. This directory will hava data and runtime subdirectories -set RUNTIME=%PROJECT_DIRECTORY% -set CONFIG=%RUNTIME%/conf +:: Create demand matrices from AV and TNC vehicle trips +python src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py %PROJECT_DIRECTORY% --settings src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml || exit /b 2 - -set JAR_LOCATION=%PROJECT_DIRECTORY%/application -set LIB_JAR_PATH=%JAR_LOCATION%\* - -rem ### Define the CLASSPATH environment variable for the classpath needed in this model run. -set OLDCLASSPATH=%CLASSPATH% -set CLASSPATH=%CONFIG%;%RUNTIME%;%LIB_JAR_PATH%; - -rem ### Save the name of the PATH environment variable, so it can be restored at the end of the model run. -set OLDPATH=%PATH% - -rem ### Change the PATH environment variable so that JAVA_HOME is listed first in the PATH. -rem ### Doing this ensures that the JAVA_HOME path we defined above is the on that gets used in case other java paths are in PATH. -set PATH=%JAVA_PATH%\bin;%OLDPATH% - -rem run ping to add a pause so that hhMgr and mtxMgr have time to fully start -ping -n 10 %MAIN% > nul - -cd %PROJECT_DRIVE%%PROJECT_DIRECTORY% - -rem TNC Fleet Model -%JAVA_64_PATH%\bin\java -server -Xms%MEMORY_SPMARKET_MIN% -Xmx%MEMORY_SPMARKET_MAX% -cp "%CLASSPATH%" -Djxl.nowarnings=true -Dlog4j.configuration=log4j.xml -Dproject.folder=%PROJECT_DIRECTORY% org.sandag.abm.maas.TNCFleetModel %PROPERTIES_NAME% -iteration %ITERATION% -sampleRate %SAMPLERATE% || goto error - -rem Household AV Allocation Model -%JAVA_64_PATH%\bin\java -server -Xms%MEMORY_SPMARKET_MIN% -Xmx%MEMORY_SPMARKET_MAX% -cp "%CLASSPATH%" -Djxl.nowarnings=true -Dlog4j.configuration=log4j.xml -Dproject.folder=%PROJECT_DIRECTORY% org.sandag.abm.maas.HouseholdAVAllocationModelRunner %PROPERTIES_NAME% -iteration %ITERATION% -sampleRate %SAMPLERATE% || goto error -rem ### restore saved environment variable values, and change back to original current directory -set JAVA_PATH=%OLDJAVAPATH% -set PATH=%OLDPATH% -set CLASSPATH=%OLDCLASSPATH% - -goto :EOF - -:error -rem ### restore saved environment variable values, and change back to original current directory -set JAVA_PATH=%OLDJAVAPATH% -set PATH=%OLDPATH% -set CLASSPATH=%OLDCLASSPATH% -exit /b 2 \ No newline at end of file +ECHO AV/TNC matrix building complete! +ECHO %startTime%%Time% \ No newline at end of file From 1a497391c48d05eb86b7841231a42134b0a7b300 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 4 Feb 2026 20:43:49 -0800 Subject: [PATCH 45/53] Add sample rate argument to matrix builder --- .../taxi_tnc_routing/tnc_av_matrix_builder.py | 27 +++++++++++++++++-- src/main/emme/toolbox/master_run.py | 2 +- src/main/resources/runSandagAbm_MAAS.cmd | 3 ++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py index 94a2d533d..f4c17d11e 100644 --- a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py +++ b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py @@ -158,7 +158,7 @@ class TNCVehicleMatrixBuilder: Unique period labels (EA, AM, MD, PM, EV) """ - def __init__(self, settings: MatrixBuilderSettings): + def __init__(self, settings: MatrixBuilderSettings, sample_rate: float = 1.0): """ Initialize the matrix builder with settings. @@ -166,8 +166,13 @@ def __init__(self, settings: MatrixBuilderSettings): ---------- settings : MatrixBuilderSettings Configuration settings from YAML file. + sample_rate : float, optional + Sample rate used in the simulation (0-1). Output matrices will be + scaled by 1/sample_rate to expand to full population. Default is 1.0. """ self.settings = settings + self.sample_rate = sample_rate + self.expansion_factor = 1.0 / sample_rate self.skim_zone_mapping: Dict[int, int] = {} self.maz_to_taz: Dict[int, int] = {} self.zone_ids: Optional[np.ndarray] = None @@ -655,6 +660,9 @@ def _write_tnc_matrices( occ_trips = tnc_trips[tnc_trips["occ_bin"] == occ_bin] matrix = self._aggregate_to_matrix(occ_trips, period) + # Scale matrix by expansion factor (1/sample_rate) + matrix = matrix * self.expansion_factor + f[core_name] = matrix matrix_trips = matrix.sum() @@ -734,6 +742,9 @@ def _write_empty_av_matrices( else: matrix = self._aggregate_to_matrix(av_deadhead, period) + # Scale matrix by expansion factor (1/sample_rate) + matrix = matrix * self.expansion_factor + f[core_name] = matrix matrix_trips = matrix.sum() @@ -823,8 +834,19 @@ def main(): default="taxi_tnc_routing_settings.yaml", help="Path to settings YAML file (default: taxi_tnc_routing_settings.yaml)", ) + parser.add_argument( + "--sample-rate", + type=float, + default=1.0, + help="Sample rate (0-1) used in the simulation. Output matrices will be scaled " + "by 1/sample_rate to expand to full population. (default: 1.0)", + ) args = parser.parse_args() + # Validate sample rate + if not 0 < args.sample_rate <= 1: + raise ValueError(f"Sample rate must be between 0 and 1 (exclusive of 0), got: {args.sample_rate}") + # Resolve project directory to absolute path project_dir = os.path.abspath(os.path.expanduser(args.project_dir)) if not os.path.isdir(project_dir): @@ -845,9 +867,10 @@ def main(): logger.info("=" * 60) logger.info("TNC/AV Demand Matrix Builder") logger.info("=" * 60) + logger.info(f"Sample rate: {args.sample_rate}") try: - builder = TNCVehicleMatrixBuilder(settings) + builder = TNCVehicleMatrixBuilder(settings, sample_rate=args.sample_rate) builder.build_matrices() except Exception as e: logger.error(f"Error building matrices: {e}", exc_info=True) diff --git a/src/main/emme/toolbox/master_run.py b/src/main/emme/toolbox/master_run.py index 9d4cda3a1..0b6caeb1f 100644 --- a/src/main/emme/toolbox/master_run.py +++ b/src/main/emme/toolbox/master_run.py @@ -678,7 +678,7 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, if not skipMAASModel[iteration]: self.run_proc( "runSandagAbm_MAAS.cmd", - [drive, drive + path_forward_slash], + [drive, drive + path_forward_slash, str(sample_rate[iteration])], "Python Taxi and TNC routing model + AV and TNC matrix builder", capture_output=True) if (not skipCVMEstablishmentSyn) and (iteration == 0): diff --git a/src/main/resources/runSandagAbm_MAAS.cmd b/src/main/resources/runSandagAbm_MAAS.cmd index 66dcfd96a..ee7e8af57 100644 --- a/src/main/resources/runSandagAbm_MAAS.cmd +++ b/src/main/resources/runSandagAbm_MAAS.cmd @@ -2,6 +2,7 @@ ECHO ON set PROJECT_DRIVE=%1 set PROJECT_DIRECTORY=%2 +set SAMPLE_RATE=%3 %PROJECT_DRIVE% cd /d %PROJECT_DIRECTORY% @@ -14,7 +15,7 @@ python src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py %PROJECT_DIRECTORY ECHO Taxi / TNC routing model run complete! :: Create demand matrices from AV and TNC vehicle trips -python src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py %PROJECT_DIRECTORY% --settings src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml || exit /b 2 +python src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py %PROJECT_DIRECTORY% --settings src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml --sample-rate %SAMPLE_RATE% || exit /b 2 ECHO AV/TNC matrix building complete! ECHO %startTime%%Time% \ No newline at end of file From 25ba925a5fd2d8de9e70a9fde969daf80066b6cf Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 4 Feb 2026 20:48:10 -0800 Subject: [PATCH 46/53] putting all tnc routing settings in the yaml file --- .../scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index 8f7b6b654..3ff87e31d 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -41,10 +41,16 @@ single_tnc_modes: # determines how far apart trips in time can be to be considered for pooling time_bin_size: 10 +# maximum initial wait time (in minutes) for a vehicle before a new vehicle is created +max_wait_time: 15 + # buffer size comparing origins and destinations for potential pooling (in mins) pooling_buffer: 10 # maximum allowed detour time for pooled trips (in mins) max_detour: 15 +# batch size for matching pooled trips together and matching trips to vehicles +# this is used to decrease runtime by considering only this number of trips at a time +pair_batch_size: 6000 # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: refueling_stations From 837367a53ae831b4e9c687d1c873126b85c4f100 Mon Sep 17 00:00:00 2001 From: David Hensle Date: Wed, 11 Feb 2026 17:02:17 -0800 Subject: [PATCH 47/53] updating checks on written vs inputs with sample rate --- .../taxi_tnc_routing/tnc_av_matrix_builder.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py index f4c17d11e..40e234cd2 100644 --- a/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py +++ b/src/asim/scripts/taxi_tnc_routing/tnc_av_matrix_builder.py @@ -671,9 +671,11 @@ def _write_tnc_matrices( logger.info(f"Wrote TNC matrices to {omx_path}") - # Assert that all trips after zone mapping are written - assert abs(total_written - trips_after_zone_mapping) < 1e-6, ( - f"TNC trip count mismatch: {trips_after_zone_mapping} trips after zone mapping, " + # Assert that all trips after zone mapping are written (accounting for expansion) + expected_written = trips_after_zone_mapping * self.expansion_factor + assert abs(total_written - expected_written) < 1e-6, ( + f"TNC trip count mismatch: {trips_after_zone_mapping} trips after zone mapping " + f"* {self.expansion_factor} expansion = {expected_written:.0f} expected, " f"but {total_written:.0f} trips written to matrices" ) @@ -753,9 +755,11 @@ def _write_empty_av_matrices( logger.info(f"Wrote EmptyAV matrices to {omx_path}") - # Assert that all trips after zone mapping are written - assert abs(total_written - trips_after_zone_mapping) < 1e-6, ( - f"AV trip count mismatch: {trips_after_zone_mapping} trips after zone mapping, " + # Assert that all trips after zone mapping are written (accounting for expansion) + expected_written = trips_after_zone_mapping * self.expansion_factor + assert abs(total_written - expected_written) < 1e-6, ( + f"AV trip count mismatch: {trips_after_zone_mapping} trips after zone mapping " + f"* {self.expansion_factor} expansion = {expected_written:.0f} expected, " f"but {total_written:.0f} trips written to matrices" ) From b77c6b78c09da3dbae77903b0c46d8c5c6b61687 Mon Sep 17 00:00:00 2001 From: David Hensle <51132108+dhensle@users.noreply.github.com> Date: Sun, 12 Apr 2026 13:36:20 -0700 Subject: [PATCH 48/53] align settings --- .../taxi_tnc_routing/taxi_tnc_routing.py | 16 +++++++++++----- .../taxi_tnc_routing_settings.yaml | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index fe13c909b..8420248c3 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -48,13 +48,19 @@ class TaxiTNCSettings(BaseModel): Taxi / TNC route choice settings """ # path to activitysim output folder with trip data - asim_output_dir: str - asim_demand_files: list + asim_output_dir: str = "output" + asim_demand_files: list = [ + "airport.CBX\\final_cbxtrips", + "airport.SAN\\final_santrips", + "resident\\final_trips", + "visitor\\final_trips", + "crossborder\\final_trips", + ] # path to landuse file (relative to asim_output_dir) - asim_landuse_file: str = "resident\\final_land_use.csv" + asim_landuse_file: str = "resident\\final_land_use" # path to folder with skim data - skim_dir: str + skim_dir: str = "output\\skims" # name of skim matrix in OMX file minus time period suffix skim_time_core: str = "HOV2_H_TIME" skim_dist_core: str = "HOV2_H_DIST" @@ -69,7 +75,7 @@ class TaxiTNCSettings(BaseModel): ] # output folder for results - output_dir: str = "./output" + output_dir: str = "output\\tnc_routing" # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: list = ["TNC_SHARED"] diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml index 3ff87e31d..ec9bacb79 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml @@ -17,18 +17,29 @@ asim_demand_files: - resident\final_trips - visitor\final_trips - crossborder\final_trips + +# land use file used to map MAZ values to TAZ values asim_landuse_file: resident\final_land_use # name of skim matrix in OMX file minus time period suffix skim_time_core: HOV2_H_TIME + +# name of distance skim matrix in OMX file minus time period suffix skim_dist_core: HOV2_H_DIST -# time periods to process, should match network_los.yaml settings + +# skim time periods, should match network_los.yaml settings skim_periods: ['EA', 'AM', 'MD', 'PM', 'EV'] + +# period breakpoints used to map depart bins to skim periods periods: [0, 6, 12, 25, 32, 48] + +# skim file names aligned with skim_periods skim_files: ['traffic_skims_EA.omx', 'traffic_skims_AM.omx', 'traffic_skims_MD.omx', 'traffic_skims_PM.omx', 'traffic_skims_EV.omx'] # modes for shared and single occupancy TNC / taxi trips shared_tnc_modes: ['TNC_SHARED'] + +# modes for single occupancy TNC and taxi trips single_tnc_modes: - 'TNC_SINGLE' - 'TAXI' @@ -46,14 +57,20 @@ max_wait_time: 15 # buffer size comparing origins and destinations for potential pooling (in mins) pooling_buffer: 10 + # maximum allowed detour time for pooled trips (in mins) max_detour: 15 + # batch size for matching pooled trips together and matching trips to vehicles # this is used to decrease runtime by considering only this number of trips at a time pair_batch_size: 6000 +# maximum vehicle occupancy per trip record +max_vehicle_occupancy: 4 + # column in the landuse table that indicates the presence of refueling stations landuse_refuel_col: refueling_stations + # maximum distance (in miles) a vehicle can operate before refueling max_refuel_dist: 300 From 204bad9e5917c6484d9c82563a8cb4c7a55cd5b6 Mon Sep 17 00:00:00 2001 From: David Hensle <51132108+dhensle@users.noreply.github.com> Date: Sun, 12 Apr 2026 16:20:08 -0700 Subject: [PATCH 49/53] addressing review comments --- docs/design/demand/resident.md | 2 +- src/asim/configs/common/constants.yaml | 6 ++++++ src/asim/configs/resident/av_repositioning.csv | 9 +++++---- .../configs/resident/av_repositioning_preprocessor.csv | 5 +---- .../configs/resident/av_trip_matching_preprocessor.csv | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/design/demand/resident.md b/docs/design/demand/resident.md index 08acc8db1..2d05106ff 100644 --- a/docs/design/demand/resident.md +++ b/docs/design/demand/resident.md @@ -88,5 +88,5 @@ flowchart TD ``` -At this point, all tours are generated, scheduled, have a primary destination, and a selected tour mode. The next set of models fills in details about the tours - number of intermediate stops, location of each stop, the departure time of each stop, and the mode of each trip on the tour. For households that own autonomous vehicles, an additional [AV Routing Model](av-routing.md) is run after the resident model completes. This model simulates how household AVs are dispatched to serve household members' trips throughout the day. Finally, the parking location of each auto trip to the central business district (CBD) is determined. +At this point, all tours are generated, scheduled, have a primary destination, and a selected tour mode. The next set of models fills in details about the tours - number of intermediate stops, location of each stop, the departure time of each stop, and the mode of each trip on the tour. For households that own autonomous vehicles, an additional [AV Routing Model](av-routing.md) is run after trip mode choice and before parking location choice. This model simulates how household AVs are dispatched to serve household members' trips throughout the day. Finally, the parking location of each auto trip to the central business district (CBD) is determined. After the model is run, the output files listed above are created. The trip lists are then summarized into origin-destination matrices by time period and vehicle class or transit mode and assigned to the transport network. \ No newline at end of file diff --git a/src/asim/configs/common/constants.yaml b/src/asim/configs/common/constants.yaml index 8866f87e0..bbdcd6c90 100644 --- a/src/asim/configs/common/constants.yaml +++ b/src/asim/configs/common/constants.yaml @@ -281,3 +281,9 @@ SanYsidro_maz_id: {MGRAsOfInterest-portsOfEntry-sanYsidro:} OtayMesa_maz_id: {MGRAsOfInterest-portsOfEntry-otayMesa:} Tecate_maz_id: {MGRAsOfInterest-portsOfEntry-tecate:} OtayMesaEast_maz_id: {MGRAsOfInterest-portsOfEntry-otayMesaEast:} + +# -- AV routing settings -- +# Maximum benefit for keeping car close (min) +AV_maxBenefit: 60 +# Maximum duration for keeping car close (hrs), +AV_maxDuration: 1.5 diff --git a/src/asim/configs/resident/av_repositioning.csv b/src/asim/configs/resident/av_repositioning.csv index 28fa09c34..cc94404d2 100644 --- a/src/asim/configs/resident/av_repositioning.csv +++ b/src/asim/configs/resident/av_repositioning.csv @@ -1,10 +1,10 @@ Label,Description,Expression,stay_with_person,go_to_parking,go_home,service_next_trip_1,service_next_trip_2,service_next_trip_3 # stay with person utils,,,,,,,, util_cost_of_parking,Cost of parking at destination,parkingCost,coef_cost,,,,, -util_time_stay,Stay- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",coef_ivt,,,,, +util_time_stay,Stay- Need car soon,"@np.where(df.duration_hrs < AV_maxDuration, (-1)*(AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",coef_ivt,,,,, # go to parking utils,,,,,,,, util_remote_park_only_if_park_const,Can only use remote parking if in parking constrained zone,~parkingConstrained,,coef_unavailable,,,, -util_time_go_to_parking,Remote- Need car soon,"@np.where(df.duration_hrs < df.AV_maxDuration, (-1)*(df.AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",,coef_ivt,,,, +util_time_park,Remote- Need car soon,"@np.where(df.duration_hrs < AV_maxDuration, (-1)*(AV_maxBenefit + (df.duration_hrs*df.slope)), 0)",,coef_ivt,,,, util_remote_cost,Remote park - Cost of parking until departure,duration_hrs * RemoteParkingCostPerHour * 100,,coef_cost,,,, util_remote_ivt,in vehicle time to remote parking location,@v_to_parking_skim['SOV_TR_H_TIME'],,coef_ivt,,,, util_remote_rel,reliability vehicle location to remote parking location,"@v_to_parking_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_parking_skim['SOV_TR_H_DIST'])",,coef_ivt,,,, @@ -12,6 +12,7 @@ util_remote_auto_cost,auto operating cost from vehicle location to remote parkin # go home utils,,,,,,,, util_already_at_home,Unavailable if already at home destination,destination == home_zone_id,,,coef_unavailable,,, util_home_ivt,in vehicle time to go home,@v_to_home_skim['SOV_TR_H_TIME'],,,coef_ivt,,, +# *14 multiplier to convert from ivt to reliability just like tour mode choice,,,,,,,, util_home_rel,reliability vehicle location to home,"@v_to_home_skim['SOV_TR_H_REL'] * 14 / np.maximum(0.1, v_to_home_skim['SOV_TR_H_DIST'])",,,coef_ivt,,, util_home_auto_cost,auto operating cost from vehicle location to home,@(v_to_home_skim['SOV_TR_H_DIST'] * costPerMile * autoCostPerMileFactorAV) + v_to_home_skim['SOV_TR_H_TOLLCOST'],,,coef_cost,,, # service next trip util 1,,,,,,,, @@ -20,12 +21,12 @@ util_next1_ivt,in vehicle time to next trip 1 origin,v_to_trip_orig1_time,,,,coe util_next1_rel,reliability vehicle location to next trip 1 origin,"@df.v_to_trip_orig1_rel * 14 / np.maximum(0.1, df.v_to_trip_orig1_dist)",,,,coef_ivt,, util_next1_auto_cost,auto operating cost from vehicle location to next trip 1 origin,@(df.v_to_trip_orig1_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig1_toll,,,,coef_cost,, # service next trip util 2,,,,,,,, -util_next_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,,coef_unavailable, +util_next2_trip_available,Unavailable if no next trip,next_trip_id_2 == -1,,,,,coef_unavailable, util_next2_ivt,in vehicle time to next trip 2 origin,v_to_trip_orig2_time,,,,,coef_ivt, util_next2_rel,reliability vehicle location to next trip 2 origin,"@df.v_to_trip_orig2_rel * 14 / np.maximum(0.2, df.v_to_trip_orig2_dist)",,,,,coef_ivt, util_next2_auto_cost,auto operating cost from vehicle location to next trip 2 origin,@(df.v_to_trip_orig2_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig2_toll,,,,,coef_cost, # service next trip util 3,,,,,,,, -util_next_trip_available_3,Unavailable if no next trip 3,next_trip_id_3 == -1,,,,,,coef_unavailable +util_next3_trip_available,Unavailable if no next trip 3,next_trip_id_3 == -1,,,,,,coef_unavailable util_next3_ivt,in vehicle time to next trip 3 origin,v_to_trip_orig3_time,,,,,,coef_ivt util_next3_rel,reliability vehicle location to next trip 3 origin,"@df.v_to_trip_orig3_rel * 14 / np.maximum(0.3, df.v_to_trip_orig3_dist)",,,,,,coef_ivt util_next3_auto_cost,auto operating cost from vehicle location to next trip 3 origin,@(df.v_to_trip_orig3_dist * costPerMile * autoCostPerMileFactorAV) + df.v_to_trip_orig3_toll,,,,,,coef_cost diff --git a/src/asim/configs/resident/av_repositioning_preprocessor.csv b/src/asim/configs/resident/av_repositioning_preprocessor.csv index 41181fbb9..675db7b1f 100644 --- a/src/asim/configs/resident/av_repositioning_preprocessor.csv +++ b/src/asim/configs/resident/av_repositioning_preprocessor.csv @@ -1,7 +1,6 @@ Description,Target,Expression next trip start time,next_depart,df['trip_id'].map(trips.groupby('tour_id')['depart'].shift(-1).to_dict()) trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" -duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" #Parking cost calculation,, ,tour_id,"reindex(trips.tour_id, df.trip_id)" ,tour_type,"reindex(tours.tour_type, tour_id)" @@ -29,9 +28,7 @@ Effective parking cost for reimbursed parkers,_parkingCost,"np.where(is_indiv*re Effective parking cost,parkingCost,"np.where(is_joint+is_indiv*(1-reimbursePurpose), parkingCostBeforeReimb,_parkingCost)" Parking cost is 0 if going home,parkingCost,"np.where(df.destination == df.home_zone_id, 0, parkingCost)" # These following two are from AutonomousVehicleAllocationChoice.xls,, -Maximim benefit for keeping car close (min),AV_maxBenefit,60 -Maximum duration for keeping car close (hrs),AV_maxDuration,1.5 -Slope of benefit calculation,slope, (-1)*(AV_maxBenefit / AV_maxDuration) +Slope of benefit calculation,slope,(-1)*(AV_maxBenefit / AV_maxDuration) # below taken from parametersByYear.csv,, ,RemoteParkingCostPerHour,0.81 #,, diff --git a/src/asim/configs/resident/av_trip_matching_preprocessor.csv b/src/asim/configs/resident/av_trip_matching_preprocessor.csv index 29e1d7fc6..f24621207 100644 --- a/src/asim/configs/resident/av_trip_matching_preprocessor.csv +++ b/src/asim/configs/resident/av_trip_matching_preprocessor.csv @@ -1,4 +1,4 @@ Description,Target,Expression next trip start time,next_depart,df['trip_id'].map(trips.groupby('tour_id')['depart'].shift(-1).to_dict()) -trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) * 2" -duration benefit,duration_benefit,"np.where((duration_hrs < 1.5) & (duration_hrs > 0), 60 - (60/1.5 * duration_hrs), 0)" +trip duration,duration_hrs,"np.where(next_depart.isna(), 0, next_depart - df.depart) / 2" +duration benefit,duration_benefit,"-1*np.where((duration_hrs < AV_maxDuration) & (duration_hrs > 0), AV_maxBenefit - (AV_maxBenefit/AV_maxDuration * duration_hrs), 0)" From 28fde754961780bd696afd18ff7af9cca976c6d9 Mon Sep 17 00:00:00 2001 From: JiaXu1024 Date: Fri, 10 Jul 2026 11:52:43 -0700 Subject: [PATCH 50/53] update environment to asim_151 to run MAAS --- src/main/resources/runSandagAbm_MAAS.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/runSandagAbm_MAAS.cmd b/src/main/resources/runSandagAbm_MAAS.cmd index ee7e8af57..3aa207085 100644 --- a/src/main/resources/runSandagAbm_MAAS.cmd +++ b/src/main/resources/runSandagAbm_MAAS.cmd @@ -8,7 +8,7 @@ set SAMPLE_RATE=%3 cd /d %PROJECT_DIRECTORY% ECHO Activate ActivitySim Python Environment.... -CALL %activate_uv_asim% +CALL %activate_uv_asim_151% :: Run Taxi/TNC Routing Model python src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py %PROJECT_DIRECTORY% --settings src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing_settings.yaml || exit /b 2 From 913680051431c99f1ed7016ecbc6f8e079c78065 Mon Sep 17 00:00:00 2001 From: JiaXu1024 Date: Fri, 10 Jul 2026 16:03:58 -0700 Subject: [PATCH 51/53] remove duplicate key AV_maxBenefit and AV_maxDuration in constants config file --- src/asim/configs/common/constants.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/asim/configs/common/constants.yaml b/src/asim/configs/common/constants.yaml index bbdcd6c90..8866f87e0 100644 --- a/src/asim/configs/common/constants.yaml +++ b/src/asim/configs/common/constants.yaml @@ -281,9 +281,3 @@ SanYsidro_maz_id: {MGRAsOfInterest-portsOfEntry-sanYsidro:} OtayMesa_maz_id: {MGRAsOfInterest-portsOfEntry-otayMesa:} Tecate_maz_id: {MGRAsOfInterest-portsOfEntry-tecate:} OtayMesaEast_maz_id: {MGRAsOfInterest-portsOfEntry-otayMesaEast:} - -# -- AV routing settings -- -# Maximum benefit for keeping car close (min) -AV_maxBenefit: 60 -# Maximum duration for keeping car close (hrs), -AV_maxDuration: 1.5 From 245b325f132bc6c5b58416a87038e15153b87fc5 Mon Sep 17 00:00:00 2001 From: JiaXu1024 Date: Mon, 13 Jul 2026 11:19:11 -0700 Subject: [PATCH 52/53] added iteration=msa_iteration to MAAS run_proc to generate log files for each iteration --- src/main/emme/toolbox/master_run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/emme/toolbox/master_run.py b/src/main/emme/toolbox/master_run.py index ac0fd6b23..07ae39d61 100644 --- a/src/main/emme/toolbox/master_run.py +++ b/src/main/emme/toolbox/master_run.py @@ -686,7 +686,7 @@ def __call__(self, main_directory, scenario_id, scenario_title, emmebank_title, self.run_proc( "runSandagAbm_MAAS.cmd", [drive, drive + path_forward_slash, str(sample_rate[iteration])], - "Python Taxi and TNC routing model + AV and TNC matrix builder", capture_output=True) + "Python Taxi and TNC routing model + AV and TNC matrix builder", capture_output=True, iteration=msa_iteration) if (not skipCVMEstablishmentSyn) and (iteration == 0): self.run_proc("cvmEst.bat", [drive, path_no_drive, cvm_emp_input_file], From 50960f0ff54b9b52662c30d313315e08ad6951b0 Mon Sep 17 00:00:00 2001 From: JiaXu1024 Date: Tue, 14 Jul 2026 14:38:32 -0700 Subject: [PATCH 53/53] to differentiate between resident, visitor, and crossborder trips by including the parent directory name when the basename is generic --- src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py index 8420248c3..0f6b23356 100644 --- a/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py +++ b/src/asim/scripts/taxi_tnc_routing/taxi_tnc_routing.py @@ -481,9 +481,16 @@ def read_input_data(self): df, fpath = self._read_data_file( fpath, "Demand file", columns=base_cols, optional_columns=[opt_col] ) - df["source"] = os.path.basename(fpath).replace(".parquet", "").replace( + # Extract parent directory and basename to create unique source names + parent_dir = os.path.basename(os.path.dirname(fpath)) + basename = os.path.basename(fpath).replace(".parquet", "").replace( ".csv.gz", "" ).replace(".csv", "").replace("final_", "") + # If basename is generic (e.g., "trips"), prepend parent directory for uniqueness + if basename == "trips": + df["source"] = f"{parent_dir}_{basename}" + else: + df["source"] = basename if opt_col in df.columns: df["trip_mode"] = df[opt_col] df.drop(columns=[opt_col], inplace=True)