Berechnen Sie den expandierenden Durchschnitt pro Gruppe ohne StromPython

Python-Programme
Guest
 Berechnen Sie den expandierenden Durchschnitt pro Gruppe ohne Strom

Post by Guest »

Ziel: Berechnen Sie den expandierenden Mittelwert der Spalte „Bewertung“ für jede „Slug“-Gruppe, ohne den Wert der aktuellen Zeile (und unter Berücksichtigung der Reihenfolge, z. B. „Woche“).
Beispieldatensatz (Ausgabe ist das gewünschte Ergebnis).

Code: Select all

idx week    slug    valuation   output
0   2   slouk   -4  12.00
1   3   slouk   7   4.00
2   4   slouk   8   5.00
3   3   kenun   10  14.00
4   1   kenun   11
5   1   slouk   12
6   2   kenun   17  11.00
7   4   kenun   21  12.67
Ich habe es versucht (und bin gescheitert):

Code: Select all

# chaining
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.shift()
.expanding()
.mean()
.reset_index(drop=True)
)

# apply
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.reset_index(drop=True)
)
Dann bin ich über dieses verwandte Thema gestolpert und der .sort_index(level=1) hat es geschafft.
So, jetzt das Es funktioniert:

Code: Select all

td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.sort_index(level=1)
.reset_index(drop=True)
)
Die „Apply“-Version funktioniert, ist jedoch bei einem großen Datensatz ziemlich langsam. Wenn ich .sort_index(level=1) mit der „Verkettungs“-Version versuche, funktioniert das immer noch nicht.
Obwohl es funktioniert, habe ich immer noch einige Punkte, die ich Ich möchte es besser verstehen:
  • Problem mit der Verkettung von Methoden: Wenn ich Methodenverkettung wie z td.groupby('slug')['valuation'].shift().expanding().mean() scheint ab einem bestimmten Punkt den Überblick über die Gruppierung zu verlieren. Ich frage mich, warum das passiert und wie es sich von der Verwendung von „Apply“ unterscheidet.
  • Indizierung und Zuweisung mit „Apply“: „Apply“ mit einer Lambda-Funktion verwenden führt den Vorgang korrekt aus, aber die resultierende Serie hat eine andere Reihenfolge als mein ursprünglicher DataFrame. Wenn ich versuche, es mit .reset_index(drop=True) wieder zuzuweisen, werden die Dinge nicht richtig ausgerichtet. Ich suche Klarheit darüber, wie dieser Neuzuweisungsprozess funktioniert.
  • Gibt es eine andere, effizientere Möglichkeit, das zu tun, was ich suche?< /p>
Mein Ziel ist es, ein besseres Verständnis dieser Methoden aufzubauen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post