Forum: PC-Programmierung Python Uncertainties mit DataFrames


von Kolja L. (kolja82)


Lesenswert?

Hallo

Ich versuche gerade mit de ufloat() Funktion von Python zu  arbeiten.
https://pythonhosted.org/uncertainties/

Leider schaffe ich es nicht die Funktion mit Werten aus meinem DataFrame 
zu füttern:
1
import uncertainties
2
from uncertainties import ufloat
3
import pandas as pd
4
5
Messwert_Fehler_relativ = 0.01
6
Messwert_Fehler_absolut = 1
7
8
d = {'Messwert': [11, 10,12,10,13,12]} 
9
df = pd.DataFrame(data=d)
10
11
df['Messwert_Fehler_gesamt']  = Messwert_Fehler_absolut + Messwert_Fehler_relativ * df['Messwert']
12
13
ufloat_Messwert               = df['Messwert']
14
ufloat_Messwert_Fehler_gesamt = df['Messwert_Fehler_gesamt']
15
16
df['Messwert_ufloat']         = ufloat(ufloat_Messwert,ufloat_Messwert_Fehler_gesamt)

Das ergibt eine sehr lange Fehlermeldung, hier nur ein Ausschnitt:
1
TypeError: cannot convert the series to <class 'float'>
2
3
During handling of the above exception, another exception occurred:
4
5
AttributeError                            Traceback (most recent call last)
6
<ipython-input-50-854f2c05ffa5> in <module>
7
      2 ufloat_Messwert_Fehler_gesamt = df['Messwert_Fehler_gesamt']
8
      3 
9
----> 4 df['Messwert_ufloat'] = ufloat(ufloat_Messwert,ufloat_Messwert_Fehler_gesamt)

Kann das jemand in seinem Notebook nachvollziehen?

Oder hat sogar jemand eine Lösung dafür?

Danke Kolja

: Bearbeitet durch User
von imonbln (Gast)


Lesenswert?

Kolja L. schrieb:
> df['Messwert_ufloat'] =
> ufloat(ufloat_Messwert,ufloat_Messwert_Fehler_gesamt)

ich denke das diese ufloat nicht damit klarkommt das du ein Dataframe da 
rein stopfen willst. den Dataframe kannst du dir vereinfacht als Liste 
Vorstellen und die Showcase auf deren Seite zeigen alle nur den Umgang 
mit int oder Float. auch das Zuweisen von df['Messwert_ufloat'] der 
reihe auf einen Funktionsaufruf macht wahrscheinlich wenig Sinn.

Generell sieht es mir so aus als würdest du deine DataFrames als Series 
verwenden.

Probier mal folgendes:
1
df['Messwert_ufloat'] = df.apply(lambda x: ufloat(x['Messwert'], x['Messwert_Fehler_gesamt']), axis=1)

von Kolja L. (kolja82)


Lesenswert?

Hallo imonbln

Danke!
Ich verstehe zwar nicht so ganz wie dein Code funktioniert, aber er 
funktioniert!

Gruß Kolja

von Kolja L. (kolja82)


Lesenswert?

Noch eine kleine Frage:

Ich möchte mit den fehlerbehafteten Werten rechnen, hier nur 
beispielhaft eine Summe bilden, und das Ergebnis dann, inkl 
Fehlerbalken, plotten.

Wenn ich die df's plotte funktioniert es auch,
das Ergebnis der Berechnung geht aber nicht.

Hier mal mein Beispiel:
1
## geht nicht..., geht doch :-)
2
3
import uncertainties
4
from uncertainties import ufloat
5
import pandas as pd
6
import matplotlib.pyplot as plt
7
8
## Funktionen
9
10
def extract_errors(value):
11
    error = value.error_components()[value]
12
    return error
13
14
## Daten
15
16
Messwert_Fehler_relativ = 0.01
17
Messwert_Fehler_absolut = 1
18
19
d = {'Messwert': [11, 10,12,10,13,12]} 
20
df = pd.DataFrame(data=d)
21
22
23
## Berechnungen 
24
25
df['Messwert_Fehler_gesamt']  = Messwert_Fehler_absolut + Messwert_Fehler_relativ * df['Messwert']
26
27
ufloat_Messwert               = df['Messwert']
28
ufloat_Messwert_Fehler_gesamt = df['Messwert_Fehler_gesamt']
29
30
df['Messwert_ufloat']          = df.apply(lambda x: ufloat(x['Messwert'], x['Messwert_Fehler_gesamt']), axis=1)
31
32
Summe = df['Messwert_ufloat'].sum()
33
34
Summe_Fehler = Summe.apply(extract_errors)
35
36
37
 
38
39
Summe.plot(kind='bar', yerr=Summe_Fehler.values.T, alpha = 0.5,error_kw=dict(ecolor='k'))
40
plt.show()
41
42
Summe

Der Fehler:

------------------------------------------------------------------------ 
---
AttributeError                            Traceback (most recent call 
last)
<ipython-input-111-c3980e79ad11> in <module>
     32 Summe = df['Messwert_ufloat'].sum()
     33
---> 34 Summe_Fehler = Summe.apply(extract_errors)
     35
     36

AttributeError: 'AffineScalarFunc' object has no attribute 'apply'



Mache ich nen Denkfehler?

von imonbln (Gast)


Lesenswert?

Kolja L. schrieb:
> Ich verstehe zwar nicht so ganz wie dein Code funktioniert, aber er
> funktioniert!

Dann solltest du die Pandas Dokumentation lesen oder ein Buch zu den 
Thema deiner Wahl, das ist keine Rocket Science.


Kolja L. schrieb:
> AttributeError: 'AffineScalarFunc' object has no attribute 'apply'

hier Hilft dir google, AffineScalarFunc ist ein Objekt deiner Komischen 
Libary (von der ich noch nie Gehört hab), seh mal nach was die sum in 
der Zeile zuvor für ein Datentyp liefert, das ist sicher nichts mit dem 
pandas umgehen kann und der grund für den Fehler.

von imonbln (Gast)


Lesenswert?

Nachtrag

https://pythonhosted.org/uncertainties/user_guide.html zeigt im Beitrag 
Arrays of numbers with uncertainties deutlich das, bei der sum Operation 
von numpy oder pandas beim printen ein string erzeugt wird.

Der meine Vermutung untermauert das Summe vom Type AffineScalarFunc ist, 
das kannst du z.b mit type(Summe) Prüfen, und dir(Summe) dürfte dir dann 
sagen das AffineScalarFunc keine apply methode hat, damit dürfte klar 
sein das du einen Denkfehler hast.

Vielleicht hilft es wenn du uns verraten würdest was dein Ziel ist, 
willst du  für die uncertainties lib werben, dann bist du ziemlich 
ungeschickt ;) oder hast du ein Problem zu lösen, dass vielleicht diese 
Lib gar nicht braucht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.