iterrows

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Hallo,

ich versuche mit Hilfe von iterrows etwas auszurechnen...das Ergebnis stimmt aber definitiv nicht, ich weiß jedoch nicht woran es liegt. Kann mir jemand helfen?

Ausschnitt meiner Daten (mit dem Name betadf)


Bild


Beta1 Beta2 Beta3 Label
79 1.795854e-03 2.229039e-03 2.267866e-03 1
316 2.124939e-04 2.770862e-04 2.828758e-04 2
485 4.778299e-05 6.013438e-05 6.124148e-05 1
396 -1.940946e-04 7.360463e-05 9.759950e-05 3
167 7.027259e-06 1.477237e-05 1.546659e-05 1
493 1.037254e-04 2.185079e-04 2.287963e-04 1
63 3.714505e-04 5.316528e-04 5.460123e-04 2
185 1.315546e-03 1.409360e-03 1.417769e-03 2


Mein Code dazu:

Code: Alles auswählen

beta = 0
row = next(betadf.iterrows())
for row in [row]:
    if row['Label'] == 1:
        beta = beta + row['Beta1']
    elif row['Label'] == 2:
        beta = beta + row['Beta2']
    else:
        beta = beta + row['Beta3']
print(beta)


Und mein zweiter Versuch

Code: Alles auswählen

beta = 0
for idx, row in betadf.iterrows():
    if row['Label'] == 1:
        beta = beta + row['Beta1']
    elif row['Label'] == 2:
        beta = beta + row['Beta2']
    else:
        beta = beta + row['Beta3']
print(beta)
Es kommt ein anderes Ergebnis raus (aber es ist immer noch falsch)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn Dein Ergebnis und was soll den herauskommen?
Wir haben immer noch keinen Zugriff auf Deinen Desktop, um Bilder anzuschauen.

Wenn man mit iterrows arbeitet, macht man mit Sicherheit etwas falsch:

Code: Alles auswählen

beta = sum(betadf[betadf['Label'] == k]['Beta%d' % k].sum() for k in set(betadf['Label']))
Es gibt aber bestimmt noch elegantere Lösungen mit group_by oder so.

Code: Alles auswählen

beta_groups = betadf.groupby('Label').sum()
beta = sum(beta_groups['Beta%d' % k][k] for k in beta_groups.index)
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Danke für die Antwort.

Es kommt 0.18689751548919198 raus, der Werte sollte aber ungefähr bei 0.97 liegen

Da dieser Wert aber für alle verschiedenen Ansätze rauskommt (auch mit der Summe und der groupby Methode), ist wahrscheinlich eher an der Rechnung an sich etwas falsch
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lizzy: woher weißt Du denn, dass 0.97 rauskommen soll? Was sind das für Werte?
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ich denke die Berechnung war falsch. Ich habe den Dataframe angepasst:
muL sdL w Label
79 142.283545 257.856675 2.280286e-03 1
316 30.771996 66.595677 2.847277e-04 2
485 6.656955 12.734483 6.159559e-05 1
396 36.992691 897.387078 1.052745e-04 3
167 1.812622 8.536685 1.568864e-05 1


Und folgenden Code:

Code: Alles auswählen


beta = 0
for idx, row in betadf.iterrows():
    if row['Label'] == 1:
        beta = beta + (row['w']*(1-(row['sdL']*0.11722)/row['muL']))
    elif row['Label'] == 2:
        beta = beta + (row['w']*(1-(row['sdL']*0.0124)/row['muL']))
    else:
        beta = beta + (row['w']*(1-(row['sdL']*0.003)/row['muL']))
print(beta)

Nun bekomme ich folgende Fehlermeldung:

/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:4: RuntimeWarning: invalid value encountered in double_scalars
after removing the cwd from sys.path.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lizzy: Bei dem Code habe ich gerade ein deja vu. Hatten wir nicht schon mal das man sich hier eine zusätzliche Datenreihe erstellt die überall von Label 1 ist den Wert 0.11722, wo Label 2 ist den Wert 0.0124, und ansonsten 0.003 enthält? Dann kann man diese Formel einmal hinschreiben, mit der neuen Datenreihe wo jetzt die unterschiedlichen Faktoren stehen, und am Ende dann einfach die Summe über das Ergebnis bilden. Wie Sirius3 auch hier noch mal gesagt hat: Wenn man `iterrows()` verwendet, riecht irgendwas komisch. Du verwendest Pandas – dann *verwende* das auch!

Edit:

Code: Alles auswählen

In [24]: df
Out[24]: 
            muL         sdL         w  Label
79   142.283545  257.856675  0.002280      1
316   30.771996   66.595677  0.000285      2
485    6.656955   12.734483  0.000062      1
396   36.992691  897.387078  0.000105      3
167    1.812622    8.536685  0.000016      1

In [25]: label2value
Out[25]: {1: 0.11722, 2: 0.0124}

In [26]: factors = df['Label'].map(lambda n: label2value.get(n, 0.003))

In [27]: factors
Out[27]: 
79     0.11722
316    0.01240
485    0.11722
396    0.00300
167    0.11722
Name: Label, dtype: float64

In [28]: df['w'] * (1 - ((df['sdL'] * factors) / df['muL']))
Out[28]: 
79     0.001796
316    0.000277
485    0.000048
396    0.000098
167    0.000007
dtype: float64

In [29]: (df['w'] * (1 - ((df['sdL'] * factors) / df['muL']))).sum()
Out[29]: 0.0022253853122268154
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Vielen Dank, jetzt hab ich auch verstanden wie ich pandas direkt nutzen kann :)
Antworten