Нахождение условных локальных минимумов значений во временных рядах питона
Для набора данных временного ряда:
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)
1 ответ
Вы делаете это с помощью следующего кода:
import pandas as pd
import numpy as np
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]})
df['loc_min'] = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
df['if_A'] = np.where(df['loc_min'].isna(), False, True)
df['loc_min'].fillna(method='ffill', inplace=True)
df['if_B'] = np.where(df['value'] - df['loc_min'] >= 2, True, False)
Ответ для А:
df[df['if_A']==True]
Ответ для Б:
df[df['if_B']==True]