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()