{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyse der heissesten und kältesten Messstationen"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dieses Notebook kann lokal oder **direkt im Browser** auf [](https://mybinder.org/v2/gh/meteotest/urban-heat-API-docs/data-analysis?labpath=python_data_analysis_hottest_coldest_locations.ipynb) oder [](https://colab.research.google.com/github/meteotest/urban-heat-API-docs/blob/data-analysis/python_data_analysis_hottest_coldest_locations.ipynb) ausgeführt werden."
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-04T14:26:00.401223Z",
"start_time": "2024-07-04T14:25:57.249309Z"
}
},
"outputs": [],
"source": [
"import requests \n",
"import pandas as pd\n",
"import geopandas as gpd \n",
"import matplotlib.pyplot as plt # for plotting\n",
"import folium\n",
"import branca\n",
"import math"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Berechnungen heisseste und kälteste Messstation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Auswahl an Zeitraum (z.B. eine Hitzewelle, ein Monat, oder der ganze Sommer)\n",
"# Daten (UTC) als String in folgendem Format: \"YYYY-MM-DDThh:mm:ssZ\"\n",
"time_from = \"2024-10-01T00:00:00Z\"\n",
"time_to = \"2024-10-11T23:59:59Z\"\n",
"\n",
"# Auswahl an Stationen\n",
"# Wenn alle Stationen berücksichtigt werden sollen, dann einfach die Liste leer lassen\n",
"# Hier ist eine Liste aller Stationen mit Name und ID: https://smart-urban-heat-map.ch/api/v2/latest\n",
"# station_ids = [\"11001\", \"11002\"] # Beispiel für nur eine Auswahl von zwei Stationen\n",
"station_ids = [] # Beispiel für alle Stationen"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2024-07-04T14:26:00.409675Z",
"start_time": "2024-07-04T14:26:00.402497Z"
}
},
"outputs": [],
"source": [
"def get_stations() -> gpd.GeoDataFrame:\n",
" response = requests.get(\n",
" url=f\"https://smart-urban-heat-map.ch/api/v2/latest\"\n",
" )\n",
" stations = gpd.read_file(response.text)\n",
"\n",
" return stations\n",
"\n",
"def get_station_analysis_mean_temp(time_from: str, time_to: str, station_ids: [str]) -> pd.DataFrame:\n",
" stations = get_stations()\n",
" if station_ids:\n",
" stations = stations[stations[\"stationId\"].isin(station_ids)]\n",
" \n",
" time_from_dt = pd.to_datetime(time_from)\n",
" time_to_dt = pd.to_datetime(time_to)\n",
" time_difference = time_to_dt - time_from_dt\n",
" min_expected_values = round(time_difference.days * 24 * 2) # minimum two values per hour\n",
" \n",
" stations[\"mean_temperature\"] = None\n",
" stations[\"max_temperature\"] = None\n",
" stations[\"date_of_max_temperature\"] = None\n",
" stations[\"min_temperature\"] = None\n",
" stations[\"date_of_min_temperature\"] = None\n",
"\n",
" \n",
" for idx, station in stations.iterrows():\n",
" station_id = station.stationId\n",
" response = requests.get(url=f\"https://smart-urban-heat-map.ch/api/v2/timeseries?stationId={station_id}&timeFrom={time_from}&timeTo={time_to}\")\n",
" \n",
" payload = response.json()\n",
" if payload[\"values\"] is None or not len(payload[\"values\"]): \n",
" stations = stations.drop(idx)\n",
" continue\n",
" \n",
" if len(payload[\"values\"]) < min_expected_values:\n",
" stations = stations.drop(idx)\n",
" continue\n",
" \n",
" df = pd.DataFrame(payload[\"values\"])\n",
"\n",
" df[\"dateObserved\"] = pd.to_datetime(df[\"dateObserved\"])\n",
" df[\"dateObserved\"] = df[\"dateObserved\"].dt.tz_convert(\"Europe/Zurich\")\n",
" \n",
" # hier wird der mittelwert berechnet\n",
" mean_temperature = mean_temperatures(df)\n",
" \n",
" # hier werden die min und max temperaturen berechnet\n",
" # und das jeweilige datum herausgeschrieben\n",
" min_temperature = min_temperatures(df)[0]\n",
" date_of_min_temperature = min_temperatures(df)[1]\n",
" max_temperature = max_temperatures(df)[0]\n",
" date_of_max_temperature = max_temperatures(df)[1]\n",
"\n",
" # hier wird der mittelwert dem 'stations' dataframe hinzugefügt\n",
" stations.at[idx, \"mean_temperature\"] = mean_temperature\n",
" \n",
" # hier werden der min und max temperatur sowie deren messdatum dem 'stations' dataframe hinzugefügt\n",
" stations.at[idx, \"min_temperature\"] = min_temperature\n",
" stations.at[idx, \"date_of_min_temperature\"] = date_of_min_temperature\n",
" stations.at[idx, \"max_temperature\"] = max_temperature\n",
" stations.at[idx, \"date_of_max_temperature\"] = date_of_max_temperature\n",
"\n",
" return stations\n",
"\n",
" \n",
"def mean_temperatures(df: pd.DataFrame) -> float:\n",
" mean_temp = df.mean()[\"temperature\"]\n",
" return mean_temp\n",
"\n",
"def min_temperatures(df: pd.DataFrame) -> tuple[float,str]:\n",
" min_temp = df.min()[\"temperature\"]\n",
" dateof_min_temp = df.loc[df['temperature'].idxmin()]['dateObserved']\n",
" return min_temp, dateof_min_temp\n",
"\n",
"def max_temperatures(df: pd.DataFrame) -> tuple[float,str]:\n",
" max_temp = df.max()[\"temperature\"]\n",
" dateof_max_temp = df.loc[df['temperature'].idxmax()]['dateObserved']\n",
" return max_temp, dateof_max_temp"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" stationId | \n",
" geometry | \n",
" mean_temperature | \n",
" max_temperature | \n",
" date_of_max_temperature | \n",
" min_temperature | \n",
" date_of_min_temperature | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Ausserholligen 2, ewb | \n",
" 11001 | \n",
" POINT (7.40642 46.94542) | \n",
" 23.117102 | \n",
" 33.069733 | \n",
" 2024-08-11 16:27:12+02:00 | \n",
" 16.003662 | \n",
" 2024-08-09 05:57:11+02:00 | \n",
"
\n",
" \n",
" | 1 | \n",
" Bundesplatz | \n",
" 11002 | \n",
" POINT (7.44353 46.94692) | \n",
" 23.867881 | \n",
" 32.96292 | \n",
" 2024-08-11 16:09:44+02:00 | \n",
" 16.791409 | \n",
" 2024-08-09 06:49:41+02:00 | \n",
"
\n",
" \n",
" | 2 | \n",
" Breitenrain, Waffenweg | \n",
" 11003 | \n",
" POINT (7.45192 46.96173) | \n",
" 23.429834 | \n",
" 33.21126 | \n",
" 2024-08-11 17:23:41+02:00 | \n",
" 16.324102 | \n",
" 2024-08-09 06:23:40+02:00 | \n",
"
\n",
" \n",
" | 3 | \n",
" Schosshaldenfriedhof 2 | \n",
" 11004 | \n",
" POINT (7.47186 46.95339) | \n",
" 22.075432 | \n",
" 31.966888 | \n",
" 2024-08-11 16:25:48+02:00 | \n",
" 14.804685 | \n",
" 2024-08-09 06:25:46+02:00 | \n",
"
\n",
" \n",
" | 4 | \n",
" Monbijou-Park | \n",
" 11005 | \n",
" POINT (7.43462 46.94187) | \n",
" 22.962302 | \n",
" 31.67048 | \n",
" 2024-08-11 17:31:49+02:00 | \n",
" 16.006332 | \n",
" 2024-08-09 06:11:46+02:00 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 134 | \n",
" Monopoliplatz Lyss | \n",
" 12006 | \n",
" POINT (7.30588 47.07661) | \n",
" 24.016614 | \n",
" 34.450294 | \n",
" 2024-08-11 17:29:36+02:00 | \n",
" 16.193256 | \n",
" 2024-08-06 06:19:34+02:00 | \n",
"
\n",
" \n",
" | 135 | \n",
" Spielplatz Stiglimatt | \n",
" 12007 | \n",
" POINT (7.2992 47.07154) | \n",
" 23.146633 | \n",
" 33.4329 | \n",
" 2024-08-11 17:14:31+02:00 | \n",
" 15.349432 | \n",
" 2024-08-06 06:14:27+02:00 | \n",
"
\n",
" \n",
" | 136 | \n",
" Sportanlage Grien | \n",
" 12008 | \n",
" POINT (7.29574 47.07508) | \n",
" 23.142006 | \n",
" 33.37415 | \n",
" 2024-08-11 18:35:40+02:00 | \n",
" 14.970245 | \n",
" 2024-08-09 06:25:38+02:00 | \n",
"
\n",
" \n",
" | 138 | \n",
" Reitplatz Grünau | \n",
" 12010 | \n",
" POINT (7.30167 47.07714) | \n",
" 23.309495 | \n",
" 33.742657 | \n",
" 2024-08-11 16:38:38+02:00 | \n",
" 14.553674 | \n",
" 2024-08-06 06:38:35+02:00 | \n",
"
\n",
" \n",
" | 139 | \n",
" Sigriswil | \n",
" 13001 | \n",
" POINT (7.71244 46.71345) | \n",
" 22.144175 | \n",
" 33.128483 | \n",
" 2024-08-11 17:41:43+02:00 | \n",
" 15.947585 | \n",
" 2024-08-05 06:41:37+02:00 | \n",
"
\n",
" \n",
"
\n",
"
118 rows × 8 columns
\n",
"
"
],
"text/plain": [
" name stationId geometry \\\n",
"0 Ausserholligen 2, ewb 11001 POINT (7.40642 46.94542) \n",
"1 Bundesplatz 11002 POINT (7.44353 46.94692) \n",
"2 Breitenrain, Waffenweg 11003 POINT (7.45192 46.96173) \n",
"3 Schosshaldenfriedhof 2 11004 POINT (7.47186 46.95339) \n",
"4 Monbijou-Park 11005 POINT (7.43462 46.94187) \n",
".. ... ... ... \n",
"134 Monopoliplatz Lyss 12006 POINT (7.30588 47.07661) \n",
"135 Spielplatz Stiglimatt 12007 POINT (7.2992 47.07154) \n",
"136 Sportanlage Grien 12008 POINT (7.29574 47.07508) \n",
"138 Reitplatz Grünau 12010 POINT (7.30167 47.07714) \n",
"139 Sigriswil 13001 POINT (7.71244 46.71345) \n",
"\n",
" mean_temperature max_temperature date_of_max_temperature \\\n",
"0 23.117102 33.069733 2024-08-11 16:27:12+02:00 \n",
"1 23.867881 32.96292 2024-08-11 16:09:44+02:00 \n",
"2 23.429834 33.21126 2024-08-11 17:23:41+02:00 \n",
"3 22.075432 31.966888 2024-08-11 16:25:48+02:00 \n",
"4 22.962302 31.67048 2024-08-11 17:31:49+02:00 \n",
".. ... ... ... \n",
"134 24.016614 34.450294 2024-08-11 17:29:36+02:00 \n",
"135 23.146633 33.4329 2024-08-11 17:14:31+02:00 \n",
"136 23.142006 33.37415 2024-08-11 18:35:40+02:00 \n",
"138 23.309495 33.742657 2024-08-11 16:38:38+02:00 \n",
"139 22.144175 33.128483 2024-08-11 17:41:43+02:00 \n",
"\n",
" min_temperature date_of_min_temperature \n",
"0 16.003662 2024-08-09 05:57:11+02:00 \n",
"1 16.791409 2024-08-09 06:49:41+02:00 \n",
"2 16.324102 2024-08-09 06:23:40+02:00 \n",
"3 14.804685 2024-08-09 06:25:46+02:00 \n",
"4 16.006332 2024-08-09 06:11:46+02:00 \n",
".. ... ... \n",
"134 16.193256 2024-08-06 06:19:34+02:00 \n",
"135 15.349432 2024-08-06 06:14:27+02:00 \n",
"136 14.970245 2024-08-09 06:25:38+02:00 \n",
"138 14.553674 2024-08-06 06:38:35+02:00 \n",
"139 15.947585 2024-08-05 06:41:37+02:00 \n",
"\n",
"[118 rows x 8 columns]"
]
},
"execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Analyse der Temperatur laufen lassen\n",
"# Dies kann einige Sekunden / Minuten dauern, je nach ausgewähltem Zeitintervall\n",
"station_analysis = get_station_analysis_mean_temp(time_from, time_to, station_ids)"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" stationId | \n",
" geometry | \n",
" mean_temperature | \n",
" max_temperature | \n",
" date_of_max_temperature | \n",
" min_temperature | \n",
" date_of_min_temperature | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Ausserholligen 2, ewb | \n",
" 11001 | \n",
" POINT (7.40642 46.94542) | \n",
" 23.117102 | \n",
" 33.069733 | \n",
" 2024-08-11 16:27:12+02:00 | \n",
" 16.003662 | \n",
" 2024-08-09 05:57:11+02:00 | \n",
"
\n",
" \n",
" | 1 | \n",
" Bundesplatz | \n",
" 11002 | \n",
" POINT (7.44353 46.94692) | \n",
" 23.867881 | \n",
" 32.96292 | \n",
" 2024-08-11 16:09:44+02:00 | \n",
" 16.791409 | \n",
" 2024-08-09 06:49:41+02:00 | \n",
"
\n",
" \n",
" | 2 | \n",
" Breitenrain, Waffenweg | \n",
" 11003 | \n",
" POINT (7.45192 46.96173) | \n",
" 23.429834 | \n",
" 33.21126 | \n",
" 2024-08-11 17:23:41+02:00 | \n",
" 16.324102 | \n",
" 2024-08-09 06:23:40+02:00 | \n",
"
\n",
" \n",
" | 3 | \n",
" Schosshaldenfriedhof 2 | \n",
" 11004 | \n",
" POINT (7.47186 46.95339) | \n",
" 22.075432 | \n",
" 31.966888 | \n",
" 2024-08-11 16:25:48+02:00 | \n",
" 14.804685 | \n",
" 2024-08-09 06:25:46+02:00 | \n",
"
\n",
" \n",
" | 4 | \n",
" Monbijou-Park | \n",
" 11005 | \n",
" POINT (7.43462 46.94187) | \n",
" 22.962302 | \n",
" 31.67048 | \n",
" 2024-08-11 17:31:49+02:00 | \n",
" 16.006332 | \n",
" 2024-08-09 06:11:46+02:00 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 134 | \n",
" Monopoliplatz Lyss | \n",
" 12006 | \n",
" POINT (7.30588 47.07661) | \n",
" 24.016614 | \n",
" 34.450294 | \n",
" 2024-08-11 17:29:36+02:00 | \n",
" 16.193256 | \n",
" 2024-08-06 06:19:34+02:00 | \n",
"
\n",
" \n",
" | 135 | \n",
" Spielplatz Stiglimatt | \n",
" 12007 | \n",
" POINT (7.2992 47.07154) | \n",
" 23.146633 | \n",
" 33.4329 | \n",
" 2024-08-11 17:14:31+02:00 | \n",
" 15.349432 | \n",
" 2024-08-06 06:14:27+02:00 | \n",
"
\n",
" \n",
" | 136 | \n",
" Sportanlage Grien | \n",
" 12008 | \n",
" POINT (7.29574 47.07508) | \n",
" 23.142006 | \n",
" 33.37415 | \n",
" 2024-08-11 18:35:40+02:00 | \n",
" 14.970245 | \n",
" 2024-08-09 06:25:38+02:00 | \n",
"
\n",
" \n",
" | 138 | \n",
" Reitplatz Grünau | \n",
" 12010 | \n",
" POINT (7.30167 47.07714) | \n",
" 23.309495 | \n",
" 33.742657 | \n",
" 2024-08-11 16:38:38+02:00 | \n",
" 14.553674 | \n",
" 2024-08-06 06:38:35+02:00 | \n",
"
\n",
" \n",
" | 139 | \n",
" Sigriswil | \n",
" 13001 | \n",
" POINT (7.71244 46.71345) | \n",
" 22.144175 | \n",
" 33.128483 | \n",
" 2024-08-11 17:41:43+02:00 | \n",
" 15.947585 | \n",
" 2024-08-05 06:41:37+02:00 | \n",
"
\n",
" \n",
"
\n",
"
118 rows × 8 columns
\n",
"
"
],
"text/plain": [
" name stationId geometry \\\n",
"0 Ausserholligen 2, ewb 11001 POINT (7.40642 46.94542) \n",
"1 Bundesplatz 11002 POINT (7.44353 46.94692) \n",
"2 Breitenrain, Waffenweg 11003 POINT (7.45192 46.96173) \n",
"3 Schosshaldenfriedhof 2 11004 POINT (7.47186 46.95339) \n",
"4 Monbijou-Park 11005 POINT (7.43462 46.94187) \n",
".. ... ... ... \n",
"134 Monopoliplatz Lyss 12006 POINT (7.30588 47.07661) \n",
"135 Spielplatz Stiglimatt 12007 POINT (7.2992 47.07154) \n",
"136 Sportanlage Grien 12008 POINT (7.29574 47.07508) \n",
"138 Reitplatz Grünau 12010 POINT (7.30167 47.07714) \n",
"139 Sigriswil 13001 POINT (7.71244 46.71345) \n",
"\n",
" mean_temperature max_temperature date_of_max_temperature \\\n",
"0 23.117102 33.069733 2024-08-11 16:27:12+02:00 \n",
"1 23.867881 32.96292 2024-08-11 16:09:44+02:00 \n",
"2 23.429834 33.21126 2024-08-11 17:23:41+02:00 \n",
"3 22.075432 31.966888 2024-08-11 16:25:48+02:00 \n",
"4 22.962302 31.67048 2024-08-11 17:31:49+02:00 \n",
".. ... ... ... \n",
"134 24.016614 34.450294 2024-08-11 17:29:36+02:00 \n",
"135 23.146633 33.4329 2024-08-11 17:14:31+02:00 \n",
"136 23.142006 33.37415 2024-08-11 18:35:40+02:00 \n",
"138 23.309495 33.742657 2024-08-11 16:38:38+02:00 \n",
"139 22.144175 33.128483 2024-08-11 17:41:43+02:00 \n",
"\n",
" min_temperature date_of_min_temperature \n",
"0 16.003662 2024-08-09 05:57:11+02:00 \n",
"1 16.791409 2024-08-09 06:49:41+02:00 \n",
"2 16.324102 2024-08-09 06:23:40+02:00 \n",
"3 14.804685 2024-08-09 06:25:46+02:00 \n",
"4 16.006332 2024-08-09 06:11:46+02:00 \n",
".. ... ... \n",
"134 16.193256 2024-08-06 06:19:34+02:00 \n",
"135 15.349432 2024-08-06 06:14:27+02:00 \n",
"136 14.970245 2024-08-09 06:25:38+02:00 \n",
"138 14.553674 2024-08-06 06:38:35+02:00 \n",
"139 15.947585 2024-08-05 06:41:37+02:00 \n",
"\n",
"[118 rows x 8 columns]"
]
},
"execution_count": 132,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# anzeigen aller stationen\n",
"station_analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Note**: Die Zeitstempel sind bereits von UTC zu UTC+2 (Central European Summer Time) konvertiert. Dies ist durch den Suffix \"+02:00\" nach dem Zeitwert angegeben.
\n",
"
\n",
"Beispiel:
\n",
"Der Zeitstempel *2024-08-02 17:57:10+02:00* bedeutet 17:57:10 in CEST (Schweizer Sommerzeit) und 15:57:10 in UTC time."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Wärmste *n* Standorte herauslesen"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Definition: Standort mit höchster **mittlerer Temperatur** über den oben definierten Zeitraum."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hier muss für *n_warmest* eine Zahl eingegeben werden."
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [],
"source": [
"# n wärmste Stationen auswählen\n",
"n_warmest = 3 # z.B. Wert 3 eingeben, um die wärmsten 3 Stationen anzuzeigen"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" stationId | \n",
" geometry | \n",
" mean_temperature | \n",
" max_temperature | \n",
" date_of_max_temperature | \n",
" min_temperature | \n",
" date_of_min_temperature | \n",
"
\n",
" \n",
" \n",
" \n",
" | 59 | \n",
" Inselspital | \n",
" 11062 | \n",
" POINT (7.42571 46.94719) | \n",
" 24.770183 | \n",
" 34.874874 | \n",
" 2024-08-11 14:00:29+02:00 | \n",
" 17.317465 | \n",
" 2024-08-09 06:20:26+02:00 | \n",
"
\n",
" \n",
" | 33 | \n",
" Laupenstrasse | \n",
" 11036 | \n",
" POINT (7.43639 46.94734) | \n",
" 24.562022 | \n",
" 34.874874 | \n",
" 2024-08-11 17:57:00+02:00 | \n",
" 17.672617 | \n",
" 2024-08-07 10:36:57+02:00 | \n",
"
\n",
" \n",
" | 35 | \n",
" Postgasse | \n",
" 11038 | \n",
" POINT (7.45381 46.94878) | \n",
" 24.392376 | \n",
" 33.945602 | \n",
" 2024-08-11 16:18:31+02:00 | \n",
" 17.726025 | \n",
" 2024-08-09 06:28:27+02:00 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name stationId geometry mean_temperature \\\n",
"59 Inselspital 11062 POINT (7.42571 46.94719) 24.770183 \n",
"33 Laupenstrasse 11036 POINT (7.43639 46.94734) 24.562022 \n",
"35 Postgasse 11038 POINT (7.45381 46.94878) 24.392376 \n",
"\n",
" max_temperature date_of_max_temperature min_temperature \\\n",
"59 34.874874 2024-08-11 14:00:29+02:00 17.317465 \n",
"33 34.874874 2024-08-11 17:57:00+02:00 17.672617 \n",
"35 33.945602 2024-08-11 16:18:31+02:00 17.726025 \n",
"\n",
" date_of_min_temperature \n",
"59 2024-08-09 06:20:26+02:00 \n",
"33 2024-08-07 10:36:57+02:00 \n",
"35 2024-08-09 06:28:27+02:00 "
]
},
"execution_count": 125,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Sortieren um die heissesten Stationen anzuzeigen\n",
"df_warm = station_analysis.sort_values(by='mean_temperature', ascending=False)[:n_warmest]\n",
"df_warm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Kühlste *n* Standorte"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Definition: Standort mit tiefster **mittlerer Temperatur** über den oben definierten Zeitraum."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hier muss für *c_coldest* eine Zahl eingegeben werden."
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"# n kälteste Stationen auswählen\n",
"n_coldest = 3 # z.B. Wert 3 eingeben, um die kältesten 3 Stationen anzuzeigen"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" stationId | \n",
" geometry | \n",
" mean_temperature | \n",
" max_temperature | \n",
" date_of_max_temperature | \n",
" min_temperature | \n",
" date_of_min_temperature | \n",
"
\n",
" \n",
" \n",
" \n",
" | 47 | \n",
" Bremgartenwald | \n",
" 11050 | \n",
" POINT (7.42128 46.96512) | \n",
" 20.431999 | \n",
" 29.563593 | \n",
" 2024-08-11 16:46:06+02:00 | \n",
" 14.465552 | \n",
" 2024-08-09 06:26:05+02:00 | \n",
"
\n",
" \n",
" | 88 | \n",
" Köniz Schliern Laterne | \n",
" 11091 | \n",
" POINT (7.41517 46.90915) | \n",
" 20.45244 | \n",
" 32.69589 | \n",
" 2024-08-11 15:59:28+02:00 | \n",
" 14.804685 | \n",
" 2024-08-05 06:39:24+02:00 | \n",
"
\n",
" \n",
" | 57 | \n",
" Liebefeld Turnierstrasse Laterne | \n",
" 11060 | \n",
" POINT (7.41337 46.93826) | \n",
" 21.056738 | \n",
" 30.436789 | \n",
" 2024-08-11 14:04:57+02:00 | \n",
" 14.569695 | \n",
" 2024-08-09 06:54:55+02:00 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name stationId geometry \\\n",
"47 Bremgartenwald 11050 POINT (7.42128 46.96512) \n",
"88 Köniz Schliern Laterne 11091 POINT (7.41517 46.90915) \n",
"57 Liebefeld Turnierstrasse Laterne 11060 POINT (7.41337 46.93826) \n",
"\n",
" mean_temperature max_temperature date_of_max_temperature \\\n",
"47 20.431999 29.563593 2024-08-11 16:46:06+02:00 \n",
"88 20.45244 32.69589 2024-08-11 15:59:28+02:00 \n",
"57 21.056738 30.436789 2024-08-11 14:04:57+02:00 \n",
"\n",
" min_temperature date_of_min_temperature \n",
"47 14.465552 2024-08-09 06:26:05+02:00 \n",
"88 14.804685 2024-08-05 06:39:24+02:00 \n",
"57 14.569695 2024-08-09 06:54:55+02:00 "
]
},
"execution_count": 127,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Sortieren um die kältesten Stationen anzuzeigen\n",
"df_cold = station_analysis.sort_values(by='mean_temperature', ascending=True)[:n_coldest]\n",
"df_cold"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Karte der mittleren Temperaturen pro Messstation"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# mean_temperature Map\n",
"m = folium.Map(location=[station_analysis.geometry.y.mean(), station_analysis.geometry.x.mean()], zoom_start=13, tiles=\"CartoDB positron\")\n",
"\n",
"# Add a fixed title to the map\n",
"title_html = f'''\n",
" \n",
" Mittlere Temperatur
vom {pd.to_datetime(time_from).strftime('%d.%m.%Y')} bis {pd.to_datetime(time_to).strftime('%d.%m.%Y')}\n",
"
\n",
" '''\n",
"m.get_root().html.add_child(folium.Element(title_html))\n",
"\n",
"colormap = branca.colormap.linear.YlOrRd_09\n",
"mean_temperature = station_analysis.mean_temperature.values\n",
"\n",
"# Define colourmap range depending on values of 'mean_temperature\n",
"vmin = math.floor(mean_temperature.min())\n",
"vmax = math.ceil(mean_temperature.max())\n",
"\n",
"# Define the colormap with the specified range\n",
"colormap = branca.colormap.linear.YlOrRd_09.scale(vmin, vmax)\n",
"\n",
"# Convert to step colormap with a specified number of steps\n",
"n_steps = int((vmax - vmin) / 0.5) # Define the number of steps\n",
"colormap = colormap.to_step(n_steps)\n",
"\n",
"# colormap = colormap.scale(0, mean_temperature).to_step(mean_temperature) \n",
"colormap.caption = \"Mittlere Temperatur\"\n",
"colormap.add_to(m)\n",
"\n",
"# plot each station temperature\n",
"for idx, station in station_analysis.iterrows():\n",
" color = colormap(station.mean_temperature)\n",
" # text with temperature value\n",
" folium.Marker(\n",
" location=(station.geometry.y, station.geometry.x),\n",
" icon=folium.DivIcon(\n",
" html=f'{station.mean_temperature:.1f}°C
'\n",
" ),\n",
" tooltip=f\"{station['name']}: Mittlere Temperatur {station.mean_temperature:.1f} °C\",\n",
" ).add_to(m)\n",
"\n",
"# show map\n",
"m"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (venv)",
"language": "python",
"name": "myenv"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}