Панды, Как получить доступ к подмножеству datafame с помощью iterrow (), itertuple (), индексировать и найти вершину пика, изменение тренда - PullRequest
0 голосов
/ 04 мая 2018

Вершина Пика

Использование состояний 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 в подмножестве, которое на самом деле не подтверждает значения до и после, поскольку оба являются арендодателем.

1 Ответ

0 голосов
/ 04 мая 2018

вот как бы я сделал то, что вы ищете, если бы я понял:

import pandas as pd
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', ],
})

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)  

df['Label'] = '' #or '...' if you like better

# get a list of indexes where abnormality:
abnormal_idx = df[(df['Y_State'] == '17') & (df['Y_STATE_Previous_Value'] == '18')].index
# write it in column Label:
df.loc[abnormal_idx ,'Label'] = 'abnormality'
# get a subset of +/- 5 rows around abnormalities
df2 = df[min(abnormal_idx )-5:max(abnormal_idx )+5]
# and the max of X on this subset
peak_idx = df2.X.idxmax()
# you don't really df2, you can do directly: peak_idx = df[min(abnormal_idx )-5:max(abnormal_idx )+5].X.idxmax()
# add this number in a column, not sure why?
df['Max_Label'] = peak_idx

Дайте мне знать, если это работает для того, что вы ищете.

РЕДАКТИРОВАТЬ: для поднабора макс, вы можете сделать:

df['subset_max'] = ''
for idx in abnormal_idx:
    idx_max = df[idx-5:idx+6].X.idxmax() 
    #note the +6 instead of +5 as the upbound is not consider, sorry for that
    if idx == idx_max:
        df.loc[idx,'subset_max'] = 'max of the subset'
    else:
        df.loc[idx, 'subset_max'] = 'subset max at %s' % idx_max
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...