Considere o seguinte pl.DataFrame
:
import polars as pl
df = pl.DataFrame(
{
"symbol": ["s1", "s1", "s2", "s2"],
"signal": [0, 1, 2, 0],
"trade": [None, 1, None, -1],
}
)
shape: (4, 3)
┌────────┬────────┬───────┐
│ symbol ┆ signal ┆ trade │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞════════╪════════╪═══════╡
│ s1 ┆ 0 ┆ null │
│ s1 ┆ 1 ┆ 1 │
│ s2 ┆ 2 ┆ null │
│ s2 ┆ 0 ┆ -1 │
└────────┴────────┴───────┘
Agora preciso agrupar o dataframe symbol
e verificar se a primeira linha de cada grupo da coluna signal
não é igual a 0 (zero). Se for igual a True
, preciso substituir a célula correspondente na coluna trade
pelo valor na célula em signal
.
Aqui está o que estou realmente procurando:
shape: (4, 3)
┌────────┬────────┬───────┐
│ symbol ┆ signal ┆ trade │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞════════╪════════╪═══════╡
│ s1 ┆ 0 ┆ null │
│ s1 ┆ 1 ┆ 1 │
│ s2 ┆ 2 ┆ 2 │ <- copy value from the ``signal`` column
│ s2 ┆ 0 ┆ -1 │
└────────┴────────┴───────┘
Para isso, uma construção quando-então-caso contrário pode ser usada.
True
exatamente para as primeiras linhas (crie o índice instantaneamente usandopl.int_range
) em cada grupo comsignal
valor diferente de 0.signal
outrade
.Você pode usar
.is_first_distinct()
para identificar as linhas desejadas.E use como parte da lógica quando/então:
Usando o símbolo e :
cum_count
over
when
Saída: