light_curve_feature/features/
time_mean.rs

1use crate::evaluator::*;
2
3macro_const! {
4    const DOC: &'static str = r"
5Mean time
6
7$$
8\langle t \rangle \equiv \frac1{N} \sum_i {t_i}.
9$$
10
11Note: highly cadence-dependent feature.
12
13- Depends on: **time**
14- Minimum number of observations: **1**
15- Number of features: **1**
16";
17}
18
19#[doc = DOC!()]
20#[derive(Clone, Default, Debug, Deserialize, Serialize, JsonSchema)]
21pub struct TimeMean {}
22
23impl TimeMean {
24    pub fn new() -> Self {
25        Self {}
26    }
27
28    pub const fn doc() -> &'static str {
29        DOC
30    }
31}
32
33lazy_info!(
34    TIME_MEAN_INFO,
35    TimeMean,
36    size: 1,
37    min_ts_length: 1,
38    t_required: true,
39    m_required: false,
40    w_required: false,
41    sorting_required: false,
42);
43impl FeatureNamesDescriptionsTrait for TimeMean {
44    fn get_names(&self) -> Vec<&str> {
45        vec!["time_mean"]
46    }
47
48    fn get_descriptions(&self) -> Vec<&str> {
49        vec!["mean of time moments"]
50    }
51}
52impl<T> FeatureEvaluator<T> for TimeMean
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.t.get_mean()])
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!(TimeMean);
70
71    feature_test!(
72        time_mean,
73        [TimeMean::new()],
74        [14.0],
75        [1.0_f32, 1.0, 1.0, 1.0, 5.0, 6.0, 6.0, 6.0, 99.0],
76    );
77}