IndexError:在scipy函数中使用pandas .ix索引越界错误

时间:2017-05-10 20:43:52

标签: python pandas scipy

在下面的代码部分中,我继续得到一个索引越界错误,我不能为我的生活找出原因(这个网站上没有任何链接帮助了我)。我想要做的是将我的scipy curve_fit函数(Func)应用于x_data和y_data中的每一行数据,以获得a,b,c和d拟合参数。谁能看到我做错了什么?谢谢!

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。我使用python v 2.7.12和pandas / scipy v 0.18.1

1 个答案:

答案 0 :(得分:0)

错误是在

的第七次迭代(i=6)中产生的
popt, pcov = curve_fit(Func,x_data.ix[i],y_data.ix[j])

评估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)

问题是x_data.ix[i],因为传递给x_data的{​​{1}}为Func,但6x1

我猜你忘了你已经将一行传递给i=6因此你不应该进一步切片,即定义

Func

同时尝试运行此功能,迟早会得到#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) 因此您需要增加RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.,即

maxfev