Прокатка макс без учета текущего наблюдения в Pandas 1.0 - PullRequest
1 голос
/ 07 мая 2020

Использование Pandas 1.0 Мне нужно сгенерировать скользящий максимум с окном из трех предыдущих наблюдений, исключая текущее наблюдение. В R это достигается с помощью

library(tidyverse)

test_df = data.frame(a = 1:5, b = c(40, 37, 60, 45, 40))
​
test_df <- test_df %>% mutate(
    rolling_max=rollapply(b, width = list(-1:-3), max, na.rm = TRUE, partial = 0, align = "right")
)
> test_df
  a  b rolling_max
1 1 40        -Inf
2 2 37          40
3 3 60          40
4 4 45          60
5 5 40          60

В Python функция pandas .rolling.apply (), похоже, не имеет способа исключить текущее наблюдение, поэтому это дает неожиданный результат: 1004

import pandas as pd
test_df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [40,37,60,45,40]})
test_df['rolling_max'] = test_df['b'].rolling(3).apply(max)
test_df
   a   b  rolling_max
0  1  40          NaN
1  2  37          NaN
2  3  60         60.0
3  4  45         60.0
4  5  40         60.0

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Кажется, это то, что вам нужно:

test_df.rolling(2, min_periods=1).max()
1 голос
/ 07 мая 2020

Прежде всего, вы используете max, в то время как сказали, что вам нужно среднее. Предположим, что вам нужно max, с помощью Python вы можете сделать что-то вроде ниже:

test_df.b.rolling(4, min_periods=2).apply(lambda x: np.max(x[:-1]))

0     NaN
1    40.0
2    40.0
3    60.0
4    60.0
Name: b, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...