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

时间:2018-03-19 09:22:25

标签: python list

有没有简单的方法可以找出列表的趋势?

例如:

  • [5.0, 6.0, 9.0, 4.0, 10.0]。总的来说,它的元素随着时间的推移而不断增加。
  • [6.0, 4.0, 5.0, 4.0, 3.0]。其元素随着时间的推移而逐渐减少。

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

实际上,我想知道数据收集的趋势。不是线性增加或逐个增加。在现实世界中,一些数据并不总是好的,也许有一两个季度的数据不像以前那么好(但也不是太糟糕,也不是太多),但只要它的趋势是好的,它很好。

2 个答案:

答案 0 :(得分:6)

  

总的来说,它的元素正在增加。

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

我已将移动平均线solution by @Jaimenp.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
  • >0确定更改是否全部为正数或不是全部为正数。由于没有明确的要求而过度简化。

答案 1 :(得分:0)

你可以简单地检查,这会有效吗?

def checker(list_):
    check={}
    temp = []
    for m, n in enumerate(list_):
        try:
            if list_[m] < list_[m + 1]:
                temp.append('Increasing')
            else:
                temp.append('Decreasing')
        except IndexError:
            pass
    check[temp.count('Increasing')] = 1
    check[temp.count('Decreasing')] = 0


    return check[max(check)]

test_Case 1:

print(checker([5.0, 6.0, 9.0, 4.0, 10.0]))

输出:

1

test_Case 2

print(checker([6.0, 4.0, 5.0, 4.0, 3.0]))

输出:

0