Вершина Пика
Использование состояний X & Y для поиска отклонения, где значение X достигло максимума.
Получение подмножества данных во фрейме данных вокруг отклонения. Например, 5 строк до отклонения от нормы и 5 строк после.
Аномалия также может быть отправной точкой локального тренда в рамках глобального тренда. По сути, взятие подпоследовательности временного ряда из кадра данных и просмотр этой локальной тенденции для получения дополнительной информации, в частности сигналов для подтверждения того, что локальная тенденция не развернулась.
Чтобы идентифицировать и проверить местный тренд, подтвердите, что значение X является @ самой высокой точкой (которая является колеблющейся величиной). Это также как значение центра гистограммы. Нам нужно подтвердить, что пик X по значению до и после является меньшим значением, чем пик X. В идеале мы хотим подтвердить несколько значений до и после.
Пример данных
df = pd.DataFrame({
'X': [-0.27, -0.28, -0.33, -0.37, -0.60, -0.90, -0.99, -0.94, -0.85, -0.75, -0.64, -0.51, -0.35, -0.21, 1.78, 1.98, 2.08, 2.42, 2.56, 2.51, 2.57, 2.53, 2.37, 2.24, 2.11, 2.01, 1.82, 1.64, ],
'X_State': ['3', '3', '3', '3', '5', '5', '5', '5', '5', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '6', '6', '6', '6', '6', ],
'Y_State': ['23', '23', '23', '23', '24', '24', '24', '24', '24', '23', '23', '23', '22', '22', '18', '18', '18', '17', '17', '18', '17', '17', '18', '18', '18', '18', '18', '19', ],
})
df2 = pd.DataFrame() #create new empty dataframe
Второй кадр данных используется для хранения данных поднабора, которые мы находим.
Код
Label = []
# Get Previous
df['X_STATE_Previous_Value'] = df.X_State.shift(1)
df['Y_STATE_Previous_Value'] = df.Y_State.shift(1)
df['Y_STATE_Change'] = (df.Y_State.ne(df.Y_State.shift())).astype(int)
for index, row in df.iterrows():
if (row['Y_State'] == '17' and row['Y_STATE_Previous_Value'] == '18'):
Label.append('Index Position: ' + str(index))
# Select 5 rows before and after
df2 = df2.append(df.iloc[index-5:index+5])
# Find where X peaked
for i, row2 in df2.iterrows():
# get index position of the first instance of the largest value
peak = df2.X.idxmax()
# Go back and label where X peaked
df.loc[peak, 'Label'] = 'Top of Peak'
else:
Label.append('...')
df['Label'] = Label
df2['Max_Label'] = peak
print(df)
print(df2)
#del df2
Нужна помощь
Во-первых. Маркировка Top of Peak не обновляет df, даже если она упоминается как df. Это обновление df2, которое, в конце концов, является временным df2, чтобы помочь нам найти пик.
Во-вторых, в поисках лучших способов подтверждения Top of Peak. Использование значения max в подмножестве, которое на самом деле не подтверждает значения до и после, поскольку оба являются арендодателем.