我想知道是否有更有效/更清洁的方式来执行以下操作。假设我有一个包含2列的数据框,百分比(基于先前价格)和操作,播放/购买(1)或不播放/卖出(-1)。它基本上与股票有关。
为简单起见,请考虑示例df:
Percent Action
1.25 1
1.20 1
0.50 -1
0.75 1
我想生成以下内容。我只关心最后的金额,我只是把这张表作为参考。假设我们从100美元开始并且没有播放状态。因此,我们应该获得金额:
Playing Percent Action Money
No 1.25 1 $100
Yes 1.20 1 $120
Yes 0.50 -1 $60
No 0.75 1 $60
Yes ... ... ...
由于我们还没有玩,因此第一行的数量没有变化。由于动作为1,我们将播放下一个。百分比上涨20%,因此我们得到120美元。下一个动作仍然是1,所以我们仍然会在下一个动作中。百分比下降到50%,所以我们最终得到60美元。下一个动作是-1,因此我们不会玩。百分比下降到75%,但由于我们没有参加比赛,我们的钱保持不变。等等。
目前,我有以下代码。它运行正常,但只是想知道是否有更有效的方式使用numpy / pandas函数。我基本上遍历每一行并计算值。
playing = False
money = 10000
for index, row in df.iterrows():
## UPDATE MONEY IF PLAYING
if index > 0 and playing == True:
money = float(format(money*row['Percent'],'.2f'))
## BUY/SELL
if row['Action'] == 1:
if playing == False:
playing = True ## Buy, playing after this
elif row['Action'] == -1:
if playing == True:
playing = False ## Sell, not playing after this
答案 0 :(得分:2)
你可以试试这个:
# decide whether to play based on action
df['Playing'] = df.Action.shift().eq(1)
# replace Percent for not playing row with 1 and then calculate the cumulative product
df['Money'] = '$' + df.Percent.where(df.Playing, 1).cumprod().mul(100).astype(str)
df
#Percent Action Playing Money
#0 1.25 1 False $100.0
#1 1.20 1 True $120.0
#2 0.50 -1 True $60.0
#3 0.75 1 False $60.0