Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def cdap_fixed_relative_proportions():
"""
spec to compute/specify the relative proportions of each activity (M, N, H)
that should be used to choose activities for additional household members
not handled by CDAP
This spec is handled much like an activitysim logit utility spec,
EXCEPT that the values computed are relative proportions, not utilities
(i.e. values are not exponentiated before being normalized to probabilities summing to 1.0)
"""
return simulate.read_model_spec(file_name='cdap_fixed_relative_proportions.csv')
def atwork_subtour_destination_sample(
tours,
persons_merged,
skim_dict,
destination_size_terms,
chunk_size, trace_hh_id):
trace_label = 'atwork_subtour_location_sample'
model_settings = config.read_model_settings('atwork_subtour_destination.yaml')
model_spec = simulate.read_model_spec(file_name='atwork_subtour_destination_sample.csv')
# merge persons into tours
choosers = pd.merge(tours, persons_merged, left_on='person_id', right_index=True)
# FIXME - MEMORY HACK - only include columns actually used in spec
chooser_columns = model_settings['SIMULATE_CHOOSER_COLUMNS']
choosers = choosers[chooser_columns]
constants = config.get_model_constants(model_settings)
sample_size = model_settings["SAMPLE_SIZE"]
alt_dest_col_name = model_settings["ALT_DEST_COL_NAME"]
logger.info("Running atwork_subtour_location_sample with %d tours", len(choosers))
# create wrapper with keys for this lookup - in this case there is a workplace_taz
# in the choosers and a TAZ in the alternatives which get merged during interaction
def mandatory_tour_frequency(persons_merged,
chunk_size,
trace_hh_id):
"""
This model predicts the frequency of making mandatory trips (see the
alternatives above) - these trips include work and school in some combination.
"""
trace_label = 'mandatory_tour_frequency'
model_settings = config.read_model_settings('mandatory_tour_frequency.yaml')
model_spec = simulate.read_model_spec(file_name='mandatory_tour_frequency.csv')
alternatives = simulate.read_model_alts(
config.config_file_path('mandatory_tour_frequency_alternatives.csv'), set_index='alt')
choosers = persons_merged.to_frame()
# filter based on results of CDAP
choosers = choosers[choosers.cdap_activity == 'M']
logger.info("Running mandatory_tour_frequency with %d persons", len(choosers))
# - if no mandatory tours
if choosers.shape[0] == 0:
add_null_results(trace_label, model_settings)
return
# - preprocessor
preprocessor_settings = model_settings.get('preprocessor', None)
if preprocessor_settings:
tours,
persons_merged,
skim_dict,
land_use, size_terms,
chunk_size,
trace_hh_id):
"""
Given the tour generation from the above, each tour needs to have a
destination, so in this case tours are the choosers (with the associated
person that's making the tour)
"""
trace_label = 'non_mandatory_tour_destination'
model_settings = config.read_model_settings('non_mandatory_tour_destination.yaml')
model_spec = simulate.read_model_spec(file_name='non_mandatory_tour_destination_sample.csv')
tours = tours.to_frame()
persons_merged = persons_merged.to_frame()
alternatives = tour_destination_size_terms(land_use, size_terms, 'non_mandatory')
# choosers are tours - in a sense tours are choosing their destination
non_mandatory_tours = tours[tours.tour_category == 'non_mandatory']
# - if no mandatory_tours
if non_mandatory_tours.shape[0] == 0:
tracing.no_results(trace_label)
return
# FIXME - don't need all persons_merged columns...
choosers = pd.merge(non_mandatory_tours, persons_merged, left_on='person_id', right_index=True)
tours_merged,
skim_dict, skim_stack,
chunk_size, trace_hh_id):
"""
Trip mode choice - compute trip_mode (same values as for tour_mode) for each trip.
Modes for each primary tour putpose are calculated separately because they have different
coefficient values (stored in trip_mode_choice_coeffs.csv coefficient file.)
Adds trip_mode column to trip table
"""
trace_label = 'trip_mode_choice'
model_settings = config.read_model_settings('trip_mode_choice.yaml')
model_spec = \
simulate.read_model_spec(file_name=model_settings['SPEC'])
omnibus_coefficients = \
assign.read_constant_spec(config.config_file_path(model_settings['COEFFS']))
trips_df = trips.to_frame()
logger.info("Running %s with %d trips", trace_label, trips_df.shape[0])
tours_merged = tours_merged.to_frame()
tours_merged = tours_merged[model_settings['TOURS_MERGED_CHOOSER_COLUMNS']]
nest_spec = config.get_logit_model_settings(model_settings)
tracing.print_summary('primary_purpose',
trips_df.primary_purpose, value_counts=True)
# - trips_merged - merge trips and tours_merged
trips_merged = pd.merge(
# for 1 person households, there are no interactions to account for
# and the household utils are the same as the individual utils
choosers = vars = None
# extract the individual utilities for individuals from hhsize 1 households
utils = indiv_utils.loc[indiv_utils[_hh_size_] == 1, [_hh_id_, 'M', 'N', 'H']]
# index on household_id, not person_id
set_hh_index(utils)
else:
choosers = hh_choosers(indiv_utils, hhsize=hhsize)
spec = build_cdap_spec(interaction_coefficients, hhsize,
trace_spec=(trace_hh_id in choosers.index),
trace_label=trace_label)
utils = simulate.eval_utilities(spec, choosers, trace_label=trace_label)
if len(utils.index) == 0:
return pd.Series()
probs = logit.utils_to_probs(utils, trace_label=trace_label)
# select an activity pattern alternative for each household based on probability
# result is a series indexed on _hh_index_ with the (0 based) index of the column from probs
idx_choices, rands = logit.make_choices(probs, trace_label=trace_label)
# convert choice expressed as index into alternative name from util column label
choices = pd.Series(utils.columns[idx_choices].values, index=utils.index)
if trace_hh_id:
if hhsize > 1:
def run_school_location_simulate(
persons_merged,
location_sample_df,
skim_dict,
dest_size_terms,
model_settings,
chunk_size,
trace_hh_id,
trace_label):
"""
School location model on school_location_sample annotated with mode_choice logsum
to select a school_taz from sample alternatives
"""
model_spec = simulate.read_model_spec(file_name=model_settings['SPEC'])
if location_sample_df.empty:
logger.info("%s no school-goers" % trace_label)
choices = pd.Series()
else:
alt_dest_col_name = model_settings["ALT_DEST_COL_NAME"]
# create wrapper with keys for this lookup - in this case there is a TAZ in the choosers
# and a TAZ in the alternatives which get merged during interaction
# the skims will be available under the name "skims" for any @ expressions
skims = skim_dict.wrap("TAZ", alt_dest_col_name)
locals_d = {
----------
persons : pandas.DataFrame
DataFrame of individual persons data.
cdap_indiv_spec : pandas.DataFrame
CDAP spec applied to individuals.
Returns
-------
utilities : pandas.DataFrame
Will have index of `persons` and columns for each of the alternatives.
plus some 'useful columns' [_hh_id_, _ptype_, 'cdap_rank', _hh_size_]
"""
# calculate single person utilities
indiv_utils = simulate.eval_utilities(cdap_indiv_spec, persons, locals_d, trace_label)
# add columns from persons to facilitate building household interactions
useful_columns = [_hh_id_, _ptype_, 'cdap_rank', _hh_size_]
indiv_utils[useful_columns] = persons[useful_columns]
if trace_hh_id:
tracing.trace_df(indiv_utils, '%s.indiv_utils' % trace_label,
column_labels=['activity', 'person'])
return indiv_utils
# - run preprocessor to annotate tours_merged
preprocessor_settings = model_settings.get('preprocessor', None)
if preprocessor_settings:
# hack: preprocessor adds origin column in place if it does not exist already
od_skim_stack_wrapper = skim_dict.wrap('origin', 'destination')
skims = [od_skim_stack_wrapper]
locals_dict = {
"od_skims": od_skim_stack_wrapper
}
if constants is not None:
locals_dict.update(constants)
simulate.set_skim_wrapper_targets(tours_merged, skims)
# this should be pre-slice as some expressions may count tours by type
annotations = expressions.compute_columns(
df=tours_merged,
model_settings=preprocessor_settings,
locals_dict=locals_dict,
trace_label=trace_label)
assign_in_place(tours_merged, annotations)
tracing.print_summary('stop_frequency segments',
tours_merged.primary_purpose, value_counts=True)
choices_list = []
for segment_type, choosers in tours_merged.groupby('primary_purpose'):
def get_spec_for_purpose(model_settings, spec_name, purpose):
omnibus_spec = simulate.read_model_spec(file_name=model_settings[spec_name])
spec = omnibus_spec[[purpose]]
# might as well ignore any spec rows with 0 utility
spec = spec[spec.iloc[:, 0] != 0]
assert spec.shape[0] > 0
return spec