如何确定一系列循环数据中的高值和低值?

时间:2010-12-07 21:23:43

标签: python statistics

我有一些代表周期性运动的数据。所以,它从高到低再回来;如果你要绘制它,它会想要一个正弦波。但是,振幅在每个周期中略有不同。我想列出整个序列中的每个最大值和最小值。如果有10个完整周期,我最终会得到20个数字,10个正数(高)和10个负数(低)。

这似乎是时间序列分析的一项工作,但我对统计数据的熟悉程度不足以确定。

我在python工作。

任何人都可以尽可能地给我一些指导代码库和术语吗?

3 个答案:

答案 0 :(得分:1)

您可能需要熟悉一些流行的python科学/统计库。想到了numpy。

here是来自SciPy邮件列表的一个项目,讨论如何使用numpy做你想做的事。

答案 1 :(得分:1)

如果您不想使用库,这不是一个过于复杂的问题,这样的事情应该做你想要的。基本上,当你从升序到降序迭代数据时,你有一个高,从下降到升序,你有一个低。

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])

答案 2 :(得分:0)

如果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)]

请注意,无论正弦曲线的相位偏移如何,此都应工作(很有可能)。