import polars as pl
import numpy as np
df_sim = pl.DataFrame({
"daily_n": [1000, 2000, 3000, 4000],
"prob": [.5, .5, .5, .6],
"size": 1
})
df_sim = df_sim.with_columns(
pl.struct("daily_n", "prob", "size")
.map_elements(lambda x:
np.random.binomial(n=x['daily_n'], p=x['prob'], size=x['size']))
.cast(pl.Int32)
.alias('events')
)
df_sim
shape: (4, 4)
┌─────────┬──────┬──────┬────────┐
│ daily_n ┆ prob ┆ size ┆ events │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ f64 ┆ i32 ┆ i32 │
╞═════════╪══════╪══════╪════════╡
│ 1000 ┆ 0.5 ┆ 1 ┆ 491 │
│ 2000 ┆ 0.5 ┆ 1 ┆ 979 │
│ 3000 ┆ 0.5 ┆ 1 ┆ 1524 │
│ 4000 ┆ 0.6 ┆ 1 ┆ 2449 │
└─────────┴──────┴──────┴────────┘
Однако следующий код завершится ошибкой с сообщением
"TypeError: аргумент float() должен быть строкой или числом, а не 'Expr'"
df_sim.with_columns(
np.random.binomial(n=pl.col('daily_n'), p=pl.col('prob'), size=pl.col('size'))
.alias('events')
)
Почему некоторые функции требуют использования struct(), map_elements() и лямбда, а другие — нет?
В моем случае ниже я могу просто ссылаться на столбцы поляров как на аргументы функции, используя col().
def local_double(x):
return(2*x)
df_ab = pl.DataFrame({
"group": ["A", "A", "B", "B"],
"converted": [True, False, True, True],
"revenue": [150, 200, 300, 500]
})
df_ab.with_columns(rev_2x = local_double(pl.col("revenue")))
shape: (4, 4)
┌───────┬───────────┬─────────┬────────┐
│ group ┆ converted ┆ revenue ┆ rev_2x │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ bool ┆ i64 ┆ i64 │
╞═══════╪═══════════╪═════════╪════════╡
│ A ┆ true ┆ 150 ┆ 300 │
│ A ┆ false ┆ 200 ┆ 400 │
│ B ┆ true ┆ 300 ┆ 600 │
│ B ┆ true ┆ 500 ┆ 1000 │
└───────┴───────────┴─────────┴────────┘
Подробнее здесь: https://stackoverflow.com/questions/788 ... when-using