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, )
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