예제 #1
0
    def to_gbd_avgint(self, parent_location_id, sex_id):
        """
        Converts the demographics of the model to the avgint table.
        :return:
        """
        LOG.info(f"Getting grid for the avgint table "
                 f"for parent location ID {parent_location_id} "
                 f"and sex_id {sex_id}.")
        grid = expand_grid({
            'sex_id': [sex_id],
            'location_id':
            self.location_dag.parent_children(parent_location_id),
            'year_id':
            self.demographics.year_id,
            'age_group_id':
            self.demographics.age_group_id
        })
        grid['time_lower'] = grid['year_id'].astype(int)
        grid['time_upper'] = grid['year_id'] + 1.
        grid = BaseInput(
            gbd_round_id=self.gbd_round_id).convert_to_age_lower_upper(df=grid)

        LOG.info("Adding covariates to avgint grid.")
        grid = self.add_covariates_to_data(df=grid)
        return grid
예제 #2
0
def get_prior_avgint_grid(settings,
                          integrands,
                          sexes,
                          locations,
                          midpoint=False):
    """
    Get a data frame to use for setting up posterior predictions on a grid.

    Will still need to have covariates added to it, and prep data from
    dismod.api.data_tables.prep_data_avgint to convert nodes and covariate names
    before it can be input into the avgint table in a database.

    Args:
        settings: (cascade_at.settings.settings_configuration.SettingsConfiguration)
        integrands: (list of str)
        sexes: (list of int)
        locations: (list of int)
        midpoint: (bool)

    Returns: (pd.DataFrame) with columns
        "avgint_id", "integrand_id", "location_id", "weight_id", "subgroup_id",
        "age_lower", "age_upper", "time_lower", "time_upper", "sex_id"

    """
    posterior_dfs = pd.DataFrame()
    alchemy = Alchemy(settings)
    grids = integrand_grids(alchemy=alchemy, integrands=integrands)
    for k, v in grids.items():
        if midpoint:
            time = vec_to_midpoint(v['time'])
            age = vec_to_midpoint(v['age'])
        else:
            time = v['time']
            age = v['age']

        posterior_df = expand_grid({
            'age_lower': age,
            'time_lower': time,
            'location_id': locations,
            'sex_id': sexes
        })
        posterior_df['time_upper'] = posterior_df['time_lower']
        posterior_df['age_upper'] = posterior_df['age_lower']

        posterior_df['rate'] = k
        posterior_df['integrand'] = posterior_df['rate'].map(RateToIntegrand)
        posterior_df['integrand_id'] = posterior_df['integrand'].apply(
            lambda x: IntegrandEnum[x].value)
        posterior_df['weight_id'] = posterior_df["integrand"].apply(
            lambda x: INTEGRAND_TO_WEIGHT[x].value)
        posterior_df['subgroup_id'] = 0

        posterior_dfs = posterior_dfs.append(posterior_df)

    return posterior_dfs[[
        "integrand_id", "location_id", "weight_id", "subgroup_id", "age_lower",
        "age_upper", "time_lower", "time_upper", "sex_id"
    ]]
예제 #3
0
def population(Demographics, ihme):
    pop = Population(demographics=Demographics,
                     decomp_step='step3',
                     gbd_round_id=6)
    raw = expand_grid({
        'age_group_id': Demographics.age_group_id,
        'location_id': np.array([70., 72.]),
        'year_id': np.array([1990.]),
        'sex_id': np.array([1., 2.])
    })
    raw['population'] = 3000.
    raw['run_id'] = np.nan
    pop.raw = raw
    return pop
예제 #4
0
def get_prior_avgint_grid(grids: Dict[str, Dict[str, np.ndarray]],
                          sexes: List[int],
                          locations: List[int],
                          midpoint: bool = False) -> pd.DataFrame:
    """
    Get a data frame to use for setting up posterior predictions on a grid.
    The grids are specified in the grids parameter.

    Will still need to have covariates added to it, and prep data from
    dismod.api.data_tables.prep_data_avgint to convert nodes and covariate names
    before it can be input into the avgint table in a database.

    Parameters
    ---------
    grids
        A dictionary of grids with keys for each integrand,
        which are dictionaries for "age" and "time".
    sexes
        A list of sexes
    locations
        A list of locations
    midpoint
        Whether to midpoint the grid lower and upper values (recommended for rates).

    Returns
    -------
    Dataframe with columns
        "avgint_id", "integrand_id", "location_id", "weight_id", "subgroup_id",
        "age_lower", "age_upper", "time_lower", "time_upper", "sex_id"

    """
    posterior_dfs = pd.DataFrame()
    for k, v in grids.items():
        if midpoint:
            time = vec_to_midpoint(v['time'])
            age = vec_to_midpoint(v['age'])
        else:
            time = v['time']
            age = v['age']

        posterior_df = expand_grid({
            'age_lower': age,
            'time_lower': time,
            'location_id': locations,
            'sex_id': sexes
        })
        posterior_df['time_upper'] = posterior_df['time_lower']
        posterior_df['age_upper'] = posterior_df['age_lower']

        posterior_df['rate'] = k
        posterior_df['integrand'] = posterior_df['rate'].map(RateToIntegrand)
        posterior_df['integrand_id'] = posterior_df['integrand'].apply(
            lambda x: IntegrandEnum[x].value
        )
        posterior_df['weight_id'] = posterior_df["integrand"].apply(
            lambda x: INTEGRAND_TO_WEIGHT[x].value
        )
        posterior_df['subgroup_id'] = 0

        posterior_dfs = posterior_dfs.append(posterior_df)

    return posterior_dfs[[
        "integrand_id", "location_id", "weight_id", "subgroup_id",
        "age_lower", "age_upper", "time_lower", "time_upper", "sex_id"
    ]]