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

标签 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]。它的元素随着时间的推移而减少。

理想情况下,我希望从这些类型的列表中得到 bool 结果。

其实我想知道一组数据的趋势。不是线性增加或精确地逐一增加。在现实世界中,有些数据并不总是好的,可能有一两个季度的数据不如以前(但不会太差,也不会太多),但只要它的趋势是好的,它很好。

最佳答案

On the whole, Its elements are increasing.

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

我合并了一个移动平均线 solution by @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"

解释

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

关于python - 如何确定 Python 中数字列表的趋势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359474/

相关文章:

python - 使用正则表达式替换文件中的字符串

python - 如何正确停止 python 线程?

java - 高效的Java列表合并算法

list - 减少 Common Lisp 中的循环列表

.net - 对列表(元组)进行排序

python - 可以用装饰器劫持类定义吗?

python - 应用程序与数据库的一个连接,还是每次执行时都连接?

java - 如何返回 BoundingVolume 中的所有点

algorithm - 给定训练数据时设置算法参数的一般准则

algorithm - 最短子序列时间复杂度