mirror of
https://github.com/wassname/catalyst.git
synced 2026-08-12 11:50:11 +08:00
BUG: Ensure matched input length to minute writer.
When the dts and length of cols are mismatched the writer behaves in unintended ways. e.g. in a case where a consumer passed dts which had minutes with no trades removed, but regular (market minute for day) sized arrays for the data with `0`'s on minutes without trades, the non trade minutes from cols are written to slots in the output where a trade is intended. Protect against this misuse by checking that all lengths are equal when using the `write_cols` method. Make a separate `_write_cols` method for use by both `write_cols` and `write`, since the `write` method which takes a DataFrame has the matched input length enforced by the DataFrame.
This commit is contained in:
@@ -42,6 +42,7 @@ from zipline.data.minute_bars import (
|
||||
BcolzMinuteBarReader,
|
||||
BcolzMinuteOverlappingData,
|
||||
US_EQUITIES_MINUTES_PER_DAY,
|
||||
BcolzMinuteWriterColumnMismatch
|
||||
)
|
||||
from zipline.finance.trading import TradingEnvironment
|
||||
|
||||
@@ -594,6 +595,20 @@ class BcolzMinuteBarTestCase(TestCase):
|
||||
|
||||
self.assertEquals(51.0, volume_price)
|
||||
|
||||
def test_write_cols_mismatch_length(self):
|
||||
dts = date_range(self.market_opens[self.test_calendar_start],
|
||||
periods=2, freq='min').asi8.astype('datetime64[s]')
|
||||
sid = 1
|
||||
cols = {
|
||||
'open': array([10.0, 11.0, 12.0]),
|
||||
'high': array([20.0, 21.0]),
|
||||
'low': array([30.0, 31.0, 33.0, 34.0]),
|
||||
'close': array([40.0, 41.0]),
|
||||
'volume': array([50.0, 51.0, 52.0])
|
||||
}
|
||||
with self.assertRaises(BcolzMinuteWriterColumnMismatch):
|
||||
self.writer.write_cols(sid, dts, cols)
|
||||
|
||||
def test_unadjusted_minutes(self):
|
||||
"""
|
||||
Test unadjusted minutes.
|
||||
|
||||
Reference in New Issue
Block a user