diff --git a/tests/test_panel_daily_bar_reader.py b/tests/test_panel_daily_bar_reader.py index e371673a..ba30cca9 100644 --- a/tests/test_panel_daily_bar_reader.py +++ b/tests/test_panel_daily_bar_reader.py @@ -91,3 +91,10 @@ class TestPanelDailyBarReader(WithAssetFinder, ) ) self.assertEqual(str(e.exception), expected) + + def test_sessions(self): + sessions = self.reader.sessions + + self.assertEqual(21, len(sessions)) + self.assertEqual(self.START_DATE, sessions[0]) + self.assertEqual(self.END_DATE, sessions[-1]) diff --git a/zipline/data/us_equity_loader.py b/zipline/data/us_equity_loader.py index c21c8557..a6d1fd9e 100644 --- a/zipline/data/us_equity_loader.py +++ b/zipline/data/us_equity_loader.py @@ -387,7 +387,7 @@ class USEquityDailyHistoryLoader(USEquityHistoryLoader): @property def _calendar(self): - return self._reader._sessions + return self._reader.sessions def _array(self, dts, assets, field): return self._reader.load_raw_arrays( diff --git a/zipline/data/us_equity_pricing.py b/zipline/data/us_equity_pricing.py index 19e68e59..1cc76bc3 100644 --- a/zipline/data/us_equity_pricing.py +++ b/zipline/data/us_equity_pricing.py @@ -398,6 +398,10 @@ class DailyBarReader(with_metaclass(ABCMeta)): def spot_price(self, sid, day, colname): pass + @abstractproperty + def sessions(self): + pass + @abstractproperty def last_available_dt(self): pass @@ -500,7 +504,7 @@ class BcolzDailyBarReader(DailyBarReader): return ctable(rootdir=maybe_table_rootdir, mode='r') @lazyval - def _sessions(self): + def sessions(self): if 'calendar' in self._table.attrs.attrs: # backwards compatibility with old formats, will remove return DatetimeIndex(self._table.attrs['calendar'], tz='UTC') @@ -563,7 +567,7 @@ class BcolzDailyBarReader(DailyBarReader): @property def last_available_dt(self): - return self._sessions[-1] + return self.sessions[-1] def _compute_slices(self, start_idx, end_idx, assets): """ @@ -609,8 +613,8 @@ class BcolzDailyBarReader(DailyBarReader): def load_raw_arrays(self, columns, start_date, end_date, assets): # Assumes that the given dates are actually in calendar. - start_idx = self._sessions.get_loc(start_date) - end_idx = self._sessions.get_loc(end_date) + start_idx = self.sessions.get_loc(start_date) + end_idx = self.sessions.get_loc(end_date) first_rows, last_rows, offsets = self._compute_slices( start_idx, end_idx, @@ -654,8 +658,8 @@ class BcolzDailyBarReader(DailyBarReader): if day >= asset.end_date: # go back to one day before the asset ended - search_day = self._sessions[ - self._sessions.searchsorted(asset.end_date) - 1 + search_day = self.sessions[ + self.sessions.searchsorted(asset.end_date) - 1 ] else: search_day = day @@ -667,9 +671,9 @@ class BcolzDailyBarReader(DailyBarReader): return None if volumes[ix] != 0: return search_day - prev_day_ix = self._sessions.get_loc(search_day) - 1 + prev_day_ix = self.sessions.get_loc(search_day) - 1 if prev_day_ix > -1: - search_day = self._sessions[prev_day_ix] + search_day = self.sessions[prev_day_ix] else: return None @@ -690,10 +694,10 @@ class BcolzDailyBarReader(DailyBarReader): or after the date range of the equity. """ try: - day_loc = self._sessions.get_loc(day) + day_loc = self.sessions.get_loc(day) except: raise NoDataOnDate("day={0} is outside of calendar={1}".format( - day, self._sessions)) + day, self.sessions)) offset = day_loc - self._calendar_offsets[sid] if offset < 0: raise NoDataOnDate( @@ -772,6 +776,10 @@ class PanelDailyBarReader(DailyBarReader): self.panel = panel + @property + def sessions(self): + return self._calendar + @property def last_available_dt(self): return self._calendar[-1]