mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-07 09:50:21 +08:00
ENH: Added new kwarg to batch_transform: create_panel.
This commit is contained in:
@@ -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]:
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 <default=True>
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user