2017-02-16 13 views
0

ребята У меня проблема с моим кодом на Python.Python, параметры массива в классе не имеют правильного значения, когда я вызываю класс

class BasketOption: 

    def __init__(self,name,markets,typeO,numbersU,numbersA,maturity,strike): 
     self.name = name 
     self.markets = markets 
     self.typeO=typeO 
     self.numbersU=numbersU 
     self.numbersA=numbersA 
     self.maturity = maturity 
     self.strike = strike 
     self.cache = DateCache() 

    def getnumbersA(self,numbersU): 
     self.numbersA=np.empty(self.numbersU) 
     return self.numbersA 

    def getdates(self): 
     return [self.maturity] 

    def getmarkets(self): 
     return [self.markets] 

    def getweight(self): 
     compt=0 
     totalweight=0 
     weight=np.empty(self.numbersU,dtype=float) 
     for i in range(self.numbersU): 
      totalweight+=self.getnumbersA(self.numbersU)[i] 
     total=np.array([totalweight]*self.numbersU) 
     weight=self.getnumbersA(self.numbersU)/total 
     return weight 

    def getsum(self,date): 
     prices=0 
     for i in range(self.numbersU): 
      prices+= self.markets.getspot(date,i)*self.getweight()[i] 
     return prices 

    @timecached 
    def getcf(self,date): 
     if date == self.maturity: 
      #FIXME: l'option peut aussi porter sur un forward, introduire 
      # plutôt la notion de produit. 
      if self.typeO=="call": 
       return np.maximum(self.getsum(date) - self.strike, 0.) 
     else: 
      return 0 

Это мой класс, и я называю это так:

BasketOption(name="basket", typeO="call",numbersU=2, numbersA=np.array([[2., 2.]]), maturity=1.,strike=110) 

У меня нет хороших результатов, так что я искал на отладку, и я увидел, что numbersA не принимают значения 2. и 2. в массиве, когда я звоню, он принимает это:

ndarray: [ 3.68777431e+180 1.04146313e-152] 

Я не знаю, почему это принять эти ценности. Благодарю.

+0

Arent у вас отсутствует аргумент 'markets', который не имеет значения по умолчанию? –

+0

Нет, это не так. Я уверен, что я просто не показывал вам эту часть кода. –

+0

Попробуйте поставить простую печать() после инициализации –

ответ

1
def getnumbersA(self,numbersU): 
    self.numbersA=np.empty(self.numbersU) 
    return self.numbersA 

np.empty возврата «пустой» массив - т.е. с внутренними значений, не присвоенных - по соображениям производительности.

Я не уверен, что вы надеетесь getnumbersA будет делать, но сейчас каждый раз, когда вы звоните getnumbersA вам заменить numbersA с чем-то, который, вероятно, выглядеть следующим образом (произвольно выбирая аргумент):

In [36]: np.empty([1,2]) 
Out[36]: array([[ 6.93278890e-310, 1.14700699e-316]]) 

, который, похоже, не является тем, что вы хотите.

+0

Это должно быть так, но я сделал это, потому что у меня была ошибка: ValueError: операнды не могли транслироваться вместе с фигурами (500000,) (2,) –

+0

self.markets.getspot (date, i) имеет форму (500000,) Я знаю, что w не может умножить два массива разностей, но обычно с self.ge tweight() [i] У меня должен быть доступ к одному элементу массива? –

0

Спасибо, ребята, я обнаружил, что моя ошибка была здесь: numbersA = np.array ([[2., 2.]]) Я положил 2 крючка, просто нужен один.