summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/curve.pyx25
-rw-r--r--setup.py2
2 files changed, 26 insertions, 1 deletions
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 489c8e4..0864019 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -1,11 +1,17 @@
from libc.stdlib cimport malloc, free
from libc.string cimport memcpy
+from libc.math cimport log1p, expm1
from date cimport (JpmcdsStringToDateInterval, pydate_to_TDate, dcc,
JpmcdsDateIntervalToFreq, JpmcdsDateFwdThenAdjust, TDate_to_pydate,
JpmcdsDateFromBusDaysOffset, JpmcdsStringToDayCountConv)
from date import dcc_tostring
from cdsone cimport JpmcdsStringToStubMethod, TStubMethod
cimport cython
+cimport numpy as np
+np.import_array()
+
+cdef extern from "numpy/arrayobject.h":
+ void PyArray_ENABLEFLAGS(np.ndarray arr, int flags)
cdef int SUCCESS = 0
@@ -51,6 +57,25 @@ cdef class Curve(object):
'basis': self._thisptr.fBasis,
'day_count_convention': dcc_tostring(self._thisptr.fDayCountConv),
'data': fArray_to_list(self._thisptr.fArray, self._thisptr.fNumItems)}
+
+ @property
+ def forward_hazard_rates(self):
+ cdef double t1, h1, t2, h2
+ cdef np.npy_intp shape = self._thisptr.fNumItems
+ t1 = 0
+ h1 = 0
+ cdef double* data = <double*>malloc(self._thisptr.fNumItems * sizeof(double))
+ for i in range(self._thisptr.fNumItems):
+ h2 = log1p(self._thisptr.fArray[i].fRate)
+ t2 = (self._thisptr.fArray[i].fDate - self._thisptr.fBaseDate)/365.
+ data[i] = (h2 * t2 - h1 * t1) / (t2 - t1)
+ h1 = h2
+ t1 = t2
+ cdef np.ndarray[np.float64_t] out = \
+ np.PyArray_SimpleNewFromData(1, &shape, np.NPY_DOUBLE, data)
+ PyArray_ENABLEFLAGS(out, np.NPY_OWNDATA)
+ return out
+
@property
def base_date(self):
return TDate_to_pydate(self._thisptr.fBaseDate)
diff --git a/setup.py b/setup.py
index da5894c..dd76e0d 100644
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@ from Cython.Build import cythonize
import numpy
all_extensions = Extension("*", ["pyisda/*.pyx"],
- include_dirs = ['c_layer'],
+ include_dirs = ['c_layer', numpy.get_include()],
libraries = ["cds"])
c_extension = Extension("pyisda.flat_hazard",