如何在Python中确定数字列表的趋势

Fra*_*ang 2 python algorithm list moving-average

有什么简单的方法可以找出列表的趋势吗?

例如:

  • [5.0, 6.0, 9.0, 4.0, 10.0]。总体而言,其元素随时间而增加。
  • [6.0, 4.0, 5.0, 4.0, 3.0]。随着时间的流逝,它的元素正在减少。

理想情况下,我希望从此类列表中获得布尔值结果。

实际上,我想知道数据收集的趋势。不是线性增加或正好一一增加。在现实世界中,某些数据并不总是那么好,也许有四分之一的数据不如以前那么好(但不是太差,也就不是太多),但是只要其趋势良好,就可以很好。

jpp*_*jpp 8

总体而言,其要素正在增加。

我认为这意味着您要考虑移动平均线的变化。一半的工作就是定义您真正想要的东西,因此我建议您在开始编写逻辑之前仔细考虑一下。

我将@Jaime的移动平均值解决方案与结合起来np.diff,提出了一种推断您想要的可能方法。

import numpy as np

def moving_average(a, n=3) :
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1:] / n

lst1 = [5.0, 6.0, 9.0, 4.0, 10.0]
lst2 = [6.0, 4.0, 5.0, 4.0, 3.0]

res1 = np.all(np.diff(moving_average(np.array(lst1), n=4))>0)
# True; i.e. "generally increasing"

res2 = np.all(np.diff(moving_average(np.array(lst2), n=4))>0)
# False, i.e. "generally not increasing"
Run Code Online (Sandbox Code Playgroud)

说明

  • moving_average 在4个条目的窗口中计算移动平均值。
  • 在每种情况下,您都会得到一个由2个数字组成的数组(用于长度为5的列表)。
  • np.diff 然后计算这些数字之间的成对变化。
  • np.all通过测试>0确定变化是全部为正还是不是全部为正。没有明确要求导致的过分简化。

  • 鉴于请求的模棱两可和答案的优雅,这是一个可靠的答案。 (2认同)