#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