【问题标题】:IndexError: index out of bounds error using pandas .ix in a scipy functionIndexError:在 scipy 函数中使用 pandas .ix 的索引越界错误
【发布时间】:2017-10-09 16:32:04
【问题描述】:

在以下代码部分中,我继续遇到索引越界错误,我终其一生都无法弄清楚原因(该站点上的任何链接都没有帮助我)。我想要做的是将我的 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)

附:我正在使用 python v 2.7.12 和 pandas/scipy v 0.18.1

【问题讨论】:

  • 哪一行产生了错误?
  • 无论您使用什么来运行您的 python 脚本,都应该准确地告诉您错误在哪里。我删除了我之前的评论,因为那不是问题。我确实注意到的一件事是您将循环中的index 重新设置为x_data.index,这是多余的,并且可能会丢弃您再次重置index 的最后两行代码。

标签: python pandas scipy


【解决方案1】:

该错误是在

中的第七次迭代 (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],因为传递给 Funcx_data6x1i=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

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

【讨论】:

  • 太棒了,感谢您提供如此有用且及时的解决方案@matusko
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2014-06-06
  • 2015-03-22
  • 1970-01-01
  • 2018-06-29
  • 2013-10-13
相关资源
最近更新 更多