summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2023-12-06 15:19:09 -0500
committerGuillaume Horel <guillaume.horel@gmail.com>2023-12-06 15:19:09 -0500
commitd1d925e0a38facd9fbd859aa9dd81f4df89ded0d (patch)
tree941562132b0d722b1b3dead11ea4ea0d4ddc2784
parent73cbe54cd2c4319e4458f8c8d6d483bcfe6e567a (diff)
downloadpyisda-d1d925e0a38facd9fbd859aa9dd81f4df89ded0d.tar.gz
add set_defaulted/clear_defaulted methods
-rw-r--r--pyisda/credit_index.pyx54
1 files changed, 54 insertions, 0 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index 367000b..b4a5277 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -168,6 +168,60 @@ cdef class CurveList:
j += 1
return out
+ def set_defaulted(self, list names):
+ cdef:
+ char[128] buf
+ CurveName cn
+ map[CurveName, size_t].iterator got
+ pair[CurveName, size_t] p
+ size_t i
+ DocClause doc_clause
+ Seniority sen
+ ticker
+
+ for (ticker, sen, doc_clause) in names:
+ buf[0] = <char>sen
+ buf[1] = <char>doc_clause
+ strcpy(&buf[2], <char*>ticker)
+ cn = CurveName(buf)
+ got = self.names.find(cn)
+ if got == self.names.end():
+ raise KeyError((ticker, sen, doc_clause))
+ else:
+ p = deref(got)
+ cn, i = p.first, p.second
+ cn.defaulted()[0] = self.base_date
+ self.defaulted_weight += self._weights[i]
+
+ def clear_defaulted(self, list names=None):
+ cdef:
+ char[128] buf
+ CurveName cn
+ map[CurveName, size_t].iterator got
+ pair[CurveName, size_t] p
+ size_t i
+ DocClause doc_clause
+ Seniority sen
+
+ if names is None:
+ for p in self.names:
+ p.first.defaulted()[0] = -1
+ self.defaulted_weight = 0.0
+ else:
+ for (ticker, sen, doc_clause) in names:
+ buf[0] = <char>sen
+ buf[1] = <char>doc_clause
+ strcpy(&buf[2], <char*>ticker)
+ cn = CurveName(buf)
+ got = self.names.find(cn)
+ if got == self.names.end():
+ raise KeyError((ticker, sen, doc_clause))
+ else:
+ cn, i = deref(got).first, deref(got).second
+ if deref(cn.defaulted()) != -1:
+ cn.defaulted()[0] = -1
+ self.defaulted_weight -= self._weights[i]
+
@weights.setter
def weights(self, double[::1] val):
if val.shape[0] != self._weights.size():