From f088afc1e148ad64c98b0cd7c2cf987dd986e85c Mon Sep 17 00:00:00 2001 From: Andrew Daniels Date: Fri, 28 Apr 2017 15:53:04 -0400 Subject: [PATCH] MAINT: Modify ReindexBarReader.get_value to handle missing data Instead of raising an exception, return 0.0 for volume, and nan for everything else. --- tests/data/test_resample.py | 9 +++------ zipline/data/resample.py | 14 +++++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/data/test_resample.py b/tests/data/test_resample.py index 53c5493a..4829189e 100644 --- a/tests/data/test_resample.py +++ b/tests/data/test_resample.py @@ -16,12 +16,11 @@ from numbers import Real from nose_parameterized import parameterized from numpy.testing import assert_almost_equal -from numpy import nan, array, full +from numpy import nan, array, full, isnan import pandas as pd from pandas import DataFrame from six import iteritems -from zipline.data.bar_reader import NoDataOnDate from zipline.data.resample import ( minute_frame_to_session_frame, DailyHistoryAggregator, @@ -863,11 +862,9 @@ class TestReindexSessionBars(WithBcolzEquityDailyBarReader, "first session should be 10.") tday = pd.Timestamp('2015-11-26', tz='UTC') - with self.assertRaises(NoDataOnDate): - self.reader.get_value(1, tday, 'close') + self.assertTrue(isnan(self.reader.get_value(1, tday, 'close'))) - with self.assertRaises(NoDataOnDate): - self.reader.get_value(1, tday, 'volume') + self.assertEqual(self.reader.get_value(1, tday, 'volume'), 0) def test_last_availabe_dt(self): self.assertEqual(self.reader.last_available_dt, self.END_DATE) diff --git a/zipline/data/resample.py b/zipline/data/resample.py index 4676a18f..f7257df7 100644 --- a/zipline/data/resample.py +++ b/zipline/data/resample.py @@ -25,6 +25,7 @@ from zipline.data._resample import ( _minute_to_session_close, _minute_to_session_volume, ) +from zipline.data.bar_reader import NoDataOnDate from zipline.data.minute_bars import MinuteBarReader from zipline.data.session_bars import SessionBarReader from zipline.utils.memoize import lazyval @@ -606,10 +607,6 @@ class ReindexBarReader(with_metaclass(ABCMeta)): Currently only supports a ``trading_calendar`` which is a superset of the ``reader``'s calendar. - Also, the currenty implementation only reindexes the results from - ``load_raw_arrays``, but in the future, `get_value` may also be made to - provide an empty result instead of raising on error. - Parameters ---------- @@ -652,7 +649,14 @@ class ReindexBarReader(with_metaclass(ABCMeta)): return self._reader.first_trading_day def get_value(self, sid, dt, field): - return self._reader.get_value(sid, dt, field) + # Give an empty result if no data is present. + try: + return self._reader.get_value(sid, dt, field) + except NoDataOnDate: + if field == 'volume': + return 0 + else: + return np.nan @abstractmethod def _outer_dts(self, start_dt, end_dt):