pandas assert_frame_equal行为

时间:2017-09-19 15:42:11

标签: python pandas testing

我正在尝试将两个DataFrame与pandas测试assert_frame_equal进行比较。这些框架包含要与某些用户定义的精度进行比较的浮动。

来自check_less_precise的{​​{1}}参数似乎表明我可以指定要比较的小数点后的位数。引用API参考页面 -

  

assert_frame_equal:指定比较精度。仅在check_exact为False时使用。比较小数点后的5位数(假)或3位数(真)。如果是int,则指定要比较的数字

API Reference

但是,当浮点数小于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)

有人可以帮助解释这种行为,这是一个错误吗?

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