fix build_district_heat_share and build_transport_demand for multiyear

This commit is contained in:
Fabian Neumann 2024-03-14 16:48:32 +01:00
parent 57b487f163
commit 4fbb3c81c4
7 changed files with 33 additions and 13 deletions

View File

@ -729,6 +729,8 @@ rule build_retro_cost:
rule build_population_weighted_energy_totals: rule build_population_weighted_energy_totals:
params:
snapshots=config_provider("snapshots"),
input: input:
energy_totals=resources("{kind}_totals.csv"), energy_totals=resources("{kind}_totals.csv"),
clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"),
@ -771,6 +773,7 @@ rule build_transport_demand:
snapshots=config_provider("snapshots"), snapshots=config_provider("snapshots"),
drop_leap_day=config_provider("enable", "drop_leap_day"), drop_leap_day=config_provider("enable", "drop_leap_day"),
sector=config_provider("sector"), sector=config_provider("sector"),
energy_totals_year=config_provider("energy", "energy_totals_year"),
input: input:
clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"),
pop_weighted_energy_totals=resources( pop_weighted_energy_totals=resources(
@ -799,6 +802,7 @@ rule build_transport_demand:
rule build_district_heat_share: rule build_district_heat_share:
params: params:
sector=config_provider("sector"), sector=config_provider("sector"),
energy_totals_year=config_provider("energy", "energy_totals_year"),
input: input:
district_heat_share=resources("district_heat_share.csv"), district_heat_share=resources("district_heat_share.csv"),
clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"), clustered_pop_layout=resources("pop_layout_elec_s{simpl}_{clusters}.csv"),

View File

@ -22,7 +22,7 @@ if __name__ == "__main__":
snakemake = mock_snakemake( snakemake = mock_snakemake(
"build_district_heat_share", "build_district_heat_share",
simpl="", simpl="",
clusters=48, clusters=60,
planning_horizons="2050", planning_horizons="2050",
) )
configure_logging(snakemake) configure_logging(snakemake)
@ -32,9 +32,8 @@ if __name__ == "__main__":
pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0) pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout, index_col=0)
district_heat_share = pd.read_csv(snakemake.input.district_heat_share, index_col=0)[ year = str(snakemake.params.energy_totals_year)
"district heat share" district_heat_share = pd.read_csv(snakemake.input.district_heat_share, index_col=0)[year]
]
# make ct-based share nodal # make ct-based share nodal
district_heat_share = district_heat_share.reindex(pop_layout.ct).fillna(0) district_heat_share = district_heat_share.reindex(pop_layout.ct).fillna(0)

View File

@ -721,10 +721,18 @@ def build_transport_data(countries, population, idees):
transport_data = pd.DataFrame(idees["passenger cars"]) transport_data = pd.DataFrame(idees["passenger cars"])
countries_without_ch = set(countries) - {"CH"}
new_index = pd.MultiIndex.from_product(
[countries_without_ch, transport_data.index.levels[1]],
names=["country", "year"]
)
transport_data = transport_data.reindex(index=new_index)
# https://www.bfs.admin.ch/bfs/en/home/statistics/mobility-transport/transport-infrastructure-vehicles/vehicles/road-vehicles-stock-level-motorisation.html # https://www.bfs.admin.ch/bfs/en/home/statistics/mobility-transport/transport-infrastructure-vehicles/vehicles/road-vehicles-stock-level-motorisation.html
if "CH" in countries: if "CH" in countries:
fn = snakemake.input.swiss_transport fn = snakemake.input.swiss_transport
swiss_cars = pd.read_csv(fn, index_col=0).loc[1990:2021, ["passenger cars"]] swiss_cars = pd.read_csv(fn, index_col=0).loc[2000:2015, ["passenger cars"]]
swiss_cars.index = pd.MultiIndex.from_product( swiss_cars.index = pd.MultiIndex.from_product(
[["CH"], swiss_cars.index], names=["country", "year"] [["CH"], swiss_cars.index], names=["country", "year"]
@ -741,7 +749,14 @@ def build_transport_data(countries, population, idees):
) )
cars_pp = transport_data["number cars"] / population cars_pp = transport_data["number cars"] / population
transport_data.loc[missing, "number cars"] = cars_pp.mean() * population
fill_values = {year: cars_pp.mean() * population for year in transport_data.index.levels[1]}
fill_values = pd.DataFrame(fill_values).stack()
fill_values = pd.DataFrame(fill_values, columns=["number cars"])
fill_values.index.names = ["country", "year"]
fill_values = fill_values.reindex(transport_data.index)
transport_data = transport_data.combine_first(fill_values)
# collect average fuel efficiency in kWh/km # collect average fuel efficiency in kWh/km

