1
1
# -*- coding: utf-8 -*-
2
- # cython: embedsignature=True
3
2
u """
4
3
Created on 2015-8-7
5
4
@@ -14,6 +13,7 @@ import operator
14
13
import numpy as np
15
14
cimport numpy as np
16
15
import pandas as pd
16
+ cimport cython
17
17
from PyFin.Analysis.SecurityValues cimport SecurityValues
18
18
from PyFin.Utilities import to_dict
19
19
from PyFin.Math.Accumulators.StatefulAccumulators cimport Shift
@@ -98,37 +98,49 @@ cdef class SecurityValueHolder(object):
98
98
self ._innerHolders[name] = holder
99
99
100
100
@property
101
+ @ cython.boundscheck (False )
102
+ @ cython.wraparound (False )
101
103
def value (self ):
102
104
103
- cdef list values
105
+ cdef np.ndarray[ double , ndim = 1 ] values
104
106
cdef Accumulator holder
107
+ cdef int n
108
+ cdef int i
105
109
106
110
if self .updated:
107
111
return SecurityValues(self .cached.values, self .cached.name_mapping)
108
112
else :
109
113
keys = self ._innerHolders.keys()
110
- values = []
111
- for name in keys:
114
+ n = len (keys)
115
+ values = np.zeros(n)
116
+ for i, name in enumerate (keys):
112
117
try :
113
118
holder = self ._innerHolders[name]
114
- values.append( holder.result() )
119
+ values[i] = holder.result()
115
120
except ArithmeticError :
116
- values.append( np.nan)
117
- self .cached = SecurityValues(np.array( values) , index = OrderedDict(zip (keys, range (len (keys) ))))
121
+ values[i] = np.nan
122
+ self .cached = SecurityValues(values, index = OrderedDict(zip (keys, range (n ))))
118
123
self .updated = 1
119
124
return self .cached
120
125
126
+ @ cython.boundscheck (False )
127
+ @ cython.wraparound (False )
121
128
cpdef value_by_names(self , list names):
122
129
cdef Accumulator holder
130
+ cdef np.ndarray[double , ndim= 1 ] res
131
+ cdef int i
132
+ cdef int n
133
+
123
134
if self .updated:
124
135
return self .cached[names]
125
136
else :
126
- res = []
127
- for name in names:
137
+ n = len (names)
138
+ res = np.zeros(n)
139
+ for i, name in enumerate (names):
128
140
holder = self ._innerHolders[name]
129
- res.append( holder.result() )
130
- return SecurityValues(np.array( res) ,
131
- index = OrderedDict(zip (names, range (len (names) ))))
141
+ res[i] = holder.result()
142
+ return SecurityValues(res,
143
+ index = OrderedDict(zip (names, range (n ))))
132
144
133
145
cpdef value_by_name(self , name):
134
146
cdef Accumulator holder
@@ -296,11 +308,13 @@ cdef class FilteredSecurityValueHolder(SecurityValueHolder):
296
308
297
309
@property
298
310
def value (self ):
311
+ cdef SecurityValues filter_value
312
+
299
313
if self .updated:
300
314
return self .cached
301
315
else :
302
- filter_value = self ._filter.value.values
303
- self .cached = self ._computer.value.mask(filter_value)
316
+ filter_value = self ._filter.value
317
+ self .cached = self ._computer.value.mask(filter_value.values )
304
318
self .updated = 1
305
319
return self .cached
306
320
0 commit comments