1pub 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 }
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 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 }
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() ).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 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 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(®.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 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}