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