light_curve_feature/features/
median.rs1use 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}