Я пытаюсь создать генератор, который принимает потоковые данные из итеративного списка с плавающей точкой, затем эффективно берет производную от этих с плавающей точкой при поступлении данных, а затем возвращает результат мне как свой собственный список с плавающей точкой, для использования в 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
к этой функции?