IT Projekte / Home Lab / Smart Home / Games

Allgemein, Raspberry Pi

Tankerkönig Daten speichern

In diesem Beitrag möchte ich Dir zeigen, wie Du Dir die Spritpreise der letzten Jahre in einem MariaDB speichern kannst.
Ich weiß nicht wie es Dir geht, aber ich habe mich gefragt, wie haben sich die Preise entwickelt und wann sind sie im Durchschnitt am günstigsten. Das Repository von Tankerkönig lade ich kostenlos herunter und aktualisiere dies einmal am Tag. Im nachfolgenden Beitrag werde ich Dir zeigen, wie Du die Daten grafisch darstellen kannst.

Du benötigst Folgendes:

  • Einen Raspberry Pi 4 oder einen anderen Computer
  • eine Linux Distribution. Zum Beispiel Debian
  • Git installiert
  • MariaDB

Debian installieren
Raspberry Pi OS 64 Bit auf einem Raspberry Pi 4 installieren

1. Tankerkönig Daten herunterladen

Erstelle zu Beginn einen ordner in dem Du die Daten speichern möchtest. Die Daten von Tankerkönig lädst Du mit git clone herunter, um im in Zukunft einmal am Tag einen pull durchführen zu können.

mkdir tankerkoenig

cd tankerkoenig

git clone https://tankerkoenig@dev.azure.com/tankerkoenig/tankerkoenig-data/_git/tankerkoenig-data
Erstelle einen Ordner.
Erstelle einen Ordner.
Lade die Tankerkönig-Dateien herunter.
Lade die Tankerkönig-Dateien herunter.
Ordnergröße
Ordnergröße

Der Download kann lange dauern, da Du ca. 65 GB an Daten herunterlädst. Zu diesem Zeitpunkt, da wir Daten sammeln, werden es nach und nach mehr werden.

1.1 Erstelle einen Cronjob

Erstelle nun einen Cronjob, um einmal am Tag, das Tankerkönig-Repository zu aktualisieren. Öffne hierzu den crontab.

crontab -e

Im Crontab legst Du folgenden Befehl an:

0 3 * * * git -C <Pfad zu Deinen Verzeichnis tankerkoenig-data> pull

Dieser Befehl wird jeden Tag um 3 Uhr morgens ausgeführt.

Cronjob anlegen.
Cronjob anlegen.
Ausführung des Befehls zum Test.
Ausführung des Befehls zum Test.

2. Tankerkönig Daten importieren

Zum Importieren der CSV-Dateien musst Du Dir zunächst Python und folgende Python Programme herunterladen:
!Achtung! Zum aktuellen Zeitpunkt (02.09.2022) gibt es Probleme mit der mysql-connector-python 8.0.30 Version.

sudo apt-get install python3

pip3 install mysql-connector-python

pip3 install mysql-connector-python==8.0.29

pip3 install pandas

2.1 Erstelle ein Python Programm

Um unser Python Programm zu schreiben, erstelle eine neue Datei mit der Endung .py.

nano setup.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pandas as pd

data = pd.read_csv('/<Dein Pfad>/tankerkoenig-data/prices/2022/09/2022-09-01-prices.csv', index_col=False, delimiter = ',')
data.head()
print(data.head())
Test Setup
Test Setup

Diesen Befehl speicherst Du mit Strg + S und Strg + X. Danach führst Du die Datei einmal aus.

python3 <Dein Dateiname>
python3 setup.py

Wie Du sehen kannst, wurde die CSV-Datei ausgelesen und erfolgreich ausgegeben. Im nächsten Schritt bindest Du Deine MariaDB mit an.

Ausgabe aus dem Skript.
Ausgabe aus dem Skript.
nano setup.py

Ersetze Deinen Code mit folgendem bzw. ergänze diesen:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pandas as pd
import sys
import mysql.connector
from mysql.connector import Error

data = pd.read_csv('/<Dein Pfad>/tankerkoenig-data/prices/2022/09/2022-09-01-prices.csv', index_col=False, delimiter = ',')
data.head()
print(data.head())

#Connect to MariaDB
try:
   print("Connect to MariaDB")
   conn = mysql.connector.connect(

      #Bitte ausfüllen
      user= "",
      password= "",
      host= "",
      port= 3306
   )
   #Create new Database
   if conn.is_connected():
      cursor = conn.cursor()
      cursor.execute("CREATE DATABASE IF NOT EXISTS tankerkoenig")
      print("Database is created if not exists")

except Error as e:
   print("Error connecting to MariaDB Platform: %s" % (e))
   sys.exit(1)

Speicher diesen ebenfalls wieder ab und führe dann Deine Datei erneut aus. Wie Du im phpMyAdmin sehen kannst, wurde die Datenbank angelegt.

Datenbank wurde angelegt.
Datenbank wurde angelegt.

Du lädst die CSV-Datei nun in pandas array. Ebenfalls stellst Du eine Verbindung zu Deiner MariaDB her und erstellst im Anschluss eine Datenbank. Im nächsten Schritt legst Du eine Tabelle anhand der CSV-Datei an und speicherst die Daten darin ab. Das Auslesen und speichern einer einzelnen Datei, aus dem Jahr 2022, hat bei mir auf dem Raspberry Pi 4 B 4 GB ca. 15 Minuten gedauert.

Der Code sieht wie folgt aus:


#!/usr/bin/python
# -*- coding: utf-8 -*-
import pandas as pd
import sys
import mysql.connector
from mysql.connector import Error
import datetime
import time
import os

