Diff intraday heat profiles for (res, services) x (water, space)

These are specified in data/heat_load_profile.csv.

The resulting heat_demand df has MultiIndex columns, where the first
level is ["sector use"], and the second level level is nodes.
This commit is contained in:
Tom Brown 2019-08-01 15:43:04 +02:00
parent 72b7ea0997
commit d3a0f7e67d
3 changed files with 54 additions and 25 deletions

View File

@ -178,7 +178,7 @@ rule prepare_sector_network:
transport_name='data/transport_data.csv',
biomass_potentials='data/biomass_potentials.csv',
timezone_mappings='data/timezone_mappings.csv',
heat_profile="data/heat_load_profile_DK_AdamJensen.csv",
heat_profile="data/heat_load_profile.csv",
costs="data/costs.csv",
clustered_pop_layout="resources/pop_layout_{network}_s{simpl}_{clusters}.csv",
industrial_demand="resources/industrial_demand_{network}_s{simpl}_{clusters}.csv",

View File

@ -0,0 +1,25 @@
hour,residential space weekday,residential space weekend,residential water weekday,residential water weekend,services space weekday,services space weekend,services water weekday,services water weekend
0,0.9181438689,0.9421512708,1,1,0.9181438689,0.9421512708,1,1
1,0.9172359071,0.9400891069,1,1,0.9172359071,0.9400891069,1,1
2,0.9269464481,0.9461062015,1,1,0.9269464481,0.9461062015,1,1
3,0.9415047932,0.9535084941,1,1,0.9415047932,0.9535084941,1,1
4,0.9656299507,0.9651094993,1,1,0.9656299507,0.9651094993,1,1
5,1.0221166443,0.9834676747,1,1,1.0221166443,0.9834676747,1,1
6,1.1553090493,1.0124171051,1,1,1.1553090493,1.0124171051,1,1
7,1.2093411031,1.0446615927,1,1,1.2093411031,1.0446615927,1,1
8,1.1470295942,1.088203419,1,1,1.1470295942,1.088203419,1,1
9,1.0877191341,1.1110334576,1,1,1.0877191341,1.1110334576,1,1
10,1.0418327372,1.0926752822,1,1,1.0418327372,1.0926752822,1,1
11,1.0062977133,1.055488209,1,1,1.0062977133,1.055488209,1,1
12,0.9837030359,1.0251266112,1,1,0.9837030359,1.0251266112,1,1
13,0.9667570278,0.9990015154,1,1,0.9667570278,0.9990015154,1,1
14,0.9548320932,0.9782897278,1,1,0.9548320932,0.9782897278,1,1
15,0.9509232061,0.9698167237,1,1,0.9509232061,0.9698167237,1,1
16,0.9636973319,0.974288587,1,1,0.9636973319,0.974288587,1,1
17,0.9799372563,0.9886456216,1,1,0.9799372563,0.9886456216,1,1
18,1.0046501848,1.0084159643,1,1,1.0046501848,1.0084159643,1,1
19,1.0079452419,1.0171243296,1,1,1.0079452419,1.0171243296,1,1
20,0.9860566481,0.9994722379,1,1,0.9860566481,0.9994722379,1,1
21,0.9705228074,0.982761591,1,1,0.9705228074,0.982761591,1,1
22,0.9586485819,0.9698167237,1,1,0.9586485819,0.9698167237,1,1
23,0.9335023778,0.9515079292,1,1,0.9335023778,0.9515079292,1,1
1 hour residential space weekday residential space weekend residential water weekday residential water weekend services space weekday services space weekend services water weekday services water weekend
2 0 0.9181438689 0.9421512708 1 1 0.9181438689 0.9421512708 1 1
3 1 0.9172359071 0.9400891069 1 1 0.9172359071 0.9400891069 1 1
4 2 0.9269464481 0.9461062015 1 1 0.9269464481 0.9461062015 1 1
5 3 0.9415047932 0.9535084941 1 1 0.9415047932 0.9535084941 1 1
6 4 0.9656299507 0.9651094993 1 1 0.9656299507 0.9651094993 1 1
7 5 1.0221166443 0.9834676747 1 1 1.0221166443 0.9834676747 1 1
8 6 1.1553090493 1.0124171051 1 1 1.1553090493 1.0124171051 1 1
9 7 1.2093411031 1.0446615927 1 1 1.2093411031 1.0446615927 1 1
10 8 1.1470295942 1.088203419 1 1 1.1470295942 1.088203419 1 1
11 9 1.0877191341 1.1110334576 1 1 1.0877191341 1.1110334576 1 1
12 10 1.0418327372 1.0926752822 1 1 1.0418327372 1.0926752822 1 1
13 11 1.0062977133 1.055488209 1 1 1.0062977133 1.055488209 1 1
14 12 0.9837030359 1.0251266112 1 1 0.9837030359 1.0251266112 1 1
15 13 0.9667570278 0.9990015154 1 1 0.9667570278 0.9990015154 1 1
16 14 0.9548320932 0.9782897278 1 1 0.9548320932 0.9782897278 1 1
17 15 0.9509232061 0.9698167237 1 1 0.9509232061 0.9698167237 1 1
18 16 0.9636973319 0.974288587 1 1 0.9636973319 0.974288587 1 1
19 17 0.9799372563 0.9886456216 1 1 0.9799372563 0.9886456216 1 1
20 18 1.0046501848 1.0084159643 1 1 1.0046501848 1.0084159643 1 1
21 19 1.0079452419 1.0171243296 1 1 1.0079452419 1.0171243296 1 1
22 20 0.9860566481 0.9994722379 1 1 0.9860566481 0.9994722379 1 1
23 21 0.9705228074 0.982761591 1 1 0.9705228074 0.982761591 1 1
24 22 0.9586485819 0.9698167237 1 1 0.9586485819 0.9698167237 1 1
25 23 0.9335023778 0.9515079292 1 1 0.9335023778 0.9515079292 1 1

