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(())