# -*- coding: utf-8 -*-
""" This module is designed to download and prepare BMWi data.
SPDX-FileCopyrightText: 2016-2021 Uwe Krien <krien@uni-bremen.de>
SPDX-License-Identifier: MIT
"""
__copyright__ = "Uwe Krien <krien@uni-bremen.de>"
__license__ = "MIT"
# Python libraries
import os
import logging
# External libraries
import pandas as pd
# Internal modules
from reegis import config as cfg
from reegis import tools
[docs]def get_bmwi_energiedaten_file(overwrite=False):
"""Download BMWi energy data table."""
filename = os.path.join(
cfg.get("paths", "general"), cfg.get("bmwi", "energiedaten")
)
logging.debug(
"Return status from energiedaten file: {0}".format(
tools.download_file(
filename,
cfg.get("bmwi", "url_energiedaten"),
overwrite=overwrite,
)
)
)
return filename
[docs]def read_bmwi_sheet_7(sub):
"""
Parameters
----------
sub : str
Sub-table 'a' or 'b'.
Returns
-------
pd.DataFrame
Examples
--------
>>> my_fs = read_bmwi_sheet_7('a').sort_index()
>>> int(float(my_fs.loc[('Industrie', 'gesamt'), 2014]))
2545
>>> my_fs = read_bmwi_sheet_7('b').sort_index()
>>> int(my_fs.loc[('private Haushalte', 'gesamt'), 2014])
2188
"""
filename = get_bmwi_energiedaten_file()
sheet = "7" + sub
fs = pd.DataFrame()
n = 4
while 2014 not in fs.columns:
n += 1
fs = pd.read_excel(filename, sheet, skiprows=n)
# Convert first column to string
fs["Unnamed: 0"] = fs["Unnamed: 0"].apply(str)
# Create 'A' column with sector name (shorten the name)
fs["A"] = fs["Unnamed: 0"].apply(
lambda x: x.replace("nach Anwendungsbereichen ", "")
if "Endenergie" in x
else float("nan")
)
fs["A"] = fs["A"].fillna(method="ffill")
fs = fs[fs["A"].notnull()]
fs["A"] = fs["A"].apply(
lambda x: x.replace("Endenergieverbrauch in der ", "")
)
fs["A"] = fs["A"].apply(lambda x: x.replace("Endenergieverbrauch im ", ""))
fs["A"] = fs["A"].apply(
lambda x: x.replace("Endenergieverbrauch in den ", "")
)
fs["A"] = fs["A"].apply(lambda x: x.replace("Sektor ", ""))
fs["A"] = fs["A"].apply(
lambda x: x.replace("privaten Haushalten", "private Haushalte")
)
# Create 'B' column with type
fs["B"] = fs["Unnamed: 0"].apply(
lambda x: x if "-" not in x else float("nan")
)
fs["B"] = fs["B"].fillna(method="ffill")
fs["B"] = fs["B"].apply(lambda x: x if "nan" not in x else float("nan"))
fs = fs[fs["B"].notnull()]
# Create 'C' column with fuel
fs["C"] = fs["Unnamed: 0"].apply(lambda x: x if "-" in x else float("nan"))
fs["C"] = fs["C"].fillna(fs["B"])
# Delete first column and set 'A', 'B', 'C' columns to index
del fs["Unnamed: 0"]
# Set new columns to index
fs = fs.set_index(["A", "B", "C"], drop=True)
return fs
[docs]def bmwi_re_energy_capacity():
"""Prepare the energy production and capacity table from sheet 20.
capacity: [MW]
energy: [GWh]
fraction: [-]
Examples
--------
>>> re=bmwi_re_energy_capacity()
>>> int(re.loc[2016, ('water', 'capacity')])
5629
"""
filename = get_bmwi_energiedaten_file()
repp = pd.read_excel(filename, "20", skiprows=22).iloc[:24]
repp = repp.drop(repp.index[[0, 4, 8, 12, 16, 20]])
repp["type"] = (
["water"] * 3
+ ["wind"] * 3
+ ["bioenergy"] * 3
+ ["biogenic waste"] * 3
+ ["solar"] * 3
+ ["geothermal"] * 3
)
repp["value"] = ["energy", "capacity", "fraction"] * 6
repp.set_index(["type", "value"], inplace=True)
del repp["Unnamed: 0"]
return repp.transpose().sort_index(1)
[docs]def get_annual_electricity_demand_bmwi(year):
"""Returns the annual demand for the given year from the BMWI Energiedaten
in TWh (Tera Watt hours). Will return None if data for the given year is
not available.
Examples
--------
>>> get_annual_electricity_demand_bmwi(2014) # puppel
523.988
"""
import math
infile = get_bmwi_energiedaten_file()
table = pd.read_excel(infile, "21", skiprows=7, index_col=[0])
try:
value = table.loc[" zusammen", year]
if math.isnan(value):
value = None
except KeyError:
value = None
if value is None:
msg = "No BMWi electricity demand found for {year}."
raise ValueError(msg.format(year=year))
return value
if __name__ == "__main__":
pass