pandas.rolling_apply()有3个输入和3个输出

时间:2015-07-25 20:57:07

标签: python pandas

我正在运行一个名为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)

原因是什么?

1 个答案:

答案 0 :(得分:0)

在calculate_hedgeratio中,df实际上是一个numpy数组,而不是DataFrame(这就是你得到索引错误的原因)。

这是由lambda中的rolling_apply功能引起的,后者只能应用于系列。将此rolling_apply应用于DataFrame时,它实际上会分别对每个列执行计算。