Обнаружить временной паттерн в последовательности событий

Вопрос или проблема

У меня есть временной ряд с меткой времени и связанным событием:

Время Событие
1 A
2 B
3 C
T A

Мне было интересно, существует ли техника/метод, чтобы выяснить, какие события чаще всего предшествуют другим в заданном временном промежутке. То есть, 10 секунд перед тем, как происходит A, события B и C происходят с вероятностью 90%. В идеале, результатом должны быть последовательности, которые встречаются чаще всего.

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

Кому-нибудь пришла в голову идея?

Спасибо

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

  1. Иметь данные временного ряда в виде списка
  2. Создать итератор, который будет другим списком/массивом, охватывающим временной интервал, который у вас есть, например, 10 секунд будет массивом длины 10, который включает 5 точек в текущий момент и 4 точки после него
  3. Подсчитать, какие события происходят, сохранить их в переменной если они происходят до/после вашего интересующего события

Позвольте мне написать типичный скрипт на Python:

### Вы можете расширить эти переменные в зависимости от типов событий, которые у вас есть
number_of_events_b = 0
number_of_events_c = 0
### Я принимаю ваши данные как переменную time_series_data
for i in range(5, len(time_series_data) ):
    current = time_series_data[i)
    time_frame = time_series_data[i-5:i+4]
    ### Если ваше событие A, подсчитайте B и C 
    if current == "A":
        for j in time_frame:
            if j == "B":
                number_of_events_b += 1
            elif j == "C":
                number_of_events_c += 1

    ### Если вы хотите получить относительную частоту каждого, вы можете просто сделать это на основе
    подсчетов, поэтому мне не нужно усложнять ответ

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

### Храните последовательности в виде матрицы
sequences = []
### Снова, я принимаю ваши данные как переменную time_series_data
for i in range(5, len(time_series_data) ):
    current = time_series_data[i)
    time_frame = time_series_data[i-5:i+4]
    ### Если ваше событие A, подсчитайте B и C 
    if current == "A":
        sequences.append(time_frame)

### Теперь вам нужно подсчитать, в какой степени каждая последовательность возникает
sequence_frequencies  = {} ### Храните в виде словаря для дальнейшего обращения
for sequence in sequences:
    sequence_count = 0
    for other_seq in sequences:
       if sequence == other_seq:
           sequence_count += 1
    sequence_frequencies[sequence] = sequence_count

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

Ответ или решение

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

Шаги анализа

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

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

  3. Итерация по событиям: Создайте цикл, который будет проходить по всем событиям в вашем временном ряду, начиная с точки, когда количество предшествующих событий более пяти.

  4. Подсчёт предшествующих событий: Для каждого текущего события в вашем ряду вам необходимо собрать информацию о тех событиях, которые происходили в течение 10 секунд (или вашего временного окна) до него. Это может быть реализовано с помощью вложенного цикла, который будет проходить по временным меткам, находящимся в пределах указанного окна времени.

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

Пример кода на Python

Ниже приведён простой пример алгоритма на Python, который демонстрирует описанные шаги:

# Инициализация переменных для хранения частоты событий
count_B = 0
count_C = 0

# Допустим, ваши данные представлены в виде списка кортежей (время, событие)
time_series_data = [(1, 'A'), (2, 'B'), (3, 'C'), (10, 'A')]
time_window = 10

# Проход по временным рядам
for i in range(len(time_series_data)):
    current_time, current_event = time_series_data[i]

    # Извлечение событий в пределах временного окна
    for j in range(i):
        prev_time, prev_event = time_series_data[j]

        if current_time - prev_time <= time_window:
            # Увеличение счётчиков для событий B и C
            if prev_event == 'B':
                count_B += 1
            elif prev_event == 'C':
                count_C += 1

# Вывод полученных результатов
print(f"Событие 'B' предшествовало 'A' {count_B} раз.")
print(f"Событие 'C' предшествовало 'A' {count_C} раз.")

Подсчёт последовательностей

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

sequences = []

# Проход по событиям и сохранение последовательностей
for i in range(len(time_series_data)):
    current_time, current_event = time_series_data[i]

    # Сбор событий в пределах временного окна
    time_frame = [event for _, event in time_series_data[max(0, i - 5):i]]

    # Добавление последовательности, если текущее событие 'A'
    if current_event == 'A':
        sequences.append(time_frame)

# Подсчёт частоты последовательностей
from collections import Counter
sequence_frequencies = Counter(tuple(seq) for seq in sequences)

# Вывод самых частых последовательностей
most_common_sequences = sequence_frequencies.most_common()
for seq, count in most_common_sequences:
    print(f"Последовательность {seq} встречается {count} раз.")

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...