Esempio n. 1
0
def preload_intervention_csvs(catch,
                              simulation_start_date,
                              hs_file=hs_default,
                              itn_file=itn_default,
                              irs_file=irs_default,
                              mda_file=mda_default,
                              rcd_file=rcd_default):
    hs_df = pd.read_csv(hs_file)
    itn_df = pd.read_csv(itn_file)
    irs_df = pd.read_csv(irs_file)
    mda_df = pd.read_csv(mda_file)
    rcd_df = pd.read_csv(rcd_file)

    df_dict = {"hs": hs_df,
               "itn": itn_df,
               "irs": irs_df,
               "mda": mda_df,
               "rcd": rcd_df}

    for key in list(df_dict.keys()):
        df = df_dict[key]

        # Add column which specifies which simulation day the intervention of that row is to be implemented
        df['simday'] = [convert_to_day_365(x, simulation_start_date, "%Y-%m-%d") for x in df.fulldate]

    return df_dict
    def add_irs(self, cb, filename=None):
        if not filename:
            filename = self.dropbox_base + "inputs/grid_csv/grid_all_irs_events.csv"
        intervene_events = pd.read_csv(filename)

        # Restrict to catchment of interest
        intervene_events = intervene_events[np.in1d(
            intervene_events['grid_cell'], self.catch_cells)]
        intervene_events.reset_index(inplace=True)

        # Compute simulation days relative to start date or use default in file
        intervene_events['simday'] = [
            convert_to_day_365(x, self.start_date, "%Y-%m-%d")
            for x in intervene_events.fulldate
        ]

        irs_field_list = ["cov_all", "killing", "exp_duration", "box_duration"]
        binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2(
            intervene_events, irs_field_list)

        for table, group in binned_and_grouped:
            table_dict = dict(zip((data_fields), table))
            node_list = sorted(group['grid_cell'])
            if node_list == sorted(self.catch_cells):
                nodeIDs = []
            else:
                nodeIDs = node_list

            add_IRS(cb,
                    start=int(table_dict['simday']),
                    coverage_by_ages=[{
                        'coverage': float(table_dict['cov_all'])
                    }],
                    waning={
                        "Killing_Config": {
                            "Initial_Effect":
                            float(table_dict['killing']),
                            "Decay_Time_Constant":
                            float(table_dict['exp_duration']),
                            "Box_Duration":
                            float(table_dict['box_duration']),
                            "class":
                            "WaningEffectBoxExponential"
                        }
                    },
                    nodeIDs=nodeIDs)
def prev_ref_data(catch, start_date='2009-01-01'):
    reference_csv = pd.read_csv(
        os.path.join(
            project_folder,
            "dtk_simulation_input/mozambique/grid_prevalence_with_dates.csv"))
    lookup_csv = pd.read_csv(
        os.path.join(
            project_folder,
            "dtk_simulation_input/mozambique/grid_lookup_with_neighborhood.csv"
        ))
    return_data = reference_csv.merge(lookup_csv, how='left', on='grid_cell')

    return_data['sim_date'] = return_data['date'].apply(
        lambda x: convert_to_day_365(x, start_date))
    return_data['sim_date'] = return_data['sim_date'] - 1

    in_catch = return_data['catchment'] == catch
    return return_data[in_catch]
    def add_rcd(self, cb, filename=None):
        if not filename:
            # filename = self.dropbox_base + "inputs/grid_csv/grid_all_react_events.csv"
            filename = self.dropbox_base + "inputs/grid_csv/grid_all_react_events_SIMPLE.csv"
            print(
                "WARNING: using simplified RCD file-- grid_all_react_events_SIMPLE.csv"
            )
        intervene_events = pd.read_csv(filename)

        # Restrict to catchment of interest
        intervene_events = intervene_events[np.in1d(
            intervene_events['grid_cell'], self.catch_cells)]
        intervene_events.reset_index(inplace=True)

        # Compute simulation days relative to start date or use default in file
        intervene_events['simday'] = [
            convert_to_day_365(x, self.start_date, "%Y-%m-%d")
            for x in intervene_events.fulldate
        ]

        rcd_field_list = ["coverage", "trigger_coverage", "interval"]
        binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2(
            intervene_events, rcd_field_list)

        for table, group in binned_and_grouped:
            table_dict = dict(zip((data_fields), table))
            node_list = sorted(group['grid_cell'])
            if node_list == sorted(self.catch_cells):
                nodeIDs = []
            else:
                nodeIDs = node_list

            for i in range(len(intervene_events)):
                add_drug_campaign(cb,
                                  campaign_type='rfMSAT',
                                  drug_code='AL',
                                  diagnostic_type='BLOOD_SMEAR_PARASITES',
                                  diagnostic_threshold=0,
                                  start_days=[float(table_dict['simday'])],
                                  coverage=float(table_dict['coverage']),
                                  trigger_coverage=float(
                                      table_dict['trigger_coverage']),
                                  interval=float(table_dict['interval']),
                                  nodes=nodeIDs)
