Панды вычисляют и применяют взвешенное скользящее среднее на другом столбце - PullRequest
0 голосов
/ 26 декабря 2018

Мне трудно понять, как получить "скользящие веса" на основе одного из моих столбцов, а затем перенести эти веса в другой столбец.

Я пытался groupby.rolling.apply (function) на своих данныхно основная проблема заключается в том, чтобы просто понять, как я собираюсь взять скользящее / скользящее среднее столбца, который я собираюсь превратить в весовые коэффициенты, а затем разложить это «окно» весов в другой столбец, который не был свернут.

Я также намеренно устанавливаю min_period в 1, поэтому вы заметите, что мои первые две строки в каждом выходном файле группы "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

1 Ответ

0 голосов
/ 26 декабря 2018

apply с rolling обычно имеют некоторое проводное поведение

df['Weight']=df.b*df.w
g=df.groupby(['a']).rolling(window=3,min_periods=1)
g['Weight'].sum()/g['w'].sum()
df['rwavg']=(g['Weight'].sum()/g['w'].sum()).values

Out[277]: 
a    
a1  0    50.000000
    1    46.000000
    2    40.000000
    3    22.727273
b1  4    10.000000
    5    16.666667
    6    20.000000
    7    35.454545
dtype: float64
...