def test_truncate_between_data_points(self): tds = self.market_opens.index days = tds[tds.slice_indexer( start=self.test_calendar_start + 1, end=self.test_calendar_start + 3 )] minutes = DatetimeIndex([ self.market_opens[days[0]] + timedelta(minutes=60), self.market_opens[days[1]] + timedelta(minutes=120), ]) sid = 1 data = DataFrame( data={ 'open': [10.0, 11.0], 'high': [20.0, 21.0], 'low': [30.0, 31.0], 'close': [40.0, 41.0], 'volume': [50.0, 51.0] }, index=minutes) self.writer.write_sid(sid, data) # Open a new writer to cover `open` method, also truncating only # applies to an existing directory. writer = BcolzMinuteBarWriter.open(self.dest) # Truncate to first day with data. writer.truncate(days[0]) # Refresh the reader since truncate update the metadata. self.reader = BcolzMinuteBarReader(self.dest) self.assertEqual(self.writer.last_date_in_output_for_sid(sid), days[0]) cal = self.trading_calendar _, last_close = cal.open_and_close_for_session(days[0]) self.assertEqual(self.reader.last_available_dt, last_close) minute = minutes[0] open_price = self.reader.get_value(sid, minute, 'open') self.assertEquals(10.0, open_price) high_price = self.reader.get_value(sid, minute, 'high') self.assertEquals(20.0, high_price) low_price = self.reader.get_value(sid, minute, 'low') self.assertEquals(30.0, low_price) close_price = self.reader.get_value(sid, minute, 'close') self.assertEquals(40.0, close_price) volume_price = self.reader.get_value(sid, minute, 'volume') self.assertEquals(50.0, volume_price)
def test_truncate_between_data_points(self): tds = self.market_opens.index days = tds[tds.slice_indexer( start=self.test_calendar_start + Timedelta(days=1), end=self.test_calendar_start + Timedelta(days=3) )] minutes = DatetimeIndex([ self.market_opens[days[0]] + timedelta(minutes=60), self.market_opens[days[1]] + timedelta(minutes=120), ]) sid = 1 data = DataFrame( data={ 'open': [10.0, 11.0], 'high': [20.0, 21.0], 'low': [30.0, 31.0], 'close': [40.0, 41.0], 'volume': [50.0, 51.0] }, index=minutes) self.writer.write_sid(sid, data) # Open a new writer to cover `open` method, also truncating only # applies to an existing directory. writer = BcolzMinuteBarWriter.open(self.dest) # Truncate to first day with data. writer.truncate(days[0]) # Refresh the reader since truncate update the metadata. self.reader = BcolzMinuteBarReader(self.dest) self.assertEqual(self.writer.last_date_in_output_for_sid(sid), days[0]) cal = self.trading_calendar _, last_close = cal.open_and_close_for_session(days[0]) self.assertEqual(self.reader.last_available_dt, last_close) minute = minutes[0] open_price = self.reader.get_value(sid, minute, 'open') self.assertEquals(10.0, open_price) high_price = self.reader.get_value(sid, minute, 'high') self.assertEquals(20.0, high_price) low_price = self.reader.get_value(sid, minute, 'low') self.assertEquals(30.0, low_price) close_price = self.reader.get_value(sid, minute, 'close') self.assertEquals(40.0, close_price) volume_price = self.reader.get_value(sid, minute, 'volume') self.assertEquals(50.0, volume_price)
def test_append_on_new_day(self): sid = 1 ohlcv = { 'open': [2.0], 'high': [3.0], 'low': [1.0], 'close': [2.0], 'volume': [10.0] } dt = self.market_opens[TEST_CALENDAR_STOP] data = DataFrame( data=ohlcv, 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_STOP + cday writer = BcolzMinuteBarWriter.open(self.dest, new_end_session) next_day_minute = dt + cday new_data = DataFrame( data=ohlcv, index=[next_day_minute]) writer.write_sid(sid, new_data) # 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, reader.get_value(sid, second_minute, col) ) self.assertEqual( 0, reader.get_value(sid, second_minute, 'volume') ) # 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_append_on_new_day(self): sid = 1 ohlcv = { 'open': [2.0], 'high': [3.0], 'low': [1.0], 'close': [2.0], 'volume': [10.0] } dt = self.market_opens[TEST_CALENDAR_STOP] data = DataFrame( data=ohlcv, 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_STOP + cday writer = BcolzMinuteBarWriter.open(self.dest, new_end_session) next_day_minute = dt + cday new_data = DataFrame( data=ohlcv, index=[next_day_minute]) writer.write_sid(sid, new_data) # 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, reader.get_value(sid, second_minute, col) ) self.assertEqual( 0, reader.get_value(sid, second_minute, 'volume') ) # 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_truncate_between_data_points(self): tds = self.market_opens.index days = tds[tds.slice_indexer( start=self.test_calendar_start + timedelta(days=1), end=self.test_calendar_start + timedelta(days=3), )] minutes = pd.DatetimeIndex([ self.market_opens[days[0]] + timedelta(minutes=60), self.market_opens[days[1]] + timedelta(minutes=120), ]) sid = 1 data = pd.DataFrame( data={ "open": [10.0, 11.0], "high": [20.0, 21.0], "low": [30.0, 31.0], "close": [40.0, 41.0], "volume": [50.0, 51.0], }, index=minutes, ) self.writer.write_sid(sid, data) # Open a new writer to cover `open` method, also truncating only # applies to an existing directory. writer = BcolzMinuteBarWriter.open(self.dest) # Truncate to first day with data. writer.truncate(days[0]) # Refresh the reader since truncate update the metadata. self.reader = BcolzMinuteBarReader(self.dest) assert self.writer.last_date_in_output_for_sid(sid) == days[0] cal = self.trading_calendar _, last_close = cal.open_and_close_for_session(days[0]) assert self.reader.last_available_dt == last_close minute = minutes[0] open_price = self.reader.get_value(sid, minute, "open") assert 10.0 == open_price high_price = self.reader.get_value(sid, minute, "high") assert 20.0 == high_price low_price = self.reader.get_value(sid, minute, "low") assert 30.0 == low_price close_price = self.reader.get_value(sid, minute, "close") assert 40.0 == close_price volume_price = self.reader.get_value(sid, minute, "volume") assert 50.0 == volume_price