Wie schaue ich zurück zu früheren Zeilen aus dem Pandas-Dataframe-Funktionsaufruf?

Ich recherchiere / backtest ein Handelssystem.

Ich habe ein Pandas-Dataframe mit OHLC-Daten und habe mehrere berechnete Spalten hinzugefügt, die Preismuster identifizieren, die ich als Signale zur Einleitung von Positionen verwenden werde.

Ich möchte nun eine weitere Spalte hinzufügen, die die aktuelle Nettoposition behalten wird. Ich habe versucht, df.apply () zu verwenden, aber das Dataframe selbst als das Argument anstelle des Zeilenobjekts weiterzugeben, wie bei dem letzteren scheint ich nicht in der Lage zu sein, auf vorhergehende Zeilen zurückzusehen, um festzustellen, ob sie irgendwelche Preismuster hervorgebracht haben:

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) 

Dies gibt jedoch folgende Fehlermeldung:

 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') 

Rolling-Fenster-Funktionen scheinen die natürliche Passform zu sein, aber wie ich es verstehe, handeln sie nur auf einer einzigen Zeitreihe oder Spalte, also würde es nicht funktionieren, da ich auf die Werte von mehreren Spalten zu mehreren Zeitpunkten zugreifen muss.

Wie soll ich das tun?

    One Solution collect form web for “Wie schaue ich zurück zu früheren Zeilen aus dem Pandas-Dataframe-Funktionsaufruf?”

    Dieses Problem hat seine Wurzeln in NumPy.

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

    entered_long gibt ein Array-ähnliches Objekt zurück. NumPy weigert sich zu erraten, ob ein Array wahr oder falsch ist:

     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() 

    Um dies zu beheben, verwenden Sie any oder all um festzulegen, was Sie für ein Array bedeuten, um wahr zu sein:

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

    Die any() -Methode gibt True zurück, wenn eines der Items in entered_long(df) True ist. Die all() -Methode gibt True zurück, wenn alle Items in entered_long(df) True sind.

    Python ist die beste Programmiersprache der Welt.