From 3f8e34d6a28fd26121521da685acdb7a34c00119 Mon Sep 17 00:00:00 2001
From: Florian Kotthoff <74312290+FlorianK13@users.noreply.github.com>
Date: Thu, 12 Sep 2024 10:05:27 +0200
Subject: [PATCH 1/2] Delete content belonging to old paper #552
---
scripts/Completeness_test.ipynb | 1104 -----------------
.../Matching coordinates with districts.ipynb | 273 ----
scripts/data/VG2500_Districts/VG2500_KRS.cpg | 1 -
scripts/data/VG2500_Districts/VG2500_KRS.dbf | Bin 119202 -> 0 bytes
scripts/data/VG2500_Districts/VG2500_KRS.prj | 1 -
scripts/data/VG2500_Districts/VG2500_KRS.shp | Bin 993992 -> 0 bytes
scripts/data/VG2500_Districts/VG2500_KRS.shx | Bin 3300 -> 0 bytes
scripts/data/VG2500_Districts/aktualitaet.txt | 2 -
.../datenlizenz_deutschland_v2_0_eng.pdf | Bin 207537 -> 0 bytes
...quellenvermerk_datenlizenz_deutschland.txt | 19 -
.../data/VG5000_Municipalities/VG5000_GEM.cpg | 1 -
.../data/VG5000_Municipalities/VG5000_GEM.dbf | Bin 3255026 -> 0 bytes
.../data/VG5000_Municipalities/VG5000_GEM.prj | 1 -
.../data/VG5000_Municipalities/VG5000_GEM.shp | Bin 3404636 -> 0 bytes
.../data/VG5000_Municipalities/VG5000_GEM.shx | Bin 88052 -> 0 bytes
.../VG5000_Municipalities/aktualitaet.txt | 2 -
.../datenlizenz_deutschland_v2_0_eng.pdf | Bin 207537 -> 0 bytes
...quellenvermerk_datenlizenz_deutschland.txt | 19 -
scripts/docker-compose.yml | 19 -
scripts/map_checker/DatabaseSynchronizer.py | 91 --
scripts/map_checker/MapCheckerApp.py | 454 -------
scripts/map_checker/MapCheckerEngine.py | 146 ---
scripts/map_checker/README.md | 15 -
scripts/map_checker/config.py | 42 -
scripts/map_checker/requirements.txt | 10 -
25 files changed, 2200 deletions(-)
delete mode 100644 scripts/Completeness_test.ipynb
delete mode 100644 scripts/Matching coordinates with districts.ipynb
delete mode 100644 scripts/data/VG2500_Districts/VG2500_KRS.cpg
delete mode 100644 scripts/data/VG2500_Districts/VG2500_KRS.dbf
delete mode 100644 scripts/data/VG2500_Districts/VG2500_KRS.prj
delete mode 100644 scripts/data/VG2500_Districts/VG2500_KRS.shp
delete mode 100644 scripts/data/VG2500_Districts/VG2500_KRS.shx
delete mode 100644 scripts/data/VG2500_Districts/aktualitaet.txt
delete mode 100644 scripts/data/VG2500_Districts/datenlizenz_deutschland_v2_0_eng.pdf
delete mode 100644 scripts/data/VG2500_Districts/quellenvermerk_datenlizenz_deutschland.txt
delete mode 100644 scripts/data/VG5000_Municipalities/VG5000_GEM.cpg
delete mode 100644 scripts/data/VG5000_Municipalities/VG5000_GEM.dbf
delete mode 100644 scripts/data/VG5000_Municipalities/VG5000_GEM.prj
delete mode 100644 scripts/data/VG5000_Municipalities/VG5000_GEM.shp
delete mode 100644 scripts/data/VG5000_Municipalities/VG5000_GEM.shx
delete mode 100644 scripts/data/VG5000_Municipalities/aktualitaet.txt
delete mode 100644 scripts/data/VG5000_Municipalities/datenlizenz_deutschland_v2_0_eng.pdf
delete mode 100644 scripts/data/VG5000_Municipalities/quellenvermerk_datenlizenz_deutschland.txt
delete mode 100644 scripts/docker-compose.yml
delete mode 100644 scripts/map_checker/DatabaseSynchronizer.py
delete mode 100644 scripts/map_checker/MapCheckerApp.py
delete mode 100644 scripts/map_checker/MapCheckerEngine.py
delete mode 100644 scripts/map_checker/README.md
delete mode 100644 scripts/map_checker/config.py
delete mode 100644 scripts/map_checker/requirements.txt
diff --git a/scripts/Completeness_test.ipynb b/scripts/Completeness_test.ipynb
deleted file mode 100644
index 61aa7be4..00000000
--- a/scripts/Completeness_test.ipynb
+++ /dev/null
@@ -1,1104 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "1443777f-5a16-4e40-a1e3-3ce6ad9ffb04",
- "metadata": {},
- "source": [
- "# Data completeness of 6 technology tables"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a4587d1c-49bb-4ae5-8faa-735e05f525cc",
- "metadata": {
- "tags": []
- },
- "source": [
- "### Import dependencies"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "id": "07f0efa4-e400-4ed3-879e-83d6af261477",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import numpy as np\n",
- "from sqlalchemy import create_engine\n",
- "from missingno import nullity_filter, nullity_sort\n",
- "import matplotlib.pyplot as plt\n",
- "from matplotlib.lines import Line2D"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "98f0e3a4-c2d5-48cf-bbaf-7736c9c0c014",
- "metadata": {},
- "source": [
- "### Define the modified missing value matrix function\n",
- "Credits to https://github.com/ResidentMario/missingno"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "id": "ed8ee384-d0d8-46a1-abce-c6aaea46e8d8",
- "metadata": {},
- "outputs": [],
- "source": [
- "def matrix(\n",
- " df,\n",
- " filter=None,\n",
- " n=0,\n",
- " p=0,\n",
- " sort=None,\n",
- " figsize=(25, 10),\n",
- " width_ratios=(15, 1),\n",
- " color=(0.25, 0.25, 0.25),\n",
- " small_unit_color=None,\n",
- " rasterized=False,\n",
- " fontsize=16,\n",
- " labels=None,\n",
- " label_rotation=45,\n",
- " sparkline=True,\n",
- " freq=None,\n",
- " ax=None,\n",
- " wind=False,\n",
- "):\n",
- " \"\"\"\n",
- " A matrix visualization of the nullity of the given DataFrame.\n",
- "\n",
- " :param df: The `DataFrame` being mapped.\n",
- " :param filter: The filter to apply to the heatmap. Should be one of \"top\", \"bottom\", or None (default).\n",
- " :param n: The max number of columns to include in the filtered DataFrame.\n",
- " :param p: The max percentage fill of the columns in the filtered DataFrame.\n",
- " :param sort: The row sort order to apply. Can be \"ascending\", \"descending\", or None.\n",
- " :param figsize: The size of the figure to display.\n",
- " :param fontsize: The figure's font size. Default to 16.\n",
- " :param labels: Whether or not to display the column names. Defaults to the underlying data labels when there are\n",
- " 50 columns or less, and no labels when there are more than 50 columns.\n",
- " :param label_rotation: What angle to rotate the text labels to. Defaults to 45 degrees.\n",
- " :param sparkline: Whether or not to display the sparkline. Defaults to True.\n",
- " :param width_ratios: The ratio of the width of the matrix to the width of the sparkline. Defaults to `(15, 1)`.\n",
- " Does nothing if `sparkline=False`.\n",
- " :param color: The color of the filled columns. Default is `(0.25, 0.25, 0.25)`.\n",
- " :param small_units_color: The color of units <30 kW\n",
- " :param rasterized: matplotlib rasterized option\n",
- " :param wind: Special case for wind matrix\n",
- " :return: The plot axis.\n",
- " \"\"\"\n",
- " df = nullity_filter(df, filter=filter, n=n, p=p)\n",
- " df = nullity_sort(df, sort=sort, axis=\"columns\")\n",
- "\n",
- " height = df.shape[0]\n",
- " width = df.shape[1]\n",
- "\n",
- " # z is the color-mask array, g is a NxNx3 matrix. Apply the z color-mask to set the RGB of each pixel.\n",
- " z = df.notnull().values\n",
- " g = np.zeros((height, width, 3), dtype=np.float32)\n",
- "\n",
- " g[z > 0.5] = color\n",
- " # Different coloring for small units\n",
- " col_list = df.columns.to_list()\n",
- " if small_unit_color and \"Capacity\" in col_list:\n",
- " column_position = col_list.index(\"Capacity\")\n",
- " z_small = np.zeros_like(z, dtype=np.bool8)\n",
- " z_small = df.iloc[:, column_position].values <= 30\n",
- " g[z_small > 0.5] = small_unit_color\n",
- "\n",
- " g[z < 0.5] = [1, 1, 1]\n",
- "\n",
- " if wind:\n",
- " g_old = g.copy()\n",
- " g_new = np.zeros((height, 2 * width, 3), dtype=np.float32)\n",
- " for i in range(width):\n",
- " g_new[:, [i * 2, i * 2 + 1], :] = (\n",
- " g_old[:, i, :].reshape(height, 1, 3).repeat(2, axis=1)\n",
- " )\n",
- "\n",
- " g = np.delete(g_new, [7, 9], 1)\n",
- "\n",
- " # Set up the matplotlib grid layout. A unary subplot if no sparkline, a left-right splot if yes sparkline.\n",
- " if ax is None:\n",
- " plt.figure(figsize=figsize)\n",
- " if sparkline:\n",
- " gs = gridspec.GridSpec(1, 2, width_ratios=width_ratios)\n",
- " gs.update(wspace=0.08)\n",
- " ax1 = plt.subplot(gs[1])\n",
- " else:\n",
- " gs = gridspec.GridSpec(1, 1)\n",
- " ax0 = plt.subplot(gs[0])\n",
- " else:\n",
- " if sparkline is not False:\n",
- " warnings.warn(\n",
- " \"Plotting a sparkline on an existing axis is not currently supported. \"\n",
- " \"To remove this warning, set sparkline=False.\"\n",
- " )\n",
- " sparkline = False\n",
- " ax0 = ax\n",
- "\n",
- " # Create the nullity plot.\n",
- " ax0.imshow(g, interpolation=\"none\", rasterized=rasterized)\n",
- "\n",
- " # Remove extraneous default visual elements.\n",
- " ax0.set_aspect(\"auto\")\n",
- " ax0.grid(visible=False)\n",
- " ax0.xaxis.tick_top()\n",
- " ax0.xaxis.set_ticks_position(\"none\")\n",
- " ax0.yaxis.set_ticks_position(\"none\")\n",
- " ax0.spines[\"top\"].set_visible(False)\n",
- " ax0.spines[\"right\"].set_visible(False)\n",
- " ax0.spines[\"bottom\"].set_visible(False)\n",
- " ax0.spines[\"left\"].set_visible(False)\n",
- "\n",
- " # Set up and rotate the column ticks. The labels argument is set to None by default. If the user specifies it in\n",
- " # the argument, respect that specification. Otherwise display for <= 50 columns and do not display for > 50.\n",
- " if (labels or (labels is None and len(df.columns) <= 50)) and not wind:\n",
- " ha = \"left\"\n",
- " ax0.set_xticks(list(range(0, width)))\n",
- " ax0.set_xticklabels(\n",
- " list(df.columns), rotation=label_rotation, ha=ha, fontsize=fontsize\n",
- " )\n",
- " else:\n",
- " ax0.set_xticks([])\n",
- "\n",
- " # Adds Timestamps ticks if freq is not None, else set up the two top-bottom row ticks.\n",
- " if freq:\n",
- " ts_list = []\n",
- "\n",
- " if type(df.index) == pd.PeriodIndex:\n",
- " ts_array = pd.date_range(\n",
- " df.index.to_timestamp().date[0],\n",
- " df.index.to_timestamp().date[-1],\n",
- " freq=freq,\n",
- " ).values\n",
- "\n",
- " ts_ticks = pd.date_range(\n",
- " df.index.to_timestamp().date[0],\n",
- " df.index.to_timestamp().date[-1],\n",
- " freq=freq,\n",
- " ).map(lambda t: t.strftime(\"%Y-%m-%d\"))\n",
- "\n",
- " elif type(df.index) == pd.DatetimeIndex:\n",
- " ts_array = pd.date_range(df.index[0], df.index[-1], freq=freq).values\n",
- "\n",
- " ts_ticks = pd.date_range(df.index[0], df.index[-1], freq=freq).map(\n",
- " lambda t: t.strftime(\"%Y-%m-%d\")\n",
- " )\n",
- " else:\n",
- " raise KeyError(\"Dataframe index must be PeriodIndex or DatetimeIndex.\")\n",
- " try:\n",
- " for value in ts_array:\n",
- " ts_list.append(df.index.get_loc(value))\n",
- " except KeyError:\n",
- " raise KeyError(\"Could not divide time index into desired frequency.\")\n",
- "\n",
- " ax0.set_yticks(ts_list)\n",
- " ax0.set_yticklabels(ts_ticks, fontsize=int(fontsize / 16 * 20), rotation=0)\n",
- " else:\n",
- " ax0.set_yticks([0, df.shape[0] - 1])\n",
- " ax0.set_yticklabels(\n",
- " [1, df.shape[0]], fontsize=int(fontsize / 16 * 20), rotation=0\n",
- " )\n",
- "\n",
- " # Create the inter-column vertical grid.\n",
- " if not wind:\n",
- " in_between_point = [x + 0.5 for x in range(0, width - 1)]\n",
- " for in_between_point in in_between_point:\n",
- " ax0.axvline(in_between_point, linestyle=\"-\", color=\"white\")\n",
- "\n",
- " if sparkline:\n",
- " # Calculate row-wise completeness for the sparkline.\n",
- " completeness_srs = df.notnull().astype(bool).sum(axis=1)\n",
- " x_domain = list(range(0, height))\n",
- " y_range = list(reversed(completeness_srs.values))\n",
- " min_completeness = min(y_range)\n",
- " max_completeness = max(y_range)\n",
- " min_completeness_index = y_range.index(min_completeness)\n",
- " max_completeness_index = y_range.index(max_completeness)\n",
- "\n",
- " # Set up the sparkline, remove the border element.\n",
- " ax1.grid(b=False)\n",
- " ax1.set_aspect(\"auto\")\n",
- " # GH 25\n",
- " if int(mpl.__version__[0]) <= 1:\n",
- " ax1.set_axis_bgcolor((1, 1, 1))\n",
- " else:\n",
- " ax1.set_facecolor((1, 1, 1))\n",
- " ax1.spines[\"top\"].set_visible(False)\n",
- " ax1.spines[\"right\"].set_visible(False)\n",
- " ax1.spines[\"bottom\"].set_visible(False)\n",
- " ax1.spines[\"left\"].set_visible(False)\n",
- " ax1.set_ymargin(0)\n",
- "\n",
- " # Plot sparkline---plot is sideways so the x and y axis are reversed.\n",
- " ax1.plot(y_range, x_domain, color=color)\n",
- "\n",
- " if labels:\n",
- " # Figure out what case to display the label in: mixed, upper, lower.\n",
- " label = \"Data Completeness\"\n",
- " if str(df.columns[0]).islower():\n",
- " label = label.lower()\n",
- " if str(df.columns[0]).isupper():\n",
- " label = label.upper()\n",
- "\n",
- " # Set up and rotate the sparkline label.\n",
- " ha = \"left\"\n",
- " ax1.set_xticks(\n",
- " [min_completeness + (max_completeness - min_completeness) / 2]\n",
- " )\n",
- " ax1.set_xticklabels(\n",
- " [label], rotation=label_rotation, ha=ha, fontsize=fontsize\n",
- " )\n",
- " ax1.xaxis.tick_top()\n",
- " ax1.set_yticks([])\n",
- " else:\n",
- " ax1.set_xticks([])\n",
- " ax1.set_yticks([])\n",
- "\n",
- " # Add maximum and minimum labels, circles.\n",
- " ax1.annotate(\n",
- " max_completeness,\n",
- " xy=(max_completeness, max_completeness_index),\n",
- " xytext=(max_completeness + 2, max_completeness_index),\n",
- " fontsize=int(fontsize / 16 * 14),\n",
- " va=\"center\",\n",
- " ha=\"left\",\n",
- " )\n",
- " ax1.annotate(\n",
- " min_completeness,\n",
- " xy=(min_completeness, min_completeness_index),\n",
- " xytext=(min_completeness - 2, min_completeness_index),\n",
- " fontsize=int(fontsize / 16 * 14),\n",
- " va=\"center\",\n",
- " ha=\"right\",\n",
- " )\n",
- "\n",
- " ax1.set_xlim(\n",
- " [min_completeness - 2, max_completeness + 2]\n",
- " ) # Otherwise the circles are cut off.\n",
- " ax1.plot(\n",
- " [min_completeness],\n",
- " [min_completeness_index],\n",
- " \".\",\n",
- " color=color,\n",
- " markersize=10.0,\n",
- " )\n",
- " ax1.plot(\n",
- " [max_completeness],\n",
- " [max_completeness_index],\n",
- " \".\",\n",
- " color=color,\n",
- " markersize=10.0,\n",
- " )\n",
- "\n",
- " # Remove tick mark (only works after plotting).\n",
- " ax1.xaxis.set_ticks_position(\"none\")\n",
- "\n",
- " return ax0"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "44dfdf79-47c9-48d1-9c35-c9c0503dcd46",
- "metadata": {},
- "source": [
- "### Establish a connection to open-mastr database"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "7f409571-ab4a-403a-8c3c-93d6e7f7927f",
- "metadata": {},
- "outputs": [],
- "source": [
- "db_url = \"postgresql://postgres:postsgg@localhost:5432/open-mastr-local\"\n",
- "engine = create_engine(db_url)\n",
- "con = engine.connect()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "bd489063-6750-41b4-a24b-b7cc7daeecd8",
- "metadata": {},
- "source": [
- "## Analysis"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "53942a4a-8073-437d-a576-2afd5b922c51",
- "metadata": {
- "tags": []
- },
- "source": [
- "### Load first wind dataset, others subsequently"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "605ab1fd-36e3-45a8-8306-49fb49132235",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "column_query = \"\"\"SELECT column_name \n",
- " FROM information_schema.columns\n",
- " WHERE table_name = 'wind_extended'\"\"\"\n",
- "column_list = pd.read_sql(column_query, con=con).values.tolist()\n",
- "column_list = [sublist[0] for sublist in column_list]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "2888c14f-e692-400c-b83f-522ecb02a6e9",
- "metadata": {},
- "outputs": [],
- "source": [
- "wind_completeness = {}\n",
- "for column in column_list:\n",
- " comp_query = f\"\"\"SELECT AVG(CASE WHEN \"{column}\" IS NULL THEN 0.0 ELSE 1.0 END)*100 AS completeness\n",
- " FROM wind_extended\"\"\"\n",
- " df = pd.read_sql(comp_query, con=con)\n",
- " wind_completeness[column] = df.completeness[0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "id": "c0e22fae-b807-4d4c-8814-abc817c3de3a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'geom': 97.48636471425183,\n",
- " 'DatumDownload': 100.0,\n",
- " 'UtmEast': 0.0,\n",
- " 'UtmNorth': 0.0,\n",
- " 'GaussKruegerHoch': 0.0}"
- ]
- },
- "execution_count": 19,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "dict(list(wind_completeness.items())[:5])"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "8e758406-6d41-4796-8124-cdfd9c55b7b3",
- "metadata": {},
- "source": [
- "### Focus on interesting columns"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "3dd89e21-2f84-4850-8836-00476fd218b1",
- "metadata": {},
- "outputs": [],
- "source": [
- "wind_include_columns = [\n",
- " \"Nettonennleistung\",\n",
- " \"Landkreis\",\n",
- " \"Postleitzahl\",\n",
- " \"Hausnummer\",\n",
- " \"Seelage\",\n",
- " \"Laengengrad\",\n",
- "]\n",
- "wind_english_columns = [\n",
- " \"Capacity\",\n",
- " \"Region\",\n",
- " \"Postcode\",\n",
- " \"Address\",\n",
- " \"Offshore position\",\n",
- " \"Coordinates\",\n",
- "]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "id": "3f7d7620",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "specific_completeness_query = \"SELECT \"\n",
- "for column in wind_include_columns[:-1]:\n",
- " specific_completeness_query += f\"\"\"\"{column}\", \"\"\"\n",
- "specific_completeness_query += f\"\"\" \"{wind_include_columns[-1]}\" \"\"\"\n",
- "specific_completeness_query += \"\"\"FROM wind_extended ORDER BY \"EinheitMastrNummer\"; \"\"\"\n",
- "\n",
- "wind_df = pd.read_sql_query(sql=specific_completeness_query, con=con)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "8e0439ce",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Nettonennleistung | \n",
- " Landkreis | \n",
- " Postleitzahl | \n",
- " Hausnummer | \n",
- " Seelage | \n",
- " Laengengrad | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 31.00 | \n",
- " Oder-Spree | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 14.387865 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 31.00 | \n",
- " Paderborn | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 8.651723 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 31.00 | \n",
- " Eifelkreis Bitburg-Prüm | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 6.248464 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 31.00 | \n",
- " Donnersbergkreis | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 8.045690 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " 2.02 | \n",
- " Erfurt | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " 33731 | \n",
- " 31.00 | \n",
- " Ostholstein | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 11.015243 | \n",
- "
\n",
- " \n",
- " 33732 | \n",
- " 31.00 | \n",
- " Nordfriesland | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 9.096121 | \n",
- "
\n",
- " \n",
- " 33733 | \n",
- " 31.00 | \n",
- " Esslingen | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 9.620833 | \n",
- "
\n",
- " \n",
- " 33734 | \n",
- " 31.00 | \n",
- " Salzlandkreis | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 11.502701 | \n",
- "
\n",
- " \n",
- " 33735 | \n",
- " 31.00 | \n",
- " Ludwigslust-Parchim | \n",
- " 1 | \n",
- " None | \n",
- " None | \n",
- " 12.234140 | \n",
- "
\n",
- " \n",
- "
\n",
- "
33736 rows × 6 columns
\n",
- "
"
- ],
- "text/plain": [
- " Nettonennleistung Landkreis Postleitzahl Hausnummer \\\n",
- "0 31.00 Oder-Spree 1 None \n",
- "1 31.00 Paderborn 1 None \n",
- "2 31.00 Eifelkreis Bitburg-Prüm 1 None \n",
- "3 31.00 Donnersbergkreis 1 None \n",
- "4 2.02 Erfurt 1 None \n",
- "... ... ... ... ... \n",
- "33731 31.00 Ostholstein 1 None \n",
- "33732 31.00 Nordfriesland 1 None \n",
- "33733 31.00 Esslingen 1 None \n",
- "33734 31.00 Salzlandkreis 1 None \n",
- "33735 31.00 Ludwigslust-Parchim 1 None \n",
- "\n",
- " Seelage Laengengrad \n",
- "0 None 14.387865 \n",
- "1 None 8.651723 \n",
- "2 None 6.248464 \n",
- "3 None 8.045690 \n",
- "4 None NaN \n",
- "... ... ... \n",
- "33731 None 11.015243 \n",
- "33732 None 9.096121 \n",
- "33733 None 9.620833 \n",
- "33734 None 11.502701 \n",
- "33735 None 12.234140 \n",
- "\n",
- "[33736 rows x 6 columns]"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Postcode, street to 0,1 not to sort accordingly as well as capacity\n",
- "wind_df.loc[wind_df.Nettonennleistung > 30, \"Nettonennleistung\"] = 31\n",
- "wind_df.loc[~wind_df.Postleitzahl.isna(), \"Postleitzahl\"] = 1\n",
- "wind_df"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "b976849a",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "Int64Index: 33736 entries, 6927 to 4129\n",
- "Data columns (total 6 columns):\n",
- " # Column Non-Null Count Dtype \n",
- "--- ------ -------------- ----- \n",
- " 0 Capacity 33736 non-null float64\n",
- " 1 Region 32122 non-null object \n",
- " 2 Postcode 32122 non-null object \n",
- " 3 Address 2819 non-null object \n",
- " 4 Offshore position 1614 non-null object \n",
- " 5 Coordinates 32888 non-null float64\n",
- "dtypes: float64(2), object(4)\n",
- "memory usage: 1.8+ MB\n"
- ]
- }
- ],
- "source": [
- "wind_df = wind_df.sort_values(by=wind_df.columns.to_list(), ascending=False)\n",
- "wind_df = wind_df.rename(\n",
- " columns={g: e for g, e in zip(wind_include_columns, wind_english_columns)}\n",
- ")\n",
- "wind_df.info()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "ac85550f-7c8a-40d3-ab57-143257f71b17",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Capacity | \n",
- " Region | \n",
- " Postcode | \n",
- " Address | \n",
- " Offshore position | \n",
- " Coordinates | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 6927 | \n",
- " 31.0 | \n",
- " Zwickau | \n",
- " 1 | \n",
- " 95Z | \n",
- " None | \n",
- " 12.348829 | \n",
- "
\n",
- " \n",
- " 8280 | \n",
- " 31.0 | \n",
- " Zwickau | \n",
- " 1 | \n",
- " 901 | \n",
- " None | \n",
- " 12.348285 | \n",
- "
\n",
- " \n",
- " 29577 | \n",
- " 31.0 | \n",
- " Zwickau | \n",
- " 1 | \n",
- " 4 | \n",
- " None | \n",
- " 16.593999 | \n",
- "
\n",
- " \n",
- " 12174 | \n",
- " 31.0 | \n",
- " Zwickau | \n",
- " 1 | \n",
- " 1 Y | \n",
- " None | \n",
- " 12.556667 | \n",
- "
\n",
- " \n",
- " 33620 | \n",
- " 31.0 | \n",
- " Zwickau | \n",
- " 1 | \n",
- " 1 | \n",
- " None | \n",
- " 12.385010 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Capacity Region Postcode Address Offshore position Coordinates\n",
- "6927 31.0 Zwickau 1 95Z None 12.348829\n",
- "8280 31.0 Zwickau 1 901 None 12.348285\n",
- "29577 31.0 Zwickau 1 4 None 16.593999\n",
- "12174 31.0 Zwickau 1 1 Y None 12.556667\n",
- "33620 31.0 Zwickau 1 1 None 12.385010"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "wind_df.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2c27b5fa",
- "metadata": {
- "pycharm": {
- "name": "#%% md\n"
- }
- },
- "source": [
- "### Other 5 technologies"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "id": "c3886aaf",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "completeness_dfs = {\"wind\": wind_df}\n",
- "completeness_dicts = {\"wind\": wind_completeness}\n",
- "techs = [\"solar\", \"hydro\", \"biomass\", \"storage\", \"combustion\"]\n",
- "include_columns = [\n",
- " \"Nettonennleistung\",\n",
- " \"Landkreis\",\n",
- " \"Postleitzahl\",\n",
- " \"Hausnummer\",\n",
- " \"Laengengrad\",\n",
- "]\n",
- "english_columns = [\n",
- " \"Capacity\",\n",
- " \"Region\",\n",
- " \"Postcode\",\n",
- " \"Address\",\n",
- " \"Coordinates\",\n",
- "]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "id": "b01f259a",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
- "source": [
- "for tech in techs:\n",
- " column_query = f\"\"\"SELECT column_name\n",
- " FROM information_schema.columns\n",
- " WHERE table_name = '{tech}_extended'\"\"\"\n",
- " column_list = pd.read_sql(column_query, con=con).values.tolist()\n",
- " column_list = [sublist[0] for sublist in column_list]\n",
- " tech_completeness = {}\n",
- " for column in column_list:\n",
- " comp_query = f\"\"\"SELECT AVG(CASE WHEN \"{column}\" IS NULL THEN 0.0 ELSE 1.0 END)*100 AS completeness\n",
- " FROM {tech}_extended\"\"\"\n",
- " df = pd.read_sql(comp_query, con=con)\n",
- " tech_completeness[column] = df.completeness[0]\n",
- "\n",
- " # store\n",
- " completeness_dicts[tech] = tech_completeness\n",
- "\n",
- " specific_completeness_query = \"SELECT \"\n",
- " for column in include_columns[:-1]:\n",
- " specific_completeness_query += f\"\"\"\"{column}\", \"\"\"\n",
- " specific_completeness_query += f\"\"\" \"{include_columns[-1]}\" \"\"\"\n",
- " specific_completeness_query += (\n",
- " f\"\"\"FROM {tech}_extended \"\"\" # ORDER BY \"EinheitMastrNummer\"; \"\"\"\n",
- " )\n",
- "\n",
- " df = pd.read_sql_query(sql=specific_completeness_query, con=con)\n",
- "\n",
- " df = df.sort_values(by=df.columns.to_list(), ascending=False)\n",
- " df = df.rename(columns={g: e for g, e in zip(include_columns, english_columns)})\n",
- "\n",
- " # store\n",
- " completeness_dfs[tech] = df"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "6d07d19f-02e8-46f9-9fc6-7e891648ffc4",
- "metadata": {},
- "source": [
- "## Visualization"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "id": "95479821-eb94-475e-bb08-296c50ac622b",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# setup\n",
- "color = (0, 0.2, 0.4)\n",
- "small_unit_color = (0.39, 0.49, 0.59)\n",
- "plt.rcParams.update(\n",
- " {\n",
- " \"text.usetex\": True,\n",
- " \"font.family\": \"sans-serif\",\n",
- " \"font.size\": 11,\n",
- " \"figure.figsize\": (8, 6.4),\n",
- " }\n",
- ")\n",
- "\n",
- "techs = [\"solar\", \"wind\", \"biomass\", \"hydro\", \"combustion\", \"storage\"]\n",
- "subs = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "id": "0f34d159",
- "metadata": {
- "collapsed": false,
- "jupyter": {
- "outputs_hidden": false
- },
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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+vnnn1FaWoqKigp8+umnePzxxzFixAjlTOLly5dj7ty5YZu3mmeffRZDhw7F0qVLcdlllykrF4fDgTvuuAMtW7bEJZdcErHbt/ouM94TIex2O/r374+hQ4diwYIFyM3NxahRo3DJJZegX79+ET2jOlYwazWLVNYeffRRDBw4ULkU14oVKzB8+HAcOXIEAPDll1+ibdu2Nd4EoqKiAmPGjMErr7yCkydPYuLEiTCZTJgyZQqAytvdlpaW4pdffkFKSopyola4MGt1w6wFptVtGsDtWkNjwxyio0ePYunSpX6PLViwQLnT0YkTJ3D33Xfj1ltvxTvvvKNMM3fuXHTp0gWfffZZRL/xpqWlYcCAAVi0aBEWL14Ms9mMU6dOYe3atejXrx+WLFmCZs2aKZfimTlzpvLvcNbjNXfuXFx99dW44447cMUVV+Dtt9/2O0T066+/omPHjiFfgqo+SktLYTAY/C6nYzAYlJULADidzoiMeyssLFT+7f2MRowY4Xed2meffRZms1nZq/fTTz/5HcJqbJi10OrxClfWfN83KysL119/PXbv3o3vv/8e9913H1566SV8/vnneOCBB4JeNuyRRx5R7s7ncDjw8MMPY9asWUoGf/75Z4wePVq50kY4MGu1x6wFr8VLS9s0gNu1aGDDHIKDBw+iS5cuuO+++5Q7+gBAUVGRssJft24dRo4cCavVittvv1251SNQ+Y28c+fOfme01tWpU6dw8uRJFBcX+z3uPQQCVB5STU1NVcL82WefoV27dsqloQ4dOoSUlJSwXivT9/DZJ598gp49eyq3t503bx5uv/12LFy4EMePH8fatWvRq1evarfwDIdAh8727t2LVq1aVbubUadOndC/f/+w1+B155134pZbblFuOVpeXo6jR48iOTlZudyR18CBAzF+/Hi/v6ExYtaCi1TWfJe7hQsX4qqrrkK3bt1w4MABvPvuu5g0aRL69OmDdevWBX2vxYsX47LLLkP//v2xfv16/Pzzz/jb3/6Gp556SrmklfczDMfyzqzVHrOmTivbNIDbNa1gwxzEsWPHcM011/hd89GX9xvT3Llzldti9uzZE+PHj/c7ZDlz5sx6337y8OHDGDVqFNLS0nDhhRf6nWzRt29f/OMf/8DChQtxww03KCfQeFdwzzzzDDIzM/H111+jd+/e+PTTT+tVi5fdbofV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REQquIeZoop7nGLb/alXSPMWZ0W1hubN/liNje7fQ06eKmctVWrRWs60UM+hQ4ekdes3ol0GEcUINswUVdE+VMzDxERERBQMh2QQEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIKXlaOo4iXdiIiISOvYMFNU8TrMREREpHUckkFEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRiqbRLoAat6MbXo52CURERESq2DBTVJ3T5+9y7MTJqM3/7DObs2knIiIiVRySQURERESkgg0zEREREZEKNsxERERERCo4hpmiiuOHiYiISOvYMFNU8aQ/IiIi0joOySAiIiIiUsGGmYiIiIhIBRtmIiIiIiIVbJiJiIiIiFSwYSYiIiIiUsGGmYiIiIhIBRtmIiIiIiIVbJiJiIiIiFSwYSYiIiIiUsE7/VFU8S57REREpHXcw0xEREREpIJ7mCmqzunzdzl24mTU5n/2mc25l5uIiIhUcQ8zEREREZEKNsxERERERCrickjG/alXSPMWZ0W1hubN/vhoR/fvISdPlbOW/+Nbj5aGQ2ihlkOHDknr1m9EuwwiIiLywT3MREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIINMxERERGRCjbMREREREQq2DATEREREalgw0xEREREpIIN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\n",
- "text/plain": [
- "