列の1つに基づいて「ローリングウェイト」を取得し、これらの重みを別の列に因数分解する方法を理解するのに苦労しています。
私はgroupby.rolling.apply (function)
自分のデータを試してみましたが、主な問題は、列の実行中/ローリング平均を重みに変換する方法を概念化し、この重みの「ウィンドウ」を別の列に因数分解することですそれは転がっていません。
また、意図的min_period
に 1 に設定しているため、各グループの最終出力の最初の 2 行が"rwag"
元の出力を反映していることがわかります。
W
重みを導出するローリング列です。
B
ローリング ウェイトを適用する列です。グループ化は列でのみ行われますa
。
df
a
はすでにおよび でソートされていyr
ます。
def wavg(w,x):
return (x * w).sum() / w.sum()
n=df.groupby(['a1'])[['w']].rolling(window=3,min_periods=1).apply(lambda x: wavg(df['w'],df['b']))
Input:
id | yr | a | b | w
---------------------------------
0 | 1990 | a1 | 50 | 3000
1 | 1991 | a1 | 40 | 2000
2 | 1992 | a1 | 10 | 1000
3 | 1993 | a1 | 20 | 8000
4 | 1990 | b1 | 10 | 500
5 | 1991 | b1 | 20 | 1000
6 | 1992 | b1 | 30 | 500
7 | 1993 | b1 | 40 | 4000
Desired output:
id | yr | a | b | rwavg
---------------------------------
0 1990 a1 50 50
1 1991 a1 40 40
2 1992 a1 10 39.96
3 1993 a1 20 22.72
4 1990 b1 10 10
5 1991 b1 20 20
6 1992 b1 30 20
7 1993 b1 40 35.45