Skip to content

Commit 5ca6cb6

Browse files
committed
enhance the performance
1 parent 4e4bde8 commit 5ca6cb6

File tree

10 files changed

+156
-141
lines changed

10 files changed

+156
-141
lines changed

PyFin/Analysis/CrossSectionValueHolders.pyx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ cimport cython
1313
from PyFin.Analysis.SeriesValues cimport SeriesValues
1414
from PyFin.Analysis.SecurityValueHolders cimport SecurityValueHolder
1515
from PyFin.Analysis.SecurityValueHolders cimport SecurityLatestValueHolder
16+
from PyFin.Math.MathConstants cimport NAN
1617

1718

1819
cdef class CrossSectionValueHolder(SecurityValueHolder):
@@ -107,7 +108,7 @@ cdef class CSAverageSecurityValueHolder(CrossSectionValueHolder):
107108
else:
108109
raw_values = self._inner.value
109110
mean_value = np.array([raw_values.mean()] * len(raw_values))
110-
mean_value[np.isnan(raw_values.values)] = np.nan
111+
mean_value[np.isnan(raw_values.values)] = NAN
111112
self.cached = SeriesValues(mean_value, raw_values.name_mapping)
112113
self.updated = 1
113114
return self.cached
@@ -122,7 +123,7 @@ cdef class CSAverageSecurityValueHolder(CrossSectionValueHolder):
122123
else:
123124
raw_values = self._inner.value
124125
mean_value = np.array([raw_values.mean()] * len(raw_values))
125-
mean_value[np.isnan(raw_values.values)] = np.nan
126+
mean_value[np.isnan(raw_values.values)] = NAN
126127
self.cached = SeriesValues(mean_value, raw_values.name_mapping)
127128
self.updated = 1
128129
return self.cached[name]
@@ -134,7 +135,7 @@ cdef class CSAverageSecurityValueHolder(CrossSectionValueHolder):
134135

135136
raw_values = self._inner.value_by_names(names)
136137
mean_value = np.array([raw_values.mean()] * len(raw_values))
137-
mean_value[np.isnan(raw_values.values)] = np.nan
138+
mean_value[np.isnan(raw_values.values)] = NAN
138139
raw_values = SeriesValues(mean_value, raw_values.name_mapping)
139140
return raw_values[names]
140141

PyFin/Analysis/SecurityValueHolders.pyx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ from PyFin.Analysis.SeriesValues cimport SeriesValues
1818
from PyFin.Utilities.Tools import to_dict
1919
from PyFin.Math.Accumulators.StatefulAccumulators cimport Shift
2020
from PyFin.Math.Accumulators.IAccumulators cimport Latest
21+
from PyFin.Math.MathConstants cimport NAN
2122

2223
if sys.version_info > (3, 0, 0):
2324
div_attr = "truediv"
@@ -115,7 +116,7 @@ cdef class SecurityValueHolder(object):
115116
holder = self._innerHolders[name]
116117
values[i] = holder.result()
117118
except ArithmeticError:
118-
values[i] = np.nan
119+
values[i] = NAN
119120
self.cached = SeriesValues(values, index=keys)
120121
self.updated = 1
121122
return self.cached
@@ -357,7 +358,7 @@ cdef class FilteredSecurityValueHolder(SecurityValueHolder):
357358
if filter_value:
358359
return self._computer.value_by_name(name)
359360
else:
360-
return np.nan
361+
return NAN
361362

362363
cpdef value_by_names(self, list names):
363364

@@ -369,7 +370,7 @@ cdef class FilteredSecurityValueHolder(SecurityValueHolder):
369370
else:
370371
filter_value = self._filter.value_by_names(names)
371372
orig_values = self._computer.value_by_names(names)
372-
return SeriesValues(np.where(filter_value.values, orig_values.values, np.nan), filter_value.name_mapping)
373+
return SeriesValues(np.where(filter_value.values, orig_values.values, NAN), filter_value.name_mapping)
373374

374375
cpdef push(self, dict data):
375376
self._computer.push(data)
@@ -454,7 +455,7 @@ cdef class SecurityConstArrayValueHolder(SecurityValueHolder):
454455
if name in self._values:
455456
return self._values[name]
456457
else:
457-
return np.nan
458+
return NAN
458459

459460
cpdef value_by_names(self, list names):
460461
return self._values[names]

PyFin/Analysis/SeriesValues.pyx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Created on 2017-2-7
88
cimport cython
99
import numpy as np
1010
cimport numpy as np
11+
from numpy import nansum
12+
from numpy import nanmean
13+
from PyFin.Math.MathConstants cimport NAN
1114

1215

