ENH: Add a method to open existing minute bar directory.

Remove need for a consumer that is editing an existing minute bars directory to
reread the values which should not change from the metadata.

Add a test to the append on new day and truncate, which would be the common
usage of this method.
This commit is contained in:
Eddie Hebert
2017-01-17 17:25:27 -05:00
parent e27833c362
commit 261803b622
2 changed files with 34 additions and 3 deletions
+12 -3
View File
@@ -445,11 +445,16 @@ class BcolzMinuteBarTestCase(WithTradingCalendars,
index=[first_minute])
self.writer.write_sid(sid, data)
next_day_minute = first_minute + Timedelta(days=1)
# 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
writer = BcolzMinuteBarWriter.open(self.dest, new_end_session)
next_day_minute = first_minute + cday
new_data = DataFrame(
data=ohlcv,
index=[next_day_minute])
self.writer.write_sid(sid, new_data)
writer.write_sid(sid, new_data)
second_minute = first_minute + Timedelta(minutes=1)
@@ -1014,8 +1019,12 @@ class BcolzMinuteBarTestCase(WithTradingCalendars,
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.
self.writer.truncate(days[0])
writer.truncate(days[0])
# Refresh the reader since truncate update the metadata.
self.reader = BcolzMinuteBarReader(self.dest)
+22
View File
@@ -478,6 +478,28 @@ class BcolzMinuteBarWriter(object):
)
metadata.write(self._rootdir)
@classmethod
def open(cls, rootdir, end_session=None):
"""
Open an existing ``rootdir`` for writing.
Parameters
----------
end_session : Timestamp (optional)
When appending, the intended new ``end_session``.
"""
metadata = BcolzMinuteBarMetadata.read(rootdir)
return BcolzMinuteBarWriter(
rootdir,
metadata.calendar,
metadata.start_session,
end_session if end_session is not None else metadata.end_session,
metadata.minutes_per_day,
metadata.default_ohlc_ratio,
metadata.ohlc_ratios_per_sid,
write_metadata=False
)
@property
def first_trading_day(self):
return self._start_session