数据帧单元格被锁定并用于运行余额计算,条件是同一行上另一个单元格的结果

ds8*_*882 6 python dataframe pandas

假设我有以下数据框:

import pandas as pd
df = pd.DataFrame()

df['A'] = ('1/05/2019','2/05/2019','3/05/2019','4/05/2019','5/05/2019','6/05/2019','7/05/2019','8/05/2019','9/05/2019','10/05/2019','11/05/2019','12/05/2019','13/05/2019','14/05/2019','15/05/2019','16/05/2019','17/05/2019','18/05/2019','19/05/2019','20/05/2019')

df['B'] = ('SIT','SCLOSE', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SELL','SIT','SIT','BCLOSE', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL','BUY','SIT','SIT')

df['C'] = (0.00,1.00,10.00, 5.00,6.00,-6.00, 6.00, 0.00,0.00,0.00,-8.00,33.00,-15.00,6.00,-1.00,5.00,10.00,0.00,0.00,0.00)

df.loc[19, 'D'] = 100.0000
Run Code Online (Sandbox Code Playgroud)

可以看出,我在最后一行以 100 开始 D 列。

我正在尝试为 D 列编写计算代码,因此当 B 列显示买入或卖出时,从底部行(第 19 行)开始,然后 D 列上的数字被锁定(例如 100)并用于基于每个 SHODL 或 BHODL 的 C 列,直到显示 BCLOSE 或 SCLOSE 之后的行。

锁定的数字用于根据 C 列中的百分比计算运行余额。正如您在第 16 行中看到的,C 列的“10”代表 10%。由于 100 的 10% = 10,新的运行余额为 110。

第 15 行 C 列有 5%,因此将 5 添加到运行余额中,结果为 115。

接下来的第 14 行 C 列有 -1% 的变化,因为 100 的 1% = 1,因此新的运行余额是 114,依此类推。

以下是运行正确代码后应在数据帧的 col D 中返回的结果

df['D'] = ('158.60','158.60', '157.30', '144.30', '137.80', '130.00', '137.80', '130.00','130.00','130.00','130.00', '138.00', '105.00', '120.00', '114.00', '115.00', '110.00','100.00','100.00','100.00')
Run Code Online (Sandbox Code Playgroud)

这一直持续到 SCLOSE 或 BCLOSE 显示为 BCLOSE 或 SCLOSE 行是计算运行余额的最后一行。

如您所见,当显示新的 BUY 或 SELL 时,此过程将重新启动。

And*_* L. 2

下一个起始值取决于前一组的最后一个值,所以我认为它不能被矢量化。它需要某种迭代过程。我想出了在 groupby 组上迭代执行的解决方案。反转df并赋值给df1。对每个组进行处理df1并将最终的组列表分配给原始组df

df1 = df[::-1]
s = df1.B.isin(['BCLOSE','SCLOSE']).shift(fill_value=False).cumsum()
grps = df1.groupby(s)
init_val= 100
l = []
for _, grp in grps:
    s = grp.C * 0.01 * init_val
    s.iloc[0] = init_val
    s = s.cumsum()
    init_val = s.iloc[-1]
    l.append(s)

df['D'] = pd.concat(l)

Out[50]:
             A       B     C      D
0    1/05/2019     SIT   0.0  158.6
1    2/05/2019  SCLOSE   1.0  158.6
2    3/05/2019   SHODL  10.0  157.3
3    4/05/2019   SHODL   5.0  144.3
4    5/05/2019   SHODL   6.0  137.8
5    6/05/2019   SHODL  -6.0  130.0
6    7/05/2019   SHODL   6.0  137.8
7    8/05/2019    SELL   0.0  130.0
8    9/05/2019     SIT   0.0  130.0
9   10/05/2019     SIT   0.0  130.0
10  11/05/2019  BCLOSE  -8.0  130.0
11  12/05/2019   BHODL  33.0  138.0
12  13/05/2019   BHODL -15.0  105.0
13  14/05/2019   BHODL   6.0  120.0
14  15/05/2019   BHODL  -1.0  114.0
15  16/05/2019   BHODL   5.0  115.0
16  17/05/2019   BHODL  10.0  110.0
17  18/05/2019     BUY   0.0  100.0
18  19/05/2019     SIT   0.0  100.0
19  20/05/2019     SIT   0.0  100.0        
Run Code Online (Sandbox Code Playgroud)