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),但是它得到的是滚动平均值——看我想要的输出……除非我遗漏了什么我现在明白了……我想要的输出有点不正确。