有一种方法可以从另一种方法的生成器中获取下一个值吗?

时间:2019-05-09 23:01:30

标签: python pandas generator

我的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

3 个答案:

答案 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