2012-12-15 82 views
21

我有兩個熊貓數據框,一個叫做'orders',另一個叫做'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 

兩個dataframes的索引是datetime.date。 通過使用列表理解來循環遍歷所有訂單,並在'daily_prices'數據框中查找特定日期的特定代碼,然後將該列表添加爲列以添加'訂單'數據框中'prices'列'訂單'數據框。我想要使​​用數組操作而不是循環操作。可以做到嗎?我試圖用:

daily_prices.ix [日期,滾動字幕]

但這返回兩個表的笛卡爾乘積的矩陣。我希望它只返回指定日期的指定股票價格的列向量。

回答

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'來自'order for order'。所以在我的情況下,訂單將是1d而不是2d,如上例(訂單)所示。它是錯誤的用法或如何修復? (我想從具有該信息的價格數據框中獲取單個日期和股票代碼的匹配條目(在訂單數據框之外)。 –

+2

我不確定這是否會在此處引起注意,但它對於首先嚐試一下:我想要做一些近似的事情,但我需要將系列值與按日期索引的系列值匹配到按日期時間索引的數據幀。我得到「系列對象沒有屬性查找。」所以像df ['d'] = df.index.date - > df ['x'] = ts.lookup(df.d) –