性能方面哪个更好 - Dataframe Map 与 Polars 中的 Expression?
Performance wise which is better - Dataframe Map vs Expression in Polars?
我是 Polar 新手。我想基于多个列创建一个新列。我可以看到 Expression 很强大,但是对于复杂的逻辑来说,很难用 case
和 when
来解释。
所以我尝试了 LazyFrame
中可用的 map
,看起来它可以达到目的。但是,我不确定是否会有性能惩罚?或者有没有其他更简单的方法我不知道。
下面是我的代码 Map
let df = lf
.map(
|df: DataFrame| {
let a = &df["a"];
let b = &df["b"];
let r: Series = a
.f32()?
.into_iter()
.zip(b.f32()?.into_iter())
.map(|(Some(a), Some(b))| -> i32 {
if a * b == 10.0 {
10.0
} else if a * b == 20.0 {
a.cos();
} else {
b.cos()
}
})
.collect();
let df_new = DataFrame::new(vec![df["c"], df[r]])?;
Ok(df_new)
},
None,
None,
)
.select(&[
a.clone().max().alias("max"),
b.clone().min().alias("min"),
r.clone().mean().cast(DataType::Float32).alias("mean"),
])
.collect()?;
与下面的表达式相比,
let r = when((a * b).eq(lit::<f32>(10.0)))
.then(lit::<f32>(10.0))
.when((a * b).eq(lit::<f32>(20.0)))
.then(cos(a))
.otherwise(cos(b));
当您将自定义函数映射到 DataFrame
时,您是在说相信我优化器,我知道我在做什么。我们无法再进行任何优化。
除此之外,表达式通常是并行执行的。在您编写的 when -> then -> otherwise
表达式中,所有分支都是并行求值的。
when((a * b).eq(lit::<f32>(10.0)))
.then(lit::<f32>(10.0))
.when((a * b).eq(lit::<f32>(20.0)))
.then(cos(a))
.otherwise(cos(b));
是否更快取决于用例。我会说基准。
但是,您会习惯用表达式来思考,然后表达式语法就会变得更加简洁。
我是 Polar 新手。我想基于多个列创建一个新列。我可以看到 Expression 很强大,但是对于复杂的逻辑来说,很难用 case
和 when
来解释。
所以我尝试了 LazyFrame
中可用的 map
,看起来它可以达到目的。但是,我不确定是否会有性能惩罚?或者有没有其他更简单的方法我不知道。
下面是我的代码 Map
let df = lf
.map(
|df: DataFrame| {
let a = &df["a"];
let b = &df["b"];
let r: Series = a
.f32()?
.into_iter()
.zip(b.f32()?.into_iter())
.map(|(Some(a), Some(b))| -> i32 {
if a * b == 10.0 {
10.0
} else if a * b == 20.0 {
a.cos();
} else {
b.cos()
}
})
.collect();
let df_new = DataFrame::new(vec![df["c"], df[r]])?;
Ok(df_new)
},
None,
None,
)
.select(&[
a.clone().max().alias("max"),
b.clone().min().alias("min"),
r.clone().mean().cast(DataType::Float32).alias("mean"),
])
.collect()?;
与下面的表达式相比,
let r = when((a * b).eq(lit::<f32>(10.0)))
.then(lit::<f32>(10.0))
.when((a * b).eq(lit::<f32>(20.0)))
.then(cos(a))
.otherwise(cos(b));
当您将自定义函数映射到 DataFrame
时,您是在说相信我优化器,我知道我在做什么。我们无法再进行任何优化。
除此之外,表达式通常是并行执行的。在您编写的 when -> then -> otherwise
表达式中,所有分支都是并行求值的。
when((a * b).eq(lit::<f32>(10.0)))
.then(lit::<f32>(10.0))
.when((a * b).eq(lit::<f32>(20.0)))
.then(cos(a))
.otherwise(cos(b));
是否更快取决于用例。我会说基准。
但是,您会习惯用表达式来思考,然后表达式语法就会变得更加简洁。