Pandas resample и заполнить листья NaN в конце

Я хочу улучшить серию от еженедельной до ежедневной частоты, заполняя результаты.

Если последнее наблюдение моей оригинальной серии NaNЯ ожидал, что это значение будет заменено предыдущим действительным значением, но вместо этого оно останется NaN,

НАСТРОИТЬ

import numpy as np
import pandas as pd

all_dates = pd.date_range(start='2018-01-01', freq='W-WED', periods=4)

ts = pd.Series([1, 2, 3], index=all_dates[:3])
ts[all_dates[3]] = np.nan

ts
Out[16]: 
2018-01-03    1.0
2018-01-10    2.0
2018-01-17    3.0
2018-01-24    NaN
Freq: W-WED, dtype: float64

РЕЗУЛЬТАТ

ts.resample('B').ffill() 

ts.resample('B').ffill()
Out[17]: 
2018-01-03    1.0
2018-01-04    1.0
2018-01-05    1.0
2018-01-08    1.0
2018-01-09    1.0
2018-01-10    2.0
2018-01-11    2.0
2018-01-12    2.0
2018-01-15    2.0
2018-01-16    2.0
2018-01-17    3.0
2018-01-18    3.0
2018-01-19    3.0
2018-01-22    3.0
2018-01-23    3.0
2018-01-24    NaN
Freq: B, dtype: float64

Пока я ожидал, что последним значением будет также 3.

У кого-нибудь есть объяснение этому поведению?

2 ответа

Решение

Точка повторной выборки и ffillпросто распространяться вперед с первого дня недели - если первый день недели NaNвот что наполняется вперед. Например:

ts.iloc[1] = np.nan
ts.resample('B').ffill()

2018-01-03    1.0
2018-01-04    1.0
2018-01-05    1.0
2018-01-08    1.0
2018-01-09    1.0
2018-01-10    NaN
2018-01-11    NaN
2018-01-12    NaN
2018-01-15    NaN
2018-01-16    NaN
2018-01-17    3.0
2018-01-18    3.0
2018-01-19    3.0
2018-01-22    3.0
2018-01-23    3.0
2018-01-24    NaN
Freq: B, dtype: float64

В большинстве случаев распространение данных предыдущей недели не будет желательным поведением. Если вы хотите использовать данные предыдущих недель в случае пропущенных значений в исходной (недельной) серии, просто fillna на что сначала с ffill,

resample() возвращается DatetimeIndexResampler

Вам нужно вернуть оригинальные панды Series,

Ты можешь использовать asfreq() способ сделать это, прежде чем заполнять Nan https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.asfreq.html.

Итак, это должно работать:

ts.resample('B').asfreq().ffill()

Другие вопросы по тегам