在 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 的长度?
我正在处理 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 的长度?