Как найти пересечение чисел?

Есть 8 строк, разделённые на столбцы: index, Open Time, Open, Close, изменение, zone_start, zone_end.

Последовательности четырёх строк разделены на зоны : жёлтую и зелёную. Начало и конец зоны обозначены значениями 'start' и 'end' в соответствующих столбцах. Зелёная зона всегда ниже жёлтой. Между зонами могут быть строки.

Как определить пересечение значений зелёной зоны с жёлтой ? Под пересечением понимается определения диапазона минимального значения поля open и максимального значения close, если в поле "изменение" 'увеличение' или определения диапазона максимального значения поля open и минимального значения close, если в поле "изменение" 'уменьшение'.

введите сюда описание изображения

    Open Time   Open    Close   изменение   zone_start  zone_end      zone_end
1   2022-04-25 18:05:00+03:00   39344.67    39413.84    увеличение  start   
2   2022-04-25 18:10:00+03:00   39413.84    39409.97    nan     
3   2022-04-25 18:15:00+03:00   39409.98    39438.9 nan     
4   2022-04-25 18:20:00+03:00   39438.9 39454.49    nan     end
5   2022-04-25 18:25:00+03:00   39454.49    39508.14    nan     
6   2022-04-25 18:30:00+03:00   39508.14    39543.22    nan     
7   2022-04-25 18:35:00+03:00   39543.22    39570.0 nan     
8   2022-04-25 18:40:00+03:00   39570.01    39575.25    nan     
9   2022-04-25 18:45:00+03:00   39575.25    40193.41    уменьшение  start   
10  2022-04-25 18:50:00+03:00   40193.41    40239.75    nan     
11  2022-04-25 18:55:00+03:00   40239.74    39887.03    nan     
12  2022-04-25 19:00:00+03:00   39887.04    39886.76    nan     end
    Open Time   Open    Close   изменение   zone_start  zone_end    
5   2022-04-25 09:10:00+03:00   38474.82    38388.24    nan     
6   2022-04-25 09:15:00+03:00   38388.24    38325.0 увеличение  start   
7   2022-04-25 09:20:00+03:00   38324.99    38301.07    nan     
8   2022-04-25 09:25:00+03:00   38301.07    38356.81    nan     
9   2022-04-25 09:30:00+03:00   38356.81    38519.34    nan     end
10  2022-04-25 09:35:00+03:00   38519.33    38524.38    nan     
11  2022-04-25 09:40:00+03:00   38524.39    38595.45    nan     
12  2022-04-25 09:45:00+03:00   38595.44    38574.84    nan     
13  2022-04-25 09:50:00+03:00   38574.84    38580.0 уменьшение  start   
14  2022-04-25 09:55:00+03:00   38580.0 38588.2 nan     
15  2022-04-25 10:00:00+03:00   38588.2 38568.12    nan     
16  2022-04-25 10:05:00+03:00   38568.13    38518.48    nan     end
17  2022-04-25 10:10:00+03:00   38518.48    38495.03    nan     
18  2022-04-25 10:15:00+03:00   38495.02    38513.51    nan     
19  2022-04-25 10:20:00+03:00   38513.5 38511.94    nan     
20  2022-04-25 10:25:00+03:00   38511.93    38506.55    nan     
21  2022-04-25 10:30:00+03:00   38506.56    38477.68    увеличение  start   
22  2022-04-25 10:35:00+03:00   38477.68    38453.72    nan     
23  2022-04-25 10:40:00+03:00   38453.72    38473.81    nan
24  2022-04-25 10:45:00+03:00   38473.8 38505.16    nan

Ответы (1 шт):

Автор решения: strawdog

Довольно путанное задание, создается впечатление, что нужно оптимизировать данные на более раннем этапе. По крайней мере, выделить группы можно так:

res = []
for i, g in df.fillna(method="ffill", limit=3).dropna(subset=["изменение"]).groupby("изменение"):
    res.append([g.iloc[0, -3], g.Open.max(), g.Open.min(), g.Close.max(), g.Close.min()])
        
print(res)     
[['увеличение', 38802.64, 38737.46, 38810.79, 38737.46], ['уменьшение', 38812.25, 38798.86, 38812.26, 38710.0]]

Здесь будет список списков с наименованием тенденции, максимумом и минимумом открытия и максимумом и минимумом закрытия. Зоны будут идти последовательно парами, оазумеется, в не зависимости от их количества и "ненужных" строк между ними.

→ Ссылка