¿Cómo mirar hacia atrás en las filas anteriores desde la llamada de función de dataframe de Pandas?

Estoy investigando / backtesting un sistema de comercio.

Tengo un dataframe de Pandas que contiene datos de OHLC y he agregado varias columnas calculadas que identifican patrones de precios que usaré como señales para iniciar posiciones.

Ahora me gustaría agregar una columna adicional que hará un seguimiento de la posición neta actual. He intentado usar df.apply (), pero pasa el dataframe como argumento en lugar del objeto de fila, ya que parece que no puedo mirar hacia atrás en las filas anteriores para determinar si generaron algún patrón de precios:

open_campaigns = [] Campaign = namedtuple('Campaign', 'open position stop') def calc_position(df): # sum of current positions + any new positions if entered_long(df): open_campaigns.add( Campaign( calc_long_open(df.High.shift(1)), calc_position_size(df), calc_long_isl(df) ) ) return sum(campaign.position for campaign in open_campaigns) def entered_long(df): return buy_pattern(df) & (df.High > df.High.shift(1)) df["Position"] = df.apply(lambda row: calc_position(df), axis=1) 

Sin embargo, esto devuelve el siguiente error:

 ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', u'occurred at index 1997-07-16 08:00:00') 

Las funciones de la ventana rodante parecen ser el ajuste natural, pero como lo entiendo, solo actúan en una única serie de tiempo o columna, por lo que tampoco funcionaría, ya que necesito acceder a los valores de varias columnas en varios puntos de tiempo.

¿Cómo debería de hecho estar haciendo esto?

Este problema tiene sus raíces en NumPy.

 def entered_long(df): return buy_pattern(df) & (df.High > df.High.shift(1)) 

entered_long está devolviendo un objeto similar a una matriz. NumPy se niega a adivinar si una matriz es Verdadero o Falso:

 In [48]: x = np.array([ True, True, True], dtype=bool) In [49]: bool(x) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Para solucionar este problema, use any o all para especificar qué quiere decir para que una matriz sea Verdadera:

 def calc_position(df): # sum of current positions + any new positions if entered_long(df).any(): # or .all() 

El método any() devolverá True si alguno de los ítems en entered_long(df) es True. El método all() devolverá True si todos los elementos en entered_long(df) son True.