BUG: Make all iteration related methods fo BarData match __iter__

`for s in data` and methods like `for s in data.keys` were not producing
the same list of active sids

Make the other iteration methods match __iter__ by using the contains
method to check whether or not the sid is active.

For use of data outside of the algoscript context, which needs access
to all data fields use data._data
This commit is contained in:
Eddie Hebert
2013-12-17 11:13:12 -05:00
parent 8524039580
commit f2dc979fbc
2 changed files with 21 additions and 12 deletions
+19 -10
View File
@@ -164,23 +164,32 @@ class BarData(object):
def __iter__(self):
for sid, data in self._data.iteritems():
if len(data):
yield sid
def keys(self):
return self._data.keys()
# Allow contains override to filter out sids.
if sid in self:
if len(data):
yield sid
def iterkeys(self):
return self._data.iterkeys()
# Allow contains override to filter out sids.
return [sid for sid in self._data.iterkeys() if sid in self]
def keys(self):
# Allow contains override to filter out sids.
return list(self.iterkeys())
def itervalues(self):
return self._data.itervalues()
return (value for sid, value in self.iteritems())
def values(self):
return list(self.itervalues())
def iteritems(self):
return self._data.iteritems()
return ((sid, value) for sid, value
in self._data.iteritems()
if sid in self)
def items(self):
return self._data.items()
return list(self.iteritems())
def __len__(self):
return len(self._data.keys())
return len(self.keys())
+2 -2
View File
@@ -230,7 +230,7 @@ class BatchTransform(object):
Point of entry. Process an event frame.
"""
# extract dates
dts = [event.datetime for event in data.itervalues()]
dts = [event.datetime for event in data._data.itervalues()]
# we have to provide the event with a dt. This is only for
# checking if the event is outside the window or not so a
# couple of seconds shouldn't matter. We don't add it to
@@ -238,7 +238,7 @@ class BatchTransform(object):
# sid keys.
event = Event()
event.dt = max(dts)
event.data = {k: v.__dict__ for k, v in data.iteritems()
event.data = {k: v.__dict__ for k, v in data._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'