示例#1
0
            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
示例#4
0
    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")
示例#6
0
 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)
示例#7
0
 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
示例#10
0
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 _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")
示例#12
0
 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")