Создайте последние n пиков временных рядов в виде столбца - (ищите расчёт производительности) - PullRequest
0 голосов
/ 18 июня 2019

Я анализирую временной ряд и поэтому хочу создать несколько столбцов с последними n пиками (n должно быть переменной).

Я знаю, что простой расчет последнего пика можно сделать так:

df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]

Этот код взят из этого вопроса: Панды, находящие локальные максимумы и мин. , и были созданы пользователем "fuglede"

Но Мне нужен не только последний пик, но последние n пиков . Например, если n = 3, мои столбцы будут выглядеть следующим образом: df.columns = ['data', 'min_0', 'min_1', 'min_2', 'max_0', 'max_1', 'max_2']

Вычислять все пики (для min_0 и max_0) и смещать их позже - не вариант, потому что Мне нужны уникальные пики . Сдвиг их приведет к результату, в котором min_0 будет равно min_1 и min_2, если между ними не будет достигнут новый пик.

Единственная идея, с которой я столкнулся, заключается в следующем:

n = 3
# Store all peaks in a series
min_vals = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
max_vals = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]

# Iterate over all values in my dataframe
for idx, row in df.iterrows():

    # get all peaks that appeared before the current row (avoid look ahead)
    tmp_min = min_vals.loc[(idx >= min_vals.index)]
    tmp_max = max_vals.loc[(idx >= max_vals.index)]

    # Test if at least n mins and max peaks already appeared
    if len(tmp_min) >= n and len(tmp_max) >= n:

         #create counter for min values (needed to create column name)
         min_ctr = 0

         # iterate over last n entries in tmp_min by using tail function
         for x in tmp_min.tail(n):
             df.loc[idx, 'min_' + str(min_ctr)] = row.data
             min_ctr += 1

         max_ctr = 0
         for x in tmp_min.tail(n):
             df.loc[idx, 'max_' + str(max_ctr)] = row.data
             max_ctr += 1

Этот метод работает, но не очень эффективен, и использование панд таким способом также является плохой практикой. Вот почему я ищу эффективный способ рассчитать это.

Я надеюсь, что объяснил эту проблему достаточно хорошо, дайте мне знать, если я не сделал, и я постараюсь улучшить свой вопрос. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...