Python Генератор два входа, один выход, действует странно - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать генератор, который принимает потоковые данные из итеративного списка с плавающей точкой, затем эффективно берет производную от этих с плавающей точкой при поступлении данных, а затем возвращает результат мне как свой собственный список с плавающей точкой, для использования в Pandas. Это единственный способ в python, который я обнаружил, что он будет работать удаленно, и у меня был код, работавший (раньше он был намного более обедненным) без ошибок в течение нескольких минут, прежде чем я получил ошибки, которые я пытался кодировать. выход из положения, но безрезультатно. Первоначальный код был:

import itertools as it
def dy_dt(y_list, t_list):
    while True:
        for (count, y, t) in it.zip_longest(it.count(), y_list, t_list):
            if count > 0:
                previous_y = y_list[count-1]
                previous_t = t_list[count-1]
                y_value = y - previous_y
                t_value = t - previous_t

                y_prime = y_value/t_value

                yield y_prime
            else:
                raise StopIteration

И я бы использовал функцию генератора следующим образом (в качестве примера):

    l1 = [13.94,13.99,13.87,14.01,14.03]

    l2 = [1.298010000,1.298010001,1.298010002,1.298010003,1.298010004]
    velocity = dy_dt(l1, l2)
    velocity.send(None)
    print(velocity.__next__())

И он работал нормально. Хотя теперь я знаю, что в коде осталось несколько дыр, я смог вернуть 4 подходящих значения. Только когда я начал пытаться собирать данные в течение или когда l oop, мой компьютер начал выдавать ошибки итерации Stop (среди прочих), поэтому я начал их кодировать. Теперь у меня есть:

import itertools as it

def dy_dt(y_list, t_list):
    while True:
        for (count, y, t) in it.zip_longest(it.count(), y_list, t_list):
            if count == 0:
                y = float(0.0)
                t = float(0.0)
                y_list = []
                t_list = []
            if count > 0:
                previous_y = y_list[count-1]
                previous_t = t_list[count-1]
                y_value = y - previous_y
                t_value = t - previous_t

                y_prime = y_value/t_value

                yield y_prime

            else:
                y_prime = 0
                y_list.append(y)
                t_list.append(t)

                yield y_prime

И он все равно не будет работать так, как я хочу, со значениями выше. Прямо сейчас это дает мне ошибку индекса:


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-150-1754949f99f9> in <module>
      8 velocity.send(None)
      9 
---> 10 print(velocity.__next__())
     11 #for
     12 

<ipython-input-148-a4b5784e039e> in dy_dt(y_list, t_list)
     12                 t_list = []
     13             if count > 0:
---> 14                 previous_y = y_list[count-1]
     15                 previous_t = t_list[count-1]
     16                 y_value = y - previous_y

IndexError: list index out of range

Но я чувствую, как будто я кодировал для этого. Что я понимаю после того, как потратил как минимум дюжину часов времени Коронавируса (в котором я уже искал StackOverflow для ответов), так это то, что, как бы ни была root эта ошибка, она мала, и я хотел бы упростить функцию / позвони, где смогу. Я буду благодарен за любую помощь, которую вы можете предложить.

Кроме того, я не прошу никого кодировать новую проблему (в отличие от совета), но если я собираюсь принять потоковые данные, которые может приходить быстрее или медленнее (интервалы 0,1 сек c - 1,5 сек c, среднее ~ 0,6 сек c), хорошо ли мне добавить async и await к этой функции?

...