使用 atol 和 pandas 意外通过测试assert_frame_equal

Inc*_*cio 7 python unit-testing dataframe pandas

我正在尝试使用 pandas 的测试库来比较两个数据帧。我不希望测试通过时的值完全相同,因此我使用 atol 参数。Atol 指定允许的绝对公差。然而,当要比较的值变高时,即使超出容差阈值,测试也会通过。

我在下文中提供了两个可重现的示例:

import pandas as pd
import pandas.testing

df1 = pd.DataFrame([42])
df2 = pd.DataFrame([41])
#This test fails as expected
pd.testing.assert_frame_equal(df1, df2, check_exact=False, atol=0.1)

df1 = pd.DataFrame([2006642])
df2 = pd.DataFrame([2006641])
pd.testing.assert_frame_equal(df1, df2, check_exact=False, atol=0.1)
#this test passes, but it should not
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会发生这种情况?我是否误解了 atol 的工作原理?

Inc*_*cio 12

事实证明,atol 参数不是单独使用,而是与 rtol 结合使用,rtol 默认为值 (1e-05),因此为什么我比较的较大值使测试通过。

absolute(a - b) <= (atol + rtol * absolute(b))
Run Code Online (Sandbox Code Playgroud)

为了得到预期的结果,还需要设置rtol。就我而言,为了专门使用 atol,我需要将 rtol 设置为 0。

df1 = pd.DataFrame([2006642])
df2 = pd.DataFrame([2006641])
#this test now fails as expected
pd.testing.assert_frame_equal(df1, df2, check_exact=False, atol=0.1, rtol=0)
Run Code Online (Sandbox Code Playgroud)

归功于isnumpy isclose function returned bad answer?中的答案