MAINT: Modify ReindexBarReader.get_value to handle missing data

Instead of raising an exception, return 0.0 for volume, and nan for
everything else.
This commit is contained in:
Andrew Daniels
2017-04-28 15:53:04 -04:00
parent caed14adcc
commit f088afc1e1
2 changed files with 12 additions and 11 deletions
+3 -6
View File
@@ -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)
+9 -5
View File
@@ -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):