0

列の1つに基づいて「ローリングウェイト」を取得し、これらの重みを別の列に因数分解する方法を理解するのに苦労しています。

私はgroupby.rolling.apply (function)自分のデータを試してみましたが、主な問題は、列の実行中/ローリング平均を重みに変換する方法を概念化し、この重みの「ウィンドウ」を別の列に因数分解することですそれは転がっていません。

また、意図的min_periodに 1 に設定しているため、各グループの最終出力の最初の 2 行が"rwag"元の出力を反映していることがわかります。

W重みを導出するローリング列です。 Bローリング ウェイトを適用する列です。グループ化は列でのみ行われますa

dfaはすでにおよび でソートされてい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
4

1 に答える 1