def make_population(): geography = Geography.from_file({"area": ["E00062194"]}) demography = Demography.for_geography(geography) population = Population() for area in geography.areas: population.people += demography.populate(area.name) return population
def make_dummy_world(): teacher = Person.from_attributes(age=100, sex="f") pupil_shift_1 = Person.from_attributes(age=12, sex="f") pupil_shift_2 = Person.from_attributes(age=5, sex="m") pupil_shift_3 = Person.from_attributes(age=11, sex="f") learning_center = LearningCenter(coordinates=None, n_pupils_max=None) household = Household() household.add(person=teacher) household.add(person=pupil_shift_1) household.add(person=pupil_shift_2) household.add(person=pupil_shift_3) learning_center.add(person=teacher, shift=0, subgroup_type=learning_center.SubgroupType.teachers) learning_center.add(person=teacher, shift=1, subgroup_type=learning_center.SubgroupType.teachers) learning_center.add(person=teacher, shift=2, subgroup_type=learning_center.SubgroupType.teachers) learning_center.add(person=pupil_shift_1, shift=0) learning_center.add(person=pupil_shift_2, shift=1) learning_center.add(person=pupil_shift_3, shift=2) world = World() world.learning_centers = LearningCenters([learning_center], learning_centers_tree=False, n_shifts=3) world.households = Households([household]) world.people = Population( [teacher, pupil_shift_1, pupil_shift_2, pupil_shift_3]) for person in world.people.members: person.busy = False learning_center.clear() household.clear() return ( teacher, pupil_shift_1, pupil_shift_2, pupil_shift_3, learning_center, household, world, )
def infect_super_areas( self, n_cases_per_super_area: pd.DataFrame, record: Optional["Record"] = None ): """ Infect super areas with numer of cases given by data frame Parameters ---------- n_cases_per_super_area: data frame containig the number of cases per super area """ for super_area in self.world.super_areas: try: n_cases = int(n_cases_per_super_area[super_area.name]) self.unleash_virus( Population(super_area.people), n_cases=n_cases, record=record ) except KeyError as e: raise KeyError("There is no data on cases for super area: %s" % str(e))
def _populate_areas(areas: Areas, demography): people = Population() for area in areas: area.populate(demography) people.extend(area.people) return people
def make_pop(): people = Population([]) for i in range(100): people.add(Person.from_attributes(age=i)) return people
def load_population_from_hdf5(file_path: str, chunk_size=100000): """ Loads the population from an hdf5 file located at ``file_path``. Note that this object will not be ready to use, as the links to object instances of other classes need to be restored first. This function should be rarely be called oustide world.py """ print("loading population from hdf5 ", end="") with h5py.File(file_path, "r", libver="latest", swmr=True) as f: people = [] population = f["population"] # read in chunks of 100k people n_people = population.attrs["n_people"] n_chunks = int(np.ceil(n_people / chunk_size)) for chunk in range(n_chunks): print(".", end="") idx1 = chunk * chunk_size idx2 = min((chunk + 1) * chunk_size, n_people) ids = population["id"][idx1:idx2] ages = population["age"][idx1:idx2] sexes = population["sex"][idx1:idx2] ethns = population["ethnicity"][idx1:idx2] socioecon_indices = population["socioecon_index"][idx1:idx2] home_city = population["home_city"][idx1:idx2] group_ids = population["group_ids"][idx1:idx2] group_specs = population["group_specs"][idx1:idx2] subgroup_types = population["subgroup_types"][idx1:idx2] sectors = population["sector"][idx1:idx2] sub_sectors = population["sub_sector"][idx1:idx2] lockdown_status = population["lockdown_status"][idx1:idx2] mode_of_transport_is_public_list = population[ "mode_of_transport_is_public"][idx1:idx2] mode_of_transport_description_list = population[ "mode_of_transport_description"][idx1:idx2] areas = population["area"][idx1:idx2] for k in range(idx2 - idx1): if ethns[k].decode() == " ": ethnicity = None else: ethnicity = ethns[k].decode() if socioecon_indices[k] == nan_integer: socioecon_index = None else: socioecon_index = socioecon_indices[k] person = Person.from_attributes( id=ids[k], age=ages[k], sex=sexes[k].decode(), ethnicity=ethnicity, socioecon_index=socioecon_index, ) mode_of_transport_description = mode_of_transport_description_list[ k] mode_of_transport_is_public = mode_of_transport_is_public_list[ k] # mode of transport if mode_of_transport_description.decode() == " ": person.mode_of_transport = None else: person.mode_of_transport = ModeOfTransport( description=mode_of_transport_description.decode(), is_public=mode_of_transport_is_public, ) hc = home_city[k] if hc == nan_integer: person.home_city = None else: person.home_city = hc subgroups = [] for group_id, subgroup_type, group_spec in zip( group_ids[k], subgroup_types[k], group_specs[k]): if group_id == nan_integer: group_id = None subgroup_type = None group_spec = None else: group_spec = group_spec.decode() subgroups.append([group_spec, group_id, subgroup_type]) person.subgroups = subgroups person.area = areas[k] if sectors[k].decode() == " ": person.sector = None else: person.sector = sectors[k].decode() if sub_sectors[k].decode() == " ": person.sub_sector = None else: person.sub_sector = sub_sectors[k].decode() if lockdown_status[k].decode() == " ": person.lockdown_status = None else: person.lockdown_status = lockdown_status[k].decode() people.append(person) print("\n", end="") return Population(people)
def make_dummy_world(): g = Geography.from_file(filter_key={"super_area": ["E02002559"]}) super_area = g.super_areas.members[0] company = Company(super_area=super_area, n_workers_max=100, sector="Q") school = School( coordinates=super_area.coordinates, n_pupils_max=100, age_min=4, age_max=10, sector="primary", ) household = Household() household.area = super_area.areas[0] hospital = Hospital( n_beds=40, n_icu_beds=5, super_area=super_area.name, coordinates=super_area.coordinates, ) worker = Person.from_attributes(age=40) worker.area = super_area household.add(worker, subgroup_type=household.SubgroupType.adults) worker.sector = "Q" company.add(worker) pupil = Person.from_attributes(age=6) pupil.area = super_area household.add(pupil, subgroup_type=household.SubgroupType.kids) household.area = super_area school.add(pupil) student = Person.from_attributes(age=21) student.area = super_area household.add(student, subgroup_type=household.SubgroupType.adults) university = University( coordinates=super_area.coordinates, n_students_max=100, ) university.add(student) commuter = Person.from_attributes(sex="m", age=30) commuter.mode_of_transport = ModeOfTransport(description="bus", is_public=True) commuter.mode_of_transport = "public" household.add(commuter) world = World() world.schools = Schools([school]) world.hospitals = Hospitals([hospital]) world.households = Households([household]) world.universities = Universities([]) world.companies = Companies([company]) world.universities = Universities([university]) world.care_homes = CareHomes([CareHome()]) world.people = Population([worker, pupil, student, commuter]) world.areas = Areas([super_area.areas[0]]) world.areas[0].people = world.people world.super_areas = SuperAreas([super_area]) cinema = Cinema() cinema.coordinates = super_area.coordinates world.cinemas = Cinemas([cinema]) pub = Pub() pub.coordinates = super_area.coordinates world.pubs = Pubs([pub]) grocery = Grocery() grocery.coordinates = super_area.coordinates world.groceries = Groceries([grocery]) # commute city = CommuteCity() hub = CommuteHub(None, None) city.commutehubs = [hub] world.commutehubs = CommuteHubs([city]) world.commutehubs.members = [hub] world.commutecities = CommuteCities() world.commutecities.members = [city] world.commutehubs[0].add(commuter) world.commuteunits = CommuteUnits(world.commutehubs.members) world.commuteunits.init_units() world.commutecityunits = CommuteCityUnits(world.commutecities) world.cemeteries = Cemeteries() return world
def load_population_from_hdf5(file_path: str, chunk_size=100000, domain_super_areas=None): """ Loads the population from an hdf5 file located at ``file_path``. Note that this object will not be ready to use, as the links to object instances of other classes need to be restored first. This function should be rarely be called oustide world.py """ people = [] logger.info("loading population...") with h5py.File(file_path, "r", libver="latest", swmr=True) as f: # people = [] population = f["population"] # read in chunks of 100k people n_people = population.attrs["n_people"] n_chunks = int(np.ceil(n_people / chunk_size)) for chunk in range(n_chunks): logger.info(f"Loaded chunk {chunk} of {n_chunks}") idx1 = chunk * chunk_size idx2 = min((chunk + 1) * chunk_size, n_people) length = idx2 - idx1 ids = read_dataset(population["id"], idx1, idx2) ages = read_dataset(population["age"], idx1, idx2) sexes = read_dataset(population["sex"], idx1, idx2) ethns = read_dataset(population["ethnicity"], idx1, idx2) socioecon_indices = read_dataset(population["socioecon_index"], idx1, idx2) super_areas = read_dataset(population["super_area"], idx1, idx2) sectors = read_dataset(population["sector"], idx1, idx2) sub_sectors = read_dataset(population["sub_sector"], idx1, idx2) lockdown_status = read_dataset(population["lockdown_status"], idx1, idx2) mode_of_transport_is_public_list = read_dataset( population["mode_of_transport_is_public"], idx1, idx2) mode_of_transport_description_list = read_dataset( population["mode_of_transport_description"], idx1, idx2) for k in range(idx2 - idx1): if domain_super_areas is not None: super_area = super_areas[k] if super_area == nan_integer: raise ValueError( "if ``domain_super_areas`` is True, I expect not Nones super areas." ) if super_area not in domain_super_areas: continue if ethns[k].decode() == " ": ethn = None else: ethn = ethns[k].decode() if socioecon_indices[k] == nan_integer: socioecon_index = None else: socioecon_index = socioecon_indices[k] person = Person.from_attributes( id=ids[k], age=ages[k], sex=sexes[k].decode(), ethnicity=ethn, socioecon_index=socioecon_index, ) people.append(person) mode_of_transport_description = mode_of_transport_description_list[ k] mode_of_transport_is_public = mode_of_transport_is_public_list[ k] # mode of transport if mode_of_transport_description.decode() == " ": person.mode_of_transport = None else: person.mode_of_transport = ModeOfTransport( description=mode_of_transport_description.decode(), is_public=mode_of_transport_is_public, ) if sectors[k].decode() == " ": person.sector = None else: person.sector = sectors[k].decode() if sub_sectors[k].decode() == " ": person.sub_sector = None else: person.sub_sector = sub_sectors[k].decode() if lockdown_status[k].decode() == " ": person.lockdown_status = None else: person.lockdown_status = lockdown_status[k].decode() return Population(people)
def make_dummy_world(geog): super_area = geog.super_areas.members[0] company = Company(super_area=super_area, n_workers_max=100, sector="Q") household1 = Household() household1.area = super_area.areas[0] hospital = Hospital( n_beds=40, n_icu_beds=5, super_area=super_area.name, coordinates=super_area.coordinates, ) uni = University( coordinates=super_area.coordinates, n_students_max=2500, ) worker1 = Person.from_attributes(age=44, sex='f', ethnicity='A1', socioecon_index=5) worker1.area = super_area.areas[0] household1.add(worker1, subgroup_type=household1.SubgroupType.adults) worker1.sector = "Q" company.add(worker1) worker2 = Person.from_attributes(age=42, sex='m', ethnicity='B1', socioecon_index=5) worker2.area = super_area.areas[0] household1.add(worker2, subgroup_type=household1.SubgroupType.adults) worker2.sector = "Q" company.add(worker2) student1 = Person.from_attributes(age=20, sex='f', ethnicity='A1', socioecon_index=5) student1.area = super_area.areas[0] household1.add(student1, subgroup_type=household1.SubgroupType.adults) uni.add(student1) pupil1 = Person.from_attributes(age=8, sex='m', ethnicity='C1', socioecon_index=5) pupil1.area = super_area.areas[0] household1.add(pupil1, subgroup_type=household1.SubgroupType.kids) #school.add(pupil1) pupil2 = Person.from_attributes(age=5, sex='f', ethnicity='A1', socioecon_index=5) pupil2.area = super_area.areas[0] household1.add(pupil2, subgroup_type=household1.SubgroupType.kids) #school.add(pupil2) world = World() world.schools = Schools([]) world.hospitals = Hospitals([hospital]) world.households = Households([household1]) world.universities = Universities([uni]) world.companies = Companies([company]) world.people = Population([worker1, worker2, student1, pupil1, pupil2]) world.super_areas = geog.super_areas world.areas = geog.areas world.cemeteries = Cemeteries() cinema = Cinema() cinema.coordinates = super_area.coordinates world.cinemas = Cinemas([cinema]) pub = Pub() pub.coordinates = super_area.coordinates world.pubs = Pubs([pub]) world.areas[0].people = world.people return world