Извлеките паттерн из временного ряда - PullRequest
0 голосов
/ 10 июля 2020

У меня есть следующий набор данных, Pandas фрейм данных:

      Score   min   max               Date
Loc
0    2.757  0.000  2.757 2020-07-04 11:00:00
3    2.723  2.723  0.000 2020-07-04 14:00:00
8    2.724  2.724  0.000 2020-07-04 19:00:00
11   2.752  0.000  2.752 2020-07-04 22:00:00
13   2.742  2.742  0.000 2020-07-05 00:00:00
15   2.781  0.000  2.781 2020-07-05 02:00:00
18   2.758  2.758  0.000 2020-07-05 05:00:00
20   2.865  0.000  2.865 2020-07-05 07:00:00
24   2.832  0.000  2.832 2020-07-05 11:00:00
25   2.779  2.779  0.000 2020-07-05 12:00:00
29   2.775  2.775  0.000 2020-07-05 16:00:00
34   2.954  0.000  2.954 2020-07-05 21:00:00
37   2.886  2.886  0.000 2020-07-06 00:00:00
48   3.101  0.000  3.101 2020-07-06 11:00:00
53   3.012  3.012  0.000 2020-07-06 16:00:00
55   3.068  0.000  3.068 2020-07-06 18:00:00
61   2.970  2.970  0.000 2020-07-07 00:00:00
64   3.058  0.000  3.058 2020-07-07 03:00:00

Где:

  1. Score - это очень базовая c тенденция, min и max - это локальные минимумы и максимумы Score.

  2. Loc - это значение по оси x этой строки, а date - это данные в этой строке на диаграмме.

Эти данные при нанесении на график выглядят так:

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

До сих пор мне удавалось отмечать только локальные максимумы и минимумы (желтые и красные точки) на графике, и я также знаю, как определить этот шаблон своими словами, мне нужно сделать это только из кода:

  1. Определить, когда точка минимумов / максимумов очень удалена (поэтому имеет более высокое значение) от предыдущей точки минимумов / максимумов

  2. После этого найдите, когда точки локальных минимумов и максимумов действительно рядом друг с другом, и их ценности не сильно отличаются друг от друга. Вкратце, когда за сильным увеличением следует диапазон, в котором оценка не go сильно увеличивается или уменьшается

Надеюсь, вопрос был достаточно ясным, если нужно, я могу дать более подробную информацию. Я не знаю, возможно ли это с Numpy или любой другой библиотекой.

1 Ответ

1 голос
/ 12 июля 2020

Я думаю, что вам может подойти Dynami c time warping (dtw). Я использовал его для чего-то подобного. По сути, это позволяет вам оценивать сходство временных рядов.

Вот известные мне python реализации:

  • fastdtw
  • dtw
  • dtw- python

Вот достойное объяснение того, как это работает

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

Например:

# Event were looking for
event = np.array([10, 100, 50, 60, 50, 70])

# A matching event occurring
event2 = np.array([0, 7, 12, 4, 11, 100, 51, 62, 53, 72])

# A non matching event
non_event = np.array([0, 5, 10, 5, 10, 20, 30, 20, 11, 9])

distance, path = fastdtw(event, event2)
distance2, path2 = fastdtw(event, non_event)

События

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

def event_corr(event,event2, path):
    d = []
    for p in path:
        d.append((event2[p[1]] * event[p[0]])/event[p[0]]**2)

    return np.mean(d)

print("Our event re-occuring is {:0.2f} correlated with our search event.".format(event_corr(event, event2, path)))
print("Our non-event is {:0.2f} correlated with our search event.".format(event_corr(event, non_event, path2)))

Производит:

Our event re-occurring is 0.85 correlated with our search event.

Our non-event is 0.45 correlated with our search event.

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