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



我正在尝试使用panda的测试库来比较两个数据帧。我不希望测试通过时的值完全相同,所以我使用了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

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

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

absolute(a - b) <= (atol + rtol * absolute(b))

为了获得预期的结果,还需要设置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)

归功于numpy isclose函数中的答案是否返回了错误答案?

最新更新