在python中创建离散累积

时间:2013-07-15 14:04:10

标签: python statistics distribution

我正在尝试在python中创建累积发行版,但不断获取AttributeError,我的代码为:

import sys
import scipy.stats
import numpy 

def CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations):
    WindDir = [0,45,90,135,180,225,270,315]
    Freq = [N,NE,E,SE,S,SW,W,NW]

    cdf=scipy.stats.rv_discrete.cdf(WindDir,Freq)  
    cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

if __name__ == '__main__':
    N = float(sys.argv[1])
    NE = float(sys.argv[2])
    E = float(sys.argv[3])
    SE = float(sys.argv[4])
    S = float(sys.argv[5])
    SW = float(sys.argv[6])
    W = float(sys.argv[7])
    NW = float(sys.argv[8])
    Iterations = float(sys.argv[9])
    numpy.set_printoptions(threshold=Iterations)
    sys.stdout.write(str(CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations)))

我得到的错误取决于我用于WindDir amd Freq的值,有时它们是如上面代码中所示的数组,有时其中一个是单个整数,或者它们都是或者一个可能是0之间的数字和1.

AttributeError: 'int' object has no attribute '_fix_loc'

AttributeError: 'list' object has no attribute '_fix_loc'

AttributeError: 'float' object has no attribute '_fix_loc'

我已经浏览了谷歌搜索和这个网站,但我没有运气,我也花了很长时间改变我的输入和使用python网站。

修改 我尝试过的输入: 请注意,由于输入数组的长度不同,因此需要为某些输入编辑代码。 这些都通过命令提示符

运行
python C:\Users\...\python\CDF.py 0.01 0.02 0.03 0.4 0.98 0.99 1 5

这会出现此错误

AttributeError: 'list' object has no attribute '_fix_loc'

编辑代码后 导入系统 import scipy.stats import numpy

def CDF_Random():

    cdf=scipy.stats.rv_discrete.cdf(5,1)

   cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

    return (cdf)

if __name__ == '__main__':

    sys.stdout.write(str(CDF_Random()))

返回以下错误

AttributeError:'int'对象没有属性'_fix_loc'

def CDF_Random():

    cdf=scipy.stats.rv_discrete.cdf(0.5,1)

   cdf_rand=cdf.rvs(size=Iterations)    
    return (cdf_rand)

    return (cdf)

if __name__ == '__main__':

    sys.stdout.write(str(CDF_Random()))

发生此错误

AttributeError: 'float' object has no attribute '_fix_loc'

我还尝试了其他组合,例如数组作为第一个变量,并且整数和浮动作为第二个变量。

cdf=scipy.stats.rv_discrete.cdf([array],0.5)
cdf=scipy.stats.rv_discrete.cdf([array],[array])
cdf=scipy.stats.rv_discrete.cdf(4,[array])
cdf=scipy.stats.rv_discrete.cdf([array],5)

1 个答案:

答案 0 :(得分:2)

scipy.stats.rv_discrete.cdf评估您在某些列出的分位数上的分布情况。你必须先分发你的发行版。尝试:

mydist = scipy.stats.rv_discrete(name = 'mydistribution', values=(WindDir,Freq))

注意:Freq实际上应该是概率并且总和为1,所以你应该将每个成员除以Freq的总和,然后再将其传递给.rv_discrete

更明确地说,此代码会从您使用IterationWindDir的分发中返回Freq个随机变量。 (虽然我稍微更改了名称,因为我不喜欢使用sysargs进行测试)。

import sys
import scipy.stats
import numpy 
import random

def CDF_Random(probs,Iterations):
    WindDir = [0,45,90,135,180,225,270,315]
    Freq = probs
    mydist = scipy.stats.rv_discrete(name = 'mydistribution', values=(WindDir,Freq))  
    cdf_rand=mydist.rvs(size=Iterations)    
    #cdf=scipy.stats.rv_discrete.cdf(cdf_rand,[.5,1,10,50,99])
    return (cdf_rand)

if __name__ == '__main__':
    probs = [random.randint(1,10) for _ in xrange(8)]
    probs = [float(p)/sum(probs) for p in probs]
    Iterations = 30
    numpy.set_printoptions(threshold=Iterations)
    a=CDF_Random(probs,Iterations)

给出:

>>> a
array([  0, 270, 180, 180,   0, 180,  45,  45, 270, 270, 270,   0,  45,
        45, 180,  45, 180, 180, 270, 225,  45, 180, 270, 315, 225,  45,
       180, 180,   0,   0])

如果您想评估发行版的cdf,请使用mydist.cdf([array of percentiles to evaluate at here])

>>> mydist.cdf([1,10,25,50,75,99])
array([ 0.1627907 ,  0.1627907 ,  0.1627907 ,  0.30232558,  0.30232558,
        0.39534884])

可以在the documentation.找到更全面的信息,以及查看rv_discrete实例的doc字符串。即print mydist.__doc__