Problem mit SQLite - Join

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

Hallo,

ich habe in einer SQLite DB für jeden Tag eine Tabelle mit zwei Spalten "Gesamt_Datum_x", "Datum_x" und "Basis" als Index

Mit folgendem Code mache ich eine JOIN-Abfrage aus zwei Tabellen:

Code: Alles auswählen

import pandas as pd
import sqlite3

sql = """
              SELECT
                Gesamt_Datum_x, Gesamt_Datum_y
              FROM Historie_2018_11_20
              INNER JOIN Historie_2018_11_21 on Historie_2018_11_21.Basis = Historie_2018_11_20.Basis
        """

conn = sqlite3.connect("Historie.db")
df = pd.read_sql_query(sql, conn)
print(df)
Das liefert mir zumindest die gewünschten Datensätze:

Code: Alles auswählen

    Gesamt1  Gesamt2
0      -668     -710
1     15037    15362
2     -4199    -3783
3     -5726    -6690
4     -2936    -3063
5      -570      152
6     -3532    -1746
7      1288      174
8       -21     -231
usw.

Ärgerlich ist jetzt nur, dass der Index des DataFrames jetzt in Standardform gesetzt wird. Ich bräuchte den Originalindex aus der DB, nämlich die Indesxspalte "Basis"

Könnte mir hier jemand bitte einen Tipp geben. Danke
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SautaRoc: Dann müsstest Du `Basis` auch selektieren und bei `read_sql_query()` angeben, dass das diese Spalte der Index sein soll.

Das Du da Datumsangaben in Tabellennamen hast, riecht nach einem falschen Datenbankentwurf.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

'Basis' zu selektieren klappt leider nicht, da die Spalte in beiden Tabellen 'Basis' heisst. Was mich vor allem stört, ist der Umstand, dass ich die DB aus einem DataFrame erstellt habe und in dem Ursprungs-DataFrame 'Basis' auch als Index definiert war und als solcher auch in der DB-Struktur steht. Meine Vorstellung war, dass beim zurücklesen in ein pd.DataFrame dies auch erkannt wird...


Bezüglich der Datumsangaben: Im Grunde schreibe ich nur täglich Daten mit um dann jeweils aus den letzen drei Tagen eine Veränderungsberechnung durchzuführen - hätte ich auch Tag1, 2, 3.... nennen können. Wäre vielleicht damit sogar einfacher die letzten drei Tabellen auszuwählen, wenn man die Zahl des zuletzt geschriebenen Tages in z.b. eine pickle wegschreibt
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SautaRoc: Wieso klappt das nicht? Klar Du musst das explizit aus einer der beiden Tabellen selektieren, da aber über diese Spalte ge-joined wird, ist ja egal welche Tabelle Du dafür heranziehst, die Werte sind ja gleich.

Wie soll denn `pd.read_sql_query()` auf magische Weise an `Basis` herankommen wenn das überhaupt nicht selektiert wird. Das verarbeitet ja nur das Ergebnis der SQL-Anweisung die Du geschrieben hast. Und da wird nun mal nur `Gesamt_Datum_x` und `Gesamt_Datum_y` selektiert. Wo mich jetzt auch wundert wo dann die Namen `Gesamt1` und `Gesamt2` im Dataframe her kommen‽

Auch bei Tag1, 2, 3, … wären das Daten in Tabellennamen die nicht in die Namen sondern in *eine* Tabelle gehören würden. Und damit würde man Informationen wegwerfen, IMHO ohne einen guten Grund. Und wenn das ein Datum in *der* Tabelle wäre, könnte man auch ohne noch ein zusätzliches Pickle die letzten drei Tage auswählen, eben einfach per SQL.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

@ blackjack Danke für die Tipps. Ich werde das nochmal überdenken. Diese DB-Geschichte ist was komplett neues für mich. Ich verstehe deine Logik und werde versuchen, dass nochmal anders aufzuziehen.
Antworten