在 Python 中具有不同 window 长度的滚动平均值

Rolling mean with varying window length in Python

我正在处理 NLSY79 数据,我正在尝试构建一个 'smoothed' 平均 4 年的收入变量。从 1979 年到 1994 年,NLSY 每年进行一次调查,而在 1996 年之后,调查每两年进行一次。这意味着我的平滑收入变量将平均 1994 年之前的四个观察值和 1996 年之后的两个观察值。

我希望我的平滑收入变量满足以下条件:

1) 应该是1979年到1994年4次收入观察的平均值,1996年以后只有2次

2) window 应该从给定的观察开始,而不是以它为中心。因此,我的平滑收入变量应该告诉我从那个日期开始的四年的平均收入

3) 它应该忽略 NaNs

因此,它应该如下所示(请注意,我只计算了可以用我提供的数据计算的 'smoothed income' 的值。)

id year  income 'smoothed income'

1  1979  20,000  21,250  
1  1980  22,000  
1  1981  21,000
1  1982  22,000
...
1  2014  34,000   34,500
1  2016  35,000   
2  1979  28,000   28,333
2  1980  NaN
2  1981  28,000
2  1982  29,000

我对使用 pandas 进行数据帧操作比较陌生,所以这是我尝试过的方法:

smooth = DATA.groupby('id')['income'].rolling(window=4, min_periods=1).mean()
DATA['smoothIncome'] =  smooth.reset_index(level=0, drop=True)

此代码说明了 NaN,但未实现目标 2) 和 3)。

如有任何帮助,我们将不胜感激

好的,我已经修改了 ansev 提供的代码以使其工作。填写 NaN 导致了问题。

修改后的代码如下:

df.set_index('year').groupby('id').income.apply(lambda x: x.reindex(range(x.index.min(),x.index.max()+1))
                                                           .rolling(4, min_periods = 1).mean().shift(-3)).reset_index()

我现在唯一的问题是,当剩余时间少于 4 年时(例如,从 2014 年开始,因为我的数据一直持续到 2016 年),不会计算平均值。 2014 年后有没有办法缩短 window 的长度?