From 815c9f2cf636ac5b4e12ff924a3da15df8fb9ff1 Mon Sep 17 00:00:00 2001 From: fawce Date: Sat, 6 Oct 2012 12:15:54 -0400 Subject: [PATCH] providing default behavior for positions dictionary. non-existent positions are returned as zero size/value positions. --- zipline/finance/performance.py | 23 +++++++++++++---------- zipline/gens/tradesimulation.py | 3 ++- zipline/utils/protocol_utils.py | 8 ++++---- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index 704383e5..a24c6f12 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -544,21 +544,16 @@ class PerformancePeriod(object): del(portfolio['max_leverage']) del(portfolio['max_capital_used']) - portfolio['positions'] = self.get_positions(ndicted=True) + portfolio['positions'] = self.get_positions() return zp.ndict(portfolio) - def get_positions(self, ndicted=False): - if ndicted: - positions = zp.ndict({}) - else: - positions = {} + def get_positions(self): + + positions = zp.ndict(internal=position_ndict()) for sid, pos in self.positions.iteritems(): cur = pos.to_dict() - if ndicted: - positions[sid] = zp.ndict(cur) - else: - positions[sid] = cur + positions[sid] = zp.ndict(cur) return positions @@ -576,3 +571,11 @@ class positiondict(dict): pos = Position(key) self[key] = pos return pos + + +class position_ndict(dict): + + def __missing__(self, key): + pos = Position(key) + self[key] = zp.ndict(pos.to_dict()) + return pos diff --git a/zipline/gens/tradesimulation.py b/zipline/gens/tradesimulation.py index 0eb6bf20..6160c2dc 100644 --- a/zipline/gens/tradesimulation.py +++ b/zipline/gens/tradesimulation.py @@ -15,6 +15,7 @@ from logbook import Logger, Processor +from collections import defaultdict from datetime import datetime from itertools import groupby @@ -146,7 +147,7 @@ class AlgorithmSimulator(object): # The algorithm's universe as of our most recent event. # We want an ndict that will have empty ndicts as default # values on missing keys. - self.universe = ndict(default=ndict) + self.universe = ndict(internal=defaultdict(ndict)) # We don't have a datetime for the current snapshot until we # receive a message. diff --git a/zipline/utils/protocol_utils.py b/zipline/utils/protocol_utils.py index 22f4b19a..bb836b24 100644 --- a/zipline/utils/protocol_utils.py +++ b/zipline/utils/protocol_utils.py @@ -1,7 +1,7 @@ import copy import pandas from ctypes import Structure, c_ubyte -from collections import MutableMapping, defaultdict +from collections import MutableMapping def Enum(*options): @@ -45,9 +45,9 @@ class ndict(MutableMapping): cls = None __slots__ = ['cls', '__internal'] - def __init__(self, dct=None, default=None): - if default is not None: - self.__internal = defaultdict(default) + def __init__(self, dct=None, internal=None): + if internal is not None: + self.__internal = internal else: self.__internal = dict()