198 lines
42 KiB
Plaintext
198 lines
42 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "d6fa6fc8",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"import seaborn as sns\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import numpy as np\n",
|
|
"import holidays"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "a2f9a292",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/tmp/ipykernel_17243/1257658190.py:2: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n",
|
|
" df = df.replace([\"na\", \"NA\", \"Na\"], np.nan)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"operator_name 0\n",
|
|
"domain_name 0\n",
|
|
"domain_id 0\n",
|
|
"counter_site 0\n",
|
|
"counter_site_id 0\n",
|
|
"counter_serial 0\n",
|
|
"longitude 0\n",
|
|
"latitude 0\n",
|
|
"timezone 0\n",
|
|
"iso_timestamp 0\n",
|
|
"channels_in 0\n",
|
|
"channels_out 0\n",
|
|
"channels_unknown 698715\n",
|
|
"channels_all 0\n",
|
|
"site_temperature 8846\n",
|
|
"site_rain_accumulation 8846\n",
|
|
"site_snow_accumulation 698715\n",
|
|
"year 0\n",
|
|
"dtype: int64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"df = pd.read_csv(\"../data/processed/hourly_bikes_mannheim.csv\", low_memory=False)\n",
|
|
"df = df.replace([\"na\", \"NA\", \"Na\"], np.nan)\n",
|
|
"\n",
|
|
"print(df.isna().sum())\n",
|
|
"df[\"site_temperature\"] = df[\"site_temperature\"].astype(float)\n",
|
|
"df[\"site_rain_accumulation\"] = df[\"site_rain_accumulation\"].astype(float)\n",
|
|
"df[\"site_snow_accumulation\"] = df[\"site_snow_accumulation\"].astype(float)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "623979f9",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/tmp/ipykernel_17243/678675454.py:17: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
|
|
" agg_df = df_ma.groupby('time_of_day')['channels_all'].sum().reset_index()\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "AttributeError",
|
|
"evalue": "Text.set() got an unexpected keyword argument 'useOffset'",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
|
|
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[83]\u001b[39m\u001b[32m, line 33\u001b[39m\n\u001b[32m 30\u001b[39m ax.set_xticks(np.arange(-\u001b[32m0.5\u001b[39m, n + \u001b[32m0.5\u001b[39m, \u001b[32m1\u001b[39m))\n\u001b[32m 32\u001b[39m \u001b[38;5;66;03m# Tick-Labels: 0..24 (Grenzwerte)\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m33\u001b[39m \u001b[43max\u001b[49m\u001b[43m.\u001b[49m\u001b[43mset_xticklabels\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;28;43mstr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mrange\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mn\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrotation\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43museOffset\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 34\u001b[39m \u001b[38;5;66;03m# Add some labels and title to the plot\u001b[39;00m\n\u001b[32m 35\u001b[39m ax.set_title(\u001b[33m'\u001b[39m\u001b[33mAnzahl Fahrradpassagen nach Stunden über den Beobachtungszeitraum (Mannheim Renzstraße ab 2014)\u001b[39m\u001b[33m'\u001b[39m, fontsize=\u001b[32m16\u001b[39m)\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/WS26/DAT_Projekt/.venv/lib/python3.12/site-packages/matplotlib/axes/_base.py:74\u001b[39m, in \u001b[36m_axis_method_wrapper.__set_name__.<locals>.wrapper\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m 73\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mwrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, *args, **kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m74\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mget_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/WS26/DAT_Projekt/.venv/lib/python3.12/site-packages/matplotlib/axis.py:2141\u001b[39m, in \u001b[36mAxis.set_ticklabels\u001b[39m\u001b[34m(self, labels, minor, fontdict, **kwargs)\u001b[39m\n\u001b[32m 2139\u001b[39m \u001b[38;5;66;03m# deal with label1\u001b[39;00m\n\u001b[32m 2140\u001b[39m tick.label1.set_text(tick_label)\n\u001b[32m-> \u001b[39m\u001b[32m2141\u001b[39m \u001b[43mtick\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlabel1\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_internal_update\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2142\u001b[39m \u001b[38;5;66;03m# deal with label2\u001b[39;00m\n\u001b[32m 2143\u001b[39m tick.label2.set_text(tick_label)\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/WS26/DAT_Projekt/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1233\u001b[39m, in \u001b[36mArtist._internal_update\u001b[39m\u001b[34m(self, kwargs)\u001b[39m\n\u001b[32m 1226\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_internal_update\u001b[39m(\u001b[38;5;28mself\u001b[39m, kwargs):\n\u001b[32m 1227\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 1228\u001b[39m \u001b[33;03m Update artist properties without prenormalizing them, but generating\u001b[39;00m\n\u001b[32m 1229\u001b[39m \u001b[33;03m errors as if calling `set`.\u001b[39;00m\n\u001b[32m 1230\u001b[39m \n\u001b[32m 1231\u001b[39m \u001b[33;03m The lack of prenormalization is to maintain backcompatibility.\u001b[39;00m\n\u001b[32m 1232\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1233\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_update_props\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1234\u001b[39m \u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{cls.__name__}\u001b[39;49;00m\u001b[33;43m.set() got an unexpected keyword argument \u001b[39;49m\u001b[33;43m\"\u001b[39;49m\n\u001b[32m 1235\u001b[39m \u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{prop_name!r}\u001b[39;49;00m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/Desktop/WS26/DAT_Projekt/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1206\u001b[39m, in \u001b[36mArtist._update_props\u001b[39m\u001b[34m(self, props, errfmt)\u001b[39m\n\u001b[32m 1204\u001b[39m func = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mset_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mk\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 1205\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(func):\n\u001b[32m-> \u001b[39m\u001b[32m1206\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\n\u001b[32m 1207\u001b[39m errfmt.format(\u001b[38;5;28mcls\u001b[39m=\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m), prop_name=k),\n\u001b[32m 1208\u001b[39m name=k)\n\u001b[32m 1209\u001b[39m ret.append(func(v))\n\u001b[32m 1210\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ret:\n",
|
|
"\u001b[31mAttributeError\u001b[39m: Text.set() got an unexpected keyword argument 'useOffset'"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABl4AAANQCAYAAABJhRLAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVwhJREFUeJzs3XmYlXX9+P/XsMywowiyyeqGC1ughLtJLPFFTUsyEsTl8zMhQQqNTHEpcUWsSMJUpDKXPmJugYiClRg5QGohipKYbCoCAgY0c35/9HW+TSKMw3vmZpjH47rOdTH3uc+Z1/121JvznPucvFwulwsAAAAAAAB2W42sBwAAAAAAANhbCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJCC8AAAAAAACJVOvw8txzz8WgQYOiVatWkZeXF4888shnfo5cLhe33HJLHHLIIVFQUBCtW7eOH/7wh+mHBQAAAAAA9ni1sh4gS5s3b46uXbvGeeedF2eccUa5nmPUqFHx1FNPxS233BKdO3eOdevWxbp16xJPCgAAAAAAVAV5uVwul/UQe4K8vLyYMWNGnH766SXbtm7dGldccUX8+te/jvXr18eRRx4ZN954Y5x00kkREbFkyZLo0qVLvPLKK3HooYdmMzgAAAAAALDHqNZvNbYrI0eOjPnz58f9998fL730Unz1q1+N/v37x+uvvx4REY899lh07NgxHn/88ejQoUO0b98+LrjgAle8AAAAAABANSW8fIoVK1bEPffcEw899FAcf/zxceCBB8Z3vvOdOO644+Kee+6JiIg333wz3nrrrXjooYdi+vTpMW3atCgsLIyvfOUrGU8PAAAAAABkoVp/xsvOvPzyy1FUVBSHHHJIqe1bt26N/fbbLyIiiouLY+vWrTF9+vSS/e66667o0aNHLF261NuPAQAAAABANSO8fIpNmzZFzZo1o7CwMGrWrFnqvgYNGkRERMuWLaNWrVql4sxhhx0WEf++YkZ4AQAAAACA6kV4+RTdu3ePoqKiWLt2bRx//PE73OfYY4+Nf/3rX/HGG2/EgQceGBERr732WkREtGvXrtJmBQAAAAAA9gx5uVwul/UQWdm0aVMsW7YsIv4dWiZOnBgnn3xyNGnSJNq2bRvf+MY34o9//GPceuut0b1793j33Xdjzpw50aVLlxg4cGAUFxfHUUcdFQ0aNIhJkyZFcXFxjBgxIho1ahRPPfVUxkcHAAAAAABUtmodXubOnRsnn3zyJ7YPGzYspk2bFtu3b48f/OAHMX369HjnnXeiadOm8fnPfz6uueaa6Ny5c0RErFy5Mr71rW/FU089FfXr148BAwbErbfeGk2aNKnswwEAAAAAADJWrcMLAAAAAABASjWyHgAAAAAAAGBvIbwAAAAAAAAkUivrASpbcXFxrFy5Mho2bBh5eXlZjwMAAAAAAGQol8vFhx9+GK1atYoaNXb/epVqF15WrlwZbdq0yXoMAAAAAABgD/L222/HAQccsNvPU+3CS8OGDSPi3wvYqFGjjKcBAAAAAACytHHjxmjTpk1JP9hd1S68fPz2Yo0aNRJeAAAAAACAiIhkH0+y+29WBgAAAAAAQEQILwAAAAAAAMkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAIkILwAAAAAAAInUynoAAAAAYM/UY+z0rEdIpvDmoVmPAABUE654AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASER4AQAAAAAASCTT8PLcc8/FoEGDolWrVpGXlxePPPLITvd/+OGH44tf/GI0a9YsGjVqFL17945Zs2ZVzrAAAAAAAAC7kGl42bx5c3Tt2jUmT55cpv2fe+65+OIXvxhPPvlkFBYW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OnXqZ36+yZMnR/v27aNOnTrRq1evWLBgwU73X79+fYwYMSJatmwZBQUFccghh8STTz5ZnkMBAAAAAABIplzhZd99940PP/wwIiJat24dr7zySkT8O4hs2bLlMz3XAw88EGPGjInx48fHwoULo2vXrtGvX79Yu3btDvfftm1bfPGLX4y///3v8Zvf/CaWLl0ad955Z7Ru3bo8hwIAAAAAAJBMrfI86IQTTojZs2dH586d46tf/WqMGjUqnnnmmZg9e3accsopn+m5Jk6cGBdeeGEMHz48IiKmTJkSTzzxRNx9993x3e9+9xP733333bFu3bp4/vnno3bt2hER0b59+/IcBgAAAAAAQFLluuLlJz/5SXzta1+LiIgrrrgixowZE2vWrIkzzzwz7rrrrjI/z7Zt26KwsDD69Onz/waqUSP69OkT8+fP3+FjHn300ejdu3eMGDEimjdvHkceeWRcf/31UVRUtMP9t27dGhs3bix1AwAAAAAAqAjluuKlSZMmJX+uUaPGDq9MKYv33nsvioqKonnz5qW2N2/ePF599dUdPubNN9+MZ555JoYMGRJPPvlkLFu2LC6++OLYvn17jB8//hP7T5gwIa655ppyzQcAAAAAAPBZlCu8REQUFxfHsmXLYu3atVFcXFzqvhNOOGG3B9vZ991///1j6tSpUbNmzejRo0e88847cfPNN+8wvIwbNy7GjBlT8vXGjRujTZs2FTYfAAAAAABQfZUrvLzwwgvx9a9/Pd56663I5XKl7svLy/vUt/36b02bNo2aNWvGmjVrSm1fs2ZNtGjRYoePadmyZdSuXTtq1qxZsu2www6L1atXx7Zt2yI/P7/U/gUFBVFQUFCmeQAAAAAAAHZHuT7j5aKLLoqePXvGK6+8EuvWrYsPPvig5LZu3boyP09+fn706NEj5syZU7KtuLg45syZE717997hY4499thYtmxZqatsXnvttWjZsuUnogsAAAAAAEBlKld4ef311+P666+Pww47LPbZZ59o3LhxqdtnMWbMmLjzzjvj3nvvjSVLlsQ3v/nN2Lx5cwwfPjwiIoYOHRrjxo0r2f+b3/xmrFu3LkaNGhWvvfZaPPHEE3H99dfHiBEjynMoAAAAAAAAyZTrrcZ69eoVy5Yti4MOOmi3Bxg8eHC8++67cdVVV8Xq1aujW7duMXPmzGjevHlERKxY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PffcaNWqVdSrVy/69++/V50TleV1oX/+858xYsSI2G+//aJBgwZx5plnxpo1azKaOL2yrMHUqVPjpJNOikaNGkVeXl6sX78+m2EryK7WYN26dfGtb30rDj300Khbt260bds2LrnkktiwYUOGU6dTlp+B/+//+//iwAMPjLp160azZs3itNNOi1dffTWjidP7LK8R53K5GDBgQLleS69W4eWBBx6IMWPGxPjx42PhwoXRtWvX6NevX6xduzbr0SrF5s2bo2vXrjF58uSsR8nEvHnzYsSIEfHCCy/E7NmzY/v27dG3b9/YvHlz1qNVmgMOOCBuuOGGKCwsjBdffDG+8IUvxGmnnRZ//etfsx6t0v35z3+On/3sZ9GlS5esR6l0RxxxRKxatark9oc//CHrkSrNBx98EMcee2zUrl07fve738Xf/va3uPXWW2PffffNerRK8+c//7nUP//Zs2dHRMRXv/rVjCerPDfeeGPccccd8ZOf/CSWLFkSN954Y9x0003x4x//OOvRKs0FF1wQs2fPjl/84hfx8ssvR9++faNPnz7xzjvvZD1ahdjVOdBNN90UP/rRj2LKlCnxpz/9KerXrx/9+vWLf/7zn5U8acXZ1Rps3rw5jjvuuLjxxhsrebLKsbPj37JlSyxcuDCuvPLKWLhwYTz88MOxdOnSOPXUUzOYtOLs6mfgkEMOiZ/85Cfx8ssvxx/+8Ido37599O3bN959991KnrRilPXvQjNmzIgXXnghWrVqVUmTVZ6yrEH//v1LnSf8+te/rsQJK9aujv+NN96I4447Ljp16hRz586Nl156Ka688sqoU6dOJU9acXa1Bv/5z37VqlVx9913R15eXpx55pmVPGnF2dUajBkzJmbOnBm//OUvY8mSJTF69OgYOXJkPProo5U8acXY2fHncrk4/fTT480334zf/va3sWjRomjXrl306dNnr3ndpCyvC1166aXx2GOPxUMPPRTz5s2LlStXxhlnnJHh1GmVZQ22bNkS/fv3j+9973sZTlpxdrUGK1eujJUrV8Ytt9wSr7zySkybNi1mzpwZ559/fsaTp1GWn4EePXrEPffcE0uWLIlZs2ZFLpeLvn37RlFRUYaTp/NZXiOeNGlS5OXlle8b5aqRo48+OjdixIiSr4uKinKtWrXKTZgwIcOpshERuRkzZmQ9RqbWrl2bi4jcvHnzsh4lU/vuu2/u5z//edZjVKoPP/wwd/DBB+dmz56dO/HEE3OjRo3KeqRKM378+FzXrl2zHiMzl19+ee64447Leow9yqhRo3IHHnhgrri4OOtRKs3AgQNz5513XqltZ5xxRm7IkCEZTVS5tmzZkqtZs2bu8ccfL7X9c5/7XO6KK67IaKrK89/nQMXFxbkWLVrkbr755pJt69evzxUUFOR+/etfZzBhxdvZeeDy5ctzEZFbtGhRpc5UmcpyHrxgwYJcROTeeuutyhmqkpVlDTZs2JCLiNzTTz9dOUNVok87/n/84x+51q1b51555ZVcu3btcrfddlulz1ZZdrQGw4YNy5122mmZzFPZdnT8gwcPzn3jG9/IZqAMlOW/A6eddlruC1/4QuUMlIEdrcERRxyRu/baa0tt21vPkf77+JcuXZqLiNwrr7xSsq2oqCjXrFmz3J133pnBhBXvv18XWr9+fa527dq5hx56qGSfJUuW5CIiN3/+/KzGrFA7e23s2WefzUVE7oMPPqj8wSpRWV4ffPDBB3P5+fm57du3V+JklaMsx/+Xv/wlFxG5ZcuWVeJklefT1mDRokW51q1b51atWlWu19KrzRUv27Zti8LCwujTp0/Jtho1akSfPn1i/vz5GU5GVj6+RLBJkyYZT5KNoqKiuP/++2Pz5s3Ru3fvrMepVCNGjIiBAweW+u9BdfL6669Hq1atomPHjjFkyJC96u0TduXRRx+Nnj17xle/+tXYf//9o3v37nHnnXdmPVZmtm3bFr/85S/jvPPOK/9vcFRBxxxzTMyZMydee+21iIj4y1/+En/4wx9iwIABGU9WOf71r39FUVHRJ36Dt27dutXqCriPLV++PFavXl3q/wmNGzeOXr16OUesxjZs2BB5eXmxzz77ZD1KJrZt2xZTp06Nxo0bR9euXbMep1IUFxfHOeecE2PHjo0jjjgi63EyM3fu3Nh///3j0EMPjW9+85vx/vvvZz1SpSguLo4nnngiDjnkkOjXr1/sv//+0atXr2r39tz/ac2aNfHEE0/sNb/hXVbHHHNMPProo/HOO+9ELpeLZ599Nl577bXo27dv1qNVuK1bt0ZElDpHrFGjRhQUFOy154j//bpQYWFhbN++vdR5YadOnaJt27Z77XlhdX9tLKJsa7Bhw4Zo1KhR1KpVq7LGqjS7Ov7NmzfHPffcEx06dIg2bdpU5miVZkdrsGXLlvj6178ekydPjhYtWpTreatNeHnvvfeiqKgomjdvXmp78+bNY/Xq1RlNRVaKi4tj9OjRceyxx8aRRx6Z9TiV6uWXX44GDRpEQUFBXHTRRTFjxow4/PDDsx6r0tx///2xcOHCmDBhQtajZKJXr14ll8necccdsXz58jj++OPjww8/zHq0SvHmm2/GHXfcEQcffHDMmjUrvvnNb8Yll1wS9957b9ajZeKRRx6J9evXx7nnnpv1KJXqu9/9bnzta1+LTp06Re3ataN79+4xevToGDJkSNajVYqGDRtG796947rrrouVK1dGUVFR/PKXv4z58+fHqlWrsh6v0n18HugckY/985//jMsvvzzOPvvsaNSoUdbjVKrHH388GjRoEHXq1InbbrstZs+eHU2bNs16rEpx4403Rq1ateKSSy7JepTM9O/fP6ZPnx5z5syJG2+8MebNmxcDBgzYa95WZGfWrl0bmzZtihtuuCH69+8fTz31VHz5y1+OM844I+bNm5f1eJm49957o2HDhnvVWyyVxY9//OM4/PDD44ADDoj8/Pzo379/TJ48OU444YSsR6twHweGcePGxQcffBDbtm2LG2+8Mf7xj3/sleeIO3pdaPXq1ZGfn/+JX7zYW88Lq/NrYx8ryxq89957cd1118X//M//VPJ0FW9nx//Tn/40GjRoEA0aNIjf/e53MXv27MjPz89o0orzaWtw6aWXxjHHHBOnnXZauZ9778t0UAYjRoyIV155Za/9rY2dOfTQQ2Px4sWxYcOG+M1vfhPDhg2LefPmVYv48vbbb8eoUaNi9uzZe9V7NX8W//kb/V26dIlevXpFu3bt4sEHH6wWv81WXFwcPXv2jOuvvz4iIrp37x6vvPJKTJkyJYYNG5bxdJXvrrvuigEDBuyV72O/Mw8++GD86le/ivvuuy+OOOKIWLx4cYwePTpatWpVbX4OfvGLX8R5550XrVu3jpo1a8bnPve5OPvss6OwsDDr0SBT27dvj7POOityuVzccccdWY9T6U4++eRYvHhxvPfee3HnnXfGWWedFX/6059i//33z3q0ClVYWBi33357LFy4sFpdAfrfvva1r5X8uXPnztGlS5c48MADY+7cuXHKKadkOFnFKy4ujoiI0047LS699NKIiOjWrVs8//zzMWXKlDjxxBOzHC8Td999dwwZMqTa/b3pxz/+cbzwwgvx6KOPRrt27eK5556LESNGRKtWrfb6d0yoXbt2PPzww3H++edHkyZNombNmtGnT58YMGBA5HK5rMdLrjq/LvQxa7DrNdi4cWMMHDgwDj/88Lj66qsrd7hKsLPjHzJkSHzxi1+MVatWxS233BJnnXVW/PGPf9zr/r+wozV49NFH45lnnolFixbt1nNXmytemjZtGjVr1ow1a9aU2r5mzZpyXy5E1TRy5Mh4/PHH49lnn40DDjgg63EqXX5+fhx00EHRo0ePmDBhQnTt2jVuv/32rMeqFIWFhbF27dr43Oc+F7Vq1YpatWrFvHnz4kc/+lHUqlWrWvw233/bZ5994pBDDolly5ZlPUqlaNmy5Sci42GHHVat3m7tY2+99VY8/fTTccEFF2Q9SqUbO3ZsyVUvnTt3jnPOOScuvfTSanUl3IEHHhjz5s2LTZs2xdtvvx0LFiyI7du3R8eOHbMerdJ9fB7oHJGPo8tbb70Vs2fPrnZXu0RE1K9fPw466KD4/Oc/H3fddVfUqlUr7rrrrqzHqnC///3vY+3atdG2bduSc8S33norvv3tb0f79u2zHi8zHTt2jKZNm1aL88SmTZtGrVq1nCf+X7///e9j6dKl1e488aOPPorvfe97MXHixBg0aFB06dIlRo4cGYMHD45bbrkl6/EqRY8ePWLx4sWxfv36WLVqVcycOTPef//9ve4c8dNeF2rRokVs27Yt1q9fX2r/vfG8sLq/Nhax6zX48MMPo3///tGwYcOYMWNG1K5dO4MpK86ujr9x48Zx8MEHxwknnBC/+c1v4tVXX40ZM2ZkMGnF+bQ1eOaZZ+KNN96IffbZp+TcMCLizDPPjJNOOqnMz19twkt+fn706NEj5syZU7KtuLg45syZU+0+36K6yuVyMXLkyJgxY0Y888wz0aFDh6xH2iMUFxeXvJfr3u6UU06Jl19+ORYvXlxy69mzZwwZMiQWL14cNWvWzHrESrdp06Z44403omXLllmPUimOPfbYWLp0aaltr732WrRr1y6jibJzzz33xP777x8DBw7MepRKt2XLlqhRo/QpUM2aNUt+27U6qV+/frRs2TI++OCDmDVr1m5dRl1VdejQIVq0aFHqHHHjxo3xpz/9yTliNfJxdHn99dfj6aefjv322y/rkfYI1eU88ZxzzomXXnqp1Dliq1atYuzYsTFr1qysx8vMP/7xj3j//ferxXlifn5+HHXUUc4T/6+77rorevToUW0+4+lj27dvj+3btztPjH+/4NqsWbN4/fXX48UXX9xrzhF39bpQjx49onbt2qXOC5cuXRorVqzYa84LvTZWtjXYuHFj9O3bN/Lz8+PRRx/dq67yKM/PQC6Xi1wut9ecF+5qDb773e9+4twwIuK2226Le+65p8zfp1q91diYMWNi2LBh0bNnzzj66KNj0qRJsXnz5hg+fHjWo1WKTZs2lfptpeXLl8fixYujSZMm0bZt2wwnqxwjRoyI++67L377299Gw4YNS96fs3HjxlG3bt2Mp6sc48aNiwEDBkTbtm3jww8/jPvuuy/mzp1bbf5C2bBhw0+8Z2X9+vVjv/32qzbvZ/qd73wnBg0aFO3atYuVK1fG+PHjo2bNmnH22WdnPVql+Pg9Oq+//vo466yzYsGCBTF16tSYOnVq1qNVquLi4rjnnnti2LBhe+WHA+7KoEGD4oc//GG0bds2jjjiiFi0aFFMnDgxzjvvvKxHqzSzZs2KXC4Xhx56aCxbtizGjh0bnTp12mvPiXZ1DjR69Oj4wQ9+EAcffHB06NAhrrzyymjVqlWcfvrp2Q2d2K7WYN26dbFixYpYuXJlRETJi48tWrTYK37Dc2fH37Jly/jKV74SCxcujMcffzyKiopKzhObNGmy17yX9c7WYL/99osf/vCHceqpp0bLli3jvffei8mTJ8c777wTX/3qVzOcOp1d/Tvw37Gtdu3a0aJFizj00EMre9QKs7M1aNKkSVxzzTVx5plnRosWLeKNN96Iyy67LA466KDo169fhlOns6ufgbFjx8bgwYPjhBNOiJNPPjlmzpwZjz32WMydOze7oRMry2sCGzdujIceeihuvfXWrMasULtagxNPPDHGjh0bdevWjXbt2sW8efNi+vTpMXHixAynTmdXx//QQw9Fs2bNom3btvHyyy/HqFGj4vTTT4++fftmOHU6u3pdqHHjxnH++efHmDFjokmTJtGoUaP41re+Fb17947Pf/7zGU+fRlleG1u9enWsXr265Gfl5ZdfjoYNG0bbtm13+gH0VcWu1uDj6LJly5b45S9/GRs3boyNGzdGRESzZs2q/C/t7ur433zzzXjggQeib9++0axZs/jHP/4RN9xwQ9StWze+9KUvZTx9Grtag0/7O1Dbtm0/W6zMVTM//vGPc23bts3l5+fnjj766NwLL7yQ9UiV5tlnn81FxCduw4YNy3q0SrGjY4+I3D333JP1aJXmvPPOy7Vr1y6Xn5+fa9asWe6UU07JPfXUU1mPlakTTzwxN2rUqKzHqDSDBw/OtWzZMpefn59r3bp1bvDgwblly5ZlPValeuyxx3JHHnlkrqCgINepU6fc1KlTsx6p0s2aNSsXEbmlS5dmPUomNm7cmBs1alSubdu2uTp16uQ6duyYu+KKK3Jbt27NerRK88ADD+Q6duyYy8/Pz7Vo0SI3YsSI3Pr167Meq8Ls6hyouLg4d+WVV+aaN2+eKygoyJ1yyil73b8fu1qDe+65Z4f3jx8/PtO5U9nZ8S9fvvxTzxOfffbZrEdPZmdr8NFHH+W+/OUv51q1apXLz8/PtWzZMnfqqafmFixYkPXYyXzWvwu1a9cud9ttt1XqjBVtZ2uwZcuWXN++fXPNmjXL1a5dO9euXbvchRdemFu9enXWYydTlp+Bu+66K3fQQQfl6tSpk+vatWvukUceyW7gClCWNfjZz36Wq1u37l57XrCrNVi1alXu3HPPzbVq1SpXp06d3KGHHpq79dZbc8XFxdkOnsiujv/222/PHXDAAbnatWvn2rZtm/v+97+/V50jl+V1oY8++ih38cUX5/bdd99cvXr1cl/+8pdzq1atym7oxMqyBuPHj9+rXz/b1Rp82r8nEZFbvnx5prOnsKvjf+edd3IDBgzI7b///rnatWvnDjjggNzXv/713Kuvvprt4AmV5zXiiMjNmDHjM32fvP/7QAAAAAAAAHZTtfmMFwAAAAAAgIomvAAAAAAAACQivAAAAAAAACQivAAAAAAAACQivAAAAAAAACQivAAAAAAAACQivAAAAAAAACQivAAAAAAAACQivAAAAJVi7ty5kZeXF+vXr896lJ3asmVLnHnmmdGoUaNyz9u+ffuYNGlS8tkAAIA9n/ACAABUiJNOOilGjx5d8vUxxxwTq1atisaNG2c3VBnce++98fvf/z6ef/75KjEvAACwZ6mV9QAAAED1kJ+fHy1atMh6jF1644034rDDDosjjzwy61EAAIAqyBUvAABAcueee27Mmzcvbr/99sjLy4u8vLyYNm1aqbfumjZtWuyzzz7x+OOPx6GHHhr16tWLr3zlK7Fly5a49957o3379rHvvvvGJZdcEkVFRSXPvXXr1vjOd74TrVu3jvr160evXr1i7ty5ZZ7tf//3f+OII46IgoKCaN++fdx6660l95100klx6623xnPPPRd5eXlx0kkn7fL51q5dG4MGDYq6detGhw4d4le/+tUn9pk4cWJ07tw56tevH23atImLL744Nm3aFBERmzdvjkaNGsVvfvObUo955JFHon79+vHhhx+W+dgAAIDsueIFAABI7vbbb4/XXnstjjzyyLj22msjIuKvf/3rJ/bbsmVL/OhHP4r7778/PvzwwzjjjDPiy1/+cuyzzz7x5JNPxptvvhlnnnlmHHvssTF48OCIiBg5cmT87W9/i/vvvz9atWoVM2bMiP79+8fLL78cBx988E7nKiwsjLPOOiuuvvrqGDx4cDz//PNx8cUXx3777RfnnntuPPzww/Hd7343XnnllXj44YcjPz9/l8d67rnnxsqVK+PZZ5+N2rVrxyWXXBJr164ttU+NGjXiRz/6UXTo0CHefPPNuPjii+Oyyy6Ln/70p1G/fv342te+Fvfcc0985StfKXnMx183bNhwlzMAAAB7jrxcLpfLeggAAGDvc9JJJ0W3bt1KPmR+7ty5cfLJJ8cHH3wQ++yzT0ybNi2GDx8ey5YtiwMPPDAiIi666KL4xS9+EWvWrIkGDRpERET//v2jffv2MWXKlFixYkV07NgxVqxYEa1atSr5Xn369Imjjz46rr/++p3ONGTIkHj33XfjqaeeKtl22WWXxRNPPFEShkaPHh2LFy8u01U0r732Whx66KGxYMGCOOqooyIi4tVXX43DDjssbrvttlKfcfOffvOb38RFF10U7733XkRELFiwII455ph4++23o2XLlrF27dpo3bp1PP3003HiiSfucg4AAGDP4a3GAACAzNSrV68kukRENG/ePNq3b18SXT7e9vEVJC+//HIUFRXFIYccEg0aNCi5zZs3L954441dfr8lS5bEscceW2rbscceG6+//nqptzMrqyVLlkStWrWiR48eJds6deoU++yzT6n9nn766TjllFOidevW0bBhwzjnnHPi/fffjy1btkRExNFHHx1HHHFE3HvvvRER8ctf/jLatWsXJ5xwwmeeCQAA/v927h+k6jWMA/j3cK5C4tKBQiLC4XC0EKKmtrZIaAhXw9IkaQwNamlI1Aps6A+0SUgQDW2NTeVgclahhrJAhWhoiIT+6J2uXNFuVzvdc2/384F3+L3v73149i/vQ30ZNQYAANRNQ0PDmu9CobDh3vLycpLkw4cPKRaLqVarKRaLa/77c1jzbzI3N5djx47l7NmzGRkZSalUytOnT3P69Ol8+vQpTU1NSZL+/v7cvn07Fy5cyMTERHp7e1MoFOrcPQAAsFlevAAAAD9FY2Pjll6R/JUDBw7k69evefv2bcrl8prV0tLy3ft79+7N1NTUmr2pqalUKpV1Qc7f0d7eni9fvqRara7uPX/+PO/fv1/9rlarWV5ezvj4eA4dOpRKpZKFhYV1tU6cOJHXr1/nxo0bmZ2dzcmTJzfdDwAAUH+CFwAA4KdobW3N9PR05ubm8u7du9VXKz+iUqmku7s7PT09efjwYV69epVnz55lbGwsjx49+u79wcHBPH78OMPDw3nx4kXu3r2bW7duZWhoaEv9tLW15ejRoxkYGMj09HSq1Wr6+/uzbdu21X/K5XI+f/6cmzdv5uXLl5mcnMydO3fW1dq+fXu6urpy/vz5HDlyJLt3795STwAAQH0JXgAAgJ9iaGgoxWIx+/bty44dO/LmzZua1J2YmEhPT08GBwfT1taW48ePZ2ZmJnv27Pnu3YMHD+bBgwe5f/9+Ojo6cunSpVy+fDmnTp36oX527dqVw4cPp6urK2fOnMnOnTtXz/fv35/r16/n6tWr6ejoyL179zI2NrZhrT/Gj/X19W25HwAAoL4KKysrK/VuAgAAgGRycjLnzp3LwsJCGhsb690OAACwBb/VuwEAAID/u48fP2ZxcTFXrlzJwMCA0AUAAP7DjBoDAAB+GZ2dnWlubt5wjY6ObrrekydPvlmvubm5Zn1fu3Yt7e3taWlpycWLF2tWFwAA+OcZNQYAAPwy5ufns7S0tOFZqVRKqVTaVL2lpaXMz89/87xcLm+qHgAA8OsTvAAAAAAAANSIUWMAAAAAAAA1IngBAAAAAACoEcELAAAAAABAjQheAAAAAAAAakTwAgAAAAAAUCOCFwAAAAAAgBoRvAAAAAAAANTI71aae31mKqaSAAAAAElFTkSuQmCC",
|
|
"text/plain": [
|
|
"<Figure size 2000x1000 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Ensure the 'iso_timestamp' is properly parsed with utc=True\n",
|
|
"df['timestamp'] = pd.to_datetime(df['iso_timestamp'], utc=True) # Convert to datetime with UTC handling\n",
|
|
"\n",
|
|
"# Extract the hour from the timestamp\n",
|
|
"df['hour'] = df['timestamp'].dt.hour\n",
|
|
"\n",
|
|
"bins = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17,18,19,20,21,22,23,24] # These are the edges of your 3-hour bins\n",
|
|
"\n",
|
|
"\n",
|
|
"# Add a new column with the time bin for each row\n",
|
|
"df['time_of_day'] = pd.cut(df['hour'], bins=bins, right=False)\n",
|
|
"\n",
|
|
"# Aggregate the data by time_of_day\n",
|
|
"#agg_df = df.groupby('time_of_day')['channels_all'].sum().reset_index()\n",
|
|
"\n",
|
|
"df_ma = df[df['counter_site'] == \"Renzstraße\"]\n",
|
|
"agg_df = df_ma.groupby('time_of_day')['channels_all'].sum().reset_index()\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create a Seaborn bar plot to visualize the aggregated data\n",
|
|
"plt.figure(figsize=(20, 10))\n",
|
|
"ax = sns.barplot(x='time_of_day', y='channels_all', data=agg_df)\n",
|
|
"\n",
|
|
"\n",
|
|
"n = len(agg_df) # bei dir 24\n",
|
|
"\n",
|
|
"# Ticks auf die Grenzen legen: -0.5, 0.5, 1.5, ..., 23.5\n",
|
|
"ax.set_xlim(-0.5, n - 0.5)\n",
|
|
"ax.set_xticks(np.arange(-0.5, n + 0.5, 1))\n",
|
|
"\n",
|
|
"# Tick-Labels: 0..24 (Grenzwerte)\n",
|
|
"ax.set_xticklabels([str(i) for i in range(n + 1)], rotation=0, useOffset=False)\n",
|
|
"ax.ticklabel_format(axis='y', style='plain', useOffset=False)\n",
|
|
"\n",
|
|
"# Add some labels and title to the plot\n",
|
|
"ax.set_title('Anzahl Fahrradpassagen nach Stunden über den Beobachtungszeitraum (Mannheim Renzstraße ab 2014)', fontsize=16)\n",
|
|
"plt.xlabel('Uhrzeit', fontsize=16)\n",
|
|
"plt.ylabel('Fahrradpassagen', fontsize=16)\n",
|
|
"\n",
|
|
"# Optionally, rotate the x-axis labels for better readability\n",
|
|
"plt.xticks(rotation=0)\n",
|
|
"\n",
|
|
"# Show the plot\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "0364d24a",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "ruby"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"df['hour'] = df['timestamp'].dt.hour\n",
|
|
"df['day_of_week'] = df['timestamp'].dt.dayofweek # 0=Monday, 6=Sunday\n",
|
|
"df['month'] = df['timestamp'].dt.month\n",
|
|
"df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int) # 1 if weekend, 0 if weekday\n",
|
|
"# You can manually add holidays or use a library like `holidays` to check if the day is a public holiday.\n",
|
|
"de_holidays = holidays.Germany(years=2023) # For Germany, for example\n",
|
|
"df['is_holiday'] = df['timestamp'].dt.date.isin(de_holidays.keys()).astype(int)\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "dat_projekt",
|
|
"language": "python",
|
|
"name": "dat_projekt"
|
|
},
|
|
"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.12.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|