Перевернув серию, избегая NaNs - PullRequest
3 голосов
/ 13 мая 2019

Как выполнить скользящее вычисление, избегая значений NaN в моем случае?

Моя серия:

2019-05-01    0.1
2019-05-02    0.2
2019-05-03    NaN
2019-05-04    NaN
2019-05-05    NaN
2019-05-06    0.1
2019-05-07    0.5
2019-05-08    NaN
2019-05-09    0.1
2019-05-10    0.2
2019-05-11    NaN
2019-05-12    NaN
2019-05-13    0.3

Мне нужно вычислить среднее значение периода 2 этой серии таким образом, чтобы мой результат был:

2019-05-01     NaN
2019-05-02    0.15
2019-05-03     NaN
2019-05-04     NaN
2019-05-05     NaN
2019-05-06    0.15
2019-05-07    0.30
2019-05-08     NaN
2019-05-09    0.30
2019-05-10    0.15
2019-05-11     NaN
2019-05-12     NaN
2019-05-13    0.25

Используя rolling, если у вас нет 2 последующих значений, отличных от NaN, среднее будет возвращать NaN, поэтому оно не будет работать (ниже результата с отбрасыванием NaN):

2019-05-01     NaN
2019-05-02    0.15
2019-05-03     NaN
2019-05-04     NaN
2019-05-05     NaN
2019-05-06     NaN
2019-05-07    0.30
2019-05-08     NaN
2019-05-09     NaN
2019-05-10    0.15
2019-05-11     NaN
2019-05-12     NaN
2019-05-13     NaN

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

В вашем случае dropna сначала, затем rolling reindex назад

s.dropna().rolling(2).mean().reindex(s.index)
Out[796]: 
2019-05-01     NaN
2019-05-02    0.15
2019-05-03     NaN
2019-05-04     NaN
2019-05-05     NaN
2019-05-06    0.15
2019-05-07    0.30
2019-05-08     NaN
2019-05-09    0.30
2019-05-10    0.15
2019-05-11     NaN
2019-05-12     NaN
2019-05-13    0.25
Name: x, dtype: float64
0 голосов
/ 13 мая 2019

Вы можете рассчитать свои данные, используя последнее представленное значение:

temp = df.fillna(method='ffill')

Затем рассчитайте скользящее среднее:

temp = temp.rolling(2).mean()

и, наконец, замените NaN:

temp.loc[np.isnan(df)] = np.nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...