Скользящее среднее с переменной длиной окна в Python - PullRequest
0 голосов
/ 02 ноября 2019

Я работаю с данными NLSY79 и пытаюсь построить «сглаженную» переменную дохода, которая в среднем составляет 4 года. В период с 1979 по 1994 год NLSY проводил обследования ежегодно, а после 1996 года - раз в два года. Это означает, что моя сглаженная переменная дохода будет в среднем четыре наблюдения до 1994 года и только два после 1996 года.

Я бы хотел, чтобы моя сглаженная переменная дохода удовлетворяла следующим критериям:

1) Это должно бытьв среднем 4 наблюдения за доходами с 1979 по 1994 год и только 2 с 1996 года

2) Окно должно начинаться с данного наблюдения, а не концентрироваться на нем. Поэтому моя сглаженная переменная дохода должна указывать мне средний доход за четыре года, начиная с этой даты

3) Она должна игнорировать NaNs

Следовательно, она должна выглядеть следующим образом (обратите внимание, чтоЯ только вычислил значения для «сглаженного дохода», которые можно было бы рассчитать на основе предоставленных мною данных.)

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

Я относительно новичок в манипулировании данными с пандами, поэтому я попробовал вот что:

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

Этот код учитывает NaN, но в остальном не выполняет задачи 2) и 3).

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 02 ноября 2019

Хорошо, я изменил код, предоставленный 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 года?

...