我正在编写一个单元测试,它应该将保存的CSV已知结果与处理的结果进行比较。虽然结果数据相等,但我的测试失败了。我的猜测是Panndas以某种方式对值进行了舍入,所以我创建了以下片段来测试我的猜测:
import pandas as pd
df = pd.DataFrame({'val':[-0.41676538151302184]})
df.to_csv('tmp.csv',index=False)
# Load the saved CSV and compare it
df2 = pd.read_csv('./tmp.csv')
df2.val.compare(df.val)
self other
0 -0.416765 -0.416765
熊猫显示了差异,尽管数值看起来是相等的。如果我四舍五入的价值观,比较成功。
将保存的数据与计算的数据进行比较的正确方法是什么?
浮点数的问题在于精度。正如你所猜测的,你的数字非常接近,但并不完全相同:
df.iloc[0,0]
-0.41676538151302184
df2.iloc[0,0]
-0.4167653815130218
with pd.option_context('display.float_format', '{:.20f}'.format):
display(df2.val.compare(df.val))
self other
0 -0.41676538151302178203 -0.41676538151302183755
一种选择是使用numpy.isclose
或numpy.allclose
,它们是专门为测试闭合数而设计的。有两个参数rtol
和atol
用于指定自定义的相对或绝对公差。
import numpy as np
np.isclose(df, df2).all()
# or
np.allclose(df, df2)
输出:True