Как применить функцию / вменить интервал в Pandas

#python #pandas #pandas-groupby #interpolation #missing-data

#python #pandas #pandas-groupby #интерполяция #отсутствует-данные

Вопрос:

У меня есть набор данных Pandas с ежемесячным индексом даты и времени и столбцом невыполненных заказов (как показано ниже):

Дата приказы
1991-01-01 nan
1991-02-01 nan
1991-03-01 24
1991-04-01 nan
1991-05-01 nan
1991-06-01 nan
1991-07-01 nan
1991-08-01 34
1991-09-01 nan
1991-10-01 nan
1991-11-01 22
1991-12-01 nan

Я хочу линейно интерполировать значения для заполнения nan. Однако он должен применяться в течение 6-месячных блоков (без перехода). Так, например, один 6-месячный блок будет состоять из всех строк между 1991-01-01 и 1991-06-01 , где мы будем выполнять прямое и обратное линейное вменение таким образом, что при наличии nan интерполяция будет уменьшаться до конечного значения 0. Итак, для того же набора данных, приведенного выше, вот как я хотел бы, чтобы конечный результат выглядел:

Дата приказы
1991-01-01 8
1991-02-01 16
1991-03-01 24
1991-04-01 18
1991-05-01 12
1991-06-01 6
1991-07-01 17
1991-08-01 34
1991-09-01 30
1991-10-01 26
1991-11-01 22
1991-12-01 11

Однако я не понимаю, как это сделать в Pandas. Есть идеи?

Комментарии:

1. линейная интерполяция — это локальная функция. Что вы имеете в виду, применяемый в пределах блоков 6mo?

2. я имею в виду линейную интерполяцию, применяемую к 6-месячному окну (пример, показанный выше), но где 6-месячное окно НЕ выполняется (вот почему я говорю 6-месячный блок)

Ответ №1:

Идея заключается в группировании за 6 месяцев с добавлением и добавлением 0 значений, интерполяцией, а затем удалением первого и последнего 0 значений для групп:

 df['Date'] = pd.to_datetime(df['Date'])


f = lambda x: pd.Series([0]   x.tolist()   [0]).interpolate().iloc[1:-1]
df['orders'] = (df.groupby(pd.Grouper(freq='6MS', key='Date'))['orders']
                  .transform(f))

print (df)
        Date  orders
0  1991-01-01     8.0
1  1991-02-01    16.0
2  1991-03-01    24.0
3  1991-04-01    18.0
4  1991-05-01    12.0
5  1991-06-01     6.0
6  1991-07-01    17.0
7  1991-08-01    34.0
8  1991-09-01    30.0
9  1991-10-01    26.0
10 1991-11-01    22.0
11 1991-12-01    11.0