Python错误:“ numpy.float64”对象没有属性“ append”

时间:2019-03-18 22:50:29

标签: python numpy matplotlib simulation uniform-distribution

我正在尝试执行以下模拟操作:

  1. 从0和1之间的均匀分布中抽取2000个随机样本
  2. 计算任何样本与其之前选择的样本之间的差du。
  3. 使用该差值计算r = EXP(-a * du)
  4. 将另一个随机样本z与r的计算值进行比较
  5. 为r> z创建一个随机样本列表,并丢弃所有其他样本
  6. 重复此过程,直到“接受”了2000个样本为止

这是我到目前为止所拥有的。运行此代码时,收到错误消息“'numpy.float64'对象没有属性'append'”。有关如何解决此问题的任何想法?

import numpy as np                                                          
import matplotlib.pyplot as plt                                             
import math                                                                 

NP=np.random.uniform(0,1,size=(2000,))                                      
a=np.linspace(0.1,2,num=20)                                                 

for i in range(len(a)):                                                     
    dr = []                                                                 
    du = []                                                                 
    for j in range(1999):                                                   
        du=N[j+1]-N[j]                                                      
        r=math.exp(-a[i]*du)                                                
        z=np.random.uniform(0,1)                                            
        if r>z:                                                             
            du.append(N[j+1])                                               
            dr.append(r)

2 个答案:

答案 0 :(得分:1)

您将相同的变量名du用于两个不同的概念(所有有效du值的容器,以及每个迭代中每个du值的容器)。

将您的代码更改为du_values = []du_values.append(N[j + 1]),它应该可以工作。

顺便说一句,您的代码中似乎有一个错字-您将原始数组定义为NP,但后来将其称为N

答案 1 :(得分:0)

请注意,由于您未提供任何代码,因此我要向您展示的代码不是 FOR 您,而是我使用的代码和 SOUNDS 适应您的需求。

 # this will simulate 1000 different combinations of my portfolio
    for x in range(1000):
        weights = np.random.random(len(tickers))
        weights /= np.sum(weights)
        portfolio_returns.append(np.sum(weights * log_returns.mean()) * 250)
        portfolio_volatilities.append(np.sqrt(np.dot(weights.T, np.dot(log_returns.cov() * 250, weights))))

此代码的作用是缩短1000倍,它是为我的数据点创建随机数和权重,然后附加结果。代码不是统一的,因为它是随机的,但是如果您真的想要统一,则可以只需逐步执行增量。但是,我认为您不需要统一的方法,而是要有足够大的样本量,以免被异常值抛弃。

比较结果的一种方法是这样的。

simple_return = (mydata / mydata.shift(1)) - 1

比较随机样本应该是很简单的,因此,如果需要帮助,请跟进。使用numpy数组,您还可以根据条件过滤/删除项目。

很抱歉,如果这些回答不能完全满足您的需求,那么您应该朝正确的方向前进。