Tenho uma pl.DataFrame
coluna contendo listas como esta:
import polars as pl
df = pl.DataFrame(
{
"symbol": ["A", "A", "B", "B"],
"roc": [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6], [0.7, 0.8]],
}
)
shape: (4, 2)
┌────────┬────────────┐
│ symbol ┆ roc │
│ --- ┆ --- │
│ str ┆ list[f64] │
╞════════╪════════════╡
│ A ┆ [0.1, 0.2] │
│ A ┆ [0.3, 0.4] │
│ B ┆ [0.5, 0.6] │
│ B ┆ [0.7, 0.8] │
└────────┴────────────┘
Além disso, tenho uma lista regular de pythonweights = [0.3, 0.7]
Qual é uma maneira eficiente de multiplicar pl.col("roc")
por weights
de modo que o primeiro e o segundo elemento da coluna sejam multiplicados pelo primeiro e segundo elemento de weights
, respectivamente?
A saída esperada é assim:
shape: (4, 3)
┌────────┬────────────┐──────────────┐
│ symbol ┆ roc │ roc_wgt │
│ --- ┆ --- │ --- │
│ str ┆ list[f64] │ list[f64] │
╞════════╪════════════╡══════════════╡
│ A ┆ [0.1, 0.2] │ [0.03, 0.14] │ = [0.1 * 0.3, 0.2 * 0.7]
│ A ┆ [0.3, 0.4] │ [0.09, 0.28] │ = [0.3 * 0.3, 0.4 * 0.7]
│ B ┆ [0.5, 0.6] │ [0.15, 0.42] │ = [0.5 * 0.3, 0.6 * 0.7]
│ B ┆ [0.7, 0.8] │ [0.21, 0.56] │ = [0.7 * 0.3, 0.8 * 0.7]
└────────┴────────────┘──────────────┘
Há um PR pendente para permitir
pl.col.roc * pl.lit(weights)
Há também um
Array
tipo de largura fixa.Adicionar uma coluna é necessário, pois o
pl.lit()
caso atualmente é de pânico.Uma opção é executar primeiro
explode
:Saída:
Alternativamente, com
map_elements
:Saída:
Você também pode iterar sobre sua lista de pesos, pegar o elemento correspondente da sua coluna, multiplicá-los e concatenar esses resultados em uma nova lista.
Infelizmente, o polars ainda não suporta tais operações com listas, mas suporta com structs: