def run_model(): storage.write_table(table_name = 'households', table_data = household_data) households = HouseholdCharacteristicDataset(in_storage=storage, in_table_name='households') model = HouseholdTransitionModel() model.run(year=2000, household_set=households, control_totals=hct_set, characteristics=hc_set) income = households.get_attribute("income") age = households.get_attribute("age_of_head") idx1 = where(income <= 1000)[0] idx2 = where(logical_and(income <= 5000, income > 1000))[0] idx3 = where(logical_and(income <= 10000, income > 5000))[0] idx4 = where(income > 10000)[0] results = array([age[idx1].mean(), age[idx2].mean(), age[idx3].mean(), age[idx4].mean()]) print results return results
def _update_household_set(self, household_set): """Updates also person set.""" hh_ids_to_copy = household_set.get_id_attribute()[self.mapping_existing_hhs_to_new_hhs] npersons_in_hhs = household_set.get_attribute_by_index('persons', self.mapping_existing_hhs_to_new_hhs) result = USHouseholdTransitionModel._update_household_set(self, household_set) new_hh_ids = household_set.get_id_attribute()[(household_set.size()-self.mapping_existing_hhs_to_new_hhs.size):household_set.size()] # remove person that have non-existing households eliminate_index = where(logical_not(ismember(self.person_set.get_attribute(household_set.get_id_name()[0]), household_set.get_id_attribute())))[0] self.person_set.remove_elements(eliminate_index) # duplicate persons unique_persons_to_duplicate = ismember(self.person_set.get_attribute(household_set.get_id_name()[0]), hh_ids_to_copy) person_considered_idx = where(unique_persons_to_duplicate)[0] npersons_in_hhs_sum = npersons_in_hhs.sum() persons_to_duplicate = -1*ones(npersons_in_hhs_sum, dtype=int32) new_person_hh_ids = zeros(npersons_in_hhs_sum, dtype=int32) considered_person_hh_ids = self.person_set.get_attribute(household_set.get_id_name()[0])[person_considered_idx] j = 0 for i in arange(hh_ids_to_copy.size): idx = where(considered_person_hh_ids == hh_ids_to_copy[i])[0] if idx.size == npersons_in_hhs[i]: persons_to_duplicate[j:(j+npersons_in_hhs[i])] = person_considered_idx[idx] new_person_hh_ids[j:(j+npersons_in_hhs[i])] = new_hh_ids[i] j+=npersons_in_hhs[i] if hh_ids_to_copy.size > 0: if j < npersons_in_hhs_sum: persons_to_duplicate = persons_to_duplicate[0:j] new_person_hh_ids = new_person_hh_ids[0:j] if persons_to_duplicate.size <= 0: return result new_persons_idx = self.person_set.duplicate_rows(persons_to_duplicate) # assign job_id to 'no job', but only if the job_id is present in the person dataset dtype=self.person_set.get_data_type('job_id') if dtype!=None: self.person_set.modify_attribute(name='job_id', data=zeros(new_persons_idx.size, dtype=dtype), index=new_persons_idx) # assign the right household_id self.person_set.modify_attribute(name=household_set.get_id_name()[0], data=new_person_hh_ids, index=new_persons_idx) self.debug.print_debug("Created %s persons." % new_persons_idx.size, 3) # check if number of persons in the household_set correspond to those in person set if household_set.get_attribute('persons').sum() <> self.person_set.size(): logger.log_warning('Number of persons in household set (%s) does not correspond to those in person set (%s).' % (household_set.get_attribute('persons').sum(), self.person_set.size())) return result
def run_model(): storage.write_table(table_name='households', table_data=household_data) households = HouseholdCharacteristicDataset( in_storage=storage, in_table_name='households') model = HouseholdTransitionModel() model.run(year=2000, household_set=households, control_totals=hct_set, characteristics=hc_set) income = households.get_attribute("income") age = households.get_attribute("age_of_head") idx1 = where(income <= 1000)[0] idx2 = where(logical_and(income <= 5000, income > 1000))[0] idx3 = where(logical_and(income <= 10000, income > 5000))[0] idx4 = where(income > 10000)[0] results = array([ age[idx1].mean(), age[idx2].mean(), age[idx3].mean(), age[idx4].mean() ]) print results return results
def _update_household_set(self, household_set): """Updates also person set.""" hh_ids_to_copy = household_set.get_id_attribute()[self.mapping_existing_hhs_to_new_hhs] npersons_in_hhs = household_set.get_attribute_by_index('persons', self.mapping_existing_hhs_to_new_hhs) result = USHouseholdTransitionModel._update_household_set(self, household_set) new_hh_ids = household_set.get_id_attribute()[(household_set.size()-self.mapping_existing_hhs_to_new_hhs.size):household_set.size()] # remove person that have non-existing households eliminate_index = where(logical_not(ismember(self.person_set.get_attribute(household_set.get_id_name()[0]), household_set.get_id_attribute())))[0] self.person_set.remove_elements(eliminate_index) # duplicate persons unique_persons_to_duplicate = ismember(self.person_set.get_attribute(household_set.get_id_name()[0]), hh_ids_to_copy) person_considered_idx = where(unique_persons_to_duplicate)[0] npersons_in_hhs_sum = npersons_in_hhs.sum() persons_to_duplicate = -1*ones(npersons_in_hhs_sum, dtype=int32) new_person_hh_ids = zeros(npersons_in_hhs_sum, dtype=int32) considered_person_hh_ids = self.person_set.get_attribute(household_set.get_id_name()[0])[person_considered_idx] j = 0 for i in arange(hh_ids_to_copy.size): idx = where(considered_person_hh_ids == hh_ids_to_copy[i])[0] if idx.size == npersons_in_hhs[i]: persons_to_duplicate[j:(j+npersons_in_hhs[i])] = person_considered_idx[idx] new_person_hh_ids[j:(j+npersons_in_hhs[i])] = new_hh_ids[i] j+=npersons_in_hhs[i] if hh_ids_to_copy.size > 0: if j < npersons_in_hhs_sum: persons_to_duplicate = persons_to_duplicate[0:j] new_person_hh_ids = new_person_hh_ids[0:j] if persons_to_duplicate.size <= 0: return result new_persons_idx = self.person_set.duplicate_rows(persons_to_duplicate) # assign job_id to 'no job' self.person_set.modify_attribute(name='job_id', data=zeros(new_persons_idx.size, dtype=self.person_set.get_data_type('job_id')), index=new_persons_idx) # assign the right household_id self.person_set.modify_attribute(name=household_set.get_id_name()[0], data=new_person_hh_ids, index=new_persons_idx) self.debug.print_debug("Created %s persons." % new_persons_idx.size, 3) # check if number of persons in the household_set correspond to those in person set if household_set.get_attribute('persons').sum() <> self.person_set.size(): logger.log_warning('Number of persons in household set (%s) does not correspond to those in person set (%s).' % (household_set.get_attribute('persons').sum(), self.person_set.size())) return result
def _do_initialize_for_run(self, household_set): HouseholdTransitionModel._do_initialize_for_run(self, household_set) self.new_households[self.subarea_id_name] = array([], dtype="int32")
def run(self, year, household_set, person_set, control_totals, characteristics, resources=None): self.person_set = person_set return USHouseholdTransitionModel.run(self, year, household_set, control_totals, characteristics, resources=resources)
def __init__(self, location_id_name="building_id", **kwargs): USHouseholdTransitionModel.__init__(self, location_id_name=location_id_name, **kwargs)
def _do_initialize_for_run(self, household_set): HouseholdTransitionModel._do_initialize_for_run(self, household_set) self.new_households["large_area_id"] = array([], dtype="int32")
def run_HTM(niter): nhhs = 5000 ngroups = 4 nhhsg = int(nhhs/ngroups) nhhslg = nhhs-(ngroups-1)*nhhsg should_nhhs = nhhs-2000 storage = StorageFactory().get_storage('dict_storage') hc_set_table_name = 'hc_set' storage.write_table( table_name = hc_set_table_name, table_data = { 'characteristic': array(4*['income']+4*['age_of_head']), 'min':array([0,1001,5001, 10001, 0, 31, 41, 61]), 'max':array([1000, 5000, 10000,-1, 30, 40, 60, -1]) }, ) hct_set_table_name = 'hct_set' storage.write_table( table_name = hct_set_table_name, table_data = { 'year':array([2000]), 'total_number_of_households':array([should_nhhs]) }, ) households_table_name = 'households' storage.write_table( table_name = households_table_name, table_data = { 'age_of_head': array(nhhsg/2*[18]+(nhhsg-nhhsg/2)*[35] + nhhsg/2*[30] + (nhhsg-nhhsg/2)*[40] + nhhsg/2*[38] + (nhhsg-nhhsg/2)*[65] + nhhslg/2*[50] + (nhhslg-nhhslg/2)*[80] ), 'income': array(nhhsg*[500] + nhhsg*[2000] + nhhsg*[7000] + nhhslg*[15000] ), 'household_id':arange(nhhs)+1 }, ) hc_set = HouseholdCharacteristicDataset(in_storage=storage, in_table_name=hc_set_table_name) hct_set = ControlTotalDataset( in_storage = storage, in_table_name = hct_set_table_name, what = 'household', id_name = ['year'] ) logger.be_quiet() result = zeros((niter,4)) for iter in range(niter): households = HouseholdDataset(in_storage=storage, in_table_name=households_table_name) model = HouseholdTransitionModel() model.run(year=2000, household_set=households, control_totals=hct_set, characteristics=hc_set) income = households.get_attribute('income') age = households.get_attribute('age_of_head') idx1 = where(income <= 1000)[0] idx2 = where(logical_and(income <= 5000, income > 1000))[0] idx3 = where(logical_and(income <= 10000, income > 5000))[0] idx4 = where(income > 10000)[0] result[iter,:] = array([age[idx1].mean(), age[idx2].mean(), age[idx3].mean(), age[idx4].mean()]) return result
def run_HTM(niter): nhhs = 5000 ngroups = 4 nhhsg = int(nhhs / ngroups) nhhslg = nhhs - (ngroups - 1) * nhhsg should_nhhs = nhhs - 2000 storage = StorageFactory().get_storage('dict_storage') hc_set_table_name = 'hc_set' storage.write_table( table_name=hc_set_table_name, table_data={ 'characteristic': array(4 * ['income'] + 4 * ['age_of_head']), 'min': array([0, 1001, 5001, 10001, 0, 31, 41, 61]), 'max': array([1000, 5000, 10000, -1, 30, 40, 60, -1]) }, ) hct_set_table_name = 'hct_set' storage.write_table( table_name=hct_set_table_name, table_data={ 'year': array([2000]), 'total_number_of_households': array([should_nhhs]) }, ) households_table_name = 'households' storage.write_table( table_name=households_table_name, table_data={ 'age_of_head': array(nhhsg / 2 * [18] + (nhhsg - nhhsg / 2) * [35] + nhhsg / 2 * [30] + (nhhsg - nhhsg / 2) * [40] + nhhsg / 2 * [38] + (nhhsg - nhhsg / 2) * [65] + nhhslg / 2 * [50] + (nhhslg - nhhslg / 2) * [80]), 'income': array(nhhsg * [500] + nhhsg * [2000] + nhhsg * [7000] + nhhslg * [15000]), 'household_id': arange(nhhs) + 1 }, ) hc_set = HouseholdCharacteristicDataset(in_storage=storage, in_table_name=hc_set_table_name) hct_set = ControlTotalDataset(in_storage=storage, in_table_name=hct_set_table_name, what='household', id_name=['year']) logger.be_quiet() result = zeros((niter, 4)) for iter in range(niter): households = HouseholdDataset(in_storage=storage, in_table_name=households_table_name) model = HouseholdTransitionModel() model.run(year=2000, household_set=households, control_totals=hct_set, characteristics=hc_set) income = households.get_attribute('income') age = households.get_attribute('age_of_head') idx1 = where(income <= 1000)[0] idx2 = where(logical_and(income <= 5000, income > 1000))[0] idx3 = where(logical_and(income <= 10000, income > 5000))[0] idx4 = where(income > 10000)[0] result[iter, :] = array([ age[idx1].mean(), age[idx2].mean(), age[idx3].mean(), age[idx4].mean() ]) return result