两个Pandas DataFrame上的Vectorized Operations创建一个新的DataFrame

时间:2017-10-18 08:42:17

标签: python pandas vectorization

我将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')

这是我的第二个DataFrame 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))

我需要使用前两个日期帧用正确的值填充此数据框。如果我BUY AAPL,我想将Shares的{​​{1}}乘以orders_dfAAPL的价格。如果是-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

打印出来

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 呢?

示例值不再有效fyi。

1 个答案:

答案 0 :(得分: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