2017-10-18 10 views
1

を作成するためのデータフレームがorders_dfと呼ばれるように私はorders.csvを持っている:ベクトル化の操作は、新しいデータフレーム

  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 

出力した:私は、2つの以前使用して正しい値を使用してこのデータフレームを埋めるために必要「

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

  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 

を今は第3データフレームを初期化します日付フレーム。私が AAPLの場合、をorders_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 

私はその後、df_tradesを生成する方法

  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 

を出力していますか?

例の値はもう有効ではありません。

+0

あなたの非ベクトル化コードを表示することができますか? – Quickbeam2k1

+0

私は 'df_trades'をまだ構築していません。それらは価値があると思われるものです。 – dirtysocks45

+0

私はあなたのdf_tradesの論理を本当に理解していません。私が150の価格で100のAPPLを購入した場合、最初のCASH値は-15000ではありませんか?あなたはdf_tradesにあなたの在庫や在庫の変化に似せて欲しいですか? price_dfに1日の価格が複数ある場合、各トランザクションにどの値を使用する必要がありますか? –

答えて

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']]です。 –

+0

問題は、OPに一意でないインデックスを持つデータがあることです。望ましい出力を達成するためには、指標を整列させて無視することを信頼する必要がありました。 IMOでは、2つの「2011-01-13」インデックス値とタイムスタンプまたはいくつかの列挙を区別する方が良いでしょう。しかし、私は彼のシナリオを再構築するのではなく、OPの質問にちょうど答えると思った。私はピボットが非一意性のために失敗すると思う...あなたのコードではない...それは良いコードだ...私はOPの出力を達成しないという意味で失敗を意味する。 – piRSquared

+0

@pi私はあなたに従います。私は実際には、一意の値に統合するのではなく、インデックスを維持する 'pivot'または' pivot_table'にパラメータがないことに驚いていました。 –

関連する問題