我正在尝试将两个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/

10-11 22:16
查看更多