Tenho um dataframe polars que contém um ID, DATA e SO. Para cada dia, gostaria de contar quantos IDs únicos existem até aquele dia.
import polars as pl
df = (
pl.DataFrame(
{
"DAY": [1,1,1,2,2,2,3,3,3],
"OS" : ["A","B","A","B","A","B","A","B","A"],
"ID": ["X","Y","Z","W","X","J","K","L","X"]
}
)
)
Saída desejada:
shape: (3, 3)
┌─────┬─────┬─────┐
│ DAY ┆ A ┆ B │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 1 │
│ 2 ┆ 2 ┆ 3 │
│ 3 ┆ 3 ┆ 4 │
└─────┴─────┴─────┘
Deveria ficar assim, porque no dia 1, há 3 valores e 3 IDs. No dia 2, o ID "X" é repetido com o mesmo SO, então, as colunas A permanecem as mesmas, e as outras 2 são diferentes, então adicione 2 a B. No dia 3, o ID X é repetido com A, e as outras 2 são diferentes, então ele soma novamente sobre cada coluna.
Acredito que isso poderia ser resolvido com uma abordagem como a seguinte:
(
df
.pivot(
index="DAY",
on="OS",
aggregate_function=(pl.col("ID").cum_sum().unique())
)
)
Você pode usar Expr.is_first_distinct para marcar cada uma das primeiras entradas distintas de
'ID'
dentro de cada'OS'
. Então você pode pivotar esses resultados e obter sua soma cumulativa.