Панды скользящего среднего с обновлением - PullRequest
0 голосов
/ 14 ноября 2018

Рассмотрим фрейм данных:

df = pd.DataFrame({
    "a": [None, None, None, None, 1, 2, -1, 0, 1],
    "b": [5, 4, 6, 7, None, None, None, None, None]
})

>>  a    b
0   NaN  5.0
1   NaN  4.0
2   NaN  6.0
3   NaN  7.0
4   1.0  NaN
5   2.0  NaN
6  -1.0  NaN
7   0.0  NaN
8   1.0  NaN

Для каждого пропущенного значения в b Я хочу взять среднее из предыдущих 4 значений плюс значение в a с тем же индексом. Например, после 7:

4: (5   + 4 + 6 + 7) / 4 + 1 = 6.5
5: (6.5 + 4 + 6 + 7) / 4 + 2 = 7.88
   ...

Результирующий кадр данных должен быть:

>>  a    b
0   NaN  5.00
1   NaN  4.00
2   NaN  6.00
3   NaN  7.00
4   1.0  6.50
5   2.0  7.88
6  -1.0  5.84
7   0.0  6.80
8   1.0  7.76

Как этого добиться?

1 Ответ

0 голосов
/ 14 ноября 2018

Используя здесь цикл for, panda не по строкам, они не могут использовать предыдущее вычисленное значение для будущих вычислений. (Векторизация)

l=[]
for x ,y in zip(*df.values.T.tolist()):
    if len(l)<4:
        l.append(y)
    else:
        l.append(sum(l[-4:])/4+x)

l
Out[188]: [5.0, 4.0, 6.0, 7.0, 6.5, 7.875, 5.84375, 6.8046875, 7.755859375]
df.b=l
df
Out[190]: 
     a         b
0  NaN  5.000000
1  NaN  4.000000
2  NaN  6.000000
3  NaN  7.000000
4  1.0  6.500000
5  2.0  7.875000
6 -1.0  5.843750
7  0.0  6.804688
8  1.0  7.755859
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...