Я застрял с изменением проблемы раздвижного окна!python раз скользящее окно изменение
Обычно мы устанавливаем число элементов для слайдов, но в моем случае я хочу сдвинуть время!
Целью, которую я хотел бы достичь, является функция (поток в этом случае) , который способен создавать «временные» окна за считанные секунды (заданные пользователем).
Начиная с первого элемента очереди в этом случае:
[datetime.time (7, 6, 14, 537370), 584 добавить 5 секунд -> 7: 6: 19,537370 (конечная точка) и просуммировать все элементы в этом интервале:
[datetime.time(7, 6, 14, 537370), 584]
[datetime.time(7, 6, 18, 542798), 761]
Итого: 584 + 761 = 1345
Затем создайте еще "окно" со вторыми элементами и идет дальше. ВАЖНО: Один элемент может быть частью нескольких окон. элемент создается тем временем, решение naif с функцией, спящей за секунду, а затем сбрасывает очередь, не подходит для моей проблемы.
Я думаю, что его изменение этого поста: Flexible sliding window (in Python)
Но до сих пор не может решить эту проблему! Любая помощь или предложения будут оценены. Спасибо!
Пример списка элементов:
[datetime.time(7, 6, 14, 537370), 584]
[datetime.time(7, 6, 18, 542798), 761]
[datetime.time(7, 6, 20, 546007), 848]
[datetime.time(7, 6, 24, 550969), 20]
[datetime.time(7, 6, 27, 554370), 478]
[datetime.time(7, 6, 27, 554628), 12]
[datetime.time(7, 6, 31, 558919), 29]
[datetime.time(7, 6, 31, 559562), 227]
[datetime.time(7, 6, 32, 560863), 379]
[datetime.time(7, 6, 35, 564863), 132]
[datetime.time(7, 6, 37, 567276), 651]
[datetime.time(7, 6, 38, 568652), 68]
[datetime.time(7, 6, 40, 569861), 100]
[datetime.time(7, 6, 41, 571459), 722]
[datetime.time(7, 6, 44, 574802), 560]
...
Код:
import random
import time
import threading
import datetime
from multiprocessing import Queue
q = Queue()
#this is a producer that put elements in queue
def t1():
element = [0,0]
while True:
time.sleep(random.randint(0, 5))
element[0] = datetime.datetime.now().time()
element[1] = random.randint(0, 1000)
q.put(element)
#this is a consumer that sum elements inside a window of n seconds
#Ineed something a sliding window time of ten seconds that sum all elements for n seconds
def t2():
windowsize = 5 #size of the window 5 seconds
while not queue.empty():
e = q.get()
start = e[0] #the first element is the beginning point
end = start + datetime.timedelta(seconds=windowsize) #ending point
sum += e[1]
#some code that solve the problem :)
a = threading.Thread(target=t1)
a.start()
b = threading.Thread(target=t2)
b.start()
while True:
time.sleep(1)
Может ли элемент быть частью нескольких ваших «окон» или вы хотите использовать элемент из очереди, как только он суммируется с окном? Если элемент может быть частью нескольких окон, каков механизм, который в конечном итоге удаляет элементы из очереди («этот элемент определенно больше не нужен, давайте удалим его, чтобы избежать заполнения памяти»)? Это определенно разрешимо в любом случае, но просто нужно знать, что именно вы хотите достичь. – Hannu
Один элемент может быть частью нескольких окон, добавьте оригинальное сообщение, спасибо. – egariM
Итак, правильно ли я понимаю, что, как только ваша «очередь» имеет разницу во времени первого и последнего элементов более 10 секунд, тогда будет нормально истекать самые старые записи, пока все не вступит снова в 10-секундный кадр (или что бы мы ни решили использовать как максимум?), а затем ваш «t2» можно использовать для запроса окна размером 0-10 секунд, начиная с первого элемента? – Hannu