Скажем, у меня есть следующий фрейм данных:
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
Как видно, я начинаю столбец D со 100 в последней строке.
Я пытаюсь закодировать вычисление для столбца D, поэтому начиная с нижней строки (строка 19), когда в столбце B показано ПОКУПКА или ПРОДАЖА, число в столбце D блокируется (например, 100) и используется для расчета на основе col C для каждого SHODL или BHODL до тех пор, пока не появится строка после BCLOSE или SCLOSE.
Заблокированное число используется для расчета текущего баланса на основе процентов в столбце C. Как видно из строки 16, в столбце C указано «10», представляющее 10%. Если 10% от 100 = 10, то новый текущий баланс равен 110.
В столбце строки 15 C содержится 5%, так как 5 добавляется к текущему балансу, в результате чего получается 115.
Следующая строка 14 столбца C имеет изменение на -1%, так как 1% от 100 равен = 1, и поэтому новый текущий баланс равен 114 и т. д.
Ниже приведены результаты, которые должны быть возвращены в столбец 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')
Это продолжается до тех пор, пока после SCLOSE или BCLOSE не будет показано, как строка BCLOSE или SCLOSE является последней строкой, в которой вычисляется текущий баланс.
Как видите, этот процесс перезапускается, когда отображается новая покупка или продажа.