как найти время эффективным способом, когда значение пересекает пороговое значение - PullRequest
0 голосов
/ 14 января 2020

Существует графическая визуализация списка значений (time, count), где время по оси x и счет по оси y, например,

 list_1 = [(1, 50000), (2,40000), (3,20000), (4,10000), (5, 5000), (6, 3000), (7,500), (8, 10), (9,100), (10,2000), (11,5000),(11,8000),(12,10000), (13,20000)]

Моя цель - найти время, в которое счет увеличился за пределы или равен limit = 20000, то есть (13,20000) вдоль стороны наклона увеличения, а не стороны наклона уменьшения

, пожалуйста, найдите график для получения дополнительной информации

Я написал псевдокод, который делает то же самое, но неэффективно

Но одним ограничением является то, что list_1 не является фиксированным значением, но продолжает увеличиваться с новым значением с f (time, count)

def find_limit():
    list_1 = [(1, 50000), (2, 40000), (3, 20000), (4, 10000), (5, 5000), (6, 3000), (7, 500), (8, 10), (9, 100),
              (10, 2000), (11, 5000), (11, 8000), (12, 10000), (13, 20000)]
    found = False
    limit = 20000
    for time, count in list_1:
        if count < limit:
            found = True
        if found:
            if count >= limit:
                return time

print(find_limit())

Есть ли какой-нибудь другой способ получить время, когда счет увеличился за порог, когда список продолжает обновляться с новым значением?

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Использование numpy:

import numpy as np

limit = 20000
list_1 = np.array([(1, 50000), (2, 40000), (3, 20000), (4, 10000), (5, 5000), (6, 3000), (7, 500), (8, 10), (9, 100),
              (10, 2000), (11, 5000), (11, 8000), (12, 10000), (13, 20000)])

res=list_1[((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit)).argmax()+1,:]
#list_1[((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit)).argmax()+1,0] in order to get just 13

Короче:

((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit))

Возвращает булевский вектор с результатом сравнения двух последовательных чисел для того, было ли между ними пересечено limit , Левая часть берет элементы от индекса 0 до одного перед последним, тогда как правая часть берет элементы от индекса 1 до последнего, с соответствующими условиями.

Следующая вещь - argmax() вернет первый индекс, где выполняются оба условия, и нам нужно добавить 1, так как мы хотим получить индекс, где линия была пересечена, а не один раньше.

Вывод:

[   13 20000]
0 голосов
/ 14 января 2020

IIU C

list_1 = [(1, 50000), (2,40000), (3,20000), (4,10000), (5, 5000), (6, 3000), (7,500), 
          (8, 10), (9,100), (10,2000), (11,5000),(11,8000),(12,10000), (13,20000)]

df = pd.DataFrame(list_1, columns=['time', 'count'])

# Set the limit
limit = 20_000
times_over_limit = df[df['count'] < limit]['time'].tolist()

# List of times for which count is less than limit value
times_over_limit
[4, 5, 6, 7, 8, 9, 10, 11, 11, 12]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...