检测增长和下降趋势

2024-09-27 22:20:05 发布

您现在位置: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元素时,才会形成趋势。虽然如果趋势已经开始形成,并且在q元素之后,我们给函数赋予值arr[i],但是如果该值是一个重复的值,或者是一个在给定给函数的前一个元素arr[i-1]r小范围内的元素,那么它不会中断趋势的创建

例如,我有一个数组

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.015r在本例中表示范围为1.5%)

我没能做到这一点,又一次从零开始。我真的很感激任何帮助

谢谢


Tags: 项目函数元素return定义def数组array
1条回答
网友
1楼 · 发布于 2024-09-27 22:20:05

首先,欢迎来到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)

相关问题 更多 >

    热门问题