Skip to content

Commit

Permalink
Merge afb0887 into 794137e
Browse files Browse the repository at this point in the history
  • Loading branch information
uvchik committed Jan 6, 2020
2 parents 794137e + afb0887 commit e5e38dd
Show file tree
Hide file tree
Showing 6 changed files with 662 additions and 1 deletion.
408 changes: 408 additions & 0 deletions reegis/data/geometries/vg1000_geodata.geojson

Large diffs are not rendered by default.

49 changes: 49 additions & 0 deletions reegis/dictionary.ini
Original file line number Diff line number Diff line change
Expand Up @@ -287,3 +287,52 @@ Thüringen = TH
14 = SN
15 = ST
16 = TH


[KFZ]
Krafträder insgesamt = motorcycle, total
Krafträder davon zwei-rädrige Kfz = ignore
Krafträder davon dreirädrige Kfz = ignore
Krafträder davon leichte vierrädrige Kfz = ignore
Krafträder darunter weibliche Halter = ignore
Personenkraftwagen insgesamt = passenger car
Personenkraftwagen Hubraum bis 1.399 cm³ = ignore
Personenkraftwagen 1.400 bis 1.999 cm³ = ignore
Personenkraftwagen 2.000 und mehr cm³ = ignore
Personenkraftwagen unbekannt = ignore
Personenkraftwagen und zwar mit offenem Aufbau = ignore
Personenkraftwagen und zwar mit Allradantrieb = ignore
Personenkraftwagen und zwar Wohnmobile = ignore
Personenkraftwagen und zwar Krankenwagen, Notarzteinsatzfz. = ignore
Personenkraftwagen und zwar gewerbliche Halter = ignore
Personenkraftwagen und zwar weibliche Halter = ignore
Personenkraftwagen PKW-Dichte je 1.000 Einwohner = ignore
Kraftomnibusse Unnamed 21_level_1 = bus
Lastkraftwagen insgesamt = ignore
Lastkraftwagen mit zulässiger Gesamtmasse bis 2.800 kg = lorry, =< 7500
Lastkraftwagen 2.801 bis 3.500 kg = lorry, =< 7500
Lastkraftwagen 3.501 bis 5.000 kg = lorry, =< 7500
Lastkraftwagen 5.001 bis 7.500 kg = lorry, =< 7500
Lastkraftwagen 7.501 bis 12.000 kg = lorry, > 7500
Lastkraftwagen 12.001 bis 20.000 kg = lorry, > 7500
Lastkraftwagen 20.001 und mehr kg = lorry, > 7500
Lastkraftwagen unbekannt = other
Zugmaschinen insgesamt = traction engine
Zugmaschinen darunter Sattelzugmaschinen = ignore
Zugmaschinen darunter land-/forstwirtschaftliche Zugmaschinen = traction engine, agriculture and forestry
Zugmaschinen land-/forstwirtschaftliche Zugmaschinen beinhalten leichte Zug-maschinen = traction engine, agriculture and forestry
Sonstige Kfz Unnamed 35_level_1 = other
Nutzfahrzeuge insgesamt Unnamed 36_level_1 = ignore
Kraftfahrzeuge insgesamt = ignore
Kraftfahrzeuge Kfz-Dichte je 1.000 Einwohner = ignore
Kraftfahrzeuganhänger Unnamed 39_level_1 = ignore


