2017-08-01 20 views
0

データフレームには数量と価格の2つの列があります。平均購入価格を計算するDataFrame

df = pd.DataFrame([ 
[ 1, 5], 
[-1, 6], 
[ 2, 3], 
[-1, 2], 
[-1, 4], 
[ 1, 2], 
[ 1, 3], 
[ 1, 4], 
[-2, 5]], columns=['quantity', 'price']) 

df['amount'] = df['quantity'] * df['price'] 
df['cum_qty'] = df['quantity'].cumsum() 

私は2つの新しい列の量とcum_qty(累積量)を追加しました。私は、平均購入価格を計算したい

quantity price amount cum_qty 
0   1  5  5  1 
1  -1  6  -6  0 
2   2  3  6  2 
3  -1  2  -2  1 
4  -1  4  -4  0 
5   1  2  2  1 
6   1  3  3  2 
7   1  4  4  3 
8  -2  5  -10  1 

: は今、データフレームは、この(正量が負の数量が販売表し、買いを表します)のように見えます。

cum_qty = 0の場合、qantityとamountはゼロにリセットする必要があります。 したがって、index = [5,6,7]の行を見ています。 各行ごとに1つのアイテムが価格2,3,4で購入されます。つまり、平均価格3 [(2 + 3 + 4)/ 3]で3個ずつ在庫しています。

インデックス= 8での販売は、(トランザクションを売る購入価格は変更されません)が起こった後、私は価格で1各3

を持っていますが、基本的に、私は累積的で、すべての累積購入金額を分割する必要がありますゼロでない最後の累積数量からの数量。

pandas DataFrameを使用しているすべての取引の結果として手元に買い物をする方法は?

+1

あなたの予想される出力は何ですか?株式取引シミュレーションについて話しているなら、私は 'for loop'を提案します – Wen

答えて

1

私の理解に基づいて、各取引サークルの購入価格が必要です。これを試すことができます。あなたのための

df['new_index'] = df.cum_qty.eq(0).shift().cumsum().fillna(0.)#give back the group id for each trading circle.* 
df=df.loc[df.quantity>0]# kick out the selling action 
df.groupby('new_index').apply(lambda x:(x.amount.sum()/x.quantity.sum())) 

new_index 
0.0 5.0# 1st ave price 5 
1.0 3.0# 2nd ave price 3 
2.0 3.0# 3nd ave price 3 ps: this circle no end , your position still pos 1 
dtype: float64 

EDIT1追加要件

DF=df.groupby('new_index',as_index=False).apply(lambda x : x.amount.cumsum()/ x.cum_qty).reset_index() 
DF.columns=['Index','AvePrice'] 
DF.index=DF.level_1 
DF.drop(['level_0', 'level_1'],axis=1,inplace=True) 
pd.concat([df,DF],axis=1) 

Out[572]: 
     quantity price amount cum_qty new_index 0 
level_1             
0    1  5  5  1  0.0 5.0 
2    2  3  6  2  1.0 3.0 
5    1  2  2  1  2.0 2.0 
6    1  3  3  2  2.0 2.5 
7    1  4  4  3  2.0 3.0 
+0

あなたのお返事ありがとうございます。私はWenの答えをクリーナーとして好むが、Jiglの答えもうまくいき問題を解決する。 – user3225309

+1

お返事ありがとうございます。私はWenの答えをクリーナーとして好むが、Jiglの答えもうまくいき問題を解決する。 もう一度ありがとうございます。あなたが提供した情報があれば、私は気を散らして、各行の平均価格を計算することができます。 たとえば、index = 4の行では、何も手元にありません。 – user3225309

+0

インデックス5の行には、現在の平均価格= 2を生成する価格2のそれぞれに1つずつがあります。 インデックス6の行には、それぞれ価格3の別の1つがあり、平均価格を2 + 3/1 + 1 = 2,5に設定します。 インデックス7の行には、価格4の別の1つがあり、平均価格を2 + 3 + 4/1 + 1 + 1 = 3に設定します。 新しい列を作成することはできますかすべての行に平均価格がありますか? – user3225309

0
df[df['cum_qty'].map(lambda x: x == 0)].index 

はどの行であなたはあなたに0 cum_qty

start = df[df['cum_qty'].map(lambda x: x == 0)].index.max() + 1 
end = len(df) - 1 

との最後の行を与えるあなたの開始と終了行番号を与える0

df[df['cum_qty'].map(lambda x: x == 0)].index.max() 

のcum_qtyを持っているあなたを与えることあなたが参照している範囲です

は、与えた例で行った答えを示します

cum_qty 0の各出現に対してこの値を知りたい場合は、それぞれのインデックスを使用して開始/終了ロジックを適用できます(myコードの最初の行)。