Commit 74b4833c authored by Marvin Kastner's avatar Marvin Kastner
Browse files

Add notebooks for zeitbezogene daten

parent a5d873dd
This diff is collapsed.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simple Exponential Smoothing\n",
"\n",
"Zum Glätten von Zeitreihen wird manchmal das Simple Exponential Smoothing genutzt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [],
"source": [
"import random\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zunächst generieren wir uns die Daten, die wir später glätten wollen.\n",
"Dafür wählen wir den sogenannten Random Walk.\n",
"Der Verlauf ist absolut zufällig und wird bei jedem Durchlauf des Notebooks neu generiert.\n",
"Weitere Informationen zum Random Walk sind bspw. auf Wikipedia zu finden."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"random_walk = []\n",
"random_walk.append(-1 if random.random() < 0.5 else 1)\n",
"\n",
"for i in range(1, 1000):\n",
" movement = -1 if random.random() < 0.5 else 1\n",
" value = random_walk[i-1] + movement\n",
" random_walk.append(value)\n",
"\n",
"plt.plot(random_walk)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Der Gegenwartsfaktor $\\alpha$\n",
"\n",
"Der Gegenwartsfaktor wird in der [pandas-Dokumentation](http://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.Series.ewm.html) beschrieben.\n",
"Die Wahl von $\\alpha$ beeinflusst, wie stark die letzte Messung ins Gewicht fällt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"series = pd.Series(random_walk)\n",
"exponential_smoothing_window = series.ewm(alpha=.03)\n",
"exponential_smoothing_window"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mit der Methode `mean` kann nun das aritmetische Mittel berechnet werden."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"smoothed_values = exponential_smoothing_window.mean()\n",
"smoothed_values.plot()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die beiden Kurven können nun auch übereinandergeplottet werden.\n",
"In Blau wird nun der Random Walk gezeichnet, in Rot das aritmetische Mittel der letzten 50 Werte."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"plt.plot(random_walk)\n",
"smoothed_values.plot(color=\"red\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wie man sieht, ist im obigen Beispiel diese Form von Bereinigung nur begrenzt hilfreich.\n",
"Ein deutlich besseres Beispiel sei hier nun gegeben.\n",
"Auf den Random Walk wird noch ein weißes Rauschen aufmodelliert.\n",
"Dies entspricht bspw. denn Messwerten von schlechten Sensoren."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"series = pd.Series(random_walk + np.random.normal(0, 20, 1000))\n",
"exponential_smoothing_window = series.ewm(alpha=.03)\n",
"smoothed_values = exponential_smoothing_window.mean()\n",
"series.plot(color=\"blue\")\n",
"exponential_smoothing_window.plot(color=\"red\")\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.5"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# pandas Zeitstempel\n",
"\n",
"Die Bibliothek `pandas` erlaubt es, komfortabel mit zeitbezogenen Daten zu arbeiten.\n",
"Wir schauen uns zunächst die Zeitstempel an:\n",
"Dies sind genau definierte Zeitpunkte.\n",
"\n",
"Zunächst importieren wir die Bibliothek:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ein naiver Zeitstempel verfügt über ein Datum und eine Uhrzeit.\n",
"Es ist aber nicht bekannt, in welcher Zeitzone dieser Zeitpunkt liegt.\n",
"Somit ist er nicht eindeutig. \n",
"Um 13:26 in China ist in Deutschland früher Morgen."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2018-07-05 13:26:00')"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"2018-07-05 13:26\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Das `Z` steht für \"Zulu\" und bedeutet, dass der Zeitstempel in UTC, der sogenannten Weltzeit, angegeben ist.\n",
"Diese Uhrzeit wird auch manchmal als Greenwich Zeit bezeichnet.\n",
"In Deutschland sind wir ein bis zwei Stunden vor dieser Zeit."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Timestamp('2018-07-05 11:26:00+0000', tz='UTC')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"2018-07-05 11:26Z\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zwei naive Zeitstempel in pandas können miteinander über die Vergleichsoperatoren `==`, `<=`, `>=`, `<`, `>` und `!=` verglichen werden."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"2018-07-05 13:26\") == pd.Timestamp(\"2018-07-05 14:26\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zwei Zeitstempel mit Zeitzone können ebenfalls verglichen werden.\n",
"Hier wird überprüft, ob sich zwei Zeitstempel auf den gleichen Augenblick beziehen,\n",
"unabhängig von der Zeitzone."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Timestamp(\"2018-07-05 13:26-01:00\") == pd.Timestamp(\"2018-07-05 14:26+00:00\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dieser Vergleich schlägt fehl, wenn ein Zeitstempel naiv ist und einer einer Zeitzone zugewiesen ist."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "Cannot compare tz-naive and tz-aware timestamps",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-6-b58b61869f43>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTimestamp\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"2018-07-05 13:26\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTimestamp\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"2018-07-05 11:26Z\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32mpandas\\_libs\\tslibs\\timestamps.pyx\u001b[0m in \u001b[0;36mpandas._libs.tslibs.timestamps._Timestamp.__richcmp__\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32mpandas\\_libs\\tslibs\\timestamps.pyx\u001b[0m in \u001b[0;36mpandas._libs.tslibs.timestamps._Timestamp._assert_tzawareness_compat\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mTypeError\u001b[0m: Cannot compare tz-naive and tz-aware timestamps"
]
}
],
"source": [
"pd.Timestamp(\"2018-07-05 13:26\") == pd.Timestamp(\"2018-07-05 11:26Z\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Manchmal muss man dann einem naiven Zeitstempel noch im Nachhinein eine Zeitzone zuweisen.\n",
"Dies ist insbesondere dann wichtig, wenn verschiedene Datenquellen miteinander verschnitten werden.\n",
"Dann ist es wichtig zu wissen, ob zwei Ereignisse, die aus verschiedenen Quellen stammen, eigentlich zeitgleich stattgefunden haben oder nacheinander.\n",
"Die Zeitzone muss man sich dann manchmal aus dem Kontext bzw. den Meta-Daten erschließen."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t1 = pd.Timestamp(\"2018-07-05 13:26\")\n",
"t2 = t1.tz_localize(\"CET\") # Central European Time\n",
"t2 == pd.Timestamp(\"2018-07-05 11:26Z\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t4 = pd.Timestamp(\"2018-07-05 11:26:01+00:00\")\n",
"t4 > t2"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.5"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment