有没有简单的方法可以找出列表的趋势?
例如:
[5.0, 6.0, 9.0, 4.0, 10.0]
。总的来说,它的元素随着时间的推移而不断增加。[6.0, 4.0, 5.0, 4.0, 3.0]
。其元素随着时间的推移而逐渐减少。理想情况下,我想从这些类型的列表中得到布尔结果。
实际上,我想知道数据收集的趋势。不是线性增加或逐个增加。在现实世界中,一些数据并不总是好的,也许有一两个季度的数据不像以前那么好(但也不是太糟糕,也不是太多),但只要它的趋势是好的,它很好。
答案 0 :(得分:6)
总的来说,它的元素正在增加。
我认为这意味着您要考虑移动平均线的变化。一半的工作是定义你真正想要的东西,所以我建议你在开始编写逻辑之前仔细考虑这个。
我已将移动平均线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个条目窗口的移动平均值。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