我正在尝试将两个DataFrame与pandas测试assert_frame_equal
进行比较。这些框架包含要与某些用户定义的精度进行比较的浮动。
来自check_less_precise
的{{1}}参数似乎表明我可以指定要比较的小数点后的位数。引用API参考页面 -
assert_frame_equal
:指定比较精度。仅在check_exact为False时使用。比较小数点后的5位数(假)或3位数(真)。如果是int,则指定要比较的数字
但是,当浮点数小于1时,这似乎不起作用。
这会引发AssertionError
check_less_precise
虽然这不是
import pandas as pd
expected = pd.DataFrame([{"col": 0.1}])
output = pd.DataFrame([{"col": 0.12}])
pd.testing.assert_frame_equal(expected, output, check_less_precise=1)
有人可以帮助解释这种行为,这是一个错误吗?
答案 0 :(得分:4)
我挖掘了源代码,发现了正在发生的事情。最终函数decimal_almost_equal
被调用,在普通Python(在Cython中)中看起来像这样。
def decimal_almost_equal(desired, actual, decimal):
return abs(desired - actual) < (0.5 * 10.0 ** -decimal)
见the source code here这是对函数的实际调用:
decimal_almost_equal(1, fb / fa, decimal)
本例中的位置
fa = .1
fb = .12
decimal = 1
因此函数调用变为
decimal_almost_equal(1, 1.2, 1)
哪个decimal_almost_equal
评估为
abs(1 - 1.2) < .5 * 10 ** -1
或者
.2 < .05
哪个是False
。
因此,比较是基于百分比差异,而不是总差异。
如果您想进行绝对比较,请查看np.allclose
。
np.allclose(expected, output, atol=.1)
True