此代码有效并返回预期结果。
import polars as pl
df = pl.DataFrame({
'A':[1,2,3,3,2,1],
'B':[1,1,1,2,2,2]
})
(df
#.lazy()
.group_by('B')
.map_groups(lambda x:
x.with_columns(
pl.col("A").shift(i).alias(f"A_lag_{i}") for i in range(3)
),
#schema=None
)
.with_columns(
pl.col(f'A_lag_{i}') / pl.col('A') for i in range(3)
)
#.collect()
)
但是,如果您注释掉
.lazy()
、schema=None
和 .collect()
,您会得到 NotFoundError: f'A_lag_0
我已经尝试了此代码的几个版本,但我无法完全理解我是否做错了什么,或者这是否是 Polars 中的错误。
这并不能解决您收到的错误,但在 Polars 中表达此错误的更惯用方法是使用
over
表达式。 例如:
(
df
.lazy()
.with_columns(
pl.col("A").shift(i).over('B').alias(f"A_lag_{i}")
for i in range(3))
.with_columns(
(pl.col(f"A_lag_{i}") / pl.col("A")).name.suffix('_result')
for i in range(3))
.collect()
)
shape: (6, 8)
┌─────┬─────┬─────────┬─────────┬─────────┬────────────┬───────────┬───────────┐
│ A ┆ B ┆ A_lag_0 ┆ A_lag_1 ┆ A_lag_2 ┆ A_lag_0_re ┆ A_lag_1_r ┆ A_lag_2_r │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ sult ┆ esult ┆ esult │
│ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ --- ┆ --- ┆ --- │
│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 │
╞═════╪═════╪═════════╪═════════╪═════════╪════════════╪═══════════╪═══════════╡
│ 1 ┆ 1 ┆ 1 ┆ null ┆ null ┆ 1.0 ┆ null ┆ null │
│ 2 ┆ 1 ┆ 2 ┆ 1 ┆ null ┆ 1.0 ┆ 0.5 ┆ null │
│ 3 ┆ 1 ┆ 3 ┆ 2 ┆ 1 ┆ 1.0 ┆ 0.666667 ┆ 0.333333 │
│ 3 ┆ 2 ┆ 3 ┆ null ┆ null ┆ 1.0 ┆ null ┆ null │
│ 2 ┆ 2 ┆ 2 ┆ 3 ┆ null ┆ 1.0 ┆ 1.5 ┆ null │
│ 1 ┆ 2 ┆ 1 ┆ 2 ┆ 3 ┆ 1.0 ┆ 2.0 ┆ 3.0 │
└─────┴─────┴─────────┴─────────┴─────────┴────────────┴───────────┴───────────┘