2017-10-18 51 views
1

我有orders.csv一個名爲orders_df數據幀:矢量化操作創建一個新的數據幀

  Symbol Order Shares 
Date       
2011-01-10 AAPL BUY 100 
2011-01-13 AAPL SELL 200 
2011-01-13 IBM BUY 100 
2011-01-26 GOOG SELL 200 

我最終orders_df = orders_df.sort_index()排序的數據幀。

然後,我創建一個symbols像這樣:

symbols = np.append(orders_df.loc[:, 'Symbol'].unique(), 'SPY') 

這纔是我的第二個數據幀df_prices

df_prices = get_data(symbols, orders_df.index, addSPY=False) 
df_prices.loc[:, 'CASH] = 1.0 

打印出:

  AAPL IBM GOOG XOM SPY CASH 
Date             
2011-01-10 150 100 50 400 100 1.0 
2011-01-13 250 200 500 100 100 1.0 
2011-01-13 250 200 500 100 100 1.0 
2011-01-26 100 150 100 300 50 1.0 

現在,我初始化第三個數據幀:」

df_trades = pd.DataFrame(0, df_prices.index, columns=list(df_prices)) 

我需要填寫使用前兩次的正確值這個數據幀日期幀。如果我BUYAAPL,我想乘Sharesorders_df價格AAPL-1。如果它是SELL我不會乘以-1。我將該值放在正確的CASH列中。對於其他專欄,我只需在交易日內複製每隻股票的Shares

  AAPL IBM GOOG XOM SPY CASH 
Date             
2011-01-10 100 0 0 0 0  -15000 
2011-01-13 -200 0 0 0 0  50000 
2011-01-13 0 100 0 0 0  -20000 
2011-01-26 0  0 -200 0 0  20000 

如何使用矢量化操作實現df_trades

UPDATE

如果我沒有:

df_prices = get_data(symbols, orders_df.index, addSPY=False) 
df_prices.loc[:, 'CASH] = 1.0 

打印出

  AAPL  IBM GOOG XOM  SPY CASH 
2011-01-10 340.99 143.41 614.21 72.02 123.19 1.0 
2011-01-11 340.18 143.06 616.01 72.56 123.63 1.0 
2011-01-12 342.95 144.82 616.87 73.41 124.74 1.0 
2011-01-13 344.20 144.55 616.69 73.54 124.54 1.0 
2011-01-14 346.99 145.70 624.18 74.62 125.44 1.0 
2011-01-18 339.19 146.33 639.63 75.45 125.65 1.0 
2011-01-19 337.39 151.22 631.75 75.00 124.42 1.0 

我怎麼會產生df_trades呢?

示例值不再有效fyi。

+0

你能證明你的非量化代碼? – Quickbeam2k1

+0

我還沒有建立'df_trades'。這些就是價值應該是的。 – dirtysocks45

+0

我不太瞭解你的df_trades的邏輯。如果我以150的價格購買100 APPL,第一現金價值不應該是-15000嗎?你想df_trades類似於你的庫存還是庫存變化?如果price_df中有一天價格有多個價格應該用於每筆交易? –

回答

2

矢量化解決方案

j = np.array([df_trades.columns.get_loc(c) for c in orders_df.Symbol]) 
i = np.arange(len(df_trades)) 
o = np.where(orders_df.Order.values == 'BUY', -1, 1) 
v = orders_df.Shares.values * o 
t = df_trades.values 
t[i, j] = v 

df_trades.loc[:, 'CASH'] = \ 
    df_trades.drop('CASH', 1, errors='ignore').mul(prices_df).sum(1) 
df_trades 

      AAPL IBM GOOG XOM SPY  CASH 
Date           
2011-01-10 -100 0  0 0 0 -15000.0 
2011-01-13 200 0  0 0 0 50000.0 
2011-01-13  0 -100  0 0 0 -30000.0 
2011-01-26  0 0 200 0 0 20000.0 
+0

好的答案,可以'orders_df [['Symbol','Shares']]。pivot(columns ='Symbol',values ='Shares')。fillna(0).astype(int)'也可以在這裏工作嗎? –

+0

問題在於OP的數據具有非唯一索引。爲了達到理想的輸出結果,我需要相信這些指數是一致的,並且忽略它們。國際海事組織,最好用時間戳或枚舉來區分兩個「2011-01-13」指數值。但我認爲我只是回答OP的問題,而不是重新設計他的場景。由於非唯一性,我懷疑這個關鍵點會失敗......不是你的代碼......這是很好的代碼......我的意思是在沒有實現OP的輸出的意義上失敗。 – piRSquared

+0

@pi我跟着你。實際上,我驚訝地發現'pivot'或'pivot_table'中沒有參數維護索引而不是整合到一個唯一值。 –