1316
cdef class SeriesValues(object):
@@ -45,7 +48,7 @@ cdef class SeriesValues(object):
4548

4649
values = self.values
4750
name_mapping = self.name_mapping
48-
data = np.array([values[name_mapping[n]] if n in name_mapping else np.nan for n in name])
51+
data = np.array([values[name_mapping[n]] if n in name_mapping else NAN for n in name])
4952
return SeriesValues(data, dict(zip(name, range(len(name)))))
5053

5154
@cython.boundscheck(False)
@@ -105,7 +108,7 @@ cdef class SeriesValues(object):
105108
values = self.values / right
106109
name_mapping = self.name_mapping
107110

108-
values[~np.isfinite(values)] = np.nan
111+
values[~np.isfinite(values)] = NAN
109112
return SeriesValues(values, name_mapping)
110113

111114
@cython.cdivision(True)
@@ -123,7 +126,7 @@ cdef class SeriesValues(object):
123126
values = self.values / right
124127
name_mapping = self.name_mapping
125128

126-
values[~np.isfinite(values)] = np.nan
129+
values[~np.isfinite(values)] = NAN
127130
return SeriesValues(values, name_mapping)
128131

129132
def __and__(self, right):
@@ -186,7 +189,7 @@ cdef class SeriesValues(object):
186189
@cython.wraparound(False)
187190
cpdef SeriesValues rank(self):
188191
cdef np.ndarray[double, ndim=1] data = self.values.argsort().argsort().astype(float)
189-
data[np.isnan(self.values)] = np.nan
192+
data[np.isnan(self.values)] = NAN
190193
return SeriesValues(data + 1., self.name_mapping)
191194

192195
cpdef SeriesValues zscore(self):
@@ -195,10 +198,10 @@ cdef class SeriesValues(object):
195198

196199
cpdef SeriesValues unit(self):
197200
cdef np.ndarray[double, ndim=1] data = self.values
198-
return SeriesValues(data / np.nansum(np.abs(data)), self.name_mapping)
201+
return SeriesValues(data / nansum(np.abs(data)), self.name_mapping)
199202

200203
cpdef double mean(self):
201-
return np.nanmean(self.values)
204+
return nanmean(self.values)
202205

203206
cpdef double dot(self, SeriesValues right):
204207
return np.dot(self.values, right.values)

PyFin/Analysis/TechnicalAnalysis/StatefulTechnicalAnalysers.pyx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ from PyFin.Math.Accumulators.StatefulAccumulators cimport MovingNegativeDifferen
3030
from PyFin.Math.Accumulators.StatefulAccumulators cimport MovingRSI
3131
from PyFin.Math.Accumulators.StatefulAccumulators cimport MovingHistoricalWindow
3232
from PyFin.Math.Accumulators.StatefulAccumulators cimport MovingLogReturn
33+
from PyFin.Math.MathConstants cimport NAN
3334

3435

3536
cdef class SecuritySingleValueHolder(SecurityValueHolder):
@@ -433,7 +434,7 @@ cdef class SecurityMovingHistoricalWindow(SecuritySingleValueHolder):
433434
try:
434435
res[name] = self._innerHolders[name].value[item]
435436
except ArithmeticError:
436-
res[name] = np.nan
437+
res[name] = NAN
437438
return SeriesValues(res)
438439
else:
439440
raise ValueError("{0} is not recognized as valid int or string".format(item))
@@ -459,7 +460,7 @@ cdef class SecurityMovingHistoricalWindow(SecuritySingleValueHolder):
459460
holder = self._innerHolders[name]
460461
values[i] = holder.result()
461462
except ArithmeticError:
462-
values[i] = np.nan
463+
values[i] = NAN
463464
self.cached = SeriesValues(np.array(values), index=dict(zip(keys, range(n))))
464465
self.updated = 1
465466
return self.cached

PyFin/Math/Accumulators/IAccumulators.pyx

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import numpy as np
2121
cimport numpy as np
2222
import pandas as pd
2323
from PyFin.Utilities.Asserts cimport pyFinAssert
24+
from PyFin.Math.MathConstants cimport NAN
2425

2526

2627
cdef class IAccumulator(object):
@@ -101,7 +102,7 @@ cdef class Accumulator(IAccumulator):
101102
try:
102103
return tuple(data[p] for p in self._dependency)
103104
except KeyError:
104-
return np.nan
105+
return NAN
105106
else:
106107
comp = self._dependency
107108
comp.push(data)
@@ -613,7 +614,7 @@ cdef class StatelessSingleValueAccumulator(Accumulator):
613614
try:
614615
value = data[self._dependency]
615616
except KeyError:
616-
value = np.nan
617+
value = NAN
617618
else:
618619
comp = self._dependency
619620
comp.push(data)
@@ -634,7 +635,7 @@ cdef class StatelessSingleValueAccumulator(Accumulator):
634635

