light_curve_feature/features/
median.rs

1use crate::evaluator::*;
2
3macro_const! {
4    const DOC: &str = r"
5Median magnitude
6
7$$
8\mathrm{Median}(m_i)
9$$
10
11- Depends on: **magnitude**
12- Minimum number of observations: **1**
13- Number of features: **1**
14";
15}
16
17#[doc = DOC!()]
18#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema)]
19pub struct Median {}
20
21lazy_info!(
22    MEDIAN_INFO,
23    Median,
24    size: 1,
25    min_ts_length: 1,
26    t_required: false,
27    m_required: true,
28    w_required: false,
29    sorting_required: false,
30);
31
32impl Median {
33    pub fn new() -> Self {
34        Self {}
35    }
36
37    pub const fn doc() -> &'static str {
38        DOC
39    }
40}
41
42impl FeatureNamesDescriptionsTrait for Median {
43    fn get_names(&self) -> Vec<&str> {
44        vec!["median"]
45    }
46
47    fn get_descriptions(&self) -> Vec<&str> {
48        vec!["median magnitude"]
49    }
50}
51
52impl<T> FeatureEvaluator<T> for Median
53where
54    T: Float,
55{
56    fn eval(&self, ts: &mut TimeSeries<T>) -> Result<Vec<T>, EvaluatorError> {
57        self.check_ts_length(ts)?;
58        Ok(vec![ts.m.get_median()])
59    }
60}
61
62#[cfg(test)]
63#[allow(clippy::unreadable_literal)]
64#[allow(clippy::excessive_precision)]
65mod tests {
66    use super::*;
67    use crate::tests::*;
68
69    check_feature!(Median);
70
71    feature_test!(
72        median_odd,
73        [Median::new()],
74        [3.0],
75        [-99.0, 0.0, 3.0, 3.1, 3.2],
76    );
77
78    feature_test!(
79        median_even,
80        [Median::new()],
81        [1.5],
82        [-99.0, 0.0, 4.0, 3.0, 2.0, 1.0],
83    );
84}