From 747bf5d815f4296ef9215c72d7acb490b126751c Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Wed, 17 May 2023 12:55:17 +0200 Subject: [PATCH] add time dependent co2 price --- rules/build_electricity.smk | 2 +- scripts/prepare_network.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 7cf08a5f..eec172d2 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -285,7 +285,6 @@ rule add_electricity: powerplants=RESOURCES + "powerplants.csv", hydro_capacities=ancient("data/bundle/hydro_capacities.csv"), geth_hydro_capacities="data/geth2015_hydro_capacities.csv", - co2_price="data/validation/CO2_price_2019.csv", fuel_price="data/validation/monthly_fuel_price.csv", load=RESOURCES + "load.csv", nuts3_shapes=RESOURCES + "nuts3_shapes.geojson", @@ -383,6 +382,7 @@ rule prepare_network: input: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec.nc", tech_costs=COSTS, + co2_price="data/validation/CO2_price_2019.csv", output: RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", log: diff --git a/scripts/prepare_network.py b/scripts/prepare_network.py index 14a003ae..64b9fea2 100755 --- a/scripts/prepare_network.py +++ b/scripts/prepare_network.py @@ -65,6 +65,7 @@ import pandas as pd import pypsa from _helpers import configure_logging from add_electricity import load_costs, update_transmission_costs +from pypsa.descriptors import expand_series idx = pd.IndexSlice @@ -105,6 +106,17 @@ def add_emission_prices(n, emission_prices={"co2": 0.0}, exclude_co2=False): n.generators["marginal_cost"] += gen_ep su_ep = n.storage_units.carrier.map(ep) / n.storage_units.efficiency_dispatch n.storage_units["marginal_cost"] += su_ep + + +def add_emission_prices_t(n): + co2_price = pd.read_csv(snakemake.input.co2_price, index_col=0, + parse_dates=True) + co2_price = co2_price[~co2_price.index.duplicated()] + co2_price = co2_price.reindex(n.snapshots).fillna(method="ffill").fillna(method="bfill") + emissions = n.generators.carrier.map(n.carriers.co2_emissions) + co2_cost = (expand_series(emissions, n.snapshots).T + .mul(co2_price.iloc[:,0], axis=0)) + n.generators_t.marginal_cost += (co2_cost.reindex(columns=n.generators_t.marginal_cost.columns)) def set_line_s_max_pu(n, s_max_pu=0.7): @@ -238,12 +250,13 @@ def set_line_nom_max(n, s_nom_max_set=np.inf, p_nom_max_set=np.inf): n.links.p_nom_max.clip(upper=p_nom_max_set, inplace=True) +#%% if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake snakemake = mock_snakemake( - "prepare_network", simpl="", clusters="40", ll="v0.3", opts="Co2L-24H" + "prepare_network", simpl="", clusters="37c", ll="v1.0", opts="24H-Ept" ) configure_logging(snakemake) @@ -324,6 +337,9 @@ if __name__ == "__main__": logger.info("Setting emission prices according to config value.") add_emission_prices(n, snakemake.config["costs"]["emission_prices"]) break + if "ept" in o: + logger.info("Setting time dependent emission prices according spot market price") + add_emission_prices_t(n) ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:] set_transmission_limit(n, ll_type, factor, costs, Nyears)