[英]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.