Pandas使用什么算法计算方差?

0 投票
2 回答
1457 浏览
提问于 2025-04-18 17:03

Pandas在计算一个序列的方差时用的是哪种方法呢?

比如,使用Pandas(版本0.14.1)时:

pandas.Series(numpy.repeat(500111,2000000)).var()
12.579462289731145

显然是因为某些数字计算不稳定。不过,在R语言中我们得到的结果是:

var(rep(500111,2000000))
0

我没能搞清楚Pandas的源代码,所以不知道它具体使用了什么算法。这个链接可能会有帮助:http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

更新:总结一下下面的评论 - 如果安装了Python的bottleneck包,这个包可以加速NumPy数组的函数,那么Pandas会使用一种更稳定的两次计算算法,类似于np.sqrt(((arr - arr.mean())**2).mean()),这样会得到0.0(正如@Jeff所说);如果没有安装这个包,就会使用@BrenBarn提到的简单实现。

2 个回答

1

我不知道答案,但这看起来和Series的存储方式有关,而不一定是var这个函数的问题。

np.var(pd.Series(repeat(100000000,100000)))
26848.788479999999

np.var(repeat(100000000,100000))
0.0

使用的是Pandas 0.11.0版本。

3

这个算法可以在 nanops.py 文件中找到,具体是在 nanvar 这个函数里,最后一行是:

return np.fabs((XX - X ** 2 / count) / d)

这是你提到的维基百科文章开头的“简单”实现。(在默认情况下,d 会被设置为 N-1。)

你看到的这种情况似乎是因为平方值的总和超出了 numpy 数据类型的范围。这并不是说方差的计算方式本身有问题。

撰写回答