如何确定周期数据中的高低值?

5 投票
3 回答
2191 浏览
提问于 2025-04-16 08:12

我有一些数据,表示周期性的运动。简单来说,它会从高点降到低点,然后再回到高点;如果你把它画出来,就像一个正弦波。不过,每个周期的幅度(也就是高低的差距)稍微有点不同。我想列出整个序列中的每个最高点和最低点。如果有10个完整的周期,我最终会得到20个数字,10个高点和10个低点。

这听起来像是时间序列分析的工作,但我对统计学不太熟悉,所以不太确定。

我在用python编程。

有没有人能给我一些建议,比如可以用的代码库和相关术语?

3 个回答

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

请注意,这个方法应该在很大概率上都能有效,不管正弦波的相位偏移是什么。

1

你可能需要了解一些流行的Python科学和统计库,比如numpy。

另外,这里有一条来自SciPy邮件列表的信息,讨论了如何使用numpy来实现你想要的功能。

2

这个问题其实并不复杂,如果你不想使用库的话,像这样的方法就能满足你的需求。简单来说,当你在处理数据时,如果从小到大变成了从大到小,那就是一个高点;而如果从大到小变成了从小到大,那就是一个低点。

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

撰写回答