Numpy 为什么Series.prod()会得到0?

Numpy 为什么Series.prod()会得到0?,numpy,pandas,precision,multiplication,series,Numpy,Pandas,Precision,Multiplication,Series,我有一个由正数或nan组成的序列。但当我计算乘积时,我得到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()

我有一个由正数或nan组成的序列。但当我计算乘积时,我得到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
[46]中的
:pricerelevants[pricerelevants这看起来像
numpy
中的“bug”;请参阅。当溢出时,它不会出现

以下是一些例子:

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
/
函数工具对其进行缩减。reduce

import operator
from functools import reduce

lst = list(pricerelatives.dropna())
the_prod = reduce(operator.mul, lst)
编辑:只需删除所有
NaN
s,然后计算乘积,而不是先将它们设置为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())

你能给我看一下你的亲戚吗
?你们能在更新3中显示
=1
而不是
>1
吗?另外,计算<1的值的乘积,并显示出来。那个应该是一个非常小的数字。为什么更新4中的第54行并没有回答你们的问题?我想是的。非常感谢!顺便说一句,我找到了一种方法来进行计算。我正在计算乘积,所以我可以我们会得到几何平均值。不是先取乘积,而是先做**1/n来解决问题。
from scipy.stats import gmean

gm = gmean(pricerelatives.dropna())