635636
cdef class Latest(StatelessSingleValueAccumulator):
636637

637-
def __init__(self, dependency='x', current_value=np.nan):
638+
def __init__(self, dependency='x', current_value=NAN):
638639
super(Latest, self).__init__(dependency)
639640
self._window = 0
640641
self._returnSize = 1
@@ -760,7 +761,7 @@ cdef class IIF(Accumulator):
760761

761762
cdef class BasicFunction(Accumulator):
762763

763-
def __init__(self, dependency, orig_value=np.nan):
764+
def __init__(self, dependency, orig_value=NAN):
764765
super(BasicFunction, self).__init__(dependency)
765766
if self._isValueHolderContained:
766767
self._window = self._dependency.window
@@ -788,7 +789,7 @@ cdef class BasicFunction(Accumulator):
788789

789790

790791
cdef class Exp(BasicFunction):
791-
def __init__(self, dependency, orig_value=np.nan):
792+
def __init__(self, dependency, orig_value=NAN):
792793
super(Exp, self).__init__(dependency, orig_value)
793794

794795
cpdef object result(self):
@@ -807,7 +808,7 @@ cdef class Exp(BasicFunction):
807808

808809

809810
cdef class Log(BasicFunction):
810-
def __init__(self, dependency, orig_value=np.nan):
811+
def __init__(self, dependency, orig_value=NAN):
811812
super(Log, self).__init__(dependency, orig_value)
812813

813814
cpdef object result(self):
@@ -826,7 +827,7 @@ cdef class Log(BasicFunction):
826827

827828

828829
cdef class Sqrt(BasicFunction):
829-
def __init__(self, dependency, orig_value=np.nan):
830+
def __init__(self, dependency, orig_value=NAN):
830831
super(Sqrt, self).__init__(dependency, orig_value)
831832

832833
cpdef object result(self):
@@ -847,7 +848,7 @@ cdef class Sqrt(BasicFunction):
847848
# due to the fact that pow function is much slower than ** operator
848849
cdef class Pow(BasicFunction):
849850

850-
def __init__(self, dependency, n, orig_value=np.nan):
851+
def __init__(self, dependency, n, orig_value=NAN):
851852
super(Pow, self).__init__(dependency, orig_value)
852853
self._n = n
853854

@@ -867,7 +868,7 @@ cdef class Pow(BasicFunction):
867868

868869

869870
cdef class Abs(BasicFunction):
870-
def __init__(self, dependency, orig_value=np.nan):
871+
def __init__(self, dependency, orig_value=NAN):
871872
super(Abs, self).__init__(dependency, orig_value)
872873

873874
cpdef object result(self):
@@ -895,7 +896,7 @@ cdef double sign(double x) nogil:
895896

896897

897898
cdef class Sign(BasicFunction):
898-
def __init__(self, dependency, orig_value=np.nan):
899+
def __init__(self, dependency, orig_value=NAN):
899900
super(Sign, self).__init__(dependency, orig_value)
900901

901902
cpdef object result(self):
@@ -914,7 +915,7 @@ cdef class Sign(BasicFunction):
914915

915916

916917
cdef class Acos(BasicFunction):
917-
def __init__(self, dependency, orig_value=np.nan):
918+
def __init__(self, dependency, orig_value=NAN):
918919
super(Acos, self).__init__(dependency, orig_value)
919920

920921
cpdef object result(self):
@@ -933,7 +934,7 @@ cdef class Acos(BasicFunction):
933934

934935

935936
cdef class Acosh(BasicFunction):
936-
def __init__(self, dependency, orig_value=np.nan):
937+
def __init__(self, dependency, orig_value=NAN):
937938
super(Acosh, self).__init__(dependency, orig_value)
938939

939940
cpdef object result(self):
@@ -952,7 +953,7 @@ cdef class Acosh(BasicFunction):
952953

953954

954955
cdef class Asin(BasicFunction):
955-
def __init__(self, dependency, orig_value=np.nan):
956+
def __init__(self, dependency, orig_value=NAN):
956957
super(Asin, self).__init__(dependency, orig_value)
957958

958959
cpdef object result(self):
@@ -971,7 +972,7 @@ cdef class Asin(BasicFunction):
971972

972973

973974
cdef class Asinh(BasicFunction):
974-
def __init__(self, dependency, orig_value=np.nan):
975+
def __init__(self, dependency, orig_value=NAN):
975976
super(Asinh, self).__init__(dependency, orig_value)
976977

977978
cpdef object result(self):

0 commit comments

Comments
 (0)