pub struct Schedule {
pub ueffective: NaiveDateTime,
pub utermination: NaiveDateTime,
pub frequency: Frequency,
pub ufront_stub: Option<NaiveDateTime>,
pub uback_stub: Option<NaiveDateTime>,
pub calendar: Calendar,
pub accrual_adjuster: Adjuster,
pub payment_adjuster: Adjuster,
pub uschedule: Vec<NaiveDateTime>,
pub aschedule: Vec<NaiveDateTime>,
pub pschedule: Vec<NaiveDateTime>,
}
Expand description
A generic financial schedule with regular contiguous periods and, possibly, stubs.
§Notes
- A regular schedule has a
Frequency
that perfectly divides itsueffective
andutermination
dates, and has no stub dates. - An irregular schedule has a
ufront_stub
and/oruback_stub
dates defining periods at the boundary of the schedule which are not a standard length of time defined by theFrequency
. However, a regular schedule must exist between those interior dates.
Fields§
§ueffective: NaiveDateTime
The unadjusted start date of the schedule.
utermination: NaiveDateTime
The unadjusted end date of the schedule.
frequency: Frequency
The scheduling Frequency
for regular periods.
ufront_stub: Option<NaiveDateTime>
The optional, unadjusted front stub date.
uback_stub: Option<NaiveDateTime>
The optional, unadjusted back stub date.
calendar: Calendar
The Calendar
for accrual and payment date adjustment.
accrual_adjuster: Adjuster
The Adjuster
to adjust the unadjusted schedule dates to adjusted period accrual dates.
payment_adjuster: Adjuster
The Adjuster
to adjust the adjusted schedule dates to period payment dates.
uschedule: Vec<NaiveDateTime>
The vector of unadjusted period accrual dates.
aschedule: Vec<NaiveDateTime>
The vector of adjusted period accrual dates.
pschedule: Vec<NaiveDateTime>
The vector of payment dates associated with the adjusted accrual dates.
Implementations§
Source§impl Schedule
impl Schedule
Sourcepub fn try_new_defined(
ueffective: NaiveDateTime,
utermination: NaiveDateTime,
frequency: Frequency,
ufront_stub: Option<NaiveDateTime>,
uback_stub: Option<NaiveDateTime>,
calendar: Calendar,
accrual_adjuster: Adjuster,
payment_adjuster: Adjuster,
) -> Result<Self, PyErr>
pub fn try_new_defined( ueffective: NaiveDateTime, utermination: NaiveDateTime, frequency: Frequency, ufront_stub: Option<NaiveDateTime>, uback_stub: Option<NaiveDateTime>, calendar: Calendar, accrual_adjuster: Adjuster, payment_adjuster: Adjuster, ) -> Result<Self, PyErr>
Create a Schedule
from well defined unadjusted dates and a Frequency
.
§Notes
If provided arguments do not define a valid schedule pattern then an error is returned.
§Examples
This is a valid schedule with a long back stub and regular monthly periods.
let s = Schedule::try_new_defined(
ndt(2024, 1, 3), ndt(2024, 4, 15), // ueffective, utermination
Frequency::Months{number:1, roll: Some(RollDay::Day(3))}, // frequency
None, Some(ndt(2024, 3, 3)), // ufront_stub, uback_stub
Cal::new(vec![], vec![5,6]).into(), // calendar
Adjuster::ModifiedFollowing{}, // accrual_adjuster
Adjuster::BusDaysLagSettle(3), // payment_adjuster
);
assert_eq!(s.uschedule, vec![ndt(2024, 1, 3), ndt(2024, 2, 3), ndt(2024, 3, 3), ndt(2024, 4, 15)]);
assert_eq!(s.aschedule, vec![ndt(2024, 1, 3), ndt(2024, 2, 5), ndt(2024, 3, 4), ndt(2024, 4, 15)]);
assert_eq!(s.pschedule, vec![ndt(2024, 1, 8), ndt(2024, 2, 8), ndt(2024, 3, 7), ndt(2024, 4, 18)]);
This is not a valid schedule since there are no defined stubs and the dates do not align with the RollDay.
let s = Schedule::try_new_defined(
ndt(2024, 1, 6), ndt(2024, 4, 6), // ueffective, utermination
Frequency::Months{number:1, roll: Some(RollDay::Day(3))}, // frequency
None, None, // ufront_stub, uback_stub
Cal::new(vec![], vec![5,6]).into(), // calendar
Adjuster::ModifiedFollowing{}, // accrual_adjuster
Adjuster::BusDaysLagSettle(3), // payment_adjuster
);
assert!(s.is_err());
Sourcepub fn try_new_inferred(
effective: NaiveDateTime,
termination: NaiveDateTime,
frequency: Frequency,
front_stub: Option<NaiveDateTime>,
back_stub: Option<NaiveDateTime>,
calendar: Calendar,
accrual_adjuster: Adjuster,
payment_adjuster: Adjuster,
eom: bool,
stub_inference: Option<StubInference>,
) -> Result<Schedule, PyErr>
pub fn try_new_inferred( effective: NaiveDateTime, termination: NaiveDateTime, frequency: Frequency, front_stub: Option<NaiveDateTime>, back_stub: Option<NaiveDateTime>, calendar: Calendar, accrual_adjuster: Adjuster, payment_adjuster: Adjuster, eom: bool, stub_inference: Option<StubInference>, ) -> Result<Schedule, PyErr>
Create a Schedule
using inference if some of the parameters are not well defined.
§Notes
If all parameters are well defined and dates are definitively known in their unadjusted
forms then the try_new_defined
method
should be used instead.
This method provides the additional features below:
- Unadjusted date inference: if adjusted dates are given then a neighbourhood of
dates will be sub-sampled to determine
any possibilities for unadjusted dates defined by the
accrual_adjuster
andcalendar
. Only the dates at either side of the regular schedule component are explored. Stub date boundaries are used as provided. - Frequency inference: any
Frequency
that contains optional elements, e.g. noRollDay
, will be explored for all possible alternatives that results in the most likely schedule, guided by theeom
parameter. - Stub date inference: one-sided stub date inference can be attempted guided by
the
stub_inference
parameter.
Sourcepub fn is_regular(&self) -> bool
pub fn is_regular(&self) -> bool
Check if a Schedule
contains only regular periods, and no stub periods.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Schedule
impl<'de> Deserialize<'de> for Schedule
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'py> IntoPyObject<'py> for Schedule
impl<'py> IntoPyObject<'py> for Schedule
Source§impl PyClassImpl for Schedule
impl PyClassImpl for Schedule
Source§const IS_BASETYPE: bool = false
const IS_BASETYPE: bool = false
Source§const IS_SUBCLASS: bool = false
const IS_SUBCLASS: bool = false
Source§const IS_MAPPING: bool = false
const IS_MAPPING: bool = false
Source§const IS_SEQUENCE: bool = false
const IS_SEQUENCE: bool = false
Source§const IS_IMMUTABLE_TYPE: bool = false
const IS_IMMUTABLE_TYPE: bool = false
Source§type ThreadChecker = SendablePyClass<Schedule>
type ThreadChecker = SendablePyClass<Schedule>
Source§type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild
Source§type BaseNativeType = PyAny
type BaseNativeType = PyAny
PyAny
by default, and when you declare
#[pyclass(extends=PyDict)]
, it’s PyDict
.fn items_iter() -> PyClassItemsIter
fn lazy_type_object() -> &'static LazyTypeObject<Self>
fn dict_offset() -> Option<isize>
fn weaklist_offset() -> Option<isize>
Source§impl PyClassNewTextSignature<Schedule> for PyClassImplCollector<Schedule>
impl PyClassNewTextSignature<Schedule> for PyClassImplCollector<Schedule>
fn new_text_signature(self) -> Option<&'static str>
Source§impl PyMethods<Schedule> for PyClassImplCollector<Schedule>
impl PyMethods<Schedule> for PyClassImplCollector<Schedule>
fn py_methods(self) -> &'static PyClassItems
Source§impl PyTypeInfo for Schedule
impl PyTypeInfo for Schedule
Source§fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject
§fn type_object(py: Python<'_>) -> Bound<'_, PyType>
fn type_object(py: Python<'_>) -> Bound<'_, PyType>
§fn is_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_type_of(object: &Bound<'_, PyAny>) -> bool
object
is an instance of this type or a subclass of this type.§fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool
object
is an instance of this type.impl DerefToPyAny for Schedule
impl StructuralPartialEq for Schedule
Auto Trait Implementations§
impl Freeze for Schedule
impl RefUnwindSafe for Schedule
impl Send for Schedule
impl Sync for Schedule
impl Unpin for Schedule
impl UnwindSafe for Schedule
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> FromPyObject<'_> for Twhere
T: PyClass + Clone,
impl<T> FromPyObject<'_> for Twhere
T: PyClass + Clone,
§fn extract_bound(obj: &Bound<'_, PyAny>) -> Result<T, PyErr>
fn extract_bound(obj: &Bound<'_, PyAny>) -> Result<T, PyErr>
§impl<'py, T> FromPyObjectBound<'_, 'py> for Twhere
T: FromPyObject<'py>,
impl<'py, T> FromPyObjectBound<'_, 'py> for Twhere
T: FromPyObject<'py>,
§fn from_py_object_bound(ob: Borrowed<'_, 'py, PyAny>) -> Result<T, PyErr>
fn from_py_object_bound(ob: Borrowed<'_, 'py, PyAny>) -> Result<T, PyErr>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
§fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>
self
into an owned Python object, dropping type information.§fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>
self
into an owned Python object, dropping type information and unbinding it
from the 'py
lifetime.§fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>
self
into a Python object. Read more§impl<T> PyErrArguments for T
impl<T> PyErrArguments for T
§impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
impl<T> PyTypeCheck for Twhere
T: PyTypeInfo,
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.