Нахождение последовательности чередующихся номеров в списке

В настоящее время я пытаюсь реализовать правило Четвертого Нельсона по адресу: https://en.wikipedia.org/wiki/Nelson_rules

Т.е. учитывая список чисел длины N, я хочу знать, существует ли последовательная последовательность чисел, которые чередуются в направлении длины n. "Чередование" означает, что последовательные числа идут вверх, затем вниз, затем вверх и т. Д.

Мои данные в (t,x) кортежах. 't' обозначает ось времени, всегда увеличивающуюся. "х" - это значение, связанное со временем и сериями, которые нас интересуют. Например:

data = [(0, 2.5), (1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]

Здесь чередующаяся последовательность значений x предназначена для всего, кроме первого кортежа. Смотрите ниже график: Переменная последовательность в красном

Чередующаяся последовательность выделена красным. Правило ищет 14 точек подряд, но я хочу обобщить это на n точек подряд. (n

outliers = [(1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]

Я пробовал несколько вещей, ни одна из которых не привела к желаемому результату. К ним относятся такие вещи, как np.diff() и np.sign(). У меня есть чувство, что itertools() может сделать это, но я не могу туда добраться.

Любой вклад с благодарностью.

1 ответ

Решение

Вот первый шаг по вашему алгоритму в прямом Python:

data = [(0, 2.5), (1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]
n = 5

t0, x0 = data.pop(0)
outliers = []
up = bool(x0 > 0)

for t, x in data:
    if (x < x0 and up) or (x > x0 and not up):
        if not outliers:
            outliers = [(t0,x0)]
        outliers.append((t,x))
        up = not up
    else:
        if len(outliers) >= n:
            print 'outliers =', outliers
        outliers = []
    t0,x0 = t,x

if len(outliers) >= n:
    print 'outliers =', outliers
Другие вопросы по тегам