data = pd.read_csv('/home/pi/tankerkoenig/tankerkoenig-data/prices/2022/09/2022-09-01-prices.csv', index_col=False, delimiter = ',')
data.head()
print(data.head())

#Connect to MariaDB
try:
   print("Connect to MariaDB")
   conn = mysql.connector.connect(
      user= "",
      password= "",
      host= "",
      port= 3306
   )
   #Create new Database
   if conn.is_connected():
      cursor = conn.cursor()
      cursor.execute("CREATE DATABASE IF NOT EXISTS tankerkoenig")
      print("Database is created if not exists")

      cursor.execute("select database();")
      record = cursor.fetchone()
      print("You're connected to database: ", record)

      print('Creating table....')
      cursor.execute("CREATE TABLE IF NOT EXISTS tankerkoenig.20220901prices(dt VARCHAR(255), station_uuid VARCHAR(255), diesel DOUBLE, e5 DOUBLE, e10 DOUBLE, dieselchange INT, e5change INT, e10change INT);")

      print("Table is created....")

      #loop through the data frame
      for i,row in data.iterrows():
          sql = "INSERT INTO tankerkoenig.20220901prices VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
          cursor.execute(sql, tuple(row))
          print("Record inserted")
          # the connection is not auto committed by default, so we must commit to save our changes
          conn.commit()

except Error as e:
   print("Error connecting to MariaDB Platform: %s" % (e))
   sys.exit(1)

Und das Ergebnis sollte nun so aussehen:

Die Tabelle wurde angelegt und die Daten gespeichert.
Die Tabelle wurde angelegt und die Daten gespeichert.

2.2 Daten Von Bis importieren

Wenn Du mehr als nur einen Tag mit einem Script in Deine Datenbank importieren möchtest, dann kannst Du folgendes Script anwenden:

Beachte ggf. startDate und endDate zu bearbeiten.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pandas as pd
from datetime import datetime, date, timedelta
import sys
import mysql.connector
from mysql.connector import Error
import os

# run all days from begin to end
#https://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python (15.12.2022 07:00)
def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)

# get curent date split string into integer
# https://stackoverflow.com/questions/32490629/getting-todays-date-in-yyyy-mm-dd-in-python (15.12.2022 16:45)
currentDate = datetime.today().strftime('%Y%m%d')

# https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3 (15.12.2022 16:40)
currentYear = currentDate[0:4]
currentMonth = currentDate[4:6]
currentDay = currentDate[6:8]

startDate = date(2014, 6, 8) #modify
endDate = date(currentYear, currentMonth, currentDay) #modify
#endDate = date(int(currentYear), int(currentMonth), int(currentDay))
for singleDate in daterange(startDate, endDate):
    finalDate = singleDate.strftime("%Y%m%d")
    #get selected year month and date
    year = finalDate[0:4] # 2014
    month = finalDate[4:6] # 06
    day = finalDate[6:8] # 08

    base = '/home/pi/tankerkoenig/tankerkoenig-data'
    prices = 'prices'
    finalDay = year + '-' + month + '-' + day + '-' + prices  #date /20xx-xx-xx-prices

    string = base + '/' + prices + '/' + year + '/' + month + '/' + finalDay + '.csv' #string = '/prices/2014/06/2014-06-08-prices'

    data = pd.read_csv(string, index_col=False, delimiter = ',') #data = pd.read_csv('/home/pi/tankerkoenig/tankerkoenig-data/prices/2014/06/2014-06-08-prices.csv', index_col=False, delimiter = ',')
    data.head()

    #Connect to MariaDB
    try:
       print("Connect to MariaDB")
       conn = mysql.connector.connect(
          user= "",
          password= "",
          host= "",
          port= 3306
       )
       #Create new Database
       if conn.is_connected():
          cursor = conn.cursor()
          cursor.execute("CREATE DATABASE IF NOT EXISTS tankerkoenig")
          print("Database is created if not exists")

          cursor.execute("select database();")
          record = cursor.fetchone()
          print("You're connected to database: ", record)

          print('Creating table....')

          #create create Table string
          createTable = 'CREATE TABLE IF NOT EXISTS tankerkoenig.' + year + month + day + prices + '(dt VARCHAR(255), station_uuid VARCHAR(255), diesel DOUBLE, e5 DOUBLE, e10 DOUBLE, dieselchange INT, e5change INT, e10change INT);'

          cursor.execute(createTable)  #cursor.execute("CREATE TABLE tankerkoenig.20220901prices(dt VARCHAR(255), station_uuid VARCHAR(255), diesel DOUBLE, e5 DOUBLE, e10 DOUBLE, dieselchange INT, e5change INT, e10change INT);")

          print("Table is created " + year + month + day + prices)

          #loop through the data frame
          for i,row in data.iterrows():
              insertInto = 'INSERT INTO tankerkoenig.' + year + month + day + prices + ' VALUES (%s,%s,%s,%s,%s,%s,%s,%s)'
              sql = insertInto #sql = "INSERT INTO tankerkoenig.20220901prices VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
              cursor.execute(sql, tuple(row))
              print("Record inserted" + year +month + day + prices)
              # the connection is not auto committed by default, so we must commit to save our changes
              conn.commit()

    except Error as e:
       print("Error connecting to MariaDB Platform: %s" % (e))
       sys.exit(1)

Dieses Script kannst Du auch in einem Screen laufen lassen. Installiere zunächst einmal screen hierzu und führe es dann mit folgendem Befehl aus:

sudo apt-get install screen

screen -dmS <Name> python3 <Dein Skript>
screen -dmS tankerkoenig python3 test.py

# den screen aufrufen
screen -r tankerkoenig