View File

@ -15,7 +15,7 @@ if __name__ == "__main__":
snakemake = mock_snakemake( snakemake = mock_snakemake(
"build_population_weighted_energy_totals", "build_population_weighted_energy_totals",
kind="energy", kind="heat",
simpl="", simpl="",
clusters=60, clusters=60,
) )

View File

@ -23,8 +23,9 @@ from _helpers import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def build_nodal_transport_data(fn, pop_layout): def build_nodal_transport_data(fn, pop_layout, year):
transport_data = pd.read_csv(fn, index_col=0) transport_data = pd.read_csv(fn, index_col=[0, 1])
transport_data = transport_data.xs(min(2015, year), level='year')
nodal_transport_data = transport_data.loc[pop_layout.ct].fillna(0.0) nodal_transport_data = transport_data.loc[pop_layout.ct].fillna(0.0)
nodal_transport_data.index = pop_layout.index nodal_transport_data.index = pop_layout.index
@ -173,7 +174,7 @@ if __name__ == "__main__":
snakemake = mock_snakemake( snakemake = mock_snakemake(
"build_transport_demand", "build_transport_demand",
simpl="", simpl="",
clusters=48, clusters=60,
) )
configure_logging(snakemake) configure_logging(snakemake)
set_scenario_config(snakemake) set_scenario_config(snakemake)
@ -194,8 +195,9 @@ if __name__ == "__main__":
nyears = len(snapshots) / 8760 nyears = len(snapshots) / 8760
energy_totals_year = snakemake.params.energy_totals_year
nodal_transport_data = build_nodal_transport_data( nodal_transport_data = build_nodal_transport_data(
snakemake.input.transport_data, pop_layout snakemake.input.transport_data, pop_layout, energy_totals_year
) )
transport_demand = build_transport_demand( transport_demand = build_transport_demand(

View File

@ -205,7 +205,7 @@ def average_every_nhours(n, offset):
snapshot_weightings = n.snapshot_weightings.resample(offset).sum() snapshot_weightings = n.snapshot_weightings.resample(offset).sum()
sns = snapshot_weightings.index sns = snapshot_weightings.index
if snakemake.params.drop_leap_days: if snakemake.params.drop_leap_day:
sns = sns[~((sns.month == 2) & (sns.day == 29))] sns = sns[~((sns.month == 2) & (sns.day == 29))]
m.set_snapshots(snapshot_weightings.index) m.set_snapshots(snapshot_weightings.index)
m.snapshot_weightings = snapshot_weightings m.snapshot_weightings = snapshot_weightings

View File

@ -813,7 +813,7 @@ def average_every_nhours(n, offset):
snapshot_weightings = n.snapshot_weightings.resample(offset).sum() snapshot_weightings = n.snapshot_weightings.resample(offset).sum()
sns = snapshot_weightings.index sns = snapshot_weightings.index
if snakemake.params.drop_leap_days: if snakemake.params.drop_leap_day:
sns = sns[~((sns.month == 2) & (sns.day == 29))] sns = sns[~((sns.month == 2) & (sns.day == 29))]
snapshot_weightings = snapshot_weightings.loc[sns] snapshot_weightings = snapshot_weightings.loc[sns]
m.set_snapshots(snapshot_weightings.index) m.set_snapshots(snapshot_weightings.index)