找出最大äºæŸçš„结æŸæ—¶é—´ï¼Ÿ

时间:2019-07-01 15:46:23

标签: python-3.x numpy time-series

我看ç€this answer那里,他们有一个éžå¸¸èªæ˜Žçš„解决方案,å¯ä»¥æ‰¾åˆ°æœ€å¤§è·Œå¹…开始的点,最大跌幅是最低点。但是,根æ®Wikipedia,这还ä¸æ˜¯ç»“æŸæ—¶é—´ï¼ˆå¦‚答案中所述)。周期结æŸæ˜¯æ‚¨è¾¾åˆ°ç¼©æ°´æœŸå¼€å§‹ä¹‹å‰çš„峰值时。

è¿™æ„味ç€ç¼©æ°´æœŸå¯¹æˆ‘链接的答案中给出的图形没有终点。我正在å°è¯•ç¼–写å¯ä»¥è§£å†³æ­¤é—®é¢˜çš„代ç ï¼Œåœ¨ä¸¤ç§æƒ…况下,{1)有结æŸæ—¶é—´ï¼Œ2)没有结æŸæ—¶é—´}。

如果å¥å·æ°¸è¿œä¸ä¼šç»“æŸï¼Œæˆ‘åªå¸Œæœ›å®ƒè¿”回数组的最åŽä¸€ä¸ªç´¢å¼•ï¼ˆå› æ­¤åŸºæœ¬ä¸Šæ˜¯æ•°ç»„的长度),如果å¥å·ç¡®å®žç»“æŸäº†ï¼Œæˆ‘想è¦æ­£ç¡®çš„索引。这是一个简化的示例,其中我å°è¯•è§£å†³ç¬¬ä¸€ç§æƒ…况-当它有结æŸæ—¶é—´æ—¶ï¼š

import numpy as np

an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
# running_maximum = [21, 22, 23, 40, 40, 40, 40, 45, 45, 45, 45]

bottom_index = np.argmax(running_maximum - an_array)
start_index = np.argmax(an_array[:bottom_of_period])
# bottom_index = 4, start_index = 3

difference = running_maximum - an_array
# difference = [0, 0, 0, 0, 21, 5, 3, 0, 3, 6, 17]

我之所以计算difference是因为它很容易看到end_index=7。这是因为最大跌幅在索引4处为21,并且由于difference=0在索引7处å†æ¬¡å‡ºçŽ°ï¼Œè¿™æ„味ç€æˆ‘å†æ¬¡è¶…过(或刚刚达到)我的峰值。我å°è¯•ç¼–写np.argmin(difference[bottom_index:])æ¥èŽ·å–索引,但是由于我对å‘é‡difference进行了切片,因此这当然ä¸ä¼šç»™æˆ‘7,而是给了我3,这是ä¸æ­£ç¡®çš„。

关于如何解决此问题的任何技巧,并使其在没有结æŸæ—¶é—´çš„情况下返回最åŽä¸€ä¸ªç´¢å¼•ï¼Œè¿™å°†æ˜¯ä»¤äººæƒŠè®¶çš„。

1 个答案:

答案 0 :(得分:0)

我认为这å¯ä»¥è§£å†³ï¼›

import numpy as np

an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
difference = running_maximum - an_array

bottom_index = np.argmax(difference)
start_index = np.argmax(an_array[:bottom_index])

if difference[bottom_index:].__contains__(0):
    end_index = len(difference[:bottom_index]) + np.argmin(difference[bottom_index:])
else:
    end_index = len(difference)

使用给定的示例数组,我得到end_index = 7。如果我更改an_array[4]=39,最大的缺点将ä¸å†ç»“æŸï¼Œè€Œæˆ‘得到end_index = 11。ä¸ç¡®å®š__contains__(0)是å¦æœ‰æ•ˆã€‚