簡體   English   中英

Python 中 window 長度變化的滾動平均值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM