检测逐渐变化的数据集中的重大变化

时间:2017-05-01 16:28:15

标签: python statistics data-analysis

我在python中有一个数据列表,表示每分钟使用的资源量。我想找到它在该数据集中发生显着变化的次数。我所说的重大改变与我到目前为止所读到的有点不同。

例如如果我有像这样的数据集 [10,15,17,20,30,40,50,70,80,60,40,20]

我说当数据相对于之前的正常值增加一倍或减少一半时会发生重大变化。

例如因为列表以10开头,这是我们的起点正常点

然后,当数据加倍到20时,我将其视为一个重要更改,并将法线设置为20.

然后,当数据加倍到40时,它被认为是显着的变化,而法线现在是40

然后,当数据加倍到80时,它被认为是一个重大变化,而法线现在是80

之后,当数据减少一半到40时,它被认为是另一个重大变化,正常变为40

最后,当数据减少一半到20时,这是最后一次重大变化

这里总共有5个重大变化。

它与其他任何变化检测算法类似吗?如何在python中高效完成?

2 个答案:

答案 0 :(得分:2)

这是相对简单的。您可以通过列表中的单个迭代执行此操作。我们只是在发生“重大”变化时更新我们的基础。

请注意,我的实现适用于任何iterable或容器。例如,如果您想要读取文件而不必将其全部加载到内存中,这将非常有用。

def gen_significant_changes(iterable, *, tol = 2):
    iterable = iter(iterable) # this is necessary if it is container rather than generator.
    # note that if the iterable is already a generator iter(iterable) returns itself.
    base = next(iterable)
    for x in iterable:
        if x >= (base * tol) or x <= (base/tol):
            yield x
            base = x

my_list = [10,15,17,20,30,40,50,70,80,60,40,20]

print(list(gen_significant_changes(my_list)))

答案 1 :(得分:0)

我无法帮助Python部分,但就数学而言,您使用日志库2解决的问题相当简单。当前值除以a时会发生重大变化通过将2提高到不同于前一个值的功率(整数)可以达到常数。 (需要常量,因为数组中的第一个值构成比较的基础。)

对于t处的每个元素,请计算:

current  = math.log(Array[t]  /Array[0], 2)
previous = math.log(Array[t-1]/Array[0], 2)
if math.floor(current) <> math.floor(previous) a significant change has occurred

使用此方法,您无需跟踪正常点&#34;根本就是你需要的阵列。通过删除附加的状态变量,我们可以按任何顺序处理数组,如果数据集非常大,我们可以将数组的一部分提供给不同的线程。你现在的方法无法做到这一点。