2012-12-15 16 views
21

私は2つのパンダのデータフレームを「注文」と呼び、もう1つを「daily_prices」と呼んでいます。次のように daily_pricesである:パンダのデータフレームの値のベクトル化ルックアップ

   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 

オーダー以下の通りである:両方のデータフレームの

  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 

インデックスがdatetime.dateあります。 'orders'データフレームの 'prices'列は、リストの理解度を使用してすべての注文をループし、 'daily_prices'データフレーム内の特定の日付の特定のティッカーを検索し、そのリストを列として追加することによって追加されました「注文」データフレーム私はループするものではなく配列操作を使用してこれを実行したいと思います。それはできますか?

daily_prices.ix [日付、ティッカー]

が、この2つのリストの直積の行列を返します。私が使用しようとしました。私はそれが指定された日付の指定されたティッカーの価格の列ベクトルを返すしたい。

答えて

41

は、まさにこの目的のために設計され、私たちの友人lookupを使用します。

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

私は私はあなたがすでにそれを実装知られている必要があります、それを自分で行うには、様々な空想の方法をしようとしていました。このすばらしいパッケージWesに感謝します。人生をはるかに簡単にします。あなたが次に思い付くものを見るのを待つことはできません。 – luckyfool

+0

'orders'と' prices'データフレームの両方にインデックスとして 'DateTime'を使用すると、" TypeError:タイプdatetime.datetimeのオブジェクトにlen() "のコードが少し異なります:' myval = prices .lookup(order [0]、order [1]) 'ここで' order'は 'for order in orders'から来ます。だから私の場合、注文は上記のように2dではなく1dになります(注文)。それは間違った使用法ですか、それともどのように修正することができますか? (ちょうどその情報を持っている価格データフレームから注文データフレームのうちの1つの日付とティッカーシンボルに一致するエントリを取得したい) –

+2

これがここに気付かれるのはわかりませんが、ここから先に試してみましょう:私は近いものをしたいと思いますが、日付値でインデックス付けされたデータフレームまでの日数でインデックス付けされたシリーズとシリーズ値を一致させる必要があります。私は "シリーズオブジェクトには属性ルックアップがありません。"したがって、df ['d'] = df.index.date - > df ['x'] = ts.lookup(df.d) –

関連する問題