Skip to content

Commit

Permalink
Adding .name attributes to Segmented regression and lcm models.
Browse files Browse the repository at this point in the history
  • Loading branch information
jiffyclub committed Jun 16, 2014
1 parent 30c8d7a commit 524c4ea
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 6 deletions.
10 changes: 8 additions & 2 deletions urbansim/models/lcm.py
Expand Up @@ -566,14 +566,16 @@ class SegmentedMNLLocationChoiceModel(object):
the alternatives index is used.
default_model_expr : str, iterable, or dict, optional
A patsy model expression. Should contain only a right-hand side.
name : str, optional
An optional string used to identify the model in places.
"""
def __init__(self, segmentation_col, sample_size,
choosers_fit_filters=None, choosers_predict_filters=None,
alts_fit_filters=None, alts_predict_filters=None,
interaction_predict_filters=None,
estimation_sample_size=None,
choice_column=None, default_model_expr=None):
choice_column=None, default_model_expr=None, name=None):
self.segmentation_col = segmentation_col
self.sample_size = sample_size
self.choosers_fit_filters = choosers_fit_filters
Expand All @@ -585,6 +587,8 @@ def __init__(self, segmentation_col, sample_size,
self.choice_column = choice_column
self.default_model_expr = default_model_expr
self._group = MNLLocationChoiceModelGroup(segmentation_col)
self.name = (name if name is not None else
'SegmentedMNLLocationChoiceModel')

@classmethod
def from_yaml(cls, yaml_str=None, str_or_buffer=None):
Expand Down Expand Up @@ -618,7 +622,8 @@ def from_yaml(cls, yaml_str=None, str_or_buffer=None):
cfg['interaction_predict_filters'],
cfg['estimation_sample_size'],
cfg['choice_column'],
default_model_expr)
default_model_expr,
cfg['name'])

if "models" not in cfg:
cfg["models"] = {}
Expand Down Expand Up @@ -802,6 +807,7 @@ def to_dict(self):
"""
return {
'model_type': 'segmented_locationchoice',
'name': self.name,
'segmentation_col': self.segmentation_col,
'sample_size': self.sample_size,
'choosers_fit_filters': self.choosers_fit_filters,
Expand Down
12 changes: 10 additions & 2 deletions urbansim/models/regression.py
Expand Up @@ -589,19 +589,24 @@ class SegmentedRegressionModel(object):
the results reflect actual price.
By default no transformation is applied.
min_segment_size : int, optional
Segments with less than this many members will be skipped.
name : str, optional
A name used in places to identify the model.
"""
def __init__(
self, segmentation_col, fit_filters=None, predict_filters=None,
default_model_expr=None, default_ytransform=None,
min_segment_size=0):
min_segment_size=0, name=None):
self.segmentation_col = segmentation_col
self._group = RegressionModelGroup(segmentation_col)
self.fit_filters = fit_filters
self.predict_filters = predict_filters
self.default_model_expr = default_model_expr
self.default_ytransform = default_ytransform
self.min_segment_size = min_segment_size
self.name = name if name is not None else 'SegmentedRegressionModel'

@classmethod
def from_yaml(cls, yaml_str=None, str_or_buffer=None):
Expand Down Expand Up @@ -629,7 +634,8 @@ def from_yaml(cls, yaml_str=None, str_or_buffer=None):
seg = cls(
cfg['segmentation_col'], cfg['fit_filters'],
cfg['predict_filters'], default_model_expr,
YTRANSFORM_MAPPING[default_ytransform])
YTRANSFORM_MAPPING[default_ytransform], cfg['min_segment_size'],
cfg['name'])

if "models" not in cfg:
cfg["models"] = {}
Expand Down Expand Up @@ -784,9 +790,11 @@ def to_dict(self):
"""
return {
'model_type': 'segmented_regression',
'name': self.name,
'segmentation_col': self.segmentation_col,
'fit_filters': self.fit_filters,
'predict_filters': self.predict_filters,
'min_segment_size': self.min_segment_size,
'default_config': {
'model_expression': self.default_model_expr,
'ytransform': YTRANSFORM_MAPPING[self.default_ytransform]
Expand Down
3 changes: 2 additions & 1 deletion urbansim/models/tests/test_lcm.py
Expand Up @@ -194,12 +194,13 @@ def test_mnl_lcm_segmented_yaml(grouped_choosers, alternatives):
sample_size = 4

group = lcm.SegmentedMNLLocationChoiceModel(
'group', sample_size, default_model_expr=model_exp)
'group', sample_size, default_model_expr=model_exp, name='test_seg')
group.add_segment('x')
group.add_segment('y', 'var3 + var1:var2')

expected_dict = {
'model_type': 'segmented_locationchoice',
'name': 'test_seg',
'segmentation_col': 'group',
'sample_size': sample_size,
'choosers_fit_filters': None,
Expand Down
5 changes: 4 additions & 1 deletion urbansim/models/tests/test_regression.py
Expand Up @@ -320,15 +320,18 @@ def test_SegmentedRegressionModel_explicit(groupby_df):
def test_SegmentedRegressionModel_yaml(groupby_df):
seg = regression.SegmentedRegressionModel(
'group', fit_filters=['col1 not in [2]'],
predict_filters=['group != "z"'], default_model_expr='col1 ~ col2')
predict_filters=['group != "z"'], default_model_expr='col1 ~ col2',
min_segment_size=5000, name='test_seg')
seg.add_segment('x')
seg.add_segment('y', 'np.exp(col2) ~ np.exp(col1)', np.log)

expected_dict = {
'model_type': 'segmented_regression',
'name': 'test_seg',
'segmentation_col': 'group',
'fit_filters': ['col1 not in [2]'],
'predict_filters': ['group != "z"'],
'min_segment_size': 5000,
'default_config': {
'model_expression': 'col1 ~ col2',
'ytransform': None
Expand Down

0 comments on commit 524c4ea

Please sign in to comment.