Source code for emodpy_malaria.interventions.scale_larval_habitats

from emod_api import schema_to_class as s2c
import pandas as pd
from emodpy_malaria.interventions.outbreak import add_campaign_event


[docs]def add_scale_larval_habitats(campaign, df=None, start_day: int = 0, repetitions: int = 1, timesteps_between_repetitions: int = 365): """ Reduce available larval habitat in a node-specific way. Args: campaign: campaign object to which the intervention will be added, and schema_path container df: The dataframe containing habitat scale factors. **Examples**:: Scale TEMPORARY_RAINFALL by 3-fold for all nodes, all species: df = pd.DataFrame({ 'TEMPORARY_RAINFALL': [3]}) Scale TEMPORARY_RAINFALL by 3-fold for all nodes, arabiensis only: df = pd.DataFrame({ 'TEMPORARY_RAINFALL.arabiensis': [3]}) Scale differently by node ID: df = pd.DataFrame({ 'NodeID' : [0, 1, 2, 3, 4], 'CONSTANT': [1, 0, 1, 1, 1], 'TEMPORARY_RAINFALL': [1, 1, 0, 1, 0]}) Scale differently by both node ID and species: df = pd.DataFrame({ 'NodeID' : [0, 1, 2, 3, 4], 'CONSTANT.arabiensis': [1, 0, 1, 1, 1], 'TEMPORARY_RAINFALL.arabiensis': [1, 1, 0, 1, 0], 'CONSTANT.funestus': [1, 0, 1, 1, 1]}) Scale some habitats by species and others same for all species: df = pd.DataFrame({ 'NodeID' : [0, 1, 2, 3, 4], 'CONSTANT.arabiensis': [1, 0, 1, 1, 1], 'TEMPORARY_RAINFALL.arabiensis': [1, 1, 0, 1, 0], 'CONSTANT.funestus': [1, 0, 1, 1, 1], 'LINEAR_SPLINE': [1, 1, 0, 1, 0]}) Scale nodes at different dates: df = pd.DataFrame({ 'NodeID' : [0, 1, 2, 3, 4], 'CONSTANT': [1, 0, 1, 1, 1], 'TEMPORARY_RAINFALL': [1, 1, 0, 1, 0], 'Start_Day': [0, 30, 60, 65, 65] }) start_day: The date that habitats are scaled for all scaling actions specified in **df**. Used only if there is no Start_Day column in **df**. repetitions: The number of times to repeat the intervention. timesteps_between_repetitions: The number of time steps between repetitions. Returns: None """ if 'Start_Day' not in df.columns.values: df['Start_Day'] = start_day standard_columns = ['NodeID', 'Start_Day'] habitat_columns = [x for x in df.columns.values if x not in standard_columns] habitat_names = list(set([x.split('.')[0] for x in habitat_columns])) by_species = any(['.' in x for x in df.columns.values if x not in standard_columns]) by_node = 'NodeID' in df.columns.values for start_day, df_by_date in df.groupby('Start_Day'): for gn, gdf in df_by_date.groupby(habitat_columns): habitat_scales = [] if not by_species: if len(habitat_names) == 1: habitat_scales.append({"Habitat": habitat_columns[0], "Species": "ALL_SPECIES", "Factor": float(gn[0])}) else: for x, y in zip(habitat_columns, gn): habitat_scales.append({"Habitat": x, "Species": "ALL_SPECIES", "Factor": float(y)}) else: if len(habitat_names) == 1: if len(habitat_columns) == 1: habitat, sp = habitat_columns[0].split('.') habitat_scales.append({"Habitat": habitat, "Species": sp, "Factor": float(gn[0])}) else: habitat = habitat_columns[0].split('.')[0] species = [x.split('.')[1] for x in habitat_columns] for sp, x in zip(species, gn): habitat_scales.append({"Habitat": habitat, "Species": sp, "Factor": float(x)}) else: for ih, habitat in enumerate(habitat_names): if habitat in habitat_columns: habitat_scales.append({"Habitat": habitat, "Species": "ALL_SPECIES", "Factor": float(gdf.iloc[0][habitat])}) else: h = [x for x in habitat_columns if habitat in x] vals = [gn[x] for x in range(len(habitat_columns)) if habitat in habitat_columns[x]] for x, y in zip(h, vals): habitat_scales.append({"Habitat": habitat, "Species": x.split('.')[1], "Factor": float(y)}) if by_node: node_ids = [int(x) for x in gdf['NodeID']] else: node_ids = None add_habitat_reduction_event(campaign, start_day=start_day, node_ids=node_ids, habitat_scales=habitat_scales, repetitions=repetitions, timesteps_between_repetitions=timesteps_between_repetitions)
[docs]def add_habitat_reduction_event(campaign, start_day: int, node_ids: list, habitat_scales: list, repetitions: int, timesteps_between_repetitions: int): """ Add a campaign event to reduce vector's larval habitat(s). Args: campaign: campaign object to which the intervention will be added, and schema_path container start_day: The day the intervention is given out. node_ids: List of nodes to which to distribute the intervention. [] or None, indicates all nodes will get the intervention habitat_scales: List of dictionaries for scaling larval habitats. Examples:: [{"Habitat": "ALL_HABITATS", "Species": "ALL_SPECIES", "Factor": 0.5}, {"Habitat": "CONSTANT", "Species": "arabiensis", "Factor": 2}] repetitions: The number of times an intervention is given, used with timesteps_between_repetitions. -1 means the intervention repeats forever. Sets **Number_Repetitions** timesteps_between_repetitions: The interval, in timesteps, between repetitions. Ignored if repetitions = 1. Sets **Timesteps_Between_Repetitions** Returns: Nothing """ # configuring the intervention itself scale_larval_habitat_intervention = s2c.get_class_with_defaults("ScaleLarvalHabitat", campaign.schema_path) # scale_larval_habitat_intervention.Larval_Habitat_Multiplier = larval_habitat_multiplier_list scale_larval_habitat_intervention.Larval_Habitat_Multiplier = habitat_scales add_campaign_event(campaign=campaign, start_day=start_day, node_ids=node_ids, repetitions=repetitions, timesteps_between_repetitions=timesteps_between_repetitions, intervention=scale_larval_habitat_intervention)