Pytables Daten auslesen und vergleichen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Kopflos
User
Beiträge: 8
Registriert: Mittwoch 9. November 2011, 11:40

Hallo,

ich habe gerade folgendes Problem bei Pytables:
Ich habe eine Tabelle in der ich Parameter einer Funktion speichere und jeden Zeile hat noch eine ID. Nun möchte ich, dass meine Programm eine neue Zeile erstellt, wenn es die Funktion mit den Parametern zum ersten mal aufruft und wenn es diese Parameter schon gibt, soll es die ID zurück geben. Nun habe ich ein Problem welches wahrscheinlich nicht nur bei Pytables auftritt, sondern allgemein bei dem Vergleich von verschiedenen Datentypen.
Ein Parameter ist bei mir 0.3 groß, wenn ich ihn nun in Pytables als Float32 speichere, speichert er den Wert als 0.29999.. und somit würde mein Programm immer wieder eine neue Zeile erstellen weil dieser Wert ungleich 0.3 ist. Gibt es für dieses Problem vielleicht eine allgemeine Lösung oder hat jemand eine Idee wie ich dieses Problem lösen könnte?

Im voraus schon mal danke für alle hilfreiche Antworten
Kopflos
User
Beiträge: 8
Registriert: Mittwoch 9. November 2011, 11:40

Ok, sorry für die Frage habe es nun selber lösen können :)
BlackJack

@Kopflos: Ich weiss ja nicht wie Du es nun gelöst hast, aber wahrscheinlich war das kein Problem, denn 0.3 lässt sich als `float` mit einer binären Repräsentation nicht verlustfrei darstellen, egal wie viele Bits man dafür her nimmt:

Code: Alles auswählen

In [34]: 0.3
Out[34]: 0.29999999999999999
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Möglicherweise kannst du deine Zahlen als Strings in der Datenbank speichern, und dann mit dem `decimal`-Modul arbeiten.
BlackJack

@nomnom: Das würde dem Sinn von `pytables` ein wenig widersprechen. Das Format nimmt man in der Regel wenn man viele numerische Werte hat, die man in (oft mehrdimensionalen) Arrays effizient speichern und verarbeiten möchte. Zeichenketten und `decimal` sind davon so ziemlich das Gegenteil. :-)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

BlackJack hat geschrieben:@nomnom: Das würde dem Sinn von `pytables` ein wenig widersprechen. Das Format nimmt man in der Regel wenn man viele numerische Werte hat, die man in (oft mehrdimensionalen) Arrays effizient speichern und verarbeiten möchte. Zeichenketten und `decimal` sind davon so ziemlich das Gegenteil. :-)
Das wusste ich nicht. :) Aber wenn man die Genauigkeit braucht …
Kopflos
User
Beiträge: 8
Registriert: Mittwoch 9. November 2011, 11:40

@ BlackJack: Ja ich habe gerade ein klein wenig Probleme mit dem "float". Ich speichere die 0.3 als Float32 und wenn ich sie mir dann aber auslese ist es wieder vom Type "np.float64" aber ungleich mit np.float64(0.3). Muss mir nun mal überlegen wie ich das nun am elegantesten löse.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Kopflos: Grundsätzlich vergleicht man Fließkommazahlen mit Fehlertoleranz, z.B.: `abs(zahl1 - zahl2) < 1e-3`. Was du beschreibst klingt etwas nach Look-up Tabellen. Hier würde es sich anbieten mit Intervallen zu arbeiten.
Antworten