# -*- coding: utf-8 -*- """ Build heat demand time series. """ import atlite import geopandas as gpd import numpy as np import pandas as pd import xarray as xr from dask.distributed import Client, LocalCluster if __name__ == "__main__": if "snakemake" not in globals(): from helper import mock_snakemake snakemake = mock_snakemake( "build_heat_demands", simpl="", clusters=48, ) nprocesses = int(snakemake.threads) cluster = LocalCluster(n_workers=nprocesses, threads_per_worker=1) client = Client(cluster, asynchronous=True) time = pd.date_range(freq="h", **snakemake.config["snapshots"]) cutout = atlite.Cutout(snakemake.input.cutout).sel(time=time) clustered_regions = ( gpd.read_file(snakemake.input.regions_onshore) .set_index("name") .buffer(0) .squeeze() ) I = cutout.indicatormatrix(clustered_regions) pop_layout = xr.open_dataarray(snakemake.input.pop_layout) stacked_pop = pop_layout.stack(spatial=("y", "x")) M = I.T.dot(np.diag(I.dot(stacked_pop))) heat_demand = cutout.heat_demand( matrix=M.T, index=clustered_regions.index, dask_kwargs=dict(scheduler=client), show_progress=False, ) heat_demand.to_netcdf(snakemake.output.heat_demand)