From 98b3ef5e2003cc16c65b71baea6154bc6165e582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20H=C3=B6rsch?= Date: Fri, 26 Oct 2018 10:33:58 +0200 Subject: [PATCH] Add _helpers, used by plot_network --- scripts/_helpers.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 scripts/_helpers.py diff --git a/scripts/_helpers.py b/scripts/_helpers.py new file mode 100644 index 00000000..ccc1f38c --- /dev/null +++ b/scripts/_helpers.py @@ -0,0 +1,106 @@ +import pandas as pd +import numpy as np +from six import iteritems, iterkeys, itervalues + +import pypsa + +from add_electricity import load_costs, update_transmission_costs + +def pdbcast(v, h): + return pd.DataFrame(v.values.reshape((-1, 1)) * h.values, + index=v.index, columns=h.index) + +def load_network(fn, tech_costs, config, combine_hydro_ps=True): + opts = config['plotting'] + + n = pypsa.Network(fn) + + n.loads["carrier"] = n.loads.bus.map(n.buses.carrier) + " load" + n.stores["carrier"] = n.stores.bus.map(n.buses.carrier) + + n.links["carrier"] = (n.links.bus0.map(n.buses.carrier) + "-" + n.links.bus1.map(n.buses.carrier)) + n.lines["carrier"] = "AC line" + n.transformers["carrier"] = "AC transformer" + + n.lines['s_nom'] = n.lines['s_nom_min'] + n.links['p_nom'] = n.links['p_nom_min'] + + if combine_hydro_ps: + n.storage_units.loc[n.storage_units.carrier.isin({'PHS', 'hydro'}), 'carrier'] = 'hydro+PHS' + + # #if the carrier was not set on the heat storage units + # bus_carrier = n.storage_units.bus.map(n.buses.carrier) + # n.storage_units.loc[bus_carrier == "heat","carrier"] = "water tanks" + + for name in opts['heat_links'] + opts['heat_generators']: + n.links.loc[n.links.index.to_series().str.endswith(name), "carrier"] = name + + Nyears = n.snapshot_weightings.sum()/8760. + costs = load_costs(Nyears, tech_costs, config['costs'], config['electricity']) + update_transmission_costs(n, costs) + + return n + +def aggregate_p_nom(n): + return pd.concat([ + n.generators.groupby("carrier").p_nom_opt.sum(), + n.storage_units.groupby("carrier").p_nom_opt.sum(), + n.links.groupby("carrier").p_nom_opt.sum(), + n.loads_t.p.groupby(n.loads.carrier,axis=1).sum().mean() + ]) + +def aggregate_p(n): + return pd.concat([ + n.generators_t.p.sum().groupby(n.generators.carrier).sum(), + n.storage_units_t.p.sum().groupby(n.storage_units.carrier).sum(), + n.stores_t.p.sum().groupby(n.stores.carrier).sum(), + -n.loads_t.p.sum().groupby(n.loads.carrier).sum() + ]) + +def aggregate_e_nom(n): + return pd.concat([ + (n.storage_units["p_nom_opt"]*n.storage_units["max_hours"]).groupby(n.storage_units["carrier"]).sum(), + n.stores["e_nom_opt"].groupby(n.stores.carrier).sum() + ]) + +def aggregate_p_curtailed(n): + return pd.concat([ + ((n.generators_t.p_max_pu.sum().multiply(n.generators.p_nom_opt) - n.generators_t.p.sum()) + .groupby(n.generators.carrier).sum()), + ((n.storage_units_t.inflow.sum() - n.storage_units_t.p.sum()) + .groupby(n.storage_units.carrier).sum()) + ]) + +def aggregate_costs(n, flatten=False, opts=None, existing_only=False): + components = dict(Link=("p_nom", "p0"), + Generator=("p_nom", "p"), + StorageUnit=("p_nom", "p"), + Store=("e_nom", "p"), + Line=("s_nom", None), + Transformer=("s_nom", None)) + + costs = {} + for c, (p_nom, p_attr) in zip( + n.iterate_components(iterkeys(components), skip_empty=False), + itervalues(components) + ): + if not existing_only: p_nom += "_opt" + costs[(c.list_name, 'capital')] = (c.df[p_nom] * c.df.capital_cost).groupby(c.df.carrier).sum() + if p_attr is not None: + p = c.pnl[p_attr].sum() + if c.name == 'StorageUnit': + p = p.loc[p > 0] + costs[(c.list_name, 'marginal')] = (p*c.df.marginal_cost).groupby(c.df.carrier).sum() + costs = pd.concat(costs) + + if flatten: + assert opts is not None + conv_techs = opts['conv_techs'] + + costs = costs.reset_index(level=0, drop=True) + costs = costs['capital'].add( + costs['marginal'].rename({t: t + ' marginal' for t in conv_techs}), + fill_value=0. + ) + + return costs