- Zusammenfassung geschrieben
- Code Beispiele verbessert
This commit is contained in:
parent
cbe5afe026
commit
dc55e9ae90
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -572,3 +572,5 @@ FodyWeavers.xsd
|
|||
#Docker Data
|
||||
Anhang/Docker/data/influxdb/
|
||||
Anhang/data/influxdb/data/
|
||||
Anhang/Docker/data/jupyLab/dwd-data
|
||||
10minuten*
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 12,
|
||||
"id": "43cf5e5c-9542-47ea-9205-89f97a217c51",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -40,9 +40,11 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"execution_count": 13,
|
||||
"id": "d6ae2ed0-3363-420f-81d5-56050591a50e",
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"token = \"klyDN4DRFvnRrbmNAEvTXdbP7goon9DBfSxN_1X2Us6AFFp6G5T0QNwgf7ucrRExwZomzhPInj68BjPw2gwXOQ==\"\n",
|
||||
|
@ -61,7 +63,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"execution_count": 14,
|
||||
"id": "0a3d1adf-5c17-4aa6-8296-bd6bf0d78dc8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -91,7 +93,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"execution_count": 15,
|
||||
"id": "9015aa31-9bee-40db-b604-243c8f0b6ee9",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -109,7 +111,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"execution_count": 16,
|
||||
"id": "7a557626-aaba-4ef4-8b4d-5ff2dd2840ef",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -136,7 +138,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"execution_count": 17,
|
||||
"id": "59aaa184-b140-432d-8132-cbb179ce4543",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -154,7 +156,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"execution_count": 18,
|
||||
"id": "cb28ce0d-5d9f-4090-a136-6fa7c8787974",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -176,7 +178,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"execution_count": 19,
|
||||
"id": "34975883-fa02-469f-8a2a-cc3464ae6c92",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
|
@ -194,7 +196,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"execution_count": 20,
|
||||
"id": "1c689c54-8215-41e3-97ca-6b6eed76d0fc",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
|
@ -214,14 +216,6 @@
|
|||
"\n",
|
||||
"print(results)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ed16d014-5e16-4401-848f-8b6c44c45b83",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
|
|
@ -24,13 +24,12 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"Als erstes werden vorbereitungen dafür die Daten zu Importieren getroffen. Dazu werden die benötigten Bibliotehken importiert und einige Variablen gesetzt.\n",
|
||||
"\n",
|
||||
"Außerdem wird ein Ordner angelget in dem die heruntergeladenen Daten gespeichert werde können."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 1,
|
||||
"id": "c87fe05a-63e3-4748-a01a-d46cb12e9b05",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
|
@ -61,7 +60,7 @@
|
|||
"from influxdb_client import InfluxDBClient, Point, WritePrecision, BucketRetentionRules\n",
|
||||
"from influxdb_client.client.write_api import SYNCHRONOUS\n",
|
||||
"\n",
|
||||
"token = \"wb4s191jc33JQ4a6wK3ZECwrrG3LuSyQd61akFa_q6ZCEsequUvFhL9Gre6FaZMA2ElCylKz26ByJ6RetkQaGQ==\"\n",
|
||||
"token = \"8TYGzTJhqCyKpspMp95Yk858DY2uMzj6wbexbFGMiaLjcG6caiQtNiBKOFlxXnYuEoduFqS9o6_q8UmP1eJC0w==\"\n",
|
||||
"org = \"test-org\"\n",
|
||||
"bucket = \"dwd_now\"\n",
|
||||
"influx_url = \"http://influxdb:8086\"\n",
|
||||
|
@ -78,12 +77,12 @@
|
|||
"id": "7cad1e52-4d22-4dc5-952c-3578d73280ec",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Um die Daten später Importieren zu können muss zuächst ein Bucket in der Datenbank angelegt werden. Wenn das Bucket schon vorhanden ist wird es gelöscht und erneut angelegt damit keine Doppelten Daten vorhandene sind."
|
||||
"Um die Daten später Importieren zu können muss zuächst ein Bucket in der Datenbank angelegt werden. Wenn das Bucket schon vorhanden ist wird es gelöscht und erneut angelegt."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 2,
|
||||
"id": "b9acf473-2f26-40c6-9c48-1a4ec159bd3d",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
|
@ -104,7 +103,7 @@
|
|||
" \n",
|
||||
" if len(data_bucket) > 0:\n",
|
||||
" print(\"Vorhandes Bucket löschen\")\n",
|
||||
" buckets_api.delete_bucket(data_bucket[0])\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",
|
||||
|
@ -122,7 +121,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 3,
|
||||
"id": "90f1eb08-b4dd-4743-ad38-492bfd742fec",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
|
@ -160,7 +159,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 4,
|
||||
"id": "2524986b-9c26-42d5-8d76-f4e228d0eb48",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
|
@ -215,7 +214,7 @@
|
|||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"execution_count": 5,
|
||||
"id": "430041d7-21fa-47d8-8df9-7933a8749f82",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
|
@ -224,8 +223,7 @@
|
|||
"output_type": "stream",
|
||||
"text": [
|
||||
"dwd-data/zehn_now_tu_Beschreibung_Stationen.txt\n",
|
||||
"Großenkneten \n",
|
||||
"52.9336 \n"
|
||||
"Großenkneten \n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -311,7 +309,8 @@
|
|||
"id": "81bbb42e-3bd9-4b29-a6e3-11e1d1593307",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Um an die Messerte in den Datein zu kommen müssen diese entpackt werden."
|
||||
"Um an die Messerte in den Datein zu kommen müssen diese entpackt werden. \n",
|
||||
"Das kann einige Zeit in Anspruch nehmen. Es wird immer die Station angezeigt die gerade Importiert wird"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -324,7 +323,7 @@
|
|||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Import durchgeführt \r"
|
||||
"Import durchgeführt \r"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
@ -360,7 +359,7 @@
|
|||
"\n",
|
||||
" p.time(measurement_time,WritePrecision.S)\n",
|
||||
" write_api.write(bucket=bucket, record=p)\n",
|
||||
" print(\" \", end='\\r')\n",
|
||||
" print(\" \", end='\\r')\n",
|
||||
" print(\"Import Station: \", station , end='\\r')\n",
|
||||
" except:\n",
|
||||
" error += 1\n",
|
||||
|
@ -383,9 +382,145 @@
|
|||
" read_dwd_file(f)\n",
|
||||
" #print(contents)\n",
|
||||
"\n",
|
||||
"print(\" \", end='\\r')\n",
|
||||
"print(\" \", end='\\r')\n",
|
||||
"print(\"Import durchgeführt\", end='\\r')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e2112e23-4a2f-40cb-adf6-44e3caa7c6f7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Wetterdaten verarbeiten"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"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."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "dacfcc8e-a74b-4067-8f55-ac4063294dec",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Als erstes müssen die Daten der letzen 24 Stunden aus der Datenbank abgerufen werden. Dazu wird mithilfe des Query Clients ein Flux Query ausgeführt der nach den gewünschten Daten filtert."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "a3e48dfa-eeca-4a3c-a8c7-7b65c223b6c6",
|
||||
"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[\"_measurement\"] == \"Lippspringe, Bad \")\\\n",
|
||||
" |> filter(fn: (r) => r[\"_field\"] == \"TM5_10\")'\n",
|
||||
"result = query_api.query(org=org, query=query)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "711e5ab4-c5c0-4e03-bc49-fd2f2d0946ed",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Als nächstes werden einige Variablen definiert um den höchst und Tiefstwert zu erhalten. \n",
|
||||
"Für den Höchstwert nehmen wir Standartmäßig einen sehr nidrigen und für den Tiefstwert einen sehr hohen Wert.\n",
|
||||
"\n",
|
||||
"Außerdem wird für den Durschnittswert ein Zähler und eine Summen Variable definiert."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "053593fb-1fad-4280-b519-a163b89daa7f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"highest = -254\n",
|
||||
"lowest = 254\n",
|
||||
"\n",
|
||||
"i=0\n",
|
||||
"sum=0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "94441229-f809-4942-908f-9c0397461245",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for table in result:\n",
|
||||
" for record in table.records:\n",
|
||||
" 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",
|
||||
"\n",
|
||||
"print(\"Der Tageshöchstwert der letzen 24h liegt bei: \"+ str(highest))\n",
|
||||
"print(\"Der Tagestiefstwert der letzen 24h liegt bei: \"+ str(lowest))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8a9d2fd8-08ac-4b32-83b0-df03285dda93",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Um den Durchschnittswert auszurechnen muss nur noch die Summe aller Werte, also die Variable sum, durch die Anzahl der Werte i geteilt werden."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "6cf90047-ba7b-42fc-b012-aa9647d60191",
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"average = sum / i\n",
|
||||
"print(\"Die durchschnittestemperatur der letzten 24h liegt bei: \"+ str(average))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d9b07ea5-2db3-4950-a370-d0ed53a5b8f3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
|
Binary file not shown.
|
@ -87,6 +87,39 @@
|
|||
|
||||
\clearpage %Damit die Bilder richtig positioniert sind.
|
||||
|
||||
\anhang{InfluxDB Flux Code}
|
||||
\begin{figure}[bht]
|
||||
\lstset{
|
||||
numbers=left,
|
||||
numberstyle=\tiny,
|
||||
stepnumber=1,
|
||||
numbersep=5pt,
|
||||
}
|
||||
\begin{lstlisting}[caption=InfluxDB Flux Beispiel {Quelle: \cite[][]{InfluxAPIPythonClient}}, firstnumber=1, label=list:influxFlux],
|
||||
from(bucket:"test-bucked")
|
||||
|> range(start: -1h)
|
||||
|
||||
from(bucket:"test-bucked")
|
||||
|> range(start: -1h, stop: -10m)
|
||||
|
||||
from(bucket:"test-bucked")
|
||||
|> range(start: 2022-06-30T00:00:00Z, stop: 2022-06-30TT12:00:00Z)
|
||||
|
||||
from(bucket: "test-bucked")
|
||||
|> range(start: -15m)
|
||||
|> filter(fn: (r) => r._measurement == "cpu" and r._field == "cpu-total")
|
||||
|> yield()
|
||||
|
||||
\end{lstlisting}
|
||||
\end{figure}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\clearpage
|
||||
|
||||
|
||||
\anhang{InfluxDB Webinterface Screenshot}
|
||||
|
||||
\begin{figure}[hbt]
|
||||
|
|
|
@ -24,7 +24,7 @@ Möglichkeiten. Die Einfachste ist es, über das Web \gls{UI} von InfluxDB einen
|
|||
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}}
|
||||
|
||||
\subsubsection{Line Protokoll}
|
||||
\subsection{Line Protokoll}
|
||||
|
||||
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
|
||||
|
@ -57,25 +57,51 @@ Tokens. Mit einem Klick auf Generate API Token kann dann ein API Token erstellt
|
|||
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}}
|
||||
|
||||
\subsection{{Daten abrufen}}
|
||||
\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/
|
||||
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
|
||||
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
|
||||
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.
|
||||
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}}
|
||||
%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}}
|
||||
|
||||
%InfluxDB QUerrys Flux
|
||||
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}}
|
||||
|
||||
\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.
|
||||
werden alle benötigten Packte 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. 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 URL in Variablen geschrieben. Was in die Variablen eingetragen werden muss wird im
|
||||
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
|
||||
Kapitel Daten einfügen %eventuell Link einfügen?
|
||||
beschreiben.
|
||||
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.
|
||||
|
@ -84,13 +110,17 @@ Dazu wird in Zeile 17 bis 19 der Datenpunkt erstellt. An diesen Datenpunkt kann
|
|||
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.
|
||||
|
||||
\subsection{{Daten verarbeiten und visualisieren}}
|
||||
Um die so in die Datenbank geschrieben 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.
|
||||
\footnote{\cite[vgl.][]{InfluxAPIPythonClient}}
|
||||
|
||||
%InfluxDB Tasks
|
||||
% InfluxDB Graphen
|
||||
|
||||
\subsection{{weitere InfluxDB-Funktionen}}
|
||||
|
||||
%\subsection{{weitere InfluxDB-Funktionen}}
|
||||
% Dafür habe ich keinen Platz mehr.
|
||||
% Monitoring und Alamierung mit InfluxDB
|
||||
% InfluxDB Notebooks
|
||||
|
||||
|
@ -184,13 +214,14 @@ Spalten der Tabelle sind in der \cref{tab:file-stations} beschreiben.
|
|||
\end{minipage}
|
||||
\end{table}
|
||||
|
||||
\clearpage
|
||||
|
||||
%\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 URL ausgelesen. Die so gewonnen URLs können dann mithilfe einer Schleife heruntergeladen werden.
|
||||
Um den Messwerten eine Station zuzuordnen zu können wird als erstes die Datei mit den Station verarbeitet. Für jede Station wird Objekt erstellt und in ein
|
||||
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.
|
||||
|
@ -199,3 +230,4 @@ umgewandelt. Das so erzeugte Dataframe wir im letzten Schritt mit den Daten der
|
|||
Weitere Erklärungen und der Code selbst kann im angehängten Jupyter notebook eingesehen und ausgeführt werden.
|
||||
|
||||
\subsubsection{{Wetterdaten Verarbeiten}}
|
||||
|
||||
|
|
|
@ -1,5 +1,29 @@
|
|||
%!TEX root = ../Thesis.tex
|
||||
|
||||
|
||||
|
||||
\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.
|
||||
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.
|
||||
|
||||
\section{Zusammenfassung}
|
||||
|
||||
Dieses Dokument ist eine Hilfe, um die Formalien für eine Bachelor-Thesis an der
|
||||
FHDW bei der Verwendung von {\LaTeX} zu erfüllen und dabei möglichst viele Automatismen von {\LaTeX} zu nutzen. Eine Absprache mit dem betreuenden Professor ist dennoch ratsam.
|
||||
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
|
||||
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
|
||||
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
|
||||
auf \gls{TSDB} zu setzen.
|
|
@ -1,5 +1,6 @@
|
|||
\newacronym{TSDB}{TSDB}{Time Series Database}
|
||||
\newacronym[\glslongpluralkey={Deutschen Wetterdienstes}]{DWD}{DWD}{Deutscher Wetterdienst}
|
||||
\newacronym[\glslongpluralkey={Uniform Resource Locator}]{URL}{URL}{Uniform Resource Locator}
|
||||
\newacronym{DBMS}{DBMS}{Datenbank Management System}
|
||||
\newacronym{IOT}{IOT}{Internet of Things}
|
||||
\newacronym{RDBMS}{RDBMS}{Relational Database Management System}
|
||||
|
|
|
@ -67,6 +67,24 @@ year = {2022},
|
|||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxExecQuery,
|
||||
author = {Influxdata},
|
||||
title = {{Execute queries}},
|
||||
url = {https://docs.influxdata.com/influxdb/cloud/query-data/execute-queries/},
|
||||
urldate = {2022-06-21},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxFluxQuery,
|
||||
author = {Influxdata},
|
||||
title = {{Query InfluxDB with Flux}},
|
||||
url = {https://docs.influxdata.com/influxdb/cloud/query-data/get-started/query-influxdb/},
|
||||
urldate = {2022-05-21},
|
||||
year = {2022},
|
||||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxAPIPythonClient,
|
||||
author = {Influxdata},
|
||||
title = {{Python client library}},
|
||||
|
@ -121,6 +139,24 @@ year = {2021},
|
|||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxDBDataExplorer,
|
||||
author = {Influxdata},
|
||||
title = {{Explore metrics with InfluxDB}},
|
||||
url = {https://docs.influxdata.com/influxdb/cloud/visualize-data/explore-metrics/},
|
||||
urldate = {2022-05-20},
|
||||
year = {2021},
|
||||
keywords = {web}
|
||||
}
|
||||
|
||||
@misc{InfluxDBGraph,
|
||||
author = {Influxdata},
|
||||
title = {{Visualization types}},
|
||||
url = {https://docs.influxdata.com/influxdb/cloud/visualize-data/visualization-types/},
|
||||
urldate = {2022-05-20},
|
||||
year = {2021},
|
||||
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)?}},
|
||||
|
@ -157,6 +193,9 @@ year = {2019},
|
|||
keywords = {web}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@misc{SamFangman2019,
|
||||
author = {Sam Fangman},
|
||||
title = {{The Time Has Come for a New Type of Database}},
|
||||
|
|
Reference in a new issue