From 5a37839ab1c0c073a2f09ff78a1a69ac970513f3 Mon Sep 17 00:00:00 2001 From: Fede Date: Mon, 20 Apr 2020 18:46:38 -0500 Subject: [PATCH 1/9] adding line breaks --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8b738ca..a29810a 100644 --- a/README.md +++ b/README.md @@ -28,15 +28,20 @@ from ESRNN.utils_evaluation import evaluate_prediction_owa from ESRNN import ESRNN -X_train_df, y_train_df, X_test_df, y_test_df = prepare_m4_data(dataset_name='Yearly', directory = './data', num_obs=1000) +X_train_df, y_train_df, X_test_df, y_test_df = prepare_m4_data(dataset_name='Yearly', + directory = './data', + num_obs=1000) # Instantiate model -model = ESRNN(max_epochs=25, freq_of_test=5, batch_size=4, learning_rate=1e-4, per_series_lr_multip=0.8, - lr_scheduler_step_size=10, lr_decay=0.1, gradient_clipping_threshold=50, +model = ESRNN(max_epochs=25, freq_of_test=5, batch_size=4, learning_rate=1e-4, + per_series_lr_multip=0.8, lr_scheduler_step_size=10, + lr_decay=0.1, gradient_clipping_threshold=50, rnn_weight_decay=0.0, level_variability_penalty=100, testing_percentile=50, training_percentile=50, - ensemble=False, max_periods=25, seasonality=[], input_size=4, output_size=6, - cell_type='LSTM', state_hsize=40, dilations=[[1], [6]], add_nl_layer=False, + ensemble=False, max_periods=25, seasonality=[], + input_size=4, output_size=6, + cell_type='LSTM', state_hsize=40, + dilations=[[1], [6]], add_nl_layer=False, random_seed=1, device='cpu') # Fit model @@ -73,7 +78,8 @@ Here we used the model directly to compare to the original implementation. It is Replicating the M4 results is as easy as running the following line of code (for each frequency) after installing the package via pip: ```console -python -m ESRNN.m4_run --dataset 'Yearly' --results_directory '/some/path' --gpu_id 0 --use_cpu 0 +python -m ESRNN.m4_run --dataset 'Yearly' --results_directory '/some/path' \ + --gpu_id 0 --use_cpu 0 ``` Use `--help` to get the description of each argument: From c4ddaf4c06cec861bf581127d5e1a094712a79e5 Mon Sep 17 00:00:00 2001 From: Fede Date: Mon, 20 Apr 2020 18:47:53 -0500 Subject: [PATCH 2/9] adding more breaklines --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a29810a..68ed2c6 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,9 @@ model = ESRNN(max_epochs=25, freq_of_test=5, batch_size=4, learning_rate=1e-4, random_seed=1, device='cpu') # Fit model -# If y_test_df is provided the model will evaluate predictions on this set every freq_test epochs +# If y_test_df is provided the model +# will evaluate predictions on +# this set every freq_test epochs model.fit(X_train_df, y_train_df, X_test_df, y_test_df) # Predict on test set From 6b4ecdbeb0d3cf074417036634138ec6211043f2 Mon Sep 17 00:00:00 2001 From: Fede Date: Tue, 21 Apr 2020 11:41:39 -0500 Subject: [PATCH 3/9] adding OWA loss --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 68ed2c6..4b829df 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Python 3.6+](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/release/python-360+/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/kdgutier/esrnn_torch/blob/master/LICENSE) + # Pytorch Implementation of the ES-RNN In this project we coded a pytorch class for the ES-RNN algorithm proposed by Smyl, winning submission of the M4 Forecasting Competition. The class wraps fit and predict methods to facilitate interaction with Machine Learning pipelines along with evaluation and data wrangling utility. @@ -58,6 +59,13 @@ final_owa, final_mase, final_smape = evaluate_prediction_owa(y_hat_df, y_train_d X_test_df, y_test_df, naive2_seasonality=1) ``` +## Overall Wighted Average + +A metric that is useful for quantifying the aggregate error of a specific model for various time series is the Overall Weighted Average (OWA) proposed for the M4 competition. This metric is calculated by obtaining the average of the symmetric mean absolute percentage error (sMAPE) and the mean absolute scaled error (MASE) for all the time series of the model and also calculating it for the Naive2 predictions. Both sMAPE and MASE are scale independent. These measurements are calculated as follows: + +![OWA](https://ibb.co/dc4GJDZ) + +Where $y_{T+i}$ is the value of the time series at point $T+i$, $\hat{y}_{T+i}$ the estimated forecast, $H$ the forecast horizon, $T$ the number of the training points, and $m$ the time interval between successive observations for each frequency (for daily data $m=7$, for example). As we can see in the above formula, the relative sMAPE and MASE with respect to Naive2 can be calculated and finally the arithmetic mean of these two quantities is computed in order to get the OWA. Therefore, the OWA indicates how successful the model is compared to the base model, in this case the Naive2; for example, an OWA of 0.9 indicates that on average the examined model is 10\% more accurate than the Naive2. ## Current Results Here we used the model directly to compare to the original implementation. It is worth noticing that these results do not include the ensemble methods mentioned in the [ESRNN paper](https://www.sciencedirect.com/science/article/pii/S0169207019301153).
From bf5a70b1b53f49683d1e3774286ce194dda8bc03 Mon Sep 17 00:00:00 2001 From: Fede Date: Tue, 21 Apr 2020 11:45:07 -0500 Subject: [PATCH 4/9] adding owa image --- .github/images/metrics.png | Bin 0 -> 54325 bytes README.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 .github/images/metrics.png diff --git a/.github/images/metrics.png b/.github/images/metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..1bea340e85e4e1c268a869fa8b449a684285496f GIT binary patch literal 54325 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\ca~C zVs1BH$k0mPv|a&ktdT;u;Jw=@1_w|?FSly&mqa}VA)N3Q7mPuL+W(%JsfNaxi*X0M zGi2SHzvJylAHNxLCXS-SCTk0k#asKS_C_>rMXdJQrBuc!CH89OxX>Te%od*cPb+mc zG##ImQeYHw=skqSwT^&j6$A==e-)D_hi^9zA%z)exNj>DMxVcfZVa4K*F=uo^iJ*@ zMzBUDRDRH}T@{ZLR1lHXpQKiuE1B-|nta_f`q${O+j!SCatIM(I-vS7=%E1N+VjqFKlU|dfDf;S+0bGZ`iJOq=rN=oZtpwabg zRbyg5!?+#>B?W=R6THD|Kwj}BIzz`$Hu7*1yr*7M)ItQu4!!~7^HX&mfSbEs*7I(7&h5GnK;n> z^5R)>J<1s`HgYK3*x0xW30#mjoAy=`dLxIMTIhjQeV&W$?!7wQAkcFQ$DD8K&qDv$ z_=Z11bG0@gGt6H4Z1vcqi9Yij4;G|hXz82m+p)IC%F= zORt1b>*+)}I`p+e($W^cN7|IvxG`VCiYvWVP;hlmLGE}X$P6$j33A}T@*stbmp|R@ zn}e`7h4wFr$u?Gllgef^Y8R*;lq-(^`bC!@a0nn&H`|bccymD_zcb)VxmVH7a^rLf zKng5uetV>~rDaf2zpsHeH&7kyPklEWgh#TIqFK&%)NIIhudsT&P$;=xJV@%9`^j5Q4+6V2FrtA zOiW|@(m}K8^)C_c7+Xu{%PS}ddJg?8UegS-Slkeh*)j4-zWoD0pr*gyWb#4?dUiFg ztc^6QrQNcl4Ga#ZrKgkA@&N895L*-nxq(Z^1TD7HAjJy&h~zM&5hkMlG9%hReOW9} zK!Wn^wl$mr&eaHG1OyNfCI%Nak!iXV4=Pfq!UcI{Fkg6eA+t{#aC5e-V$HdGrwgbbCyi{M5J>VZ;Yt!)X@TlJx zQy7TlfH~?iK-+~l^!t*?3eQ}bGa(sSdmLz{7;YoFMR(Y?A>`8<3b&RoZXq%jK z7%gZyC28=8CEWHmMZhy#_a-sq?YnoUhmSls*0Oi+-nvd|OdS_-_rcwTRYR9FHG2^p z3g(vR>5t(8*qpw;zL$~O$ci;lPLn$Wv73Bp#-p)}Ru3a6zW02Y>W=^cB%tg)~u~xd%+5yx(wa^H}p| z4`wc|2*{YBvO6$wAUwZrSIW$pS>Gpsl~k=6#-EO_F=|$zid>4g{`uua7UVSS>bGcm zpxOigJil&hV>-I#%`v*thh00`d%S-nr<&a5m8&yqjoS>5ItjbCj?kh~Jft zqrG1{HhRyUJbjvcr2^>Ph3i|+nsu?nW<+0{-;|f1|IuLOhmLcJ;WOQklCjr!oDd?Z zYk0uIcX4KRR``=t?2Yy%kyG%=s$kK6ot$I`lQSM3 zv{&A9Y4{}KbL1Q?_~y$?o%HB@i|~XP@n#MN`PKKmZ~6IH-qV^z{CxX#DLr31oo3{( z<{AIvY~k80?C`m1A(N3{g)qe|96A5K`%o$$7jQ1dmGxTHEQ zj9`G1Hl*{k9^F1K^nW(~d8l7N9$cLZQd*tsD}uUTdF)5Xjvi?osV;$!rZj5WO_K7r zuZ*@gem$ZJpv3AGL=q?nxLT68R27gpzfzICPjYf_Fc6@X^JNYI1L7-$Shj9KGVTJT^FcHdy@KSasmI;O&H^{2 zXwi^yJ(+LdXQyr4SD@#bd{!Vq!K_EneQs%S(YnDE#{e-<~}i zAuD!{Hm<;F(!Y4hlQcw}6f*%9ND&1Rh2&HFoP0z>zG6EaX}t>pQ^fccJMndV{3b{$ z`^(lB?g=mr^)Dr!e_vz5PmzV z1)&s4SwmrrJncI1ubKYji`~7-7pU3ieJdVe4gg;mu zq$o|)36Urg_nfn|Z7^%hj~JUy?;&?$RwGjtzy>oSOEr!^tk zR^%hhuxe^)1xV(+0i7jQRAi1QDkO)CQ@AJiD~U%C6vM_R%T&zh(BQ3W3Vh9A?}?|w zr<-yZb^9+dk^~4^<>9A0aA{df$>Tkr8_#%s_}jy$^6bzj_Kq1{r%oLl1iO8DX&z}) z%=fhE)Wo}RT$fOXrw?G}v#;<@R*y2cM5D23_QTRSgns$agqeB-(xjjgqWt@79S`Wy zQ~57&^_x6k?6=SF3*AOwUwfI7B-=>ccSTqiVJG8e@dn1 zUFN|FcDz+1qAaZ2Dvgku!B2{)HL3?2<1e+M#swjhZ$MLgC>?kyz3ra>K&?$QZ;@gDjav zeGy!=f8F&UB#u#hXnHM1{Z`|{xa>*P_-HW_WSr&_mVlH*C5ht?k6(YL$h$7^f62hH zSQjbJS8n}zXG9x)zNm3{J@iQ4*2$XV-h7q9hc0YW%YIsbe90+$EMDYtHdGY!zM|*5 z<(20e#cak_S2wC4j5IcL?QCC}Vj|o;Lge(<>khJ6kz!?o3O1S2PRO7Rb!zM@gJaBJo98T5J zi2NW*AEt)548ZvtamE4EwdfXRad^CkTB7nEiy8B1ThYQ`dsQN;@{%Q1hqtNB>E}j; z3r*LK1IyVR4y%^P;2QA$GrBhA!;Pl84h{SC?K^4j#S=yaIS-Sj)mGM}yD;b^o%EtU z(T{e)smW9WqtY0LNcJ3IZ@=q)i+rkF*gcb3&h9@4^jr8`opUcJYsF@o&Vyxwpcup%d%i#nOUiEGS6$jsaF><%>-1A zLK?D+np9phrL3I9Wg;eo+~PD@w`}H%dR~44B9EcSA-Gi=ft>XX436YIbZ+^gT^EC> zg|A4s>WH@B(JOzshCV>QDy22$d<#3D5gNQ7x7+)H0cWetqO}!FQ^~k@ud#7>PJ|!0 zw>JOK?62@SmZOPM6iY~)cmGlIFu3nJm9-u z$>6CeW`95RAq@h({#E>>M%%WXnW%06X6evjiPb|cv7WlB^*3GYlbXSE9J7tyw(LoC zSMs;PprTOb?)?JoEQzm}fdwu`p4Qxkm-DCuN414|1~(WMWpuo9~jYMCHT zaL%5-4e3fvrcAMtKqzDj?<^xbJNwbi&P^)^s1jugQU)+SarN3^VtsD9&r&93hB>~1 zN|b{9JZ0MIjv3v$_kQJ+TXh~pOM7yrz?d=x^e^|RhotqwuWyX}*sr2e2v7aXdn$%g zNFT%tlGwNwX=L$*>Yv?dh>J^0WAl3wJgs-Z%+Lgoyo+DGs!jS(zUuoO9kWmTSVVew zxZqcbo4WN-gD{3R8nqj47HQ*xkjcTK_Msh6J&f1rQ8!Z@^cBGJ)2GD;>qhL6oKbP3 z`vsX1`SPUt*Cdy(M8mDScWdwmEL*mW)QmtnY4edid!~e!w%QRI+M&T*+P7@7otSmW z`*}3FaliikFJ)#%<)ke|KHKZan0@lwv4)B;J4bo0e`~WTUT&*DPcFFKSg*Q;52O7u zzQ!4W?8%}ZpH()a(H&2tKmO1KDq!BsE;=ZYAY;Md7v`E-t1n(=Zv}wn?2Uk%( zcsAsswE&}P>{B#u2;mi3pgMAIjk`Uf%e+pEl?1~$DkH6mm(^d~q4v((`#RiSus!OPbBuN;0=yv7{-QH7j@!5)8vn|JnCq8^^({toRKG)8( zj$2Ka$%N{^Z1{qgUZcrhR|o_$v&2(WRphXY9sKju&?^bA0YBHStsU=_z5!u`uA`~- z?7g`sf6Tsns1A+Y8g7&74VV-e>`=b$Gk}0RxTp;UQs$1%6S7`OwM2b{mBi#f->zA&IeXPTT$W{*mf=@B=& zYZEin^;VkqzF8-3)sF^Fv_64Ucee*u$7yG%eyx6@vSUxbkzIp7-}AHXM2(+!DVDh`MVXgYQ48hqLG28LUvBWEq^RH2)by)c%&YRFhSepvSwC=^ z;E=MggN%~`F;jBxI@ixMG*p>5u*qHeQcf%vu~n8k7@3$}fz|ZH8BF~8)|ADj?dyn1 z#t^a6BkwFNT7ERM%26-s#BGWtBQJxM-{1AEs33S*{ro~Dd?mA4%N+Ipv;b@BGG)C% z^#(h;;_aVJWeYG_#Y-V21gHcggKX>jJADx8?Qbj?;({1rouZ+3$ ztMh{^3&TOIDRei1AHVJ+GM>-I$LH^6ag9ex9c@k(DS!H= zX1#{{{zS7NqzBRLJ#kpqF(@Jp-PC5VvuG7n3JkkU^C+HXuJ(rNyfKi&#knsxlrgILuHNI?z30lmYV&<`3) z#(u(6_8il>-MDRxIv+FGP-cnK1|>yHIdMGIBmYMxGP_?c?SdvI1*t;*V! zViDJ@R&3$%tFFPF(M4zzspx8Zt-$%jGUP>R=|-aboBA%HRvoCx*1WoXK-MZqR)nl2 zUfSv9pcG{MW7nO5Crz$RH}36O5NG!02xlg0{9&uJ^jb0)O$M=_JlPd`I`Q=B;bc3R zk(2fSeXU4==TidmWe-BK&LXUl?6we(n6*5aUoen131~M!N_#@M=)<9?#VcLVF95%7 zw>$J8p9?LGRzs?KVWpV4moYb)D)N|r+tVU5YeNQ|G-}JsP!)}|v{ZRVc+5qBb-LZY zOU2dP(fBzm?l3@US_t>kKFeu6ly3=F-j*iE*9qc4ZASOEsm)-goYpd(NwYuv@2OJ@ zz;)Yhhk&`<@qllD)JjZg$lNw>r|zS(BbQH@-i@Nr!M&DKJ`6hKrCygV8cg{}x5)7D zruaQG8c?wwweNMj_pv8eGK+41h&lE#i-8ahvN@kd`g8K4K=L_zU#)q%+qHgxAok7e&&NWg^=e#|&Grfi*2zwzOwIyxOcH#v^q%0#oSVK*wU{!mr$H>=;e z-=wDA4P!0rr|QQNxZxdb&~Wa1btrXHh^ap#B$vh51r?p;{Sqy$b?dA~Qj~z~Hs$yk zs0Zi)6xl0!d$Ik>NJYfkMA`A>396|Lb0*Q2*Hp|$j$C(b<&4q1SFK;azR$A^sYnGM zX-Zw@UN&Q7z^nCd+P817PHJidZ$_=sHb$YW4y6B8=c5Pcshg9qYle?9VBSN={>;ki zUmeb`O~Tq&gwM0~h%=|6iNZqf+U+^@fF_gPAqp~hT!p+;tzp9ut#T^e5j-GGMICOU z>*B{mQ4OUg`s^W*HaouD&tAY(gp9goPIC6^0Cb_@yyEL&J@o+TVr3&r0HaQc-j%Z> zX`9Ru!L8xU>-Xz7`ODuYZwDe}b*8Tfmsdj;8*Y#I>e|DOVK>%Luhd1v(vXF^`BPpIF_c&MUBe-5G?ZM*Z!lUTHkzjgmSfJ}ar zni2pCff&fqG#(IXSJNPkD>;$J{@)HUi4 z7qk9B2lW6KclQo7QDe(L0EeifCN~ES08R~5y&;|vPV+XTj+y=K>Do3ml}vh?jrnCK zXb={tDv>lGreWW|d{I{f8pFT%X7SGk&3j*cUG*TZXvO!r7a3|FX=T+V(Fjyd`Ca3@ zI!zANnr zR{`9x^UE&x=&GxLzB!KrHDrEFdx?6Z+l}u#dPDzDQ~aM8#&N^(K!Mz)S`+)$X+uhZs)FD>KSR3F0XFx zS<4fNU_74v3YW;F5w=|-$4B$TjW+L$!TFGl62StMRR8$cPzY$^+Pd#42no-BduxaR z&9&(kSJZ}NP^55?>mv%WeKqutBMX`D-b7KowCs^6hLYdL&OVWpbde01^`ylR@OVvy zX6yL1Q6`oZlOs>fSR~B1sAz_0F77tg+Pa1!Bol=HhFf0KjhhYn_PSlg$7Tvb5ZRSL z?zqf6d)+yU-aRl;?tb3z<85rh7TQa+<;YG(m8RK6+wK~$+}Que`g5B)*PS+N?3WJ& zt9q~%b^U)-kAV7dSZU#uwrmxGVkwfy27Q(_**BxkT5_4?-Oo|z_Vf%4YBAiN+i!3d zQ#C4PgKC@#J2x$X%J$I%jEmf zCvHyyCctJ+hlD%?gEapi3u}B!bI|!DDem8fAZC%xj)FO5WA_gjLfk6SoET}NC|rPX zdc}6zuT6K@H(ha|KNx9gd65z$!Ng;igKKi%(L*$A0xR8onflEZO176%{C zs0UHNu-xuU=6=DA;+u@_8_Nv0lF?#b+A54NW~pJ`mZbZ~d_6FW#0AfWr@J2R#;}=S z(SVq9Pj^3re}Smu(%o;$bLUb-(VUoutwdEI;1Lki25R~%e{X->Eb8wwTh?7qqfyxq zLhRH~O3v&;3OdyNum1r+=iHAv(T?c2clpEnx#Kl!GMub}7|**f1>hYSPgb*ZuLZ0H zfz#4BzTjAy8Y4{e@?z|)%e_gF(hMt?ymJOZbOES#`|MbY78w-ebin|H3hn*p&$SdH zQ9F`5X{03O=o_kI<%7?v=nI{4S#8vn`Wch92>W+F`KY>!-@OY4FMIoU=gE!$c=F?= z!=r61=2Bg~c~d*=+}X3Q_kMM3v#2m>hj*VUQvLd52e0+$Fz9oWe5(FDI9qis+)(b% z^Dk(3S!skC)8XRr&eUQ5AC-FUlcms6+UIe5*GGOsf{5Qz=`sb7k1XX%`w08J>B~17 zcuB3WE}}_ZwRY`@$nVQ5{raOiQQmde$r<7tGGA|HTVp?!xZNjDp1jz2Yp5C$j;qtD zJ`?9X86@We7X0O(4d`*UUPP%PK0%lTp37~xCSg01Nl7|8lhU8%sr+eWwV}uh%28iE zK)1o05@?w2=f9ZG3mM_HZ2HI+HB?o}PZtNiBvHa_jE~Z!Hksggbs2R}wv#iu060o$KCG}I zOrsEFUcbw)qa5)4uzp;x@K}p6enY?<0n!ovleKgw(ir z_wIO4t>g_^RHq32E|bZH$q-hMfndfEE+PMr)56S6)6|A2&qWqUgdKvrBpZ0d9xW0e z0A6KI=b!CsN;%rt^k4iK%bKJk_ee1UH&;9y6+LeQI`wrM5XiLRD+G)lJN63gRE1z| zjx*`W-HInUqRzU1%47TV^qZqBr*05mxn&=3_6>eO{%i^f+i7ttuXR!JOYK|28w5Fa zTT2UfBIrx0;`MGMy4J{hYK{+i{YMFQuK5fnlX%$rABP zd0%|dt#}1pfmZoF-OHb{dL7#AjyP+}?%fViw}n!mAIMLMOS|>5=!Cm9Jj(EyS5y7I zFHt&_Po3lHI&RiYPqZTl@#}Jr_U%i__n_F%w#nO% z_Z*Y|YL=0#a0NA3&>8M~^IRTEK* zO2$p25elF435^vgJ%PrO@ZUVHrE>V%E~f&fzlT~`Y0$eI?mKcG#!D3Pb7Ed< z3x$rKFy)Aj{gM6c$2_S%!wNW}5&r}$=N1%z9q6#TPM%^iI^0-|HF#ebHmiWxQMuaY z+8-RD-_-53(u~-tXM4=4Z6W0W4^A zO^LcqRhER@ONs($MfW3iZKbjv4QI{?dleN@$;Iz`S$Pr7y;Mb!?xYRroni8 z0U}K<*!u0r$dg^^Sd|Ymcl0jY6hdUT{mfXWKK%)@`PEDj%61K|Rte;QLn$z-^@s2< zwIMX6y8b^NY^VH$2Rw1;O5U(&+YRX}ZdlEV-WYjtwz+wL{j_AG9|LH`mN5~E?@Pmu z9gnKssM})UN+K0_v4UR9ZFH{eCb)O+r2Sm7R_DcTaVLg8-t(7ZuZXZ$e?3AI9>QRa z3)^cD$OW){NiaDEH6)5FA3An1TF?CqkBaur2jdlMl25wYTUmW@t9yN?5kSk0Z!cYh zEMTa?Nny|L%pqf*#y;fS%Zv%f18I(ZoMQ;5JB1ldO)9{{3K> zjCSGK-Di|k2C3k|pAk1{#KXCxfL4 zWG*FRL{5W`=_{+x|8eNTu@4P|ApnOQWpJ(kuPbVgtfiP*Zt7g-tdScJ*nA2^n?fz?l+nUa3-}den zB}lqLE}g7?%i|g1goh4FM=!!vlVK^mu5;+OG>%hpm=Ar z8cv>Q_~+>R@QcqRao)JG8aut3L(HI2=u-veO&T$a0!V}eDUJ>FE;I=o9}WI#e%LB> zK1_yISXifc`al^#<0;&0)~OFq1&R=>4Ubi>@A!X$h~b;Mjvi3d1w0GS=oKC|&Czd3 zhwLaPPV7t3nnwW!~}p z!qHr1>r;M=AJEFE!o-OngLf=~26FHf&7C97jYgPp#`)`TH_8_N<(dX59ox2z>4b#$ zpFfHJwY(bj+D=m3KYtxN`+xn*b^m=Pe&yD{|NU40zM=np8XTPeJsbb$HTwVk(}>G? zEXdrp;drn9!jYnF;U16$1Q=G4!-zq)P2YhogT1YZfA;dFD7?bPGf>^7bvV6BN{b=< zk|R}@8V+^=lpGen6kln&`KTri62IKXQGLrawRxd9zc6+?)v7CjY#AEKb?c4=cw(O< zRov2)jT@~ypANddTl6XI+ec6*zWh_8QK$ukjS^s$-9TBx_(`Aq0P^m`@ z@0>U3+(aX-s>p{fz4MatBlJdqkuB2BlUJ$LYfPE)(5)5f|En)PxXu0E#n3R;?ab<9 z?Ma5@0+mp!!hz@oRq)qO5o-NkyD*PQzEhtI$auOY6k04Xrcv6*LvD?sh!~ zo5L*Im!IIJ2pL)-8p=<)&>vTY}J>MALdicyM^hfyRl4T z4drDMpC@8lfwkV$VlUj#Wm_wVU3O7btk9n@6_Rt8A*QO-0mT;0BOQ$ll2BArW?Z3M zD1Q3%H%X00h^URhm1+(ie8IfxE3U|CUtjJ~D|%MK6tD%)<3gH#+bFlB9!qPGCA*}8 zNVeekTmn?!8 zsUkQvnYG*a`XfAFy?HsvBJhKrkPRYky8 zP(xcVCnS3Y;{56a_|pry@cBw=TEi`Rm-_CcN!?J871E)OE3*~-^($Au`}^;gylyV(dd>mDZgU#QIiFVi`dQ`t z2nwn4*uBfz|7iiRyrBJ1BB*K&=Ego?1h)|q4G6|{38AMt?zwQ`!k4q$&0#^&%KHP= zKSuaIkvImt(#$uF?n}@>#U^_E;kG_m9$cnOSa!lkcOAOV9Ay9r7GXu_Cnm&jLGR7_Lqz1v?wbR$Xc#dfYz%4vq8nWP z^tty?&IGcu4S?C=UhdX)PR19{k%$)=acQW$#^mbaL(r#-MMbRz03UbdnF+TgC-`^! zF|H^2y2xW}SAl4-94~mRqVk z9~*eEpX)?dvJOOB=RtiJ_s@85)`6u&uS)ryf9DUMakSe^)rkA)Zy2r(!I|wK=mVYs znm59mbev^$9lqa&t-!vY|C*^-EvY|ltZuE0W8-VlYzvlx)!D^|vvzi0Fn_)oB}!%d z4bNIs#%uol*k8YY->9-7Jw5%tVNR|xOtWSVt5C?_BGY12G+W8eJFJc-kf0!I3dC34 z|Bd;5G}UVU@LB7(FUPbf15ta#JE!`#WcP@rk7@2?kW$TwrJdrUSKqYtR@>eQ`q_0{ z8>4B$1=|5Qx!vaLB=bZaJjz=a3VZ43? zj4k_>q(62lTvWLZ@hB6VvYk*qMXQM4ssb4htuUDo+OE@|=U6qHeMKY@_Y))UTq%8! z99v}eg6~CM9>G(sYcyeOnZ@*OauJ}H`FSb|A8ieyKAELFA0&Jp)s2?VP3y_Grc*EO z>fx#i;9+on;x^B9GhV0t`PdYKTL-w;@WkfSRGs*qy%U-VMRl$SBH`3qThDJmuEB%4 z(bO7z7GNQ&P?EP8XOP4if}Xv`S4>JC9LFW%gIe`n=FAD@6BTH*%8$eWEns5z?o;u% zs$hi04Mkyz=XkYF5Fhq<9b)qvm2Yi#QfG>#!OJdVj%R~Il%V>msmR0@(owFEMqNLu zr(nMLq7PlWY-fAzCay*#Y86FcfTJQw-^8{0%d>_uSW#)qOnTOb*5JD`d3Wu>TMU*- zjIL;O91_9~b(}+xlXRne9axDAyR5Vn%LpRs2=eK*7Qd={J>SjPsS3IROM{{9QDgru zp4T}wMmoqFwLk_UxFE@V!wpell7@utZ#vPS=15N1QpN< z>N#0QS@PXQ{ifMrWNB^#Eg6JH)jEKwOBoJ>o=W6B9$e8n>TcBJh7*rdxQH){Xgh{z ze%kqYBuM-QZNvHaiB_0IUk|4;b%Tqs$BUG@DS2n;p^kC;_O*fyUrSBAK7l4A19lIz z7PwflxxjC3)aS#U_vH1y5k@$R#5A_VgssLpGA%^-0^eVa^vQDe8?u55WDVECLA>7R%RgQPE@kj96=d?gJ##-A28%yxiHvzBJaPRppvQn6KdoH^j%Y!sKQhuTjk+ zMEVXZi`(j-tK7MVtC(id9Z8VSd>vuYOY~ z&bo3WEeN|SVJW`6J{Y25Wau&V4a&(TOo`%mGlcr3z?gRd-^A*KOcDb%c{au5ra?h3 zO{{2!&i?XTxM0B$uHdFYguAW!zj2{Eo~~4Hia$h66MM1r%DQ|xlghFh+dTSc6hRtF*Ye^~Yrh#V!J*X1(G7la*zU0kS966vy~8=i6=V7kwjKq}`>JlM?h( z&F`a)VzRxSZV$6kugdb_AbF!E-jZv8?=KepVf8*F=wA*35he6+r!yHLkRVyV{u+*> z@InNG8dncog@N-p>s=W$?t4Mn3?`b-WSAUeA@nX|cMVa_eclT$Y1#9iNNmn|KyDTw z7PZ8$E5NtKWo6jYcuPOewt-z2ziZU5Ka67bl=pF!uLB2_qPL=3eDil5ajV0aRkq1H zB%njtGr(*;LNg|;H`2wF@FRQ9YB9~?J}r9BIgrpItqcD1Xi~j>I}AH_wwxD1Ij2Ni zoqT`&p{Ur_MmCG*eFN#{Yn{y4;@$arIHXo{h9AF_Z0xR)9>lEpGv-C)A)rGvy0c*J zoH^n{4tZT)R+T}+OW|#%SySQ#lV8YG8CTi;!kP#r()aYzrb}+(N!7<=-=A&UdJp{f z31o6>#q~=)z#pXs`-a-kK-E?RwLml_U48urVe#IHv&p&z%`)*WbfIZwJZjXcxrcVy zT)`_>;tDKUWNC-??bn6S00x_0j%_?W{lTT2yxuiJdG^}Pk3AyUl7~&hx=ub(6Zv=s z#ddp-j^oDR^Ifr$?Tug8uFc z)~wcZmQ${7?=JVxxosSG z@a4F6mxmrqiky|D)jmn@j-KA^O<7yq+{)GZcUq^`WLn~csC9R1zVUOp^}TlaqbHm0 zm1Vd*K9KC_dA90QWJ|A;<%2rrZPt&j9owbxMDq{Feu06oabBl+ioC3 zXP+{-cKaloY#?cuSKXU_n=Ea+%#X~9VWN$01e@T^dk?{a2G{Vkd>O?d$X<2qWo&E? z9Pt#opER{VB?b9ybgSPVi$%l~652&8la5RqHcSmKl+c}Oxl5GnCr{cSJS*`t+qqcj z(6wu@;l_wDfCWqMhqJ|2aKx`}Cboqm;_GT?Km`jEgs8F(N67Z*wzP_AeBPTTe7UhD#zs;^R3-UiP4(U~XTgG> zqD2KkeN?*ub%^)ji!pmUK6k&%Yj|I*0%{YwQ-8~*j^hdkPA4iN1IuCq=*@E>M~2*| z)T#L8-cVVW?IzT=()*j*^^KJ-CIjsa2M=yToqb70?#I=s$=ey)Oe0f^zdt`t-LY~( z!p)qV9j6&O6^}8f?D!=)2)$!++`v=w+PHTims3;rtnDyMhaz(%j?`oaN{+1 zKW{rwf7-NXrlGy$kV)>6e3F{_qk7LVOU=)~JS=KNg#2>g3T`1<8nJ;3HZChYF=BnT zn{13@RwIi*-21J(l};AFkDh}Uw-nOu{9E_5iPvx3NGasXB+Tzn-kOS?6$Pz9CAZ(b z@)7hSnEsPNeGB)98prDBIi@Te=00#-t5&VbT=oIhg*KaGc2nO$(bH6)-O4OFCMJ{q zsu7cwBIJ4Y>#j*tUf1$U3eIAu3!A(XllLXW#Ar~wvZ-?wWi4(hrPG!NzSnBma?^et@Gc@`is9IYWuXpEZs{S`jilpzk10q2r532Xn#Rzcn7?@$gd90^LC${ zD^+>RqZa_x%b{r4dVm>FDe;-wWeruJ3t9zMEwoIy)RyT8HpMHXq4>|!$bn$sXJ^vfA{uFEqc#VC?!zl-l$x# zaG^QCEMpDNSL`3wwh{O+TOiiaBk&t)n~mQ006e`mqrPnVZpOTM#E0~rmxZyXkEHHj zR5{1O+?-`&O?orG>t0QC6gd>#0NLPayew=3MU-(PUhz`h(S$9aEOx}N1LS)~=5;*4 zI3KgBnQT^=IB}vwzlJ9X-5VAK~!xf7!P5gIs;o--7oxznxEjdNgpTD{}L}FF1XPi z^BXLRdOnlP+Vk_v_8&fcICG%IhoxRDK<6B+Wg^jqaqUi>JF6%%KmKB`tS~ZItUK** zyY2y+=1!B`l5_#^`;+7XFfw2~p*0G&I$|fqm6K$JYDE-h*sKvYYEvZ~uC72YHH5l! z>wyCa@6Y2R&P2tF2DLu`e^7HI^xk+kH&>H?KjF)+;{fW?{wF@6nmSvpIopDwL1bsl zbP6)>`Ru$0{(p6)f1^$e8TVw!1bSx0^?V@YdPU3&X=wm29df|narSorGv3Iss> zbQz9dabnwh-I=lDg8g2I4Gav(BICpJ zmjJM%x7pod1Zx!tdz}moR}<5@@H_T@o{9m!T8NseN>#c>-t^5@D=sc#L`A#-%|`Eh z%&?w(-&wQN{eJF#@?vAQTUpo;J3Bj(i^))leFRV4uC*5tc9f?YSToY{l<@vX06+Es5#ynovonS(AcPV@uNYSt z4B|eRCME*bKvYb4xEY+(`ze)!LyPj!O+gjlK%|cV=1TDH7pVE+a+IDC`DVe-Z(ce3 z`s;v22}6c&NObRr3asXRE3$RYVm>E2NpMiSmM6Zs&v%d+*h!5ACK0bLu&X#@YgtnA z<^83GDRE)q;z-Ais&w`BDuBS%&>&Cgi&oM#Al4jsS^okx`E!T^}n|w11PbCPe z3JMzP=71YahZ6pon$Zbtg%le5p2#IrC0tT*&5mCILOZ)gqS?(i<%rO}pk2ht;Yj7T zU}m`4(^4|%rB7l*{q7sNy9n1pc-$A>9;WK*?~%Phdto6d@^!H+?WNk7eLKOab(@>a7XWr*XLoJtLHWf0 z{7G#?jCn8RX^1@41dUQ4Tk4RN;_fXY^}NDB>3OHQxVEVgxyz>6spJ!Z#PAdRbz7aH z7{h5Y3j{GS`p78%)6A|u#YQEQ(|CKTCkoT5-T&uTy3RdFyGNcuO?uOB0K?g)A>ou} z>8I&^9*iL!QrtW0ne^{J#bCSb1By|BL|NWhfW?3V|+^^@irg=yOvp^!G77H)k zQAaA)-(Tmde6#2KnznA;ZTskN7pi|I+?rN&cEM_&u2b7gYy_1Q&VpzGiS6vPC)J&3 z+IXU!=0vTt+8S%p3U96Dv2iD5&ZoljLN@mBmn_gyyZ(j}9@^^_10jF=PYizmiL-Bl%v*q@kQ2jTCb z#M>Bq=r`RM8EZIYssS|_pd+_{bT9i_cD zw`J3+!`IZt{~T59qJKYuTV2R1F!xmppzz-gcnPg~woqgP%wiooksk9c9@G-3EE@r7 zyG2tMMogmcEgWmA-h!GQ7T_W?%LU~Y;gsUySL+e3MvT;L-h83TJy1PwNNid-WE8y!jpclm z=g1NMd9t<0~&SRa0emvD;z2fDVm9dv)B_FG!Ex8Sn(RMlG# ze8&cE`8MfcdOOS=Xc=ov8#VVKeLgD`b!ah*O-`eA2B_>X$#`w|2W!=%+aLf4+`qpl z)~OZ&W0CZ`%V)lL_3DPN(a&8g=dxaRPyYee5zS*YKKpy88-c-_H^a+p8#UwI#-E2) zCu)&Iv+3Mi-QDeCt0G2Cp4{x^?E?)t#*h#;?hmO@%PJ{qlT$Yr+JQC?7%<@NfHA-W z&U^I!{s+VT5)(E={pnNEOLCbHdez^p<3m<2*iM|-*2rknB%j)~Ys)iY4?(iS9$-&U zcjs6d^cOKPF;10Q#L|5dORx5~HdQq8S_arnVQ$Di-P@$90$gV{1>K7I3M zJ)mHxo2|#&T7#iB6+CqXv*Zrxwe4`#&pk8GSr+%qemG`Vk5#cFVvk=+aat<4M60Z2 z6E-0nhZFb9zo8eHcaq2U{?G6H;&#Ty9}d5JNA29*z4h;48@7sovSn!j^7q=S%rexR zw{P2qgg^;mEAt3si!bzo%d74z z(L4==^o3uO;(hMHbQc$YYAFvt$Nz5i(B_h{%TGb$wG=B44wxX^K*{9rwUeFzM93H} zSySe1aaDd=QWACN2O&H+KYxwAQ7xNAdWAfL{LkBOSq)tNp}q9njDL?hn3De=M#16r zTzn$=^y);qJ0_&!KmPG=ULvQPzfh+>=}qF{3)QBySNs{NuGMzy$hjBzz3j6mvUHiVCoHTsbKjyV5jhiOshE$^ z|L1wHur%{xFNXjJ%PY6u3aqTETDyL|%}0fdJK807j_@DerhImMOmb5e%>>pT?eT=j=$3bE96K!qoM2TD=Ji;|W9+gH zGa~6~`H-Nb_pWh~&tdHqKW?u3Fkp{~Bh9 zCQ*!B9D?cEH%CRaEqYh^=~FHf@#-}L9B$Um^If4kExD|FWNd6*cBq?%Sd5%2{%8E| zg@sRu2d33iw?j!0-BU^lKn#P%-@AYJe_$oocL_8A*($bFgbRyKO`@=b&>iUATWo-6 z*Q!-zGzc4sEXsS^&6Dix)&R>Kj~lJ0Isc=iyz=JXT5QoY|8+rRHniSfFdG(s0{FiY zZidUINT^0B0=W`B(TN4mJ`~f7-C~TYtB?+#K0b<6K=kcUY{!zlsGqTry)e;lFvG0$ zpdNF(&f6Fept^UUPg6Q8={gzdB&cnsx$&&@c|AHG?G9S1t7_w@&*{(`4jh>75G>~s z0awbVCFl)6k?@*I8KW}FW83b#$v200@7h&1mPkL}<0`$WyJ}PVQC_XUl+su>9P~wI zfW;@EydPJNqk6>Q_@u3X=6IcGJG2PV9HiB_@f{qbn&{}<2yMi;gsvDolqOAcbNjty zCf$oGftmSa0G{-Oc6xfUh`r<3_^On*ZCPMv^5>&n{Y*`b6_&&C z`eqL-B148FDeYT8k9dP&&r@ehn$vcSlD7^FRN#>YDBP2ket)LXg&NM8WN&{J+WJ1% zX&3lhjSLiumsw=F>}I>B8z+w&*T@GLb`Q92-visXH@3F4bfpQ1JA2mtcUCKIrnDvh7hQm$4h{=9{URp=eZlPtiu^-m*S&XVE` zm5JlVMP_RkenE|K_P{|($~=!a9$=3}ixw3ym%4Mujzfu~DRX5vTN~f^DxMEcb*_m-n8kt6Gzn9z$_+5227tnuc^q2 zE=nB7(taIOjLyR_sVHE-caODMzK8?7=)&t|`-U>ww6glwquZ*}q%>$A(ipEmKo%V^ zu~%;`&!wbzcpcZGB7dD9t5dZAog8|d-mQ0Gm$F9~Wk4t6_~1`4eFCYX9Khz2&-{DBoSk>cRxswjOW-Wm(za>ry%+LUJn5 za<&G96)#8~GnLsoft9cTU~jTIUd^U=bm;X-+($xrAcyvP%?I$W4o4R_*US8nkNUN& z63OrKD(f+0hQpZo@2+tpb;-Ny=epZW7||kP)cvLFNr1XXdV; zy?H)$_;3DYs5MB8Uek?o^1`d*&R@mgq>bOFM*h1$h-81IrJ?UYq{C4>alq>r*K4)! z(7~g(Amb=edMx?-zC-O^UmcR%)I{n95O=L+lT-WZ+z5M~=A8yd0?X_;Iv)^8bar5xFmQHCFf5s%e z46x62+O$gpA9Sme$sX>gw6wj2y12a75DN{-;3TTLR;(tqIOx6hZI8>MyZr&W`RM7; z2O60LM_L;xbP_@R{YR4b4_+$zGNZ`b$Hy?Ipy|eJF;6J}svg~N+bHjdBXL3PPwtqf zxwB^wT!$;)m^QbAv+kTxs6L}vPcDv488c|Tt3mNUU00=%Rky|WH6wU~dB5CCUl=lDP#mQ|8q zou63WOQpt@UWB9ySs}COsOD-xV+CK{+8{!y)(O6uN}sH&t)gvp9AX5E!U?25`ugB=O3wm z>toV@8-vP*4I5;_LC7|&;d)T6|8*PNE-XVf4qs%s(y9H}ZkT{ydwd>~Ex$SKE`VJ&az5WuocI9EbCW$M$qX)E zK&1K*p37%WQ@Or6(f`}-&A|3Vc!_Y+FK<6K`lh)%`MUwCM67DAPLH;lnUw#+CH_I2 zC_=6vxmOe+mauWMiTz3s5#2lX9qDoC^5rRabNZM&9ln0u3NtUer>zAU2M!ATDF(Ej zh24xMp9nlR(YewEjB5dyDirfo#{_GGIGiJLR)|fKBu3$@e_?ZHS{S|aa>qZWIy!Em z_s_HL`X`6}`CPN#vFmvUWVEd(Ey@MzrG53zHY}OP=rLLeGyD`0X|1XLS-w&#ZxRX9 zPIeTE>hN;UOeVU!A09Q(UTMDX&-1u{$j~zajA!wdwQcg$GEI`OggSff+zt0-mNSz= z!@`(RpYkk;FOX6-d*;leeR}Qg86+zlsVde`n!yuc85QX;*x?acCEO4r4jrmVode4w z+@?5`)1w?@^%I+#RvK?B91A~;7rzX3l}HNX+y8c{ltc`JQt==*&zm+cUZZ z$q-Ec2cUZLtkiM&eSQM3H{0s{G2c0)srAt#|6O`*Bp+}}vrnL0n4)*{@Zjdee zAQ+M|Y3^*Q_ke8(OsHIYH1qe8aFk1DeZLwL=IK;hXW;Ax+_kfgdEty(DBEQNl-0um zgNX59ib6ntcck~@Lt1%ufbybhjsn&bhMRP9{rYv688d3p+y=kuSRQos>d2H4&zye@ z+kC?LG5};lhL~k~X6ZY=Rpt0w?J+A6>=3ZrXlX*c*WoFrW~~C9lOj^1Du=;iGMy_u zF9XxA$E~DDpb^9@Z~TLTyLV4a9J{nhlO|X5M)d93a}|)s-Ov1wz!KzZd!yk1X}Z&l zD+?ri75;Ab1Gj{|X6#r(hvLFMP3VRqL#IY7fu4@V#}5a@eO?y2V@EN+M)5~#|FL;_ z_IQkYSW?JKzdn6!7vp(F1Cae$8dyv)^^ZC}Dh?h_l-r_zM_!xRM}m=P^z&+tJG9!= zcVz895L0Wnc033JNp;x!&quoAw1BAfT7F{Qj>QxAAQvHxpEYv0th-_3#;x171rSz6 zOPj1Q9OO)caD@-dixaD5+XA3)8;yr;Oc$$*8WZ?w=}pohA3T%7++_cO1lk|5y9Q%O zusdB&Z6s1+SrW%_lo$kWjcoVar1VpTR!G|)Rn; z93I>qSF}J1u&N}eU&=qpw`8S!(?u(2A;kKSN(-D>UsGLn&x9u&Jq32%&cGn(;YavZ zWU+x9!r24P7$B}y=yo6X2HOvCIfP(X6I`FD6R<(z8UM(95l`2cfZ(u z7!SsiD_J9h#BgJ1+i~f)bTlApzlX@w?7jv7K*p;mS6_)kpPlgB_DmlgEC%@?8si9UE*+?LCg*_s1TGM)M87pm5|&+s+k5Pw2?{<7Um0euEy1z)o{m zaP!75$vy{wCgp&o*Wh-(WG?x5ruu+|J_mHK4 zvM44t;nNq??~gxvP-~s`{rbW5-BT@0IqE5kmMkgAjH#pl{P8e0`jK|6_1HX#;R=!w zH-7(pmdZ?8`+l@Y-%IH5&tl|6SGI<3NG3U@DM(%XCV=^q>%v?GqFK9s z@qKi4b@dR0&^E2zw{L3t?JHN1P1b;e3{SX&VpNJjU*?Wwi-Zhe64ireD;I*f!L{fg zQ$|?=1JN3aKt-dMD}G1yd3v&3>7_Tf4yIcrZ%3~?!<%hF%rkVvh-r}GU8*!Wl-(9p zav2!yi@%qK4uJm?1TX@(AZ3sszA(UO$%O9&nYiK^r_<{dlvC8HxgdOZ>$wg34*zIQ zjW4}`XbZ$Y7Xd)%ps9MDCn4af$C}R4pLxSjn&U#c7LU!m?~cBSsZ9@nZSOUsWSOYtvTgPTMue&r|{k7qBgBn><`fz51|T zRz~^grjNzN4aMXIX{@3^oWni6@Z0?bVYCaM^!>PdIt>fx&z=tY{OQwBGc$ijC1#Ln zCo0PNoH^{;4xN~a6H3)L0D$H<^;^wZUH=}PYdr`I;9>~=aAqt>38V86W#vl zKOb*^xHz_t?c(mJwsjd=TulhVr+&EWXje-g%iLo3U33=Kd#v|Sa#6X7esWcGHaN)j&L@uA$-GPP7UtJ$T+?6gmCGgjKtn@5CX!*iZG0e9h~#O7CsoDKC;=HxISLZE-}$y zwR#764b%D^*HhY0p3Cf$^q{{jiWG6eS@Vt+@{&%DPw#nQy$o`Kv|eP^1JUD-bMxrJ z)Dp?Y&YwRx_4oa}rKH3SoM(PvdV0F-mXtDPq2HmEO_P(>%63xJj_{DH9t<4%Eu-5Y zpQ{k`3lMAt7qt8OwMN9ao0HFneJC!n@h8w&heX^v`kJ+ix`( zLGrsN!^D<}kce4p#QPQ4{+>;cZHG=T?{daF{i6Ur)cQCh%u@65B(!H(NF~DEOK@>d zzQ?{|(fr*QfZ+aVYwfOvhGMs!`u)w>HD$H0F z`ZW%R<6ZmJv7FfA!0i;VK$P#!_Dfxmu(WTa2DG1Qpnn#08`n>x)e~_LtYY`2Aw7fO zt{C>8@NVxvYPxK`54shDrL(k@#buA0K@x~c4s+%B`7N)l8gVy#dwE;SevLG*rBuFmYlKR!zlJptBz`An1aSO{8Fd z+@eO$FY9l1v%98jXl5u)f4~4o*VCnfigD;XL-!vfHaQj-u)KIv&(L>vozW{`46^Lzl_-TX%l$9+%mpzW{VIO+nKnQ?VjSTCrPRsXA zy|AJc7YIev@yzetXWW})Yn#Con1{z!0;jY;W;b7*j(;&q7zPN65Ah~(mYT9Elo{8= z#KhcLvUW&OptcXcFmr0ZuV42j8lIttTeIqnxkh4wS&g-kqRgfm&Y(n+M_TTT)+x1-Xw>?d$;nZqeBw1fst0i8; zQbu2>{$+S?2EkueXhwAniJQ`64(#px%AI)h_!KSSTjwg zl{WQ6Bbm0t`xzz8vSrDy0vZuf=N-i@v?q;1(-tjaPweBt(h`kJk3%*3FSk*tizs0l zyLam;ADJO|P)1b&zriR}{^sRUTGAY!7){UAOevr+LsHtW4^_nBxg`B?XrLMyEH;T- zvcgViV}9`!nvZ2w%YXgow{+nj%Ky{bnZ{LFZf*QQIAn&=LF;TRhvR@a6tEG@0W||G zBZngd0V=rJXd>p2so@+B8E8PD+X|85_=lG=gz$* zZF{UmFR3&|`T5&T7yuEtBGj_~c=EO1Vu-^s{;MQf615<#-9X!vl-0+DO&gu|Atas{X-) z%d!YFo__6B;o>LN@sx;C{!BBYTwSyD9L(5rur`cYGb6+5*QYrOK zO`}`KMef)UK-y5N-$nZC0LbG?+gG zlb9v515+MR4c=vKsWeVurb>NX-LRX+^78#AWH?KEl_GTbAeg+|7-4;xzN_}}DWB6@ zuI+XBwzM-=5JJ-&NH51`Pj+Kp8&XZFhRYJVflJpyZh$OEnenELn}La$ke0^mZ(Nmz zjuYyE@bt}>B9wS*j0hby*D~|HV?7~!(H;*6Nf+OS zi=DW7EZ<#W+VzRmqBG$=2HFMd|KsBNsnn*Dd)dr5aJ;=W!8WOP_i$a%CKE-rk*Bw} z>Am<88>{c6Q;p$rZ&pF{+FwAUZ$G?sqK|Tzg|=cnwEP`xtQB>RBDFtk)B1-S(4k9* z?OM`pm1a@pdA-MeE+Y_&++L1WRAk$vyhPSP<7!b^#)+b5;(G^8p)M@;Ys^D9@WK5| z@U{Hc@u17)A5{*x|L|eKGmk^>FYiHrBwtojX6fzg_h}0{fB|%Yi~0Y%=cF-L!eb{| z**$$;N9}43U%?H&bjbiKn^W(_{|#Ch4XPU6d3s1(_WOH|j)OP!7r+sr)x(MWNBMI% zVHYr=Lj+Y_tT6TG^`d80ZrwVAWH!OSn$I0bpAYy+14#mls;Uk#HfL1VO{Bfl3XW2hDnj!uDfG>Vdi4VIoBDhAazNXBNHlYuA*vHz zgNyR=wtnY2IQ9Xho&y0nlN}fP2=$G@Vwjt5=dVMp=N;F6JzNvPi`vn+IVg}l7WV59 z2YV{7rJH%{5^E1dj zM%9btOklP{CIKAkKVG2Ca|x34Ucq9TFOvYBh7HedA`1vse2AQNWpu<(Q>U*OIP<{! zQ6>T8Ffk!AlGYiB&CnR#lr>^bVj3`ZTy%6U^7SJ6Y{hcY(TS{0*TfotJJ0C#TJi%e zZOfXHhEOqNtf5S(}u#fl0#o5Gs z8h`NMsf<%WsWd49x#Gq7jJ{q#2%^s&!RfQRV;>AZNDm$7oaq0wJl-D@(_QPEZ=xZ$ z(|e$suGI>H;X=g+^u~~CSzYv$2A^6PJ#?t+<9Xm3-3{x+v}VR;FtPY5@nfcm67Wgf z=%|nm*e6RZQ&Uoc1@z@s)|8^$I#yI#>Rs;(XRo8<5|V{ni10pef+lQyKCwJ4&@`kv z+hsq-1XAO6Zm`xYAp!T8IdeCY>01a(_&u1%jDh@x$Ul4_?G{|hq=iKKR@5NS2xFKYj4;u?#+&r3`Y(Y^gOkkm$@H|8=@bK=L z;eriuS`=y{NtG%qD;=mHbzxxVl=QabH$2-kP5$eT=b_u-ATTG|>PCO;rqYlpxl^!0 z7B_s8$qGZKyVJk@{`c?zumJjw8#!dyu&o!e#kH8xQP@jj8RB2>_22X=i!IY?8rfPR zE<<(jSCy(@?w6oX+`7KOjjVX&DmCm>;R6ZCO5{ zgvn03IyE^Hp~B;PXIY2^mDCF3d32(j-CDh!fM3xlEM7$f@P&Ht@XKsKMFIH~fEfv{ zjK48t(v<~t&nR*-s+g>$9JWbXP96moycw*6YZQUM*^%g4s#h4 zw`t#p2HC7)D+=L|_R8j~s|3NvG?NBj4zZjbvDOTKSr8%08em{?VUlUgGUOX#>6|Yj@4a6bN|@R*r!T7xOz^N{h#9%K2*aqEYs+kg z4=*g)yqm>~coYeWINH#~GbhBtSn3`Z$SSLPF#{6WWa%2fRJf8H54II@-)q|D?uJ_) zbgZCs-IK1$qzT(x3MM-fm}}UsLSoQ){3lO zi`b(mH+KuAnFCO1aA@c?s1bW%5HO8!yMH`nztbF{Ba4P266$}mq(lp9C?KW$0%uIH zR+|S$RyWHw2qN%k@Qu38Ua!5T;Xg&c{1X1TpPwTXRi3ZW!op(jltBS3ndzPN4GoSk zHVJx;j*c35W$H!FFvZk-X2lbao#SSvmBW8{xNfomYJMSz*(l zHCxEtsJI?k+rVI(9o8yU8hrA?HVJ{9kh+2vZ<-EB=25?Je#^>5fVuK^gfAWEVOg>a ztzS9$CUO#Wr!P*{p6xEn@0+nzHFAsPnZQtPzQz}?Zk;M8ER3RalPErdVQKi!eLw_L zqrAM0Gip1)L^^&|v5zV*>|s!s0~8xBy^v(kh-vwgbtg$+lWw=arX&M(Uaa?u9cTCV z6E#ho(WH{bQ7h*~KdXjGwzY%XRivZ=s-JwP0bgtK+i?qv4_r|So>i!gJ~-nx-aYeE zMH^|ST1jRfEY9~vQyj0SD1AnAS6#|{xD&JA${5^D#4mdZS=7FJ?9`xS@tbDY#^_F1 zN_Tj6cWHu*8NY7Z#kWEDb<&t=dD9BUYlYolR#eFVXOfzC%{Q$FE9up2X{`=731FgY zV1&chaF@4UnttVy`>&fzfJa7J+kJvr)k+z)>39CCFHYs#e3?QmbtN_rPLY;0dm-$b1sH8C;Je!R_3hTL_3SxI zbznn(!JVHzd2)P7Onm(HSl2ILmHB0Tqc2-NHni*)#de~~W2lt_^+)i61-XAIXZ3#W z?!L{xoSgNF*=L}z(!A?i%&@d+=9@U=u2i>E$zE$_iyB z9onE2y73wi=sSj$Klu*?KbEPR+<#Hq5h40!$3wa>rEV8Aqo_>|8^NTgX#(Lf^-r`} z+Z0C9M0Yqk*WpU}rz?K=aSXBCL#K8N{BGCSJd8vDe1A%hL}3K_w2dJfgIrt=mLBmZ zA5{)7yN*BeD=G=lm(hC>w2V~m{&QUE%{U|SNF&5`M;~uD zb>3=%4Sn_;V3*(dbVp8}oURSydg1p#>YWuzZ(R(Zr1wEjmC9nejQDB zP2o!L3<@G|3)#T^@paL|?u)Br4<(ZWxo+C4(sPaWnC6XXV6Cuz)MT(o%dd>+7W1BLbu z0Q$pt5$kim%uoARu$H*i1h$vV*fV^X)>p@@TmjytBfGBwp~)0dG6CKxn$!6xXFs} zf`*eA#DFP-Ik_&i;6M;RP{~`JL;Jz#5YTF`PB-E}EB*e)1!z=!f~Nf=f}p|BK>I95X31_Wb({IUcMX|3?i+C~JHtG)19Jt9)p0ypuG~ zOhgJ9cJ}sf(1?~S{W+V}z&UPcg!&3#ZX%9u>W^af?AgwdnLx1Z zHPCCrY@QgzVx&;Ad<{#+dC|`Lof1ScJKRpfQ{Hpg;a*S({y(QPeR`TLs?N@G5BU+(+qI!RMucBX zf&smQ=6_4}^P^N9A!Fh>&vIRMTAuuQ25_C-A6^sX2K}ikxHaS@7wpe(edKaf1ff$4 z{NBTriR!@no5@3mh7VXT0jMfa#y%qj$_=A-v0LjzCH{4{Q1*?MxI*Y|oHM_6(iE~= z&X3TkR6+rHlfBlh4QTo7rNFNxPDt9Rrki2s&CgvdSJHCcmzJgUY11ROZq56|w>M$$ z;Qy+{|GZeP;Ipsn|Mp+5zZ>TMzdqpq{|gdcj8$e0X From 6432a676011524666c5990ff697054cff71b4b9d Mon Sep 17 00:00:00 2001 From: Fede Date: Tue, 21 Apr 2020 11:47:18 -0500 Subject: [PATCH 5/9] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51755a2..1d9b1e6 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ final_owa, final_mase, final_smape = evaluate_prediction_owa(y_hat_df, y_train_d X_test_df, y_test_df, naive2_seasonality=1) ``` -## Overall Wighted Average +## Overall Weighted Average A metric that is useful for quantifying the aggregate error of a specific model for various time series is the Overall Weighted Average (OWA) proposed for the M4 competition. This metric is calculated by obtaining the average of the symmetric mean absolute percentage error (sMAPE) and the mean absolute scaled error (MASE) for all the time series of the model and also calculating it for the Naive2 predictions. Both sMAPE and MASE are scale independent. These measurements are calculated as follows: From 463c28357bcc004c63cd068a3734be92845af6a7 Mon Sep 17 00:00:00 2001 From: Kin Date: Wed, 22 Apr 2020 13:38:39 -0400 Subject: [PATCH 6/9] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d9b1e6..35f0439 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ In this project we coded a pytorch class for the ES-RNN algorithm proposed by Sm ## Installation -The source code is currently hosted on GitHub at: https://github.com/kdgutier/esrnn_torch +This code is a work in progress, any contributions or issues are welcome on +GitHub at: https://github.com/kdgutier/esrnn_torch You can install the *released version* of `ESRNN` from the [Python package index](https://pypi.org) with: @@ -23,6 +24,10 @@ pip install ESRNN ``` ## Usage Example +Make sure on use of the model that the dataframes to fit satisfy being **balannced**, +and there are **no zeros** at the beginning of the series, there are **no negative values**, since that +has bad interactions with the multiplicative model. + ```python from ESRNN.m4_data import prepare_m4_data from ESRNN.utils_evaluation import evaluate_prediction_owa From be3c8e410248f1d1caef4af6654e185fd9029b00 Mon Sep 17 00:00:00 2001 From: Kin Date: Wed, 22 Apr 2020 13:40:02 -0400 Subject: [PATCH 7/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35f0439..bfd24c8 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ pip install ESRNN ``` ## Usage Example -Make sure on use of the model that the dataframes to fit satisfy being **balannced**, +Make sure on use of the model that the dataframes to fit satisfy being **balanced**, and there are **no zeros** at the beginning of the series, there are **no negative values**, since that has bad interactions with the multiplicative model. From 21ba3819d3acfbbf865b4113a309b857cf35f54e Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 22 Apr 2020 12:44:48 -0500 Subject: [PATCH 8/9] version 0.1.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3454349..c6e31ec 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="ESRNN", - version="0.1.0", + version="0.1.1", author="Kin Gutierrez, Cristian Challu, Federico Garza", author_email="kin.gtz.olivares@gmail.com, cristianichallu@gmail.com, fede.garza.ramirez@gmail.com", description="Pytorch implementation of the ESRNN", From e0c0455126b5a80180803cc59bf1693758234771 Mon Sep 17 00:00:00 2001 From: Fede Date: Wed, 22 Apr 2020 12:46:40 -0500 Subject: [PATCH 9/9] adding downloads badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfd24c8..fdba4f5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ [![Build](https://github.com/kdgutier/esrnn_torch/workflows/Python%20package/badge.svg?branch=pip)](https://github.com/kdgutier/esrnn_torch/tree/pip) [![PyPI version fury.io](https://badge.fury.io/py/ESRNN.svg)](https://pypi.python.org/pypi/ESRNN/) +[![Downloads](https://pepy.tech/badge/esrnn)](https://pepy.tech/project/esrnn) [![Python 3.6+](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/release/python-360+/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/kdgutier/esrnn_torch/blob/master/LICENSE) @@ -24,7 +25,7 @@ pip install ESRNN ``` ## Usage Example -Make sure on use of the model that the dataframes to fit satisfy being **balanced**, +Make sure on use of the model that the dataframes to fit satisfy being **balanced**, and there are **no zeros** at the beginning of the series, there are **no negative values**, since that has bad interactions with the multiplicative model.