Skip to content

Commit 9d7049a

Browse files
author
Andrew Daniels
authored
Merge pull request #1500 from quantopian/make-metadata-optional
MAINT: Adds option for minute bar writer to not write metadata
2 parents 9f77473 + 518b1d7 commit 9d7049a

File tree

2 files changed

+35
-76
lines changed

2 files changed

+35
-76
lines changed

tests/data/test_minute_bars.py

Lines changed: 14 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
Timedelta,
3434
NaT,
3535
date_range,
36-
isnull,
3736
)
3837

3938
from zipline.data.bar_reader import NoDataOnDate
@@ -971,8 +970,15 @@ def test_truncate_between_data_points(self):
971970
# Truncate to first day with data.
972971
self.writer.truncate(days[0])
973972

973+
# Refresh the reader since truncate update the metadata.
974+
self.reader = BcolzMinuteBarReader(self.dest)
975+
974976
self.assertEqual(self.writer.last_date_in_output_for_sid(sid), days[0])
975977

978+
cal = self.trading_calendar
979+
_, last_close = cal.open_and_close_for_session(days[0])
980+
self.assertEqual(self.reader.last_available_dt, last_close)
981+
976982
minute = minutes[0]
977983

978984
open_price = self.reader.get_value(sid, minute, 'open')
@@ -995,28 +1001,6 @@ def test_truncate_between_data_points(self):
9951001

9961002
self.assertEquals(50.0, volume_price)
9971003

998-
minute = minutes[1]
999-
1000-
open_price = self.reader.get_value(sid, minute, 'open')
1001-
1002-
self.assertTrue(isnull(open_price))
1003-
1004-
high_price = self.reader.get_value(sid, minute, 'high')
1005-
1006-
self.assertTrue(isnull(high_price))
1007-
1008-
low_price = self.reader.get_value(sid, minute, 'low')
1009-
1010-
self.assertTrue(isnull(low_price))
1011-
1012-
close_price = self.reader.get_value(sid, minute, 'close')
1013-
1014-
self.assertTrue(isnull(close_price))
1015-
1016-
volume_price = self.reader.get_value(sid, minute, 'volume')
1017-
1018-
self.assertEqual(0.0, volume_price)
1019-
10201004
def test_truncate_all_data_points(self):
10211005

10221006
tds = self.market_opens.index
@@ -1044,51 +1028,15 @@ def test_truncate_all_data_points(self):
10441028
# day with minute data.
10451029
self.writer.truncate(self.test_calendar_start)
10461030

1031+
# Refresh the reader since truncate update the metadata.
1032+
self.reader = BcolzMinuteBarReader(self.dest)
1033+
10471034
self.assertEqual(
10481035
self.writer.last_date_in_output_for_sid(sid),
10491036
self.test_calendar_start,
10501037
)
10511038

1052-
minute = minutes[0]
1053-
1054-
open_price = self.reader.get_value(sid, minute, 'open')
1055-
1056-
self.assertTrue(isnull(open_price))
1057-
1058-
high_price = self.reader.get_value(sid, minute, 'high')
1059-
1060-
self.assertTrue(isnull(high_price))
1061-
1062-
low_price = self.reader.get_value(sid, minute, 'low')
1063-
1064-
self.assertTrue(isnull(low_price))
1065-
1066-
close_price = self.reader.get_value(sid, minute, 'close')
1067-
1068-
self.assertTrue(isnull(close_price))
1069-
1070-
volume_price = self.reader.get_value(sid, minute, 'volume')
1071-
1072-
self.assertEquals(0.0, volume_price)
1073-
1074-
minute = minutes[1]
1075-
1076-
open_price = self.reader.get_value(sid, minute, 'open')
1077-
1078-
self.assertTrue(isnull(open_price))
1079-
1080-
high_price = self.reader.get_value(sid, minute, 'high')
1081-
1082-
self.assertTrue(isnull(high_price))
1083-
1084-
low_price = self.reader.get_value(sid, minute, 'low')
1085-
1086-
self.assertTrue(isnull(low_price))
1087-
1088-
close_price = self.reader.get_value(sid, minute, 'close')
1089-
1090-
self.assertTrue(isnull(close_price))
1091-
1092-
volume_price = self.reader.get_value(sid, minute, 'volume')
1093-
1094-
self.assertEqual(0.0, volume_price)
1039+
cal = self.trading_calendar
1040+
_, last_close = cal.open_and_close_for_session(
1041+
self.test_calendar_start)
1042+
self.assertEqual(self.reader.last_available_dt, last_close)

zipline/data/minute_bars.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ class BcolzMinuteBarWriter(object):
317317
318318
Defaults to supporting 15 years of NYSE equity market data.
319319
see: http://bcolz.blosc.org/opt-tips.html#informing-about-the-length-of-your-carrays # noqa
320+
write_metadata : bool, optional
321+
If True, writes the minute bar metadata (on init of the writer).
322+
If False, no metadata is written (existing metadata is
323+
retained). Default is True.
320324
321325
Notes
322326
-----
@@ -373,7 +377,8 @@ def __init__(self,
373377
minutes_per_day,
374378
default_ohlc_ratio=OHLC_RATIO,
375379
ohlc_ratios_per_sid=None,
376-
expectedlen=DEFAULT_EXPECTEDLEN):
380+
expectedlen=DEFAULT_EXPECTEDLEN,
381+
write_metadata=True):
377382

378383
self._rootdir = rootdir
379384
self._start_session = start_session
@@ -391,15 +396,16 @@ def __init__(self,
391396
self._minute_index = _calc_minute_index(
392397
self._schedule.market_open, self._minutes_per_day)
393398

394-
metadata = BcolzMinuteBarMetadata(
395-
self._default_ohlc_ratio,
396-
self._ohlc_ratios_per_sid,
397-
self._calendar,
398-
self._start_session,
399-
self._end_session,
400-
self._minutes_per_day,
401-
)
402-
metadata.write(self._rootdir)
399+
if write_metadata:
400+
metadata = BcolzMinuteBarMetadata(
401+
self._default_ohlc_ratio,
402+
self._ohlc_ratios_per_sid,
403+
self._calendar,
404+
self._start_session,
405+
self._end_session,
406+
self._minutes_per_day,
407+
)
408+
metadata.write(self._rootdir)
403409

404410
@property
405411
def first_trading_day(self):
@@ -795,6 +801,11 @@ def truncate(self, date):
795801
)
796802
shutil.move(tmp_path, sid_path)
797803

804+
# Update end session in metadata.
805+
metadata = BcolzMinuteBarMetadata.read(self._rootdir)
806+
metadata.end_session = date
807+
metadata.write(self._rootdir)
808+
798809

799810
class BcolzMinuteBarReader(MinuteBarReader):
800811
"""

0 commit comments

Comments
 (0)