Qullen im Anhang hinzugefügt
This commit is contained in:
parent
dc55e9ae90
commit
27182d68db
|
@ -103,10 +103,10 @@
|
|||
" \n",
|
||||
" if len(data_bucket) > 0:\n",
|
||||
" print(\"Vorhandes Bucket löschen\")\n",
|
||||
" buckets_api.delete_bucket(data_bucket[0]) #Jetzt gerade nicht löschen das ist nervig\n",
|
||||
" #buckets_api.delete_bucket(data_bucket[0]) #Jetzt gerade nicht löschen das ist nervig\n",
|
||||
" \n",
|
||||
" retention_rules = BucketRetentionRules(type=\"expire\", every_seconds=86400)\n",
|
||||
" created_bucket = buckets_api.create_bucket(bucket_name=bucket, retention_rules=retention_rules, org=org)\n",
|
||||
" #created_bucket = buckets_api.create_bucket(bucket_name=bucket, retention_rules=retention_rules, org=org)\n",
|
||||
" \n",
|
||||
" print(\"Bucket angelegt\")"
|
||||
]
|
||||
|
@ -131,7 +131,7 @@
|
|||
"text": [
|
||||
"Download\n",
|
||||
"<Response [200]>\n",
|
||||
"<a href=\"10minutenwerte_TU_00071_now.zip\">10minutenwerte_TU_00071_now.zip</a>\n"
|
||||
"<a href=\"10minutenwerte_TU_00073_now.zip\">10minutenwerte_TU_00073_now.zip</a>\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -169,7 +169,7 @@
|
|||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Download 480 von 480\r"
|
||||
"Download 473 von 473\r"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -207,7 +207,7 @@
|
|||
"id": "14b90ff2-1473-4e44-9c6b-fdd2d6c20773",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Zunächst werden die Wetterstationen in die Klasse Station eingelesen. Aus den Klassen wird ein Dictionary erstellt in dem mittels der Stations_id gesucht werden kann. Weil die Stationsdaten nicht als csv gespeichert sind musste ich eine eigene Technik entwickeln um die Daten auszulesen.\n",
|
||||
"Zunächst werden die Wetterstationen in die Klasse Station eingelesen. Aus den Klassen wird ein Dictionary erstellt in dem mittels der Stations_id gesucht werden kann. Weil die Stationsdaten nicht als csv gespeichert sind musste eine eigene Technik entwickeln werden um die Daten auszulesen.\n",
|
||||
"\n",
|
||||
"Als erstes wird so lange gelesen bis kein Leerzeichen mehr erkannt wird. Danach wird gelesen bis wieder ein Leerzeichen erkannt wird. Dadurch können die Felder nacheinander eingelesen werden. "
|
||||
]
|
||||
|
@ -391,7 +391,16 @@
|
|||
"id": "e2112e23-4a2f-40cb-adf6-44e3caa7c6f7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Wetterdaten verarbeiten"
|
||||
"# Wetterdaten verarbeiten\n",
|
||||
"Jetzt wo die Daten importiert worden sind können die Daten Verarbeitet werden. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8461cb29-7634-4b70-9f01-0356b5219046",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Höchst,Tiefst und Durchschnittswert"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -399,7 +408,6 @@
|
|||
"id": "d70b0073-50e1-4042-a8c0-db4848729d4a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Jetzt wo die Daten importiert worden sind können die Daten Verarbeitet werden. \n",
|
||||
"Zur veranschaulichung werden die Tages höchst und Tiefstwerte sowie den Durchschnittswert für die letzen 24 Stunden in Bad Lippspringe ermittelt."
|
||||
]
|
||||
},
|
||||
|
@ -446,8 +454,8 @@
|
|||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"highest = -254\n",
|
||||
"lowest = 254\n",
|
||||
"max = -254\n",
|
||||
"min = 254\n",
|
||||
"\n",
|
||||
"i=0\n",
|
||||
"sum=0"
|
||||
|
@ -463,8 +471,8 @@
|
|||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Der Tageshöchstwert der letzen 24h liegt bei: -254\n",
|
||||
"Der Tagestiefstwert der letzen 24h liegt bei: 254\n"
|
||||
"Der Tageshöchstwert der letzen 24h liegt bei: 18.9\n",
|
||||
"Der Tagestiefstwert der letzen 24h liegt bei: 15.4\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -474,13 +482,13 @@
|
|||
" value = record.get_value()\n",
|
||||
" i = i + 1\n",
|
||||
" sum = sum + value\n",
|
||||
" if value > highest:\n",
|
||||
" highest = value\n",
|
||||
" if value < lowest:\n",
|
||||
" lowest = value \n",
|
||||
" if value > max:\n",
|
||||
" max = value\n",
|
||||
" if value < min:\n",
|
||||
" min = value \n",
|
||||
"\n",
|
||||
"print(\"Der Tageshöchstwert der letzen 24h liegt bei: \"+ str(highest))\n",
|
||||
"print(\"Der Tagestiefstwert der letzen 24h liegt bei: \"+ str(lowest))"
|
||||
"print(\"Der Tageshöchstwert der letzen 24h liegt bei: \"+ str(max))\n",
|
||||
"print(\"Der Tagestiefstwert der letzen 24h liegt bei: \"+ str(min))"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -498,14 +506,10 @@
|
|||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "ZeroDivisionError",
|
||||
"evalue": "division by zero",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
|
||||
"Input \u001b[0;32mIn [10]\u001b[0m, in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m average \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msum\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDie durchschnittestemperatur der letzten 24h liegt bei: \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39m \u001b[38;5;28mstr\u001b[39m(average))\n",
|
||||
"\u001b[0;31mZeroDivisionError\u001b[0m: division by zero"
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Die durchschnittestemperatur der letzten 24h liegt bei: 16.825000000000003\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -514,10 +518,139 @@
|
|||
"print(\"Die durchschnittestemperatur der letzten 24h liegt bei: \"+ str(average))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "beac4081-54db-405a-a3c8-612918ee6f45",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Heißeste Wetterstation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "476a3d5d-9ef9-4746-9993-e4b5af076883",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Als erstes müssen alle notwendigen Daten abgerufen werden."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "4cf4e14f-37f7-4d67-98dd-55c53a5235d7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"client = InfluxDBClient(url=influx_url, token=token, org=org)\n",
|
||||
"\n",
|
||||
"query_api = client.query_api()\n",
|
||||
"query = 'from(bucket: \"' + bucket + '\")\\\n",
|
||||
" |> range(start: -24h)\\\n",
|
||||
" |> filter(fn: (r) => r[\"_field\"] == \"TM5_10\")'\n",
|
||||
"result = query_api.query(org=org, query=query)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "033f9c72-859b-4d64-92d3-6def4aaaecf4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Zum bestimmen der Heißstesten Wetterstation müssen ersteinmal mehrere Varialben definiert werden."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "6fd12713-48ed-4624-8436-b3f3e23d7612",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"station_name = \"\" # Name der Station die gerade Verarbeitet wird\n",
|
||||
"max_station_temp = -254 # Höchsttemperatur der heißesten Station \n",
|
||||
"max_station_name = \"\" # Name der heißesten Station"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "add9133e-09df-4773-9913-9f617beeee5f",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Die nächste Schleife iteriert über die Zeilen der Tabelle. Dabei wird für jede Station der höchstwert bestimmt."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "c5be1f84-d6a0-42cb-9ce8-38d5de155a53",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Die heißeste Station ist Cottbus mit einer Temperatur von 32.2C\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for table in result: \n",
|
||||
" max = -254 # Maximal Wert der aktuell Verarbeiteten Station\n",
|
||||
" for record in table.records:\n",
|
||||
" station_name = record.get_measurement() # Abfragen des Stationsnamens\n",
|
||||
" value = record.get_value() # Abfragen des Messwertes\n",
|
||||
" if value > max:\n",
|
||||
" max = value \n",
|
||||
" if max > max_station_temp: # Wenn die aktuelle Station heißer ist als der bisherige Maximalwert\n",
|
||||
" max_station_temp = max # den neuen heißsten Wert Speichern\n",
|
||||
" max_station_name = station_name # und auch den Namen der Station speichern\n",
|
||||
"\n",
|
||||
"print(\"Die heißeste Station ist \" + str(max_station_name) + \" mit einer Temperatur von \" + str(max_station_temp) + \"C\" )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "95c26c18-6993-4245-b8f8-58fce2377179",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Zum bestimmen der nidrigsten Temperatur ist ganz Ähnlich"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "3736b28c-c6b0-4d94-a750-6598d28dc316",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Die kälteste Station ist Öhringen mit einer Temperatur von 18.4C\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"min_station_temp = 254 # Höchsttemperatur der heißesten Station \n",
|
||||
"min_station_name = \"\" # Name der heißesten Station\n",
|
||||
"\n",
|
||||
"for table in result: \n",
|
||||
" min = 254 \n",
|
||||
" for record in table.records:\n",
|
||||
" station_name = record.get_measurement() \n",
|
||||
" value = record.get_value() \n",
|
||||
" if value < min:\n",
|
||||
" min = value \n",
|
||||
" if min < min_station_temp: \n",
|
||||
" min_station_temp = max \n",
|
||||
" min_station_name = station_name\n",
|
||||
"\n",
|
||||
"print(\"Die kälteste Station ist \" + str(min_station_name) + \" mit einer Temperatur von \" + str(min_station_temp) + \"C\" )"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d9b07ea5-2db3-4950-a370-d0ed53a5b8f3",
|
||||
"id": "e71ea5cd-12fe-4f5d-bf2f-4fa91e2c78dc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
|
|
BIN
Anhang/Literatur/ComputerWeekly.de, Redaktion (2021).pdf
Normal file
BIN
Anhang/Literatur/ComputerWeekly.de, Redaktion (2021).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Data-Science-Team (2020).pdf
Normal file
BIN
Anhang/Literatur/Data-Science-Team (2020).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Dix, Paul (2021).pdf
Normal file
BIN
Anhang/Literatur/Dix, Paul (2021).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Fangman, Sam (2019).pdf
Normal file
BIN
Anhang/Literatur/Fangman, Sam (2019).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2021a).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2021a).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2021b).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2021b).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2021c).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2021c).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022a).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022a).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022b).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022b).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022c).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022c).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022d).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022d).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022e).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022e).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022f).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022f).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022g).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022g).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022h).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022h).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Influxdata (2022i).pdf
Normal file
BIN
Anhang/Literatur/Influxdata (2022i).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/Seeger, Marc (2009).pdf
Normal file
BIN
Anhang/Literatur/Seeger, Marc (2009).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/ajek Vlasta Pour Ales, Kudibal Ivan (2019).pdf
Normal file
BIN
Anhang/Literatur/ajek Vlasta Pour Ales, Kudibal Ivan (2019).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/hazelcast (2022).pdf
Normal file
BIN
Anhang/Literatur/hazelcast (2022).pdf
Normal file
Binary file not shown.
BIN
Anhang/Literatur/solid-IT-gmbh (2022).pdf
Normal file
BIN
Anhang/Literatur/solid-IT-gmbh (2022).pdf
Normal file
Binary file not shown.
5
arbeit/.vscode/settings.json
vendored
5
arbeit/.vscode/settings.json
vendored
|
@ -42,5 +42,8 @@
|
|||
],
|
||||
"terminal.integrated.shell.linux": null,
|
||||
"latex-workshop.view.pdf.viewer": "tab",
|
||||
"cSpell.language": "de-DE,de"
|
||||
"cSpell.language": "de-DE,de",
|
||||
"cSpell.words": [
|
||||
"schleifendurchlauf"
|
||||
]
|
||||
}
|
Binary file not shown.
|
@ -96,16 +96,16 @@
|
|||
numbersep=5pt,
|
||||
}
|
||||
\begin{lstlisting}[caption=InfluxDB Flux Beispiel {Quelle: \cite[][]{InfluxAPIPythonClient}}, firstnumber=1, label=list:influxFlux],
|
||||
from(bucket:"test-bucked")
|
||||
from(bucket:"test-bucket")
|
||||
|> range(start: -1h)
|
||||
|
||||
from(bucket:"test-bucked")
|
||||
from(bucket:"test-bucket")
|
||||
|> range(start: -1h, stop: -10m)
|
||||
|
||||
from(bucket:"test-bucked")
|
||||
from(bucket:"test-bucket")
|
||||
|> range(start: 2022-06-30T00:00:00Z, stop: 2022-06-30TT12:00:00Z)
|
||||
|
||||
from(bucket: "test-bucked")
|
||||
from(bucket: "test-bucket")
|
||||
|> range(start: -15m)
|
||||
|> filter(fn: (r) => r._measurement == "cpu" and r._field == "cpu-total")
|
||||
|> yield()
|
||||
|
@ -182,6 +182,27 @@
|
|||
\end{minipage}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[hbt]
|
||||
\centering
|
||||
\begin{minipage}[t]{0.9\textwidth} % Breite, z.B. 1\textwidth
|
||||
\caption{InfluxDB Query Builder} % Überschrift
|
||||
\includegraphics[width=1\textwidth]{img/InfluxDBQuryBuilder.PNG} % Pfad
|
||||
\source{Eigener Screenshot InfluxDB Webinterface} % Quelle
|
||||
\label{fig:query-builder}
|
||||
\end{minipage}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[hbt]
|
||||
\centering
|
||||
\begin{minipage}[t]{0.9\textwidth} % Breite, z.B. 1\textwidth
|
||||
\caption{InfluxDB Graph} % Überschrift
|
||||
\includegraphics[width=1\textwidth]{img/InfluxDB-Graph.PNG} % Pfad
|
||||
\source{Eigener Screenshot InfluxDB Webinterface} % Quelle
|
||||
\label{fig:influxdb-Graph}
|
||||
\end{minipage}
|
||||
\end{figure}
|
||||
|
||||
|
||||
% Die anzeige Funktioniert leider nicht!
|
||||
%\anhang{DWD Wetterdaten}
|
||||
%\begin{figure}[bht]
|
||||
|
|
|
@ -3,21 +3,21 @@
|
|||
|
||||
\subsection{Zielsetzung}
|
||||
|
||||
Das Ziel dieser Arbeit ist es eine Einführung in die Funktion von \gls{TSDB} zu geben. Dazu wird
|
||||
beispielhaft an den Temperaturdaten des \glspl{DWD} gezeigt wie einer \gls{TSDB} gearbeitet werden kann.
|
||||
Das Ziel dieser Arbeit ist es, eine Einführung in die Funktion von \gls{TSDB} zu geben. Dazu wird
|
||||
beispielhaft an den Temperaturdaten des \glspl{DWD} gezeigt, wie mit einer \gls{TSDB} gearbeitet werden kann.
|
||||
Als Datenbank wird InfluxDB genutzt.
|
||||
|
||||
\subsection{Aufbau und Vorgehensweise}
|
||||
|
||||
Im Grundlagenteil dieser Arbeit werden die Grundlagen von Time Series Data und \gls{TSDB} erläutert.
|
||||
Des Weiteren wird erklärt was eine \gls{TSDB} ist und wie diese sich von \gls{RDBMS} unterscheidet.
|
||||
Außerdem wird kurz die für die Entwicklungsumgebung notwendige Software Docker und jupyter Notebooks
|
||||
Des Weiteren wird erklärt, was eine \gls{TSDB} ist und wie diese sich von \gls{RDBMS} unterscheidet.
|
||||
Außerdem wird kurz die für die Entwicklungsumgebung notwendige Software, Docker und Jupyter Notebooks,
|
||||
erklärt.
|
||||
|
||||
Im nächsten Kapitel wird gezeigt wie mit InfluxDB gearbeitet werden kann. Dazu wird das für InfluxDB
|
||||
wichtige Line Protokoll vorgestellt. Außerdem wird gezeigt wie die abgerufenen Daten mit InfluxDB
|
||||
visualisiert werden können. Als Daten werden die Wetterdaten das \gls{DWD} genutzt welche auch in diesem
|
||||
Kapitel erklärt und vorstellt werden.
|
||||
Im nächsten Kapitel wird gezeigt, wie mit InfluxDB gearbeitet werden kann. Dazu wird das für InfluxDB
|
||||
wichtige Line Protokoll vorgestellt. Außerdem wird gezeigt, wie die abgerufenen Daten mit InfluxDB
|
||||
visualisiert werden können. Als Daten werden die Wetterdaten das \gls{DWD} genutzt, welche auch in diesem
|
||||
Kapitel erklärt und vorgestellt werden.
|
||||
|
||||
Im letzten Artikel folgt eine kurze Zusammenfassung der Arbeit und der wichtigsten Informationen
|
||||
zu \gls{TSDB}
|
||||
Im letzten Kapitel folgt eine kurze Zusammenfassung der Arbeit und der wichtigsten Informationen
|
||||
zu \gls{TSDB}
|
|
@ -2,41 +2,40 @@
|
|||
\section{Grundlagen}
|
||||
|
||||
In diesem Kapitel werden die Grundlagen von \gls{TSDB} und Time Series Data erklärt.
|
||||
\gls{TSDB} gehören zu den NoSQL Datenbanken und sind besonders darauf optimiert, mit Time Series Data zu
|
||||
arbeiten. Dadurch können die große Mengen an
|
||||
Time Series Data verarbeiten, durchsuchen und speichern.\footnote{\cite[vgl.][]{ComputerWeekly}}
|
||||
\gls{TSDB} gehören zu den \gls{NoSQL} Datenbanken und sind besonders darauf optimiert, mit Time Series Data zu
|
||||
arbeiten. Dadurch können die große Mengen an Time Series Data verarbeiten, durchsuchen und speichern.\footnote{\cite[vgl.][]{ComputerWeekly}}
|
||||
|
||||
\subsection{Time Series Data}
|
||||
|
||||
Um \gls{TSDB} zu verstehen, muss als erstes geklärt werden, was Time Series Data überhaupt ist und wie sie sich von anderen Daten unterscheiden.
|
||||
Wie der Name schon impliziert, ist Time Series Data eine Reihe von Daten, die über einen Zeitraum gesammelt worden sind. Es wird also nicht nur der Endwert aufgezeichnet,
|
||||
sonder die Veränderung über einen Zeitraum. Diese Daten können z.B. Servermetriken, %Anwendungs Leistungsüberwachung, finde ich kein besseres Wort für weglassen
|
||||
Netzwerkdaten, \gls{IOT} Sensordaten, Ereignisse, Klicks, Marktgeschäfte und viele andere Arten von Daten sein.
|
||||
Netzwerkdaten, \gls{IOT}, Sensordaten, Ereignisse, Klicks, Marktgeschäfte und viele andere Arten von Daten sein.
|
||||
Time Series Data können gut daran erkannt werden, dass die Zeit eine wichtige Achse bei der Darstellung der Werte ist.\footnote{\cite[vgl.][1\psqq]{PaulDix}}
|
||||
|
||||
Manchmal ist es nicht notwendig, alle Daten zu erfassen. Zum Beispiel wird in vielen Anwendungen nur der letze Login gespeichert.
|
||||
Mehr ist auch für die Funktion nicht notwendig. Allerdings können zusätzliche Informationen gewonnen werden, wenn nicht
|
||||
nur der letze Datenpunkt sondern die Veränderung über einen Zeitraum aufgezeichnet wird.
|
||||
nur der letze Datenpunkt, sondern die Veränderung über einen Zeitraum aufgezeichnet wird.
|
||||
So kann zum Beispiel festgestellt werden, wie oft und wann sich der Kunde einloggt und ob es dabei ein Muster gibt. Anhand dieser Daten können Kunden
|
||||
dann kategorisiert werden.\footnote{\cite[vgl.][]{DataScienceTeam2020}}
|
||||
|
||||
Eine weitere Besonderheit von Time Series Data ist, dass sie sich nicht verändert. Wenn die Daten einmal erfasst wurden wird an ihnen nichts mehr verändert.
|
||||
Eine weitere Besonderheit von Time Series Data ist, dass sie sich nicht verändert. Wenn die Daten einmal erfasst wurden, wird an ihnen nichts mehr verändert.
|
||||
Es werden nur neue Daten hinzugefügt.\footnote{\cite[vgl.][]{SamFangman2019}}
|
||||
|
||||
\subsection{{Aufbau von Time Series Datenbanken}}
|
||||
|
||||
\gls{TSDB} sind darauf ausgelegt Key Value paare zu Speichern. Der Key in einem Key Value Datensatz ist eine
|
||||
Wert über den die Value referenziert wird. Im Value Teil werden die Daten zum dazugehörigem Key gespeichert.
|
||||
Der Wert der Value kann ein primitiver Datentyp sein oder auch ein Objekt das in einen primitiven Datentyp
|
||||
\gls{TSDB} sind darauf ausgelegt, Key Value Paare zu Speichern. Der Key in einem Key Value Datensatz ist eine
|
||||
Wert, über den die Value referenziert wird. Im Value Teil werden die Daten zum dazugehörigem Key gespeichert.
|
||||
Der Wert der Value kann ein primitiver Datentyp sein oder auch ein Objekt, das in einen primitiven Datentyp
|
||||
umgewandelt worden ist.
|
||||
\footnote{\cite[vgl.][]{Key-Value}}
|
||||
|
||||
Ein Datenpunkt in einer Time Series Database besteht aus mehreren key Value Paaren. Einige Dieser Key Value Paare sind sogenannte Tags.
|
||||
Diese Tags sind Werte die sich zwischen den Datenpunkten nicht ändern wie zum Beispiel die Position eines Sensors oder die Kundenummer
|
||||
Diese Tags sind Werte, die sich zwischen den Datenpunkten nicht ändern, wie zum Beispiel die Position eines Sensors oder die Kundenummer
|
||||
eines Kunden der sich gerade eingeloggt hat. Anhand dieser Tags können die Datenpunkte durchsucht werden. Die eigentlichen Messwerte
|
||||
des Sensors oder andere Daten die erfasst werden sollen werden auch als Key Value Paar gespeichert. Zum Beispiel wird als Name
|
||||
Temperatur und als Wert 25,2 angeben. Ein Datenpunkt kann mehrere Messwerte haben. Außerdem wird jeder Datenpunkt mit einem Timestamp
|
||||
versehen nach welchem er Indexiert wird.\footnote{\cite[vgl.][]{hazelcast}} Eine gute Veranschaulichung wie die Daten in einer \gls{TSDB} aufgebaut sind zeigt das InfluxDB
|
||||
versehen, nach welchem er Indexiert wird.\footnote{\cite[vgl.][]{hazelcast}} Eine gute Veranschaulichung wie die Daten in einer \gls{TSDB} aufgebaut sind, zeigt das InfluxDB
|
||||
Line Protokoll in \cref{list:lineproto}.
|
||||
%https://hazelcast.com/glossary/time-series-database/
|
||||
|
||||
|
@ -44,17 +43,18 @@ Line Protokoll in \cref{list:lineproto}.
|
|||
|
||||
Um Time Series Data zu speichern, ist es nicht unbedingt erforderlich, eine \gls{TSDB} zu nutzen. Auch relationale Datenbanken können Time Series
|
||||
Data speichern. Einer der wichtigsten Unterschiede zwischen einer \gls{TSDB} im Gegensatz zu einem \gls{RDBMS} ist es, dass kein Datenbank Schema benötigt wird.
|
||||
Wenn Time Series Daten in einer Rationalen Datenbank geschrieben werden sollen, müssen erst entsprechende Tabellen angelegt werden, in denen die Daten immer im
|
||||
Wenn Time Series Daten in eine %eine oder einer?
|
||||
Rationalen Datenbank geschrieben werden sollen, müssen erst entsprechende Tabellen angelegt werden, in denen die Daten immer im
|
||||
gleichen Format abgelegt werden müssen. Im Gegensatz dazu können in einer \gls{TSDB} die Daten einfach schemafrei in die Datenbank geschrieben werden. Ein
|
||||
weiterer Vorteil ist, dass \gls{TSDB} im Gegensatz zu relationalen Datenbanken besser und einfacher Skaliert werden
|
||||
weiterer Vorteil ist, dass \gls{TSDB} im Gegensatz zu relationalen Datenbanken besser und einfacher skaliert werden
|
||||
können.\footnote{\cite[vgl.][]{InfluxDataSQL}}
|
||||
|
||||
Aber \gls{TSDB} haben nicht nur Vorteile. Wie in \cref{fig:db-ranking} zu sehen, sind sie viel weniger verbreitet als nicht zeit basierte Datenbank Systeme. Dadurch gibt
|
||||
es viel weniger Entwickler die Erfahrungen mit \gls{TSDB} haben. Auch auch das Ökosystem um die Datenbank ist deutlich kleiner. Außerdem sind \gls{RDBMS}
|
||||
Aber \gls{TSDB} haben nicht nur Vorteile. Wie in \cref{fig:db-ranking} zu sehen, sind sie viel weniger verbreitet, als nicht zeit basierte Datenbank Systeme. Dadurch gibt
|
||||
es viel weniger Entwickler die Erfahrungen mit \gls{TSDB} haben. Auch das Ökosystem um die Datenbank ist deutlich kleiner. Außerdem sind \gls{RDBMS}
|
||||
dadurch, dass es sie viel länger gibt, sehr stabil und sehr gut unterstützt.\footnote{\cite[vgl.][]{InfluxDataSQL}}
|
||||
|
||||
\gls{RDBMS} arbeiten nach dem \gls{CRUD} Prinzip, welches für Time Series Data nicht optimal ist. Auf Time Series Data werden keine Update Befehle durchgeführt, da
|
||||
neue Daten immer nur angehängt werden. Auch das Löschen von Daten wird nicht sehr häufig durchgeführt und im Gegensatz zu \gls{RDBMS}
|
||||
neue Daten immer nur angehängt werden. Auch das Löschen von Daten wird nicht sehr häufig durchgeführt und im Gegensatz zu \gls{RDBMS},
|
||||
meistens gleichzeitig auf einer großen Menge an Datensätzen. \gls{TSDB} sind auf diese Besonderheiten optimiert und daher besser dafür geeignet, mit Time Series Data zu arbeiten und weisen auch eine
|
||||
höhere Performance auf.\footnote{\cite[vgl.][]{InfluxDataSQL}}
|
||||
|
||||
|
@ -85,35 +85,35 @@ Speicherplatz auf der Festplatte, um die gleiche Menge an Daten zu speichern.\fo
|
|||
|
||||
\subsection{{Entwicklungsumgebung}}
|
||||
|
||||
Um mit InfluxDB zu arbeiten wird eine Umgebung zum ausführen von Docker Containern benötigen, in welchen wir InfluxDB und Jupyter Notebooks betreiben.
|
||||
Der eigentliche Code wird dann in Jupyter Notebooks mit Python entwickelt. Die Grundlagen über die Eingesetzen Tool und Techniken werden grob in diesem Kapitel
|
||||
Um mit InfluxDB zu arbeiten, wird eine Umgebung zum ausführen von Docker Containern benötigt, in welchen InfluxDB und Jupyter Notebooks betreiben werden können.
|
||||
Der eigentliche Code wird dann in Jupyter Notebooks mit Python entwickelt. Die Grundlagen über die Eingesetzen Tools und Techniken, werden grob in diesem Kapitel
|
||||
erläutert.
|
||||
|
||||
\subsubsection{{Docker und Docker-Compose}}
|
||||
%Docker
|
||||
Docker ist eine Software für das erstellen und verwalten von Containern. Mit Docker ist es möglich Anwendungen samt ihrer Umgebung in einer Einheit
|
||||
zusammenzufassen, so das diese einfach auf anderen System ausgeführt werden können. Dabei hat jeder Container ein eigenes Dateisystem und ein eigens
|
||||
Docker ist eine Software für das erstellen und verwalten von Containern. Mit Docker ist es möglich, Anwendungen samt ihrer Umgebung in einer Einheit
|
||||
zusammenzufassen, so dass diese einfach auf anderen Systemen ausgeführt werden können. Dabei hat jeder Container ein eigenes Dateisystem und ein eigens
|
||||
Betriebssystem. Allerdings teilen sich Container und Hostsystem den Kernel des Hostsystems. Dadurch hat diese Art der Virtualisierung deutlich
|
||||
weniger Overhead als andere Virtualisierungstechniken. Zusätzlich wird das Betriebssystem innerhalb des Containers maximal reduziert so das nur
|
||||
noch benötigte Komponenten vorhanden sind. Wichtig ist es das immer nur möglichst eine Anwendung in einem Container zu finden ist.
|
||||
weniger Overhead als andere Virtualisierungstechniken. Zusätzlich wird das Betriebssystem innerhalb des Containers maximal reduziert, so dass nur
|
||||
noch benötigte Komponenten vorhanden sind. Wichtig ist es, dass immer nur möglichst eine Anwendung in einem Container zu finden ist.
|
||||
Durch die Virtualisierung sind die einzelnen Container voneinander getrennt.\footnote{\cite[vgl.][54\psqq]{DanielStender2020}}
|
||||
|
||||
%Docker Compose
|
||||
Allerdings bestehen einige Anwendungen aus mehreren Komponenten, diese können durch mehrere Docker Container abgebildet werden. Um die Verwaltung von
|
||||
mehreren Container zu erleichtern kann Docker-Compose genutzt werden. Mithilfe von Docker Compose können größere Umgebungen in einem Compose File
|
||||
verwaltete werden. Hier werden die Umgebungsvariablen, Container Image oder Dockerfiles, Ports, Storage und weiteres in einer Datei definiert.
|
||||
Mithilfe dieser definition kann Docker Compose eine komplexe Umgebung mit nur einem Befehl initialisieren.\footnote{\cite[vgl.][151\psqq]{DanielStender2020}}
|
||||
mehreren Container zu erleichtern, kann Docker-Compose genutzt werden. Mithilfe von Docker-Compose, können größere Umgebungen in einem Compose File
|
||||
verwaltet werden. Hier werden die Umgebungsvariablen, Container-Images oder Dockerfiles, Ports, Storage und weiteres in einer Datei definiert.
|
||||
Mithilfe dieser Definition kann Docker Compose eine komplexe Umgebung mit nur einem Befehl initialisieren.\footnote{\cite[vgl.][151\psqq]{DanielStender2020}}
|
||||
|
||||
\subsubsection{{Python und Jupyter Notebooks}}
|
||||
%Python
|
||||
Python ist eine universelle Prozedurale und Imperative Programmiersprache die 1994 in der ersten Version veröffentlicht wurde. Der Name ist eine Huldigung an Monty Python und
|
||||
wurde nicht nach einer Schlange benannt, auch wenn das Logo eine Schlange ist. Python ist unter der freien PFS Lizenz lizenziert wodurch es auch in
|
||||
kommerziellen Anwendung genutzt werden kann. Python ist eine Interpretierte Sprache. Das heißt das sie nicht zu einer ausführbaren Datei kompiliert wird
|
||||
sondern von einem Interpreter interpretiert wird. Außerdem ist Python eine unter Programmieranfängern sehr beliebte Sprache die auch sehr viel in den
|
||||
Bereichen DataSience, DeepLerning, Naturwissenschaften und Linux Systemprogrammierung eingesetzt wird.\footnote{\cite[vgl.][66\psqq]{DanielStender2020}}
|
||||
Python ist eine universelle Prozedurale und Imperative Programmiersprache, die 1994 in der ersten Version veröffentlicht wurde. Der Name ist eine Huldigung an Monty Python und
|
||||
wurde nicht nach einer Schlange benannt, auch wenn das Logo eine Schlange ist. Python ist unter der freien PFS Lizenz lizenziert, wodurch es auch in
|
||||
kommerziellen Anwendung genutzt werden kann. Python ist eine Interpretierte Sprache. Das heißt, dass sie nicht zu einer ausführbaren Datei kompiliert wird
|
||||
sondern von einem Interpreter interpretiert wird. Außerdem ist Python eine unter Programmieranfängern sehr beliebte Sprache, die auch sehr viel in den
|
||||
Bereichen Data-Science, Deep-Learning, Naturwissenschaften und Linux Systemprogrammierung eingesetzt wird.\footnote{\cite[vgl.][66\psqq]{DanielStender2020}}
|
||||
|
||||
% Jupyter Notebooks
|
||||
Jupyter Notebooks ist eine Webbasierte Open-Source Anwendung mit dem Ziel Code in den Sprachen Python, R, und Julia einfach zu schreiben, bearbeiten,
|
||||
auszuführen und einfach zu teilen. Ein Notebook besteht immer aus Zellen. Eine Zelle kann Code oder Markdown Formatierten Text anzeigen. Jede Zelle
|
||||
kann einzeln ausgeführt werden. Dadurch kann ein Programm sehr einfach und verständlich dargestellt und erklärt werden. Es ist auch möglich neue Notebooks
|
||||
Jupyter Notebooks ist eine webbasierte Open-Source Anwendung mit dem Ziel, Code in den Sprachen Python, R, und Julia einfach schreiben, bearbeiten,
|
||||
auszuführen und teilen zu können. Ein Notebook besteht immer aus Zellen. Eine Zelle kann Code oder Markdown Formatierten Text anzeigen. Jede Zelle
|
||||
kann einzeln ausgeführt werden. Dadurch kann ein Programm sehr einfach und verständlich dargestellt und erklärt werden. Es ist auch möglich, neue Notebooks
|
||||
und Dateien im Webinterface von Jupyter Notebooks selbst anzulegen.\footnote{\cite[vgl.][91\psqq]{NikitaSilaparasetty2020}}
|
|
@ -1,38 +1,38 @@
|
|||
\section{{InfluxDB}}
|
||||
|
||||
InfluxDB ist eine in Go geschriebene open source \gls{TSDB}, die darauf ausgelegt ist, mit einer großen Menge an Time Series Data zu arbeiten.\footnote{\cite[vgl.][]{dbranking}}
|
||||
Im weiterem verlauf dieses Kapitels wird am Beispiel von Wetterdaten gezeigt, wie mit InfluxDB gearbeitet wird. InfluxDB stellt für die Integration in
|
||||
Im weiteren Verlauf dieses Kapitels, wird am Beispiel von Wetterdaten gezeigt, wie mit InfluxDB gearbeitet wird. InfluxDB stellt für die Integration in
|
||||
eigene Anwendungen ein \gls{HTTP} \gls{API} zur Verfügung, für die es in vielen Programmiersprachen Client Librarys gibt. Außerdem wird ein Webinterface und ein \gls{CLI} bereitgestellt.
|
||||
\footnote{\cite[vgl.][]{InfluxAPI}}
|
||||
|
||||
|
||||
\subsection{{InfluxDB Installation}}
|
||||
|
||||
Bevor InfluxDB genutzt werden kann muss es als erstes installiert werden. Am einfachsten ist dies über Docker möglich. Dazu ist es notwendig das Docker und Docker Compose auf dem System installiert sind.
|
||||
Bevor InfluxDB genutzt werden kann muss es als erstes installiert werden. Am einfachsten ist dies über Docker möglich. Dazu ist es notwendig, dass Docker und Docker Compose auf dem System installiert sind.
|
||||
Mit Docker Desktop lassen sich die beide Tools am einfachsten installieren. Im Anhang dieser Arbeit befindet sich im Ordner Docker eine Docker Compose Datei mit dem Namen docker-compose.yml.
|
||||
Zum Starten der benötigten Container ist es am einfachsten mit einem Terminal (Powershell, xterm usw.) in den Docker Ordner zu wechseln und den Befehl docker compose up -d auszuführen.
|
||||
Jetzt beginnt docker damit die notwendigen Images herunterzuladen und zu bauen. Wenn der Befehl ohne Fehler ausgeführt worden ist InfluxDB installiert worden und kann
|
||||
Zum starten der benötigten Container ist es am einfachsten, mit einem Terminal (Powershell, xterm usw.) in den Docker Ordner zu wechseln und den Befehl docker compose up -d auszuführen.
|
||||
Jetzt beginnt Docker damit, die notwendigen Images herunterzuladen und zu bauen. Wenn der Befehl ohne Fehler ausgeführt worden ist, wurde InfluxDB erfolgreich installiert und kann
|
||||
über die URL:\ \url{http://localhost:8086} aufgerufen werden. Die Login Daten sind als Umgebungsvariable in Docker Compose definiert und lauten: admin e1LjSYaFbzbJeIBC.
|
||||
|
||||
Außerdem wurde mit diesem Befehl auch ein Jupyter Notebook in einem Docker Container gestartet. Auf diesen Container kann über die URL:\ \url{http://localhost:8888/}
|
||||
zugegriffen werden. Das Passwort lautet fhdw. Im Ordner DWD befinden sich die Notebooks mit dem in dieser Arbeit beschrieben Code.
|
||||
zugegriffen werden. Das Passwort lautet fhdw. Im Ordner work befinden sich die Notebooks mit dem in dieser Arbeit beschrieben Codes.
|
||||
|
||||
\subsection{{Daten einfügen}}
|
||||
|
||||
In InfluxDB werden Daten immer in Buckets gespeichert. Um Daten hochzuladen, muss zunächst ein Bucket angelegt werden. Dazu gibt es zwei
|
||||
Möglichkeiten. Die Einfachste ist es, über das Web \gls{UI} von InfluxDB einen neuen Bucket anzulegen. Dazu muss nach dem Login der Navigationspunkt Data
|
||||
und der Reiter Buckets ausgewählt werden. Hier kann dann mit dem Button Create Bucket ein neuer Bucket angelegt werden. Bei dem Anlegen kann noch eine
|
||||
Möglichkeiten. Die einfachste ist es, über das Web \gls{UI} von InfluxDB einen neuen Bucket anzulegen. Dazu muss nach dem Login der Navigationspunkt Data
|
||||
und der Reiter Buckets ausgewählt werden. Hier kann dann mit dem Button Create Bucket ein neuer Bucket angelegt werden. Bei dem anlegen kann noch eine
|
||||
Lebensdauer für die Daten ausgewählt werden, nach welcher die jeweiligen Datenpunkte gelöscht werden.\footnote{vgl. \cref{fig:dashboard}, \cref{fig:load-data-source}, \cref{fig:load-data-bucket}, \cref{fig:load-data-add-bucket}}
|
||||
|
||||
\subsection{Line Protokoll}
|
||||
%\subsection{Line Protokoll} Mit oder ohne diese Überschrift?
|
||||
|
||||
Daten werden immer nach dem InfluxDB Line Protokoll formatiert an die Datenbank gesendet. Das Protokoll ist wie in \cref{list:lineproto}
|
||||
dargestellt aufgebaut. Im ersten Teil des Line Protokolls wird der Name der Messreihe angegeben. Das kann zum Beispiel der Name des Sensors sein oder
|
||||
der Ort an dem der Messwert genommen wurde. Wichtig ist, dass Groß und Kleinschreibung beachtet werden muss und Unterstriche nicht
|
||||
genutzt werden dürfen. Sonderzeichen müssen mit einem \textbackslash \ %Bachslash mit Leerzeichen
|
||||
maskiert werden. Nach dem Namen kommen getrennt durch ein Komma die Tags der Messung.
|
||||
Tags werden indexiert und dazu genutzt, um Messwerte zu durchsuchen. Tags werden als Key Value Paar angegeben. Hier sollen Metadaten wie
|
||||
zum Beispiel der Standort des Sensors oder der Name des Servers eingetragen werden, zu dem die Datenpunkt/e gehören. Die eigentlichen Werte sind mit einem
|
||||
dargestellt aufgebaut. Im ersten Teil des Line Protokolls wird der Name des Datenpunktes angegeben. Das kann zum Beispiel der Name des Sensors sein oder
|
||||
der Ort, an dem der Messwert genommen wurde. Wichtig ist, dass Groß- und Kleinschreibung beachtet werden muss und Unterstriche nicht
|
||||
genutzt werden dürfen. Sonderzeichen müssen mit einem Backslash \textbackslash \ %Bachslash mit Leerzeichen
|
||||
maskiert werden. Nach dem Namen kommen, getrennt durch ein Komma, die Tags des Datenpunktes.
|
||||
Tags werden indexiert und dazu genutzt, Datenpunkte zu durchsuchen. Auch Tags werden als Key Value Paar angegeben. Hier sollen Metadaten wie
|
||||
zum Beispiel der Standort des Sensors oder der Name des Servers eingetragen werden, die zum Datenpunkt gehören. Die Messwerte sind mit einem
|
||||
Leerzeichen von den Tags abgegrenzt und bestehen aus durch Kommas getrennten Key Value Feldern. Der letzte Wert einer Zeile ist der Unix Timestamp in Millisekunden.
|
||||
In einer Datei oder Anfrage kann es mehrere Zeilen mit Daten geben.\footnote{\cite[vgl.][]{InfluxDBLineProtolkoll}}
|
||||
%Quelle https://docs.influxdata.com/influxdb/v2.2/reference/syntax/line-protocol/
|
||||
|
@ -44,78 +44,86 @@ measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200
|
|||
--------------- --------------- --------------------- -------------------
|
||||
| | | |
|
||||
Measurement Tag set Field set Timestamp
|
||||
(Messwerte)
|
||||
\end{lstlisting}
|
||||
\end{figure}
|
||||
%Quelle https://docs.influxdata.com/influxdb/v2.2/reference/syntax/line-protocol/
|
||||
%Quelle https://docs.influxdata.com/influxdb/v2.2/reference/syntax/line-protocol/#naming-restrictions
|
||||
|
||||
Die im Line Protokoll formatierten Daten können jetzt entweder mithilfe eines Rest Requests oder des InfluxDB \gls{CLI} in die Datenbank übertragen werden.
|
||||
Um diese Anfragen zu autorisieren muss ein \gls{API} Token mitgesendet werden.\footnote{\cite[vgl.][]{InfluxDBWriteAPI}}
|
||||
Um diese Anfragen zu autorisieren, muss ein \gls{API} Token mitgesendet werden.\footnote{\cite[vgl.][]{InfluxDBWriteAPI}}
|
||||
Um einen Token zu bekommen, kann dieser entweder über das Webinterface, die \gls{CLI} oder über die \gls{API} angelegt werden. Der einfachste Weg ist es,
|
||||
den Token über das Webinterface anzulegen. Dazu wird wie beim Anlegen eines Buckets zunächst der Menüpunkt Data ausgewählt und anschließend der Reiter API
|
||||
den Token über das Webinterface anzulegen. Dazu wird wie beim anlegen eines Buckets zunächst der Menüpunkt Data ausgewählt und anschließend der Reiter API
|
||||
Tokens. Mit einem Klick auf Generate API Token kann dann ein API Token erstellt werden.\footnote{vgl. \cref{fig:dashboard}, \cref{fig:load-data-source}, \cref{fig:load-data-api-token}, \cref{fig:load-data-add-token}}
|
||||
Dabei kann zwischen einem All-Access token und einem Read/Write token ausgewählt werden. Mit dem All Access Token kann auf alles zugegriffen werden.
|
||||
Mit einem Read/Write Token kann wie in \cref{fig:load-data-add-token} zu sehen, ausgewählt werden, auf welchen Bucket geschrieben oder gelesen werden kann.\footnote{\cite[vgl.][]{InfluxDBToken}}
|
||||
Mit einem Read/Write Token kann wie in \cref{fig:load-data-add-token} zu sehen, ausgewählt werden, auf welchem Bucket geschrieben oder gelesen werden kann.\footnote{\cite[vgl.][]{InfluxDBToken}}
|
||||
|
||||
\subsection{{Daten abrufen und visualisieren}}
|
||||
|
||||
Um Daten aus InfluxDB abzurufen wird die funktionale Sprache Flux genutzt. Flux wurde für das Abfragen, Analysieren und Verarbeiten von Daten entwickelt. %https://docs.influxdata.com/influxdb/cloud/query-data/get-started/
|
||||
Um Daten aus InfluxDB abzurufen, wird die funktionale Sprache Flux genutzt. Flux wurde für das abfragen, analysieren und verarbeiten von Daten entwickelt.\footnote{\cite[vgl.][]{InfluxFlux}}
|
||||
Flux kann unter anderem im influxDB Webinterface oder über die InfluxDB \gls{API} sowie über den InfluxDB \gls{CLI} CLient ausgeführt werden.
|
||||
\footnote{\cite[vgl.][]{InfluxExecQuery}}
|
||||
%https://docs.influxdata.com/influxdb/cloud/query-data/execute-queries/.
|
||||
|
||||
Am einfachsten ist es Flux mit Code Beispielen zu erklären. Die Zeilenangaben in diesem Kapitel beziehen sich wenn es nicht anders
|
||||
angegeben ist auf das \cref{list:influxFlux}. Damit Daten abgefragt werden können muss als erstes ein Bucket ausgewählt werden.
|
||||
In Zeile 1 wird dazu das from Statement genutzt um den Bucket mit den Namen \"test-bucked\" auszuwählen. Aus Performance gründen
|
||||
erlaubt Flux allerdings keine Abfragen ohne die Angebe eines Zeitbereiches der die Datenmenge einschränkt. Dieser Bereich kann mithilfe
|
||||
des \"range\" Statements ausgewählt werden, wobei es zwei verschiedene Möglichkeiten gibt. Die erste ist mithilfe des start Parameters
|
||||
Am einfachsten ist es, Flux mit Code Beispielen zu erklären. Die Zeilenangaben in diesem Kapitel beziehen sich auf das \cref{list:influxFlux}.
|
||||
Damit Daten abgefragt werden können, muss als erstes ein Bucket ausgewählt werden.
|
||||
In Zeile 1 wird dazu das from Statement genutzt um den Bucket mit dem Namen test-bucket auszuwählen. Aus Performance Gründen
|
||||
erlaubt Flux keine Abfragen ohne die Angebe eines Zeitbereiches, der die Datenmenge einschränkt. Dieser Bereich kann mithilfe
|
||||
des range Statements ausgewählt werden, wobei es zwei verschiedene Möglichkeiten gibt. Die erste ist, mithilfe des start Parameters,
|
||||
die Zeit relativ zum Zeitpunkt der Ausführung anzugeben. In Zeile 2 des Beispiels wird der Zeitbereich auf die letzte Stunde festgelegten.
|
||||
Zusätzlich zum start Parameter kann auch der Stop Parameter angeben werden welcher wie in Zeile 5 zu sehen angibt bis wann die Daten
|
||||
Zusätzlich zum Startparameter kann auch der Stop-Parameter angeben werden, welcher wie in Zeile 5 zu sehen, angibt bis wann die Daten
|
||||
abgerufen werden. In Zeile 5 würden die Daten von 14:00 bis 14:50 abgerufen werden wenn die Abfrage um 15 Uhr verarbeitet wird.
|
||||
Die zweite Möglichkeit ist es den Zeitbereich mit absoluten Werten einzuschränken, dass wird wie in Zeile 8 zu sehen gemacht.
|
||||
Die zweite Möglichkeit ist es, den Zeitbereich mit absoluten Werten einzuschränken,was wie in Zeile 8 zu sehen, gemacht wird.
|
||||
Zusätzlich zu den Zeitbereichen können auch weitere Filter auf die Daten angewendet werden. Dazu wird die Filter Funktion genutzt.
|
||||
Mit dieser Funktion wird über die Datenpunkte der Datenbank iteriert. Innerhalb dieser Funktion wird eine weitere Funktion als Parameter übergeben
|
||||
welche die Daten filtert. Wenn die Funktion false zurückgibt wird dieser Datenpunkt verworfen, falls jedoch ein true zurückgegeben wird, werden
|
||||
die Daten weiter verarbeiten oder ausgegeben. Im Fall von Zeile 12 wird der Record, damit ist der aktuelle Datenpunkt in der Datenbank auf
|
||||
die die Funktion gerade angewendet wird, in die Variable \"r\" gespeichert. Über \"r.\_measurement\" kann nach dem Namen eines Datenpunktes
|
||||
und mit \"r.\_field\" nach dem Namen eines Messwertes gefiltert werden. Im letzten Schritt werden über die \"yield()\" Funktion
|
||||
die Daten ausgegeben. Das ist nur erforderlich wenn mehrere Flux Abfragen zu einer Kombiniert werden.\footnote{\cite[vgl.][]{InfluxFluxQuery}}
|
||||
Mit dieser Funktion wird über die Datenpunkte der Datenbank iteriert. Innerhalb dieser Funktion wird eine weitere Funktion als Parameter übergeben,
|
||||
welche die Daten filtert. Wenn die Funktion false zurückgibt, wird dieser Datenpunkt verworfen, falls jedoch ein true zurückgegeben wird, werden
|
||||
die Daten weiter verarbeiten oder ausgegeben. Im Fall von Zeile 12 wird der Datenpunkt, auf welchen der iterator gerade verweist, in die Variable r gespeichert.
|
||||
Über r.\_measurement kann nach dem Namen eines Datenpunktes
|
||||
und mit r.\_field nach dem Namen eines Messwertes gefiltert werden. Im letzten Schritt werden über die yield() Funktion
|
||||
die Daten ausgegeben. Das ist nur erforderlich, wenn mehrere Flux Abfragen zu einer kombiniert werden.\footnote{\cite[vgl.][]{InfluxFluxQuery}}
|
||||
%https://docs.influxdata.com/influxdb/cloud/query-data/get-started/query-influxdb/
|
||||
Alternativ können Flux Querys auch über den Query Builder im InfluxDB Web \gls{UI} erstellt werden.\footnote{\cite[vgl.][]{InfluxDBDataExplorer}}
|
||||
|
||||
Es ist nicht immer erforderlich die Daten aus der Datenbank auszulesen wenn diese Visualisiert oder verarbeiten werden sollen.
|
||||
Mithilfe des InfluxDB Webinterface ist es möglich Daten zu visualisieren. Bevor die Daten Visualisiert werden können müssen diese
|
||||
erst mithilfe eines Flux Query abgefragt werden. Dazu kann entweder selbst ein Query geschrieben werden oder der eingebaute
|
||||
Query Bilder genutzt werden.\footnote{\cite[vgl.][]{InfluxDBDataExplorer}} Danach lassen sich die Daten als Graph, Heatmap, Histogramm, Scatterplot und weiteren Diagrammtypen anzeigen.\footnote{\cite[vgl.][]{InfluxDBGraph}}
|
||||
Es ist nicht immer erforderlich die Daten aus der Datenbank auszulesen, wenn diese visualisiert werden sollen.
|
||||
Mithilfe des InfluxDB Webinterface ist es möglich, Daten zu visualisieren. Vorher ist es allerdings notwendig die zu visualisierenden Daten mithilfe eins Flux
|
||||
Query abzufragen,
|
||||
%bevor die Daten Visualisiert werden können müssen diese erst mithilfe eines Flux Query abgefragt werden.
|
||||
dazu kann entweder selbst ein Query geschrieben werden, oder der eingebaute
|
||||
Query Builder genutzt werden.\footnote{\cite[vgl.][]{InfluxDBDataExplorer}} Danach lassen sich die Daten als Graph, Heatmap, Histogramm, Scatterplot und weiteren Diagrammtypen anzeigen.\footnote{\cite[vgl.][]{InfluxDBGraph}}
|
||||
|
||||
\subsection{Python library}
|
||||
\subsection{Python Library}
|
||||
|
||||
Um nicht selbst eigene API Anfragen über die Rest API schreiben zu müssen gibt es für Python und andere Sprachen fertige
|
||||
Bibliotheken.\footnote{\cite[vgl.][]{InfluxAPIClientLibs}} Bevor mit der Client Library gearbeitet werden kann muss diese als erste
|
||||
Installiert und importiert werden. Am besten wird zur Installation der Python Paketmanager pip genutzt. Mit dem Befehl pip install influxdb-client
|
||||
werden alle benötigten Packte installiert.\footnote{\cite[vgl.][]{InfluxAPIPythonClient}}
|
||||
Um nicht selbst eigene API Anfragen über die Rest API schreiben zu müssen, gibt es für Python und andere Sprachen fertige
|
||||
Bibliotheken.\footnote{\cite[vgl.][]{InfluxAPIClientLibs}} Bevor mit der Client Library gearbeitet werden kann, muss diese allerdings erst
|
||||
installiert und importiert werden. Am besten wird zur Installation der Python Paketmanager pip genutzt. Mit dem Befehl pip install influxdb-client
|
||||
werden alle benötigten Pakte installiert.\footnote{\cite[vgl.][]{InfluxAPIPythonClient}}
|
||||
|
||||
In \cref{list:influxPythonWrite} kann an einem Beispiel gesehen werden wie Daten mithilfe von Python in die Datenbank geschrieben
|
||||
werden. Ein ähnliches Beispiel findet sich ausführbar und detailliert beschreiben im Jupyter Notebook Container in der
|
||||
Datei Grundlagen. In der ersten beiden Zeile des Codes wird der InfluxDB Client importiert. Danach werden in Zeile
|
||||
vier bis sieben die benötigten Daten bucket, Organisation, Token und \gls{URL} in Variablen geschrieben.
|
||||
Was in die Variablen eingetragen werden muss wird im
|
||||
In \cref{list:influxPythonWrite} kann an einem Beispiel gesehen werden, wie Daten mithilfe von Python in die Datenbank geschrieben
|
||||
werden. Ein ähnliches Beispiel findet sich ausführbar und detailliert beschreiben im Jupyter Notebook Container, in der
|
||||
Datei Grundlagen. In den ersten beiden Zeilen des Codes wird der InfluxDB Client importiert. Danach werden in Zeile
|
||||
vier bis sieben die benötigten Daten Bucket, Organisation, Token und \gls{URL} in Variablen geschrieben.
|
||||
Was in die Variablen eingetragen werden muss, wird im
|
||||
Kapitel Daten einfügen %eventuell Link einfügen?
|
||||
beschreiben.\footnote{\cite[vgl.][]{InfluxAPIPythonClient}}
|
||||
|
||||
In Zeile neun bis 13 wird der Client mit den hinterlegen Variablen initialisiert. Danach folgt in Zeile 15 die
|
||||
Initialisierung des write clients. Als nächstes muss ein Datenbank erstellt werden der in die Datenbank geschrieben werden kann.
|
||||
Dazu wird in Zeile 17 bis 19 der Datenpunkt erstellt. An diesen Datenpunkt kann eine beliebige Menge an Tags und Datenfeldern
|
||||
In Zeile neun bis 13 wird der Client mit den hinterlegt Variablen initialisiert. Danach folgt in Zeile 15 die
|
||||
Initialisierung des write clients. Als nächstes muss ein Datenpunkt erstellt werden, der in die Datenbank geschrieben werden kann.
|
||||
Dieser wird in Zeile 17 bis 19 erstellt. An diesen Datenpunkt kann eine beliebige Menge an Tags und Datenfeldern
|
||||
über die Methoden tag und field angehängt werden. Hier im Beispiel wird der Datenpunkt my\_measurement mit dem Tag location angelegt,
|
||||
welcher den Wert Paderborn hat, und dem Datenpunkt temperature mit dem Wert 25,3 angelegt. In der letzten Zeile wird dann
|
||||
der write client dazu genutzt um diesen Datenbank an die Datenbank zu senden.
|
||||
welcher den Wert Paderborn hat, und dem Messwert temperature mit dem Wert 25,3. In der letzten Zeile wird dann
|
||||
der write client dazu genutzt, um diesen Datenpunkt an die Datenbank zu senden.
|
||||
|
||||
Um die so in die Datenbank geschrieben Werte wieder abzurufen kann so wie in \cref{list:influxPythonRead} vorgegangen werden.
|
||||
Um die so in die Datenbank geschriebenen Werte wieder abzurufen, kann so wie in \cref{list:influxPythonRead} vorgegangen werden.
|
||||
Hier wird als erstes in Zeile 1 ein Query Client erstellt. Mit diesem Query Client kann dann wie in Zeile 2 bis 7 zu
|
||||
sehen ein FLux Query ausgeführt werden. Zurückgegeben wird ein Flux Objekt mit einer Tabellen Struktur die wie in Zeile 9 bis 11
|
||||
zu sehen einfach mit einer Schleife verarbeitete werden.
|
||||
sehen ein FLux Query ausgeführt werden. Zurückgegeben wird ein Flux Objekt mit einer Tabellen Struktur, die wie in Zeile 9 bis 11
|
||||
zu sehen, einfach mit einer Schleife verarbeitete werden kann. Um auf die Daten des Objekts zuzugreifen sind die wichtigsten Methoden hier beschreiben.
|
||||
Mit get\_measurement kann der Namen eines Datenpunktes abgerufen werden. Zusätzlich kann Mithilfe von get\_field und get\_value der Name und der Wert
|
||||
des Messwertes im Datenpunkt abgefragt werden. Zum abfragen der Zeit wird die Methoden get\_time genutzt.
|
||||
\footnote{\cite[vgl.][]{InfluxAPIPythonClient}}
|
||||
|
||||
|
||||
|
||||
|
||||
%InfluxDB Tasks
|
||||
% InfluxDB Graphen
|
||||
|
||||
|
@ -129,8 +137,8 @@ zu sehen einfach mit einer Schleife verarbeitete werden.
|
|||
|
||||
\subsubsection{{Wetterdaten Aufbau}}
|
||||
|
||||
Die Wetterdaten des DWD können über den CDC OpenData Bereich heruntergeladen werden. Hier werden die Wetterdaten über FTP und HTTPS zum Download
|
||||
angeboten. Unter der URL \url{https://www.dwd.de/DE/leistungen/cdc/cdc_ueberblick-klimadaten.html} wird eine gute Übersicht über die zum
|
||||
Die Wetterdaten des \gls{DWD} können über den \gls{CDC} OpenData Bereich heruntergeladen werden. Hier werden die Wetterdaten über \gls{FTP} und \gls{HTTPS} zum Download
|
||||
angeboten. Unter der \gls{URL} \url{https://www.dwd.de/DE/leistungen/cdc/cdc_ueberblick-klimadaten.html} wird eine gute Übersicht über die zum
|
||||
Download angeboten Daten geboten. Die Werte für die aktuelle Lufttemperatur können über
|
||||
\url{https://opendata.dwd.de/climate_environment/CDC/observations_germany/climate/10_minutes/air_temperature/now/}
|
||||
abgerufen werden. Historische Daten können über
|
||||
|
@ -186,9 +194,9 @@ eor & END OF RECORD" Bedeutet die Zeile ist zu Ende. \\
|
|||
\end{minipage}
|
||||
\end{table}
|
||||
|
||||
In der Datei zehn\_now\_tu\_Beschreibung\_Stationen.txt werden die Wetterstationen beschrieben. Diese Datei ist nicht als \gls{CSV} Datei formatiert sondern als Tabelle und erhält
|
||||
Daten über die Wetterstationen. Die Daten der Stationen in der heruntergeladenen Textdatei stimmen mit den Daten der Hauptamtliches Messnetz Karte überein.
|
||||
Allerdings enthält die Textdatei nicht alle Stationen sondern nur Station für die auch Messwerte im Datensatz hinterlegt sind. Die Bedeutung der einzelnen
|
||||
In der Datei zehn\_now\_tu\_Beschreibung\_Stationen.txt werden die Wetterstationen beschrieben. Diese Datei ist nicht als \gls{CSV} Datei formatiert, sondern als Tabelle und erhält
|
||||
Daten über die Wetterstationen. Die Daten der Stationen in der heruntergeladenen Textdatei stimmen mit den Daten der Hauptamtlichen-Messnetz-Karte überein.
|
||||
Allerdings enthält die Textdatei nicht alle Stationen, sondern nur Stationen für die auch Messwerte im Datensatz hinterlegt sind. Die Bedeutung der einzelnen
|
||||
Spalten der Tabelle sind in der \cref{tab:file-stations} beschreiben.
|
||||
|
||||
\begin{table}[hbt]
|
||||
|
@ -199,14 +207,14 @@ Spalten der Tabelle sind in der \cref{tab:file-stations} beschreiben.
|
|||
\toprule
|
||||
Feld Name & Bedeutung \\
|
||||
\midrule
|
||||
STATION\_ID & Gibt an von welcher Station die Werte stammen \\ \hline
|
||||
von\_datum & Datum seit dem die Station aktiv ist. \\ \hline
|
||||
STATION\_ID & Gibt an, von welcher Station die Werte stammen \\ \hline
|
||||
von\_datum & Datum, seit dem die Station aktiv ist. \\ \hline
|
||||
bis\_datum & Hohe der Station. \\ \hline
|
||||
Stationshoehe & Hohe über dem Normalnullpunkt \\ \hline
|
||||
Stationshoehe & Höhe über dem Normalnullpunkt \\ \hline
|
||||
geoBreite & Breitengrad der Station. \\ \hline
|
||||
geoLaenge \_10 & Längengrad der Stations. \\ \hline
|
||||
Stationsname & Name der Station. \\ \hline
|
||||
Bundesland & Bundesland in dem die Station steht. \\
|
||||
Bundesland & Bundesland, in dem die Station steht. \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\source{Vergleich der Werte mit der Hauptamtliches Messnetz Karte \url{https://opendata.dwd.de/climate_environment/CDC/observations_germany/climate/10_minutes/air_temperature/now/zehn_now_tu_Beschreibung_Stationen.txt}} % Quelle
|
||||
|
@ -214,20 +222,41 @@ Spalten der Tabelle sind in der \cref{tab:file-stations} beschreiben.
|
|||
\end{minipage}
|
||||
\end{table}
|
||||
|
||||
\clearpage
|
||||
\clearpage %Ansonsten ist die Tabelle irgendwo anders im Text
|
||||
|
||||
%\pagebreak %Damit die Tabelle nicht auf der falschen Seite ist.
|
||||
\subsubsection{{Wetterdaten abrufen}}
|
||||
|
||||
Um die Daten auswerten zu können müssen diese als erstes heruntergeladen und entpackt werden. Dazu wird mithilfe von BeautifulSoup aus der \gls{HTML} Seite
|
||||
des \gls{DWD} für jede Datei eine \gls{URL} ausgelesen. Die so gewonnen \gls{URL}s können dann mithilfe einer Schleife heruntergeladen werden.
|
||||
Um den Messwerten eine Station zuordnen zu können wird als erstes die Datei mit den Station verarbeitet. Für jede Station wird Objekt erstellt und in ein
|
||||
dictionary gespeichert. Dadurch kann in im dictionary einfach über die STATIONS\_ID die passende Station gefunden werden. Weil diese Datei allerdings nicht
|
||||
CSV formatiert ist musst die Datei auf eine andere Art ausgewertete werden. Um die einzelnen Felder aus einer Zeile zu bekommen wird immer so lange
|
||||
gelesen bis wieder ein bestimmte Anzahl von Leerzeichen hintereinander erkannt worden ist. Die Zeichen zwischen den Leerzeichen sind dann ein ausgelesenes Feld.
|
||||
Nachdem die Stationsdaten ausgewertet worden sind, werden die CSV Datein in einer Schleife entpackt und mithilfe der Bibliothek Pandas in ein Dataframe
|
||||
umgewandelt. Das so erzeugte Dataframe wir im letzten Schritt mit den Daten der Stations zusammengeführt und als Datenpunkt in InfluxDB geschrieben.
|
||||
Weitere Erklärungen und der Code selbst kann im angehängten Jupyter notebook eingesehen und ausgeführt werden.
|
||||
Um den Messwerten eine Station zuordnen zu können, wird als erstes die Datei mit den Stationen verarbeitet. Für jede Station wird ein Objekt erstellt und in ein
|
||||
dictionary gespeichert. Dadurch kann in diesem dictionary einfach über die STATIONS\_ID die passende Station gefunden werden. Weil diese Datei allerdings nicht
|
||||
\gls{CSV} formatiert ist, muss die Datei auf eine andere Art ausgewertete werden. Um die einzelnen Felder aus einer Zeile zu bekommen, wird immer so lange
|
||||
gelesen, bis wieder ein bestimmte Anzahl von Leerzeichen hintereinander erkannt worden ist. Die Zeichen zwischen den Leerzeichen sind dann ein ausgelesenes Feld.
|
||||
Nachdem die Stationsdaten ausgewertet worden sind, werden die \gls{CSV} Dateien in einer Schleife entpackt und mithilfe der Bibliothek Pandas in ein Dataframe
|
||||
umgewandelt. Das so erzeugte Dataframe wir im letzten Schritt mit den Daten der Stationen zusammengeführt und als Datenpunkt in InfluxDB geschrieben.
|
||||
Weitere Erklärungen und der Code selbst können im angehängten Jupyter notebook eingesehen und ausgeführt werden.
|
||||
|
||||
\subsubsection{{Wetterdaten Verarbeiten}}
|
||||
|
||||
Mithilfe der in die Datenbank geschriebenen Wetterdaten, ist es nun möglich die Tageshöchst- und Tiefsttemperatur
|
||||
sowie den Temperatur-Durchschnitt in Paderborn zu ermitteln. Der Code der dazu notwendig ist, befindet sich auch wieder im Jupyter Notebook. Als erstes
|
||||
müssen die notwendigen Datenpunkte aus der Datenbank abgerufen werden. Dazu wird wie in Kapitel 3.3 vorgegangen. Zunächst wird ein
|
||||
Flux Query geschrieben der alle Daten der Geographisch nächsten Wetterstationen Bad Lippspringe ausließt.
|
||||
Die Ereignisse werden in ein FluX Objekt gespeichert, welches dann im nächsten Schritt mithilfe einer Schleife verarbeitet wird.
|
||||
Zum bestimmen der Höchst- und Tiefsttemperatur, werden die beiden
|
||||
Variablen min und max definiert, welche mit einem sehr hohen bzw einem sehr niedrigem Wert initialisiert werden. Beim durchlaufen der Schleife
|
||||
wird immer der aus der Datenbank stammende Wert mit der Variable min und max vergleichen. Wenn der Wert größer als max ist, wird max auf den
|
||||
neuen größten Wert gesetzt und wenn der Wert kleiner als min, ist wird min auf den neuen kleinsten Wert gesetzt. So beinhaltet die Variable max
|
||||
nach dem durchlaufen den höchsten und die Variable min den niedrigsten Wert. Für das bestimmen des Durchschnittswertes muss eine Zähler
|
||||
Variable, in diesem Fall i, und eine Summen Variable sum erstellt werden. Die Zähler Variable wird mit jedem Schleifendurchlauf um eins hochgezählt.
|
||||
Zusätzlich wird die Summen Variablen mit dem Wert innerhalb der Schleife addiert. Zum bestimmen des Durchschnittswertes muss jetzt nur noch
|
||||
die Summe, in diesem Fall die Variablen sum, durch die Anzahl der Elemente, hier i, geteilt werden. Der Ergebnisse ist der Tagesmittelwert.
|
||||
|
||||
Um die Daten in der Datenbank zu visualisieren, kann die in InfluxDB eingebaute Graph Funktion genutzt werden. Über den Query Builder
|
||||
können wie in \cref{fig:query-builder} zu sehen, Messtationen ausgewählt werden, zu denen Graphen anzeigen werden sollen. Außerdem
|
||||
kann hier auch ausgewählt werden, welche Felder angezeigt werden sollen. Mit einem Klick auf Submit wird ein Graph wie in
|
||||
\cref{fig:influxdb-Graph} zu sehen, angezeigt. In diesem Graphen werden die Temperaturen von den Messtationen auf Sylt(pink) und in
|
||||
Bad Lippspringe(blau), am 27.06.2022 angezeigt.
|
||||
|
||||
Weitere Bespiele für das verarbeiten der Wetterdaten können im Jupyter Notebook gefunden werden.
|
|
@ -5,25 +5,25 @@
|
|||
\section{Kritische Auseinandersetzung}
|
||||
|
||||
An dieser Arbeit kann kritisiert werden, dass viele der genutzten Quellen von InfluxDB
|
||||
veröffentlicht wurden. Zusätzlich wurden sehr viele Internetquellen Zitiert und nur wenige Monographien.
|
||||
veröffentlicht wurden. Zusätzlich wurden sehr viele Internetquellen zitiert und nur wenige Monographien.
|
||||
Außerdem konnten durch die begrenzte Zeit und den begrenzten Umfang dieser Arbeit
|
||||
nicht alle Funktion und Besonderheiten von \gls{TSDB} und InfluxDB im besonderen beschreiben werden.
|
||||
Weitere Informationen dazu können in der InfluxDB Dokumentation und den genutzten Quellen gefunden werden.
|
||||
nicht, alle Funktion und Besonderheiten von \gls{TSDB} und InfluxDB im besonderen beschreiben werden.
|
||||
Weitere Informationen können in der InfluxDB Dokumentation und den genutzten Quellen gefunden werden.
|
||||
|
||||
\section{Zusammenfassung}
|
||||
|
||||
Time Series Data ist eine Reihe von Daten die die Veränderung eines Zustandes über eine Zeitspanne aufzeichnen. Diese Daten können
|
||||
Time Series Data ist eine Reihe von Daten, die die Veränderung eines Zustandes über eine Zeitspanne aufzeichnen. Diese Daten können
|
||||
IOT Sensor Daten, Servermetriken, Netzwerkdaten, Marktgeschäfte oder viele andere Arten von Daten sein.\footnote{\cite[vgl.][]{ComputerWeekly}}
|
||||
Time Series Datenbanken sind genau dafür entwickelt worden um effizient mit dieser Art von Daten zu arbeiten und sind dabei um
|
||||
Time Series Datenbanken sind genau dafür entwickelt worden, um effizient mit dieser Art von Daten zu arbeiten und sind dabei um
|
||||
einiges schneller als \gls{RDBMS}. Allerdings sind sie auch weniger flexibel und haben kein so ausgeprägtes Ökosystem.
|
||||
\footnote{\cite[vgl.][]{InfluxDataSQL}}
|
||||
|
||||
Mithilfe von Docker und Jupyter Notebook kann sehr schnell eine Entwicklungsumgebung aufgebaut werden mit der einfach die
|
||||
Mithilfe von Docker und Jupyter Notebook kann sehr schnell eine Entwicklungsumgebung aufgebaut werden, mit der einfach die
|
||||
als Beispiel genutzten Wetterdaten heruntergeladen, importiert und verarbeiten werden können.
|
||||
|
||||
\section{Schlussfolgerung und Fazit}
|
||||
|
||||
\gls{TSDB} eignen sich sehr gut für die Speicherung von Time Series Data und besonders für die verarbeiten von
|
||||
großen Datenmengen. Dadurch das immer mehr Daten erfasst werden ist es abzusehen das sich \gls{TSDB} immer weiter
|
||||
verbreiten werden. Es bietet sich an für IOT Sensoren oder die Erfassung von Servermetriken und anderer Time Series Data
|
||||
\gls{TSDB} eignen sich sehr gut für die Speicherung von Time Series Data und besonders für die Verarbeitung von
|
||||
großen Datenmengen. Dadurch, dass immer mehr Daten erfasst werden, ist es abzusehen, dass sich \gls{TSDB} immer weiter
|
||||
verbreiten werden. Es bietet sich an für IOT Sensoren oder die Erfassung von Servermetriken und anderer Time Series Data,
|
||||
auf \gls{TSDB} zu setzen.
|
|
@ -6,8 +6,13 @@
|
|||
\newacronym{RDBMS}{RDBMS}{Relational Database Management System}
|
||||
\newacronym{CRUD}{CRUD}{Create, Read, Update, Delete}
|
||||
\newacronym{HTTP}{HTTP}{HyperText Transfer Protocol}
|
||||
\newacronym{HTTPS}{HTTPS}{HyperText Transfer Protocol Secure}
|
||||
\newacronym{API}{API}{Application Programming Interface}
|
||||
\newacronym{CLI}{CLI}{Command Line Interface}
|
||||
\newacronym{CSV}{CSV}{Comma-separated values}
|
||||
\newacronym{UI}{UI}{User Interface}
|
||||
\newacronym{HTML}{HTML}{Hypertext Markup Language}
|
||||
\newacronym{HTML}{HTML}{Hypertext Markup Language}
|
||||
\newacronym{CDC}{CDC}{Climate Data Center}
|
||||
\newacronym{FTP}{FTP}{File Transfer Protocol}
|
||||
\newacronym{NoSQL}{NoSQL}{{Not only \gls{SQL}}}
|
||||
\newacronym{SQL}{SQL}{Structured Query Language}
|
BIN
arbeit/img/InfluxDB-Graph.PNG
Normal file
BIN
arbeit/img/InfluxDB-Graph.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
BIN
arbeit/img/InfluxDBQuryBuilder.PNG
Normal file
BIN
arbeit/img/InfluxDBQuryBuilder.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 102 KiB |
|
@ -61,7 +61,7 @@ keywords = {mono}
|
|||
@misc{InfluxAPI,
|
||||
author = {Influxdata},
|
||||
title = {{API Quick Start}},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.2/api-guide/api_intro/},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.3/api-guide/api_intro/},
|
||||
urldate = {2022-05-21},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
|
@ -85,11 +85,21 @@ year = {2022},
|
|||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxFlux,
|
||||
author = {Influxdata},
|
||||
title = {{Get started with Flux}},
|
||||
url = {https://docs.influxdata.com/influxdb/cloud/query-data/get-started/},
|
||||
urldate = {2022-05-21},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
||||
|
||||
@misc{InfluxAPIPythonClient,
|
||||
author = {Influxdata},
|
||||
title = {{Python client library}},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.2/api-guide/client-libraries/python/},
|
||||
urldate = {2022-06-18},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.3/api-guide/client-libraries/python/},
|
||||
urldate = {2022-06-28},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
@ -97,8 +107,8 @@ keywords = {web}
|
|||
@misc{InfluxAPIClientLibs,
|
||||
author = {Influxdata},
|
||||
title = {{Use InfluxDB client libraries}},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.2/api-guide/client-libraries/},
|
||||
urldate = {2022-06-18},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.3/api-guide/client-libraries/},
|
||||
urldate = {2022-06-28},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
@ -115,7 +125,7 @@ keywords = {web}
|
|||
@misc{InfluxDBLineProtolkoll,
|
||||
author = {Influxdata},
|
||||
title = {{Line protocol}},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.2/reference/syntax/line-protocol/},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.3/reference/syntax/line-protocol/},
|
||||
urldate = {2022-05-29},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
|
@ -124,8 +134,8 @@ keywords = {web}
|
|||
@misc{InfluxDBWriteAPI,
|
||||
author = {Influxdata},
|
||||
title = {{Write data with the InfluxDB API}},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.2/write-data/developer-tools/api/},
|
||||
urldate = {2022-05-29},
|
||||
url = {https://docs.influxdata.com/influxdb/v2.3/write-data/developer-tools/api/},
|
||||
urldate = {2022-06-29},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
@ -160,7 +170,7 @@ keywords = {web}
|
|||
@misc{DataScienceTeam2020,
|
||||
author = {Data-Science-Team},
|
||||
title = {{What the heck is time-series data (and why do I need a time-series database)?}},
|
||||
url = {https://www.computerweekly.com/de/definition/Zeitreihendatenbank-Time-Series-Database-TSDB},
|
||||
url = {https://datascience.eu/wiki/what-the-heck-is-time-series-data-and-why-do-i-need-a-time-series-database/},
|
||||
urldate = {2022-05-09},
|
||||
year = {2020},
|
||||
keywords = {web}
|
||||
|
@ -169,7 +179,7 @@ keywords = {web}
|
|||
@misc{ComputerWeekly,
|
||||
author = {Redaktion ComputerWeekly.de},
|
||||
title = {{Definition Zeitreihendatenbank (Time Series Database, TSDB) }},
|
||||
url = {https://datascience.eu/wiki/what-the-heck-is-time-series-data-and-why-do-i-need-a-time-series-database/},
|
||||
url = {https://www.computerweekly.com/de/definition/Zeitreihendatenbank-Time-Series-Database-TSDB},
|
||||
urldate = {2021-05-21},
|
||||
year = {2021},
|
||||
keywords = {web}
|
||||
|
|
Reference in a new issue