从熊猫数据帧(库存)计算数据的更有效方法

时间:2017-09-01 00:59:22

标签: python pandas numpy dataframe

我想知道是否有更有效/更清洁的方式来执行以下操作。假设我有一个包含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

1 个答案:

答案 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