Source code for quetzal.analysis.cost_benefit_analysis

import numpy as np
import pandas as pd


[docs]def od_weighted_time_delta(reference_od, scenario_od): columns = [ 'origin', 'destination', 'volume', 'volume_pt', 'volume_car', 'volume_walk', 'duration_car', 'duration_pt' ] ref = reference_od[columns].set_index(['origin', 'destination']) scen = scenario_od[columns].set_index(['origin', 'destination']) constant_pt = np.minimum(ref['volume_pt'], scen['volume_pt']) constant_car = np.minimum(ref['volume_car'], scen['volume_car']) duration_car_to_pt = scen['duration_pt'] - ref['duration_car'] duration_pt_to_car = scen['duration_car'] - ref['duration_pt'] volume_car_to_pt = np.maximum(ref['volume_car'] - scen['volume_car'], 0) volume_pt_to_car = np.maximum(scen['volume_car'] - ref['volume_car'], 0) delta = scen - ref weighted_time_delta = pd.DataFrame( { 'time_constant_pt': constant_pt * delta['duration_pt'], 'time_constant_car': constant_car * delta['duration_car'], 'time_car_to_pt': volume_car_to_pt * duration_car_to_pt, 'time_pt_to_car': volume_pt_to_car * duration_pt_to_car, 'volume_pt_to_car': volume_pt_to_car, 'volume_car_to_pt': volume_car_to_pt, 'duration_pt_to_car': duration_pt_to_car, 'duration_car_to_pt': duration_car_to_pt, 'volume_constant_pt': constant_pt, 'volume_constant_car': constant_car, 'duration_car': delta['duration_car'], 'duration_pt': delta['duration_pt'] } ) ordered_columns = [ 'volume_constant_pt', 'duration_pt', 'time_constant_pt', 'volume_constant_car', 'duration_car', 'time_constant_car', 'volume_car_to_pt', 'duration_car_to_pt', 'time_car_to_pt', 'volume_pt_to_car', 'duration_pt_to_car', 'time_pt_to_car' ] return weighted_time_delta[ordered_columns]