diff --git a/book/00_MinIO_Object_Store.ipynb b/book/00_MinIO_Object_Store.ipynb index 4fe016b..7a3aad9 100644 --- a/book/00_MinIO_Object_Store.ipynb +++ b/book/00_MinIO_Object_Store.ipynb @@ -29,7 +29,7 @@ "id": "8a8d65c2-8638-4385-a40d-0dfa190d4601", "metadata": {}, "source": [ - "# Connect to MinIO via DuckDB" + "## Connect to MinIO via DuckDB" ] }, { diff --git a/book/01a_Data_Extraction_DuckDB_PyIceberg.ipynb b/book/01a_Data_Extraction_DuckDB_PyIceberg.ipynb index de9c90e..cdfd2ec 100644 --- a/book/01a_Data_Extraction_DuckDB_PyIceberg.ipynb +++ b/book/01a_Data_Extraction_DuckDB_PyIceberg.ipynb @@ -3,19 +3,19 @@ { "cell_type": "markdown", "id": "7ee2c20c-e467-4499-84c5-0d583cee77b6", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "metadata": {}, "source": [ - "# DuckDB + PyIceberg: Data Extraction from *geo-sorted ohsome contributions* \n", + "# Download latest OSM data as GeoPackage\n", "\n", - ":::{note}\n", - "1. Set the connection params and configure DuckDB.\n", - "2. Download the data in 3 steps:\n", - " * Download data with PyIceberg.\n", - " * Fitler and process data with DuckDB.\n", - " * Export results into geopackage file with GeoPandas.\n", - ":::" + "In this notebook we demonstrate how you can download the latest OSM data in GeoPackage format.\n", + "\n", + "These are the steps you see further down:\n", + "\n", + "* Set the connection parameters.\n", + "* Prepare your input parameters, e.g. define area of interest and OSM tag filter.\n", + "* **Download data** using PyIceberg and DuckDB.\n", + "* Filter and process data with DuckDB.\n", + "* Export results into geopackage file with GeoPandas. " ] }, { @@ -23,13 +23,13 @@ "id": "b6ec70ad-bce1-4052-b151-23fe47fad942", "metadata": {}, "source": [ - "# Getting started\n", + "## Getting started\n", "Set connection params." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "554c5bc9-8962-44ed-96f8-fd34b3efe564", "metadata": {}, "outputs": [], @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "f2e24802-8629-4648-afe5-d4c5f21403df", "metadata": {}, "outputs": [], @@ -61,7 +61,6 @@ " config={\n", " 'threads': 8,\n", " 'max_memory': '8GB',\n", - " # 'enable_object_cache': True\n", " }\n", ")\n", "con.install_extension(\"spatial\")\n", @@ -88,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "825cd3dc-18d1-48fb-ad47-2945bb3a8c53", "metadata": {}, "outputs": [], @@ -113,7 +112,7 @@ "id": "bed363ef-ee28-411e-9d56-501c1005beac", "metadata": {}, "source": [ - "# Download data with PyIceberg table scan\n", + "## Download data with PyIceberg table scan\n", "In this step we can already filter all OSM contributions by four major factors. We will perform more detailed filtering (e.g. for OSM tags values) later:\n", "* **status** (e.g. latest, historic or deleted OSM features)\n", "* **location** (using the bounding box coordinates of each OSM feature)\n", @@ -123,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "872da17b-f490-4a1a-8aec-09ad847db0ea", "metadata": {}, "outputs": [], @@ -146,8 +145,6 @@ "\n", "selected_region = 'nairobi'\n", "xmin, ymin, xmax, ymax = bboxes[selected_region]\n", - "area_of_interest_file =f\"../data/{selected_region}.geojson\"\n", - "area_of_interest_file = f\"https://raw.githubusercontent.com/GIScience/sotm-2024-ohsome-data-insights-workshop/main/data/{selected_region}.geojson\"\n", "\n", "# Define geometry type filter\n", "geometry_type = 'Polygon'\n", @@ -188,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "5ab182ee-d069-46cb-a88d-e1a76f7ab1f6", "metadata": {}, "outputs": [ @@ -196,7 +193,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "download took 198.388 sec.\n" + "download took 15.965 sec.\n" ] } ], @@ -230,7 +227,7 @@ "id": "f7965fc4-e82d-4972-8d5c-760fe45d3614", "metadata": {}, "source": [ - "# Filter and process data with DuckDB\n", + "## Filter and process data with DuckDB\n", "Second, we use DuckDB to perform the more detailed filtering. In this step we can filter for:\n", "* **tags**\n", "* **location** (using the exact geometry of each OSM contribution)" @@ -238,19 +235,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "d2125907-3028-4e76-ae26-39ac7adf0f94", "metadata": {}, "outputs": [ { - "ename": "IOException", - "evalue": "IO Error: GDAL Error (4): Failed to open file https://raw.githubusercontent.com/GIScience/sotm-2024-ohsome-data-insights-workshop/main/data/nairobi.geojson: {\"exception_type\":\"IO\",\"exception_message\":\"Cannot open file \\\"https://raw.githubusercontent.com/GIScience/sotm-2024-ohsome-data-insights-workshop/main/data/nairobi.geojson\\\": No such file or directory\",\"errno\":\"2\"}", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIOException\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 20\u001b[0m\n\u001b[1;32m 2\u001b[0m start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 4\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;124mDROP TABLE IF EXISTS osm_data;\u001b[39m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;124mCREATE TABLE osm_data AS\u001b[39m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;124m;\u001b[39m\n\u001b[1;32m 19\u001b[0m \u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[0;32m---> 20\u001b[0m \u001b[43mcon\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msql\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 22\u001b[0m processing_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mround\u001b[39m(time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m start_time, \u001b[38;5;241m3\u001b[39m)\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprocessing took \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprocessing_time\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m sec.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mIOException\u001b[0m: IO Error: GDAL Error (4): Failed to open file https://raw.githubusercontent.com/GIScience/sotm-2024-ohsome-data-insights-workshop/main/data/nairobi.geojson: {\"exception_type\":\"IO\",\"exception_message\":\"Cannot open file \\\"https://raw.githubusercontent.com/GIScience/sotm-2024-ohsome-data-insights-workshop/main/data/nairobi.geojson\\\": No such file or directory\",\"errno\":\"2\"}" + "name": "stdout", + "output_type": "stream", + "text": [ + "processing took 0.552 sec.\n" ] } ], @@ -265,12 +258,9 @@ "SELECT a.* \n", "FROM\n", " raw_osm_data as a,\n", - " st_read('{area_of_interest_file}') as aoi\n", "WHERE 1=1\n", " and tags['building'][1] is not null\n", " and tags['building'][1] != 'no'\n", - " -- spatial filtering part\n", - " and ST_Intersects(st_GeomFromText(a.geometry), aoi.geom)\n", ")\n", ";\n", "\"\"\"\n", @@ -285,7 +275,7 @@ "id": "73b8b5e7-41b7-4c3f-a901-3c5403dc4150", "metadata": {}, "source": [ - "# Save data as GeoPackage" + "## Save data as GeoPackage" ] }, { @@ -298,28 +288,27 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 12, "id": "d738f1c2-cbaf-49ce-9350-e6b28e2414b3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "┌─────────────┬────────────────────────────────────────────────────────────┬─────────┬─────────┬─────────┬─────────┐\n", - "│ column_name │ column_type │ null │ key │ default │ extra │\n", - "│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │\n", - "├─────────────┼────────────────────────────────────────────────────────────┼─────────┼─────────┼─────────┼─────────┤\n", - "│ user_id │ INTEGER │ YES │ NULL │ NULL │ NULL │\n", - "│ valid_from │ TIMESTAMP │ YES │ NULL │ NULL │ NULL │\n", - "│ osm_id │ VARCHAR │ YES │ NULL │ NULL │ NULL │\n", - "│ osm_version │ INTEGER │ YES │ NULL │ NULL │ NULL │\n", - "│ tags │ MAP(VARCHAR, VARCHAR) │ YES │ NULL │ NULL │ NULL │\n", - "│ bbox │ STRUCT(xmin DOUBLE, ymin DOUBLE, xmax DOUBLE, ymax DOUBLE) │ YES │ NULL │ NULL │ NULL │\n", - "│ geometry │ VARCHAR │ YES │ NULL │ NULL │ NULL │\n", - "└─────────────┴────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┘" + "┌─────────────┬───────────────────────┬─────────┬─────────┬─────────┬─────────┐\n", + "│ column_name │ column_type │ null │ key │ default │ extra │\n", + "│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │\n", + "├─────────────┼───────────────────────┼─────────┼─────────┼─────────┼─────────┤\n", + "│ user_id │ INTEGER │ YES │ NULL │ NULL │ NULL │\n", + "│ valid_from │ TIMESTAMP │ YES │ NULL │ NULL │ NULL │\n", + "│ osm_id │ VARCHAR │ YES │ NULL │ NULL │ NULL │\n", + "│ osm_version │ INTEGER │ YES │ NULL │ NULL │ NULL │\n", + "│ tags │ MAP(VARCHAR, VARCHAR) │ YES │ NULL │ NULL │ NULL │\n", + "│ geometry │ VARCHAR │ YES │ NULL │ NULL │ NULL │\n", + "└─────────────┴───────────────────────┴─────────┴─────────┴─────────┴─────────┘" ] }, - "execution_count": 22, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -342,22 +331,26 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 13, "id": "7fc355bf-cf38-487d-9b80-5cc02b9edc31", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "┌─────────┬────────────┬─────────┬─────────────┬──────────────────────┬─────────────────────────────────────┬──────────┐\n", - "│ user_id │ valid_from │ osm_id │ osm_version │ tags │ bbox │ geometry │\n", - "│ int32 │ timestamp │ varchar │ int32 │ map(varchar, varch… │ struct(xmin double, ymin double, … │ varchar │\n", - "├─────────┴────────────┴─────────┴─────────────┴──────────────────────┴─────────────────────────────────────┴──────────┤\n", - "│ 0 rows │\n", - "└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" + "┌──────────┬─────────────────────┬────────────────┬─────────────┬──────────────────────┬───────────────────────────────┐\n", + "│ user_id │ valid_from │ osm_id │ osm_version │ tags │ geometry │\n", + "│ int32 │ timestamp │ varchar │ int32 │ map(varchar, varch… │ varchar │\n", + "├──────────┼─────────────────────┼────────────────┼─────────────┼──────────────────────┼───────────────────────────────┤\n", + "│ 1122708 │ 2021-09-07 23:04:37 │ way/500108893 │ 5 │ {building=yes, rai… │ POLYGON ((36.89974139999999… │\n", + "│ 13366421 │ 2023-01-10 06:13:29 │ way/1130552834 │ 1 │ {building=yes, add… │ POLYGON ((36.8719435 -1.241… │\n", + "│ 18306654 │ 2023-11-11 01:58:08 │ way/88406439 │ 16 │ {building=yes, aer… │ POLYGON ((36.9238579 -1.331… │\n", + "│ 17770290 │ 2022-11-27 17:57:39 │ way/1117632750 │ 1 │ {building=yes} │ POLYGON ((36.6824404 -1.442… │\n", + "│ 3733993 │ 2023-04-11 09:02:45 │ way/1161291128 │ 1 │ {building=yes} │ POLYGON ((36.6824528 -1.438… │\n", + "└──────────┴─────────────────────┴────────────────┴─────────────┴──────────────────────┴───────────────────────────────┘" ] }, - "execution_count": 23, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -381,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 14, "id": "d070a68f-1615-4e5f-94ea-3cd837f2be4b", "metadata": {}, "outputs": [ @@ -392,11 +385,11 @@ "│ count_star() │\n", "│ int64 │\n", "├──────────────┤\n", - "│ 0 │\n", + "│ 527170 │\n", "└──────────────┘" ] }, - "execution_count": 26, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -419,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 16, "id": "3648c939-7813-4be3-b1d0-b51d3fbad4de", "metadata": {}, "outputs": [ @@ -427,7 +420,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "processing took 0.109 sec.\n" + "processing took 16.175 sec.\n" ] } ], @@ -436,12 +429,7 @@ "\n", "start_time = time.time()\n", "query = f\"\"\"\n", - " SELECT osm_data.*\n", - " FROM\n", - " osm_data,\n", - " st_read('{area_of_interest_file}') as aoi\n", - " WHERE 1=1\n", - " and ST_Intersects(st_GeomFromText(osm_data.geometry), aoi.geom)\n", + " SELECT * FROM osm_data\n", "\"\"\"\n", "df = con.sql(query).df()\n", "\n", @@ -461,7 +449,7 @@ "id": "50bf5649-9176-4e7f-83ac-752fc9e6faae", "metadata": {}, "source": [ - "# Work with the data in QGIS\n", + "## Work with the data in QGIS\n", "Add your geopackage file in QGIS, e.g. via drag-and-drop or through file manager." ] }, diff --git a/book/01b_Data_Extraction_DuckDB_only.ipynb b/book/01b_Data_Extraction_DuckDB_only.ipynb index 8fbe783..cfa3d8f 100644 --- a/book/01b_Data_Extraction_DuckDB_only.ipynb +++ b/book/01b_Data_Extraction_DuckDB_only.ipynb @@ -22,7 +22,7 @@ "id": "b6ec70ad-bce1-4052-b151-23fe47fad942", "metadata": {}, "source": [ - "# Getting started\n", + "## Getting started\n", "Set connection params." ] }, @@ -116,7 +116,7 @@ "id": "bed363ef-ee28-411e-9d56-501c1005beac", "metadata": {}, "source": [ - "# Download with DuckDB\n", + "## Download with DuckDB\n", "In this step we can already filter all OSM contributions by four major factors. We will perform more detailed filtering (e.g. for OSM tags values) later:\n", "* **status** (e.g. latest, historic or deleted OSM features)\n", "* **location** (using the bounding box coordinates of each OSM feature)\n", @@ -257,7 +257,7 @@ "id": "73b8b5e7-41b7-4c3f-a901-3c5403dc4150", "metadata": {}, "source": [ - "# Save data as GeoPackage" + "## Save data as GeoPackage" ] }, { @@ -436,7 +436,7 @@ "id": "50bf5649-9176-4e7f-83ac-752fc9e6faae", "metadata": {}, "source": [ - "# Work with the data in QGIS\n", + "## Work with the data in QGIS\n", "Add your geopackage file in QGIS, e.g. via drag-and-drop or through file manager." ] }, diff --git a/book/02a_buildings_currentness_DuckDB_PyIceberg.ipynb b/book/02a_buildings_currentness_DuckDB_PyIceberg.ipynb index c245042..adc95c5 100644 --- a/book/02a_buildings_currentness_DuckDB_PyIceberg.ipynb +++ b/book/02a_buildings_currentness_DuckDB_PyIceberg.ipynb @@ -5,7 +5,7 @@ "id": "376bf8342197f6a6", "metadata": {}, "source": [ - "# DuckDB + PyIceberg: Currentness of Buildings\n", + "# Currentness of Buildings\n", "In this notebook we demonstrate how to analyze and visualize the up-to-date-ness or currentness of the latest OSM data.\n", "\n", "These are the steps you see further down:\n", @@ -22,7 +22,7 @@ "id": "23f48837-22c6-4c12-ab34-a99881cd844b", "metadata": {}, "source": [ - "# Getting started\n", + "## Getting started\n", "Set connection params." ] }, @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "id": "f79d24f5f976b9e3", "metadata": { "ExecuteTime": { @@ -135,7 +135,6 @@ "\n", "selected_region = 'heidelberg'\n", "xmin, ymin, xmax, ymax = bboxes[selected_region]\n", - "area_of_interest_file =f\"../data/{selected_region}.geojson\"\n", "\n", "# Define geometry type filter\n", "geometry_type = 'Polygon'" @@ -157,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 7, "id": "30a0e2f1-4efc-46b4-a0c8-89ced449a456", "metadata": {}, "outputs": [ @@ -165,7 +164,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "download took 30.733 sec.\n" + "download took 5.492 sec.\n" ] } ], @@ -177,18 +176,15 @@ " row_filter=(\n", " f\"status = '{status}' \"\n", " f\"and geometry_type = '{geometry_type}' \"\n", - " # ToDO: add bbox query here once available in iceberg table\n", - " #f\"and (bbox.xmax >= {xmin} and bbox.xmin <= {xmax}) \"\n", - " #f\"and (bbox.ymax >= {ymin} and bbox.ymin <= {ymax}) \"\n", + " f\"and (bbox.xmax >= {xmin} and bbox.xmin <= {xmax}) \"\n", + " f\"and (bbox.ymax >= {ymin} and bbox.ymin <= {ymax}) \"\n", " ),\n", " selected_fields=(\n", " \"valid_from\",\n", " \"tags\",\n", " \"geometry\",\n", " \"bbox\"\n", - " ),\n", - " # ToDO: add bbox query here once available in iceberg table\n", - " limit=1_000_000\n", + " )\n", ").to_duckdb('raw_osm_data',connection=con)\n", "\n", "download_time = round(time.time() - start_time, 3)\n", @@ -207,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 11, "id": "4c0e802d-013b-43ac-87fa-5b22059f93fa", "metadata": {}, "outputs": [ @@ -215,7 +211,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "processing took 0.025 sec.\n" + "processing took 0.229 sec.\n" ] } ], @@ -233,14 +229,9 @@ " a.geometry \n", "FROM\n", " raw_osm_data as a,\n", - " st_read('{area_of_interest_file}') as aoi\n", "WHERE 1=1\n", " and tags['building'][1] is not null\n", " and tags['building'][1] != 'no'\n", - " -- spatial filtering part\n", - " and (a.bbox.xmax >= {xmin} AND a.bbox.xmin <= {xmax})\n", - " and (a.bbox.ymax >= {ymin} AND a.bbox.ymin <= {ymax})\n", - " and ST_Intersects(st_GeomFromText(a.geometry), aoi.geom)\n", ")\n", ";\n", "\"\"\"\n", @@ -255,69 +246,105 @@ "id": "68ed309a-2e60-4ad5-aa00-c2edcd858cf5", "metadata": {}, "source": [ - "\n", "## Plot currentness chart with polars and hvplot" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 12, "id": "07f16b43-3cda-4a76-a99d-1ce96633ca66", "metadata": {}, "outputs": [ { - "ename": "IndexError", - "evalue": "index 0 is out of bounds for axis 0 with size 0", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/IPython/core/formatters.py:977\u001b[0m, in \u001b[0;36mMimeBundleFormatter.__call__\u001b[0;34m(self, obj, include, exclude)\u001b[0m\n\u001b[1;32m 974\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 977\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/dimension.py:1275\u001b[0m, in \u001b[0;36mDimensioned._repr_mimebundle_\u001b[0;34m(self, include, exclude)\u001b[0m\n\u001b[1;32m 1268\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_repr_mimebundle_\u001b[39m(\u001b[38;5;28mself\u001b[39m, include\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, exclude\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 1269\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1270\u001b[0m \u001b[38;5;124;03m Resolves the class hierarchy for the class rendering the\u001b[39;00m\n\u001b[1;32m 1271\u001b[0m \u001b[38;5;124;03m object using any display hooks registered on Store.display\u001b[39;00m\n\u001b[1;32m 1272\u001b[0m \u001b[38;5;124;03m hooks. The output of all registered display_hooks is then\u001b[39;00m\n\u001b[1;32m 1273\u001b[0m \u001b[38;5;124;03m combined and returned.\u001b[39;00m\n\u001b[1;32m 1274\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mStore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrender\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/options.py:1428\u001b[0m, in \u001b[0;36mStore.render\u001b[0;34m(cls, obj)\u001b[0m\n\u001b[1;32m 1426\u001b[0m data, metadata \u001b[38;5;241m=\u001b[39m {}, {}\n\u001b[1;32m 1427\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m hooks:\n\u001b[0;32m-> 1428\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mhook\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1429\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1430\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/ipython/display_hooks.py:287\u001b[0m, in \u001b[0;36mpprint_display\u001b[0;34m(obj)\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m ip\u001b[38;5;241m.\u001b[39mdisplay_formatter\u001b[38;5;241m.\u001b[39mformatters[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mpprint:\n\u001b[1;32m 286\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 287\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdisplay\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mraw_output\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/ipython/display_hooks.py:255\u001b[0m, in \u001b[0;36mdisplay\u001b[0;34m(obj, raw_output, **kwargs)\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(obj, (CompositeOverlay, ViewableElement)):\n\u001b[1;32m 254\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_state(obj):\n\u001b[0;32m--> 255\u001b[0m output \u001b[38;5;241m=\u001b[39m \u001b[43melement_display\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 256\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(obj, (Layout, NdLayout, AdjointLayout)):\n\u001b[1;32m 257\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_state(obj):\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/ipython/display_hooks.py:149\u001b[0m, in \u001b[0;36mdisplay_hook..wrapped\u001b[0;34m(element)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 148\u001b[0m max_frames \u001b[38;5;241m=\u001b[39m OutputSettings\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmax_frames\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m--> 149\u001b[0m mimebundle \u001b[38;5;241m=\u001b[39m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_frames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_frames\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m mimebundle \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {}, {}\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/ipython/display_hooks.py:195\u001b[0m, in \u001b[0;36melement_display\u001b[0;34m(element, max_frames)\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(element) \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m Store\u001b[38;5;241m.\u001b[39mregistry[backend]:\n\u001b[1;32m 193\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 195\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrender\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/ipython/display_hooks.py:76\u001b[0m, in \u001b[0;36mrender\u001b[0;34m(obj, **kwargs)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39mfig \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpdf\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 74\u001b[0m renderer \u001b[38;5;241m=\u001b[39m renderer\u001b[38;5;241m.\u001b[39minstance(fig\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpng\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 76\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcomponents\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/renderer.py:396\u001b[0m, in \u001b[0;36mRenderer.components\u001b[0;34m(self, obj, fmt, comm, **kwargs)\u001b[0m\n\u001b[1;32m 394\u001b[0m embed \u001b[38;5;241m=\u001b[39m (\u001b[38;5;129;01mnot\u001b[39;00m (dynamic \u001b[38;5;129;01mor\u001b[39;00m streams \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwidget_mode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlive\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m config\u001b[38;5;241m.\u001b[39membed)\n\u001b[1;32m 395\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m embed \u001b[38;5;129;01mor\u001b[39;00m config\u001b[38;5;241m.\u001b[39mcomms \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdefault\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m--> 396\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_render_panel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mplot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43membed\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_render_ipywidget(plot)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/renderer.py:403\u001b[0m, in \u001b[0;36mRenderer._render_panel\u001b[0;34m(self, plot, embed, comm)\u001b[0m\n\u001b[1;32m 401\u001b[0m doc \u001b[38;5;241m=\u001b[39m Document()\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config\u001b[38;5;241m.\u001b[39mset(embed\u001b[38;5;241m=\u001b[39membed):\n\u001b[0;32m--> 403\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mplot\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlayout\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_render_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m embed:\n\u001b[1;32m 405\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m render_model(model, comm)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/viewable.py:737\u001b[0m, in \u001b[0;36mViewable._render_model\u001b[0;34m(self, doc, comm)\u001b[0m\n\u001b[1;32m 735\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m comm \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 736\u001b[0m comm \u001b[38;5;241m=\u001b[39m state\u001b[38;5;241m.\u001b[39m_comm_manager\u001b[38;5;241m.\u001b[39mget_server_comm()\n\u001b[0;32m--> 737\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_root\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 739\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_design \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_design\u001b[38;5;241m.\u001b[39mtheme\u001b[38;5;241m.\u001b[39mbokeh_theme:\n\u001b[1;32m 740\u001b[0m doc\u001b[38;5;241m.\u001b[39mtheme \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_design\u001b[38;5;241m.\u001b[39mtheme\u001b[38;5;241m.\u001b[39mbokeh_theme\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/layout/base.py:318\u001b[0m, in \u001b[0;36mPanel.get_root\u001b[0;34m(self, doc, comm, preprocess)\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_root\u001b[39m(\n\u001b[1;32m 315\u001b[0m \u001b[38;5;28mself\u001b[39m, doc: Optional[Document] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m, comm: Optional[Comm] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 316\u001b[0m preprocess: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 317\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Model:\n\u001b[0;32m--> 318\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_root\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreprocess\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 319\u001b[0m \u001b[38;5;66;03m# ALERT: Find a better way to handle this\u001b[39;00m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(root, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstyles\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124moverflow-x\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m root\u001b[38;5;241m.\u001b[39mstyles:\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/viewable.py:668\u001b[0m, in \u001b[0;36mRenderable.get_root\u001b[0;34m(self, doc, comm, preprocess)\u001b[0m\n\u001b[1;32m 666\u001b[0m wrapper \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_design\u001b[38;5;241m.\u001b[39m_wrapper(\u001b[38;5;28mself\u001b[39m)\n\u001b[1;32m 667\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wrapper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m--> 668\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m preprocess:\n\u001b[1;32m 670\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_preprocess(root)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/layout/base.py:184\u001b[0m, in \u001b[0;36mPanel._get_model\u001b[0;34m(self, doc, root, parent, comm)\u001b[0m\n\u001b[1;32m 182\u001b[0m root \u001b[38;5;241m=\u001b[39m root \u001b[38;5;129;01mor\u001b[39;00m model\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_models[root\u001b[38;5;241m.\u001b[39mref[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mid\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m (model, parent)\n\u001b[0;32m--> 184\u001b[0m objects, _ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_objects\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mroot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 185\u001b[0m props \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_properties(doc)\n\u001b[1;32m 186\u001b[0m props[\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_property_mapping[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mobjects\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m objects\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/layout/base.py:166\u001b[0m, in \u001b[0;36mPanel._get_objects\u001b[0;34m(self, model, old_objects, doc, root, comm)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 165\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 166\u001b[0m child \u001b[38;5;241m=\u001b[39m \u001b[43mpane\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mroot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m RerenderError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m e\u001b[38;5;241m.\u001b[39mlayout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m e\u001b[38;5;241m.\u001b[39mlayout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/pane/holoviews.py:429\u001b[0m, in \u001b[0;36mHoloViews._get_model\u001b[0;34m(self, doc, root, parent, comm)\u001b[0m\n\u001b[1;32m 427\u001b[0m plot \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobject\n\u001b[1;32m 428\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 429\u001b[0m plot \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_render\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mroot\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 431\u001b[0m plot\u001b[38;5;241m.\u001b[39mpane \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\n\u001b[1;32m 432\u001b[0m backend \u001b[38;5;241m=\u001b[39m plot\u001b[38;5;241m.\u001b[39mrenderer\u001b[38;5;241m.\u001b[39mbackend\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/panel/pane/holoviews.py:525\u001b[0m, in \u001b[0;36mHoloViews._render\u001b[0;34m(self, doc, comm, root)\u001b[0m\n\u001b[1;32m 522\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m comm:\n\u001b[1;32m 523\u001b[0m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcomm\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m comm\n\u001b[0;32m--> 525\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_plot\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mobject\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/bokeh/renderer.py:68\u001b[0m, in \u001b[0;36mBokehRenderer.get_plot\u001b[0;34m(self_or_cls, obj, doc, renderer, **kwargs)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;129m@bothmethod\u001b[39m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_plot\u001b[39m(self_or_cls, obj, doc\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, renderer\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;124;03m Given a HoloViews Viewable return a corresponding plot instance.\u001b[39;00m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m Allows supplying a document attach the plot to, useful when\u001b[39;00m\n\u001b[1;32m 66\u001b[0m \u001b[38;5;124;03m combining the bokeh model with another plot.\u001b[39;00m\n\u001b[1;32m 67\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 68\u001b[0m plot \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_plot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdoc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m plot\u001b[38;5;241m.\u001b[39mdocument \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m plot\u001b[38;5;241m.\u001b[39mdocument \u001b[38;5;241m=\u001b[39m Document() \u001b[38;5;28;01mif\u001b[39;00m self_or_cls\u001b[38;5;241m.\u001b[39mnotebook_context \u001b[38;5;28;01melse\u001b[39;00m curdoc()\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/renderer.py:239\u001b[0m, in \u001b[0;36mRenderer.get_plot\u001b[0;34m(self_or_cls, obj, doc, renderer, comm, **kwargs)\u001b[0m\n\u001b[1;32m 236\u001b[0m defaults \u001b[38;5;241m=\u001b[39m [kd\u001b[38;5;241m.\u001b[39mdefault \u001b[38;5;28;01mfor\u001b[39;00m kd \u001b[38;5;129;01min\u001b[39;00m plot\u001b[38;5;241m.\u001b[39mdimensions]\n\u001b[1;32m 237\u001b[0m init_key \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(v \u001b[38;5;28;01mif\u001b[39;00m d \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m d \u001b[38;5;28;01mfor\u001b[39;00m v, d \u001b[38;5;129;01min\u001b[39;00m\n\u001b[1;32m 238\u001b[0m \u001b[38;5;28mzip\u001b[39m(plot\u001b[38;5;241m.\u001b[39mkeys[\u001b[38;5;241m0\u001b[39m], defaults))\n\u001b[0;32m--> 239\u001b[0m \u001b[43mplot\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[43minit_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 240\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 241\u001b[0m plot \u001b[38;5;241m=\u001b[39m obj\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/plot.py:956\u001b[0m, in \u001b[0;36mDimensionedPlot.update\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 954\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mupdate\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[1;32m 955\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;241m0\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkeys[\u001b[38;5;241m0\u001b[39m]) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdrawn:\n\u001b[0;32m--> 956\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize_plot\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 957\u001b[0m item \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__getitem__\u001b[39m(key)\n\u001b[1;32m 958\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraverse(\u001b[38;5;28;01mlambda\u001b[39;00m x: \u001b[38;5;28msetattr\u001b[39m(x, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_updated\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mTrue\u001b[39;00m))\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/bokeh/element.py:2130\u001b[0m, in \u001b[0;36mElementPlot.initialize_plot\u001b[0;34m(self, ranges, plot, plots, source)\u001b[0m\n\u001b[1;32m 2128\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mautorange:\n\u001b[1;32m 2129\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_setup_autorange()\n\u001b[0;32m-> 2130\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_init_glyphs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mplot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43melement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mranges\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msource\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2131\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moverlaid:\n\u001b[1;32m 2132\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_plot(key, plot, style_element)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/bokeh/element.py:2030\u001b[0m, in \u001b[0;36mElementPlot._init_glyphs\u001b[0;34m(self, plot, element, ranges, source)\u001b[0m\n\u001b[1;32m 2028\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2029\u001b[0m style \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstyle[\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcyclic_index]\n\u001b[0;32m-> 2030\u001b[0m data, mapping, style \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mranges\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstyle\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2031\u001b[0m current_id \u001b[38;5;241m=\u001b[39m element\u001b[38;5;241m.\u001b[39m_plot_id\n\u001b[1;32m 2033\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m abbreviated_exception():\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/plotting/bokeh/chart.py:370\u001b[0m, in \u001b[0;36mCurvePlot.get_data\u001b[0;34m(self, element, ranges, style)\u001b[0m\n\u001b[1;32m 367\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {}, \u001b[38;5;28mdict\u001b[39m(x\u001b[38;5;241m=\u001b[39mx, y\u001b[38;5;241m=\u001b[39my), style\n\u001b[1;32m 369\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msteps\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minterpolation:\n\u001b[0;32m--> 370\u001b[0m element \u001b[38;5;241m=\u001b[39m \u001b[43minterpolate_curve\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterpolation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minterpolation\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 371\u001b[0m data \u001b[38;5;241m=\u001b[39m {x: element\u001b[38;5;241m.\u001b[39mdimension_values(xidx),\n\u001b[1;32m 372\u001b[0m y: element\u001b[38;5;241m.\u001b[39mdimension_values(yidx)}\n\u001b[1;32m 373\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_hover_data(data, element)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/param/parameterized.py:4468\u001b[0m, in \u001b[0;36mParameterizedFunction.__new__\u001b[0;34m(class_, *args, **params)\u001b[0m\n\u001b[1;32m 4466\u001b[0m inst \u001b[38;5;241m=\u001b[39m class_\u001b[38;5;241m.\u001b[39minstance()\n\u001b[1;32m 4467\u001b[0m inst\u001b[38;5;241m.\u001b[39mparam\u001b[38;5;241m.\u001b[39m_set_name(class_\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m)\n\u001b[0;32m-> 4468\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43minst\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/operation.py:220\u001b[0m, in \u001b[0;36mOperation.__call__\u001b[0;34m(self, element, **kwargs)\u001b[0m\n\u001b[1;32m 218\u001b[0m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlink_dataset\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_propagate_dataset\n\u001b[1;32m 219\u001b[0m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlink_inputs\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mp\u001b[38;5;241m.\u001b[39mlink_inputs\n\u001b[0;32m--> 220\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43melement\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/accessors.py:43\u001b[0m, in \u001b[0;36mAccessorPipelineMeta.pipelined..pipelined_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 40\u001b[0m inst\u001b[38;5;241m.\u001b[39m_obj\u001b[38;5;241m.\u001b[39m_in_method \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 43\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m in_method:\n\u001b[1;32m 46\u001b[0m init_op \u001b[38;5;241m=\u001b[39m factory\u001b[38;5;241m.\u001b[39minstance(\n\u001b[1;32m 47\u001b[0m output_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mtype\u001b[39m(inst),\n\u001b[1;32m 48\u001b[0m kwargs\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mgetattr\u001b[39m(inst, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmode\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)},\n\u001b[1;32m 49\u001b[0m )\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/accessors.py:203\u001b[0m, in \u001b[0;36mApply.__call__\u001b[0;34m(self, apply_function, streams, link_inputs, link_dataset, dynamic, per_element, **kwargs)\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(apply_function, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdynamic\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m 202\u001b[0m inner_kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdynamic\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 203\u001b[0m new_obj \u001b[38;5;241m=\u001b[39m \u001b[43mapply_function\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43minner_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 204\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (link_dataset \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_obj, Dataset) \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[1;32m 205\u001b[0m \u001b[38;5;28misinstance\u001b[39m(new_obj, Dataset) \u001b[38;5;129;01mand\u001b[39;00m new_obj\u001b[38;5;241m.\u001b[39m_dataset \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 206\u001b[0m new_obj\u001b[38;5;241m.\u001b[39m_dataset \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_obj\u001b[38;5;241m.\u001b[39mdataset\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/operation.py:214\u001b[0m, in \u001b[0;36mOperation.__call__\u001b[0;34m(self, element, **kwargs)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m element\u001b[38;5;241m.\u001b[39mclone([(k, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_apply(el, key\u001b[38;5;241m=\u001b[39mk))\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m k, el \u001b[38;5;129;01min\u001b[39;00m element\u001b[38;5;241m.\u001b[39mitems()])\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m ((\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_per_element \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(element, Element)) \u001b[38;5;129;01mor\u001b[39;00m\n\u001b[1;32m 213\u001b[0m (\u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_per_element \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(element, ViewableElement))):\n\u001b[0;32m--> 214\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_apply\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstreams\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m kwargs:\n\u001b[1;32m 216\u001b[0m kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstreams\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mp\u001b[38;5;241m.\u001b[39mstreams\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/operation.py:141\u001b[0m, in \u001b[0;36mOperation._apply\u001b[0;34m(self, element, key)\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m in_method:\n\u001b[1;32m 140\u001b[0m element\u001b[38;5;241m.\u001b[39m_in_method \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 141\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_process\u001b[49m\u001b[43m(\u001b[49m\u001b[43melement\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(element, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_in_method\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m in_method:\n\u001b[1;32m 143\u001b[0m element\u001b[38;5;241m.\u001b[39m_in_method \u001b[38;5;241m=\u001b[39m in_method\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/operation/element.py:1099\u001b[0m, in \u001b[0;36minterpolate_curve._process\u001b[0;34m(self, element, key)\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_process\u001b[39m(\u001b[38;5;28mself\u001b[39m, element, key\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m-> 1099\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43melement\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_process_layer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mElement\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/data/__init__.py:196\u001b[0m, in \u001b[0;36mPipelineMeta.pipelined..pipelined_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 193\u001b[0m inst\u001b[38;5;241m.\u001b[39m_in_method \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 196\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mmethod_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m PipelineMeta\u001b[38;5;241m.\u001b[39mdisable:\n\u001b[1;32m 198\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/data/__init__.py:1213\u001b[0m, in \u001b[0;36mDataset.map\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1211\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(LabelledData\u001b[38;5;241m.\u001b[39mmap)\n\u001b[1;32m 1212\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmap\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m-> 1213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/core/dimension.py:695\u001b[0m, in \u001b[0;36mLabelledData.map\u001b[0;34m(self, map_fn, specs, clone)\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m deep_mapped\n\u001b[1;32m 694\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 695\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmap_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mif\u001b[39;00m applies \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/operation/element.py:1093\u001b[0m, in \u001b[0;36minterpolate_curve._process_layer\u001b[0;34m(self, element, key)\u001b[0m\n\u001b[1;32m 1091\u001b[0m x \u001b[38;5;241m=\u001b[39m x\u001b[38;5;241m.\u001b[39mastype(dt_type)\n\u001b[1;32m 1092\u001b[0m dvals \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(element\u001b[38;5;241m.\u001b[39mdimension_values(d) \u001b[38;5;28;01mfor\u001b[39;00m d \u001b[38;5;129;01min\u001b[39;00m element\u001b[38;5;241m.\u001b[39mdimensions()[\u001b[38;5;241m1\u001b[39m:])\n\u001b[0;32m-> 1093\u001b[0m xs, dvals \u001b[38;5;241m=\u001b[39m \u001b[43mINTERPOLATE_FUNCS\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minterpolation\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdvals\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1094\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_datetime:\n\u001b[1;32m 1095\u001b[0m xs \u001b[38;5;241m=\u001b[39m xs\u001b[38;5;241m.\u001b[39mastype(dt_type)\n", - "File \u001b[0;32m~/GIT_REPOS/sotm-2024-ohsome-data-insights-workshop/venv/lib/python3.12/site-packages/holoviews/operation/element.py:1055\u001b[0m, in \u001b[0;36minterpolate_curve.pts_to_midstep\u001b[0;34m(cls, x, values)\u001b[0m\n\u001b[1;32m 1052\u001b[0m value_steps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(np\u001b[38;5;241m.\u001b[39mempty(\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;28mlen\u001b[39m(x), dtype\u001b[38;5;241m=\u001b[39mv\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m values)\n\u001b[1;32m 1054\u001b[0m steps[\u001b[38;5;241m1\u001b[39m:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m:\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m=\u001b[39m steps[\u001b[38;5;241m2\u001b[39m::\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m=\u001b[39m x[:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m+\u001b[39m (x[\u001b[38;5;241m1\u001b[39m:] \u001b[38;5;241m-\u001b[39m x[:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m])\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m\n\u001b[0;32m-> 1055\u001b[0m steps[\u001b[38;5;241m0\u001b[39m], steps[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43mx\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m, x[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 1057\u001b[0m val_arrays \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 1058\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m v, s \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(values, value_steps):\n", - "\u001b[0;31mIndexError\u001b[0m: index 0 is out of bounds for axis 0 with size 0" - ] + "data": {}, + "metadata": {}, + "output_type": "display_data" }, { "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], "text/plain": [ ":Curve [month] (n_edits)" ] }, - "execution_count": 26, - "metadata": {}, + "execution_count": 12, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1079" + } + }, "output_type": "execute_result" } ], @@ -351,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "id": "9550233a-592f-4d4c-9d97-f334bdd503d2", "metadata": {}, "outputs": [], @@ -384,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "6d5bf28a-a70c-4cc6-8633-8dad9d36a744", "metadata": {}, "outputs": [], @@ -429,17 +456,17 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "id": "95b75d40-3a35-40a3-b215-6e673892af7e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -480,14 +507,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "d79e15a5-d969-4fb6-a548-06d147334c1b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8d0780a21a21470c936398b675e95a4f", + "model_id": "9b46fb7f5bc342cb895be8b4b243badd", "version_major": 2, "version_minor": 1 }, @@ -501,7 +528,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "79f266344362405381e8e725a9db5a1a", + "model_id": "bcd2f0f5aa3449adb6fa6bd29f88d691", "version_major": 2, "version_minor": 0 }, diff --git a/book/02b_buildings_currentness_DuckDB_only.ipynb b/book/02b_buildings_currentness_DuckDB_only.ipynb index 86466fc..a1547c2 100644 --- a/book/02b_buildings_currentness_DuckDB_only.ipynb +++ b/book/02b_buildings_currentness_DuckDB_only.ipynb @@ -22,13 +22,13 @@ "id": "23f48837-22c6-4c12-ab34-a99881cd844b", "metadata": {}, "source": [ - "# Getting started\n", + "## Getting started\n", "Set connection params." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "id": "331fd063-1ce7-46c9-96ea-e2984cf5459b", "metadata": {}, "outputs": [], @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "id": "96acb582-a7e9-440d-914d-969fcf25a5c1", "metadata": {}, "outputs": [], @@ -76,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "d668f6b2-5d83-43d0-8f36-93f676385216", "metadata": {}, "outputs": [ @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "id": "f79d24f5f976b9e3", "metadata": { "ExecuteTime": { @@ -163,14 +163,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "4c0e802d-013b-43ac-87fa-5b22059f93fa", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "57657fe12bc14467a4e33c59bf132156", + "model_id": "8b0b959e81be4f5ca563cb9343d048ef", "version_major": 2, "version_minor": 0 }, @@ -185,7 +185,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "download took 6.076 sec.\n" + "download took 7.882 sec.\n" ] } ], @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "07f16b43-3cda-4a76-a99d-1ce96633ca66", "metadata": {}, "outputs": [ @@ -757,11 +757,11 @@ "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", - "
\n", + "
\n", "
\n", "" + ] + }, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "p1002" + } + }, + "output_type": "display_data" + }, { "data": {}, "metadata": {}, @@ -312,12 +984,12 @@ "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ - "
\n", - "
\n", + "
\n", + "
\n", "
\n", "