我的get_new_point方法中有一个生成器,该生成器从dict中的数据帧中检索数据元组。理想情况下,当我运行update_trailing_points方法时,它将从生成器中检索下一个元组。但是,当我实际运行update_trailing_points方法时,它每次都返回相同的元组(数据帧的第一行)。我在这里做什么错了?
让我解释一下我的数据结构,因为我知道它们可能会有些混乱:
all_data是数据帧的字典。关键是“符号”
symbol_list是键(符号)的列表
def get_new_point(self,symbol):
for i in self.all_data[symbol].index:
yield tuple([self.all_data[symbol]['timestamp'][i],\
self.all_data[symbol]['point'][i])
def update_trailing_points(self):
for s in self.symbol_list:
try:
new_point = self.get_new_point(s).__next__()
except StopIteration:
self.continue_test = False
答案 0 :(得分:1)
self.get_new_point(s)
返回一个生成器对象。
new_point = self.get_new_point(s).__next__()
每次运行这段代码时,您都将重新初始化生成器。
您应该只进行一次self.get_new_point(s)
调用,但是多次对该对象进行__next__()
调用。
答案 1 :(得分:0)
这不是生成器的使用方式。检查一下:
def test(n):
for i in range(10):
yield i
# bad: creates a new generator every time.
n = 10
for i in range(n):
print(test(n).__next__())
# good: creates a single generator then iterates over it
n = 10
t = test(n)
for i in range(n):
print(next(t))
答案 2 :(得分:0)
FWIW,您的get_new_point
可以“得到改善”:
def make_point_generator(self, symbol):
df = self.all_data[symbol][['timestamp', 'point']]
yield from df.itertuples(index=False)
建议尽可能直接使用pandas
功能!
我假设您希望生成器超过点数。然后:
def __init__(self):
self.__gens = None
def update_trailing_points(self):
if self.__gens is None:
self.__gens = {s: self.make_point_generator(s) for s in self.symbol_list}
for s in self.symbol_list:
try:
new_point = next(self.__gens[s])
except StopIteration:
self.continue_test = False