我正在运行一个名为calculate_hedgeratio I pandas.rolling_apply的函数。函数本身调用时工作正常,但是在rolling_apply内部它会引发以下错误:
回归= pandas.ols(x=dfxsymbol,y=dfysymbol) IndexError:只有整数、切片(
:)、省略号(...)、numpy.newaxis (None)和整数或布尔数组才是有效的索引。
下面是函数calculate_hedgeratio:
def calculate_hedgeratio(df, xsymbol, ysymbol):
import pandas
from scipy import odr
import numpy
regression = pandas.ols(x=df[xsymbol], y=df[ysymbol])
m = regression.beta[0]
n = regression.beta[1]
model = odr.Model(lambda B,x: (B[0]*x + B[1]))
data = odr.RealData(df[xsymbol].values,df[ysymbol].values, sx=numpy.std(df[xsymbol].values), sy=numpy.std(df[ysymbol].values))
myodr = odr.ODR(data, model, beta0=[m, n])
myoutput = myodr.run()
results = [myoutput.beta[0], myoutput.beta[1], myoutput.res_var]
return results这是我称之为它的函数:
def simple_Spreadtest(symbol1, symbol2, startdate, enddate, lookbackperiod):
import pandas
import numpy
df=pandas.DataFrame()
df[symbol1]=numpy.random.rand(1000)
df[symbol2]=numpy.random.rand(1000)
df['m','n','Chired'] = pandas.rolling_apply(df,lookbackperiod, lambda x: calculate_hedgeratio(x, symbol1, symbol2))
return df
'Main Code:'
symbol1 = 'A'
symbol2 = 'B'
lookbackperiod = 250
import datetime
startdate = datetime.datetime(1990, 1, 1)
enddate = datetime.datetime(2015, 7, 31)
df = simple_Spreadtest(symbol1, symbol2, startdate, enddate, lookbackperiod)原因是什么?
发布于 2015-07-26 01:31:20
在calculate_hedgeratio中,df实际上是一个numpy数组,而不是DataFrame (这就是为什么您要得到一个索引错误)。
这是由您的lambda函数在您的rolling_apply,后者只能应用于一个系列。当将此rolling_apply应用于DataFrame时,它实际上分别对每一列执行其计算。
https://stackoverflow.com/questions/31631052
复制相似问题