我正在运行一个名为calculate_hedgeratio的函数 pandas.rolling_apply。该函数在为自身调用时有效, 但在rolling_apply内部会抛出以下错误:
regression = pandas.ols(x = df [xsymbol],y = df [ysymbol])
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)
原因是什么?
答案 0 :(得分:0)
在calculate_hedgeratio中,df
实际上是一个numpy数组,而不是DataFrame(这就是你得到索引错误的原因)。
这是由lambda
中的rolling_apply
功能引起的,后者只能应用于系列。将此rolling_apply
应用于DataFrame时,它实际上会分别对每个列执行计算。