2016-07-08 19 views
0
verwaltet werden

habe ich nur dieses Datenrahmen einen Algorithmus für die Statistik zu testen:Numpy Schwimmer Speicher in Datenrahmen scheint falsch

d1=pd.DataFrame([[0.1,0.2],[0.3,0.4],[0.5,0.6],[0.7,0.8],[0.9,0.81],[0.91,0.82],[0.93,0.94],[0.95,0.96],[0.97,0.98],[0.99,1]]) 

Hinweis:

  • d1.iloc[0,1] ergibt 0.20000000000000001
  • d1.iloc[2,1] Ausbeuten 0.59999999999999998

Durchführung

d1=pd.DataFrame([[0.1,0.2],[0.3,0.4],[0.5,0.6],[0.7,0.8],[0.9,0.81],[0.91,0.82],[0.93,0.94],[0.95,0.96],[0.97,0.98],[0.99,1]]).astype(np.float) 

oder

d1=pd.DataFrame([[0.1,0.2],[0.3,0.4],[0.5,0.6],[0.7,0.8],[0.9,0.81],[0.91,0.82],[0.93,0.94],[0.95,0.96],[0.97,0.98],[0.99,1]], dtype=np.float) 

ändert nicht die Ergebnisse

Auf der anderen Seite, b=np.float(0.2) und c=np.float(0.6) richtigen Werte geben, wenn daran erinnert.

Habe ich etwas übersehen oder gibt es wirklich ein Problem mit der Datenverwaltung in Pandas? Es ist sehr wichtig für mich, da ich Präzision für meine Daten brauche.

Dank

+0

Dies ist kein "Datenmanagement". So funktionieren [Fließkommazahlen] (https://en.wikipedia.org/wiki/Floating_point). Das Runden ist nicht ausschließlich für Zahlen oder Pandas; Alle Softwaresysteme sind dafür anfällig. Wenn Sie wirklich ein Beispiel dafür sehen wollen, sehen Sie sich einfach 'd1.iloc [0,1] - b' an. – chrisaycock

+0

Ich wollte nicht, dass bestimmte Elemente der DF falsch waren. Alle sind. Während die gleichen Zahlen in numpy.floats nicht falsch sind. Das ist also kein Problem mit der fp-Nummer. Dies geschieht nur, wenn np.floats aus Pandas extrahiert werden. –

+3

Beachten Sie zuerst, dass "np.float" Pythons eingebautes 'float' ist, also können wir einfach' d1.iloc [0,1] 'mit' 0.2' vergleichen. Dann beachte, dass 'd1.iloc [0,1] == 0.2' 'True' ist. Die im Speicher gespeicherten Gleitkommawerte sind genau gleich. Der Unterschied besteht darin, wie die Werte gedruckt werden. Pythons Code zum Erstellen einer Darstellung eines Gleitkommawerts als Zeichenfolge ist intelligenter als der Code von Numpy. Der Python-Code verwendet die kürzeste Zeichenfolge, die den Gleitkommawert eindeutig identifiziert. Wenn sie in einen 64-Bit-Gleitkommawert umgewandelt werden, ergeben "0,20000000000000001" und "0,2" den * gleichen * 64-Bit-Wert. –

Antwort

1

Mit np.array statt Pandas, die Anzeige eines Elements vergleichen:

x=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6],[0.7,0.8],[0.9,0.81],[0.91,0.82],[0.93,0.94],[0.95,0.96],[0.97,0.98],[0.99,1]]) 

x[0,1] 
Out[47]: 0.20000000000000001 

float(x[0,1]) 
Out[48]: 0.2 

np.float(x[0,1]) # np.float32 
Out[49]: 0.2 

np.float64(x[0,1]) 
Out[50]: 0.20000000000000001 

Wenn die vollen 64 zeigt, sehen wir, dass zusätzliche Werte ungleich Null am Ende aus, aber mit dem kurzen 32 Typ wir nicht.

Dies ist die gleiche Information, die Warren in Kommentaren zur Verfügung gestellt hat.

+0

Ok, danke an euch beide. Das ist also eine Frage oder eine Darstellung, die die Berechnung nicht beeinflussen sollte, oder? Wie kann ich also vermeiden, dass diese Werte in Papieren gedruckt werden? nur am Ende in float oder np.float32 konvertieren? Was ist, wenn die Werte außerhalb ihrer Bereiche liegen? Weil ich den technischen Punkt verstehe, aber es gibt ein Problem, weil diese Werte gedruckt werden können. Dann werden sie zu einem Fehler, selbst wenn sie in der Berechnung sind, haben sie Recht, weil sie Ihr Endergebnis sein können. Dies ist besonders ärgerlich, wenn Werte verwendet werden, von denen jeder weiß, dass sie abgerundet werden sollten. –