Created RegularTimeSeriesIter.

[?]
Jun 14, 2021, 4:36 AM
IYW574EKVRH2QJ7GFNX4FMCNI7EMLNYYIC6NGHVIJVDEWSDL42GQC

Dependencies

  • [2] XIWTRGR6 Prepare to make external iterator for TimeSeries.
  • [3] QYLGEDIV First record.

Change contents

  • replacement in src/lib.rs at line 1
    [3.16][3.17:45]()
    //! Time-series Abstraction
    [3.16]
    [3.45]
    //! A time-series abstraction. A date of with granularity in months or larger associated with a
    //! numeric array of any size.
  • edit in src/lib.rs at line 5
    [3.78][3.78:112]()
    // Implement traits on DataPoint
  • edit in src/lib.rs at line 6
    [3.113][3.113:184]()
    use serde::{Serialize};
    use peroxide::numerical::spline::CubicSpline;
  • edit in src/lib.rs at line 8
    [3.236]
    [3.236]
    use std::fmt::Display;
  • edit in src/lib.rs at line 10
    [3.249][3.249:272]()
    use std::fmt::Display;
  • replacement in src/lib.rs at line 16
    [2.1][2.1:24]()
    use serde::Serializer;
    [2.1]
    [3.358]
    use peroxide::numerical::spline::CubicSpline;
    use serde::{
    Serialize,
    Serializer,
    };
  • replacement in src/lib.rs at line 22
    [3.359][3.359:522](),[3.522][2.25:59]()
    /// Represents a date a granularity of one month or larger. Dates can also act
    /// as durations and be added and subtracted.
    /// A date with monthly granularity.
    #[derive(Clone, Copy, Debug, Eq)]
    [3.359]
    [3.567]
    /// A date with granularity of one month or larger. Dates can also act as durations and be added
    /// and subtracted.
    ///
    /// To avoid pulling in redundant dependences, the responsibility for parsing a date in string form
    /// is left to the client code.
    #[derive(Clone, Copy, Eq)]
  • edit in src/lib.rs at line 94
    [3.1806]
    [3.1806]
    impl fmt::Debug for MonthlyDate {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    f.debug_struct("MonthlyDate")
    .field("year", &self.year())
    .field("month", &(self.month() + 1))
    .finish()
    }
    }
  • edit in src/lib.rs at line 106
    [3.1893][3.1893:1898]()
  • edit in src/lib.rs at line 108
    [3.1995][3.1995:1996]()
  • edit in src/lib.rs at line 110
    [3.2046][3.2046:2047]()
  • edit in src/lib.rs at line 112
    [3.2111][3.2111:2112]()
  • edit in src/lib.rs at line 144
    [3.2900][3.2900:3081]()
    /// Return a datepoint with one value, set by index `n`.
    pub fn date_map(&self, n: usize) -> DatePoint<1> {
    DatePoint::<1>::new(self.date(), [self.value[n]])
    }
  • edit in src/lib.rs at line 198
    [3.4986]
    [3.4986]
    }
    }
    pub struct RegularTimeSeriesIter<'a, const N: usize> {
    start_date: MonthlyDate,
    end_date: MonthlyDate,
    date_points: &'a Vec<DatePoint<N>>,
    counter: usize,
    }
    impl<'a, const N: usize> Iterator for RegularTimeSeriesIter<'a, N> {
    type Item = DatePoint<N>;
    fn next(&mut self) -> Option<Self::Item> {
    // Beyond the end of self.date_points.
    if self.counter >= self.date_points.len() {
    None
    } else {
    // Counter points into self.date_points and before start date.
    if self.date_points[self.counter].date() < self.start_date {
    self.counter += 1;
    self.next()
    // Counter points into self.date_points but past end date.
    } else if self.date_points[self.counter].date() > self.end_date {
    return None
    // Counter points into self.date_points and inside range.
    } else {
    self.counter += 1;
    return Some(self.date_points[self.counter - 1])
    }
    }
  • edit in src/lib.rs at line 234
    [3.4992]
    [3.4992]
    }
    #[test]
    fn test_iter() {
    let date1 = MonthlyDate::ym(1995, 11);
    let date2 = MonthlyDate::ym(1995, 12);
    let date3 = MonthlyDate::ym(1996, 1);
    let date4 = MonthlyDate::ym(1996, 2);
    let date5 = MonthlyDate::ym(1996, 3);
    let dp1 = DatePoint::new(date1, [1.2]);
    let dp2 = DatePoint::new(date2, [1.4]);
    let dp3 = DatePoint::new(date3, [1.6]);
    let dp4 = DatePoint::new(date4, [1.8]);
    let dp5 = DatePoint::new(date5, [2.0]);
    let v = vec!( dp1, dp2, dp3, dp4, dp5);
    let rts: RegularTimeSeries<1> = TimeSeries::new(v).try_into().unwrap();
    let date_range = DateRange::new(Some(date2), Some(date4));
    let mut iter = rts.iter(date_range);
    assert_eq!(iter.next().unwrap().date(), date2);
    assert_eq!(iter.next().unwrap().date(), date3);
    assert_eq!(iter.next().unwrap().date(), date4);
    assert!(iter.next().is_none());
  • replacement in src/lib.rs at line 275
    [2.591][2.591:667]()
    pub fn zip(self, other: RegularTimeSeries<1>) -> RegularTimeSeries<2> {
    [2.591]
    [2.667]
    pub fn zip_one_one(self, other: RegularTimeSeries<1>) -> RegularTimeSeries<2> {
  • replacement in src/lib.rs at line 289
    [2.1194][2.1194:1282]()
    let v: Vec<DatePoint<2>> = Vec::new();
    let () = self.iter(date_range);
    [2.1194]
    [2.1282]
    let mut v: Vec<DatePoint<2>> = Vec::new();
  • edit in src/lib.rs at line 304
    [2.1551]
    [3.5366]
    pub fn iter(&self, date_range: DateRange) -> RegularTimeSeriesIter<N> {
    let ts_start_date = self.ts.0[0].date();
    let start_date = match date_range.start_date {
    None => ts_start_date,
    Some(start) => ts_start_date.max(start),
    };
    let ts_end_date = *(&(self.ts.0).last().unwrap().date());
    let end_date = match date_range.end_date {
    None => ts_end_date,
    Some(end) => ts_end_date.min(end),
    };
    RegularTimeSeriesIter {
    start_date,
    end_date,
    date_points: &self.ts.0,
    counter: 0,
    }
    }
  • replacement in src/lib.rs at line 381
    [3.7002][3.7002:7225]()
    /// Return an iterator over points.
    pub fn iter(&self, dr: DateRange) -> impl Iterator + '_ {
    self.ts.0.iter()
    .skip_while(move |p1| {
    if let Some(range_date) = dr.first_date() {
    [3.7002]
    [3.7225]
    // /// Return an iterator over points.
    // pub fn iter(&self, dr: DateRange) -> impl Iterator + '_ {
    // self.ts.0.iter()
    // .skip_while(move |p1| {
    // if let Some(range_date) = dr.first_date() {
  • replacement in src/lib.rs at line 387
    [3.7226][3.7226:7276]()
    return p1.date() < range_date
    [3.7226]
    [3.7276]
    // return p1.date() < range_date
  • replacement in src/lib.rs at line 389
    [3.7277][3.7277:7302]()
    } else {
    [3.7277]
    [3.7302]
    // } else {
  • replacement in src/lib.rs at line 391
    [3.7303][3.7303:7457]()
    false
    }
    })
    .take_while(move |p1| {
    if let Some(range_date) = dr.last_date() {
    [3.7303]
    [3.7457]
    // false
    // }
    // })
    // .take_while(move |p1| {
    // if let Some(range_date) = dr.last_date() {
  • replacement in src/lib.rs at line 397
    [3.7458][3.7458:7509]()
    return p1.date() <= range_date
    [3.7458]
    [3.7509]
    // return p1.date() <= range_date
  • replacement in src/lib.rs at line 399
    [3.7510][3.7510:7535]()
    } else {
    [3.7510]
    [3.7535]
    // } else {
  • replacement in src/lib.rs at line 401
    [3.7536][3.7536:7600]()
    true
    }
    })
    }
    [3.7536]
    [3.7600]
    // true
    // }
    // })
    // }