adjustment to build_energy_totals
This commit is contained in:
parent
ecccc1429f
commit
957176a20d
@ -290,7 +290,7 @@ rule build_energy_totals:
|
|||||||
co2="data/bundle/eea/UNFCCC_v23.csv",
|
co2="data/bundle/eea/UNFCCC_v23.csv",
|
||||||
swiss="data/switzerland-new_format-all_years.csv",
|
swiss="data/switzerland-new_format-all_years.csv",
|
||||||
swiss_transport="data/gr-e-11.03.02.01.01-cc.csv",
|
swiss_transport="data/gr-e-11.03.02.01.01-cc.csv",
|
||||||
idees="data/bundle/jrc-idees-2015",
|
idees="data/bundle/jrc-idees-2021",
|
||||||
district_heat_share="data/district_heat_share.csv",
|
district_heat_share="data/district_heat_share.csv",
|
||||||
eurostat="data/eurostat/Balances-April2023",
|
eurostat="data/eurostat/Balances-April2023",
|
||||||
eurostat_households="data/eurostat/eurostat-household_energy_balances-february_2024.csv",
|
eurostat_households="data/eurostat/eurostat-household_energy_balances-february_2024.csv",
|
||||||
|
@ -110,7 +110,8 @@ def reverse(dictionary: dict) -> dict:
|
|||||||
idees_rename = {"GR": "EL", "GB": "UK"}
|
idees_rename = {"GR": "EL", "GB": "UK"}
|
||||||
|
|
||||||
eu28 = cc.EU28as("ISO2").ISO2.tolist()
|
eu28 = cc.EU28as("ISO2").ISO2.tolist()
|
||||||
|
# TODO GB kicked out JRC-IDEES 2021
|
||||||
|
eu27 = cc.EU27as("ISO2").ISO2.tolist()
|
||||||
eu28_eea = eu28.copy()
|
eu28_eea = eu28.copy()
|
||||||
eu28_eea.remove("GB")
|
eu28_eea.remove("GB")
|
||||||
eu28_eea.append("UK")
|
eu28_eea.append("UK")
|
||||||
@ -329,9 +330,9 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
ct_idees = idees_rename.get(ct, ct)
|
ct_idees = idees_rename.get(ct, ct)
|
||||||
fn_residential = f"{base_dir}/JRC-IDEES-2015_Residential_{ct_idees}.xlsx"
|
fn_residential = f"{base_dir}/JRC-IDEES-2021_Residential_{ct_idees}.xlsx"
|
||||||
fn_tertiary = f"{base_dir}/JRC-IDEES-2015_Tertiary_{ct_idees}.xlsx"
|
fn_tertiary = f"{base_dir}/JRC-IDEES-2021_Tertiary_{ct_idees}.xlsx"
|
||||||
fn_transport = f"{base_dir}/JRC-IDEES-2015_Transport_{ct_idees}.xlsx"
|
fn_transport = f"{base_dir}/JRC-IDEES-2021_Transport_{ct_idees}.xlsx"
|
||||||
|
|
||||||
ct_totals = {}
|
ct_totals = {}
|
||||||
|
|
||||||
@ -357,14 +358,16 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
row = "Energy consumption by fuel - Eurostat structure (ktoe)"
|
row = "Energy consumption by fuel - Eurostat structure (ktoe)"
|
||||||
ct_totals["total residential"] = df.loc[row]
|
ct_totals["total residential"] = df.loc[row]
|
||||||
|
|
||||||
assert df.index[47] == "Electricity"
|
assert df.index[40] == "Electricity"
|
||||||
ct_totals["electricity residential"] = df.iloc[47]
|
ct_totals["electricity residential"] = df.iloc[40]
|
||||||
|
|
||||||
assert df.index[46] == "Derived heat"
|
# TODO derived heat changed to distributed heat and numbers changed as well!
|
||||||
ct_totals["derived heat residential"] = df.iloc[46]
|
# this needs to be checked
|
||||||
|
assert df.index[39] == "Distributed heat"
|
||||||
|
ct_totals["derived heat residential"] = df.iloc[39]
|
||||||
|
|
||||||
assert df.index[50] == "Thermal uses"
|
assert df.index[43] == "Thermal uses"
|
||||||
ct_totals["thermal uses residential"] = df.iloc[50]
|
ct_totals["thermal uses residential"] = df.iloc[43]
|
||||||
|
|
||||||
# services
|
# services
|
||||||
|
|
||||||
@ -390,14 +393,15 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
row = "Energy consumption by fuel - Eurostat structure (ktoe)"
|
row = "Energy consumption by fuel - Eurostat structure (ktoe)"
|
||||||
ct_totals["total services"] = df.loc[row]
|
ct_totals["total services"] = df.loc[row]
|
||||||
|
|
||||||
assert df.index[50] == "Electricity"
|
assert df.index[43] == "Electricity"
|
||||||
ct_totals["electricity services"] = df.iloc[50]
|
ct_totals["electricity services"] = df.iloc[43]
|
||||||
|
|
||||||
assert df.index[49] == "Derived heat"
|
# TODO check derived heat changed to distributed heat
|
||||||
ct_totals["derived heat services"] = df.iloc[49]
|
assert df.index[42] == "Distributed heat"
|
||||||
|
ct_totals["derived heat services"] = df.iloc[42]
|
||||||
|
|
||||||
assert df.index[53] == "Thermal uses"
|
assert df.index[46] == "Thermal uses"
|
||||||
ct_totals["thermal uses services"] = df.iloc[53]
|
ct_totals["thermal uses services"] = df.iloc[46]
|
||||||
|
|
||||||
# agriculture, forestry and fishing
|
# agriculture, forestry and fishing
|
||||||
|
|
||||||
@ -410,7 +414,7 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
"Lighting",
|
"Lighting",
|
||||||
"Ventilation",
|
"Ventilation",
|
||||||
"Specific electricity uses",
|
"Specific electricity uses",
|
||||||
"Pumping devices (electric)",
|
"Pumping devices (electricity)",
|
||||||
]
|
]
|
||||||
ct_totals["total agriculture electricity"] = df.loc[rows].sum()
|
ct_totals["total agriculture electricity"] = df.loc[rows].sum()
|
||||||
|
|
||||||
@ -419,8 +423,8 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
|
|
||||||
rows = [
|
rows = [
|
||||||
"Motor drives",
|
"Motor drives",
|
||||||
"Farming machine drives (diesel oil incl. biofuels)",
|
"Farming machine drives (diesel oil and liquid biofuels)",
|
||||||
"Pumping devices (diesel oil incl. biofuels)",
|
"Pumping devices (diesel oil and liquid biofuels)",
|
||||||
]
|
]
|
||||||
ct_totals["total agriculture machinery"] = df.loc[rows].sum()
|
ct_totals["total agriculture machinery"] = df.loc[rows].sum()
|
||||||
|
|
||||||
@ -435,7 +439,7 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
|
|
||||||
ct_totals["electricity road"] = df.loc["Electricity"]
|
ct_totals["electricity road"] = df.loc["Electricity"]
|
||||||
|
|
||||||
ct_totals["total two-wheel"] = df.loc["Powered 2-wheelers (Gasoline)"]
|
ct_totals["total two-wheel"] = df.loc["Powered two-wheelers (Gasoline)"]
|
||||||
|
|
||||||
assert df.index[19] == "Passenger cars"
|
assert df.index[19] == "Passenger cars"
|
||||||
ct_totals["total passenger cars"] = df.iloc[19]
|
ct_totals["total passenger cars"] = df.iloc[19]
|
||||||
@ -449,58 +453,64 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
assert df.index[39] == "Battery electric vehicles"
|
assert df.index[39] == "Battery electric vehicles"
|
||||||
ct_totals["electricity other road passenger"] = df.iloc[39]
|
ct_totals["electricity other road passenger"] = df.iloc[39]
|
||||||
|
|
||||||
assert df.index[41] == "Light duty vehicles"
|
assert df.index[41] == "Light commercial vehicles"
|
||||||
ct_totals["total light duty road freight"] = df.iloc[41]
|
ct_totals["total light duty road freight"] = df.iloc[41]
|
||||||
|
|
||||||
assert df.index[49] == "Battery electric vehicles"
|
assert df.index[49] == "Battery electric vehicles"
|
||||||
ct_totals["electricity light duty road freight"] = df.iloc[49]
|
ct_totals["electricity light duty road freight"] = df.iloc[49]
|
||||||
|
|
||||||
row = "Heavy duty vehicles (Diesel oil incl. biofuels)"
|
row = "Heavy goods vehicles (Diesel oil incl. biofuels)"
|
||||||
ct_totals["total heavy duty road freight"] = df.loc[row]
|
ct_totals["total heavy duty road freight"] = df.loc[row]
|
||||||
|
|
||||||
assert df.index[61] == "Passenger cars"
|
assert df.index[61] == "Passenger cars"
|
||||||
ct_totals["passenger car efficiency"] = df.iloc[61]
|
ct_totals["passenger car efficiency"] = df.iloc[61]
|
||||||
|
|
||||||
|
|
||||||
df = pd.read_excel(fn_transport, "TrRail_ene", index_col=0)
|
df = pd.read_excel(fn_transport, "TrRail_ene", index_col=0)
|
||||||
|
|
||||||
ct_totals["total rail"] = df.loc["by fuel (EUROSTAT DATA)"]
|
ct_totals["total rail"] = df.loc["by fuel"]
|
||||||
|
|
||||||
ct_totals["electricity rail"] = df.loc["Electricity"]
|
ct_totals["electricity rail"] = df.loc["Electricity"]
|
||||||
|
|
||||||
assert df.index[15] == "Passenger transport"
|
assert df.index[9] == "Passenger transport"
|
||||||
ct_totals["total rail passenger"] = df.iloc[15]
|
ct_totals["total rail passenger"] = df.iloc[9]
|
||||||
|
|
||||||
assert df.index[16] == "Metro and tram, urban light rail"
|
assert df.index[10] == "Metro and tram, urban light rail"
|
||||||
assert df.index[19] == "Electric"
|
assert df.index[13] == "Electric"
|
||||||
assert df.index[20] == "High speed passenger trains"
|
assert df.index[14] == "High speed passenger trains"
|
||||||
ct_totals["electricity rail passenger"] = df.iloc[[16, 19, 20]].sum()
|
ct_totals["electricity rail passenger"] = df.iloc[[10, 13, 14]].sum()
|
||||||
|
|
||||||
assert df.index[21] == "Freight transport"
|
assert df.index[15] == "Freight transport"
|
||||||
ct_totals["total rail freight"] = df.iloc[21]
|
ct_totals["total rail freight"] = df.iloc[15]
|
||||||
|
|
||||||
assert df.index[23] == "Electric"
|
assert df.index[17] == "Electric"
|
||||||
ct_totals["electricity rail freight"] = df.iloc[23]
|
ct_totals["electricity rail freight"] = df.iloc[17]
|
||||||
|
|
||||||
df = pd.read_excel(fn_transport, "TrAvia_ene", index_col=0)
|
df = pd.read_excel(fn_transport, "TrAvia_ene", index_col=0)
|
||||||
|
|
||||||
assert df.index[6] == "Passenger transport"
|
assert df.index[4] == "Passenger transport"
|
||||||
ct_totals["total aviation passenger"] = df.iloc[6]
|
ct_totals["total aviation passenger"] = df.iloc[4]
|
||||||
|
|
||||||
assert df.index[10] == "Freight transport"
|
assert df.index[8] == "Freight transport"
|
||||||
ct_totals["total aviation freight"] = df.iloc[10]
|
ct_totals["total aviation freight"] = df.iloc[8]
|
||||||
|
|
||||||
assert df.index[7] == "Domestic"
|
assert df.index[2] == "Domestic"
|
||||||
ct_totals["total domestic aviation passenger"] = df.iloc[7]
|
ct_totals["total domestic aviation passenger"] = df.iloc[2]
|
||||||
|
|
||||||
assert df.index[8] == "International - Intra-EU"
|
# TODO added Ukraine to intra EU flights
|
||||||
assert df.index[9] == "International - Extra-EU"
|
assert df.index[6] == "International - Intra-EEAwUK"
|
||||||
ct_totals["total international aviation passenger"] = df.iloc[[8, 9]].sum()
|
assert df.index[7] == "International - Extra-EEAwUK"
|
||||||
|
ct_totals["total international aviation passenger"] = df.iloc[[6, 7]].sum()
|
||||||
|
|
||||||
assert df.index[11] == "Domestic and International - Intra-EU"
|
# TODO freight changed from "Domestic and International - Intra-EU" -> split
|
||||||
ct_totals["total domestic aviation freight"] = df.iloc[11]
|
# domestic and international (intra-EU and outside EU)
|
||||||
|
assert df.index[9] == "Domestic"
|
||||||
|
ct_totals["total domestic aviation freight"] = df.iloc[9]
|
||||||
|
|
||||||
assert df.index[12] == "International - Extra-EU"
|
|
||||||
ct_totals["total international aviation freight"] = df.iloc[12]
|
assert df.index[10] == "International - Intra-EEAwUK"
|
||||||
|
assert df.index[11] == "International - Extra-EEAwUK"
|
||||||
|
ct_totals["total international aviation freight"] = df.iloc[[10, 11]].sum()
|
||||||
|
|
||||||
ct_totals["total domestic aviation"] = (
|
ct_totals["total domestic aviation"] = (
|
||||||
ct_totals["total domestic aviation freight"]
|
ct_totals["total domestic aviation freight"]
|
||||||
@ -515,7 +525,7 @@ def idees_per_country(ct: str, base_dir: str) -> pd.DataFrame:
|
|||||||
df = pd.read_excel(fn_transport, "TrNavi_ene", index_col=0)
|
df = pd.read_excel(fn_transport, "TrNavi_ene", index_col=0)
|
||||||
|
|
||||||
# coastal and inland
|
# coastal and inland
|
||||||
ct_totals["total domestic navigation"] = df.loc["by fuel (EUROSTAT DATA)"]
|
ct_totals["total domestic navigation"] = df.loc["Energy consumption (ktoe)"]
|
||||||
|
|
||||||
df = pd.read_excel(fn_transport, "TrRoad_act", index_col=0)
|
df = pd.read_excel(fn_transport, "TrRoad_act", index_col=0)
|
||||||
|
|
||||||
@ -567,10 +577,15 @@ def build_idees(countries: List[str]) -> pd.DataFrame:
|
|||||||
names=["country", "year"],
|
names=["country", "year"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# clean up dataframe
|
||||||
|
years = np.arange(2000, 2022)
|
||||||
|
totals = totals[totals.index.get_level_values(1).isin(years)]
|
||||||
|
|
||||||
# efficiency kgoe/100km -> ktoe/100km so that after conversion TWh/100km
|
# efficiency kgoe/100km -> ktoe/100km so that after conversion TWh/100km
|
||||||
totals.loc[:, "passenger car efficiency"] /= 1e6
|
totals.loc[:, "passenger car efficiency"] /= 1e6
|
||||||
# convert ktoe to TWh
|
# convert ktoe to TWh
|
||||||
exclude = totals.columns.str.fullmatch("passenger cars")
|
exclude = totals.columns.str.fullmatch("passenger cars")
|
||||||
|
totals = totals.copy()
|
||||||
totals.loc[:, ~exclude] *= 11.63 / 1e3
|
totals.loc[:, ~exclude] *= 11.63 / 1e3
|
||||||
|
|
||||||
return totals
|
return totals
|
||||||
@ -664,7 +679,8 @@ def build_energy_totals(
|
|||||||
|
|
||||||
for use in uses:
|
for use in uses:
|
||||||
fuel_use = df[f"electricity {sector} {use}"]
|
fuel_use = df[f"electricity {sector} {use}"]
|
||||||
fuel = df[f"electricity {sector}"]
|
fuel = (df[f"electricity {sector}"]
|
||||||
|
.replace(0, np.nan).infer_objects(copy=False))
|
||||||
avg = fuel_use.div(fuel).mean()
|
avg = fuel_use.div(fuel).mean()
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{sector}: average fraction of electricity for {use} is {avg:.3f}"
|
f"{sector}: average fraction of electricity for {use} is {avg:.3f}"
|
||||||
@ -680,6 +696,7 @@ def build_energy_totals(
|
|||||||
df[f"total {sector} {use}"] - df[f"electricity {sector} {use}"]
|
df[f"total {sector} {use}"] - df[f"electricity {sector} {use}"]
|
||||||
)
|
)
|
||||||
nonelectric = df[f"total {sector}"] - df[f"electricity {sector}"]
|
nonelectric = df[f"total {sector}"] - df[f"electricity {sector}"]
|
||||||
|
nonelectric = nonelectric.copy().replace(0, np.nan)
|
||||||
avg = nonelectric_use.div(nonelectric).mean()
|
avg = nonelectric_use.div(nonelectric).mean()
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{sector}: average fraction of non-electric for {use} is {avg:.3f}"
|
f"{sector}: average fraction of non-electric for {use} is {avg:.3f}"
|
||||||
@ -716,6 +733,7 @@ def build_energy_totals(
|
|||||||
nonelectric = (
|
nonelectric = (
|
||||||
no_norway[f"total {sector}"] - no_norway[f"electricity {sector}"]
|
no_norway[f"total {sector}"] - no_norway[f"electricity {sector}"]
|
||||||
)
|
)
|
||||||
|
nonelectric = nonelectric.copy().replace(0, np.nan)
|
||||||
fraction = nonelectric_use.div(nonelectric).mean()
|
fraction = nonelectric_use.div(nonelectric).mean()
|
||||||
df.loc["NO", f"total {sector} {use}"] = (
|
df.loc["NO", f"total {sector} {use}"] = (
|
||||||
total_heating * fraction
|
total_heating * fraction
|
||||||
@ -793,7 +811,8 @@ def build_energy_totals(
|
|||||||
mean_BA = df.loc["BA"].loc[2014:2021, "total residential"].mean()
|
mean_BA = df.loc["BA"].loc[2014:2021, "total residential"].mean()
|
||||||
mean_RS = df.loc["RS"].loc[2014:2021, "total residential"].mean()
|
mean_RS = df.loc["RS"].loc[2014:2021, "total residential"].mean()
|
||||||
ratio = mean_BA / mean_RS
|
ratio = mean_BA / mean_RS
|
||||||
df.loc["BA"] = df.loc["BA"].replace(0.0, np.nan).values
|
df.loc["BA"] = (df.loc["BA"].replace(0.0, np.nan)
|
||||||
|
.infer_objects(copy=False).values)
|
||||||
df.loc["BA"] = df.loc["BA"].combine_first(ratio * df.loc["RS"]).values
|
df.loc["BA"] = df.loc["BA"].combine_first(ratio * df.loc["RS"]).values
|
||||||
|
|
||||||
return df
|
return df
|
||||||
@ -1375,7 +1394,7 @@ def update_residential_from_eurostat(energy: pd.DataFrame) -> pd.DataFrame:
|
|||||||
"Updated energy balances for residential using disaggregate final energy consumption data in Households from Eurostat"
|
"Updated energy balances for residential using disaggregate final energy consumption data in Households from Eurostat"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#%%
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if "snakemake" not in globals():
|
if "snakemake" not in globals():
|
||||||
from _helpers import mock_snakemake
|
from _helpers import mock_snakemake
|
||||||
@ -1391,7 +1410,7 @@ if __name__ == "__main__":
|
|||||||
population = nuts3["pop"].groupby(nuts3.country).sum()
|
population = nuts3["pop"].groupby(nuts3.country).sum()
|
||||||
|
|
||||||
countries = snakemake.params.countries
|
countries = snakemake.params.countries
|
||||||
idees_countries = pd.Index(countries).intersection(eu28)
|
idees_countries = pd.Index(countries).intersection(eu27)
|
||||||
|
|
||||||
input_eurostat = snakemake.input.eurostat
|
input_eurostat = snakemake.input.eurostat
|
||||||
eurostat = build_eurostat(
|
eurostat = build_eurostat(
|
||||||
@ -1405,8 +1424,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
energy = build_energy_totals(countries, eurostat, swiss, idees)
|
energy = build_energy_totals(countries, eurostat, swiss, idees)
|
||||||
|
|
||||||
# Data from IDEES only exists from 2000-2015.
|
# Data from IDEES only exists from 2000-2021.
|
||||||
logger.info("Extrapolate IDEES data based on eurostat for years 2015-2021.")
|
logger.info("Extrapolate IDEES data based on eurostat for years 2021-x.")
|
||||||
energy = rescale_idees_from_eurostat(idees_countries, energy, eurostat)
|
energy = rescale_idees_from_eurostat(idees_countries, energy, eurostat)
|
||||||
|
|
||||||
update_residential_from_eurostat(energy)
|
update_residential_from_eurostat(energy)
|
||||||
|
Loading…
Reference in New Issue
Block a user