2015-07-27 41 views
7

Tôi đang cố gắng chạy hàm obtainingparams đệ quy trong 5 lần. Tuy nhiên, hiện tại đầu ra từ chương trình của tôi là như sau, và tôi thực sự không thể hiểu tại sao dòng 32323232 trong vòng while ở cuối mã không được in ra sau mỗi bộ đầu ra MATRIX, PARAMS, VALUES.Hiểu đầu ra từ hàm đệ quy

MATRIX [[ 1.   7.53869055 7.10409234 -0.2867544 ] 
[ 1.   7.53869055 7.10409234 -0.2867544 ] 
[ 1.   7.53869055 7.10409234 -0.2867544 ] 
..., 
[ 1.   0.43010753 0.43010753 0.09642396]] 
PARAMS [ 5.12077446 8.89859946 -10.26880411 -9.58965259] 
VALUES [(0.5, 1.5, 206.59958540866882, array([ 5.12077446, 8.89859946, -10.26880411, -9.58965259]))] 
MATRIX [[ 1.   3.14775472 2.54122406 -0.43709966] 
[ 1.   3.14775472 2.54122406 -0.43709966] 
[ 1.   3.14775472 2.54122406 -0.43709966] 
..., 
[ 1.   0.25806447 0.25806428 0.07982733]] 
PARAMS [ 4.90731466 4.41623398 -7.65250737 -6.01128351] 
VALUES [(0.5, 1.5, 206.59958540866882, array([ 5.12077446, 8.89859946, -10.26880411, -9.58965259])), (0.7, 1.7, 206.46228694927203, array([ 4.90731466, 4.41623398, -7.65250737, -6.01128351]))] 

Và cứ tiếp tục như vậy. df là một khung dữ liệu.

values = [] 

def counted(fn): 
    def wrapper(*args, **kwargs): 
     wrapper.called+= 1 
     return fn(*args, **kwargs) 
    wrapper.called= 0 
    wrapper.__name__= fn.__name__ 
    return wrapper 


@counted 
def obtainingparams(self, df, tau_1, tau_2, residuals): 
     global values 
     no_of_bonds = df.shape[0]   
     yields = df['coupon'].values 

     matrix_of_params = np.empty(shape=[1, 4]) 

     months_to_maturity_matrix = df.months_to_maturity.values 

     count = 0 
     for x, value in np.ndenumerate(months_to_maturity_matrix): 
      if count < months_to_maturity_matrix.shape[0]: 
       months_to_maturity_array = months_to_maturity_matrix[count] 
       years_to_maturity_array = months_to_maturity_array/12 
       newrow = [1, ((1-np.exp(-years_to_maturity_array/tau_1))/years_to_maturity_array/tau_1), ((1-np.exp(-years_to_maturity_array/tau_1))/years_to_maturity_array/tau_1)-np.exp(-years_to_maturity_array/tau_1), ((1-np.exp(-years_to_maturity_array/tau_2))/years_to_maturity_array/tau_2)-np.exp(-years_to_maturity_array/tau_2)] 
       count = count + 1 
       matrix_of_params = np.vstack([matrix_of_params, newrow]) 

     matrix_of_params = np.delete(matrix_of_params, (0), axis=0) 
     print('MATRIX', matrix_of_params) 

     params = np.linalg.lstsq(matrix_of_params,yields)[0] 
     print('PARAMS', params) 
     residuals = np.sqrt(((yields - matrix_of_params.dot(params))**2).sum()) 
     tau_1 = tau_1 + 0.2 
     tau_2 = tau_2 + 0.2 

     values.append((tau_1, tau_2, residuals, params)) 
     print('VALUES', values) 

     while self.obtainingparams(df, tau_1, tau_2, residuals).called < 5: 
      print('32323232') 
      self.obtainingparams(df, tau_1, tau_2, residuals) 

Sửa: Gọi obtainingparams mà là một chức năng trong BondClass Class:

tau_1 = 0.3 
tau_2 = 1.3 
BOND_OBJECT = BondClass.GeneralBondClass(price, coupon, coupon_frequecy, face_value, monthstomaturity, issue_date) 
residuals = [0, 0, 0, 0, 0] 
df1 = Exc.ExcelFileReader() #Read the Dataframe in from an Excel File 
BOND_OBJECT.obtainingparams(df1, tau_1, tau_2, residuals) 
+0

Nơi nào bạn trước tiên gọi 'obtainingParams'? –

+0

@ M.Shaw Tôi đã chỉnh sửa câu hỏi để hiển thị nơi tôi gọi nó. – user131983

Trả lời

0
while self.obtainingparams(df, tau_1, tau_2, residuals).called < 5: 
    print('32323232') 
    self.obtainingparams(df, tau_1, tau_2, residuals) 

bản năng đầu tiên của tôi là self.obtainingparams().called phải gọi self.obtainingparams() để có được những .called tài sản. Bằng cách này, bạn đang gọi hàm đệ quy, nhưng không thể chuyển vào vòng lặp while trước khi hàm được gọi, giải thích sự thiếu đầu ra. Tôi muốn đề xuất thay vì sử dụng biến chứa để tính số lần đệ quy, hãy sử dụng biến trong phạm vi bao quanh có thể tăng lên trên mỗi cuộc gọi và có trường hợp cơ sở kiểm tra biến này và return khi nó đạt đến số lượng các bước đệ quy mà bạn muốn.

Ví dụ:

count = 0 

def recurse(): 
    count += 1 
    # Base case 
    if count >= 5: 
     return 
    else: 
     recurse() 

Cuối cùng, bạn cần phải có một cái nhìn vào những gì dòng mã này thực sự làm:

self.obtainingparams(df, tau_1, tau_2, residuals).called 

Chức năng của bạn obtainingparams không thực sự trả về một giá trị, nhưng nói nó trả lại một số int. Dòng này thực sự sẽ kiểm tra int.called, nhưng int không có thuộc tính có tên called. Nếu bạn muốn kiểm tra thuộc tính của đối tượng hàm, bạn sẽ muốn kiểm tra self.obtainingparams.called, mặc dù theo ý kiến ​​của tôi có những cách tốt hơn để làm những gì bạn đang cố gắng làm với mã này.

+2

Có và hơn nữa, mã này cố gắng tra cứu 'được gọi là' trên kết quả ** ** của việc gọi hàm 'obtainingparams' không phải là chính hàm đó. Vì vậy, điều đó sẽ không hoạt động, ngay cả khi 'obtainingparams' trả về một giá trị - giá trị đó sẽ không có thuộc tính' được gọi'. – strubbly

+0

Điểm rất hay, tôi sẽ thêm nó vào câu trả lời. – Dagrooms

1

Vấn đề là bạn không bao giờ nhập vòng lặp while vì để nhập nó, bạn thực hiện cuộc gọi đệ quy. Vì vậy, trước khi thử nghiệm trên called có thể được đánh giá bạn đã đệ quy. Mã này không phải là những gì bạn muốn:

while self.obtainingparams(df, tau_1, tau_2, residuals).called < 5: 

Kết quả cuộc gọi hàm thay vì trong chính hàm đó. Chỉ cần thay thế bằng:

while self.obtainingparams.called < 5: 

và bạn chỉ nên ở đó.

Các vấn đề liên quan