[PKW]
Benzin = petrol
Diesel = diesel
Gas (einschl. bivalent) = natural gas (incl. bivalent)
Hybrid insgesamt = hybrid
darunter Hybrid mit Plug-in = ignore
Elektro = electricity
sonstige = other
5 changes: 5 additions & 0 deletions reegis/geometries.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ def spatial_join_with_buffer(
if jcol == "index":
jcol = "index_right"

if isinstance(geo1, gpd.GeoSeries):
crs = geo1.crs
geo1 = gpd.GeoDataFrame(geo1, columns=["geometry"])
geo1.crs = crs

logging.debug("Doing spatial join...")

# Spatial (left) join with the "within" operation.
Expand Down
195 changes: 195 additions & 0 deletions reegis/mobility.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# -*- coding: utf-8 -*-

"""Calculte the mobility demand.
SPDX-FileCopyrightText: 2016-2019 Uwe Krien <krien@uni-bremen.de>
SPDX-License-Identifier: MIT
"""
__copyright__ = "Uwe Krien <krien@uni-bremen.de>"
__license__ = "MIT"


import os
import pandas as pd
from collections import namedtuple

from reegis import geometries, config as cfg, tools, energy_balance


def format_kba_table(filename, table):
"""
Parameters
----------
filename
table
Returns
-------
"""

# Read table
df = pd.read_excel(filename, table, skiprows=7, header=[0, 1])

# Drop empty column
df = df.drop([("Unnamed: 0_level_0", "Unnamed: 0_level_1")], axis=1)

idx1 = df.columns[0]
idx2 = df.columns[1]
idx3 = df.columns[2]

# Remove lines with subtotal
df.loc[(df[idx1] == "SONSTIGE"), idx2] = "SONSTIGE"
df.loc[(df[idx1] == "SONSTIGE"), idx3] = "00000 SONSTIGE"
df = df.drop(df.loc[df[idx3].isnull()].index)
df[df.columns[[0, 1, 2]]] = df[df.columns[[0, 1, 2]]].fillna(
method="ffill"
)

# Add column with name of subregion and remove name from index
df[df.columns[2]] = df[df.columns[2]].str[:5]

# set MultiIndex
df.set_index(list(df.columns[[0, 1, 2]]), inplace=True)
df.index = df.index.set_names(["state", "region", "subregion"])

# Remove format-strings from column names
level1 = (
df.columns.get_level_values(1)
.str.replace("\n", " ")
.str.replace("- ", "")
.str.replace(":", "")
)
level0 = (
df.columns.get_level_values(0)
.str.replace("\n", " ")
.str.replace("- ", "")
.str.replace(":", "")
)
df.columns = pd.MultiIndex.from_arrays([level0, level1])

return df


def get_kba_table():
"""
Returns
-------
"""
kba_table = namedtuple("kba_table", "kfz pkw")
kba_filename = os.path.join(
cfg.get("paths", "general"), cfg.get("mobility", "table_kba")
)

# Download table if it does not exit
if not os.path.isfile(kba_filename):
tools.download_file(kba_filename, cfg.get("mobility", "url_kba"))

return kba_table(
kfz=format_kba_table(kba_filename, "Kfz_u_Kfz_Anh"),
pkw=format_kba_table(kba_filename, "Pkw"),
)


def create_grouped_table_kfz():
"""Group the kfz-table by main groups."""
df = get_kba_table().kfz
df.index = df.index.droplevel([0, 1])
df.columns = [" ".join(col).strip() for col in df.columns]
kfz_dict = cfg.get_dict("KFZ")
for col in df.columns:
df[col] = pd.to_numeric(df[col].replace("-", ""))
df = df.groupby(by=kfz_dict, axis=1).sum()
df["traction engine, general"] = (
df["traction engine"] - df["traction engine, agriculture and forestry"]
)
df.drop("traction engine", axis=1, inplace=True)
df.drop("ignore", axis=1, inplace=True)
return df


def create_grouped_table_pkw():
"""
Extract fuel groups of passenger cars
Examples
--------
>>> pkw = create_grouped_table_pkw()
>>> pkw['petrol'].sum()
31031021.0
>>> pkw['diesel'].sum()
15153364.0
"""
df = get_kba_table().pkw
df.index = df.index.droplevel([0, 1])
df = df["Nach Kraftstoffarten"]
df = df.groupby(by=cfg.get_dict("PKW"), axis=1).sum()
df.drop("ignore", axis=1, inplace=True)
return df


def get_admin_by_region(region):
"""Allocate admin keys to the given regions."""
fn = os.path.join(cfg.get("paths", "geometry"), "vg1000_geodata.geojson")
vg = geometries.load(fullname=fn)
vg.set_index("RS", inplace=True)

reg2vg = geometries.spatial_join_with_buffer(
vg.representative_point(), region, "fs", limit=0
)

return pd.DataFrame(reg2vg.drop("geometry", axis=1))


def get_grouped_kfz_by_region(region):
"""Get the main vehicle groups by region.
Examples
--------
>>> fs = geometries.get_federal_states_polygon()
>>> total = get_grouped_kfz_by_region(fs).sum()
>>> int(total["passenger car"])
47095784
>>> int(total["lorry, > 7500"])
295826
"""
df = create_grouped_table_kfz()
reg2vg = get_admin_by_region(region)
df2reg = df.merge(reg2vg, left_index=True, right_index=True, how="left")
df2reg["fs"] = df2reg["fs"].fillna("unknown")
return df2reg.groupby("fs").sum()


def get_traffic_fuel_energy(year):
"""
Parameters
----------
year
Returns
-------
Examples
--------
>>> fuel_energy = get_traffic_fuel_energy(2017)
>>> int(fuel_energy["Ottokraftstoffe"])
719580
>>> fuel_share = fuel_energy.div(fuel_energy.sum()) * 100
>>> round(fuel_share["Dieselkraftstoffe"], 1)
62.7
"""
fuel_energy = energy_balance.get_de_balance(year).loc["Straßenverkehr"]
fuel_energy = fuel_energy[fuel_energy != 0]
fuel_energy.drop(
["primär (gesamt)", "sekundär (gesamt)", "Row", "gesamt"], inplace=True
)
return fuel_energy


if __name__ == "__main__":
pass
4 changes: 4 additions & 0 deletions reegis/reegis.ini
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ heat_profile_region_var = heat_profile_{map}_{year}_weather_{weather_year}.csv
heat_profile_state = heat_profile_state_{year}.csv
heat_profile_state_var = heat_profile_state_{year}_weather_{weather_year}.csv

[mobility]
url_kba = https://www.kba.de/SharedDocs/Publikationen/DE/Statistik/Fahrzeuge/FZ/2019/fz1_2019_xlsx.xlsx;jsessionid=2913FE1A8D3294C88D4F4FC29A516B51.live21302?__blob=publicationFile&v=10
table_kba = kfz_pkw_table.xlsx

[entsoe]
timeseries_version = latest
timeseries_data = http://data.open-power-system-data.org/time_series/{version}/time_series_60min_singleindex.csv
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"demandlib",
"tables",
"shapely",
"pvlib",
"pvlib < 0.7",
"geopandas",
"requests",
"numpy",
Expand Down

0 comments on commit e5e38dd

Please sign in to comment.