2

正の数または 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

で 0 になるのはなぜpricerelatives.prod()ですか?

更新: 迅速な対応ありがとうございます。残念ながら、うまくいきませんでした:

    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

null を明示的に取り除くことも失敗します。

    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 の間の例のカットオフのすぐ近くにありますが、私の数値は、均一な 0,1 および均一な 1,2 よりも 1 の周りにはるかに集中しています。

    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
4

1 に答える 1

3

これは の「バグ」のようnumpyです。ここを参照してください。オーバーフローがある場合は発生しません。

ここではいくつかの例を示します。

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)

編集:最初に 1 に設定するよりも、すべてのNaNs を削除して積を計算する方が高速になります。

[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())
于 2013-08-29T14:14:20.277 に答える