Как определить высокие и низкие значения в серии циклических данных? - PullRequest
4 голосов
/ 08 декабря 2010

У меня есть некоторые данные, которые представляют периодическое движение.Итак, оно идет от максимума к минимуму и обратно;если бы вы планировали это, это было бы подобно синусоиде.Однако амплитуда слегка меняется в каждом цикле.Я хотел бы составить список каждого максимума и минимума во всей последовательности.Если бы было 10 полных циклов, я бы в итоге получил 20 чисел, 10 положительных (высокий) и 10 отрицательных (низкий).

Кажется, что это работа для анализа временных рядов, но я неЯ достаточно знаком со статистикой, чтобы знать наверняка.

Я работаю в Python.

Кто-нибудь может дать мне несколько советов, насколько это возможно, библиотеки и терминологию кода?

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

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

def get_highs_and_lows(data):
    prev = data[0]
    high = []
    low = []
    asc = None
    for value in data[1:]:
        if not asc and value > prev:
            asc = True
            low.append(prev)
        elif (asc is None or asc) and value < prev:
            asc = False
            high.append(prev)
        prev = value
    if asc:
        high.append(data[-1])
    else:
        low.append(data[-1])
    return (high, low)

>>> data = [0, 1, 2, 1, 0, -2, 0, 2, 4, 2, 6, 8, 4, 0, 2, 4]
>>> print str(get_highs_and_lows(data))
([2, 4, 8, 4], [0, -2, 2, 0])
1 голос
/ 08 декабря 2010

Возможно, вам придется ознакомиться с некоторыми из популярных библиотек Python по науке / статистике.На ум приходит numpy.

И здесь Это элемент из списка рассылки SciPy, обсуждающий, как делать то, что вы хотите, используя numpy.

0 голосов
/ 08 декабря 2010

Если x - это список ваших данных, и вы знаете, длина цикла, T, попробуйте это:

# Create 10 1000-sample cycles of a noisy sine wave.
T = 1000
x = scipy.sin(2*scipy.pi*scipy.arange(10*T)/T) + 0.1*scipy.randn(10*T)
# Find the maximum and minimum of each cycle.
[(min(x[i:i+T]), max(x[i:i+T])) for i in range(0, len(x), T)]
# prints the following:
[(-1.2234858463372265, 1.2508648231644286),
 (-1.2272859833650591, 1.2339382830978067),
 (-1.2348835727451217, 1.2554960382962332),
 (-1.2354184224872098, 1.2305636540601534),
 (-1.2367724101594981, 1.2384651681019756),
 (-1.2239698560399894, 1.2665865375358363),
 (-1.2211500568892304, 1.1687268390393153),
 (-1.2471220836642811, 1.296787070454136),
 (-1.3047322264307399, 1.1917835644190464),
 (-1.3015059337968433, 1.1726658435644288)]

Обратите внимание, что это должно работатьнезависимо от сдвига фазы синусоиды (с высокой вероятностью).

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