gpt4 book ai didi

python - 我不明白为什么 sum(df ['series' ]) != df ['series' ].sum()

转载 作者:行者123 更新时间:2023-12-03 14:29:46 25 4
gpt4 key购买 nike

我正在总结一系列中的值,但根据我如何做,我会得到不同的结果。我试过的两种方法是:

sum(df['series'])

df['series'].sum()

为什么它们会返回不同的值?

示例代码。
s = pd.Series([
0.428229
, -0.948957
, -0.110125
, 0.791305
, 0.113980
,-0.479462
,-0.623440
,-0.610920
,-0.135165
, 0.090192])

print(s.sum())
print(sum(s))

-1.4843630000000003
-1.4843629999999999

这里的差异非常小,但在包含几千个值的数据集中,它变得非常大。

最佳答案

浮点数只精确到一定数量的有效数字。想象一下,如果您的所有数字(包括中间结果)都只精确到两位有效数字,并且您想要列表 [100, 1, 1, 1, 1, 1, 1] 的总和.

  • “真实”和是 106 ,但这不能表示,因为我们只允许两位有效数字;
  • “正确”答案是 110 ,因为这是四舍五入为 2 s.f. 的“真实”总和;
  • 但是如果我们天真地将数字按顺序相加,我们将首先做 100 + 1 = 100(到 2 s.f.),然后是 100 + 1 = 100(到 2 s.f.),依此类推,直到最终结果是 100 .

  • “正确”的答案可以通过将数字从小到大相加得到; 1 + 1 = 2,然后 2 + 1 = 3,然后 3 + 1 = 4,然后 4 + 1 = 5,然后 5 + 1 = 6,然后 6 + 100 = 110(到 2 s.f.)。然而,即使这在一般情况下也不起作用;如果有超过一百个 1,那么中间的总和就会开始不准确。通过始终添加最小的两个剩余数字,您可以做得更好。

    Python 内置 sum函数使用朴素算法,而 df['series'].sum()方法使用具有较低累积舍入误差的更准确算法。 From the numpy source code , Pandas 使用:

    For floating point numbers the numerical precision of sum (and np.add.reduce) is in general limited by directly adding each number individually to the result causing rounding errors in every step. However, often numpy will use a numerically better approach (partial pairwise summation) leading to improved precision in many use-cases. This improved precision is always provided when no axis is given.



    math.fsum function使用更准确的算法:

    In contrast to NumPy, Python's math.fsum function uses a slower but more precise approach to summation.



    对于您的列表, math.fsum 的结果是 -1.484363 ,这是正确四舍五入的答案。

    关于python - 我不明白为什么 sum(df ['series' ]) != df ['series' ].sum(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59128273/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com