From 52b099f6db762d65dab50535ca38d87381dab81a Mon Sep 17 00:00:00 2001 From: Thomas Wiecki Date: Sun, 30 Dec 2012 17:04:01 -0500 Subject: [PATCH] ENH: Added new kwarg to batch_transform: create_panel. --- tests/test_transforms.py | 5 +++++ zipline/test_algorithms.py | 12 +++++++++++- zipline/transforms/utils.py | 17 ++++++++++++++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/tests/test_transforms.py b/tests/test_transforms.py index 1b2536dc..1d0197a9 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections import deque + import pytz import numpy as np import pandas as pd @@ -354,6 +356,9 @@ class TestBatchTransform(TestCase): self.assertIn('price', data.items) self.assertIn('ignore', data.items) + for data in algo.history_return_ticks[wl:]: + self.assertTrue(isinstance(data, deque)) + # test overloaded class for test_history in [algo.history_return_price_class, algo.history_return_price_decorator]: diff --git a/zipline/test_algorithms.py b/zipline/test_algorithms.py index 735e3348..c82edcf8 100644 --- a/zipline/test_algorithms.py +++ b/zipline/test_algorithms.py @@ -72,6 +72,7 @@ The algorithm must expose methods: """ from copy import deepcopy +import numpy as np from zipline.algorithm import TradingAlgorithm from zipline.finance.slippage import FixedSlippage @@ -271,6 +272,7 @@ class BatchTransformAlgorithm(TradingAlgorithm): self.history_return_sid_filter = [] self.history_return_field_filter = [] self.history_return_field_no_filter = [] + self.history_return_ticks = [] self.return_price_class = ReturnPriceBatchTransform( refresh_period=self.refresh_period, @@ -328,6 +330,13 @@ class BatchTransformAlgorithm(TradingAlgorithm): clean_nans=True ) + self.return_ticks = return_data( + refresh_period=self.refresh_period, + window_length=self.window_length, + clean_nans=True, + create_panel=False + ) + self.iter = 0 self.set_slippage(FixedSlippage()) @@ -340,6 +349,8 @@ class BatchTransformAlgorithm(TradingAlgorithm): self.history_return_args.append( self.return_args_batch.handle_data( data, *self.args, **self.kwargs)) + self.history_return_ticks.append( + self.return_ticks.handle_data(data)) new_data = deepcopy(data) for sid in new_data: @@ -354,7 +365,6 @@ class BatchTransformAlgorithm(TradingAlgorithm): self.return_nan.handle_data(data)) else: nan_data = deepcopy(data) - import numpy as np for sid in nan_data.iterkeys(): nan_data[sid].price = np.nan self.history_return_nan.append( diff --git a/zipline/transforms/utils.py b/zipline/transforms/utils.py index 4e3f72d1..8182441c 100644 --- a/zipline/transforms/utils.py +++ b/zipline/transforms/utils.py @@ -345,7 +345,8 @@ class BatchTransform(EventWindow): window_length=None, clean_nans=True, sids=None, - fields=None): + fields=None, + create_panel=True): """Instantiate new batch_transform object. :Arguments: @@ -367,6 +368,12 @@ class BatchTransform(EventWindow): Which fields to include in the moving window (e.g. 'price'). If not supplied, fields will be extracted from incoming events. + create_panel : bool + If False, will create a pandas panel every refresh + period and pass it to the user-defined function. + If True, will pass the underlying deque reference + directly to the function which will be significantly + faster. """ super(BatchTransform, self).__init__(True, @@ -378,6 +385,7 @@ class BatchTransform(EventWindow): self.compute_transform_value = self.get_value self.clean_nans = clean_nans + self.create_panel = create_panel self.sids = sids if isinstance(self.sids, (str, int)): @@ -528,8 +536,11 @@ class BatchTransform(EventWindow): return None if self.updated: - self.cached = self.compute_transform_value(self.get_data(), - *args, **kwargs) + # Either create new pandas panel or pass ticks dequeue + # directly + data = self.get_data() if self.create_panel else self.ticks + self.cached = self.compute_transform_value(data, *args, + **kwargs) return self.cached