Esempio n. 5
0
def preload_intervention_csvs(catch,
                              sim_start_date,
                              hs_file=hs_default,
                              itn_file=itn_default,
                              irs_file=irs_default,
                              mda_file=mda_default,
                              rcd_file=rcd_default):
    hs_df = pd.read_csv(hs_file)
    itn_df = pd.read_csv(itn_file)
    irs_df = pd.read_csv(irs_file)
    mda_df = pd.read_csv(mda_file)
    rcd_df = pd.read_csv(rcd_file)

    df_dict = {
        "hs": hs_df,
        "itn": itn_df,
        "irs": irs_df,
        "mda": mda_df,
        "rcd": rcd_df
    }

    # Add simday column for adding to campaign file
    for key in list(df_dict.keys()):
        df = df_dict[key]

        # Add column which specifies which simulation day the intervention of that row is to be implemented
        df['simday'] = [
            convert_to_day_365(x, sim_start_date, "%Y-%m-%d")
            for x in df.fulldate
        ]

    # Restrict to catchment of interest
    catch_cells = find_cells_for_this_catchment(catch)
    for key in list(df_dict.keys()):
        df = df_dict[key]
        df = df[np.in1d(df["grid_cell"], catch_cells)]
        df.reset_index(inplace=True)
        df_dict[key] = df

    return df_dict
    def add_msat(self, cb, filename=None):
        if not filename:
            filename = self.dropbox_base + "inputs/grid_csv/grid_all_msat_events.csv"
        intervene_events = pd.read_csv(filename)

        # Restrict to catchment of interest
        intervene_events = intervene_events[np.in1d(
            intervene_events['grid_cell'], self.catch_cells)]
        intervene_events.reset_index(inplace=True)

        # Compute simulation days relative to start date or use default in file
        intervene_events['simday'] = [
            convert_to_day_365(x, self.start_date, "%Y-%m-%d")
            for x in intervene_events.fulldate
        ]

        msat_field_list = ["cov_all"]
        binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2(
            intervene_events, msat_field_list)

        for table, group in binned_and_grouped:
            table_dict = dict(zip((data_fields), table))
            node_list = sorted(group['grid_cell'])
            if node_list == sorted(self.catch_cells):
                nodeIDs = []
            else:
                nodeIDs = node_list

            add_drug_campaign(cb,
                              campaign_type='MSAT',
                              drug_code='AL',
                              diagnostic_type='BLOOD_SMEAR_PARASITES',
                              diagnostic_threshold=0,
                              start_days=[float(table_dict['simday'])],
                              coverage=table_dict['cov_all'],
                              repetitions=1,
                              interval=60,
                              nodes=nodeIDs)
    def add_itn(self, cb, filename=None):
        if not filename:
            filename = self.dropbox_base + "inputs/grid_csv/grid_all_itn_events.csv"
        intervene_events = pd.read_csv(filename)

        # Restrict to catchment of interest
        intervene_events = intervene_events[np.in1d(
            intervene_events['grid_cell'], self.catch_cells)]
        intervene_events.reset_index(inplace=True)

        # Compute simulation days relative to start date or use default in file
        intervene_events['simday'] = [
            convert_to_day_365(x, self.start_date, "%Y-%m-%d")
            for x in intervene_events.fulldate
        ]

        itn_field_list = [
            "age_cov", "cov_all", "min_season_cov", "fast_fraction"
        ]
        binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2(
            intervene_events, itn_field_list)

        birthnet_df = intervene_events.copy(deep=True)
        birthnet_df['duration'] = birthnet_df.groupby(
            'grid_cell')['simday'].shift(-1).sub(birthnet_df['simday'])
        birthnet_df['duration'].fillna(-1, inplace=True)
        birthnet_field_list = itn_field_list + ["duration"]
        BIRTH_binned_intervene_events, BIRTH_binned_and_grouped, BIRTH_data_fields = self.try_campaign_compression_v2(
            birthnet_df, birthnet_field_list)

        for table, group in binned_and_grouped:
            table_dict = dict(zip((data_fields), table))
            node_list = sorted(
                list(set(group['grid_cell']))
            )  #fixme Needed to add this because sometimes there are duplicate nodes in the list, and this breaks things
            if node_list == sorted(self.catch_cells):
                nodeIDs = []
            else:
                nodeIDs = node_list

            start = float(table_dict['simday'])
            if start >= 0:
                # Regular bednet distribution
                add_ITN_age_season(cb,
                                   start=float(table_dict['simday']),
                                   age_dep={
                                       'youth_cov':
                                       float(table_dict['age_cov']),
                                       'youth_min_age': 5,
                                       'youth_max_age': 20
                                   },
                                   coverage_all=float(table_dict['cov_all']),
                                   as_birth=False,
                                   seasonal_dep={
                                       'min_cov':
                                       float(table_dict['min_season_cov']),
                                       'max_day':
                                       60
                                   },
                                   discard={
                                       'halflife1':
                                       260,
                                       'halflife2':
                                       2106,
                                       'fraction1':
                                       float(table_dict['fast_fraction'])
                                   },
                                   nodeIDs=nodeIDs)

        # Birthnet distribution
        for table, group in BIRTH_binned_and_grouped:
            table_dict = dict(zip((BIRTH_data_fields), table))
            node_list = sorted(group['grid_cell'])
            if node_list == sorted(self.catch_cells):
                nodeIDs = []
            else:
                nodeIDs = node_list

            start = float(table_dict['simday'])
            if start >= 0:
                add_ITN_age_season(cb,
                                   as_birth=True,
                                   duration=table_dict['duration'],
                                   start=float(table_dict['simday']),
                                   age_dep={
                                       'youth_cov':
                                       float(table_dict['age_cov']),
                                       'youth_min_age': 5,
                                       'youth_max_age': 20
                                   },
                                   coverage_all=float(table_dict['cov_all']),
                                   seasonal_dep={
                                       'min_cov':
                                       float(table_dict['min_season_cov']),
                                       'max_day':
                                       60
                                   },
                                   discard={
                                       'halflife1':
                                       260,
                                       'halflife2':
                                       2106,
                                       'fraction1':
                                       float(table_dict['fast_fraction'])
                                   },
                                   nodeIDs=nodeIDs)
    def add_hs(self, cb, filename=None):
        if not filename:
            filename = self.dropbox_base + "inputs/grid_csv/grid_all_healthseek_events.csv"
        intervene_events = pd.read_csv(filename)

        # Restrict to catchment of interest
        intervene_events = intervene_events[np.in1d(
            intervene_events['grid_cell'], self.catch_cells)]
        intervene_events.reset_index(inplace=True)

        # Compute simulation days relative to start date or use default in file
        intervene_events['simday'] = [
            convert_to_day_365(x, self.start_date, "%Y-%m-%d")
            for x in intervene_events.fulldate
        ]

        hs_field_list = [
            "cov_newclin_youth", "cov_newclin_adult", "cov_severe_youth",
            "cov_severe_adult", "duration"
        ]
        binned_intervene_events, binned_and_grouped, data_fields = self.try_campaign_compression_v2(
            intervene_events, hs_field_list)

        for table, group in binned_and_grouped:
            table_dict = dict(zip((data_fields), table))

            node_list = sorted(group['grid_cell'])
            if node_list == sorted(self.catch_cells):
                node_dict = {"class": "NodeSetAll"}
            else:
                node_dict = {
                    "class": "NodeSetNodeList",
                    "Node_List": node_list
                }

            add_health_seeking(cb,
                               start_day=float(table_dict['simday']),
                               targets=[{
                                   'trigger':
                                   'NewClinicalCase',
                                   'coverage':
                                   float(table_dict['cov_newclin_youth']),
                                   'agemin':
                                   0,
                                   'agemax':
                                   5,
                                   'seek':
                                   1,
                                   'rate':
                                   0.3
                               }, {
                                   'trigger':
                                   'NewClinicalCase',
                                   'coverage':
                                   float(table_dict['cov_newclin_adult']),
                                   'agemin':
                                   5,
                                   'agemax':
                                   100,
                                   'seek':
                                   1,
                                   'rate':
                                   0.3
                               }, {
                                   'trigger':
                                   'NewSevereCase',
                                   'coverage':
                                   float(table_dict['cov_severe_youth']),
                                   'agemin':
                                   0,
                                   'agemax':
                                   5,
                                   'seek':
                                   1,
                                   'rate':
                                   0.5
                               }, {
                                   'trigger':
                                   'NewSevereCase',
                                   'coverage':
                                   float(table_dict['cov_severe_adult']),
                                   'agemin':
                                   5,
                                   'agemax':
                                   100,
                                   'seek':
                                   1,
                                   'rate':
                                   0.5
                               }],
                               drug=['Artemether', 'Lumefantrine'],
                               dosing='FullTreatmentNewDetectionTech',
                               nodes=node_dict,
                               duration=float(table_dict['duration']))