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.
Inhaltsverzeichnis
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
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.
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())
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.
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.
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:
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
Quellen:
- https://dev.azure.com/tankerkoenig/_git/tankerkoenig-data (01.09.2022 19:30)
- https://creativecommons.tankerkoenig.de/ (01.09.2022 19:25)
- https://www.projectpro.io/recipes/connect-mysql-python-and-import-csv-file-into-mysql-and-create-table (02.09.2022 15:00)
- https://mariadb.com/de/resources/blog/how-to-connect-python-programs-to-mariadb/ (02.09.2022 15:52)
- https://stackoverflow.com/questions/73244027/character-set-utf8-unsupported-in-python-mysql-connector (02.09.2022 16:15)