Probleme beim Runden (pandas.sum)

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

KrachBumm hat geschrieben:In Excel sind es nur 3 bzw 2 Nachkommastellen. Und meine Kollegin möchte das auch so gerechnet haben. Ich lese auch die Excel über pandas ein, soweit bin ich auch schon gekommen ^^
@KrachBumm: Tabellenkalkulationen bieten zur Berechnung oft die Option "Rechne mit Genauigkeit wie angezeigt". Damit eben das selbe Ergebnis rauskommt, wie es der menschliche Buchhalter mit Bleistift und Papier ausrechnen würde. Möglicherweise nutzt ihr diese Einstellung, denn für Fakturierungen ist es wichtig mit einer festgelegten Zahl signifikanter Stellen zu rechen; für wissenschaftliche Anwendungen gilt dies eher weniger. Und mit den hardwareunterstützten Zahlenformaten, die Pandas (resp. numpy) nutzt, ist dies auch nicht möglich.

Ob dies die Größenordung der von Dir beobachteten Differenzen erklärt, ist ohne Einsicht in die Daten nicht zu eindeutig beantworten.

Aber nehmen wir einmal an, die Angaben für KWs wären auf drei Nachkommastellen genau. Dann beträgt die größte Abweichung zwischen der internen Darstellung und der angezeigten kaufmännischen Rundung 0.0005. Gehen wir von diesem Wert aus und nehmen zudem an, diese Differenz wäre für alle Werte konstant und ginge in die gleiche Richtung. Weiter nehmen wir an, Pandas würde mit der internen Genauigkeit rechen, Excel (oder Deine Kollegin) dagegen mit der Genauigkeit der angezeigten kaufmännischen Rundung. Bei 400.000 Zahlen beträgt der maximale Fehler dann 200 KW, was gemäß Deinen Angaben sogar einen Unterschied von 50.000 € ausmacht.

D.h. Deine Abweichungen sind zumindest plausibel unter der Annahme, dass Excel nur mit der angezeigten Genauigkeit rechnet, diese Daten aber ohne jede Rundung exportiert (in Deinem Fall an Pandas).

Für solche kaufmännische Berechnungen bietet Python das Modul Decimal.
BlackJack

@kbr: Naja, statt Decimal dann wohl doch eher vor dem Summieren runden. Denn das wird Excel ja sehr wahrscheinlich auch ”nur” machen. Oder rechnet das nicht mit der Gleitkommazahlenrepräsentation die vom Prozessor direkt unterstützt wird?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

BlackJack hat geschrieben:@kbr: Naja, statt Decimal dann wohl doch eher vor dem Summieren runden. Denn das wird Excel ja sehr wahrscheinlich auch ”nur” machen. Oder rechnet das nicht mit der Gleitkommazahlenrepräsentation die vom Prozessor direkt unterstützt wird?
Das weiß ich nicht. Bei Fakturierungen im float-Format habe ich früher mit Schutzstellen gerechnet, da es ansonsten früher oder später zu Abweichungen kam. Aber auch das kann Tücken haben und die Nutzung von Decimal ist da wirklich entspannter.
BlackJack

@kbr: Aber auch deutlich langsamer. Da würde ich wahrscheinlich rechnen mit ganzen Zahlen vorziehen.
KrachBumm
User
Beiträge: 18
Registriert: Mittwoch 27. Juli 2016, 07:50

@Sirius

Ich hol jetzt mal bischen aus, damit das alles nachvollziehbar ist.

Die erste Datei die ich bekomme beinhaltet ca. 400000 Datensätze zu 20 Technikarten mit ca. 35 Spalten. Diese lese ich in ein Dataframe ein und lösche die Spalten raus, die ich nicht brauche für die Berechnung und habe dann noch 10 Spalten.

Danach erstelle ich mir anhand der Technikart 20 kleinere Dataframes je nach Technikart.

Pro Dataframe läuft dann der Filterprozess nach Bestellwert in KW und Euro und Messwert nach KW und Euro. Das ergibt vier Dataframes, die ich einzeln aufsummiere und ich einer Excel wieder ausgebe.

Die gefilterten Zahlen stimmen soweit überein.

Hier mach ich jetzt mal einen Cut!

Ich bin grade dabei die Berechnung innerhalb von Excel von meiner Kollegin nachzuvollziehen, da ich auch mit Numpy die gleichen Werte bekomme mit nur 2 bzw 3 Nachkommastellen.

Sorry, dass die Antwort jetzt so lange gedauert hat, aber ich habe mich noch mit Kollegen ausgetauscht.

Ich poste hier, ob ich den Fehler innerhalb ihrer Excel-Berechnung gefunden habe.
KrachBumm
User
Beiträge: 18
Registriert: Mittwoch 27. Juli 2016, 07:50

So,

ich habe nun wirklich alle Fehlerquellen durchsucht und es war etwas ganz anderes.

Ich hatte dubletten in meiner Zuordnungsdatei drin, was zur Dopplung von Werten geführt hat, was wiederum zur Verfälschung der Ergebnisse geführt hat. Vielen Dank nochmal an euch für eure Hilfe und eure Erläuterungen in diesem Fall.

Und sorry für die teilweise dummen Fragen von mir ;)

lg

Damian
Antworten