From 8048cdcfb05ef25f3409fd3b62c92674d7740ed9 Mon Sep 17 00:00:00 2001 From: Jean Bredeche Date: Mon, 19 Sep 2016 10:24:59 -0400 Subject: [PATCH] PERF: Be smarter about counting the number of minutes across a contiguous bunch of sessions. --- zipline/data/data_portal.py | 9 ++++---- zipline/utils/calendars/trading_calendar.py | 23 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/zipline/data/data_portal.py b/zipline/data/data_portal.py index c2efafd5..a6dcd093 100644 --- a/zipline/data/data_portal.py +++ b/zipline/data/data_portal.py @@ -1129,10 +1129,11 @@ class DataPortal(object): previous_session, ) - minutes_count = sum( - len(self.trading_calendar.minutes_for_session(session)) - for session in sessions - ) + minutes_count = \ + self.trading_calendar.minutes_count_for_sessions_in_range( + sessions[0], + sessions[-1] + ) # add the minutes for today today_open = self.trading_calendar.open_and_close_for_session( diff --git a/zipline/utils/calendars/trading_calendar.py b/zipline/utils/calendars/trading_calendar.py index 1d0f6fdf..01a5bf1b 100644 --- a/zipline/utils/calendars/trading_calendar.py +++ b/zipline/utils/calendars/trading_calendar.py @@ -149,6 +149,29 @@ class TradingCalendar(with_metaclass(ABCMeta)): def close_offset(self): return 0 + @lazyval + def _minutes_per_session(self): + diff = self.schedule.market_close - self.schedule.market_open + diff = diff.astype('timedelta64[m]') + return diff + 1 + + def minutes_count_for_sessions_in_range(self, start_session, end_session): + """ + Parameters + ---------- + start_session: pd.Timestamp + The first session. + + end_session: pd.Timestamp + The last session. + + Returns + ------- + int: The total number of minutes for the contiguous chunk of sessions. + between start_session and end_session, inclusive. + """ + return int(self._minutes_per_session[start_session:end_session].sum()) + @property def regular_holidays(self): """