Spritpreise in Postgres DB schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
stony123
User
Beiträge: 1
Registriert: Sonntag 11. Mai 2025, 19:32

Moin zusammen,

für ein Projekt möchte ich Spritpreise (jeweils E10, E5 und Diesel) über einen längeren Zeitraum analysieren. Die Idee ist eine Anfrage an die Tankerkönig API zu schicken, die Response etwas zu verarbeiten und das Ergebnis in eine Postgres DB zu schreiben. Die Anfrage an die Tankerkönig API gibt mir ca. so eine Json Response:

{[{'id': 'a5d42567-f7c3-4b71-9725-5d41c563fe20', 'name': 'tankpoint Tankstelle', 'brand': 'tankpoint', 'street': 'Dorstener Straße', 'place': 'Bochum', 'lat': 51.511245351877, 'lng': 7.1905293250372, 'dist': 13.3, 'diesel': 1.459, 'e5': 1.649, 'e10': 1.589, 'isOpen': True, 'houseNumber': '476', 'postCode': 44809},
{'id': '77ba82e8-c8a1-4095-9373-af4b6167fdf1', 'name': 'Aral Tankstelle', 'brand': 'ARAL', 'street': 'Vestische Straße', 'place': 'Oberhausen', 'lat': 51.5095, 'lng': 6.865255, 'dist': 13.3, 'diesel': 1.509, 'e5': 1.699, 'e10': 1.639, 'isOpen': True, 'houseNumber': '157', 'postCode': 46117},
{'id': '7c018f63-bfc1-4629-a224-fb9e691886a8', 'name': 'TotalEnergies Recklinghausen', 'brand': 'TotalEnergies', 'street': 'Castroper Str.', 'place': 'Recklinghausen', 'lat': 51.604639, 'lng': 7.214727, 'dist': 13.4, 'diesel': 1.509, 'e5': 1.679, 'e10': 1.619, 'isOpen': True, 'houseNumber': '123', 'postCode': 45665}, ....]}

Ich möchte jetzt über jedes Element dieser Response gehen und für jede Tankstelle jeweils einen Eintrag in die DB schreiben mit dem e5, e10 und Diesel Preis. Am Ende soll also die DB folgende Einträge haben:

Eintrag 1: Name 1 | e5 Preis 1
Eintrag 2: Name 1 | e10 Preis 1
Eintrag 3: Name 1 | diesel Preis 1
Eintrag 4: Name 2 | e5 Preis 1
Eintrag 5: Name 2 | e10 Preis 1
Eintrag 6: Name 2 | diesel Preis 1
usw...

Wie würdet ihr das am Besten machen?

LG Tony
Benutzeravatar
sparrow
User
Beiträge: 4522
Registriert: Freitag 17. April 2009, 10:28

Zuerst einmal würde ich auf Wikipedia nach "Normaliserung (Datenbank)" suchen, den Artikel als Startpunkt verwenden und mir so das Wissen verschaffen, warum da kein "Name" in die Tabelle gehört und es da mindestens 3 Tabellen braucht: Tankstelle, Treistoff, Preis.

Und für den Rest zeigstdu am besten den Code, du schon hast, und wo du nicht weiter kommst - bzw. Fehlermeldungen auftreten.
imonbln
User
Beiträge: 189
Registriert: Freitag 3. Dezember 2021, 17:07

Ich würde die Aufgabe in Teilaufgaben zerlegen und diese dann angehen.

Das requests-module eignet sich zum Beispiel hervorragend, um die JSON Rest API abzufragen. Python bringt schon JSON Support mit damit kann das Empfangende JSON Objekt dann weiter verarbeitet werden und mit SQLAlchemy kannst du die Python Anbindung an Postgres machen.

btw. dein Tabellenentwurf für die Datenbank sieht etwas Lütt aus. Sicher das der Name reicht, was ist, wenn du zwei [hier Markenname einfügen] Tankstellen um die Ecke hast? Dann reicht der [Marken]name nicht. Ich denke, du solltest mindestens 2 Tabellen haben, einen welche den Standort beschreibt und eine weitere für die Preise (zwei währen besser). Außerdem willst du sicher noch eine Art Zeitstempel in den Daten haben um zu wissen, von wann der Preis ist. Vielleicht ist es sogar sinnvoll keine Postgres zu verwenden, das hängt aber von deinem weiteren Projekt ab, für Zeitreihen eignet sich zum Beispiel auch InfluxDB sehr gut.

Wie auch immer du das löst, dass Python Forum bietet Hilfe zur Selbsthilfe, von daher schlage ich vor du fängst einfach an und wenn du Detailfragen hast wie man etwas in Python macht, findest du hier sicher Hilfe.
Benutzeravatar
sparrow
User
Beiträge: 4522
Registriert: Freitag 17. April 2009, 10:28

Also bekennender PostgreSQL-Fanboy, der alles damit erschlägt: InfluxDB ist gut aber sehr spezifisch. PostgreSQL kann aber auch gut mit Zeitreihen umgehen, wenn man TimescaleDB verwendet. Wenn man also eh schon irgendwo Postgres einsetzt, zum Beispiel weil man die Transaktionssicherheit braucht oder eh mit Relationen arbeitet, kann man die Funktionalität für effektives Handling von Zeitreihen recht einfach nachrüsten.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

In diesem Zuge könntest du dir Timescale ansehen. Das ist eine Postgres-Variante, welche auf Zeitreihen spezialisiert ist, ähnlich zu InfluxDB, jedoch mit "normalem" SQL ansprechbar.
edit: @sparrow: Da hatten wir wohl dieselbe Idee :)
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@stony123: Ergänzend zum bisher geschriebenen würde ich noch die empfangenen JSON-Daten protokollieren, beispielsweise in dem man die noch mal in ein Wörterbuch steckt, wo die Daten und ein Zeitstempel drin steckt, wann die empfangen wurden. Eventuell dann als „JSON Lines“-Datei. Dann hat man die ganzen Daten und kann sich wenn man den Datenbankentwurf mal überarbeitet, daraus dann die DB wieder füllen.

Edit: Oder man kann dann mit den Daten auch mal andere Datenbanken/Konzepte ausprobieren.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
heyJo
User
Beiträge: 25
Registriert: Mittwoch 24. Januar 2018, 20:49
Wohnort: Köln

@stony123
Wenn dein eigentliches Ziel die Analyse der Daten ist, warum konzentriest du dich nicht darauf?
Ist es nicht einfacher, direkt die "Historische Preisdaten" vom Tankerkönig zu nehmen?

Einmal alle Daten geladen, könntest du ja ein Script schreiben, dass dir die Daten jeden Tag (oder wann auch immer) aktualisiert.

Ich denke, dass das Heraussuchen der Daten immer noch Herausforderung genug ist.
nezzcarth
User
Beiträge: 1739
Registriert: Samstag 16. April 2011, 12:47

Alternativ könnte man auch eine schemafreie Dokumentendatenbank nehmen oder die Daten in PostgreSQL in JSON-Felder werfen.
Antworten