pypsa-eur/scripts/build_temperature_profiles.py
2022-12-28 12:20:34 +01:00

54 lines
1.6 KiB
Python

"""Build temperature profiles."""
import geopandas as gpd
import atlite
import pandas as pd
import xarray as xr
import numpy as np
from dask.distributed import Client, LocalCluster
if __name__ == '__main__':
if 'snakemake' not in globals():
from helper import mock_snakemake
snakemake = mock_snakemake(
'build_temperature_profiles',
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_config = snakemake.config['atlite']['cutout']
cutout = atlite.Cutout(cutout_config).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)))
nonzero_sum = M.sum(axis=0, keepdims=True)
nonzero_sum[nonzero_sum == 0.] = 1.
M_tilde = M / nonzero_sum
temp_air = cutout.temperature(
matrix=M_tilde.T, index=clustered_regions.index,
dask_kwargs=dict(scheduler=client),
show_progress=False)
temp_air.to_netcdf(snakemake.output.temp_air)
temp_soil = cutout.soil_temperature(
matrix=M_tilde.T, index=clustered_regions.index,
dask_kwargs=dict(scheduler=client),
show_progress=False)
temp_soil.to_netcdf(snakemake.output.temp_soil)