Панды вычисляют и применяют взвешенное скользящее среднее на другом столбце
Мне трудно понять, как получить "скользящие веса" на основе одного из моих столбцов, а затем перенести эти веса в другой столбец.
я пробовал 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 ответ
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