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
Frequencythat perfectly divides itsueffectiveanduterminationdates, and has no stub dates. - An irregular schedule has a
ufront_stuband/oruback_stubdates 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: NaiveDateTimeThe unadjusted start date of the schedule.
utermination: NaiveDateTimeThe unadjusted end date of the schedule.
frequency: FrequencyThe 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: CalendarThe Calendar for accrual and payment date adjustment.
accrual_adjuster: AdjusterThe Adjuster to adjust the unadjusted schedule dates to adjusted period accrual dates.
payment_adjuster: AdjusterThe 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_adjusterandcalendar. Only the dates at either side of the regular schedule component are explored. Stub date boundaries are used as provided. - Frequency inference: any
Frequencythat contains optional elements, e.g. noRollDay, will be explored for all possible alternatives that results in the most likely schedule, guided by theeomparameter. - Stub date inference: one-sided stub date inference can be attempted guided by
the
stub_inferenceparameter.
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.