Este é o meu DataFrame:
import pandas as pd
df = pd.DataFrame(
{
'a': [3, 1, 2, 5, 10, 3, 13, 3, 2],
}
)
A saída esperada é criar um a_max
e a_min
:
a a_max a_min
0 3 NaN NaN
1 1 3 1
2 2 3 1
3 5 3 1
4 10 3 1
5 3 10 3
6 13 10 3
7 3 13 3
8 2 13 2
Lógica:
Explico a lógica linha por linha. Existe uma janela dinâmica para isso df
que para a primeira instância da janela apenas a primeira linha é considerada. Para a segunda instância da janela são consideradas as duas primeiras linhas. O mesmo que abaixo:
Estas são as primeiras quatro janelas. Ele se expande de acordo.
Para cada janela preciso encontrar o valor máximo e depois preciso encontrar o valor mínimo ABAIXO desse valor máximo.
Começo a explicar pela janela amarela. Para esta janela o valor máximo é 3 e o valor mínimo ABAIXO é 1. É por isso que a_max
e a_min
para esta janela são 3 e 1.
Agora para a janela laranja o valor máximo é 5 mas como não existem valores nesta janela ABAIXO deste valor que seja menor que 5, os anteriores a_max
e a_min
são repetidos.
E a lógica continua para o restante das linhas.
Esta é minha tentativa:
df['a_max'] = df.a.cummax()
df['a_min'] = df.a.cummin()
Essa é complicada, eu usaria
cummax
+shift
e depoismask
+ffill
para calculara_max
. Entãoa_min
ogroupby.cummin
por grupo é idênticoa_max
:Saída:
Intermediários: