我正在研究一个项目,并试图创建一个函数来检测趋势的增加或减少,因为我一开始就无法访问所有值,所以每次只给一个元素即可。
是这样的:
第一次迭代:
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=4
,q=3
和r=0.015
(在这种情况下,r
的意思是1.5%的范围)
我无法完成这项工作,并再次从头开始。我真的很感谢任何帮助
谢谢
答案 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)