Нахождение последовательности чередующихся номеров в списке
В настоящее время я пытаюсь реализовать правило Четвертого Нельсона по адресу: 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 Я пробовал несколько вещей, ни одна из которых не привела к желаемому результату. К ним относятся такие вещи, как np.diff() и np.sign(). У меня есть чувство, что itertools() может сделать это, но я не могу туда добраться. Любой вклад с благодарностью.outliers = [(1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]
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