2017-10-18 53 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'中没有参数维护索引而不是整合到一个唯一值。 –