From b90091e4944fee8cd9851870b3ad4fe0ee64fad4 Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Sun, 22 Jan 2017 15:11:34 -0500 Subject: [PATCH] BUG: Fix end session metadata for minute bar writer. When opening with a new `end_session`, i.e. opening for append, write the new end session to the metadata. Fixes an issue where the calendar on minute bar readers did not include the recently appended day, causing reads on the last values to fail. According, update append test to read a value, instead of checking table length. --- tests/data/test_minute_bars.py | 28 +++++++++++++++------------- zipline/data/minute_bars.py | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/tests/data/test_minute_bars.py b/tests/data/test_minute_bars.py index 2c02ac5e..a801296a 100644 --- a/tests/data/test_minute_bars.py +++ b/tests/data/test_minute_bars.py @@ -439,40 +439,42 @@ class BcolzMinuteBarTestCase(WithTradingCalendars, 'volume': [10.0] } - first_minute = self.market_opens[TEST_CALENDAR_START] + dt = self.market_opens[TEST_CALENDAR_STOP] data = DataFrame( data=ohlcv, - index=[first_minute]) + index=[dt]) self.writer.write_sid(sid, data) # Open a new writer to cover `open` method, also a common usage # of appending new days will be writing to an existing directory. cday = self.trading_calendar.schedule.index.freq - new_end_session = TEST_CALENDAR_START + cday + new_end_session = TEST_CALENDAR_STOP + cday writer = BcolzMinuteBarWriter.open(self.dest, new_end_session) - next_day_minute = first_minute + cday + next_day_minute = dt + cday new_data = DataFrame( data=ohlcv, index=[next_day_minute]) writer.write_sid(sid, new_data) - second_minute = first_minute + Timedelta(minutes=1) + # Get a new reader to test updated calendar. + reader = BcolzMinuteBarReader(self.dest) + + second_minute = dt + Timedelta(minutes=1) # The second minute should have been padded with zeros for col in ('open', 'high', 'low', 'close'): assert_almost_equal( - nan, self.reader.get_value(sid, second_minute, col) + nan, reader.get_value(sid, second_minute, col) ) self.assertEqual( - 0, self.reader.get_value(sid, second_minute, 'volume') + 0, reader.get_value(sid, second_minute, 'volume') ) - # The first day should contain US_EQUITIES_MINUTES_PER_DAY rows. - # The second day should contain a single row. - self.assertEqual( - len(self.writer._ensure_ctable(sid)), - US_EQUITIES_MINUTES_PER_DAY + 1, - ) + # The next day minute should have data. + for col in ('open', 'high', 'low', 'close', 'volume'): + assert_almost_equal( + ohlcv[col], reader.get_value(sid, next_day_minute, col) + ) def test_write_multiple_sids(self): """ diff --git a/zipline/data/minute_bars.py b/zipline/data/minute_bars.py index 6e4f6a5a..8a76a01c 100644 --- a/zipline/data/minute_bars.py +++ b/zipline/data/minute_bars.py @@ -497,7 +497,7 @@ class BcolzMinuteBarWriter(object): metadata.minutes_per_day, metadata.default_ohlc_ratio, metadata.ohlc_ratios_per_sid, - write_metadata=False + write_metadata=end_session is not None ) @property