检测上升趋势和下降趋势

时间:2020-05-23 20:53:01

标签: python

我正在研究一个项目,并试图创建一个函数来检测趋势的增加或减少,因为我一开始就无法访问所有值,所以每次只给一个元素即可。

是这样的:

第一次迭代:

def detect_trend(arr[0], k, r, q):
       return array_upward_trend, array_downward_trend

第二次迭代:

def detect_trend(arr[1], k, r, q):
       return array_upward_trend, array_downward_trend

,依此类推。

k定义了趋势。意味着仅当趋势增加/减少了最后k个元素时,才形成趋势。尽管如果趋势已经开始形成并且在q个元素之后,我们给函数赋予值arr[i],但是如果该值是重复值或者是距上一个r很小范围内的元素元素arr[i-1]赋予函数,那么它不会破坏趋势的创建。

例如,我有这个数组

arr=[72 92 42 130 131 412 412 512 345 301 257 101 101 65 72 87 89 80 76 76 75 72 73]

len(arr)迭代后的输出为

array_upward_trend=[[42 130 131 412 412 512],[65 72 87 89]]
array_downward_trend=[[512 345 301 257 101 101 65], [89 80 76 76 75 72 73]]

k=4q=3r=0.015(在这种情况下,r的意思是1.5%的范围)

我无法完成这项工作,并再次从头开始。我真的很感谢任何帮助

谢谢

1 个答案:

答案 0 :(得分:0)

首先,欢迎来到stackoverflow。 其次,下次您可能想以不同的方式提出问题,因为此任务必须包含许多子任务。这意味着在这里寻求帮助的其他人可能会略过此帖子,因此回答它的价值降低。因此,我建议您将复杂的任务分解为较小的任务。

以下代码应该可以工作,但是效率不高,但是可能会给您一个想法。

# =============================================================================
# complete function
# =============================================================================

def detect_trend(arr, number_new, k, r, q):

    # append new element to arr
    arr.append(number_new)

    # up trend
    arr_trends = []
    arr_add = []
    for i, number in enumerate(arr):
        if i != 0:
            previous_number = arr[i-1]

            if len(arr_add) >= q:
                if previous_number/number <= 1+r :
                    bool_logic = True
                else:
                    bool_logic = (previous_number <= number)
            else:
                bool_logic = (previous_number <= number)

            if bool_logic:
                if arr_add == []:
                    arr_add = arr_add + [previous_number]
                arr_add = arr_add + [number]
                if i == len(arr) - 1:
                    arr_trends.append(arr_add)
            else:
                arr_trends.append(arr_add)
                arr_add = []

    array_upward_trend = [trend for trend in arr_trends if len(trend)>=k]


    # down trend
    arr_trends = []
    arr_add = []
    for i, number in enumerate(arr):
        if i != 0:
            previous_number = arr[i-1]

            if len(arr_add) >= q:
                if previous_number/number >= 1-r :
                    bool_logic = True
                else:
                    bool_logic = (previous_number >= number)
            else:
                bool_logic = (previous_number >= number)

            if bool_logic:
                if arr_add == []:
                    arr_add = arr_add + [previous_number]
                arr_add = arr_add + [number]
                if i == len(arr) - 1:
                    arr_trends.append(arr_add)
            else:
                arr_trends.append(arr_add)
                arr_add = []

    array_downward_trend = [trend for trend in arr_trends if len(trend)>=k]

    return arr, array_upward_trend, array_downward_trend

arr = [72,92,42,130,131,412,412,512,345,301,257,101,101,65,72,87,89,80,76,76,75,72,73]
number_new = 74
q = 3
k = 4
r = 0.015

arr, array_upward_trend, array_downward_trend = detect_trend(arr, number_new, k, r, q)

如何到达那里? 首先,您可能需要将复杂的问题分解为一系列简单的问题。 然后,您可以开始一个接一个地解决它们,然后将它们组合起来。 这是我的方法:

首先解决可能最困难的一个问题,因为如果失败,其他任务将无关紧要。这里通常是趋势检测。

# =============================================================================
# detect (up) trends
# =============================================================================

arr_trends = []
arr_add = []
for i, number in enumerate(arr):
    if i != 0:
        previous_number = arr[i-1]
        if (previous_number <= number):
            if arr_add == []:
                arr_add = arr_add + [previous_number]
            arr_add = arr_add + [number]
            if i == len(arr) - 1:
                arr_trends.append(arr_add)
        else:
            arr_trends.append(arr_add)
            arr_add = []

# =============================================================================
# consider q and r
# =============================================================================

arr_trends = []
arr_add = []
for i, number in enumerate(arr):
    if i != 0:
        previous_number = arr[i-1]

        if len(arr_add) >= q:
            if previous_number/number <= 1+r :
                bool_logic = True
            else:
                bool_logic = (previous_number <= number)
        else:
            bool_logic = (previous_number <= number)

        if bool_logic:
            if arr_add == []:
                arr_add = arr_add + [previous_number]
            arr_add = arr_add + [number]
            if i == len(arr) - 1:
                arr_trends.append(arr_add)
        else:
            arr_trends.append(arr_add)
            arr_add = []

# =============================================================================
# invert trend logic
# =============================================================================

arr_trends = []
arr_add = []
for i, number in enumerate(arr):
    if i != 0:
        previous_number = arr[i-1]

        if len(arr_add) >= q:
            if previous_number/number >= 1-r :
                bool_logic = True
            else:
                bool_logic = (previous_number >= number)
        else:
            bool_logic = (previous_number >= number)

        if bool_logic:
            if arr_add == []:
                arr_add = arr_add + [previous_number]
            arr_add = arr_add + [number]
            if i == len(arr) - 1:
                arr_trends.append(arr_add)
        else:
            arr_trends.append(arr_add)
            arr_add = []

# =============================================================================
# consider k
# =============================================================================

[trend for trend in arr_trends if len(trend)>=k]

# =============================================================================
# append new element to arr
# =============================================================================

arr.append(number_new)