GOOGLE ADS

Mittwoch, 27. April 2022

Berechnung des Cum-Produkts / der Summe, aber fügen Sie bei jedem Schritt einen variablen Faktor hinzu

Ich habe einen Datenrahmen, der so aussieht

df = pd.DataFrame({'Group':["A","A","A","A","B","B","B","B","C","C","C","C"],
'Month':[1,2,3,4,1,2,3,4,1,2,3,4],
'Interest_Rate':[.01,.02,.03,.03,.01,.02,.03,.04,.01,.02,.02,.03],
'Value': [1,1,2,3,2,3,4,5,2,3,4,5]})

Ich möchte ein wie folgt beschriebenes Summenprodukt / Summe berechnen. Ich möchte nach der Gruppe gruppieren und die kumulierte Summe stoppen, wenn die Gruppe endet. AKA-Summe von Monat 1 bis 4 in diesem Fall. Ich möchte den Zinssatz in einen Diskontfaktor umwandeln, der von der verbleibenden Zeit abhängig ist (auch bekannt als Zeilennummer minus Index der Untergruppe).

Zum Beispiel sollte der erste Wert der resultierenden Spalte sein:

1 * (1-.01)**(1) + 1 * (1-.02)**2 + 2 * (1-.03)**3 + 4 * (1-.03)**4

Der zweite Wert sollte sein

1 * (1-.02)**1 + 2 * (1-.03)**2 + 4 * (1-.03)**-3

der dritte

2 * (1-.03)^-1 + 4 * (1-.03)^-2

die vierte

4 * (1-.03)^-1

Dies würde dann für Gruppe B zurückgesetzt werden.

Ich weiß, wie man das ohne den Diskontierungsfaktor macht, den ich hinzufügen möchte. Es wäre:

df.groupby('Group').cumsum()

Ich bin etwas verloren, was ich als nächstes tun soll. Ich weiß, dass ich dies brutal erzwingen kann, indem ich 4 Rabattsatzvektoren erstelle (aber das Problem ist, dass meine tatsächlichen Daten 840 Monate haben, also ist dies nicht ideal).


Lösung des Problems

Ich weiß, wie man das für einen Fall macht, und ich konnte nicht herausfinden, wie man das für den Multi-Fall mit einem der Pandas-Summierungspakete macht. Also habe ich einfach eine Schleife erstellt.

Keys = ["Val_Month","Group"]
Totals = ["Value_Discounted"]
for month in range(len(data["Month"].unique())):
df_temp= df[df["Month"]> month].copy(deep=True)
df_temp["Val_Month"] = month+1
df_temp["Discount_Factor"] = (1+df_temp["Interest_Rate"])**(-(df_temp["RowNo"]-(1+month))/12)
df_temp[ "Value_Discounted"] =df_temp["Value"] * df_temp["Discount_Factor"]
if month ==0:
df_sum_temp = df_temp[Totals+Keys].groupby(Keys).sum()
else:
df_sum_temp = pd.concat([df_sum_temp,df_temp[Totals+Keys].groupby(Keys).sum()])

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...