forrust/
lib.rs

1/// This library was made by Edgar Regalado
2/// its under the MIT License
3/// may not be useful.
4/// don't complain.
5
6
7//pub mod data;
8pub mod plotable;
9pub mod time_series;
10pub mod parser;
11pub mod forecasting;
12pub mod regression;
13pub mod prediction;
14
15#[cfg(test)]
16mod tests {
17    
18    
19    #[test]
20    fn it_works() {
21        assert_eq!(2 + 2, 4);
22    }
23
24    #[test]
25    fn test_data() {
26      /*  let demanda = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
27        60.0, 70.0, 80.0, 100.0, 120.0, 70.0, 40.0];
28        let tabla = TablaDemanda::new(demanda.into());
29        println!("{}", tabla);
30        println!("uwu"); */
31    }
32
33    use crate::plotable::Plotable;
34    use crate::time_series::TimeSeries;
35
36    use plotlib::page::Page;
37    #[test]
38    fn test_time_series() {
39        let demanda = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
40        60.0, 70.0, 80.0, 100.0, 120.0, 70.0, 40.0];
41        let series = TimeSeries::new(demanda.to_vec());
42        Page::single(series.plot().as_ref()).save("seriedemanda.svg").unwrap();
43    }
44
45    use crate::time_series::Season;
46    #[test]
47    fn test_season() {
48        let demanda = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
49        60.0, 70.0, 80.0, 100.0, 120.0, 70.0, 40.0, 60.0, 50.0, 90.0];
50        let series = TimeSeries::new(demanda.to_vec());
51        Page::single(
52            series.plot().as_ref()
53        ).save("serie_total.svg").unwrap();
54        let mut season = Season::new(&series, 12).set_season(1);
55        Page::single(
56            season.plot().as_ref()
57        ).save("seriedemanda_anio_2.svg").unwrap();
58       // println!("{:?}", season.get_data());
59
60        let mut season2 = Season::new(&season.as_time_series(), 4).set_season(2);
61        Page::single(
62            season2.plot().as_ref()
63        ).save("seriedemanda_time2.svg").unwrap();
64        //println!("{:?}", season.get_data());
65    }
66
67    use crate::time_series::MovingMedian;
68    #[test]
69    fn test_moving_median() {
70        let demanda = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
71        60.0, 70.0, 80.0, 100.0, 120.0, 70.0, 40.0, 60.0, 50.0, 90.0];
72        let series = TimeSeries::new(demanda.to_vec());
73        Page::single(
74            series.plot().as_ref()
75        ).save("median_origin.svg").unwrap();
76        let medians = MovingMedian::new(&series);
77        Page::single(
78            medians.plot().as_ref()
79        ).save("median_result.svg").unwrap();
80    }
81
82    use crate::time_series::Merger;
83    #[test]
84    fn test_merger() {
85        let demanda = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
86        60.0, 70.0, 80.0, 100.0, 120.0];
87        let series = TimeSeries::new(demanda.to_vec());
88        Page::single(
89            series.plot().as_ref()
90        ).save("median_origin.svg").unwrap();
91
92        let demanda2 = [100.0, 60.0, 80.0, 80.0, 90.0, 100.0, 80.0,
93        90.0, 50.0, 40.0, 70.0, 80.0];
94
95        let demanda3 = [90.0, 50.0, 70.0, 80.0, 80.0, 120.0, 100.0,
96        120.0, 70.0, 70.0, 90.0, 120.0];
97
98        let t2 = TimeSeries::new(demanda2.to_vec());
99        let t3 = TimeSeries::new(demanda3.to_vec());
100
101        let mut merger = Merger::new(&series).merge_with(&t2);
102        Page::single(
103            merger.as_time_series().plot().as_ref()
104        ).save("merged2.svg").unwrap();
105        
106        merger = merger.merge_with(&t3);
107        Page::single(
108            merger.as_time_series().plot().as_ref() //merger dropped
109        ).save("merged3.svg").unwrap();
110
111        let filtered_merger = MovingMedian::new(&merger.as_time_series());
112        Page::single(
113            filtered_merger.plot().as_ref()
114        ).save("merged3_moving_medians.svg").unwrap();
115
116        let filtered_second = MovingMedian::new(&filtered_merger.as_time_series());
117
118        Page::single(
119            filtered_second.plot().as_ref()
120        ).save("merged3_second_moving.svg").unwrap();
121    }
122
123    use crate::time_series::{Grouper, Style};
124    #[test]
125    fn test_grouper() {
126        let demanda1 = [120.0, 80.0, 70.0, 60.0, 70.0, 90.0, 90.0,
127        60.0, 70.0, 80.0, 100.0, 120.0];
128
129        let demanda2 = [100.0, 60.0, 80.0, 80.0, 90.0, 100.0, 80.0,
130        90.0, 50.0, 40.0, 70.0, 80.0];
131
132        let demanda3 = [90.0, 50.0, 70.0, 80.0, 80.0, 120.0, 100.0,
133        120.0, 70.0, 70.0, 90.0, 120.0];
134
135        let t1 = TimeSeries::new(demanda1.to_vec());
136        let t2 = TimeSeries::new(demanda2.to_vec());
137        let t3 = TimeSeries::new(demanda3.to_vec());
138
139        let complete: TimeSeries = Merger::new(&t1)
140        .merge_with(&t2)
141        .merge_with(&t3)
142        .as_time_series();
143
144        let filtered = MovingMedian::new(&complete);
145        let filtered2 = MovingMedian::new(&filtered.as_time_series());
146        let group = Grouper::new(&complete)
147        .add(&filtered.as_time_series())
148        .last_with_style(Style::from_color("#ff0000"))
149        .add(&filtered2.as_time_series())
150        .last_with_style(Style::from_color("#00ff00"));
151
152        Page::single(
153            group.plot().as_ref()
154        ).save("series_filter.svg").unwrap()
155    }
156
157    use crate::parser::*;
158
159    #[test]
160    pub fn test_parser() {
161        Page::single(
162            data_file_to_timeseries(DATA_FILE_NAME).plot().as_ref()
163        ).save("datato.svg").unwrap();
164    }
165
166    use crate::forecasting::expsmooth::ExpSmoothing;
167    #[test]
168    pub fn test_expsmooth() {
169        let example = data_file_to_timeseries(DATA_FILE_NAME);
170
171        let mut smooth0_4 = ExpSmoothing::new(&example)
172        .with_alpha(0.4);
173        //println!("{:?}", smooth0_4.as_time_series().get_data());
174        /*let mut smooth0_2 = smooth0_4.clone()
175        .with_alpha(0.2);
176        let mut smooth0_8 = smooth0_2.clone()
177        .with_alpha(0.8);*/
178
179        let group = Grouper::new(&example)
180        .add(&smooth0_4.as_time_series()
181        .with_push(93.0)
182        .with_push(99.0)
183        .with_push(72.35)
184        .with_push(84.91)
185        .with_push(92.44)
186        .with_push(79.035)
187        .with_push(87.98)
188        )
189        .last_with_style(Style::from_color("#ff0a9a"));
190        /*.add(&smooth0_2.as_time_series())
191        .last_with_style(Style::from_color("#00f10a"))
192        .add(&smooth0_8.as_time_series())
193        .last_with_style(Style::from_color("#aff550"));*/
194
195        Page::single(
196            group.plot().as_ref()
197        ).save("smoothed.svg").unwrap();
198    }
199
200    use crate::regression::LinearRegression;
201    #[test]
202    pub fn test_linear_reg() {
203        let example = data_file_to_timeseries(DATA_FILE_NAME);
204        let reg = LinearRegression::new(&example);
205        let smooth = ExpSmoothing::new(&example).with_alpha(0.4);
206        
207        let group = Grouper::new(&example)
208        .add(&reg.as_time_series())
209        .last_with_style(Style::from_color("#ff00aa"))
210        .add(&smooth.as_time_series())
211        .last_with_style(Style::from_color("#a0fa33"));
212
213        Page::single(
214            group.plot().as_ref()
215        ).save("linear.svg").unwrap();
216    }
217
218    use crate::prediction::Dumb;
219    #[test]
220    pub fn test_dumb() {
221        let example = data_file_to_timeseries(DATA_FILE_NAME);
222        //let reg = LinearRegression::new(&example);
223        //let smooth = ExpSmoothing::new(&example).with_alpha(0.4);
224        let mut dumb = Dumb::new(&example).with_season(12);
225
226        println!("{:?}", LinearRegression::new(&example).calculate(2.0));
227
228        Page::single(
229            dumb.plot().as_ref()
230        ).save("prediction2.svg").unwrap();
231        println!("{:?}", dumb.prediction());
232    }
233}