In the following dataset, I have "cross up" and "cross down". I'd like to calculate percentage change from cross-down to the next cross-up.
E.g. the first row is "cross up" and the next three rows are "up"
Their prices are
390.3800, 389.9000 389.9500
The cross down price is then
388.8600
I'd like for the three up rows to calculate the change until the cross down. So,
pct_diff(388.8600, 390.3800) for the first row
pct_diff(388.8600, 389.9000) for the second row
pct_diff(388.8600, 389.9500) for the third row
2022-07-08 11:30:00 0.780577 0.730154 0.050422 up cross up 390.3800
2022-07-08 11:45:00 0.798424 0.743808 0.054616 up 0 389.9000
2022-07-08 12:00:00 0.807296 0.756506 0.050790 up 0 389.9500
2022-07-08 12:15:00 0.718096 0.748824 -0.030728 down cross down 388.8600
2022-07-08 12:30:00 0.569827 0.713024 -0.143197 down 0 387.9800
2022-07-08 12:45:00 0.412866 0.652993 -0.240127 down 0 387.5500
2022-07-08 13:00:00 0.255670 0.573528 -0.317858 down 0 387.1800
2022-07-08 13:15:00 0.176791 0.494181 -0.317390 down 0 387.7716
2022-07-08 13:30:00 0.155127 0.426370 -0.271243 down 0 388.3000
2022-07-08 13:45:00 0.145170 0.370130 -0.224960 down 0 388.4101
2022-07-08 14:00:00 0.141290 0.324362 -0.183072 down 0 388.4800
2022-07-08 14:15:00 0.174931 0.294476 -0.119545 down 0 388.9600
2022-07-08 14:30:00 0.247955 0.285171 -0.037217 down 0 389.5700
2022-07-08 14:45:00 0.350205 0.298178 0.052027 up cross up 390.1700
2022-07-08 15:00:00 0.415148 0.321572 0.093576 up 0 390.0299
2022-07-08 15:15:00 0.462105 0.349679 0.112426 up 0 390.0400
2022-07-08 15:30:00 0.455337 0.370810 0.084527 up 0 389.5600
2022-07-08 15:45:00 0.436071 0.383862 0.052208 up 0 389.4500
2022-07-08 16:00:00 0.354582 0.378006 -0.023424 down cross down 388.6800
CodePudding user response:
check if this works for you
def pct_diff(x, y):
return (y - x) / x
for i, row in df.iterrows():
if row['Direction'] == 'up':
# Calculate percentage change to next cross-down price
cross_down = df[i:][df['Direction'] == 'cross down'].iloc[0]['Price']
df.loc[i, 'Pct Change'] = pct_diff(cross_down, row['Price'])
elif row['Direction'] == 'cross down':
# Reset cross-down price for next group of "up" rows
cross_down = row['Price']
