Ошибка Python: объект 'numpy.float64' не имеет атрибута 'append' - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь запустить симуляцию, в которой я делаю следующее:

  1. Взять 2000 случайных выборок из равномерного распределения между 0 и 1
  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 ]

1 голос
/ 19 марта 2019

Вы используете одно и то же имя переменной, du, для двух различных концептов (контейнер для всех действительных значений du и каждого отдельного значения du за итерацию).

Изменитекод для du_values = [] и du_values.append(N[j + 1]), и он должен работать.

Кроме того, в вашем коде есть опечатка - вы определяете исходный массив как NP, но позже ссылаетесь на него какN.

0 голосов
/ 19 марта 2019

Обратите внимание, что поскольку вы не предоставили никакого кода, код, который я собираюсь показать вам, - это не 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))))

То, что делает этот код, короткое, это 1000x, оно создает случайные числа и веса для моих точек данных, а затем добавляет результат. Код не будет единообразным, как он есть.случайный, но если вы действительно хотите униформу, вы можете просто шаг за шагом.Однако я не думаю, что вам нужна единообразная форма, а достаточно большой размер выборки, чтобы ее не выбросили выбросы.

Способ сравнения результатов будет примерно таким.

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

Сравнение случайных выборок должно быть довольно простым, поэтому, если вам нужна помощь, проследите.А с массивными массивами вы также можете фильтровать / удалять элементы на основе критериев.

Извините, если они не отвечают точно, что вы хотите, но это должно направить вас в правильном направлении.

...