2013-08-29 171 views
2

我有一个系列组成的正数或南。但是,当我计算的产品,我得到0为什么我为Series.prod()获得0?

样本输出:

In [14]: pricerelatives.mean() 
    Out[14]: 0.99110019490541013 
    In [15]: pricerelatives.prod() 
    Out[15]: 0.0 
    In [16]: len(pricerelatives) 
    Out[16]: 362698 
    In [17]: (pricerelatives>0).sum() 
    Out[17]: 223522 
    In [18]: (pricerelatives.isnull()).sum() 
    Out[18]: 139176 
    In [19]: 223522+139176 
    Out[19]: 362698 

为什么我的pricerelatives.prod()得到0?

更新: 感谢您的快速响应。不幸的是,它没有工作:

In [32]: import operator 
    In [33]: from functools import reduce 
    In [34]: lst = list(pricerelatives.fillna(1)) 
    In [35]: the_prod = reduce(operator.mul, lst) 
    In [36]: the_prod 
    Out[36]: 0.0 

明确摆脱空的也失败:

In [37]: pricerelatives[pricerelatives.notnull()].prod() 
    Out[37]: 0.0 

更新2: 事实上,这正是我只是做了,并要增加。

In [39]: pricerelatives.describe() 
    Out[39]: 
    count 223522.000000 
    mean   0.991100 
    std   0.088478 
    min   0.116398 
    25%   1.000000 
    50%   1.000000 
    75%   1.000000 
    max   11.062591 
    dtype: float64 

更新3:仍然对我来说很陌生。因此,更详细的信息:

In [46]: pricerelatives[pricerelatives<1].describe() 
    Out[46]: 
    count 50160.000000 
    mean   0.922993 
    std   0.083865 
    min   0.116398 
    25%   0.894997 
    50%   0.951488 
    75%   0.982058 
    max   1.000000 
    dtype: float64 

更新4:比例是对周围的例子的0和> 0,但我的号码约1更聚集比0,1均匀,均匀1,2之间截止。

In [52]: 50160./223522 
    Out[52]: 0.2244074408783028 
    In [53]: pricerelatives[pricerelatives>=1].describe() 
    Out[53]: 
    count 173362.000000 
    mean   1.010806 
    std   0.079548 
    min   1.000000 
    25%   1.000000 
    50%   1.000000 
    75%   1.000000 
    max   11.062591 
    dtype: float64 
    In [54]: pricerelatives[pricerelatives<1].prod() 
    Out[54]: 0.0 
+0

你能告诉'pricerelatives.describe( )'? –

+0

你可以在更新3中显示'> = 1'而不是'> 1'吗? –

+0

另外,计算值<1的乘积,并显示出来。这应该是一个非常小的数字。 –

回答

3

这看起来像一个“bug”,在numpy;请参阅here。当溢出时它不会升起。

下面是一些例子:

In [26]: prod(poisson(10, size=30)) 
Out[26]: -2043494819862020096 

In [46]: prod(randn(10000)) 
Out[46]: 0.0 

你将不得不使用long(Python的2)或int(Python 3中)类型和使用减少它reduce/functools.reduce

import operator 
from functools import reduce 

lst = list(pricerelatives.dropna()) 
the_prod = reduce(operator.mul, lst) 

编辑:它将更快地删除所有的NaN s和然后计算pro而不是先将它们设置为1。

非常非正式地说,您仍然收到零的原因是产品将快速接近零,因为[0, 1)中的值的数量与值> = 1的比率增长的比率增加。

def nnz_ratio(ratio, size=1000): 
    n1 = ratio * size 
    n2 = size - n1 
    s1 = uniform(1, 2, size=n1) 
    s2 = uniform(0, 1, size=n2) 
    return Series(hstack((s1, s2))) 

ratios = linspace(0.01, 1, 25) 
ss = empty(len(ratios)) 

for i, ratio in enumerate(ratios): 
    ss[i] = nnz_ratio(ratio).prod() 

ss 

给出:

array([ 0.0000e+000, 0.0000e+000, 0.0000e+000, 0.0000e+000, 
     0.0000e+000, 3.6846e-296, 2.6969e-280, 1.2799e-233, 
     2.0497e-237, 4.9666e-209, 6.5059e-181, 9.8479e-171, 
     7.7879e-125, 8.2696e-109, 9.3416e-087, 4.1574e-064, 
     3.9266e-036, 4.1065e+004, 6.6814e+018, 7.1501e+040, 
     6.2192e+070, 1.3523e+093, 1.0739e+110, 1.5646e+144, 
     8.6361e+163]) 

编辑#2:

如果你计算几何平均值,使用

from scipy.stats import gmean 

gm = gmean(pricerelatives.dropna())