2017-05-10 1 views
0

다음 코드 단원에서는 인덱스 범위를 벗어나는 오류가 계속 발생하며 필자는 그 이유를 알 수 없습니다 (none 이 사이트의 링크 중 아직 나를 도왔습니다.) 내가 원하는 것은 x_data와 y_data의 각 데이터 행에 scipy curve_fit 함수 (Func)를 적용하여 a, b, c 및 d 적합 매개 변수를 얻는 것입니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니? 감사!IndexError : scipy 함수에서 pandas .ix를 사용하여 범위를 벗어난 인덱스

import pandas as pd 
from scipy.optimize import curve_fit 
import numpy as np 
import math 

#my function 
def Func(x_data,a,b,c,d): 
    return np.multiply((np.multiply((a+cols), b)), 
      (x_data.ix[i]/math.pi))+np.multiply((c+cols), d) 

#create dummy dataframe 
index=pd.date_range('2017-01-01','2017-03-01', freq='D') 
columns=['1.234','2.345','3.456','4.567','5.678','6.789'] 

data1 = np.random.rand(60,6) 
data2 = np.random.rand(60,6) 

x_data=pd.DataFrame(data1, index=index, columns=columns) 
y_data=pd.DataFrame(data2, index=index, columns=columns) 

#values for function 
cols=np.array(x_data.columns.values).astype(np.float) 

#Apply function to each row of x_data and y_data and append to empty array 
data_popt=[] 
data_perr=[] 
for i, j in zip(range(0, len(x_data)), range(0, len(y_data))): 
    popt, pcov = curve_fit(Func,x_data.ix[i],y_data.ix[j]) 
    data_popt.append(popt) 
    perr=np.sqrt(np.diag(pcov)) 
    data_perr.append(perr) 
    index=x_data.index 
    columns1=['a','b','c','d'] 
    columns2=['a_err','b_err','c_err','d_err'] 
data_popt=pd.DataFrame(data_popt, index=index, columns=columns1) 
data_perr=pd.DataFrame(data_perr, index=index, columns=columns2) 

p.s. I 파이썬 V 2.7.12 및 팬더/scipy의 V를 사용하고 0.18.1 오류는 Func

#my function 
def Func(x_data,a,b,c,d): 
    return np.multiply((np.multiply((a+cols), b)), 
      (x_data.ix[i]/math.pi))+np.multiply((c+cols), d) 

의 평가

popt, pcov = curve_fit(Func,x_data.ix[i],y_data.ix[j]) 

에서 일곱 번째 반복 (i=6)에 생성된다

+0

을 증가해야합니까? – matusko

+0

파이썬 스크립트를 실행하기 위해 사용하는 것은 무엇이든지 오류의 정확한 위치를 알려주고 있어야합니다. 그게 문제가 아니기 때문에 나는 이전의 코멘트를 지웠다. 한 가지 주목할 점은 루프 내에서'index'를 중복 설정 한'x_data.index'로 다시 설정했기 때문에'index'를 다시 설정하는 코드의 마지막 두 줄을 버리고있는 것입니다. – pshep123

답변

0

문제는 입니다. x_dataFunc이 (가) 6x1이 (가) i=6이 (가) 전달되었습니다.

은 당신이 즉, 빨리,


#my function 
def Func(x_data,a,b,c,d): 
    return np.multiply((np.multiply((a+cols), b)), 
      (x_data/math.pi))+np.multiply((c+cols), d) 
는 또한이를 실행하려고 정의하거나 나중에 것, 이미 Func에 단일 행을 통과하고, 따라서 당신이 그것을 더 슬라이스해서는 안 잊어 생각 얻을 RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000. 따라서 당신은 오류가 발생 라인 maxfev

popt, pcov = curve_fit(Func,x_data.ix[i],y_data.ix[j], maxfev=10000) 
+0

훌륭하고 유용하고시의 적절한 해결책을 제공 해주셔서 감사합니다. @matusko – cmoo

관련 문제