проблема, которую я обнаружил, заключается в том, что идентификаторы не группируются с помощью функции, подобной groupby, поэтому в итоге получается, что строка 7 сравнивается с 1, а не с наноподобными, как строки 1, 2 и 3, что является ложным срабатыванием.
абора данных временного ряда:
A, Как мне найти локальные минимумы (значения надира) для каждого идентификатора? (местные минуты)
B, Как мне найти любые последующие значения, которые на 2 больше, чем каждый локальный минимум. (местные минуты + 2)
import pandas as pd
df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,5, 1.5, 3, 1, 1.5, 2, 3, 4, 0.4]})
Для A я смог использовать следующий код, чтобы найти все минимальные значения nadir / local из набора данных, но они не сгруппированы по каждому идентификатору. Как мне изменить это, чтобы сгруппировать их по идентификатору?
nadir_min = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
nadir_min
Out[1]:
4 1.0
8 1.5
10 1.0
Name: value, dtype: float64
Для B я хотел бы получить последующие значения после надир / локальных минимумов, которые на два больше, чем надир / локальные минимумы. Для приведенных выше примеров я вернусь:
index id value
6 1 3.0
13 2 3.0
14 2 4.0
Возможно, условный цикл справится с задачей, поскольку он может хранить каждую локальную мин и сравнивать последующие значения, если они на 2 больше, чем он. Тем не менее, рабочий набор данных является массивным и займет слишком много времени, поэтому я пытаюсь что-то вроде этого:
df['min_plus2'] = (df['value'] >= nadir_min + 2) & (df.index > nadir_min_index)