首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测增减趋势

检测增减趋势
EN

Stack Overflow用户
提问于 2020-05-24 04:53:02
回答 1查看 193关注 0票数 1

我正在做一个项目,并试图创建一个函数,通过一次只给它一个元素来检测增加或减少的趋势,因为我不能访问开始时的所有值。

应该是这样的:

第一次迭代:

代码语言:javascript
复制
def detect_trend(arr[0], k, r, q):
       return array_upward_trend, array_downward_trend

第二次迭代:

代码语言:javascript
复制
def detect_trend(arr[1], k, r, q):
       return array_upward_trend, array_downward_trend

诸若此类。

k是定义趋势的东西。这意味着,只有当趋势增加/减少了最后的k元素时,才会形成趋势。虽然如果趋势已经开始形成,并且在q元素之后,我们给函数赋值arr[i],但是如果这个值是重复的,或者是小范围内的元素,而不是提供给函数的前一个元素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)迭代后的输出为

代码语言:javascript
复制
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%的范围)

我一直没能让这个工作再一次从头开始。我真的很感谢任何形式的帮助

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-05-24 20:59:24

首先,欢迎来到stackoverflow。其次,下一次你可能想用不同的方式来问这个问题,因为这个任务有很多子任务。这意味着其他在这里寻求帮助的人可能会跳过这篇文章,从而使回答它变得更不值得。因此,我建议您将复杂的任务拆分成较小的任务。

下面的代码应该可以工作,但效率还不是很高,但可能会给你一个启发。

代码语言:javascript
复制
# =============================================================================
# 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)

怎么去那里?首先,你可能想把复杂的问题分成一系列简单的问题。然后你开始一个接一个地解决它们,然后再把它们组合起来。以下是我的方法:

首先选择可能最困难的任务,因为如果你失败了,其他任务就无关紧要了。这里是一般的趋势检测。

代码语言:javascript
复制
# =============================================================================
# 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61978451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档