[英]Rolling mean with varying window length in Python
我正在使用 NLSY79 数据,并且正在尝试构建一个平均超过 4 年的“平滑”收入变量。 从 1979 年到 1994 年,NLSY 每年进行一次调查,而 1996 年之后每两年进行一次调查。 这意味着我的平滑收入变量将平均 1994 年之前的四个观察值和 1996 年之后的两个观察值。
我希望我的平滑收入变量满足以下标准:
1) 应该是从 1979 年到 1994 年的 4 次收入观察的平均值,而从 1996 年起只有 2 次
2) window 应该从给定的观察开始,而不是以它为中心。 因此,我的平滑收入变量应该告诉我从该日期开始的四年内的平均收入
3) 它应该忽略 NaN
因此,它应该如下所示(请注意,我只计算了可以使用我提供的数据计算的“平滑收入”的值。)
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 操作 dataframe 比较陌生,所以这是我尝试过的:
smooth = DATA.groupby('id')['income'].rolling(window=4, min_periods=1).mean()
DATA['smoothIncome'] = smooth.reset_index(level=0, drop=True)
此代码考虑了 NaN,但除此之外没有实现目标 2) 和 3)。
任何帮助将非常感激
利用:
df.set_index('year').groupby('id').income.apply(lambda x: x.reindex(range(x.index.min(),x.index.max()+1))
.ffill().rolling(4).mean().shift(-3)).reset_index()
好的,我已经修改了 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 长度?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.