Python 3中的条件良率(生成器)

时间:2018-06-19 08:11:59

标签: python python-3.x iterator generator yield

我有多个数据源将数据推送到公共存储。每个数据源基本上只是存储在_all_data字典中的pandas数据帧itertuples()迭代器:

for ticker, df in dataframe.groupby('ticker'):
    self._all_data[ticker] = df.itertuples()

然后我有一种方法可以产生下一行数据。目标是在满足某些要求时仅产生一行。在这种情况下,它必须是特定的DateTime:

def _get_next_bar(self, ticker: str, datetime: pd.datetime):
    for bar in self._all_data[ticker]:
        if getattr(bar, 'time') == datetime:
            yield bar

这个要求的原因是每个数据源在不同的特定时间可以有不同数量的观察,所以我只想在数据存储在当前DateTime观察时产生一个条。我是这样做的:

def update_bars(self):
    date = next(self._get_next_datetime())
    for ticker in self.ticker_list:
        try:
            next_bar = next(self._get_next_bar(ticker, date))
        except StopIteration:
            self.continue_backtest = False
        else:
            if next_bar is not None:
                self.historic_data[ticker].append(next_bar)
                self.events.put(MarketEvent(ticker))

其中_get_next_datetime()被定义为:

def _get_next_datetime(self):
    for datetime in self.all_datetimes:
        yield datetime

但问题是,只要条形符合要求,就会引发StopIteration异常。这是一个问题,因为这应该是阻止我的程序的信号。如果我删除了日期时间要求(如果getattr(bar, 'time') == datetime),我的程序运行正常并在迭代器为空时引发StopIteration错误。但是,如果我保留了该要求,则会在第一个日期时间引发错误而不进行观察。

如何以其他方式实现此目的?我可以使用pd.itertuples()吗?

创建自己的包含自定义异常的生成器

0 个答案:

没有答案