2012-12-15 4 views
21

Mam dwie ramki danych pandy o nazwie "zamówienia" i kolejną o nazwie "daily_prices". daily_prices jest następujący:Wektoryzowane przeglądanie wartości w ramce danych Pandy

   AAPL GOOG  IBM XOM 
2011-01-10 339.44 614.21 142.78 71.57 
2011-01-13 342.64 616.69 143.92 73.08 
2011-01-26 340.82 616.50 155.74 75.89 
2011-02-02 341.29 612.00 157.93 79.46 
2011-02-10 351.42 616.44 159.32 79.68 
2011-03-03 356.40 609.56 158.73 82.19 
2011-05-03 345.14 533.89 167.84 82.00 
2011-06-03 340.42 523.08 160.97 78.19 
2011-06-10 323.03 509.51 159.14 76.84 
2011-08-01 393.26 606.77 176.28 76.67 
2011-12-20 392.46 630.37 184.14 79.97 

zamówienia jest następujący:

  direction size ticker prices 
2011-01-10  Buy 1500 AAPL 339.44 
2011-01-13  Sell 1500 AAPL 342.64 
2011-01-13  Buy 4000 IBM 143.92 
2011-01-26  Buy 1000 GOOG 616.50 
2011-02-02  Sell 4000 XOM 79.46 
2011-02-10  Buy 4000 XOM 79.68 
2011-03-03  Sell 1000 GOOG 609.56 
2011-03-03  Sell 2200 IBM 158.73 
2011-06-03  Sell 3300 IBM 160.97 
2011-05-03  Buy 1500 IBM 167.84 
2011-06-10  Buy 1200 AAPL 323.03 
2011-08-01  Buy 55 GOOG 606.77 
2011-08-01  Sell 55 GOOG 606.77 
2011-12-20  Sell 1200 AAPL 392.46 

indeks obu dataframes jest datetime.date. Kolumna "ceny" w ramce danych zamówienia "zamówienia" została dodana przy użyciu funkcji sprawdzania listy, aby przejrzeć wszystkie zamówienia i wyszukać konkretny znacznik dla konkretnej daty w ramce danych "dzienny_prices", a następnie dodać tę kolumnę jako kolumnę ramka danych "zamówienia". Chciałbym to zrobić za pomocą operacji tablicowej zamiast czegoś, co pętli. czy można to zrobić? Próbowałem użyć:

daily_prices.ix [daktyle, Blok]

ale ta zwraca macierz iloczyn kartezjański dwóch list. chcę, aby zwrócił wektor kolumnowy tylko ceny określonego znacznika dla określonej daty.

Odpowiedz

41

Użyj naszego przyjaciela lookup, przeznaczony właśnie do tego celu:

In [17]: prices 
Out[17]: 
       AAPL GOOG  IBM XOM 
2011-01-10 339.44 614.21 142.78 71.57 
2011-01-13 342.64 616.69 143.92 73.08 
2011-01-26 340.82 616.50 155.74 75.89 
2011-02-02 341.29 612.00 157.93 79.46 
2011-02-10 351.42 616.44 159.32 79.68 
2011-03-03 356.40 609.56 158.73 82.19 
2011-05-03 345.14 533.89 167.84 82.00 
2011-06-03 340.42 523.08 160.97 78.19 
2011-06-10 323.03 509.51 159.14 76.84 
2011-08-01 393.26 606.77 176.28 76.67 
2011-12-20 392.46 630.37 184.14 79.97 

In [18]: orders 
Out[18]: 
        Date direction size ticker prices 
0 2011-01-10 00:00:00  Buy 1500 AAPL 339.44 
1 2011-01-13 00:00:00  Sell 1500 AAPL 342.64 
2 2011-01-13 00:00:00  Buy 4000 IBM 143.92 
3 2011-01-26 00:00:00  Buy 1000 GOOG 616.50 
4 2011-02-02 00:00:00  Sell 4000 XOM 79.46 
5 2011-02-10 00:00:00  Buy 4000 XOM 79.68 
6 2011-03-03 00:00:00  Sell 1000 GOOG 609.56 
7 2011-03-03 00:00:00  Sell 2200 IBM 158.73 
8 2011-06-03 00:00:00  Sell 3300 IBM 160.97 
9 2011-05-03 00:00:00  Buy 1500 IBM 167.84 
10 2011-06-10 00:00:00  Buy 1200 AAPL 323.03 
11 2011-08-01 00:00:00  Buy 55 GOOG 606.77 
12 2011-08-01 00:00:00  Sell 55 GOOG 606.77 
13 2011-12-20 00:00:00  Sell 1200 AAPL 392.46 

In [19]: prices.lookup(orders.Date, orders.ticker) 
Out[19]: 
array([ 339.44, 342.64, 143.92, 616.5 , 79.46, 79.68, 609.56, 
     158.73, 160.97, 167.84, 323.03, 606.77, 606.77, 392.46]) 
+3

Próbowałam różne wymyślne sposoby, aby to zrobić sam powinien był wiedzieć, że już wdrożone go. Dzięki za ten niesamowity pakiet Wes. Sprawia, że ​​życie jest o wiele łatwiejsze. Nie mogę się doczekać, żeby zobaczyć, co wymyślisz. – luckyfool

+0

Używając 'DateTime' dla obu danych' zleceń' i "cen" jako indeksu, otrzymuję "TypeError: obiekt typu" datetime.datetime "nie ma len()" z nieco innym kodem: 'myval = prices .lookup (order [0], order [1]) 'gdzie' order' pochodzi od 'do zamówienia w zamówieniach'. Więc w moim przypadku, zamówienie byłoby 1d zamiast 2d jak w powyższym przykładzie (zamówienia). Czy to niewłaściwe użycie lub jak można je naprawić? (Chcę uzyskać pasujący wpis dla pojedynczej daty i symbolu tickeru (poza ramką danych zamówienia) z cennika zawierającego dane dokładnie takie informacje.) –

+2

Nie jestem pewien, czy zostanie to zauważone, ale ma to sens spróbuj najpierw: chciałbym zrobić coś bliskiego, ale muszę dopasować wartość serii do serii indeksowanych przez dni do ramek danych indeksowanych według daty. Otrzymuję "obiekt serii nie ma atrybutu wyszukiwania". Tak więc coś w stylu df ['d'] = df.index.date -> df ['x'] = ts.lookup (df.d) –