adjust summary functions

This commit is contained in:
lisazeyen 2023-04-05 15:45:35 +02:00
parent f2ff8beae8
commit 5989c287c4

View File

@ -1,3 +1,15 @@
# -*- coding: utf-8 -*-
# SPDX-FileCopyrightText: : 2020-2023 The PyPSA-Eur Authors
#
# SPDX-License-Identifier: MIT
"""
Create summary CSV files for all scenario runs with perfect foresight
including costs, capacities, capacity factors, curtailment, energy balances,
prices and other metrics.
"""
from six import iteritems
import pandas as pd
@ -11,7 +23,7 @@ from pypsa.descriptors import (
get_active_assets,
)
from helper import override_component_attrs
from _helpers import override_component_attrs
from prepare_sector_network import prepare_costs
@ -50,8 +62,8 @@ def calculate_costs(n, label, costs):
).astype(int)
capital_costs = active.mul(capital_costs, axis=0)
discount = (
n.investment_period_weightings["objective_weightings"]
/ n.investment_period_weightings["time_weightings"]
n.investment_period_weightings["objective"]
/ n.investment_period_weightings["years"]
)
capital_costs_grouped = (
capital_costs.groupby(c.df.carrier).sum().mul(discount)
@ -66,20 +78,20 @@ def calculate_costs(n, label, costs):
if c.name == "Link":
p = (
c.pnl.p0.multiply(n.snapshot_weightings.generator_weightings, axis=0)
c.pnl.p0.multiply(n.snapshot_weightings.generators, axis=0)
.groupby(level=0)
.sum()
)
elif c.name == "Line":
continue
elif c.name == "StorageUnit":
p_all = c.pnl.p.multiply(n.snapshot_weightings.store_weightings, axis=0)
p_all = c.pnl.p.multiply(n.snapshot_weightings.stores, axis=0)
p_all[p_all < 0.0] = 0.0
p = p_all.groupby(level=0).sum()
else:
p = (
round(c.pnl.p, ndigits=2)
.multiply(n.snapshot_weightings.generator_weightings, axis=0)
.multiply(n.snapshot_weightings.generators, axis=0)
.groupby(level=0)
.sum()
)
@ -285,7 +297,7 @@ def calculate_supply(n, label, supply):
for end in [col[3:] for col in c.df.columns if col[:3] == "bus"]:
items = c.df.index[c.df["bus" + end].map(bus_map, na_action=False)]
items = c.df.index[c.df["bus" + end].map(bus_map).fillna(False)]
if len(items) == 0:
continue
@ -333,9 +345,9 @@ def calculate_supply_energy(n, label, supply_energy):
continue
if c.name == "Generator":
weightings = n.snapshot_weightings.generator_weightings
weightings = n.snapshot_weightings.generators
else:
weightings = n.snapshot_weightings.store_weightings
weightings = n.snapshot_weightings.stores
if i in ["oil", "co2", "H2"]:
if c.name=="Load":
@ -364,7 +376,7 @@ def calculate_supply_energy(n, label, supply_energy):
for end in [col[3:] for col in c.df.columns if col[:3] == "bus"]:
items = c.df.index[c.df["bus" + str(end)].map(bus_map, na_action=False)]
items = c.df.index[c.df["bus" + str(end)].map(bus_map).fillna(False)]
if len(items) == 0:
continue
@ -373,7 +385,7 @@ def calculate_supply_energy(n, label, supply_energy):
(-1)
* c.pnl["p" + end]
.reindex(items, axis=1)
.multiply(n.snapshot_weightings.objective_weightings, axis=0)
.multiply(n.snapshot_weightings.objective, axis=0)
.groupby(level=0)
.sum()
.groupby(c.df.loc[items, "carrier"], axis=1)
@ -593,11 +605,11 @@ def calculate_price_statistics(n, label, price_statistics):
)
price_statistics.at["mean", label] = (
n.buses_t.marginal_price[buses].unstack().mean()
n.buses_t.marginal_price[buses].mean().mean()
)
price_statistics.at["standard_deviation", label] = (
n.buses_t.marginal_price[buses].unstack().std()
n.buses_t.marginal_price[buses].droplevel(0).unstack().std()
)
return price_statistics
@ -612,7 +624,7 @@ def calculate_co2_emissions(n, label, df):
return
weightings = n.snapshot_weightings.mul(
n.investment_period_weightings["time_weightings"]
n.investment_period_weightings["years"]
.reindex(n.snapshots)
.fillna(method="bfill")
.fillna(1.0),
@ -624,7 +636,7 @@ def calculate_co2_emissions(n, label, df):
if not gens.empty:
em_pu = gens.carrier.map(emissions) / gens.efficiency
em_pu = (
weightings["generator_weightings"].to_frame("weightings")
weightings["generators"].to_frame("weightings")
@ em_pu.to_frame("weightings").T
)
emitted = n.generators_t.p[gens.index].mul(em_pu)
@ -648,52 +660,6 @@ def calculate_co2_emissions(n, label, df):
return df
def calculate_cumulative_capacities(n, label, cum_cap):
# TODO
investments = n.investment_periods
cols = pd.MultiIndex.from_product(
[
cum_cap.columns.levels[0],
cum_cap.columns.levels[1],
cum_cap.columns.levels[2],
investments,
],
names=cum_cap.columns.names[:3] + ["year"],
)
cum_cap = cum_cap.reindex(cols, axis=1)
learn_i = n.carriers[n.carriers.learning_rate != 0].index
for c, attr in nominal_attrs.items():
if "carrier" not in n.df(c) or n.df(c).empty:
continue
caps = (
n.df(c)[n.df(c).carrier.isin(learn_i)]
.groupby([n.df(c).carrier, n.df(c).build_year])[
opt_name.get(c, "p") + "_nom_opt"
]
.sum()
)
if caps.empty:
continue
caps = round(
caps.unstack().reindex(columns=investments).fillna(0).cumsum(axis=1)
)
cum_cap = cum_cap.reindex(caps.index.union(cum_cap.index))
cum_cap.loc[caps.index, label] = caps.values
return cum_cap
outputs = [
"nodal_costs",
"nodal_capacities",
@ -711,14 +677,13 @@ outputs = [
"market_values",
"metrics",
"co2_emissions",
"cumulative_capacities",
]
def make_summaries(networks_dict):
columns = pd.MultiIndex.from_tuples(
networks_dict.keys(), names=["cluster", "lv", "opt", "year"]
networks_dict.keys(), names=["cluster", "lv", "opt"]
)
df = {}
@ -760,30 +725,28 @@ def to_csv(df):
if __name__ == "__main__":
# Detect running outside of snakemake and mock snakemake for testing
if "snakemake" not in globals():
from helper import mock_snakemake
from _helpers import mock_snakemake
snakemake = mock_snakemake('make_summary_perfect')
networks_dict = {
(clusters, lv, opts+sector_opts) :
snakemake.config['results_dir'] + snakemake.config['run'] + f'/postnetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_brownfield_all_years.nc' \
"results/" + snakemake.config['run']["name"] + f'/postnetworks/elec_s{simpl}_{clusters}_l{lv}_{opts}_{sector_opts}_brownfield_all_years.nc' \
for simpl in snakemake.config['scenario']['simpl'] \
for clusters in snakemake.config['scenario']['clusters'] \
for opts in snakemake.config['scenario']['opts'] \
for sector_opts in snakemake.config['scenario']['sector_opts'] \
for lv in snakemake.config['scenario']['lv'] \
for lv in snakemake.config['scenario']['ll'] \
}
print(networks_dict)
Nyears = 1
nyears = 1
costs_db = prepare_costs(
snakemake.input.costs,
snakemake.config["costs"]["USD2013_to_EUR2013"],
snakemake.config["costs"]["discountrate"],
Nyears,
snakemake.config["costs"]["lifetime"],
snakemake.config["costs"],
nyears,
)
df = make_summaries(networks_dict)