From 699a47fe3d74a7825115057e6c8f462281ec272d Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Wed, 6 Feb 2013 14:06:58 -0500 Subject: [PATCH] Converts batch transform panel to use pd.Panel dictionary arg. Based on @twiecki's work in batch_to_pandas branch. --- zipline/transforms/utils.py | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/zipline/transforms/utils.py b/zipline/transforms/utils.py index 87bf647c..e4a4ed42 100644 --- a/zipline/transforms/utils.py +++ b/zipline/transforms/utils.py @@ -396,7 +396,12 @@ class BatchTransform(EventWindow): # sid keys. event = Event() event.dt = max(dts) - event.data = data + event.data = {k: v.__dict__ for k, v in data.iteritems() + # Need to check if data has a 'length' to filter + # out sids without trade data available. + # TODO: expose more of 'no trade available' + # functionality to zipline + if len(v)} # append data frame to window. update() will call handle_add() and # handle_remove() appropriately @@ -410,7 +415,7 @@ class BatchTransform(EventWindow): # every sid has the same fields. sid_keys = [] for sid in event.data.itervalues(): - keys = set([name for name, value in sid.__dict__.items() + keys = set([name for name, value in sid.items() if (isinstance(value, (int, float)))]) sid_keys.append(keys) @@ -457,25 +462,11 @@ class BatchTransform(EventWindow): """ # This Panel data structure ultimately gets passed to the # user-overloaded get_value() method. + data_dict = {tick['dt']: tick['data'] for tick in self.ticks} + data = pd.Panel(data_dict, major_axis=self.field_names, + minor_axis=self.sids) - # If sids are set, use those. Otherwise extract. - if self.sids is not None: - sids = self.sids - else: - sids = set.union(*[set(tick.data.keys()) for tick in self.ticks]) - - dts = [tick.dt for tick in self.ticks] - - data = pd.Panel(items=self.field_names, major_axis=dts, - minor_axis=sids) - - # Fill data panel - for tick in self.ticks: - dt = tick.dt - for sid in sids: - fields = tick.data[sid] - for field_name in self.field_names: - data[field_name][sid].ix[dt] = fields.__dict__[field_name] + data = data.swapaxes(0, 1) if self.clean_nans: # Fills in gaps of missing data during transform