From 87f99331e80075f668a8daf037036c2b2b5d078f Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Wed, 23 Jan 2013 13:41:57 -0500 Subject: [PATCH] Uses an object for sid data to be passed to handle data. Moving another datatype off of ndict, to make it easier to inspect objects in memory when debugging. --- zipline/gens/tradesimulation.py | 8 +++++--- zipline/protocol.py | 19 +++++++++++++++++++ zipline/transforms/utils.py | 4 ++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/zipline/gens/tradesimulation.py b/zipline/gens/tradesimulation.py index 109e2796..0b41b07a 100644 --- a/zipline/gens/tradesimulation.py +++ b/zipline/gens/tradesimulation.py @@ -18,6 +18,7 @@ from logbook import Logger, Processor from collections import defaultdict from zipline import ndict +from zipline.protocol import SIDData from zipline.finance.trading import TransactionSimulator from zipline.finance.performance import PerformanceTracker @@ -151,9 +152,9 @@ class AlgorithmSimulator(object): # ============== # The algorithm's universe as of our most recent event. - # We want an ndict that will have empty ndicts as default + # We want an ndict that will have empty objects as default # values on missing keys. - self.universe = ndict(internal=defaultdict(ndict)) + self.universe = ndict(internal=defaultdict(SIDData)) # We don't have a datetime for the current snapshot until we # receive a message. @@ -251,7 +252,8 @@ class AlgorithmSimulator(object): self.algo.set_portfolio(event.portfolio) # Update our knowledge of this event's sid - self.universe[event.sid].update(event.__dict__) + sid_data = self.universe[event.sid] + sid_data.__dict__.update(event.__dict__) def simulate_snapshot(self, date): """ diff --git a/zipline/protocol.py b/zipline/protocol.py index 25f1b90b..dc235b98 100644 --- a/zipline/protocol.py +++ b/zipline/protocol.py @@ -85,3 +85,22 @@ class Positions(dict): pos = Position(key) self[key] = pos return pos + + +class SIDData(object): + + def __init__(self, initial_values=None): + if initial_values: + self.__dict__ = initial_values + + def __getitem__(self, name): + return self.__dict__[name] + + def __setitem__(self, name, value): + self.__dict__[name] = value + + def __len__(self): + return len(self.__dict__) + + def __repr__(self): + return "SIDData({0})".format(self.__dict__) diff --git a/zipline/transforms/utils.py b/zipline/transforms/utils.py index 40fb3556..0891747f 100644 --- a/zipline/transforms/utils.py +++ b/zipline/transforms/utils.py @@ -446,7 +446,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.items() + keys = set([name for name, value in sid.__dict__.items() if (isinstance(value, (int, float)))]) sid_keys.append(keys) @@ -511,7 +511,7 @@ class BatchTransform(EventWindow): for sid in sids: fields = tick.data[sid] for field_name in self.field_names: - data[field_name][sid].ix[dt] = fields[field_name] + data[field_name][sid].ix[dt] = fields.__dict__[field_name] if self.clean_nans: # Fills in gaps of missing data during transform