# -*- coding: utf-8 -*- # SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors # # SPDX-License-Identifier: MIT """ Build population layouts for all clustered model regions as total as well as split by urban and rural population. """ import atlite import geopandas as gpd import pandas as pd import xarray as xr if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake snakemake = mock_snakemake( "build_clustered_population_layouts", simpl="", clusters=48, ) cutout = atlite.Cutout(snakemake.input.cutout) clustered_regions = ( gpd.read_file(snakemake.input.regions_onshore).set_index("name").buffer(0) ) I = cutout.indicatormatrix(clustered_regions) pop = {} for item in ["total", "urban", "rural"]: pop_layout = xr.open_dataarray(snakemake.input[f"pop_layout_{item}"]) pop[item] = I.dot(pop_layout.stack(spatial=("y", "x"))) pop = pd.DataFrame(pop, index=clustered_regions.index) pop["ct"] = pop.index.str[:2] country_population = pop.total.groupby(pop.ct).sum() pop["fraction"] = pop.total / pop.ct.map(country_population) pop.to_csv(snakemake.output.clustered_pop_layout)