rust - 有没有办法在 Rust 极坐标中应用返回多个值的 UDF 函数?

标签 rust rust-polars

我正在尝试使用极坐标将另一个库中的函数应用于输入的每一行。我找不到任何使用 Expr 来应用函数的示例或测试,即使它有一个返回值;所以我迷路了。

它采用具有两个浮点列的输入数据帧,并尝试附加由具有以下形式的函数生成的三列:

fn f(a: f64, b: f64) -> (f64, f64, f64);

有没有简单的方法可以做到这一点?

最佳答案

这里有不同的策略。您可以将返回值分配给不同的列。或者您可以将返回值分配给 List<Float64> 类型的单列。 。我将向他们展示两者。

不同的列

将它们分配给不同的列并不真正适合 lazy API 很好,所以我们在 eager 中这样做.

/// Your function that takes 2 argument and returns 3
fn black_box(_a: f64, _b: f64) -> (f64, f64, f64) {
    (1.0, 2.0, 3.0)
}

fn to_different_columns() -> Result<()> {
    let df = df![
        "a" => [1.0, 2.0, 3.0],
        "b" => [1.0, 2.0, 3.0]
    ]?;

    let mut out_1 = vec![];
    let mut out_2 = vec![];
    let mut out_3 = vec![];

    df.column("a")?
        .f64()?
        .into_no_null_iter()
        .zip(df.column("b")?.f64()?.into_no_null_iter())
        .for_each(|(a, b)| {
            let (out_val1, out_val2, out_val3) = black_box(a, b);
            out_1.push(out_val1);
            out_2.push(out_val2);
            out_3.push(out_val3);
        });

    let out1 = Series::from_vec("out1", out_1);
    let out2 = Series::from_vec("out2", out_2);
    let out3 = Series::from_vec("out3", out_3);
    let df = DataFrame::new(vec![out1, out2, out3]);

    Ok(())
}

列表列

如果我们决定返回单个 Series我们最好可以使用polars lazy


fn to_list() -> Result<()> {
    let df = df![
        "a" => [1.0, 2.0, 3.0],
        "b" => [1.0, 2.0, 3.0]
    ]?;

    let df = df
        .lazy()
        .select([map_multiple(
            |columns| {
                Ok(columns[0]
                    .f64()?
                    .into_no_null_iter()
                    .zip(columns[1].f64()?.into_no_null_iter())
                    .map(|(a, b)| {
                        let out = black_box(a, b);
                        Series::new("", [out.0, out.1, out.2])
                    })
                    .collect::<ListChunked>()
                    .into_series())
            },
            [col("a"), col("b")],
            GetOutput::from_type(DataType::List(Box::new(DataType::Float64))),
        )])
        .collect()?;

    dbg!(df);

    Ok(())
}

关于rust - 有没有办法在 Rust 极坐标中应用返回多个值的 UDF 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70959170/

相关文章:

rust - 有条件地从二进制堆中弹出元素时,借用检查器不满意

rust - 使用 Rust 中的 Polars 重新采样时间序列

python-polars - 窗口聚合一个值,但通过 Polars 返回另一个值

llvm - lli 不会善待 rust 的 LLVM IR

rust - 使用 impl fmt::Display 将枚举转换为字符串

winapi - 如何将 RawWindowHandle::Windows 传递给 winapi::winuser::SetWindowPos

asynchronous - Rust 预期类型找到的结构

sql - Rust:使用结构向量的 polars 中的 DataFrame

csv - 使用索引选择是 Polars : How to parse and transform (select/filter? 中的反模式)似乎需要这样的 CSV?