Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/defaults/misc.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,7 +25,7 @@ def data_dir():
return '.'


@sim.injectable(cache=True)
@sim.injectable()
def settings(configs_dir):
with open(os.path.join(configs_dir, "configs", "settings.yaml")) as f:
return yaml.load(f)
Expand Down
1 change: 1 addition & 0 deletions activitysim/defaults/models/__init__.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,5 +8,6 @@
import non_mandatory_tour_frequency
import mandatory_scheduling
import non_mandatory_scheduling
import school_location
import workplace_location
import mode
3 changes: 0 additions & 3 deletions activitysim/defaults/models/auto_ownership.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,9 +7,6 @@
with given characteristics owns
"""

# this is the max number of cars allowable in the auto ownership model
MAX_NUM_CARS = 5


@sim.injectable()
def auto_ownership_spec(configs_dir):
Expand Down
53 changes: 53 additions & 0 deletions activitysim/defaults/models/school_location.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
import os
import pandas as pd
import urbansim.sim.simulation as sim
from activitysim import activitysim as asim


"""
The school location model predicts the zones in which various people will
go to school.
"""


@sim.table()
def school_location_spec(configs_dir):
f = os.path.join(configs_dir, 'configs', "school_location.csv")
return asim.read_model_spec(f).fillna(0)


@sim.model()
def school_location_simulate(set_random_seed,
persons_merged,
school_location_spec,
skims,
destination_size_terms):

choosers = persons_merged.to_frame()
alternatives = destination_size_terms.to_frame()
spec = school_location_spec.to_frame()

# set the 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
skims.set_keys("TAZ", "TAZ_r")
# the skims will be available under the name "skims" for any @ expressions
locals_d = {"skims": skims}

choices_list = []
for school_type in ['university', 'highschool', 'gradeschool']:

locals_d['segment'] = school_type

choices, _ = asim.interaction_simulate(choosers[choosers["is_" +
school_type]],
alternatives,
spec[[school_type]],
skims=skims,
locals_d=locals_d)
choices_list.append(choices)

choices = pd.concat(choices_list)
choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "school_taz", choices)
5 changes: 3 additions & 2 deletions activitysim/defaults/models/workplace_location.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,6 @@ def workplace_location_spec(configs_dir):
return asim.read_model_spec(f).fillna(0)


# FIXME there are three school models that go along with this one which have
# FIXME not been implemented yet
@sim.model()
def workplace_location_simulate(set_random_seed,
persons_merged,
Expand All@@ -25,6 +23,7 @@ def workplace_location_simulate(set_random_seed,
destination_size_terms):

choosers = persons_merged.to_frame()
choosers = choosers[choosers.employed_cat.isin(["full", "part"])]
alternatives = destination_size_terms.to_frame()

# set the keys for this lookup - in this case there is a TAZ in the choosers
Expand All@@ -39,5 +38,7 @@ def workplace_location_simulate(set_random_seed,
skims=skims,
locals_d=locals_d)

choices = choices.reindex(persons_merged.index).fillna(-1).astype('int')

print "Describe of choices:\n", choices.describe()
sim.add_column("persons", "workplace_taz", choices)
30 changes: 20 additions & 10 deletions activitysim/defaults/tables/persons.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -95,9 +95,6 @@ def female(persons):
# count the number of mandatory tours for each person
@sim.column("persons")
def num_mand(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
if "mandatory_tour_frequency" not in persons.columns:
return pd.Series(0, index=persons.index)

Expand DownExpand Up@@ -146,7 +143,7 @@ def student_is_employed(persons):
@sim.column("persons")
def nonstudent_to_school(persons):
return (persons.ptype_cat.isin(['full', 'part', 'nonwork', 'retired']) &
persons.student_cat.isin(['high', 'college']))
persons.student_cat.isin(['grade_or_high', 'college']))


@sim.column("persons")
Expand All@@ -162,14 +159,28 @@ def is_worker(persons):

@sim.column("persons")
def is_student(persons):
return persons.student_cat.isin(['high', 'college'])
return persons.student_cat.isin(['grade_or_high', 'college'])


@sim.column("persons")
def is_gradeschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age <= settings['grade_school_max_age'])


@sim.column("persons")
def is_highschool(persons, settings):
return (persons.student_cat == "grade_or_high") & \
(persons.age > settings['grade_school_max_age'])


@sim.column("persons")
def is_university(persons):
return persons.student_cat == "university"


@sim.column("persons")
def workplace_taz(persons):
# FIXME this is really because we ask for ALL columns in the persons data
# FIXME frame - urbansim actually only asks for the columns that are used by
# FIXME the model specs in play at that time
return pd.Series(1, persons.index)


Expand All@@ -181,8 +192,7 @@ def home_taz(households, persons):

@sim.column("persons")
def school_taz(persons):
# FIXME need to fix this after getting school lcm working
return persons.workplace_taz
return pd.Series(1, persons.index)


# this use the distance skims to compute the raw distance to work from home
Expand Down
2 changes: 2 additions & 0 deletions activitysim/defaults/test/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand Down
4 changes: 2 additions & 2 deletions example/configs/destination_choice_size_terms.csv
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,8 @@ segment,TOTHH,RETEMPN,FPSEMPN,HEREMPN,OTHEMPN,AGREMPN,MWTEMPN,AGE0519,HSENROLL,C
"work, high",0,0.11,0.207,0.284,0.154,0.006,0.239,0,0,0,0
"work, veryhigh",0,0.093,0.27,0.241,0.146,0.004,0.246,0,0,0,0
university,0,0,0,0,0,0,0,0,0,0.592,0.408
"school, grade",0,0,0,0,0,0,0,1,0,0,0
"school, high",0,0,0,0,0,0,0,0,1,0,0
gradeschool,0,0,0,0,0,0,0,1,0,0,0
highschool,0,0,0,0,0,0,0,0,1,0,0
"escort, kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
"escort, no kids",0,0.225,0,0.144,0,0,0,0.465,0.166,0,0
shopping,0,1,0,0,0,0,0,0,0,0,0
Expand Down
9 changes: 9 additions & 0 deletions example/configs/school_location.csv
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
Description,Expression,university,highschool,gradeschool
"Distance, piecewise linear from 0 to 1 miles",@skims['DISTANCE'].clip(1),-3.2451,-0.9523,-1.6419
"Distance, piecewise linear from 1 to 2 miles","@(skims['DISTANCE']-1).clip(0,1)",-2.7011,-0.5700,-0.5700
"Distance, piecewise linear from 2 to 5 miles","@(skims['DISTANCE']-2).clip(0,3)",-0.5707,-0.5700,-0.5700
"Distance, piecewise linear from 5 to 15 miles","@(skims['DISTANCE']-5).clip(0,10)",-0.5002,-0.1930,-0.2031
"Distance, piecewise linear for 15+ miles",@(skims['DISTANCE']-15.0).clip(0),-0.0730,-0.1882,-0.0460
Mode choice logsum,mode_choice_logsums,0.5358,0.5358,0.5358
Size variable,@df[segment].apply(np.log1p),1.0000,1.0000,1.0000
No attractions,@df[segment]==0,-999.0000,-999.0000,-999.0000
6 changes: 4 additions & 2 deletions example/configs/settings.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,8 @@ rural_threshold: 6

households_sample_size: 1000

grade_school_max_age: 14

county_map:
San Francisco: 1
San Mateo: 2
Expand All@@ -25,8 +27,8 @@ employment_map:
4: child

student_map:
1: high
2: college
1: grade_or_high
2: university
3: not

person_type_map:
Expand Down
81 changes: 71 additions & 10 deletions example/simulation.ipynb
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:880950d73f4f9e461598c60051b1f421518aa82880440b1f17bdf1ae89f0bc48"
"signature": "sha256:8dd6ed7b0367358850955b8044ce5cd4396e31fd6b83bd444987c950b7c3696a"
},
"nbformat": 3,
"nbformat_minor": 0,
Expand All@@ -22,6 +22,67 @@
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sim.run([\"school_location_simulate\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Running model 'school_location_simulate'\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"WARNING: Some columns have no variability:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['mode_choice_logsums']\n",
"Describe of choices:\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2538.000000\n",
"mean 190.435776\n",
"std 389.915126\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 69.000000\n",
"max 1450.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'school_location_simulate': 18.74s\n",
"Total time to execute: 18.74s\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
Expand DownExpand Up@@ -51,17 +112,17 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"count 2546.000000\n",
"mean 775.958759\n",
"std 425.999370\n",
"min 1.000000\n",
"25% 418.000000\n",
"50% 776.500000\n",
"75% 1168.000000\n",
"count 2538.000000\n",
"mean 332.508668\n",
"std 473.007494\n",
"min -1.000000\n",
"25% -1.000000\n",
"50% -1.000000\n",
"75% 651.000000\n",
"max 1452.000000\n",
"Name: TAZ, dtype: float64\n",
"Time to execute model 'workplace_location_simulate': 20.54s\n",
"Total time to execute: 20.54s\n"
"Time to execute model 'workplace_location_simulate': 10.24s\n",
"Total time to execute: 10.24s\n"
]
}
],
Expand Down