Compute cfs; compute nodal costs, capacities, cfs; fix prices
This commit is contained in:
parent
71c04909b5
commit
52a02bd979
@ -218,6 +218,10 @@ rule make_summary:
|
|||||||
**config['scenario'])
|
**config['scenario'])
|
||||||
#heat_demand_name='data/heating/daily_heat_demand.h5'
|
#heat_demand_name='data/heating/daily_heat_demand.h5'
|
||||||
output:
|
output:
|
||||||
|
nodal_costs=config['summary_dir'] + '/' + config['run'] + '/csvs/nodal_costs.csv',
|
||||||
|
nodal_capacities=config['summary_dir'] + '/' + config['run'] + '/csvs/nodal_capacities.csv',
|
||||||
|
nodal_cfs=config['summary_dir'] + '/' + config['run'] + '/csvs/nodal_cfs.csv',
|
||||||
|
cfs=config['summary_dir'] + '/' + config['run'] + '/csvs/cfs.csv',
|
||||||
costs=config['summary_dir'] + '/' + config['run'] + '/csvs/costs.csv',
|
costs=config['summary_dir'] + '/' + config['run'] + '/csvs/costs.csv',
|
||||||
capacities=config['summary_dir'] + '/' + config['run'] + '/csvs/capacities.csv',
|
capacities=config['summary_dir'] + '/' + config['run'] + '/csvs/capacities.csv',
|
||||||
curtailment=config['summary_dir'] + '/' + config['run'] + '/csvs/curtailment.csv',
|
curtailment=config['summary_dir'] + '/' + config['run'] + '/csvs/curtailment.csv',
|
||||||
|
@ -53,6 +53,103 @@ def assign_carriers(n):
|
|||||||
if n.stores.loc["EU gas Store","carrier"] == "":
|
if n.stores.loc["EU gas Store","carrier"] == "":
|
||||||
n.stores.loc["EU gas Store","carrier"] = "gas Store"
|
n.stores.loc["EU gas Store","carrier"] = "gas Store"
|
||||||
|
|
||||||
|
def assign_locations(n):
|
||||||
|
for c in n.iterate_components(n.one_port_components|n.branch_components):
|
||||||
|
|
||||||
|
ifind = pd.Series(c.df.index.str.find(" ",start=4),c.df.index)
|
||||||
|
|
||||||
|
for i in ifind.unique():
|
||||||
|
names = ifind.index[ifind == i]
|
||||||
|
|
||||||
|
if i == -1:
|
||||||
|
c.df.loc[names,'location'] = ""
|
||||||
|
else:
|
||||||
|
c.df.loc[names,'location'] = names.str[:i]
|
||||||
|
|
||||||
|
def calculate_nodal_cfs(n,label,nodal_cfs):
|
||||||
|
#Beware this also has extraneous locations for country (e.g. biomass) or continent-wide (e.g. fossil gas/oil) stuff
|
||||||
|
for c in n.iterate_components((n.branch_components^{"Line","Transformer"})|n.controllable_one_port_components^{"Load","StorageUnit"}):
|
||||||
|
capacities_c = c.df[opt_name.get(c.name,"p") + "_nom_opt"].groupby((c.df.location,c.df.carrier)).sum()
|
||||||
|
|
||||||
|
if c.name == "Link":
|
||||||
|
p = c.pnl.p0.abs().mean()
|
||||||
|
elif c.name == "Generator":
|
||||||
|
p = c.pnl.p.abs().mean()
|
||||||
|
elif c.name == "Store":
|
||||||
|
p = c.pnl.e.abs().mean()
|
||||||
|
else:
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
p_c = p.groupby((c.df.location,c.df.carrier)).sum()
|
||||||
|
|
||||||
|
cf_c = p_c/capacities_c
|
||||||
|
|
||||||
|
index = pd.MultiIndex.from_tuples([(c.list_name,) + t for t in cf_c.index.to_list()])
|
||||||
|
nodal_cfs = nodal_cfs.reindex(nodal_cfs.index|index)
|
||||||
|
nodal_cfs.loc[index,label] = cf_c.values
|
||||||
|
|
||||||
|
return nodal_cfs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_cfs(n,label,cfs):
|
||||||
|
|
||||||
|
for c in n.iterate_components(n.branch_components|n.controllable_one_port_components^{"Load","StorageUnit"}):
|
||||||
|
capacities_c = c.df[opt_name.get(c.name,"p") + "_nom_opt"].groupby(c.df.carrier).sum()
|
||||||
|
|
||||||
|
if c.name in ["Link","Line","Transformer"]:
|
||||||
|
p = c.pnl.p0.abs().mean()
|
||||||
|
elif c.name == "Store":
|
||||||
|
p = c.pnl.e.abs().mean()
|
||||||
|
else:
|
||||||
|
p = c.pnl.p.abs().mean()
|
||||||
|
|
||||||
|
p_c = p.groupby(c.df.carrier).sum()
|
||||||
|
|
||||||
|
cf_c = p_c/capacities_c
|
||||||
|
|
||||||
|
cfs = cfs.reindex(cfs.index|pd.MultiIndex.from_product([[c.list_name],cf_c.index]))
|
||||||
|
|
||||||
|
cfs.loc[idx[c.list_name,list(cf_c.index)],label] = cf_c.values
|
||||||
|
|
||||||
|
return cfs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_nodal_costs(n,label,nodal_costs):
|
||||||
|
#Beware this also has extraneous locations for country (e.g. biomass) or continent-wide (e.g. fossil gas/oil) stuff
|
||||||
|
for c in n.iterate_components(n.branch_components|n.controllable_one_port_components^{"Load"}):
|
||||||
|
capital_costs = (c.df.capital_cost*c.df[opt_name.get(c.name,"p") + "_nom_opt"]).groupby((c.df.location,c.df.carrier)).sum()
|
||||||
|
index = pd.MultiIndex.from_tuples([(c.list_name,"capital") + t for t in capital_costs.index.to_list()])
|
||||||
|
nodal_costs = nodal_costs.reindex(nodal_costs.index|index)
|
||||||
|
nodal_costs.loc[index,label] = capital_costs.values
|
||||||
|
|
||||||
|
if c.name == "Link":
|
||||||
|
p = c.pnl.p0.multiply(n.snapshot_weightings,axis=0).sum()
|
||||||
|
elif c.name == "Line":
|
||||||
|
continue
|
||||||
|
elif c.name == "StorageUnit":
|
||||||
|
p_all = c.pnl.p.multiply(n.snapshot_weightings,axis=0)
|
||||||
|
p_all[p_all < 0.] = 0.
|
||||||
|
p = p_all.sum()
|
||||||
|
else:
|
||||||
|
p = c.pnl.p.multiply(n.snapshot_weightings,axis=0).sum()
|
||||||
|
|
||||||
|
#correct sequestration cost
|
||||||
|
if c.name == "Store":
|
||||||
|
items = c.df.index[(c.df.carrier == "co2 stored") & (c.df.marginal_cost <= -100.)]
|
||||||
|
c.df.loc[items,"marginal_cost"] = -20.
|
||||||
|
|
||||||
|
marginal_costs = (p*c.df.marginal_cost).groupby((c.df.location,c.df.carrier)).sum()
|
||||||
|
index = pd.MultiIndex.from_tuples([(c.list_name,"marginal") + t for t in marginal_costs.index.to_list()])
|
||||||
|
nodal_costs = nodal_costs.reindex(nodal_costs.index|index)
|
||||||
|
nodal_costs.loc[index,label] = marginal_costs.values
|
||||||
|
|
||||||
|
return nodal_costs
|
||||||
|
|
||||||
|
|
||||||
def calculate_costs(n,label,costs):
|
def calculate_costs(n,label,costs):
|
||||||
|
|
||||||
@ -104,6 +201,18 @@ def calculate_costs(n,label,costs):
|
|||||||
return costs
|
return costs
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_nodal_capacities(n,label,nodal_capacities):
|
||||||
|
#Beware this also has extraneous locations for country (e.g. biomass) or continent-wide (e.g. fossil gas/oil) stuff
|
||||||
|
for c in n.iterate_components(n.branch_components|n.controllable_one_port_components^{"Load"}):
|
||||||
|
nodal_capacities_c = c.df[opt_name.get(c.name,"p") + "_nom_opt"].groupby((c.df.location,c.df.carrier)).sum()
|
||||||
|
index = pd.MultiIndex.from_tuples([(c.list_name,) + t for t in nodal_capacities_c.index.to_list()])
|
||||||
|
nodal_capacities = nodal_capacities.reindex(nodal_capacities.index|index)
|
||||||
|
nodal_capacities.loc[index,label] = nodal_capacities_c.values
|
||||||
|
|
||||||
|
return nodal_capacities
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def calculate_capacities(n,label,capacities):
|
def calculate_capacities(n,label,capacities):
|
||||||
|
|
||||||
@ -247,12 +356,10 @@ def calculate_metrics(n,label,metrics):
|
|||||||
|
|
||||||
def calculate_prices(n,label,prices):
|
def calculate_prices(n,label,prices):
|
||||||
|
|
||||||
bus_type = pd.Series(n.buses.index.str[3:],n.buses.index).replace("","electricity")
|
prices = prices.reindex(prices.index|n.buses.carrier.unique())
|
||||||
|
|
||||||
prices = prices.reindex(prices.index|bus_type.value_counts().index)
|
#WARNING: this is time-averaged, see weighted_prices for load-weighted average
|
||||||
|
prices[label] = n.buses_t.marginal_price.mean().groupby(n.buses.carrier).mean()
|
||||||
#WARNING: this is time-averaged, should really be load-weighted average
|
|
||||||
prices[label] = n.buses_t.marginal_price.mean().groupby(bus_type).mean()
|
|
||||||
|
|
||||||
return prices
|
return prices
|
||||||
|
|
||||||
@ -389,7 +496,11 @@ def calculate_price_statistics(n, label, price_statistics):
|
|||||||
return price_statistics
|
return price_statistics
|
||||||
|
|
||||||
|
|
||||||
outputs = ["costs",
|
outputs = ["nodal_costs",
|
||||||
|
"nodal_capacities",
|
||||||
|
"nodal_cfs",
|
||||||
|
"cfs",
|
||||||
|
"costs",
|
||||||
"capacities",
|
"capacities",
|
||||||
"curtailment",
|
"curtailment",
|
||||||
"energy",
|
"energy",
|
||||||
@ -419,6 +530,7 @@ def make_summaries(networks_dict):
|
|||||||
|
|
||||||
|
|
||||||
assign_carriers(n)
|
assign_carriers(n)
|
||||||
|
assign_locations(n)
|
||||||
|
|
||||||
for output in outputs:
|
for output in outputs:
|
||||||
df[output] = globals()["calculate_" + output](n, label, df[output])
|
df[output] = globals()["calculate_" + output](n, label, df[output])
|
||||||
|
Loading…
Reference in New Issue
Block a user