0

assert!(expected.frame_equal_missing(&res1)); is failing when using pct_change.

because of float rounding differences (a-b)/b can be different from a/b - 1

How can I frame_equal_missing with a tolerance like pandas?

    let df = df! [
        "A"    => [1., 2., 3.],
        "B"    => [4., 5., 6.],
    ]?;

    let expected = df! [
        "A"    => [None, Some((2./1.) - 1.), Some((3./2.) - 1.)],
        "B"    => [None, Some((5./4.) - 1.), Some((6./5.) - 1.)],
    ]?;

    let res1 = &df
        .clone()
        .lazy()
        .with_column(dtype_cols([DataType::Float64]).pct_change(1))
        .collect()?;

    let res2 = &df
        .clone()
        .lazy()
        .select([col("*") / col("*").shift(1) - lit(1.0)])
        .collect()?;

    println!("{:?}", expected);
    println!("{:?}", res1);
    println!("{:?}", res2);

    // This will pass
    assert!(expected.frame_equal_missing(&res2));

    // This will fail
    assert!(expected.frame_equal_missing(&res1));
    Ok(())
MBr
  • 3
  • 4

0 Answers0