def upsample(cntry, group):
        """
        Distributes load in country according to population and gdp
        """
        l = gegis_load.loc[gegis_load.region_code ==
                           cntry]["Electricity demand"]
        if len(group) == 1:
            return pd.DataFrame({group.index[0]: l})
        else:
            shapes_cntry = shapes.loc[shapes.country == cntry]
            transfer = vtransfer.Shapes2Shapes(group,
                                               shapes_cntry.geometry,
                                               normed=False).T.tocsr()
            gdp_n = pd.Series(transfer.dot(
                shapes_cntry["gdp"].fillna(1.0).values),
                              index=group.index)
            pop_n = pd.Series(transfer.dot(
                shapes_cntry["pop"].fillna(1.0).values),
                              index=group.index)

            # relative factors 0.6 and 0.4 have been determined from a linear
            # regression on the country to EU continent load data
            # (refer to vresutils.load._upsampling_weights)
            # TODO: require adjustment for Africa
            factors = normed(0.6 * normed(gdp_n) + 0.4 * normed(pop_n))
            return pd.DataFrame(
                factors.values * l.values[:, np.newaxis],
                index=l.index,
                columns=factors.index,
            )
Пример #2
0
    def upsample(cntry, group):
        l = opsd_load[cntry]
        if len(group) == 1:
            return pd.DataFrame({group.index[0]: l})
        else:
            nuts3_cntry = nuts3.loc[nuts3.country == cntry]
            transfer = vtransfer.Shapes2Shapes(group, nuts3_cntry.geometry, normed=False).T.tocsr()
            gdp_n = pd.Series(transfer.dot(nuts3_cntry['gdp'].fillna(1.).values), index=group.index)
            pop_n = pd.Series(transfer.dot(nuts3_cntry['pop'].fillna(1.).values), index=group.index)

            # relative factors 0.6 and 0.4 have been determined from a linear
            # regression on the country to continent load data (refer to vresutils.load._upsampling_weights)
            factors = normed(0.6 * normed(gdp_n) + 0.4 * normed(pop_n))
            return pd.DataFrame(factors.values * l.values[:,np.newaxis], index=l.index, columns=factors.index)
def build_population_map():

    #2014 populations for NUTS3
    gdp, pop = vload.gdppop_nuts3()

    #pd.Series nuts3 code -> 2-letter country codes
    mapping = vmapping.countries_to_nuts3()

    countries = mapping.value_counts().index.sort_values()

    #Swiss fix
    pop["CH040"] = pop["CH04"]
    pop["CH070"] = pop["CH07"]

    #Separately researched for Montenegro, Albania, Bosnia, Serbia
    pop["ME000"] = 650
    pop["AL1"] = 2893
    pop["BA1"] = 3871
    pop["RS1"] = 7210

    #pd.Series nuts3 code -> polygon
    nuts3 = pd.Series(vshapes.nuts3(tolerance=None, minarea=0.))

    #takes 10 minutes
    pop_map = pd.DataFrame()

    for country in countries:
        print(country)
        country_nuts = mapping.index[mapping == country]
        trans_matrix = vtransfer.Shapes2Shapes(np.asarray(nuts3[country_nuts]),
                                               grid_cells)
        #CH has missing bits
        country_pop = pop[country_nuts].fillna(0.)
        pop_map[country] = np.array(
            trans_matrix.multiply(np.asarray(country_pop)).sum(axis=1))[:, 0]

    with pd.HDFStore(snakemake.output.pop_map_name, mode='w',
                     complevel=4) as store:
        store['population_gridcell_map'] = pop_map