Python 计算并在另一列上应用加权滚动平均值

Python 计算并在另一列上应用加权滚动平均值,python,pandas,pandas-groupby,weighted-average,rolling-average,Python,Pandas,Pandas Groupby,Weighted Average,Rolling Average,我很难弄清楚如何从我的一列中获得“滚动权重”,然后将这些权重因子到另一列中 我在数据上尝试了groupby.rolling.apply(函数),但主要问题只是概念化如何将要转换为权重的列的运行/滚动平均值,然后将权重的“窗口”因子化到另一个未滚动的列上 我还特意将min\u period设置为1,因此您会注意到每组的前两行最终输出“rwag”镜像了原始输出 W是导出权重的滚动列。 B是应用滚动权重的列。 仅对列a进行分组 df已按a和yr排序 def wavg(w,x): return

我很难弄清楚如何从我的一列中获得“滚动权重”,然后将这些权重因子到另一列中

我在数据上尝试了
groupby.rolling.apply(函数)
,但主要问题只是概念化如何将要转换为权重的列的运行/滚动平均值,然后将权重的“窗口”因子化到另一个未滚动的列上

我还特意将
min\u 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

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

你确定你想要的输出是正确的吗?它可能会被一些小小数关闭,因为我是手工做的。但是,除非我的窗口大小有问题,W-B下面的答案似乎是正确的。我认为他的答案是正确的,但第二排与你的答案不匹配。你知道为什么窗口大小是3,但是第二行正在被计算?@denutza,因为你使用min_period=1,这意味着窗口大小仍然在计算中。是的,但是“a”中的第一行是匹配的,但是第二行也应该匹配原始的(因为win size=3),但是它得到的是滚动平均值——看我想要的输出……除非我遗漏了什么我现在明白了……我想要的输出有点不正确。