我正在尝试将两个DataFrame与测试assert_frame_equal
的 Pandas 进行比较。这些帧包含我想与某些用户定义的精度进行比较的浮点数。check_less_precise
中的assert_frame_equal
参数似乎建议我可以指定小数点后的位数以进行比较。引用“API引用”页面-
API Reference
但是,当浮点数小于1时,这似乎不起作用。
这引发了一个AssertionError
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)
虽然这不是
expected = pd.DataFrame([{"col": 1.1}])
output = pd.DataFrame([{"col": 1.12}])
pd.testing.assert_frame_equal(expected, output, check_less_precise=1)
有人可以帮助解释这种行为,这是一个错误吗?
最佳答案
我翻阅了源代码,发现正在发生的事情。最终,函数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
关于python - Pandas assert_frame_equal行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46304621/