View File

@ -282,18 +282,6 @@ def prepare_data(network):
##############
#copy forward the daily average heat demand into each hour, so it can be multipled by the intraday profile
heat_demand_df = xr.open_dataarray(snakemake.input.heat_demand_total).T.to_pandas().reindex(index=network.snapshots, method="ffill")
intraday_profiles = pd.read_csv(snakemake.input.heat_profile,index_col=0)
intraday_year_profiles = generate_periodic_profiles(heat_demand_df.index.tz_localize("UTC"),
nodes=heat_demand_df.columns,
weekly_profile=(list(intraday_profiles["weekday"])*5 + list(intraday_profiles["weekend"])*2)).tz_localize(None)
heat_demand_df = heat_demand_df*intraday_year_profiles
ashp_cop = xr.open_dataarray(snakemake.input.cop_air_total).T.to_pandas().reindex(index=network.snapshots)
gshp_cop = xr.open_dataarray(snakemake.input.cop_soil_total).T.to_pandas().reindex(index=network.snapshots)
@ -307,18 +295,31 @@ def prepare_data(network):
nodal_energy_totals.index = pop_layout.index
nodal_energy_totals = nodal_energy_totals.multiply(pop_layout.fraction,axis=0)
#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).T.to_pandas().reindex(index=network.snapshots, method="ffill")
intraday_profiles = pd.read_csv(snakemake.input.heat_profile,index_col=0)
sectors = ["residential","services"]
uses = ["water","space"]
nodal_energy_totals["Space Heating"] = options['space_heating_fraction']*nodal_energy_totals[["total {sector} space".format(sector=sector) for sector in sectors]].sum(axis=1)
nodal_energy_totals["Water Heating"] = nodal_energy_totals[["total {sector} water".format(sector=sector) for sector in sectors]].sum(axis=1)
heat_demand = {}
for sector in sectors:
for use in uses:
intraday_year_profile = generate_periodic_profiles(daily_space_heat_demand.index.tz_localize("UTC"),
nodes=daily_space_heat_demand.columns,
weekly_profile=(list(intraday_profiles["{} {} weekday".format(sector,use)])*5 + list(intraday_profiles["{} {} weekend".format(sector,use)])*2)).tz_localize(None)
space_heat_demand = (heat_demand_df/heat_demand_df.sum()).multiply(nodal_energy_totals["Space Heating"])*1e6*Nyears
water_heat_demand = (nodal_energy_totals["Water Heating"]/8760.)*1e6
heat_demand = space_heat_demand + water_heat_demand
if use == "space":
heat_demand_shape = daily_space_heat_demand*intraday_year_profile
factor = options['space_heating_fraction']
else:
heat_demand_shape = intraday_year_profile
factor = 1.
heat_demand["{} {}".format(sector,use)] = factor*(heat_demand_shape/heat_demand_shape.sum()).multiply(nodal_energy_totals["total {} {}".format(sector,use)])*1e6
heat_demand = pd.concat(heat_demand,axis=1)
##############
@ -413,7 +414,7 @@ def prepare_data(network):
return nodal_energy_totals, heat_demand, space_heat_demand, water_heat_demand, ashp_cop, gshp_cop, solar_thermal, transport, avail_profile, dsm_profile, co2_totals, nodal_transport_data
return nodal_energy_totals, heat_demand, ashp_cop, gshp_cop, solar_thermal, transport, avail_profile, dsm_profile, co2_totals, nodal_transport_data
def prepare_costs():
@ -695,6 +696,9 @@ def add_heat(network):
print("adding heat")
#aggregate all residential, services and water, space heat
aggregated_heat_demand = heat_demand.groupby(level=1,axis=1).sum()
#rural are areas with low heating density
#urban are areas with high heating density
#urban can be split into district heating (central) and individual heating (decentral)
@ -741,21 +745,21 @@ def add_heat(network):
suffix=" rural heat",
bus=rural + " rural heat",
carrier="rural heat",
p_set= heat_demand[rural].multiply((1-urban_fraction[rural])))
p_set= aggregated_heat_demand[rural].multiply((1-urban_fraction[rural])))
network.madd("Load",
urban_central,
suffix=" urban central heat",
bus=urban_central + " urban central heat",
carrier="urban central heat",
p_set= heat_demand[urban_central].multiply(urban_fraction[urban_central]*(1+options['district_heating_loss'])))
p_set= aggregated_heat_demand[urban_central].multiply(urban_fraction[urban_central]*(1+options['district_heating_loss'])))
network.madd("Load",
urban_decentral,
suffix=" urban decentral heat",
bus=urban_decentral + " urban decentral heat",
carrier="urban decentral heat",
p_set= heat_demand[urban_decentral].multiply(urban_fraction[urban_decentral]))
p_set= aggregated_heat_demand[urban_decentral].multiply(urban_fraction[urban_decentral]))
network.madd("Link",
@ -1432,7 +1436,7 @@ if __name__ == "__main__":
print(o,limit)
options['space_heating_fraction'] = limit
nodal_energy_totals, heat_demand, space_heat_demand, water_heat_demand, ashp_cop, gshp_cop, solar_thermal, transport, avail_profile, dsm_profile, co2_totals, nodal_transport_data = prepare_data(n)
nodal_energy_totals, heat_demand, ashp_cop, gshp_cop, solar_thermal, transport, avail_profile, dsm_profile, co2_totals, nodal_transport_data = prepare_data(n)
if "nodistrict" in opts:
options["central"] = False