Обнаружение быстрого увеличения временных рядов - PullRequest
1 голос
/ 10 января 2020

У меня есть временной ряд, и я хотел бы определить, когда значения быстро увеличиваются, и точно определить (возможно, цвет) временные рамки увеличения. Например, на следующем графике я хотел бы точно указать пики для заданного c временного окна по оси x (например, 2018-05-22)

enter image description here

Я могу найти максимальные значения 20%, но это мне не помогает. Вместо этого я хочу сосредоточиться на быстром увеличении.

d = pd.Series(df['TS'].values[1:] - df['TS].values[:-1], index=df['TS'].index[:-1]).abs()
threshold = 0.8
m = d.max()
print(d > m * threshold)

Например, разрывы делают нечто подобное визуально. Есть пример со случайными данными вдоль графика, который он производит:

import matplotlib.pyplot as plt
import ruptures as rpt

# generate signal
n_samples, dim, sigma = 1000, 3, 4
n_bkps = 4  # number of breakpoints
#signal, bkps = rpt.pw_constant(n_samples, dim, n_bkps, noise_std=sigma)


# detection
algo = rpt.Pelt(model="rbf").fit(signal)
result = algo.predict(pen=10)

# display
rpt.display(signal, bkps, result)
plt.show()

enter image description here

1 Ответ

1 голос
/ 11 января 2020

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

На практике pandas дает нам простой способ отличить серию с помощью метода .diff().

df = pd.DataFrame({'a': [10, 20, 30, 40, 50, 60],
                   'b': [1, 1000, 20000, 3, 50, 80],
                   'c': [1000, 4, 97, 16, 2500, 36]})
df.diff()

      a        b       c
0   NaN      NaN     NaN
1  10.0    999.0  -996.0
2  10.0  19000.0    93.0
3  10.0 -19997.0   -81.0
4  10.0     47.0  2484.0
5  10.0     30.0 -2464.0

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

df['a_first_difference'] = df['a'].diff()

Значения в этой серии затем будут распределяться самостоятельно. Возможно, обнаружение всех значений в разностных рядах выше некоторого порога даст вам возможность измерить «быстрое увеличение» путем определения периодов, в которых произошло наибольшее изменение по сравнению с предыдущим значением. Также можно получить .diff(), чтобы сообщить вам изменение от значения next :

df.diff(periods=-1)

      a        b       c
0 -10.0   -999.0   996.0
1 -10.0 -19000.0   -93.0
2 -10.0  19997.0    81.0
3 -10.0    -47.0 -2484.0
4 -10.0    -30.0  2464.0
5   NaN      NaN     NaN

Это, в таком случае, поможет идентифицировать те периоды, когда следующий шаг испытывает большие изменения ,

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