2017-06-18 11 views
2

Dies simuliert die "Knock-out" -Situationen in der strukturierten Anlage. Im Allgemeinen gibt es drei Bestände: Stock A; Vorrat B; Stock C, und ihre Preise werden monatlich beobachtet, um zu überprüfen, ob sie über 100% des Preises des ersten Monats (KO-Level) liegen.So geben Sie den ersten Index zurück, wenn der Wert größer als 1 ist

Die grundlegende Datenrahmen sieht wie folgt aus:

  Stock-A Stock-B Stock-C 
2010-01-01 10  20  40 
2010-02-01 9.5  18  31 
2010-03-01 10.5 22  39 
2010-04-01 11.5 23  36 

Wenn einer ihrer Preise über dem KO-Level geht, sollte die Funktion der Monat zurückkehren und müssen nicht den Preis nicht mehr überwachen.

Zum Beispiel die Aktie-A über die KO-Ebene am 01.03.2010, also sollte die Funktion dies als erfolgreichen "Knock-out" -Bestand kennzeichnen sowie das Datum zurückgeben, das 2010-03- ist. 01.

Wenn es einen Bestand nie quer durch die Linie gibt, sollte die Funktion über das Ende iterieren und diesen als nicht-ausgeknockten Bestand zurückgeben. Wie kann ich das erreichen?

+0

Hinweis: Ich habe Stock-C bearbeitet, um ein nicht-kotierter Vorrat zu sein. Ansonsten sind alle 3 Aktien ausverkauft und die Antworten können nicht nach nicht-kotierten Aktien suchen. – JohnE

+0

Dank John, eine Idee, wie es gemacht werden kann? –

Antwort

0

Hier ist mein Versuch, mit einigen Annahmen (plus nehmen Sie diese mit einem Körnchen Salz: Ich habe nicht ein Pandas Experten behaupten, dachte nur dies wäre ein interessantes Problem zu arbeiten)

df = pandas.DataFrame([ 
    {'date': '2010-01-01', 'stock_a': 10, 'stock_b': 20, 'stock_c': 30}, 
    {'date': '2010-01-02', 'stock_a': 9.5, 'stock_b': 18, 'stock_c': 31}, 
    {'date': '2010-03-01', 'stock_a': 10.5, 'stock_b': 22, 'stock_c': 39}, 
    {'date': '2010-04-01', 'stock_a': 11.5, 'stock_b': 23, 'stock_c': 36}, 
]) 
# Assuming you want the first chronological record of such an event 
df = df.sort_values(['date', 'stock_a', 'stock_b', 'stock_c']) 
df2 = pandas.concat([ 
    df['stock_a'] > df['stock_a'][0], 
    df['stock_b'] > df['stock_b'][0], 
    df['stock_c'] > df['stock_c'][0], 
], axis=1) 
df2['date'] = True 
# At this point columns stock_{a,b,c} are populated with NaN in place where the value 
# was less than the first observation 
df3 = df[df2].query('stock_a == stock_a & stock_b == stock_b & stock_c == stock_c') 

if not df3.empty: 
    print df3.iloc[[0]] 
print 'No match' 
Verwandte Themen