prepare: move build_heat_demand closer to add_heat
This commit is contained in:
parent
b112da0565
commit
95d5d8f889
@ -573,48 +573,6 @@ def cycling_shift(df, steps=1):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def build_heat_demand(n):
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# copy forward the daily average heat demand into each hour, so it can be multipled by the intraday profile
|
|
||||||
daily_space_heat_demand = xr.open_dataarray(snakemake.input.heat_demand_total).to_pandas().reindex(index=n.snapshots, method="ffill")
|
|
||||||
|
|
||||||
intraday_profiles = pd.read_csv(snakemake.input.heat_profile, index_col=0)
|
|
||||||
|
|
||||||
sectors = ["residential", "services"]
|
|
||||||
uses = ["water", "space"]
|
|
||||||
|
|
||||||
heat_demand = {}
|
|
||||||
electric_heat_supply = {}
|
|
||||||
for sector, use in product(sectors, uses):
|
|
||||||
weekday = list(intraday_profiles[f"{sector} {use} weekday"])
|
|
||||||
weekend = list(intraday_profiles[f"{sector} {use} weekend"])
|
|
||||||
weekly_profile = weekday * 5 + weekend * 2
|
|
||||||
intraday_year_profile = generate_periodic_profiles(
|
|
||||||
daily_space_heat_demand.index.tz_localize("UTC"),
|
|
||||||
nodes=daily_space_heat_demand.columns,
|
|
||||||
weekly_profile=weekly_profile
|
|
||||||
)
|
|
||||||
|
|
||||||
if use == "space":
|
|
||||||
heat_demand_shape = daily_space_heat_demand * intraday_year_profile
|
|
||||||
else:
|
|
||||||
heat_demand_shape = intraday_year_profile
|
|
||||||
|
|
||||||
heat_demand[f"{sector} {use}"] = (heat_demand_shape/heat_demand_shape.sum()).multiply(pop_weighted_energy_totals[f"total {sector} {use}"]) * 1e6
|
|
||||||
electric_heat_supply[f"{sector} {use}"] = (heat_demand_shape/heat_demand_shape.sum()).multiply(pop_weighted_energy_totals[f"electricity {sector} {use}"]) * 1e6
|
|
||||||
|
|
||||||
heat_demand = pd.concat(heat_demand, axis=1)
|
|
||||||
electric_heat_supply = pd.concat(electric_heat_supply, axis=1)
|
|
||||||
|
|
||||||
# subtract from electricity load since heat demand already in heat_demand
|
|
||||||
electric_nodes = n.loads.index[n.loads.carrier == "electricity"]
|
|
||||||
n.loads_t.p_set[electric_nodes] = n.loads_t.p_set[electric_nodes] - electric_heat_supply.groupby(level=1, axis=1).sum()[electric_nodes]
|
|
||||||
|
|
||||||
return heat_demand
|
|
||||||
|
|
||||||
|
|
||||||
# TODO checkout PyPSA-Eur script
|
# TODO checkout PyPSA-Eur script
|
||||||
def prepare_costs(cost_file, USD_to_EUR, discount_rate, Nyears, lifetime):
|
def prepare_costs(cost_file, USD_to_EUR, discount_rate, Nyears, lifetime):
|
||||||
|
|
||||||
@ -1294,12 +1252,53 @@ def add_land_transport(n, costs):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_heat_demand(n):
|
||||||
|
|
||||||
|
# copy forward the daily average heat demand into each hour, so it can be multipled by the intraday profile
|
||||||
|
daily_space_heat_demand = xr.open_dataarray(snakemake.input.heat_demand_total).to_pandas().reindex(index=n.snapshots, method="ffill")
|
||||||
|
|
||||||
|
intraday_profiles = pd.read_csv(snakemake.input.heat_profile, index_col=0)
|
||||||
|
|
||||||
|
sectors = ["residential", "services"]
|
||||||
|
uses = ["water", "space"]
|
||||||
|
|
||||||
|
heat_demand = {}
|
||||||
|
electric_heat_supply = {}
|
||||||
|
for sector, use in product(sectors, uses):
|
||||||
|
weekday = list(intraday_profiles[f"{sector} {use} weekday"])
|
||||||
|
weekend = list(intraday_profiles[f"{sector} {use} weekend"])
|
||||||
|
weekly_profile = weekday * 5 + weekend * 2
|
||||||
|
intraday_year_profile = generate_periodic_profiles(
|
||||||
|
daily_space_heat_demand.index.tz_localize("UTC"),
|
||||||
|
nodes=daily_space_heat_demand.columns,
|
||||||
|
weekly_profile=weekly_profile
|
||||||
|
)
|
||||||
|
|
||||||
|
if use == "space":
|
||||||
|
heat_demand_shape = daily_space_heat_demand * intraday_year_profile
|
||||||
|
else:
|
||||||
|
heat_demand_shape = intraday_year_profile
|
||||||
|
|
||||||
|
heat_demand[f"{sector} {use}"] = (heat_demand_shape/heat_demand_shape.sum()).multiply(pop_weighted_energy_totals[f"total {sector} {use}"]) * 1e6
|
||||||
|
electric_heat_supply[f"{sector} {use}"] = (heat_demand_shape/heat_demand_shape.sum()).multiply(pop_weighted_energy_totals[f"electricity {sector} {use}"]) * 1e6
|
||||||
|
|
||||||
|
heat_demand = pd.concat(heat_demand, axis=1)
|
||||||
|
electric_heat_supply = pd.concat(electric_heat_supply, axis=1)
|
||||||
|
|
||||||
|
# subtract from electricity load since heat demand already in heat_demand
|
||||||
|
electric_nodes = n.loads.index[n.loads.carrier == "electricity"]
|
||||||
|
n.loads_t.p_set[electric_nodes] = n.loads_t.p_set[electric_nodes] - electric_heat_supply.groupby(level=1, axis=1).sum()[electric_nodes]
|
||||||
|
|
||||||
|
return heat_demand
|
||||||
|
|
||||||
|
|
||||||
def add_heat(n, costs):
|
def add_heat(n, costs):
|
||||||
|
|
||||||
logger.info("Add heat sector")
|
logger.info("Add heat sector")
|
||||||
|
|
||||||
sectors = ["residential", "services"]
|
sectors = ["residential", "services"]
|
||||||
|
|
||||||
|
heat_demand = build_heat_demand(n)
|
||||||
|
|
||||||
nodes, dist_fraction, urban_fraction = create_nodes_for_heat_sector()
|
nodes, dist_fraction, urban_fraction = create_nodes_for_heat_sector()
|
||||||
|
|
||||||
@ -2330,8 +2329,6 @@ if __name__ == "__main__":
|
|||||||
if o == "biomasstransport":
|
if o == "biomasstransport":
|
||||||
options["biomass_transport"] = True
|
options["biomass_transport"] = True
|
||||||
|
|
||||||
heat_demand = build_heat_demand(n)
|
|
||||||
|
|
||||||
if "nodistrict" in opts:
|
if "nodistrict" in opts:
|
||||||
options["district_heating"]["progress"] = 0.0
|
options["district_heating"]["progress"] = 0.0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user