2013-10-16 10 views
7

Mam ramkę danych wypełnioną transakcjami zaczerpniętymi ze strategii handlowej. Logika w strategii handlowej musi zostać zaktualizowana, aby zagwarantować, że handel nie zostanie podjęty, jeśli strategia jest już w obrocie handlowym - ale to inny problem. Dane handlowe dla wielu poprzednich transakcji są odczytywane do ramek danych z pliku csv.Porównywanie wierszy DataFame Pandy i upuszczanie wierszy z nakładającymi się datami

Oto mój problem dla danych, które posiadam: Potrzebuję wykonać porównanie ramek danych według rzędu, aby ustalić, czy wartość Entrydate dla rowX jest mniejsza niż ExitDate rowX-1.

Próbkę moich danych:

Row 1: 
EntryDate ExitDate 
2012-07-25 2012-07-27 

Row 2: 
EntryDate ExitDate 
2012-07-26 2012-07-29 

Row 2 musi zostać usunięty, ponieważ jest to kompromis, który nie powinien mieć miejsce.

Mam problem z określeniem, które wiersze są duplikatami, a następnie ich upuszczeniem. Próbowałem z approach in answer 3 of this question przy odrobinie szczęścia, ale nie jest idealny, ponieważ muszę ręcznie iterować przez ramkę danych i czytać dane każdego wiersza. Moje obecne podejście jest poniżej i jest brzydkie, jak tylko możliwe. Sprawdzam daty, a następnie dodam je do nowej ramki danych. Dodatkowo to podejście daje mi wielokrotne duplikaty w ostatecznej ramce danych.

for i in range(0,len(df)+1): 
    if i+1 == len(df): break #to keep from going past last row 
    ExitDate = df['ExitDate'].irow(i) 
    EntryNextTrade = df['EntryDate'].irow(i+1) 

    if EntryNextTrade>ExitDate: 
     line={'EntryDate':EntryDate,'ExitDate':ExitDate} 
     df_trades=df_trades.append(line,ignore_index=True) 

Jakieś przemyślenia lub pomysły, jak skuteczniej to osiągnąć?

Możesz click here, aby zobaczyć próbkowanie moich danych, jeśli chcesz spróbować odtworzyć moją rzeczywistą ramkę danych.

+1

należy unikać unikania pętli! –

+0

Tak. Wiem ... ale to był jedyny sposób, w jaki mogłem zacząć :) –

Odpowiedz

11

Powinieneś użyć jakiejś maski boolowskiej do wykonania tego rodzaju operacji.

Jednym ze sposobów jest stworzenie obojętne kolumnę następnego handlowa:

df['EntryNextTrade'] = df['EntryDate'].shift() 

to wykorzystać, aby utworzyć maskę:

msk = df['EntryNextTrade'] > df'[ExitDate'] 

I używać loc spojrzeć na subDataFrame gdzie MSK jest prawda i tylko określone kolumny:

df.loc[msk, ['EntryDate', 'ExitDate']] 
+0

Dzięki. Próbuję to teraz. Wiedziałem, że jest coś prostego, z czego mógłbym skorzystać. –

+0

To działało idealnie. Jestem bardzo wdzięczny, nie mogę głosować w górę z powodu bycia nowym, ale jeśli bym mógł. –

Powiązane problemy