Скользящая сумма панд, которая включает предыдущие и предстоящие дни

Новичок, в основном, пытается найти скользящую сумму, которая включает сегодня, последние 4 дня и ближайшие дни, в данном случае 1 следующий день (завтра).

            Test
1995-07-01    1 
1995-07-02    0 
1995-07-03    0 
1995-07-04    1    
1995-07-05    0    
1995-07-06    0    
1995-07-07    0    
1995-07-08    0    
1995-07-09    0    
1995-07-10    0    
1995-07-11    1

Получена скользящая сумма "сегодня" и "прошлых 4 дней" для работы df ['test']. Rolling (5) .sum ()

1995-07-01    NaN
1995-07-02    NaN
1995-07-03    NaN
1995-07-04    NaN
1995-07-05    2.0
1995-07-06    1.0
1995-07-07    1.0
1995-07-08    1.0
1995-07-09    0.0
1995-07-10    0.0
1995-07-11    1.0

Но для меня сложно включить значение следующего дня в эту сумму, я хочу, чтобы результат 1995-07-10 показал 1, так как он должен включать `` завтра '' (с 1995-07-11 это 1 в тестовых данных )


person hugene    schedule 31.05.2020    source источник


Ответы (3)


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

См. эту ссылку для документации.

df['test'].shift(-1,fill_value=0).rolling(5).sum()

обеспечивает:

date
1995-07-01    NaN
1995-07-02    NaN
1995-07-03    NaN
1995-07-04    NaN
1995-07-05    1.0
1995-07-06    1.0
1995-07-07    1.0
1995-07-08    0.0
1995-07-09    0.0
1995-07-10    1.0
1995-07-11    1.0
person autonopy    schedule 31.05.2020
comment
Большое спасибо, это было просто и отлично сработало! - person hugene; 07.06.2020

df['Tomorrow'] = df.shift(-1)
df['Previous'] = df['Test'].rolling(4).sum()
df.sum(axis=1)

Output

1995-07-01    1.0
1995-07-02    0.0
1995-07-03    1.0
1995-07-04    3.0
1995-07-05    1.0
1995-07-06    1.0
1995-07-07    1.0
1995-07-08    0.0
1995-07-09    0.0
1995-07-10    1.0
1995-07-11    2.0

Или, если вы хотите, чтобы первые 3 строки имели значение для предыдущих 4, даже если их было меньше 4 дней:

df['Previous'] = df['Test'].rolling(4, min_periods=1).sum()
person Chris    schedule 31.05.2020

Использовать

pd.Series(df.Test.iloc[0]).append(df.Test.shift(-1)) \
                          .rolling(6, min_periods=1).sum().iloc[1:].astype(int)

в результате (исходная серия здесь только для удобной быстрой проверки)

--- Result ---                -- (Original) --

           Test                           Test
1995-07-01    1               1995-07-01     1
1995-07-02    1               1995-07-02     0
1995-07-03    2               1995-07-03     0
1995-07-04    2               1995-07-04     1
1995-07-05    2               1995-07-05     0
1995-07-06    1               1995-07-06     0
1995-07-07    1               1995-07-07     0
1995-07-08    1               1995-07-08     0
1995-07-09    0               1995-07-09     0
1995-07-10    1               1995-07-10     0
1995-07-11    1               1995-07-11     1

Объяснение:

  1. Мы хотим сместить позицию df.Test серии 1 вверх, чтобы включить следующий день («завтра») в скользящее окно, но это имеет плохие последствия - исчезает первый член исходной серии.

  2. Поэтому мы сохраняем его (df.Test.iloc[0]) в виде 1-элементной серии (pd.Series(df.Test.iloc[0])).

  3. Только после этого мы выполняем предполагаемый сдвиг исходной серии (df.Test.shift(-1)).

  4. Получившуюся сдвинутую серию мы добавляем к ранее сохраненной 1-элементной серии (pd.Series(df.Test.iloc[0]).append(df.Test.shift(-1))).

  5. Теперь мы готовы создать скользящее окно размером 6 (4 дня назад + сегодня + завтра) и с минимальным периодом 1, чтобы предотвратить возникновение NaN значений (.rolling(6, min_periods=1)).

  6. Последние шаги теперь очевидны:

    • applying the .sum() method,
    • отбросить первый элемент (.iloc[1:]), который был добавлен к сдвинутой серии только для расчета скользящего окна,
    • возможно преобразовать тип данных результирующей серии обратно в целочисленный тип (.astype(int))
person MarianD    schedule 31.05.2020