From f4d8fb530b40336a956e24ee59aa6b8c1127d8ff Mon Sep 17 00:00:00 2001 From: mdancho84 Date: Tue, 19 Sep 2023 17:54:05 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20business?= =?UTF-8?q?-science/timetk@b902278c4a7596846594502b4a21595f5018c84d=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/TK00_Time_Series_Coercion.html | 2 +- .../TK01_Working_With_Time_Series_Index.html | 2 +- articles/TK02_Time_Series_Date_Sequences.html | 2 +- ...recasting_Using_Time_Series_Signature.html | 108 +++++++++--------- ..._Plotting_Seasonality_and_Correlation.html | 20 ++-- articles/TK07_Time_Series_Data_Wrangling.html | 2 +- .../figure-html/unnamed-chunk-10-1.png | Bin 138363 -> 138329 bytes .../TK08_Automatic_Anomaly_Detection.html | 6 +- articles/TK09_Clustering.html | 2 +- .../TK00_Time_Series_Coercion.html | 2 +- .../TK01_Working_With_Time_Series_Index.html | 2 +- .../TK02_Time_Series_Date_Sequences.html | 2 +- ...recasting_Using_Time_Series_Signature.html | 22 ++-- ..._Plotting_Seasonality_and_Correlation.html | 20 ++-- .../TK07_Time_Series_Data_Wrangling.html | 2 +- .../figure-html/unnamed-chunk-10-1.png | Bin 138363 -> 138329 bytes .../TK08_Automatic_Anomaly_Detection.html | 6 +- articles/temp_archive/TK09_Clustering.html | 2 +- pkgdown.yml | 2 +- reference/Rplot004.png | Bin 30066 -> 30065 bytes reference/slidify_vec-4.png | Bin 92249 -> 92251 bytes reference/smooth_vec-3.png | Bin 92249 -> 92251 bytes reference/step_box_cox.html | 8 +- reference/step_diff.html | 26 ++--- reference/step_fourier.html | 18 +-- reference/step_holiday_signature.html | 46 ++++---- reference/step_log_interval.html | 8 +- reference/step_slidify_augment.html | 2 +- reference/step_timeseries_signature.html | 22 ++-- reference/step_ts_clean.html | 8 +- reference/step_ts_impute.html | 8 +- reference/step_ts_pad.html | 4 +- reference/tk_index.html | 20 ++-- reference/tk_ts.html | 38 +++--- reference/tk_xts.html | 30 ++--- reference/tk_zoo.html | 30 ++--- reference/tk_zooreg.html | 24 ++-- search.json | 2 +- 38 files changed, 249 insertions(+), 249 deletions(-) diff --git a/articles/TK00_Time_Series_Coercion.html b/articles/TK00_Time_Series_Coercion.html index 741b5c88..b752bf7c 100644 --- a/articles/TK00_Time_Series_Coercion.html +++ b/articles/TK00_Time_Series_Coercion.html @@ -149,7 +149,7 @@

Between ts, xts, zoo, and

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK00_Time_Series_Coercion.Rmd
TK00_Time_Series_Coercion.Rmd
diff --git a/articles/TK01_Working_With_Time_Series_Index.html b/articles/TK01_Working_With_Time_Series_Index.html index a95821f1..4ed92444 100644 --- a/articles/TK01_Working_With_Time_Series_Index.html +++ b/articles/TK01_Working_With_Time_Series_Index.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK01_Working_With_Time_Series_Index.Rmd
TK01_Working_With_Time_Series_Index.Rmd
diff --git a/articles/TK02_Time_Series_Date_Sequences.html b/articles/TK02_Time_Series_Date_Sequences.html index d7182fac..991c9934 100644 --- a/articles/TK02_Time_Series_Date_Sequences.html +++ b/articles/TK02_Time_Series_Date_Sequences.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK02_Time_Series_Date_Sequences.Rmd
TK02_Time_Series_Date_Sequences.Rmd
diff --git a/articles/TK03_Forecasting_Using_Time_Series_Signature.html b/articles/TK03_Forecasting_Using_Time_Series_Signature.html index 3acce9c5..9ad627b6 100644 --- a/articles/TK03_Forecasting_Using_Time_Series_Signature.html +++ b/articles/TK03_Forecasting_Using_Time_Series_Signature.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK03_Forecasting_Using_Time_Series_Signature.Rmd
TK03_Forecasting_Using_Time_Series_Signature.Rmd
@@ -494,23 +494,23 @@

Accuracy (Testing Set)calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive) -
- diff --git a/articles/TK05_Plotting_Seasonality_and_Correlation.html b/articles/TK05_Plotting_Seasonality_and_Correlation.html index f7671b14..4d92e3dd 100644 --- a/articles/TK05_Plotting_Seasonality_and_Correlation.html +++ b/articles/TK05_Plotting_Seasonality_and_Correlation.html @@ -196,8 +196,8 @@

Grouped ACF Diagnostics .lags = "7 days", # 7-Days of hourly lags .interactive = interactive )

-
- +
+
-
- +
+
-
- +
+

Grouped Seasonal Visualizations @@ -235,8 +235,8 @@

Grouped Seasonal Visualizationsm4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)

-
- +
+
@@ -250,8 +250,8 @@

STL Diagnostics .frequency = "auto", .trend = "auto", .feature_set = c("observed", "season", "trend", "remainder"), .interactive = interactive)

-
- +
+

Learning More diff --git a/articles/TK07_Time_Series_Data_Wrangling.html b/articles/TK07_Time_Series_Data_Wrangling.html index 8723067a..1b8ea9dc 100644 --- a/articles/TK07_Time_Series_Data_Wrangling.html +++ b/articles/TK07_Time_Series_Data_Wrangling.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK07_Time_Series_Data_Wrangling.Rmd
TK07_Time_Series_Data_Wrangling.Rmd
diff --git a/articles/TK07_Time_Series_Data_Wrangling_files/figure-html/unnamed-chunk-10-1.png b/articles/TK07_Time_Series_Data_Wrangling_files/figure-html/unnamed-chunk-10-1.png index 55b7ec830c7502ad42c74eebec22875a1fee1494..53e22ee657c382ab9f373c91fa557483cf18374a 100644 GIT binary patch literal 138329 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≫tKT>hwtL0*3MaKy=Z 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

Matt Dancho

-

2023-09-18

+

2023-09-19

Source:
vignettes/TK08_Automatic_Anomaly_Detection.Rmd
TK08_Automatic_Anomaly_Detection.Rmd
@@ -208,8 +208,8 @@

Anomaly Visualizationwalmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2) -
- +
+

Automatic Anomaly Detection diff --git a/articles/TK09_Clustering.html b/articles/TK09_Clustering.html index e104b388..f02b6347 100644 --- a/articles/TK09_Clustering.html +++ b/articles/TK09_Clustering.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/TK09_Clustering.Rmd
TK09_Clustering.Rmd
diff --git a/articles/temp_archive/TK00_Time_Series_Coercion.html b/articles/temp_archive/TK00_Time_Series_Coercion.html index cf146396..2fa6cf9a 100644 --- a/articles/temp_archive/TK00_Time_Series_Coercion.html +++ b/articles/temp_archive/TK00_Time_Series_Coercion.html @@ -149,7 +149,7 @@

Between ts, xts, zoo, and

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK00_Time_Series_Coercion.Rmd
TK00_Time_Series_Coercion.Rmd
diff --git a/articles/temp_archive/TK01_Working_With_Time_Series_Index.html b/articles/temp_archive/TK01_Working_With_Time_Series_Index.html index 8a64e71b..b5061d4d 100644 --- a/articles/temp_archive/TK01_Working_With_Time_Series_Index.html +++ b/articles/temp_archive/TK01_Working_With_Time_Series_Index.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK01_Working_With_Time_Series_Index.Rmd
TK01_Working_With_Time_Series_Index.Rmd
diff --git a/articles/temp_archive/TK02_Time_Series_Date_Sequences.html b/articles/temp_archive/TK02_Time_Series_Date_Sequences.html index de638424..1963f60e 100644 --- a/articles/temp_archive/TK02_Time_Series_Date_Sequences.html +++ b/articles/temp_archive/TK02_Time_Series_Date_Sequences.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK02_Time_Series_Date_Sequences.Rmd
TK02_Time_Series_Date_Sequences.Rmd
diff --git a/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html b/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html index f7e33c31..846141c3 100644 --- a/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html +++ b/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html @@ -149,7 +149,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.Rmd
TK03_Forecasting_Using_Time_Series_Signature.Rmd
@@ -225,8 +225,8 @@

Data
 bike_transactions_tbl %>%
   plot_time_series(date, value, .interactive = interactive)
-
- +
+

Train / Test @@ -255,8 +255,8 @@

Train / Testsplits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = interactive)

-
- +
+

Modeling @@ -476,8 +476,8 @@

Forecast (Testing Set)calibration_table %>% modeltime_forecast(actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)

-
- +
+

Accuracy (Testing Set) @@ -493,8 +493,8 @@

Accuracy (Testing Set)calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive)

-
- +
+
@@ -517,8 +517,8 @@

Refit and Forecast Forward modeltime_refit(bike_transactions_tbl) %>% modeltime_forecast(h = "12 months", actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)

-
- +
+
diff --git a/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html b/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html index 991432be..edd5d059 100644 --- a/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html +++ b/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html @@ -196,8 +196,8 @@

Grouped ACF Diagnostics .lags = "7 days", # 7-Days of hourly lags .interactive = interactive )

-
- +
+
-
- +
+
-
- +
+

Grouped Seasonal Visualizations @@ -235,8 +235,8 @@

Grouped Seasonal Visualizationsm4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)

-
- +
+
@@ -250,8 +250,8 @@

STL Diagnostics .frequency = "auto", .trend = "auto", .feature_set = c("observed", "season", "trend", "remainder"), .interactive = interactive)

-
- +
+

Learning More diff --git a/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html b/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html index 33329631..00159b6f 100644 --- a/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html +++ b/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK07_Time_Series_Data_Wrangling.Rmd
TK07_Time_Series_Data_Wrangling.Rmd
diff --git a/articles/temp_archive/TK07_Time_Series_Data_Wrangling_files/figure-html/unnamed-chunk-10-1.png b/articles/temp_archive/TK07_Time_Series_Data_Wrangling_files/figure-html/unnamed-chunk-10-1.png index 55b7ec830c7502ad42c74eebec22875a1fee1494..53e22ee657c382ab9f373c91fa557483cf18374a 100644 GIT binary patch literal 138329 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≫tKT>hwtL0*3MaKy=Z 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

Matt Dancho

-

2023-09-18

+

2023-09-19

Source:
vignettes/temp_archive/TK08_Automatic_Anomaly_Detection.Rmd
TK08_Automatic_Anomaly_Detection.Rmd
@@ -208,8 +208,8 @@

Anomaly Visualizationwalmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2) -
- +
+

Automatic Anomaly Detection diff --git a/articles/temp_archive/TK09_Clustering.html b/articles/temp_archive/TK09_Clustering.html index 36c6d99a..95e7bf43 100644 --- a/articles/temp_archive/TK09_Clustering.html +++ b/articles/temp_archive/TK09_Clustering.html @@ -147,7 +147,7 @@

Matt Dancho

-

2023-09-18

+

2023-09-19

Source: vignettes/temp_archive/TK09_Clustering.Rmd
TK09_Clustering.Rmd
diff --git a/pkgdown.yml b/pkgdown.yml index 5fa35b31..5b95e479 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -22,7 +22,7 @@ articles: TK07_Time_Series_Data_Wrangling: temp_archive/TK07_Time_Series_Data_Wrangling.html TK08_Automatic_Anomaly_Detection: temp_archive/TK08_Automatic_Anomaly_Detection.html TK09_Clustering: temp_archive/TK09_Clustering.html -last_built: 2023-09-18T14:46Z +last_built: 2023-09-19T17:49Z urls: reference: https://business-science.github.io/timetk/reference article: https://business-science.github.io/timetk/articles diff --git a/reference/Rplot004.png b/reference/Rplot004.png index b7bb7ac0947cf379526f25217356d7c59be4d589..30247fa80e8d8cff31a3b3994d0ad95e68bf3341 100644 GIT binary patch literal 30065 zcmbrmWmJ{j7d?7tq@+7UQd+vZ1WD-@Bn70q6cMCR0qGWyZt3ps?(Xio`|$q$_rtwo z+%MNL@C@;s=h@GWwdR_0uJc`4Q3f4_7zF}>pudroRE0obmY_e#h~PKgV-3;Z1<_bu zMiRV&Ki3kqzToAVovgMa1cHhU{ec;o_ql^WUO?VRimACJ?#;Wp;f_Ca9$!vab9euV z`uamuG*Uh==;fF6pcmk8zjRFmTs+jB`)>7OJ*+m2bb1$<^O5L~7s0q#nA==qqJE;{ z9@Ex~*Y{YiG(VCRTD~3bx_iwfCGk1ZqIx+DB=X5*(FcFQ6i24CimoYSeDM`iTrZf~ zF91_Ki2nr)6Zq#C%(Er=xufOQ>-)>a-5O$XWc%*p5C}PsEoq9+jitV3#zZIy4@SMg zU<|Wvu+3n9zf{pA4i3(0nPY#7NJ?H&!;JZQwCQxI>DIYNrOm7c<0g)HP)M91eDUml z$G*#?GnZA^?EW9~!Q{7b>{(M6)sCAE^UjmYcDy?|X5*(L@~p=vy{xAj37;mM)xTn< z4_r$@V%yEijt_kw6Mp|DB<8Ye3t?^0VoKFxA>c6UOO*=2{~8#`VLQj$XI6H3s-CAY zT%gPI<;$0U_ZPEo6ch@E%r|wbY{}q|FqkR}ii;zgnnY1hQ5n@^I^muRimIw&Z*Oml zs?aONu?M{QNvnQ!!>C%+=qmP{lsB@d;U@Tf>$mspasLi#c6mL{axNW1+FQ1UGoE2! z&{9%~nB2AJPck)70#|zd`nBNYoa5e9iT~W(9Li)#-J#u5(`T=XX>&9p_ODAz zMi+b2t?!hC0t|{|iY7-3^#vNhD2+FBx}1Nx8c=@C!DxKGwA>o_PD@MH!GXOqoQ#Tw zCSW*2##6+1ucQ-F5HplRbKFPhtP<7S;xZgitXuh8X(ZNAo#usO3lr zf1F^VRZ0$(%UTKJSvW#8mfF#paNWv1P59K%eS6rb@zIA zMqb5~Jvs@u+CY*(HZCqMJ?+mo-TnRbse7fujNOfo_lL&Ldvn!grQWv}4AJLDtQG1GrxSwRg(qjZ>jO~`_6v)-O?BiC=7SIQ$Pwl&8Iqyy^ zT&~~m_1s_xIUAIIcoQcwI-aM=I4F1;nochlP?+&@6Hh#7=V%w-PD2A>YLk1^CnHgKMaCL zSl>Q0q@1WoM;wM&Hm$cuF?(8JGaJL&a0TmEpj$Ok<%keJ0ni_$_7jAmRs0&3CYO~4qTCOYiSeuJGdtGTEoc%EXM!h=@i7I z_&&r%2;bziOsWh+_ni8*GwRd__F-^{41BIlNimRIYLhmTJ;MbK>u@rLgStPg9Mm3e z1P~Y;VQh8x_L}tkdPN^B4o>Bw@1u}QEg8L)Jw87Eic4+pT|Orco#GnU{!7pw@UaWq zA~|hxg?LUe6~Kz zyd#p(TYj@ zScHUKjSuIn+_rN;8hOm8Wg~MwxBFgTAk@^=Y1e2Bnx?BvF!CbcWlnhVeM8w0*BBl&ctv-Nh8YdfsRW6B5#TFkd^} z=qnPO9+{NXZxSKYF{&h@KRN!l{KkPy9Qlz3hKZq_BUj48f_{IdB10)fSny)X#96;U zE{}DR^6Qb|2mg%b`wZ|l4Ow(eDJ!{Bqf5E6^ex;j=Vf5 zmr%Evj$tIF($&{@_D0*PA|7n9lxR&&G(vdGiZ)6V+QRdA;Uo%T*r`0uWbQ>81<6^o|MLMHo z>a2c3&VV=2M>_JnzP@hj?390czKU++5=r zV6Q;d*o=}P&uxys4u?K=P{;uEECWPhxO`ur!3feUgh{&;KBQe$g6ov*X-EWFquEND zZiXT4;!aNGm)-^j1`2B3*-uZP_X{Na-aD`Jo$*9IM?}9bUtrVI(;*-b`MjnK{O=Aw zbnZ1J&kyDkwnwuGZttQs4c^b!I9t#C!>XMR@BRS$f|m9h02Mj~AJr{(Yha-}=nWd8 z|K<5Yy{F|!=J(6`ezVoCD5|y1&DFWu*a1q)1$;XUVj5 zbKcFH^iKAg_BSPKU6WOyKTDFp>3-EBHYw>I0khG6&l3%zIV4n?3Y=3Ax`-fP*Qu%D z>Q-$WE%|F=DhQZSxFsre3S(GtQL;9^O);pi>(t--?{U>Yl!e&wlICldeXBieAn_X; z6D%)ZDk-7VBjQc*N28AXFtO%re51gVW>}4V&)SHIiRssGme(tvgZaOkJ8llZ6n~s# zF=#jxHjr#r{!?bZs>I7DJ@}5%o$6GKTkwY7Y~lU(NUbbN4N51t(0o0KfAb6Gr|nn@ z?jIByDv7`(*_pib>5AEc_feUPCefwuJ=%QnsCx_il6O4UZJdxN;*!-cY=4Q#e@9Y1 zGb;;=f~2>%Nk_V5+70gUX3z?QA-ih>qG{+&gG2ka$$}Gh$!TDtE2_Vru{-VO0a$}njUn3g(WFxY8_(24{=JMX zp9B1AwC0TzL>?8ygf=M}X6CR$GoGpwIBrFDH#U&|5TO|hA9WD~cF0hXAwGroB$}%= z)4Wp3MTnTz2rP8Vstl(HcGuuYbhSXv(zMI!A$4~rz3s^eh{z}?FNK7X_N?*rYqq8z zQ!M8$PDHK?>{t17+}EFu`9F&s#caFQg*({357{)NjG zA>zX2ddyX`@y4Pe`Y=^NmL6rPZb`Wj*=YLwaeFYH^-SjKyldE<)1@_&n2e>*wCOm1=htTe zYmCi_z1FK4I+LW)08{B}rgH|TUs-eGM9T#<8#Ni1TxHhPq>o$KSL^Au8R}M#S#f#P zFR+^ZeH8-o+J$bN$cP1}MTJh|@A6b8{v?dRR+Y)|9Q*=}5S@Y!+r}$hThmv&wQR&; zbr&-qt*1)^ggh@IfBkA>u1d@Zd0_hKTOE_YMQm`tO*d2VQL}&_t-*yZ_Hd?U_xic! zwwvK2NtQ+)tD6te-4c26w2VZzkO;)^|D8C%Sk7+`TP!$@OSJB8VktrLHZn?G^d$hf z(#IG5DPwG2PO2=pmUv#;s;a8~=Cs5%^sWd!|LF8q`JSTMQP}+aXt{3J|FBf5g~(^l z2bGmVBwT>MW~6i1i9h9mWIe9z<}edg2gIj>Yfv-wP88^Vw;A&Dqk2p)GNlPD*A1fJ zKm=i4OG~R_aQLqRG0|Vy1)q&2srihj5-?rE8Nry=yW>-?rd=?d8yjnEVj^j3&bhWe ze^N^$aoEN=1rodKL5o$a=DYtEk+?voAKOT0;U^l2tqCKMut=bE2Bipp+_y}-E4%Lb zMgq8}pu#o4VY{C78BV*2P$QveJ=gb1Ao=xmzMf(27Sj7? zAZ_>pdAlhl!Mbd zv4VvESRkBm5q9eoN%vhKWqZFvz%rJGAy_t#-P%Mwj3H4AtjfXI{w;h!GUaA`4qkLy+ zx?2v$#$UWt&D;g`hxTWyHamxuYZ81Z`Kq_y6U;sWKu5#Kn5VI$k)K@Q zBMo2>K?SseZ}j!O*q_zhFLiKqeDluPysf^#OSvoE$a?g0I|h$eXQHPjaeUiO_0a&iFUc;o=blp z8yu5mm)a6ZY4*RC@3>8A?T+%sEr>d%2?*GxmYZZ%Lfq&6+4uc^o$L6`er-}WKboa|uYyuv-iSGo@y15&5f(&8 z0D{2&O3-J)2%{KWH~F-#BK-bnG{cSQ6oOW(Zju9r4Qqv?*$A+=b%}Q#PT0uZ|JH(dSh8Tttw))7bX_xz7kd9km0-| z8E^EH%WC<+9u*rKIBiXPSUKCp?-Ue0e0b7QzB={NaFxB|q<5Iodap5fVOnW4%^fmI zA@Gjz{0R%gG^I%dLZG{W^0`pk;pa&cD!(FP;Z_eb93f|h)tk%9149smt+ZWg{ln;1 zx>P>V^7Gep>>9*JMq-|voY2$LzW|7!-J*>+_0PL(r@jq7YZI(k*Tk+svB6^5xUR9h zg_ZFHk=*E-r|8tQ?F6U}2y$1KsP_sy>Pzw$FO0}p73TY}$CF6;Gut`6cxOaXGME|t z=oI1ur-_Rcr86Cb5C?=mNG3l%;(iD8)6&X-ikJx`~GOG=t@Y#|p!w;BC7W~QT5E#k1 z`btOmzMQA&K~V))g9Sa6=cD#=DGm{lwr;FF%+Kz&U_3@h9Zde{_HPkiVP(#pS&$kz z|9(zd+YongaVZ#6fF4A6OH0f0kCWl92mkzYEJuHj+7q~*cde8SVgPs-Nc0+(rLpe0 zlJD`e*_2Q1N5#dex=p&3iL^qloJu2MS<2QMxie<$adkyP=R@00Oa^s?eu(JAZX%!N zYq(fq^CmU|VpuFd=*i5^#vvo?uh7=cL?>%?olO9wqG6dP0ul+4z(h}Oi!Arz14`A* zepaQQ?}N6~s-F#EPC{qIfU6J06R@2S;hU`t<5?aMslk!&?(56{-@?2Q5J&)ZB&STo ziPVJ=Hg;lLd-ZQ#`x#4F?2DBq@(cp&#v)nN5&cybZ2r?0G=d{fB`B?*Iok-Ndy!VGo#vv8Hjg#O#XM za?5vz+)5B0+qtVR_X%7dI{?{KhpIY84UMV);Lmn7%Q2g8&UfYS=Js7O-sN7s&f?%% z)RGk!SAn=|Jd=C#2Ij>}@%MXF+|ndw!<+lhRn|8=dW)yk&`1eI;Rd2wXn&>7==!B` zCKr2yvcGOtkooc(I*CECFQCIfq5t#eyH#iC@d=XmGneaTZM-XO8`NhZh&4AW)tQa> zXiML~xp;Sd>VCUlRewm~nU87yD_E=7lHBKoU&Y6BdX%>bW|_s93mYC7?`ly=es$n9 z0p?@DW^*8k@nZTKq;=Y#-{($!N^)MYqX3Y^LYa(!{Ge!3^)KI zdT4y;%H>gM)%{ za;;#V>Vn4O*-wqp0*?;va=H$zH+$N`r9xtX11Mo6v5hM#fKgNaf^nkL>Iz5}N5Q)z zn1?H>ge!Ez(W&h=_v`iXzu84@i0_jIIhJKD-_pJ-a1wheQttf5txS)WnyqKbziSle zs8=VB!1CTpqNVV6o{SgEL6v3hAsZ5Wg()wbzwJ{<&j! zk#~wt#y?h@nci9Fe%fO_ub3j71PHPTr}0b#kWe08P*K78t*z}86zHl#7*UvJguV#0 zYz(JMwf}i*u@X1>VK+jObC`c)P8ZDq^4yIExX2X2$@UX$lW zzqvxP_{ji5PJgx(66Yiar~`_lz5%tFy?5*1!^3GgI8MKaY3Ww&{AQ;KQc6GQAk{b? zI)g8U6-0AFM6vz%`BLP{?_*JY%+Syf!}zJ{OK3HE1eeUR^%t=iuv6W1Db%lCeFr?T z@4|kWISC<0PaiW;o-E6I=XTT?b;K4}Nl$)E&yXR8Vmn8r5VqY7syrpff z8c{l|6dRDlD3KYX>X!2hP<|h9g>c|NO4!-iW%d43``b@zj+%=YJ!-T(I$05Qri2V1Gd^cBvV8Gl74Vx#d9-KYzbgi3mf zjo6pk{mu>LkJ2VaFzslLA}ZkvK|#_;NFf?D79PO?x)^LU@E~GhFc}sd^s9n1bCVH# zj%ag^O2Z|f#4PKUd?RdZNZUy5>F7g9X_{6;(!Eq-Ps4_37~K-adq9V%O_*zx`yhrJN=$sFBg`Ta@f*V~#@=#24_Vu0uE(SJ+6 zbo3q_)%QT`aET)I>t}UPd7m_dg98STH4wBk8U3;l^xUDF);{VTE&|}cK!Lr^;9b8k zU+cQ+P=t#6l?EDy0yer$hb;~VaMD_GYK^Q&xmd#p|D%IZof(fig$&T>IscZ6W z1AvKDv-&H-fTH)4K$5U5loOxKV+NFKo3{`QkQqb({Mfd+mV->PJh2uLAI!{30rCeJ z-b<&jcU?ShJbl!1&pSMJSuiVW9AR^>ofD4Dt>zR)#t6bCu5&__P$Ayb>w4wV) z1y1l%E9L%Fdk);lV{+@h7LZ4uH6fI9 z;&d&1U!^tArjuM3ws+;Rg=wKx4cF40N(cA^92AHFHV_gS8M#z1vq!|NKSNED47u3b ze702Wh<^8Q>j-~@^pWfF&tw7CLR42nBC_Nd+VwY3Ysr-B6u26g7R)QYz{J8@Cc{dK zkC)30-MYiNJ^C>BC-}-zUHmW!T@KskC-PdCd5Stn zxKhpAPNkrRY(ROwSv6n#3jRTN=+{1D@SjLFRh$3g1^A&?VTI@Cs;~&uTS%W7hq4DG zMFfR77A|VWJIQZ$e zqPg?$`%3c_Q+UatnhiFJwN93C-eceo7d8Kk*x;^+MAJ%|e%G8J`v#&JOBhAsr*h+3sJg|JeNQ8J%lgsdJ}ZU&kUKkO{$Omh*O* z97RBvg7I3p??3B9$y5oX)PrIA&Gwm`7Dt(rqT=ZJ6Q?s?4vJWitg8{OSX@Z4ut>VP z`2vS6G9>~r<{Srwrr64oy6bvw+w2Kajxc&v9C4&jiQtitVu_nJtNcvV8Gcm7Sqi7) zq=|YO4Z%Gho5(_;fS%AGE047(nX8L-0!wkskc&zxb_Wtr0s|csu3a~ad+7z^E75i| zezxaZQw>6tl$553#X1Gjre(*0^8-Gk>Uu8vobG-^b(>fZQcuTlNiHNnMy+V%jy>QT zIuEQb!s_+Mb$p@QUFl^yVG{@?3`}VKG9qw2NP>L%-PAJ$ZlU_8UUaa3d}X=y^beic;=t$O2rns_)L*VYRO4pc^XZTZG61A;dgBO8l+U!QO|h zp)^5I;y7)OAV4yPyMUAu6drydOzX6n&c6qm{7nb2U$TK0O)>uWhL-imucgbYYn#tjLyDEib$eAY0=$J6@)Gq zW@9Wz&4ACHx~G{Z>m>k~Tl^0jg1x0Pcc_uYqN4Nur;< z-&Nmw>NE`x50`&Bq~_6V|GrfSpCb4MI&p(X48h_`31L5VN4o8K(rjikAe`1ykw8}% zuOgtf3WGuzCL>?9T#5CD^^ z+8l(%&COpVJzGk%>X#)C_limFwUH>{$BC_Hg5L2FT&;YL(h{c|+1&#JX24E_i;wTo zi}N6J!vZMDU?zOj*9_=L>icfT0hDC|3lpdU~!KmTL#Oyz)IzRnl(Y>=Hbe!xeY8YDD3Z_ZJJtj1SXmYZS z=1&`y>j1qLF%?9Ne7$Pbjn5ZPI+cnP!2O|j_~jvrc`n*X{MGKu-`_$Wjw1vQFQ z+16_2d7Y(Z1q;kAuWv+B5Q^t*%|YFUMlMJQaLHcTVZ&`W@ZuZ+3r-rnT<$E$E-APh z40m2G$lgW0jJ}&FZbz0>2!ul)%sr~Mxoutoz2Q*EL-V*0@qli#_A5K#QH zfaKj?X>MlrBRP41XVJ@l*kWz1`zMVp5VL)M)(VIJnfZy9IMdC8K#WE@R)aiK+Ftv{ z@rH9_%i_>e3F29k9`JZ_{UX1SHN^Sm%(AfY!2=Y?(8}if_wSODl6u7j+GUL!T=ziN z2YiNP(WGN1nd?=i0YfwjkX?o?&fd5?OFhA*yP8Qb%^4bb_Ybu>&oh*`h|!6|Iu09A z3p8};CL`ThVk*OMo}s+SanVk0oLxjhJn`*~Nps(MrG|iz^X{EJx6RIdGBKwGMD)Xl zHL2_R@p0E>d8>+8o91kUfRxhWBpxtu##1rrz_hzysz${(8t9c!!9_tq zsl##mr&kzq;+dCs*b?i+PX?ydTx4-XXGA#cve_T0%wb*b;NL0+Af6!>phj4oz4nzn#$5n{vG{>DHGa0h$oc#RgH8PfOSH zY00-uEsfW%GWEbg7&R)B&$&)*OA(l+kw=524AYZBl|1+fCgcVRJXKid-B!a$`JHk) zdVDvd2Q9lS%Y}VNx9+gYUcGwd2XE&Mr3`Xhfx8dDs`mi4ak+%A`NK%shx++JQer$G zZW>6qtzR%Rqvwt9TvCO!2Yh&qNGVzGxY0+HdN!OrZptmtwUSc)0TZ#6IwgjT@M==X zG+IsySXZ6_irr?mQdlS=$Mb|S8Z&+2Sg_$YsM4v{2OpOpVco{Bbb%X6nECb&MkCqQ zyli@JGJ-t#2Q(1vB*kMa;Ut`XHz&DOW+OxcZ;Jm|c-)|otM>aXEyQJSYI*cDs0LcT zL?&*tV?oa-;Rw49WzeI zNKd%YE5>tv2gMdFcGG$E(}3)GNeLYsx2xSb=KTs>1QsDwKYnPH7$ZCvxnonl;iv>6 zCD+FZ$PkF`5N_+CVa^G$429k+Ub^g#+5ia&2}|J7g4BCn77japula9(fHTp7L&wHr z+49DAb89%(oj|Bcmr2lm(R<-u?jsBx4UN0ZTLDsxL`An{1S*NzJK37yuH>^b9m{B1 zYHA1@fO;dNqaW|Q(p{dmG@g`-9e)yG1O;8HJOMWL1{~G*hW7&1HZw;slVGFBu!Ssv&h6fCAh{$?nF@cpL9qO8V+Y|lGA*}K4#?vB}L>_#GUJrc4VSmP0 zpk*Wg$ZOt@_m>{T(w|nyjpACxfJM`4(^#?|S_0;10#l-pUqQ{sE1OU7jvH$*Y-XX+ z3p~|V5$mRf&z_0pjmHo-bw*HR12?g6!^hrce;q{JJ|rX0)^A+GNag=Hp~~_Oa3D4d zHC5RU+RfUyh>JhOAMYG^lIBm&2OY#34p~)Xxroux(ShQA5U{GsdBU5^B$Y>J%{Ft- ze+l`ph?dGn^NvmLA0f&@km z>5p|oSf{_gHWDyUO?H?9S{%B&4D2`8ihuYz(Drt5P2xV+swcNSi0=trG#QE>LAXzO zybIil#4JqW{Ql@2FR!+QsNr=doU*xb0xI|;U^JST$O`g+`nFVx)((_bDb31^#8_Zp z2wVskojwtkmC871EB2z+qyn!M)Zdr=6<&3`#LJ9WNpz3@M>qu?pr`=tgM*2wtQ-4s zhY!G1$@)^WwBU=shTAh0YcLxA2X-fR5oCLOw-lt|D4|EBQ z%_PTOj*RL?{T%&O?Rff|zlyGChy49$45Y?|8D*)sm`yQ}R}2I|1x-Uek*)KybuM0Pz?QFm7?* zo+a~?8Z-a=?e0~N+L%GX)5_h7ozhyl+&8&PapXtpi)$6VH7?v@3y2UIkh$M%3{NgJ z2gH-%)7VkJf7hAWiYUfK0!rEXfiE{xXf&0~iJbvCmgvIcJq4rfp298$5;EG|?lFy0 zujax3{lUP?T1)fk=7^@uH$Qvk4fDnw(zQ84SqMlz+ca$yvjKfDcz^Sm0YF-}av}2Z zPkWEIgeK(QQdyg!Gae`^SzUdBiDrI(qdExL2ZkKRWpB>CSxzPy-_C|vgr0>ATI@Hj zIaE*8xtCqu4`&d+q#A(+f`IVL{BPxI8OyJin2K#?xocbx4XhheQ(pj^=2bGdQ44DU zu&>YB)}s66GvU=L$zYLtrBCrUm>$Cy&p%9lL4W`LJ*eS|r+kug=}e!AFMs^+R?ifH z_m?VSixBf3X~&N$+7?E)K;y6ym|gXYQ^0ZYRe;w3g0%+xCcv9}Cl!TV1a3MWG6n2*w^Q{E-r=6$@B%$970t*Kx zKd*GZ8A^)X)G`U(KR(^dc1CQ3T|%~*&drBt-My{WCBKONY>rx00JA$pZL6UKXd+Jw zennF|uLw?Nmm(^qviC2Tss)r^^YKC{8hKg3LI9dGN=ttpMvC`LjebX!g`Pg==t2A{ z{;nHG9QugO_PUPAx03~W+)ST=9ZT(R0x)bx#l^jH6b#{~@@5c6PLWqqYBbUoF=XuG zTvp|rNH^RhM1 zsjmA&%eIpo1Y8s3ilb`Kf8b|)%Jg`D3bKLvE@^ePz-YsC2?NC^_Be?42eGjvR9Id? z!NjGdCH6n!0%PlX^BJ(Oj@I*Gc*N}@RVs&D`iA4RJTN1d1m5;@A#jj=% zd{0Wt%Ib>$g>fH+BUXDjBcUSvql=vc^?{;x)`5GSbojSQ4$QtUzQH6taM?r9$;J&+q;X5dNW1^fMe%UC0Zy_HPvVTcjv~XP(ID=midZ$={@$byvmJ)Z<_TT@UmM zYjzl{HLre9;&F<%P z1Pq2zgv6u*;}dzrgOKZQ)!ztHoG9cWAvLNS$lpK~{gIg12VAv8!1qO`n79HywO9d2gk3Rq8+&`~&fxWr-FtGIEY` zbujEA^Z2RCLS9{TQkNLT_~a-av!o4U8G_eZ7uHPGCy<7IyC!V<00!w-8!#jSdu57Q zzuR5?rCrv&f8j2jw`88FW#vH z*QlC7L;%4COr)&sx=Nnwj88gMNhf3xbLjjp4(UQlx$Ngj+oVf0x&C$W3uE z@$l3^Yfx#TAkjeCVCCBI9i43LDmU8ar?w;E+)uy`t<-~+UfP4U1SAY-ua#i?fZj@S$tC9OMM7UNbOn$}+7B4cW=LNoO1UWJ(Ov95; z!see_Kerpdn&8k>Z@j-C0cA|S3!k`}R2+;K@C^Y>zwX@#oQsIh$@NyFvBk&oLBGzJ z)--^49?WwxAuadTA|%g4p*%0>FF2YqQRr5mVT;Uj=cj_BU&#AIFZZgEoicQgH)qCu~ zXI9_IqE)=~#hw-c0fk}awg2KZmKNw61M1ihqWrImj2wQeD=Sd_3YY`TKmr5&=eIu! z2@@LgP>ErxBpm?_7&g6B7shhm5rKX=NCJ0GoU0py()rDg#{?s(Y{r^N-Mgr?=_YIP zA>Y<8qDhs=`0e|(zBmqu^?c2E?S8~Le*BNNnim3(*N(cT6o%L<#%g8|&x31FT}FNV z3J-ia!Rcer`_U-l222|ICgtSNAC~$?NB#N*4`g6(KCdggirrOhxA)CoAP;=(K?F{N zqbCa^6wEciVfOEIp!Mw996kmAEIT(lY&bRnvkJl8AMFutO3D51uCAqmss-4;+~3=P3kb?Pl$4a* zfsQLDAZE#(clGo@dqL>f*|CR!`w^zkoDg;O`4H>cjcSB$o!fCr(VU*=0iFiSVUr)s z;7K>#^}_fBaeLd5bCJQ?(KB=jmtslx2*X9K!Pf5Xa?nLcPKJFho;7h&s>Q@k8Hnk; z2j+NTQoZ`Q$Jv$&?c3i?|Lj+rLK-69j*QgKj^wQ+v#SkPkJ^yBgd4DE1|cul@F21cK9#wlX5p=~05ymt1Q3+)t=o z=bbfeCRLE_$p_!Q1J#fmOkzTUyrd*NI!LYiE(D%q#p%F}4=p?)X=t1H=Sqp;^ljsH z?pd(B^z=ayu&~9UL=t7O9j~?HME@}SC>Q7)@>Z2dwa9Jy`t_^aq)JeTew_XgD5hY8 z5xw=i&&SKH#^uO$2-3sj`pp2H1ii)cH z%27Ntm|w(Cq)E0k19hK#R~9585Trm0oM$g<#IOZ52ggquMonWfj&BHXh{X*+b{3bA z0Oy7cv^$2Q)nK2i#=(#h69-6H#Arf&$|?v(-ND##y+Rqxb% zB=b#XW~N#$>Wo?0vO{&9ej5O!?X)d97DRyWn`jaq-_`RD`$=1`3&RGwQ_&D50^mkD zlGY@i3rXte#8+8I08`ijFm1|>D%&kzC_n=JQg{Z*%E-Q&X7P&2f^p`_?%%-gJrB3<&PJ7> zP=G~Uz-12-tP_}puu5R)rIN*BvAI3E=UDqptATWOsaY~RvzWl`GA)ph&8P|CHbv0= zEUo}GiKnM4a0e=+q+cn50;mX!?Dj%W0Nqw24)8IFpA4!44oN&^yXhg~|`CNd+3a`x{BZ-uzV* zd@UYH;f%4&a7${kxTn(ft!0c89B_e`Q=r4M1Zer7A+=BB@mguY=ho)X9PstCOk{3C z7wF$2>W&Ef%z=|Y4!G3Ai0v=-v{RT$UwjpzFGC>3!I6-ZY(sc_M(G8}SD<(!Gyx!e zWjW4}4g;4ux(y&TBd|c2-<)kP+zajQ$BZM`lxSIu{y~5D=PgXrvR$OGDFY*Z<%h4H z&+l&oK`57zrJdoPY{V1Sz{PMw8wctZ@;>WJ8E~pnAw0(h&My*OF zzs;2A#s-r-+c8z~x~)rx?@oXiSKT9mG>H8bG>H~D5Q$$U$e~**Dk#vfu@&Eu1z@f- zFfpyA1(L(6oh{LHXib#8N`){+Q3u$3m{DgvLjP#lhhl`b+KI&BT@!tE<)$VIS4E=v z3N^zGmKU^OPnW@6TPQjntf`Pr0kbZB3;N|$?+rC3JumrW^FW`%-%>&eHhwOxX`G33s z{7Gjv{QhLw2h=*=c-bf+$@kv-6-Eu$_VCPK%*!g4UTv)YQHbazJQ`jV%&1R5EGc0s zp5?RPZVkdB_@%FLB+>}{Idj}Ux#I7Zvf6ek|Yri8i}5UU8r?s1)2~wEv>`V(R)xzOMwjcG0#?f zOcxy3M1JRBmbuo2pAy$MkKB=aa@0&rp}!+ob~-s`p^Z&2@LWLx+iNrTq}_zaO0IORSnxFzkAIvm@|qc~EeCkKF8j1WrOsxC-v$L?I0~ccp=k;>+gz83?e_ zM?c_1%`h@DX6VEnj{9D8;8mRyCQfM5bVYC5*|x@>3tXN?dkNLOzOXZ~Jp^ev;TO#fFi5K56Cy3faz9Hr0rm8c~y! zl+?nb0BN|~V{~+M6p%8{Ck+jY0)pX#L1ZZbr2+%!6`wZE*R74gPR{0fT#Aar&!2ci zuh$xHBEd7E()2>?H{-Ckw`Hk!Lh(neZ#Uw1%~`w&t`jxpBnDl;Fup9|1Rn_Wov@T2#+rtcq5+dD zQuGkEc_2sqvv7?))S&*L;LH)6^UgaxhGapuxVNBR1lpbL=El3c+|HzPW}e?P*!0g= zPb`~GWT|m9;Z&|ey>D+ez|)6mQ3f2i`df5#^z(=55A5I@De8QS+?f6Xq$|2UxClI3 zTjP1LuG$jD+zD_Gi|^Xa1qj2bh9a6RIBz&v!+Crn^@j^&EF;i3gr#fT~PE3lCwKG;n=%gXpuH#~tPO&i>lHE0Pj4RQy(Yyhc%aJhgqW z_D-w~etwjK$_l@f5h487>Djd;@P%YZM@Ka1y_WVI{i6`aZKIPlD~(q$3z)A&d6w$T zj`NSHWKlQoY*4StM-@%LP7fvG_!dPa^CK#%c{@ABz_8*wd}6TtKfFm4!L__nydwP3ZcNF=RUvGJ z^~_B%8^^yHxD2RcVH)kx+f6Cpk{OVud9}e;anMyHHyas&+wU;F!iM}sH_9IE2H&mG zv@@Q^I6oQB?`)MsK#Ls&v?OpeB!5L8lczZ?p#)#!fNg+A%(?aJ@^-TEAzHi4?08g3 zT`9+oGoVP;D2Lk*eErIM02*7t7eBOvZU;9I7kM`m9e1F!2t?7>3H_X)u~eEP+V}#K zB4r>Lj|4awUYm5-fxY#Sn?34<>b}qtXiVquIJ0<5ivyHg&?CEOda~AiuAb2K41kE- z9&^q6cF+M-qGk7KZoqie0yyQ2`r|3Q|F6!zIxMR2TXz5fX$O!F8Bjq=0SPIUp(F)G zT0laiyGv0(5JXCpQc47Aq(kZMMrwdjX=xC+YdpW_+~?lE&U5(7XWX;*p1r?secyW5 z`@XAqy{%0N_F~u=zp&8L`^*iZ?zZyTif;g^Fc0xZzogr!inAyU zEps{iwOPf*hr0iHm)aHZ7d%g3y;T4*MM6e~0lrpl!guuNn3$Ns3kJ_DEG)>~D)*fp z(Ht6S9>2~<4OGBoBt7Ca=5QJhA@jC#u%1AAQGol>78HGpeGi-wkS-n@cAo+*nXP!- z^Aol^NwV$Efl@aL)q3OC_-hfOJQ1$*!e{VyM1@D&9VcwjlJEaC=8sH`X7|l3hAI*0 ztV)|izp&ijn8P`S#N9BiJv}+{&-)}Kr$DsFY`j#=o3#D={?fWLIs;D|p>p#8d^z?Z zeP+7Xi@hU6S^PS;a&MYC-~kFnk%X^{9|`N^@Fy*|UkRxgYs(3Zqun6Mhb5syRD^|R zSW4Q5E*LaOj1yU&_!1t^V-Konkt7IG6A}iw7vy*y*eN%0mL_?0p~*LV)k}ldv=N7m z7|zJPL{~nm{9O+o6g7gjf%>YbEjN45X6aLWqWV9idh+r~$CC~fh5}!0$G?N;&#{hy zdSrC3nA?ToZ5cYgBiZ_44pfjF9v>d|qKSqcqu}0}+7yjO9|eQR<8xv^Tw`XQ=vVZ8 zA2+pWH)qF1WCKI|I!>;d%+&H2D>Ah@ zVclbkl;DA1z+LXP+!A%ys@Qf*skm66$-k3-YQ>!fztnboK=8U+GLwR{ilkUVomy^5 z@2(03irN$RQ@lm&I)p2|rmPc53|sbQX4>m2QYs=8v;v`GR0#J-NL4Jp5g$A`KMH$gEC{zod{_oF2C zqxI`|E;ir7x1e}%IavJRxl)9xE0ww3yE@r^y7K^%r{6UxKx{ZZ$v!vjBN$8eF~E#S zlbqqzp;A~|dw=zYAhhR61j6ZziP4FDxV; z8wIw7l}b1VuNzQsT%s~Fi=>$KS?4$1XrN`gsu=VBy+L-Frxe@EmoF1{);$jsb&Bfl zi+B3$W()@r_-;1SZ$q3^pLvLW8scx1KqQ#;DO8Mf9mW6UH{iNu}d z(Ltc#q}CUNo)Iex%={*)Ig~sUKN%YC!tRkwCMbZh!8E^(V#$eN0{Hh@*Kx2HZ;zRt zlC1r^p{JU;aU60l3T?-QU_}33@RR5A3M+C(mot{O=NePZ^Yv4mZjJFJGG!pUplFO z@qz%h@$Xhaz>YNqk$$1+u+;RD=^X~}Nm#AzRITrA%J}zX7#28EfF!opN?JP1+D3Bj zFvht2+A}A#1%t1?B7V7ZBft% zi_XZRZ5S|#qosd@L3RE09hh`g?l8BqpVY5i2S|B;a^^%~^V_q(2bP?*UU6gYPEAcs zEG7ByMfEtiWxk_G+vz1ispBW%G1FOIQ|h9VRr8KXhkmmMTUdgt%kPeK7gxIV2b(a) zX71Hdr;lSpmE3R_v^(K>6Pe|z5Fv5kQ?)eaTlL%)tfC^56U0C|mO<1t29Rv|4|nDx ze>)AAUMgL_Rw})+K>3Ax@Mdpyw6~j1Tj{xq6@2b@CsccP^#{&?Bq2_)-cZka9Dshn zBNfXgC6m>09&V|?8cJ^Yz@V#?tMetY+8>rkn|rCDN`x>4#X&p^&_m+w!#7IZ_~OE% z@#<@=!Br!h+k+~gor%J^JRzYrNN89sWq-f%U|I)`|MD363xLCe9Xdg{3;f( zLIEPKvZbZewZ%lN%2;i{`2RQs+E%W?gzbXTmR5^qH?U1#E=`y$YPf2F3|*r-IL;pO-v-Y z3DA7<4Y&D^;R5pj8*kemt-a^Sh|k%s=kb61a98!fb!`5fqOA%m#ZIKp9)NX67P!fyH&sprnm}gB^ zL@Sf;SH*Td$V)T&@G2q#8T{O$*zB%@_uBruIBasrb=3D(MJ|-qb(k&;78V;5Hgi(c zN2p~Q>L+D_;muDQ=VrxbpT=L)tqgMb`E8YWdJ!WnR`eseH=n}F$?ko?#zi(df`|Ef z&-y<_1;ZYV;`#-OmY(EGs+SmaxA}!*CWoFp1UCM3kIoSlOGC4<2~w`Wuq}JW2<_5n zE@QpL<2UlRZLnb`XnrP}gBF=Xb?EkxDWdy*x9hsG!r%&Dq=>avuAd$s-Fjb)Ktecp zT?&DV(BaM``c8+g^T(7&&9&)_-n-*}DLyeIY4MvNa|92+MiXJCeP%dCZ6$T8le^m5 z^jDXE(p_x;^c=Un2C~n>!UBkgg0AyL>=09#$vi2H0*}N>opoN6b1`j$RzYM+ga1gL zUXuUeFGOrSlcRVKHt);ecydw%mR8c_{-?)ytxZjZPlm4m**EY{J8sni7sG6**Mo_m zXM&MyzkJQccd|0?hyNA6y|-Y?`{v!dmz|6FvyhUS_NGWfQvB+@10}~hzO}Xkv6B2+ zx|sHRxqGA(6q%)^wC}rhepOBbH3~{9VWFXE?du7ZpaLgqfFEG9lY&BB|Ddj`}PC>(}>iuv9U#h|0nP& znVHFM0;6-h%qD?o_FS}gCSBpsdth8395&)(WB=AI*mwO6`9NEoqf7$;wuXL#ra#Z& zPYJ)6fK($MAYFh3C{6=^z7D0e4qF3na5fBsdXRlN!Fh~md1C_u-L*iW+2uAR>L2z{ za``fyi*n^W?Mux4vCe5E!9wYP7!_TSN2@=_*Zr*qBmyAY0ah->MzuC&c%!8t!()V& zvLrfS`?tLAEj$t#TfB!(&FAme`EShLa%d|DFiL0rBFgy+ye>gVYM`KF06z7V1a@&pL?GZ={eNh)q+#Uo z{~(C>22P7Ipg>SVE!8h0ZKc?AsXeghscdUbEp$Ot?9Ycof(d)(BlDXPu+FmWX}Rm^ zF(TmBtIqJF{6D}W4F4~}w}N&_qRi>BY|kq_mH5>MCx@d#bo@_Y3t(D4Sv0u{O!7O= z9_>%`%AT%Jm>`h>cM&SdTb@!8?6N8FU=^~nx5Nf#3cm(UM{D%u3>uCUJk$U`Hy~`n zGn$h58GJwaWlA3kb&{ddr-g;#Hx5>nB;(_ylXp7;UMe`B9LV_lldvZmb4d-w$Co$Yt$2D27|)JT796Sthj#Y#EG2!lJ6Kq@ zY`VdaV+_m&nZ;EX7Z=8qKjB19unfy)uDUoob5Bktu9JDY41(Lm>AeWz zV?|I>BcSf9&8vgvy2%~57!0*vO2<2_=`fyn>G4XgdUOEb3_XcZWYo07r4{S-v?C;f|8ZBC2e$&#^ zHq6CuKS{o?I2;yw<`V9TPEJK06>YH8)+tQ78<(VLgey3%rA`dVTcc2TurgeZO-R5d z3&UosL}7AGdHsd-P{+o#{3>oWG?z&ZO?;9jfPz4^wgM0c0@l#u$yLH^C-3T=x2o6? zH77X99e$I|;>lI;_RAQs0r>Fy_uKD8?K;4Nvkg{Jo6=raMTd#<(PM~jvRa7nQNXTn z);VLP)-+)4$&G-l4=^eeCnt`Z_DUa!R79fH>gh&N-*0@@MRPe0dm$!Q-Ju??q@wa@ z=+oWlQLstU2I5lt_OHQB&uz~;a=^etyuIOe1yni$V6~h1DJ?LBkM3hjlvTsgx(gR4 zCZl(B4=k#BEKw7RBNpRu*Ez=e4Z!5G0O!lDch||dQ&}%VmHG59Ru)u&keH_&a?7cw zeSC&9A4KRLt!#-Gc)b+uQQ@|kjQlC>^VXs~rrK?pWG^noe*PrnoluYXd6x{>3@=3e z&ZHRuC4Zu@73HX*3k6sQ;1+6tn$Cj$E)b6ZSCDLPZ=c?QG3`{@;nRKiM8E3g@tH#r z5748e_v>DMKmmNS(>^os$FQ;j9k7 zi)F4`PIKpsxs5yII^&(zD&u@^5qDOe-F_4}D;{YgPINXBbN0m}#0;AvL`XpCT5F6Q zqBt1Ii2x}E6c)&6MUHc~Z@90tf%8m_cHjNCP*2um6H+YicmmF*uski793O-aKLISw zyWrgZ06+o~m*kqPVs-X+j5xpQ$-L|}vI6i*=M2d=C z^i3SAoO7$8j7mt6V&pyjURzOi51|(~soB`nA)MU|7za)yz`W|#Z~I?x!4v!V5fzYd zmlxy!VEaQ#Mo>Lyb~Py+{td&}Z~PLt;ghp0 z=sIslEroDLhT~tja^jvXjHDHkm^6o(#x5n<@JwIz?3!!9YT4-EEx2m>{S2@wipI&McJ7_g z@OUTp_2N^|DnY51U6wsDRH>0>%%h_@8y1i-!_wz=u9(mD+h;n~TiJgEnSc>2h&Z^t zH_zD^QURcb#o^RPz8kWqjOyj~78#XR#l7Y?>@V{pqg&MR_--DAK0p!@=6MQ6mH3=L z$9SKuDmuV3m|IBb4FHWPa(tH}gy{TrWR&F~_=vs_VieAk+C(E2))p9txy>w9CHU{V8z&v;smmVA5WRoJ)88-S_rd_pHO3wI98#t~Jw_gz`~(s{ zN?x7i9|?iUqQ58#A)?g&$2%*k^*PB#)*2Qk;bbZS&cEvc+50Iz+}u1IJUltmk+;xX zeQ=VGwLV_ak>-pvN^1NB9qd`eXUWKNoteR_3C4V@P{^}VQ9E%PjKW8U8swx!g46Pw zi?9S@?0HeB9dYV-5yKBNe!WIndkk*rcrYyPWkW>}aav7l6bD5r{8`({_|kpPwVEw; z=Z=p3m6=nbNcL$c>mcY%8b4p%?TbI?{p+w_0mL?)Jl$JnX7f(vxo2k=7R)WX-hT5a zpZbmi)qwvBHH*uZB`02xltc;KB9mSFjUN4UaeBnzd2DR#6Wn)PdL&wpCLnQ#${0Ps zw3~h(P^epIys0)XsSUdkiBjeL%9cq{n~?|*`uP~N0~r)(cyS>2+pkhZMyI7C>=)?# zOtYFSGVe!qX;0K?XRCuh_a9J?dl@tVm2%G_3{I$wHx(+8yfG_HmqK+cyd=P??j;MU z$CUT-7oa#IS}7m$0HUph5Hnj>JD^Md@|ti{wlCePSAV?#3I&L`OAhCd(Vuw&nTv9I z{guW1=eD|3*B3Dp;>&p@zM65NN(1D}Ul0h|Ra}n%Od7(z$?Q9Ef8>2od0{9e^k_zn zJXnE|xO>Y2b`%`9ZP!%X?vqOcWm>Ld5Sg;ryi6Ggp3+wf}W{)0@XvGMbq zHbDSH@S#v{a`2TeMl^~n<9QZ>feK%!kvUeRvkIR|OJn;Is~WO*bot^o<0r~z)c z%MYB2wzN(}qti$^Gw0&^P9)Mg7S7w3Md7aRc&>9yM8EX$9ANHfCZO+dmfCr-8BrKG zUcNK{ru_f+B+|TgBIUNk&w{{FJ`!-cqiQZ>w1OhMo7l0bzonV1&2t7pe@r=Z-)}uY zqkq3hk+wEpt6aH2vUZ#?eSUpi3(kMNERZ?c3A47?`NgQxWL9;}Yu5hX6+XdjhT-PI zqLr7cndGCBYtv9L2o>>$pEVCbA&c+uw%UZ>sSkG{5#jQ)U~$del?= zio1^DCaV*~UT-GH9!;;{e$N>~$MizqO2S-@RG+uqS)pff*FtdzGCwb;V8*b%1C@_v- zm81(yFeb&;mH1!iEKUrT@x!G|E^a6kKIv>4?5SD-F6H6oUdWESG_YIyO^k>DhU$rc z8XE1Nji405dHG?jQWKwZ&Zy_ckE@nU0-m(}2!?~R2%+Qa@d_tSpnGA!2>8)r5{2uo z?V@*i%(i)sn37if&6FQLU^GpwSCp27AGIwgHdL zXXP3o2sg)U3Y;2-*$foLmPZS+!C&Cti6TEDC{f|`f<$Sc!(#{-Z=ilrxZZ|>wGMXI zA*s1E$mn#Qz-LOZtwoTKknkBN1P+>8jOOzgI=5d0`*_(0mr*E1Z3HnAgnKv5^cchc z91WgM)dq%xOXQFG=V763*JvAVHQARBLf-`M^&cwUD|$)7+<1YoH$18oLLv`12_4Tt znuBvF=%kV@tj#0H$(dsjcMOEkb670`M-adfkW6vh;5vgXmn{~nCt`OX4e0=N=epPVQzc+nPE+Oq% z8}uWvek58l-Tz9!sN+AM!{IYlFEaXt8XgN56i`_MyGLX)T-}eVfzly?2k({P z`V-pn?98HX#$_i$t0nVPnt9)*?a@Ah;&J6>;69IWNTKy?L z184=Mw)^D3(|u+pGpV@Pj;HjjL{~#@-hUr4R%l9q040fk{=!h4d3lz>ijMRtFN*pC zlLZ3TUjrOKW{&nC+!AOS8m<()d9vzgs;GaFZPSAh?%)j^6#$NYIMeNrbl;iG6)Unxn%)UaoErdqnYmhsw;vNT= zrbq`u2ABsx%CP|FZ#Zi-DEW~9Kr}>i26-@gV7xh{$IyDJ!SyOg08ECs3HJLqm?5WI zV7<{)etJmnu)E$%_0SjZroVq(YHn^NRaRo<+X6=gg+nO+AtjV81L!qV{SW?J@R+em z`}Ff%h|I$-ZNjMj#9?&l;~=+vN1`%oIcQx`-nryZ%WtVR)n)bLlArorOYdMMM>jf!%}xbk(s=JO8mlHgopF`o69`MSf3Mt ztqi*v`>b3qNj(mZCwSqZXI?9uZvcjnp#Qop;W_YQ0VD_SDwF97E19?%|HAGA@8|@B zI(67Dvay$i0+|UA_iT;b`=&lsL4)!2ty95g0B=X*E2ST{Ov6|Kj_nbg+wJ`44hoaRO0zI+mC>3xV61J+I#s3pPTpDjK6Syj=X@ZqQaH`J`rSp zKu}n$+3Lx4_5zu=(_JOH2b*U5jZ==vBtIYK3?Bk99kO<@DgiQ@t zW0lUmbcN`Mn{T`Ob#!O^^Vbt11R7>4Q}*Th4Ui6I-1U0|#tg}Md3hLta$P<{|AR$U zPzRqP#L#t}e0yqnCri}+2iq55ra|EYvC+mE#o{3gc49zdxO?y3yPyO~b-XaZ0gjlhli>qTbGq$yrY zjG+4K0n@;C4B5OsC1!>{WuZF}E7bX>VPXc0l$iik;#)}%0R#+%4^UH%Ag5VQSkD$L z-2IjPs|NP7^?Pg@(mO*uvh$@D;bHkk9aq_8R_ySW0mD(6?GxK|0#N%L9i0NssR`~5 zQYJ&U`vx*cRl&(tl$fAmw;DGOTCoUHY`-F>UX@73z`Ylis=mkTQiqr6oz-WQ@@uk~ zLnx}nx0m!S5f(I;uDW%^YNz;FFY5^ZFt7~j59Jh4uT6sy9f7~k1q$5~za#fc>PbqS z@%EMhT1|fC`ROhvT89CrBGFl9_H`2POh*;^das5Cp!Ytcn-bU?V{SKY+4@-!S-x}b z98|0Pvr(Vu-s`>gRd=6K>GasyP0en?d_JN#6LAO+?y#2A}k{C<3*i135j zmno-^n9+yjoAUwQe|~n4bG_By+TNJEp5JUKTo{lVEg*??k;Ym7@2>q&fd#?WcL-L- z2eb`kj_sKVLe#n?<|Ly_C%4P39{uV&20=~7+`+HAEpLJ`c*eZio%TVuy2Ww(C;;=x$?!`9vk0#n(TEF zOn~%sFnGLI!uEE1vlZQp*4`A+1n(zU$Rb!I-T;4lq}pimt3Z|-@9ezFRF{Z<@5`d~ z)NP;mSnysoCC4BsFLP}`52-)EX7`cw4+~W?(L{_6fY1QvJ%oUo9e5ghC6qx{1f)Nl zs6uD_*6($PLn3LUb@C0vfC~jZWpao0OJ2#{W*EZC)#>|59&7XS87*>f%#8_d=kbZv zO0GB0s+te%aFFkFCB4UB2%NWbU*_VuISKrZ0lB2D{RaDoC!hcUIHw_%EWMv$qt!$x z@#(zy(>Vs!OEDU<^sPrJ_8T*7?$tjo9|1iQps*v`07WwR8JNwaKXt1KrIzTf7+XDW zitL@5xP*s1i|=e!rek*ZF%Bi({nrhDjw#t3I<}}16A)AUIas-~(`+mHs7Uwsg5l6* z-1YcPpib0oPP*@cByZK^=!@cH=#f`a3e~7j2g+iuuhCv0bD;a`#AcM;WJQ-7Rl%en z<^yq~^|UV|m2Az^_pQFY5#{S2I#Y(x!Lotapz6nQu}vUESO8~zbOs%514YCA2S&|5 zuRT&CD3%I8Xdj5;-4DwY)*d@`<4u`=;_k>9wiopXR3Jcdzt#H}!lpQ(BLTG7s+@nx z>xh@SyWAR~<4*JkB^K|7DeV!X-kG@mceSJ!R1P)uD(8_%cIyqe$8ZpKA$r(_f?-t0 z1Igr?`-*P9vU-+9XS{#DIvVY(hBtK+*AEGRl|E2SAbO;>R3T(yXFkFh?12R2?6YqT z5Y*R`S${nx6WDN(hl!K`_pb`8GuZZQ<2F}XtwSUr3u>aGg(V8*pN61AA~y*L3!$|V zJ2$MP=)X8#3~HX36v_ffSxrQEXy|?rfRO*YuXLRV%%XAQU>DX`P>VtLl$Og!TlCMq z1@<$H)r(0$6@7IQygo|nRdTM!v3@X=%#TYz-I{Owap;oE8ZE;zvaR6Y8n7YTp|6fm_tgv ziuE?QX?Eb4e9+qov#!MiOtHQCJpHnl^v0gwW->**!BGYWJmEGYZig~KKVqo?i_xSw zp)M_eOACVqdq4umO<)Qq7&?d5cb-dww*xS2+luYKGK%Rpu)hz$@W9q*6 z81{EB(Dn9EMBBgBK)eAsC=PQ5whBPRxdX)-vd6JNa1`=8bcI?01PKV5fJ;Mwo8Ez7 zf;+Y;6baJ6>^drr$NTe!_jF4vDWIX4s$U$NtFM#5ihK3m4!F+_?{S==cc`99(lt@fMiSWJe9hIi+Z@U4iKSD2wNIDI`LTWgV=?wMK7S! zQm}eYyIqC@pp8cB3Rs-^fRn8>9Hvt{%o_2;M}UPg#0o6BQlL>*zVR}pLYV~p#fukH z05cr+>HhZlD|Q|fQ#;@bHsbT+TN}OC99#yV^!(OU_f%(Ayczs_m>|$EhXi_K;hFru zU^Y0RWV%J+8eTzTAM6fM$wW$crb>eIv=?^Rp!QqdSF9OqU~sZe@Ff{BfXj*Ee&I8C z^+e5E6BI#$f4BicKd)AT%Rk6W zgw*Wh&9l9%FYP)bQ3@`?9(+K868k98rB~xxLg}dNd z5XeBG1SVDMxK(O57)TzwO9ge&V?Tau?D%vyotvNk;SoVf5C_;DBZ{RrBWjVDeE&y>R9D3*=ck+ zvJjazZ;YqWMNeoW!q0pFM^Pwk-!U^o0ryTh(*n}GX6P)%%-jimqM{n-5GEjl0){;- zsDR``p`y<3sN(nMTxd+R0AbPu5``0Smguw$Y@qzph{0btYiKBxf|RxiqC_K@uVX1D zNa0OFn?sY5@d_M|5WKtKjL-}WJ_cd@AK)fa)6=)YM8jCVeb@YaxL_7!8L;*7PQbPF^FKZWk{b;$&Y~EH zPQl486EGhrYydeKm{1rXI9&p-WRL;CpC5aqQlHjkzJKcq+5c!oIi)J&6b{+ziF}Rg PoT@CZj?TYr^7Q`zRzOJ% literal 30066 zcmbrmWmHvL*fzW=L68#ZQc3CVZUHIjR;0U|jSA8rQqo9wBVE!hCEeZK_0G+Co?Q~R0sru{#Hgp1p z`uz|QiOdq0z!p`Ozyg1Z46DIOc6_N5)5ejW549Yb9!LoGYK}K%6KkK<)OSl;2xL>=G`$AF~OAO_eM6$|+E0Q0USfE@a zVk!8EGA5<3KlrD|OE|9}V%Cp{&3ETI-WuX4ub6m!uv=ETA~vEFh4Kz8#^R4wx-uqq zrs|w6gZA9r-8auXK7Rb@G4 z#@~#xcsyyvb$>MkeU5`89!34mZ7VBI7BRYS?c;iXe5J*B@Zq6dX9Rh~l-0RUlgF7w zo$G;uk`k8dtUa>1xp~a>uGh{)iRs@oQL5j#xVYE^1TxCX$}zpiZilVNZ)Ig)Q&1q# zVyuDXu(=vzw3{9Rja)x)#z`jja+YWIrc)edHiKz__9;Elf;#|6b6ZqJU5*!>X^Y-o1<A#W7`-mVQ?hy7J?+{HJ<3WpDt)WODM}-1*(b0=vViOsJF*c<#RzRSoCUmR?{T5Uc6Rpry8e(L${X@Z^$b@OFI3 zNe{F&qg$(c)e9#73bj_(*N;y}6+NN)5Z487ZhL$CPo}0Peay`)uKTmHRo$jTDFe}O z-Yey)HXL;l&x;hwllI+U2s-8^RA->EU{HPRcI3lgdTqWbUij#`m{Z!2>4m z(=#$~1KNI_?o251y6paRSnbB95)f!mnJ`dp1Rk;9aH3#*vOX|>ad&f};d8l!eBhZg zy2V(MmL>xCqJD1w?sl~&3N?*~B%H0J%c6>IZ>Cyf)}}h0Huz)pObnOxwA+HlX$AcO z|LK_f)=1Xcz5GO>R))aMZbfi9ZA@KwZ;}SeD~mrRIxSOEQ;0}N?mDuN4<9~2z~26d zkAEs6BNJH7uTnA*6&t%Q=+YO#{`D4vTvwzW|<|rgD z_s6q4?M+u{8^hd>%wzKv%yG)g%WHPa`|_RcaK{T6fQ`>jSU4Y%V^`0-Q&-0eBj%RM z8Fd$q2oEnl+3%{hnUdSamP893G*6{bQ z60q^R>oW=}Dx@@(3FWC1)K?PD<~#N9oY-V!;Zs(f7F8cv2p|m?c;e#X_I$}^97O#l zjzLhXA#e$Pp@&;X$ZzWzsYEVo8AV0uBK5eNDFZ#1DPzPZPaHP?zKUhi>qTR3@RiNV zA9L?L+02M|PE6c)u>dt#+bNN6%zyp*^_R*@4ib!ji;b;XX}y#<1E2WaU8_HBZH+TO zqN3bEVAHHLQ?7M>hKX5n$d4$i8#Q3EGHqF6yfK(uX){Muq}~U7uswj>M{{c@ch}t? zE4}Wv4#|owesiH&xTN726(azles1t&NO(xkbY|6s(C_!gYD|))_l}s-$qdb2YU5eGQSrUG@!eoj=D;V!>55nma>}2=dxjjS*jEL9(!Q=e*SYJLk zgb(IP3N$YD$zb;@wHXNs2?ZW*Pt@wdw_&D~|Hl^IZMMdqst*3lLlF1?gU;_~i33tj zP8{Hvsd;#Qx}U7OM*#a9GW%CZ`1I*hu+?l%n@Uff5rAz@2me>INS)7hU*6F0<-=u{ z@MNVqj&{-S*`Z#CE>hRS4t#^}-@hxR6Ib&YtEo#)80a_V8x5yR?k+TwXAH}LQ?1?m zJp<{rQX5JUOhhL4I{dOn7ZZ$3=H^?{be;c)FZO~omYS9}5afiv1scp>zI=fN%?#;? z;$vskvj&iFaOos{lJPn1ZZGX^>b9sAl6aIC)bb*~IgpB>JS=fD8rs`WR+wTUV~~g_ zzi@DHaJxO~a$k=(-LBVG`=?Yaj z3TaWbw6uiY$Q7yMkdf_I9B+rT8n!IiEjrY0*VBz>k6VBZeMLi)(^Q~BA(eq0(y=_z zOu2pL0gr&t=oolYke2qc*`Q#`kR@$&3xvPigZwcW@k=HrK2nf2gl@Qd%{XFzl1+;L z@A}{vKqekTc=~@^=647lSmO5Q|8KVbfBR^cI_=}TMs?|XFFx&dNIoEr`d(hT{r7xKS`2ugV31Kz=-hLeaCN4Wgq=sb->*bW#XIA_hiHrI26gcsMaoOZ*PZ`I&G;i;K?zL_q#q8F1pbQsX}^N-i&x? z!^6Y#7gtwTRmxPUKVZ9NuS^I2T%3T!Xt&-^2th?d3knW~7b#M|>F^`@?+&sSXQ|lZ zIf~>a{XdnLPc#g?W6pLaD$GZzcU}0Yqn`Ty{7C>lw^La>{;TK!6&Mg!7AwKC`H7qJ zy$r1illcp-#4uprDoRSejtfF{etvE`ElW#FBk-_e%kSNCf_KxYB!h#4o1Y-&%3O3( zpmO$M5jXIPdj%JhFJ0$7ns2@rF6Swl(W$kYmC^vSEdf~(w4lY!0iuvTLsP>~vsb%Hl z;1Ci9p=$btH@2Q!ahf4Q-*eI=o%b6v%$1EAFH0;6YFAzcHF_d1Ta2R)9IZUwRl*sp z8;6{@kG_RZs-nY<;^A_F2;)so_tMJ=T}NCT8ijT<4){fYovhRT=TJ-p17baA^t2V&R9SPjY)T~)dm*N2rZ4QyOvBTHo(8$pj3 zD{2~7k`OtxN86(k6il{}M6Es&iegXe2K^E(D*0o)bxw;9Ss?lS}LYQ-R^ zka`{>s`+@T_R7Pl0zKEOzdjj3u1C^4gdm`Djd?x*^qXJj4538rHh6Vl!wn+K*iT5z$Bo%)Jvai#de;R z-0@`?lY05l`|XwOct~z+keswTmC->$A}@nP|3>fG<4VTr$5c5L1$@w5PdMvh z-{t0<-OFrIVM46#nB>EQzETm}^0MycS*gY-Qq-Dn zgyp8^9N9So ziTV1@75l}D)r$#37J|Q9PCiglTyK2O^W9gRoH0F7G$(6ueN(0CT@vFDk=z&T|3V2` z`Gqc-bf}V+0!XWmWgXb|H#h0XOGdZ6u5F`D2e+GlFqwh){Nxmp-ub=tDgU+m&XhR5bHo=|xDVtTM-Pm@ebbz+*YhT2 z_1CR{gQMf;<$tE{wwzEO%-Ft7KndC#+(RsM^{pde(N)>B(t=a&^VXFjtCwGx^{4Aw z5~8qgUp8M5MfFBfWVt@*|Bs>Z4b{ZNA)|kMWu#@)6rS^NwV{buHSKB-4u%Ksg#^uW zUeC_e3J34KbaFo`kYpZU%^Lh{qbGOcRe0X}6SHa653AjgPFo}X^#@HerWr@$7M#39 z=*hh8C8pC?nf=o*VaX}|pH`7Nb^dsg3KLCC-_}C&C3Y$Z(C!y+EGzBQ%sGfq3)Qv1 zcVB36U&213_ZK*eMe?`>m1xm=$RUmI!J+cMSlJ@=_nMkAh(Vt=IP)5D#=k#qjkboW zYCGXY5d*&qeTLMP&*JzM2NAkS1tERVr^Jk&0k!e%t9&_FI+G}xuCl~0cHFr9bH`B9 z6x|g{m|=0|Wl@y?>eln9cdl(xP50AE1serSk6E!Q-=NuN7rJ8fdn6f7+(Os|To?Gp zE)tmvv<3QLX}HoE7D}X6-)f-t7%MHpO!YS_7vv?%lLJv)i&95VWJb+nf)jU%c|BCy zrmLEdS0aR$T_*0Y=>KOuZ$KNyNcZ~?!h5SkvoU7I0r7L*m8qmp4pgE!p#KUR@~_+YhFto+KXZr!D()_3;Ak4#{H~uOHVV z3ryTYz$ut9GOVmVQaB$AbXW9m-@14E*F z@#o4ney`#b@yWTJ)NT1ZArNq5k&9($HRDiGRh7sfW2|9crTAC8rzkJ~3{>i9@Hs8QUC@y5K37y$ehC3Z#fP?UWo}0w>s|G)Qu{P^+Xa=V}e1r=4SV0@(ZJq;U|6(k1-v|pfnf7TL+O+mo#QdsR- z$6zTWpH+Qs`p1K-AY|L11=Q2y7Cl2lrXhVDOHXlXKF(STbap+{;`+Qc#gFnbq%yT` zILp!W`1sh4@57DDyAJ;w-^a&-z&d1~tF^dgh>)Fc7q``lzv9A1#wBmR9qsIFH8VIB zIKz%$T+O0?4t+D{1&J(e80khIx6`lj0j%*;p8ELYgf($sb-{;!Dgd*B?wV9TDJ7Kg zctN+5$47`O`W=G$D9r{T-|uIJohzo>nLdv`0panwWPt!{pj=%FxMDnfVug5Uyka`l zLXw{I&gj+`ZvGB5ki86jHm;>x5+t?Tj1tn)6CQJY&!0aR^YIb#_xDFcM$RAz(?l3^ z+E4mCB@nmAupX=sb@_5r3y(hPr^^}CZ7((gc+cbg0CEG)6#~!3uAIu#`X>6)7N(5Cr#LqMJgnFa^jSfU|xgecrEw{k%W zZ8ND)JZL_U3Q?DwjbsZMI{Eg4VTd0jELjJF8#F&PSt-P3N1)e%8 zD284G-VH%BXSB?)6+X>vtQxf5W~vDF-F;t^l9KrH5+4t6WOUSgp-Iqo!JS5VG>5%< z)MkG_ejq26?8E&nMJUNr4c*~5Q=x~Sq|B8j5}KOvjEhA&icyi=-*Pqw*=Si$RQ1^7 z<>x0-JT{&9Vi~mHMKYwq8d9sxN1w#?shOUL$>CQ53>3t`!0_<(x?QW0fUvb0Qbt1I z`=P0VFJHq#iA~p3l__=h-C|~T&)IZZgzqxb&0AcajSa0xZ}1EI3W6r%iJ<>^xeP(8^fa6I+(^@W^z`19|Vo(vwn za;nnqvw|D)a7CWbfv)R%2^;`aN>9HN2_7CEQUmb1#u-qzK+4L>sLs{$R5>jFg^uPZ zPW*R|<>!ko^?k`5pwCDj-Qr2g{W!f%)^J-+=$n(`fl9ld{={vcmwgA5i)wrxeXYfx zQ8xeqzBW?SYIXW-r}kpr({jmzZfJDcdcL97HIc>_Ks6q%_l(+=i(`53=aJr6M8VEM z7ykN!SwGOQ?HhWQ&%R6jaGvVz_i29}8@ku8e)0GU6d-10XTxJ*|6M;*Ql#uxBSN#vW@>M$5#$}umIs=ysDyUF&IVoZkqTTcK2I2$8Wb9*Oz}Fl7_*>dP%X1g zMAt*+X3TEx=t!&leuikLB~W21DIqbYUIj6S1HJIVC5Y$rNzmHY#*DT2-scSD(>&rsx87KK3i4PT11cDwM5Cf>S;Q$dM zX}Nxf70Y+!j++#ai*14~Kn0gI*vKIJ2%7k$Q8O-rLX;H{3ZNBSnTw6hHd$_eS?6?x zykyYSlkKvnlvjZFG)1c%0uVnC{r&v>RBL_W=wR9Y5CI^^W>wR4)xNlrA9{XJ32>M^ zTiQTcpRI*E-7%$!wtj}_V?FxB85e;d4YaNRAVvn|h`xRbq8;vIvqj$B+xwb}>vu0) zQf%zEHk+KC26v8~zn`l_Eam$XO$|@Y=p(hXGU03a^s4^t-2v)@fW;63sjaOASxBQc zR4xV<0>ExUbc+7Tl1C*c4>Y|?ywuB~Fg&w3Zn}$Y6QK=}*|f?wRYb<7QT!oeFIUUQ zXn5&Z*9EY8LN7HWSe9Bs2I)C4C@9Yfl9Qc{w{UW|P8>>&!>jZAaAev?{#nll{<}+) zzJU^43Vp=06sg z!iLo|PtnnfoFMpkcx(xHp(2U-*i` z*YJI!lZ727fSaRwRJWKmPubOlKHyJO%dIz$o|w=43!))LfQJWR(0HocSma1hw|Yh| z1Fv-Bh~nvDZxpQG5;m-u${&NDzx$dJp5N$o?#-{nE9aFxu~Q2|V&g%w0uAVGr5FuC zX5vfU|8kWrxs{2g4SU|UrI+A&|8%Uvg_8`IZsw$%KD{TCCDa_xe2a6iv$<&oE3L~u zN`}E}YPYC88ZADrq;l!Z9>KFGy2a%aJ97Y$1;IE%2z50f4SjZUJ4fZha;iM*!WrPe zFkTCkr$Xj%6Q3y0vZP>}%;b>5G}qG7!iI1;Tk8meXaOZv=KVFfOe^)rc!6o&O$vDn z2u7Tw{4R)xJ%WbH?l3E{k32!Na|h4h(dv0YwjmQ7=?sTlyIs2>J6Ek%pbi0LE34a~ zp{?6>I-0g>%CkQJ0wOQiq7a0x)gD-~5CBv@Yu~7P29C#zHaa$+(y4I(tbJpr~nSl2Zg=P2SmD2dKhX;I5+oe2c_^b{c zFE^G0^-{yHty-u~au$YQam{kD1-WP5e^=>VxIgEvbKY4$aS&v*sM6LGg%rHy^J4tk zHcwF-`j6Rn*le}sGr~OFdymExfQDY5ZoS{*JKr4s3fM8Vo6G-**h?i@SyZK4t0MKC zMCeCcNx0lnq*?#Oo+`_-xgWu;SOzxnP|~6X;Ne6QqlPSFHKB4rPNE>`V7k}YJ32ag zt7n_$iG)eL-xgeaxI2K#Cvt@;d5mZ`$BI)^eE$4dh`%|P^wAN;L4->?A z&-U1xgADO{mp!^_21T?XwK0>vot741OH4{&%5` z2sR;r4?=i(c>%@v#MjRc@j&q7kl9u__0%C^sj09cWGK;ev3ene#&DqzQ2Mw<;|ZPRo(ufvz(ACPz)iqN0Rp8Tq++;9fE68@YQ}OpOphY% zO%36+AY+)BPaPv9lt$F z)eJxD1{#9@v;bNHF{|6-1#k_P*CwW>2!>pVpUV+0Z6{n^N=j+j#nJ+`E8O~nqc)Z?Crt4f=2AeG(xOEZ9S6Al;M8q za1ywCFTbslL2@MYMY|dT&fa!h4W1yU`(BwevsIZiH+A|Y@=w$ZAX34__4#85dL2<| z?{L|1HL?y5V|dIRzDbxP7aNoin+%RI0mQCD+GUCzK#O~Ndf@0V3~5u)Eg#4j12AcK z=fD41-_N=ta2q5pG9Efk{(VNX)%I-J1@&J}GLowAG zktG~Mpe<^Z#e0P#Wl2AF6)LIXBLt{t!1m|&o4N|>!M1{CenzZhS0urSq&KGJPY}+Q zIU8KZi89*5BdDV+9)izI4fr~p&$dQgIM`*8v$Ku>Q0H^m?QXo74?$<=|M|zVL7K$% zgw?hJo|F51!*@|TJG*!|FCR1>^{m&%_3^P3{5YsikSD^IhI)GWhp!&3=@;N8qHXm( zf=m$0+zdQlQ&hvCB2eHfm8)4GV3Y-msrF}57{Dd-Il@`;Mh{{5}Bi7FEbk6$Nb=^VCKF)A>30<4a5VB=2e}1Nrf8UPIfCKH5oc0 za6wrL`P=B}3V1&ddyr*hWG+`KoM{Do*Lw8{e%t0qhTtXf*r$&MqJjPDXgx=c!at#ZMKWwE+)0LiHE~8 zS}a*e=skwrF_-`%;#)w)ShC13Z%6+dPwf^!06A?gQZg%c1Z~D$#(m*vn<#s5nxKWKtr=_H#8dk*V$DBnkEIuSqMB|~O zLruo0b8#+T`{X!=g!FUPCV|U(J9%fSZO?_BiaXBWz$XN26dNcubb5dN`UT+0j*SVb z?Qf44eDC4G$CMMbaI%jWjv%b&7Mg=Zf{TmPQu=`_yV>|Pe-l~?tutRT6{Z7UkSovR z_O8^Y)u#t7%s_LX_v-B>`J=&Q1NF`58=;iO@M2A^R)EdW33OJZi2+CkaxrI`C5}u} z!jaJ7DMI=EXD$f9GU4RR^Aq1=zo`|i$L&!sFNb^N6gu%Gvt3k>!#pq0g3o#T1!;Qv zq%^-SN^P6Jb#HWHvz$=?=(D|gVcmW^I$pTEV;NJNlDLM z!tHj!>hAOeK)`v(AqLB~T^@a<^VS769CU$=jjC5)ce!~OW<{AaV>^^#s>scR-=AQ- z+MAWSsJ`Ji`pzYs6zvr+Z#; z762C=O}Uwc;*nYw?qd(;$m&gm#7h>wzSn3N81;yaEqOT6g3Ro>e0xUt=ld&hP?t~% z-JH+Z67o7w8u(mM1*b>Xz5}({Tji8LilzZ02iLd3uEl-^aSM#&lJLl1jDUAmShjTY%yNRe^r-s~ug2y#(s#FMcSklnX$so6(-FKEyIh zpPY{7qM|A1WGz|E&)x`fT8yFic6WD&9D5d&9Q=s`=cah_=VbT7VEmeP^W>{omdY<$ z*}R#-xR@A80C_(7+G@I^o3BdO@-Q)=nx_gD-;B9<@^DZhu;4FjX$EE9*49>LcxoNx z?O-$HTK4zTa+Y|2-NAgAMIYX5GT#yk#`*p7_Lc`%ygdHe#XqcjeK+`;-z6FU5O}z_ zVsYu!?Eq+4;eKKQLY}Oh-67J&5dH%1V&1?kEfIJ9o zJ@||UP_^H`WBvc}JbqJF#V02z_U+iyxh*up!hpR}$Z1O-wmaW02qNN-^{p`N(W$|5 z^brb9SJKqnOm1mgbI^-k(DC-hZ^|6q`fJ7^baNFu{^Q)d0h5r;4_K!CMzSk#G(;Gz zg@S=$a(TD}G+Lt|7N}G|edQ-yHnWse&l)-4ebZN}Ua+?EE|GZ&uTR=3+;$!ClaF-S)lxzvjz?qPlura zb@Jv6A=ndP=m6tv78&n;pqYOgIBZIikVO_Rjr|SJvnp-IAYW9adx9g7Q#CnYTzlY? zt?Wdb<-?`6D)sxB5+5leg^aVK6_JgIpYPtiL!$I0hV{D=UsoJzVPzF4^zy45Gf7Zi z2CpC@B3@R`o=jZK)!0*PZEXPwOEb9^0~2KkE6OXPBzDt5h;f8a(VL1XQ7-6)!xJMG z`E&EB&!3_5@742Eoi_h|2Eq)$%WRCE1YXlLt2}*0L^8Az0=o1nmHRIjm?P0vv1Pc8 z`Uj)sL*#~QTP|FQ13q_~zi5*|EKhIE+k*&|W%;`Ot{_MH+PXMeUeb83eP9_Q>)-PU z-ViY6LV^*w(8ovY!f9b{x_k|2jKxt!;WP6qnxSvQ5>OJ~&M@Me%H1-fu5z>C*J(Vy z%=No$sj zr(gVLWo7lcm~-W1nz7Na=XhXSe*MG3TNDGVr)?>B+%fQ)0u-EPc7wKX;`ZNb=WPC! z7#OUSyY7#T$Rxg1qOc6>qYE*8=L`zG(XGNNuq9NFzb}hsnATbJwnD3eeF%~L&mrz_ zVRfo}^c08-56R@-xi)`9uEBq+WoM6qmBOBikQu-y{0>$xV@n(WNwr1-?X-*h3=x^W zVbcTG(y21S@{R`l(w<9_LXP~OVUeC{I;ka+4^{V5;|<0k;fZw{hUMC{xgBb=9vA!QEkG%y0MdF;53fWUjI?^ZocTmC zDW>2lmM!E2lf>|;VVNcbWY5o-Kx^^3oBz{XUFh3yRt?gl!? z2#B$;k!6*(77%Da=IWdg3|FK`2aHHLrW%qW92_khb$B>9qSpr!5&q^VrfLhu<&ytr zR$xQq6*^}N32AD-8g=O}k)F{>4r$4J8wH|k?%7FD-Q!s+y^w6(a{4H*K%Hi(@%%X+BqOlN9@*V`=J?S4 zCiYBo1Z4QYu&}cxVLK5y4-f2|*tu51tiXfVwI?iH{17odz(>QvWj_@u+bL6uzt`+vl! z<$o@osD1BEA2!=w6-eKQA;3g0az=xmpy<|z2e=9hj%)C5&Cj*UF~_?*TrJcJoT3Un z?6PwZy#p7_%gf_1A8Eh2uRl2D2%qn7Y;g$q3dF|~108`+-oZ{ZjVD>b1AfM7;&`VC zWqoh}*>G2r-rL6Ih`Enmm-zV?^#VqA->9f4^YQ#~@`Gvn&F`_F{m~$k!!`CrLvV~t z=#Tr~v1Dh*eE4p*V%DcV`TKWa(}ubYePm)M?q4@orj^>(U?~6`Z13u-aNJNB%O7%E z?JN>-G~>sFtPQ17Njxg0U{BRU+Ooa7KkFdZ;~rh_WdD7S!~RnaF3>4#zhnSnO~4@@ z+1n#B%q#egMCR$(Yy>SD{zEuAI&!urTz(ECxy_VjYikRa50ZMg9QLZH5Y$Tobn3Fo zj;jfrjGaUub_^a~^HKWkP%ExOQ&+KZYa(OF8@o*1-ETpm4V2Z~&dzVrKf`K44qA8Q z5%-_G47xw1MOyqxJGmF|J9m?mbz?oRko5kl7sO0en4TDk!JBVu3UR)B`O-!3ZBGvf z#D4)80*Hz2Z50Uw7*b@W^p8npSo92St}aHX#o{nofo!Wbs?qepzfIX8^~)Fdge|9B z=wxq9zENeNL$#f_&7Y786I?7jJO(%h3;)OHT&k&R)w2)jELz*oF?Z#a zJM-ScZ4Pl=5bSHi+_2v%`fz)z%w+w--+8!gYo_}0-rmfN7WAuZ#4(4wk0F)S(d4B@ zp6enC@B5`D$yX*)QjF9T8JxAX1M%Fw~DQmf?|Sw!o#S19(<^8S#um)W^137GcWaqzrWhd zfFFb2?rd&(#Nw46az3sd6#iL7_q2U>-&0cbm+np5{%CSqyogxcz=2zRSa>Kq&K9cN za{J!WB1~>@TVCU`ki}5M{{}=d5*zLzX^BJjL)uax8%9&-JFfKI zvA7bo--4k>msD|m9WajlAcAxhi!f4j6i^|~4W^u##zg252&SKboNyF~=bqnyTnzWT z<_I-67EC(w1s^WrQ2je%jG*z|I~T^cLP0~z0BUfm^AmZ&H*#30 z1~7xZq*An-w&Ei5R_$upTu??LDRMxYw5al^cHW=8`f>*(qmQZ;*ss~lCv{&eSpFnD zqmwTB2Y_{Ju0+?F#n!LPlSAy6vdW*R43~6(-=j1~Cnuw~{GhrqC);_w+)jo8bSWT7 z<*k72;z}%P50(MK_zR>P_x-!NIUDjZ?Lc8z{JQ;-gXFdS3B}rxtE|;*HRseRH0Gxt zLNEegX%Vmp2sGDywuMbr!3H%^1N%Re0}116tB8JiB$t0PD~B+7MTd&b&lJUiaTQHX z6s5eI&JiR=FIYHRiUU0nAm?7v2>OYfu|Ao1Ay)FSJof^HXL|Z;KxFjAF`EM6&)PmS z9K-*7f&>HE-kz~Xt@!nHw3wY8i_#V3-GUfWBcQ z4t$g43{-MJ36}X|XojZh(<>7u^>y5$Xlz9iXc#~X?ZTN~f(505aYqIYJR~njcG|`J zjpSrXT}xGs5i|?NKbC3!wV<~N0JT@EP7_ws>&IU$pV@nnjBYIK*=;+9vO49orrINCe`atMud>|-m%6|AI;RX|9(cn z!Z*P9!qEwv$)On3FDmLQC;+t>=;7bW$r%9!H^l3x13xCkR1L*`OS|kNl9CHrO>Soev)TWvAI3_xJB#i?|hY z&9O>OCJE;l;ubI~uma>9CS$qEp#K6z%f_DebFsjY)zwujGBO2_%qH|)Nx@7*hDM1# zMBu0$hlJlHl-Q;Qj#hs$jZUwHmzOTP!D{jT=T$#@`(@^hCcNfYoP#tAU?zh=jsU!4 zM|UIzul+KjhQ7P8-uOF|r2tSnKE-@E8BT-g+zmF?*Wo)F&6NZa)ztb^NM+cqi8K<0 z3Qwb>aLY6qgx*L8=I7g8rYhuQfM$tvdmCF!mk+4go?>E}F8%SRB;^&0iV&u@>*x8+ zU5o2%f_J!Ks0d=Sh=@p5uiA@Cm-rOS6N43D-XM}=Wp6>fVX?6)2b~t_2r|%3V)*&{ zyH~sKBLiH^yx)W!00yVl!(V9Tz40}!7dC%?K;`Zy9QfMM`E2Y{b`C;}tv5_13Qqkg z!xUF>^DU+DL)id6poNqTdeIlV$UH++q4%}zU$?iQw;kAEA79|&0`7v<>y9&r@7yHR znl<292)^#moXaOeNlA|iBm`aX4xn~!gr zW(`GIZSBb+2*H4QJ8IH+Az5eXhqVUEbqToqtC0BO_;2aAQWEU~>Ln?iIEou57#D|p zEGo*IbM@TdF^eSfGM+A@-S?O>IPsKfGEjM}=kI`tC}S`Zz{w;XxJ}FLYg@DQ1e{9a z!Nu-W8-O}28dbysr>j7K)~26P)08=oyfIgE@+CE0`FsTCa3TOKLk4Z&b(ht7Vvj!b z$poItbNq$m8>90=;?4euU3m2(Jvl?eG(~D83y>{>q`qM}=gmUy7r$Z>0EI3_z*knI z&cD^R2HA?K`WntSVq;$l3mIU8JcG&n8&St#VnDOT?$?F);vmWslfvbuuF69F)Y`*a!3SrtUZ2b`SOSpGPHNwrc%Y7!H>5uD5rEEdufA()6?6QdN&acW z0BTjRy&@;38`_I*I3&2BkjxkP{kyMziL`R``(jl-BJHUycct4P}()d4oI&ZdJT5MgWc`Z09 zjzPln9q7g!oLZUXy_9}&8*u!D5_(pFa^c3)0;!BhpsDj8y8o#1Jej^YERx zSHK2v*U$zB$Gch$t=e=71Z1JEE^>S~4IRtpIBgS+o>6^W92iqQDrTv9St3nYkNiYzS?FR{AH8{cG5K;>|&GiHjf@H0lI)e(!d{ zH+(*N>alEl3lH?zYWdGJ4#@f|8(VS|9|rF(5-%6OidLGjhANWZFk7lhYjvXh#ua!6 zM2CSPA+SgVO1tjz+;mY|PG2x$1JJI3w$HLz$M+Kr?vC@`7jt#R8Cc5#pq0^e9#;c= z(8&Z2j$?R5UMl-#jQ%sLG6=GAjm$5Q_0+(9@at6&CT*%SXi*~s&k2Il z0f%H$oft)<=m7fv31?D&tc|07j;vv`eB2f=3Zr*2XnR8l9dVXxm{bE394= z8?}e-Eg7`pSjK`EEux~LUIbXa#=Dx@4FV}|dL_zLBQqB`W67e35jy0Ms3|E`Ys1BK zcYF7~fT2ZhC4tSA1k2)IfWJNdTZeVlZ^Z@1#{AR^iqs*V@G2R@Sfr$TdIZ19@2`_= zaOSXV_U!y-iqwHf`(FtgnEzo(9MDYh#@q3}z>bb;`!Seo*Z4qQ_fYonxd^CK3RIGlHs-PU*k{z3D@JyL4?fC&LZc*Ze=;( zO8!bqYvG^fVPpHzFHGH@TX=$S=^dKMQ#W#dqyUmoDL`7ltX}nPFd%=xh@57f1@6Bx zBP|}gm&AN7h%Z5>4Rjxe0F>=ZqaS_=G8#bfLA&U4ccx)ezsCi-oQ4P%pb;K&91`pT zV{*Jsn}0Z=)QTzc0D!2fOS9%8W{T^ZktD&xQ~&rnv^VzG#Ev<_u14b^=LDbmzZ^~o zu+A<+7F9kL!O^!uw})+D&cUY9K;_Qw5FbS68v7LjZX1}6hOg1{f=Nh3 zFYEKDSRkEtwGAl{oq}Xt+^;+c!b`q7z7t?Q7&(dltPfJ17S|I%ml2`OJ4{wwI$3>y zt_L%L`Yqi#0_{)}UREN6#?(alY}q)V)Lc!DEC4C1P^Y?hqz?ym>7e)B=$rT1hhR>u z+^7rVKropcdRwMIN8O%f0RSx#`<>E4!`s`Fp@MOwJpu28I~#5|dUZo$Howg=)pNK5 zfm;?Z-qv9F0BlkJu&@kF-EqaB8Xd9}n`QiMs4Zv@HdlLUNP9&)UaVKYsw{2aL+kn) zAXJh7)|0iWUuyUaGF$@S8sg#wJ-Kjz+Ty<%Rz%vA)9gwJ#?z<2fT!cSh?<(1zzEp6 z26mJF#c&Gg$+S`X@#8f}5^B(L!LaSgY%h9$`;wpw@ZUnc`dHXA0UdvG^}I*l4X~FL z7ddJD2=A}h8BDiGi?tgm1^Za+l&w#L(cApx5Sw+bP?eew@XV!)r4WB9c%-8?$7ua++17c31 zc?Q}v;qOli<=z?Z);cEfn||6Jv;7ImLzjBexV|;-XL*H8WZKybJ_!CMh`~ox%h5D)U#Iy284VZ5ujQBXk^6eeO>7~+x5r)Nz+4W z>;{SL2XwuTxr1Ux`@vM7>%3`4j)U3SC{UaYXTKws3MEi3V)HxX21n%y>Qbq2lD8mh z6AF2`6=}!^%6&Fv^=DbU8hzF8pkRbz?u7ocqnZzY=&v8NjLfVxLU?_&NQVo=*srZh zHu#krO+`6pe5M|+@Z@RRf2jwsI&Ee^prJfXN!FQmUtZX#7kylswe0EdrxX%O0ZP3L zl|0QR0bhK5l;r{&+Yv!1dbNM6LCz|WZ^>0bF;b{dXykt??ZMWkMl=G{Pf~`4h8_H< zujo{Pp1%zM47r;`dcNHr4Uaf7=UTC! z9B%?I76iJiJ+mt;Cs|afV)0*ysY=%}E&`MCfVR2R>H_ZIIhrlnt9)DFcjh8j{{O25 z0FmgLGqq>%y(@N6Q^I@6j-h*?QEKgf_&{0oWuvs{&>U|u+j^*v;BpB^prA28s;rEm za)$R4S6g=^n2c6cMHG>e60((7I}*M=LD7*b3NY1`J`nQ$DF_uJuZ$m@^tNT+y}U7t z|1({s$g*fcf7eXZ>B`HS>HkgLBOU#f#1wFigPH1x_I3%t3h_FuqJRP9bdcek)wo{~ z6#{J+C{H9c_Kg>MK6u?hiQn2&J;%cXJmy2S>&DW%7Wn~Qu92^Gx4|i2;~8J z6(L=gQUcdI4`^|pT({OSzaXV+s$BfZetL$M#fZM)7E7bdGlyNBO91LWy1czc0^!(f*G3U`zBH9bGn;Jk~sk)Dhd z3^544BIPT+evX_sd~tZaU5~OfBrvzDZ*n(+ATBE83bFiGOa)|g`aTM;TMMUwLVqCU z9w%~|o}M1o5oZqFrHD7QWC`Z{Jy}A7qxBFnAGh$ zbKlEms_q*rHHrCp|71ah3?uq3|yN?4n@dzaa_{n@us#I~z(VZ@)0TX})ReS0&9V#H0A zumwy#%s=pxgv&m}#Kc6Vqzr-y1f>%HV8mdUR?K#xi7rkLi1!P1>SLc%4<|qmH|5dP zcOJg!7g{Wa1(!wA3w<@Ih_B({j??4v|BSHk5i7a2r!m=6ig_vC^tIU>UwA}zau0&> z!QVt_cT(3Zyq)0;^*d#dK_P&kc?pOT1%6 z^BTa+>5zj;(3*&FK^g}`TJS#6q!m-4J)ij2h4f#t5`__jb@~e9ccGPsFgFp$5rqL5D0Oeh0L+?#S6Or#LAWWwj)Dnr@K9ieH99()^2(R5D z1mdz7Fk`#XGGlwvvLar4*h}wzw@f^xtJ!@{$nJK3wLyQ^fb;x$1N65hLySf4Pm9A% zA|S2m0`rhp09^pX@wVSL7+=3m7yYM(qh7#CD}>)_$0Q~u=HF~+1(A8>GrTdLF83NhnBsT5C>(H>UH82!^T3ihTNES5wx!cd( z0I~s47_YN&4VWq^fdW4=A@?`_DG&~KgLeq5-B~aG)3F_w;e0)Q=q8}1FG?iH7R5!_ zH)*c$VYlIpnvk?7pl!)q2|6w-Ee&*udQ~g6 ztT( zC9z<*etZpHMp8WN!-yB+idYZ~@d58nfxRT6VFw_-Q~WVYpf%Y7=NYzRP--X|^L5Yf z+c$@4^Bi}bh1V*c<1T*^z+8y;_34Mx&0$bKn+zuP{P9QIDd39qeQ$r|ez@4mpx^LQ z@!<+}==Ox{-pcz+eF)}ZY6uhjB0$3Oot|DvFyNt4NXJGr>9R_Bf}$Xv%UU~YMhdrR zhQ7GwiyU)fW#^e?8foP9duz1I%25R)5b{FF1QW0+q`pT+wi22qDH~J;AtnXO)!>do zOdhvchCQ!J`?J?P@M4z#Bm~=Ki2REG-`KG?>GS#_L(n z$FlDU3EJdUfrtWtQ))GQ37Unz&kHrN%jFSpiZNfUk_y4JNtE`GAxo*}g^hFUi>HwB zC#B#eC@>i~c#}%ZzU8}QzN$eqoTn1Nt^vLOy0_OYLW$3gs^b=hQa!;SaqGRg1I$Y= zc$LcKR!%;RDo?^64N4YO;+6=3V-!%*uNPI%e+07=4TpcwlE6E8&eRfRTEOcveh!!< z+@IoP{FG(&42)1T?FdG%nmz#I@U`m+mK?O{r*p9-yM%-`~Q7ih&z#t?6_TuWQAnYxU8%~viC@`Wv`-KWo7SC$SpgB?2t`n zWRt!3=J}lW_xn75Jb(ROzd!m%*L7a!d7Q`i9Pf2N{)qZaQTFMSlPJJlWkNOvsL32{rN!q&GxCMg{lJ+WF{)0RQypHtv30EX4o84GS3nR{=SPG;(MwwHQWv66QpOiAh1GsQMf+}16lCTE#i&Rnm9eL!Gu*VBxMNd&U|!Q- zZ1>@{{Yw#@T6G0%yM0EGyV;b$wumX36>@(qP#0etc&PkMFoQ% zby}7Um-HqMVH{McYAGJttPKP+r*#?+&61m%>G_`w=#)3Eun{~3S+~Knc=*DfXlEM^ zuLO;`#OWA%?A3Mn2`~%%j_?|CN>1N->;w3_619F?XWlLBC!E|1xa~^-@I76-z3$$fr0Zc#_we3a zr){B~(RD{k=0BbLu1H!%Ml?vt9EPn+(d)e`=E@44EF2zWwlDECvC8pyn)H=($sQrq zUPs|J-%_k!%ZqP67=p5H=y9Qe~?RS8kx5IGzQWX!8D74v41j3!{_rUPTr!r#ZN?pYVbMW+4cik7Dk1do~Nf6io`y=XhL2o zsW>yYll_Cqsp-7l%#?s@OGJ~x$8lZbJ`FhX^o$I08-Dw>mwuXVK~kh$Q^hU$4u6Zp zL4HSXzJXLqO+Jo5sKhs;PV8Y{QeX5iF3^$LB`J`HW7=x^T5Kp|Rs=ne0etNz{%)L| z=2~(FHpzpp9%e_u&_*cUk~jf3dkP3kiw0mR4eu zhm;1Te13&kGg?n=S-evFyd#eX@;^F=Rn^q0+HQQhvpiZ+sxq#IeU$>eJO>z$!u126 z!kDi?SBB^Omp}$DP0ZQSwY*$J57#9p`M|;a&^G|00@h+X&Xy`P$!jlj8&Ujp6w)OWMm*&U#R8Nnxy3q?9)#qA(%`IT)WRRUU0(r zO8*3%*)WQV#$?*K{n)c-*h#+C)WT+1yJ`&(^ZnuRQ<;rAzvBaH*37LNg)37)N{E>2 zoh!g4-Z)oqOLOuf(YdzI2wS<>^bFB&I>caCbe=DLUs2TJyeTHQpglqf?y z-VUuuo~Av*VEP}S6#PmKGUY_$d*~z&|Ew*yEM$~2?Z=}IQ$rq=0|c#ZDQ4ZHm7isXFGCoG({%9hl7U9`v4dHL8K7>) z@QnR7Yfhq2Es^-Q>$mi)^c)x zjVF7H-q)0Vo2!#ymXR@2#F2E}S4}bNPuvu(eS}UC!&|u|q>W9AhHl;r-`amUUq{pT zRHtZ2F|6(maW+Ts3%sDQ6KyLJ1$@y$CfvteGyp}9yqC+nR_ z-pKBYg-$t`Ifljqs7+!zGAvXJ7HHSNe<|Q_Jruj6jP_nU{RGJNN@QeT!x5RivaszRe|4cngI z7CiO`0?w+^y76SJ|BiZ`A9Z_X!8$(*vC{-na|1j$wp0JTm1x;@^0l3I>@N9&)}26V zcB##1Tyqw3l_C!pfxH_BOihh6zg&kQ$&bKSb)qBWid$IRAaOu=n2|A5#z2am52(NU z9HMAEc1`zIHAbA&ZuO3ru4}hwdRq^_fs7z#<}h4yA#}vlKXVMtozK3zb*9+uifmB% z`}9E)10fkxJJgnO%rvq((GFP)QX{S=v_SPD>2APr46l4rh*5{~f{RH-R6$!$xp~3J z6E-1N7^D7sRmBvW4B4Vw#&?4E<(fHGrlHQC`qIWzziMYk$)xWrC2jsKI3ZTTL|#qRhyYRBxtX2-n!K{JoN1BC4Sl91uo;}#}^K^D*`QTV%yoRB{TNoncWEY z#U36X-SWp^cJ9`!D)<$;6~(QNwmpqcY7ApjdRD>**!xz}Jb1jF4ql@aA>l>BQZ3S<+p5$S3Ms^peIZN8@QO_IFbbcEt+@3UmtN`}U~f zUu-&;SoK1*A|hfV(U>TQ_%indq)=((YD>e`^P!~HeH$Ad*q(#*%|9rJWDNlyVrleU zKWMCRVjR9u)vDS8QKbjVf_=Fz3dvtw9x4ie3_{rS15RZhq+^F*mSnO^9qX{rQ_ahrzb~Rz)biN zk{){fzU#U_x%YCIuIUp0@2_>#^x8`vg>cE5E>04t^T&SG*VjYpC%_DVETf-}Rf+%s z(1T*csOH1^?j8{nLo`7;1~le)%!psy*-ig@w*@U~Hgj zS=6!Q$Sa*Qpnj5c;`f^>7;z6#3RNxOh~?loUojfeG+mdJpwP4*m6$B}y8ihe<|=n` zjfZz$k?GVTqJyY>W)MO!Y=TZHzu)66E|K_LLEi=V9#9LAjoD;VswQsBw3WD0E}kh8 z!xt9tQs8&75iA&GqpR9Pb}+qiKFLdm67n&R6at1I@|hV9MUU$kRh@4{Tss(mlOeE=Iw?(RFsdJqI)lyMYj^WVf8ns<^KS z6S=5+!wsbi*D-a<;|>n@K&(v_z;AjDy4tkcuLPE=@I_jF&S(em&mT`y`5(}upfdaTTBkP(jJq+XUCtst-%26@oa{&tvZ(b%KhE=k5JNm!mA=2B zxZP$fNPH+wtI=+*P6?VVc7D#lnOU^r{2ba4NKq(-!x9oa+L20%GK)ux)Q{uoyv=K7vipnEajNs?}Y-62ZWqt6toZCJD$7$eijjI0*z`_ zncHDrZ@nbf)a-}Fx-O=Ql84p8DoA;QgM$SiVxP04@yGhN^OWuHq8V-E^9QtEs3+m% z3{~M5FVoO?1Oy@)QmbO?Il-la;-|uMCs|5*k!%=>0;*bvdq6&qi8u-f2v`-bByZac z-p?grSos{-gT>-SiyF0@pP8BAgAF?X7FZb>nc%OZ`gZgd#X6xaPWq!%>==sFK0Iph zK6Qp)Q@Bwz>m&-fujw#h={j{wFOOAK$Q&uUBq|^6emmpDY|0WFZp2IZNFvF+P@YW{ zHZkF+rlz7GpArxcP*mhTx=>c|v)25VW%1G@P1(zVID$M;GQ)~dWw4F_P#MH1(sOi} znd03Fkuym5V+v(bvHXjK5FZ7k;|zFS%+|)Ls4i2j7c}1ME3@AQd?CctG;#aj@YITC zbVw0<)clQ02YdDJeuWFJ?Xi6A2|}S@@JG)SP5)OR5dedFcX>#S*{u1zx>G^CfW<|W zRZ4>Y*6&Qq>B`72UsrHrMFCpQV&yue$#w<{3v5iTWgI5KYJ9Rce5J9c|LBVvbwI+V zh~uo?O35!I!4q(lCb04W%(cBXo&t3zn5CBWq=bZMVzMiL<>Y_L$R1QlRdKYq2^-Yl z7Y_Y@i-{fitl@iB{T)msmo{kq=Y3(&(cGxAeQ4fu+MB4YN;kwA0jtX6^875ddb-~) zMD#SO{J57lA4tJA=?x?Zxreg8Ki9@b&}L6i&*!^Vopxi_rF|*c{cslyP3>@hXnaCM zLJx}@l3EM{7YV7jz*AORu?lSIV4(>SSgsMIR5BYB_XOK9*N)e)1C91bs4cKZ8x7N; z0{&<&!Q+@x^W2%N^S$<>7Co6{runP&O=2397ZRi6TLGQ_Jn}?UL5P{=;_U0G4Drh6 zbaP2h%4wVm5(Do@5&ji2{nr~4-wELmLt(=875m7jC~^u4hxVnNUD|Mf{H|Ul2yMC# zD<`n1=`f;lGz-6rozr{0(3^=r!{X?aopT#x1rVEeI(n{LO3qXrZ59hR zXPd(wEX8%qPAmVoBnMh&m=4d+^D_J^`yJ#U75M!gq#6&wLbt~M4APB}+#e$&Ll^Wf(5fGzMv=7q1+u)F; zJ)rE+e3N}b@ku%90np)=qrW?dn5lk#s86EgBSnH*Lo%P4q!Xc^ww4+@;bO`sU6~Hc9?)lIcsv@zsrh|AK;=7s;bW z5#nzzIL6W~SQJHeEkp{%!!`wp?}jvP70_3MZ#gq1WFk)4vH2_Z=F^{lgLPwNj+K(! z(iQJWxqM$83Yf6KuLZ$2x+gKocMeYW)5I<*#@>7xz(g<4%VZwBbeEcIKM|Z29w}s} zb5ivS1Gz!B_7r#H6q{DkuVH#%nm%`(dE>^%RNu>MGxo~)c$l=-`$C&!p_im(WDrM_ z9j?*;(U0$4t?ZV~ZEf}D0ylxnWl!OnYW|X;c(AF^DY}&7E=5fqb|)1@o$A?;%|MbH z_i*`9vfTBiy&C#mA=puDU!nGFjMDGG^DiDj$M`}`vblN|N zaTW}TSDrYtJPMpODHw{SxU$k~Q6`Oj6^y5em|fOJyoAR2eH{s7Nop49k0Gp$6V>_ET0Ssz4orp^05!W#Pi!alCxO@@ zHbmdfAvPhijyqdEdlL%DSjLdZ1->*Umx^~NWo2b^2&?gQS<2P*IoSzf5DH0_@G!o; zloEq$-k7H-UZ2iWb_&*>vOdv(DJaVsz9R|CeO10S1f1(vxg&8A<1{xg6j-X-;KU~U zaq}dF1pgG+u0eULS?yU~8pX)O)CrUmtT(~=ZGhQ|5>Lq3bkmqW(ACi1X%^2|5qq(S zeFiZ}QfHN=(j!2<8AM;lP(;E7V|&k&janJ0&ZqFXEZDUkK`zM5*I^r078bOy^Zo;J za*=4fGI9^w)>2yQ*Ic->mrNi$arfzn7sUVPmYW|Ar>=w^!6|vIDtz0xkYZu(&ddDk z$B;$Jir?oJ1D_)lifR=(BLIt~Cpu@xN=+&G-Z|&{q#dJ6b4z^L>EY5)l}9Pr4NCI! z-f+*YE6!>Y%km@$Sl4vL;maqOLA<^&lZP2*qHNOhszrnAJM(C@E-?DETac4yF~C=z zt;7pYHJfvLpl>~k!pTXfp@i-M$m1V<62)GBD&G=kv0uSR9wsA?9{KBvh;bTDpnSEH zmLekJL@xvuY>-hc&;w|J)`trX1i0F}zZ3X_UisC!zMI zJhIsIZg?yT1D_K??y@)Dp7Ig9EC0EDXqKz99h`p$cKdIBs8N7@54_S>^=PYKk_~Dj zolINi$n#*X`!c+qY2(%;Js4?wep?!g{1*9L^vHG3ov7CenzicU4KEh|05^dpkRW1= z1mY9M4A5y`?9<{xEdmOfMf~v34r!S6+%js~D9OqD@Gd^6a^EqA$^limttz~ia)PfF z-Enn$RmsVzI3*iC@(@Lo0j@J@UVX*8cUh!zZ-sqbBdzA61?kwHizNoLDR$28eIYP~ zQc`=%T#N_K+9mDg@uSMHaximJl82>n`1-Yj=MXW*f%51I=iKwuA`4ETvLq@zrG(o% zE^hz5#t`IxXC^t*OAMFJIha_)3wHdlzAfOkY3dWhhQY`_LJ@_5=4gF?IRfTrnKHwlMhR6;Xi z0Z>JOiQ91F8$lu)XN9xUWRC(b1f}kmi^4#O#}mdO$#WEKt(uYJq26;V=X4Y8f6$$B zD`K%BA5a%DKqfh_{I)+Ft4eQ5?kLBnM9o8On1Vd7lq!md916S`9=(F&b^PHr(f9H6 zoiFi;=6{!D*C-&LfF=zK52yHe|DK)q5v#{m!p{$Wfxzea#DJac@lR8dyA3v_jxyeo zIuwLIzpt{1{+?b7$725ogJQD5yr{dVEH;>%H(lYMw(%JpPEOG2yeMuNlu)x|^3MHi#pvrXaT*gbRH)F8qlee7>Uez@oIKjT}%Xc#5}Stg;TW+Vl*G zqw`~W5~h7MhGcueo?03<}6)^dQ#lq(^O02aPpzrK^IyI0iw5T!sHNJ0 zGCt93<=`BSz8Cnuo}}#e;{W}`OUM^PU1DZln|q+FC+}?atGuGd7{{r&s# z@8H=h7eH@&-E86LY%6l8anZL&xdq;J3s2m}42mIpabH{D( zj60pVX6RHc$6J5=-6eF@b5035g;Q(&(?Wo2j$zV8 zn&EP-kjirHU{}SK?z{$@rz15_C*I~kQ((7v^_-1Ofsbs0CG$&myC14!Upufdvs!;% z`@4$8yv51Y|C+BZ1mU)dr6mWzQrp|-o{xEofLrs6sXSAsEBhX|+q)j0>bW(3mEXH7 z=HKE=BQ8^Xq%Oe8p)A$W%NwryQ+u5nD5y4X*^V)y(#U^|l>4#{+*@_cpm8goSpv_^ z^v0vWvh;L+P#+wc8eIOG$slZf;L)xm_wa%y_Nwo#&$i3ZS3qxB2c{X-nN8)S@F5F^ zSG`(4EJx!DoZcpZkf^}4g(9W$3{=4LfV-&do_nZ4SaV|jQ7ur{J0wUQ1sl5eGCRRl z5Yi4|O7#bGDF!o}us@pq_?|0owsBpyY{Q-MXTECoPM9pyB*^{&_T%N|mdIEMVP~z! zV&yoLx*k9X{Srm-f1WHcDM@d|{{ryZsA32~xJ_Nzdga*fQtuPbGp|=JNn}#T?_u#D z5p&m2QYYDcq&c6!!WzSUfu+QfFu5Tb##0Gw+VJGk4u2%Wb`lVoCOtSV2H|NGFFYvCS25Rm!%1!Qc zVF!QED;I$WV|vvD00k5PfSEl&OP-3N00MGbxkxZrSnuCqK0z$mG+HTQQ_A2si-FRI zHu%}q9Ei!Qfj615eTdBGqvezeV#;*|-q-SJXV=T-wDNGBM$V7OAv3gDisWn`PTMGa zv83@Y><)FFuS<9Un^L^1g~8|GmEjJjmBsJHd#T!hIide~RN`xe6nDt^C{Al*NkG&^ zG|@DaFt*m{h&Lt(beTk7ds$M`#p+r7mXe(x^4n1m+IbI1WjZ>x0p4*HX2TVMuAgpQ zOk+N463O0&3u@jCmTlCOdKHmI;+})UcmooK0Bd}(U7m(wkcEpY2sW9>-N8{m<%f%3 zJ$GN67we*L^)p*?T}r-g!${X@5-R=0$x<#Oi=-oV|8U%GTY=}#h-8@V3u~c^49@oR z9VP9k)*qo3i;*0e;zvCLx#r(W+ws!KWpxwX@4`EwJ-03oA|(r$@{tWpH1}xxX*%x6 zR!4U3IAiuaG))S6Y{*Znn|J=)r&^+E@NkFN5alIza zdCh&bP;>vH+}Vl43nlB{rc>=*>>K0Z6sLk_#Aaq@|Mr1PUM4B&@6�-=>||wK)1| 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 UqivqUk*O$oX=QBQJ;PW32PUw8{{R30 diff --git a/reference/slidify_vec-4.png b/reference/slidify_vec-4.png index aa4c9de1afb89292338e68520ec9f8ac0e3beba1..fd887701eeb18c004b4e5e4cce9ca3567358d1cd 100644 GIT binary patch literal 92251 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�+AEzP@X2ykr71L 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 literal 92249 zcmdS>bySr57d8$fHlm113#foftCS!iA~Ap<-5^MJcUd5dZ z&PknfXW%D;VF|17?Tn6u=u`L(uU(;X5BPT8QcT4L2Zz!d``?M6sWm+uoEtcZr-Jg1 z(Tl?lj`DgV^=mHrNCd&#z`N(f2#NB(-qJg9|Ay~5hSw7VB*J-~cts={7v^Pq>*nt#!ohjmn0Kc9&wHH5Q;oT~Wq_HyDm#}og&zwwmt|MJ2+{a2-VZ{mNQ9p$zyAA5 z&jScoz2ej5QX|JZQ^GaL7p*Oc*DKEYxi6P3>}}4`?UgPS4dOmuieyUAF{r_{#t|h_XThIcygU89X4myCUn=G=9xgNqw_ofdtTBGB zP`Nc=LRVCIw6`Fbb_#nV&koU=3u9lt7+5l$q( zQn3+;U;9CubiTj90G?OYet9T8=8=Oqa$;gax1gUEVe&IeMpaeyp2SJ)C2!Eeq&{TM zRx9S58PzDa&z6;wW8|%$vYyK>9zoJ-SbjZSw$b+Jq$*8Dpi%edh~^-^txwD4EBrQY z(=8ES@1FntTpvWR&vlW4vqe3Y!$k4jlE=ZCsGgo40x1$imA$&U>e=g+Q9EZlALB4` zAMK4#mbkxCJ*w_88NlUumlAskoYeQ8BsE6m2kXtDA3oejw~X}ieNyHy>V{UQy7%Jo zV-um?JZFsYhM+6lMZP(V*=~0#obmQ;5v1*G$4#?=FZ7@2e($==*5@3xo7&saL!~x$ zE0x1ClR=2x(^II^p&>x1h# z^sKBaAtM*)SGV6)^Kbk_zaoY>~}n-pW)$aqb%p zd`WL_I6T^4nYL2Q>}_mqy*TgW2*>y=KIscmFYU$Qa`X_V>(1(fpu={LqnAYz;^GhR zYwwLXFJxai3~iv^Ho1Xnh7q=M!Yr~Bpq7Wrqn0?$hYYXt*ftstm)Vuh*iMBikv9ZU zqjIIfoAr3Nhis;{^a}d@QPoESa6`<%vVFOmyMU|R!HyLQ-B)Z8S8A~_-Kx1_q^YTy z?sjTDl4xzlKyhuM+@PH*NhV1oWox^ZK){i5!Imc=g3TbTe`Mp%?c4RAU^b*zgyUB( zcvNA7I}Xn1z1JkpN4qn~^t!cs-@a#ZC@-g}cK)6aLM_>n!KqotjFL%{#s*f=9vDs{-b zIKQBv(0WR|&}{H0FU$S=GNM6L%$=isc`sW_A5Bh7Z2q_tcbAS%`1I-1*5$+S)zsSB z`}NJ)Lfbi6zN4K<-@rhYLQapZsS8o9pFh%wMlQ&uN@cH-*4|^cUsSdk-e6q(%0r;# zPtGBZggml2>@XVI=P_1u!mKY>5Xo*k`@DZ?OKyHNZrdb2M?w#K$)=_z*})>SLf2jE zjc9mC`=x;t!8d0j%(%=3lHv7WKa$(#vwnN5Sx&LVsHVWd>Kkio>y~{T?4rORX`Lzw zUQIX+`&P%+>2yv837F@Q9MU|tdR3u+bkxGI9AOYEBPjSv^^0KwtOPv`jgWbnj4vTv1&5H+Td(wmZ zmtlLb6l=lB8nSL?*57wosVsgP_4!#;b1t}MlUcRZq)35V zr87qS(Af4~TauWO96OwJU48w?L6_}ijfoPjQP=JT#sy*5h{T(h;ehA(Y0I1Yo} zZ4bRHQO|iWNO1jOhbeY{hY#Eq5Ey;$=f^fU?7qLGw>4*7>R)|?LD5z5udL9ML*AV0 zJx&nv7XQ*;=~Ao|_2tVK*?qk492dSDglUIVRKd2ofBlkZDTY|3%r-qwr_L7-^{#p9 zffqiRPF4Nr(N?kS;OX_Mb3Om;*VT(BEY7Vf)s(}UqN*!WKYvzql#JtdYuTcFWY1LC z`ZHUtl@pGf2)y1MPXGGl*qW~D8YtQR0#&ig<~H75B_#}7q7|)CW@}VxM(sR%vta4% z`K#h)SF<+m`RAY1ti9)dbhsb2A4vH~-`t^mSikimIr}P}pX+(YlXlg6`(>meQ@A6r zGV-K~%L9d(-)hV{6NRUbK7IOxw-NxSCJDCLiHnYLZd)n^D_cv0;r%%(1^WDz)kjtO zuXb7<;IAw!m{f;;3=P$*l6rIIBHX%h|JL&rYU~E6;gamMB#we@S?W3ya%2oPR=N-Q%cc=pHA|>Iz_2D!mAI~C2V%XwcI=5)X@@+ zkP!P#h3sAIIh;fswXEFil1P0% zmu|%q1396%1w%+964L+EM%)vv~P%PGQXjh&glvOd4f9>dW1!LG2jF zHbIpGK{<$ouS-wm( zgwq0AmCDenc28e=ZAV2kH&j|cM&;Dz#^bcEYtwHNsIGN--W{`Tm!1Xdrqow&T$mvh z!!zw{Bp5rhkHtN4n){I^Icw<}dRdy41JR7C$ei-!vIm2gNbl9C^V`mTfDnmoWt7JX@bt-2zS|>P5AVQ6fnbG1_p5%85!UA z@9%l=p7gyb_Uxu(h}ajJ#~?iN1jnJ>qGY( z)Asd)esuc#z`&n?DUEVGAX!4<0zla^Wf1H1x#b8uPv;KFeIfwC14+|4hi#iMcx88gBba(DVEzHEa4~E|O#M9~=74v&jEUS(;3e^)`tCsTUUM)HO6@I;@ODKD0`N{Ffr+eJMRY z{_!R6+Jy!=K|w*EDqJV6XrFBY?8$k~i91ptzxLuTC+E+Zmw>WNSX=^If@zBf%>q9K z(^aYR%s_ECx*Lsf6rH9DoR2YV1^I+nWUt=vvV2${vw-(#~~(P^|-_> zh*}_rUhZ=mJaUFcc~RBge5Q5#*EqKr-^4LFq^8SK;gx*?N}gmuw+JNQK|Y}yn(DT)FF*XERn8s} z5fKUSrF40hKfKNc&l{#Ult;YOQ7hG^6?ZpcYEFK15}=D90sqbmpWLDc*ny}29|OOa zo;8-qJ~uZvZEb67TY9*s_Vnpn^U^6|0K3wcyoKNpMGAOSEtk$v^_y}c-X+K$A01+X zJPs!PF;kh0IVDfdpFfYp6CE-itr|9|p5cvv=~j69^yxddGn2dwUHN(v8~|~U?AqT> zRYH9+UA117s1^2j7$uBrrSUppXFnt=YN6Ze=p3Ph+yOPw-qwzxn7QR3{S5*Cw{F- z+kiKfbDHd7oXtZkyYT%`m9_&tC7GwpWZaqf zuGD>XOfW8R|8RTsq^$JX$3pYs^6x#kbsoH;cH#^h1vOgeMM-!4-FbizoZ*nZ?X#8h zo}e`xVz3AlPHCfYVc0pv=JKEa?~y9cw8gYe> zfq($r_>so0j!5a#AY?w0%_`rG=trA?`8a3V4=`x0(6F%E>6TS(69nfn{U67Q3d4p7 zyD~`SzB4YqO_H`>*ceg4@~S6Y?v9NUWHElq0@MBn)#yBkODHETMiVHi^v(nvmFa)o zYhmy+xY*9SA^9#z7tX~phioM~_HhUPvoL)CU|Xjk$SRUv7JIkxgxCnea5{lk8N`4; z0fn3WWD4NQ>2<&a8IoGUZQL{03jut|jw{9cO`nh9b;|Fr4}U%*e`hc02+L9@8OwBa>-F183_gEH-yf@L&@Y)wfUxhcj^=BdL#B zxww?H+;>w-H4hkfj}{kfuRYVcfq?X@^e6e6Q?MI8FKti?-AHR(pK5OHU}0nHUbtzQ z%J6(UGqt;tML{r#im%1!UVeW5W`__#=%=mt_u8c7_jTTm3VDP#r}$jG6S+Vm;=hV# z%6J8;Xi+Ms@9Ge)&=S0Nv)&8jL{tkDNQKV`G&)N0$wb!qk?ddle&#>pw8MWJ4Zw5s zgRaZw!?XOjZMNxBmJD04itUna$MxiH z*%yA+&26VqK7rCcwd~Gp&4W%6%RQ+H zNo{j!5IwU!+pDC7;cnazhG5=W#ZtbQFTOpw8*~+$CnA;(tXlDFJ+PyoSmlY4nnX&l ztnFg3pm#FSkL3Zn8PD;go7T?$;cpUa$BUjkg z8Sif`Wk8~PXEs=Dfr2744R92HTr)f=s?Y@OZ07g=eFwz0&nHfv+36954N_>>c?+9L z>9zohb}I~=Yye89%wa`yJWpYcx9!XCRh%i4CnEL}#-17xe^MFkK_J`~@*1ev(6zO- z(k8LvEiIBLdO_C+@+79%hNA_oV+I>@B@YcY4>$c77AO^0s`jOz?nb;b8+F}ycDNCD zylI5z|9F%{Ve0p=JPV#F=U#Z+YuU_PJnKba-T{-m38B$sswq?)fsnDa{W1Upf@EUS z_~E8;SMm>fj9Rg|h8w0=N&MNfUI51F*n42B!%Np6#slQla2$VEw%)`T`sq{J_wP>u zrGyW(3zKLhw+kGriw0ire0}-?HV7NTBmhfRotT)|Q)Xvkx7a5G;7_jDeE1r%;#T$& zEOY~wbpR-ImzlYBXseMXXopwHNP#=(#krnChL|I}bOwMG^}wBAla}0P$xe8BAing4 zMMX1VSI_rmhA)>)Uh2)!P}|>L;R@P_J}!I!IEB%s-?(rdh}cY9Ev{kP;L=6w(l3r{ zI>VN=7wHCeHzIcz*cNQDH9QvhBk3eI$GxeIdovVZ$O=!MyoUNF*?hRns3Ts`xG#5{ z9z!v^pO{hcn^v*p%p4YQ6kZ$>O3R{QVPHClm6iiJ` zFK3FxTWMh-;bTng^$MKl7cWxrDi`Rtu9qIdX~~Ag%u(g@C!qWHkFH(Bu?(Z&bN-^3 zr7ZaVEbGv3Ui~sT>DLQ5z0VKA=gUPSvXAloTV&L+S)EzbDUEkBqYpN%?7gOqCNdNs5E5qRWBSbvE8{N>ZN_E^w!&3pbEg5 zIN}vb5q|pgE>qSjdJ`hK@!_KzxObSCB;ns5IC+UP?rlgS*Ecq%Y+Q^5hT40;{Jhq< z^h91)H#tj@ar-g@GZ23VbzjFVS4ni_#T^|>OgSmygwwt>Hi~T&0GK4qh?mV$%>4H4 z+s+1lC@~e)GA8KRL8(_03<~ZyB$US9?pe$;DgntW+QKHxi9Y()`uIp7cly9R4bd4GSYq7Qf8&cb*@=hYAf<@e^2D zivQ#1=YVhAn~t)mD1t11=V9Fq!@qi%=jAW%ht4UVKRcTZ0)+UGA(;EG@OIO1d8m}G zC?z?$anANk0{N*6e`U7II{3A#k+BJoB9XKJKx@4T&So;5I`O~XV~NB$GSy=9Y(`W? z*O0^N*w+`K?{3`qcLXhKlMSs?5NFf0YrUqO*PNVWD*sjHZr%o5s1Cf*XDmLpiSgWC zeDYWLdrR6*Sh2RYrb+XgW5U*AJiw6N6R#x${pg>~vU3;CXZ6uuCVuTXW6IbQ7LbW5 zaWxUnz$x{BpaMeGvShdyoB!V!wfd@iu7?Ayo)IxJQkV^(GCN2 z2*i5s;FNLve;2{^Lv(c3Z&6GWvV8o{39{9CDA)l!=PNVO4M2nhEyKkipFLXp?*e%e z1XA(M7cRpomPh=cCx>GxpDGn2JNP*zB_=)p@~Qv*q3_ugph@v$>F81oKO{qnbS(7o z_Ya|^m-U*j%NCI<7LHrL=-`>sHxpomLU+wOO;)L;r z(So#yB?%vg-s=0i`Z(0du=3e=?%YvwYytX+L$B!?>hVt!K-e8}(tIhv1craYo9IXo zisW-CD%JdXZp5aIyFr~F6cPGL{wHVuF8J7+2^vSfnXiz=OKo~nrKz!Li=4|mx*cV+ z*ms{ zH?{lft{oDI{AJ72ih%?)Y;p|LWW`UDp0t|?JOYC4fn~DQ2d|6w{uPN`Eg4Q&Xllly z-?Tz}b#spaIVp6nEUbc8*mWa7Q@uds0-eU~InWnA44a43zI*r1iBh!2#r|Ao$!{GJ z2glOBxw%1 z1c4aSK?T{iP^G4ar6Z6I11KLUA~$y?gEBQMo%O3FJD+>lYx9>+4LB9E?vqj$KNw2WnLWx~<5i2NTa-a`OHzgIpxwOP-Vn zZ+h=9-~IU+hufYlFii_p`^(+atx>H-K!T*&R-L2#yO|!JMg|8~Mcu$vA`c37zO)FMvYvFfl4ytvPUBv&WCz zG$Q4|1l1YrM?9y32%zmRvQS#84^ZgH3|~Ks-(h#SzW}f+m=;iBRD*$@p2B*IOz;0j zewTTywXJPSwHl5_pCAj`mZ{%nG( zR0Nhyp&^h`K|=NdkyK2FvaCr=>dIzvRp&5Ig5&VECv9su_cD4{^q3@w}|(R_pP z=bV@0%ed;xTCj3^AkzW!-ab8oY}q_hMNWmENYMMDggp=>jL1#(k zLXBdR&w=!UNZn91C6iL~3vmex7>k%pN<6t&k@IJVQyD|kJ?1$m6%v!Dk+M*M?1FBY z;OtnfU}gXLSps@W_azsOWMvugC=#Oh=CWiec4J;o0gFKb?wyTe`lSDl}un!Dv z6<60aE`|A*JmelM45n2fphTL@NFhcDR9{AV&HH#~{c*=ktzQ2+_}NH~Zn-aEnrgqn zB$>a54@v7+mqNhb*oi^UH0ykvZbz9EG4enAhOON|j(LjpJ%FBOJK{7mx8BUUZ9GY~ zS_S7DASRNtQOD`2SEu-oADql;`bzDwr>$+5vvT9yk@61-P?^FPY<#^E(I}1bt+^`7 zG#zZo@%t5$ba$*!nW=1ZCa#ya+|u{0WZeR*vx4+|kWBH(Gp;BK^Sk&Cbm_2VHE)`I z3}sXTB2pNnjjC_8wH%gXkD=Jids+_Mic@y^usK4i7j^uxbSYFRF*L?Z=2Zi4g$%X( zUG5nFF}@4`;vGFu5cIPj#$(>1+)HTGEl-Xb} z2%9Yip5>0{WEe^br3uWxywBP4LZbr2Me-6lL=>0zT-E+WNOx7Rdh3M-Vu(6&i|+|D zR7_8?W>EjT-|#_E_+YjEN{Cw_MPK^B^kw?Wm8p^KzERvn2QxxPqtoC9v zY+jtH-x|qZ=?*YI)^#1R1m_b39U!US(xxk+1Qy;9zRuTjs^jHc z@0R9RY@lxCRz2^SdFOw({-IWs=9jEQ8!%KP$7L8xyr3FH9EX^{WmH02%p`2Xc8v|I zJ6|&gD?+oWQY_X80w`6r#4-WPp@W(tv{D_XCv|r1$DNO=8k0ORjvLQ5K4lhJphu-x zuC6Ld|C@g3nN(EDmV1>rw5*Jij>_m>=7gm;{HVNy;F>QQye``{4g>@N=+ z8ym*Mvb3_lpvF@++Hr@d^23%xZzti!4ieRDsp%^HRuRVg_qBkFL<38a1&mDw?47AC zG;qI%lhnr@L`v%8Xr7g-N7CANX0&(aGtUuSQx0+1U$TzzsG^;7MaUo_R%>aICqdKNT*$d~<0BAqY~cp#gYSv3vF8^Me=hm&WgBbwtpsBX@j zCi%4RUywAGg=ys?bY7_x_%>W^?5miOxdrn0rj{EmmXr(bRmHsgVv<7-wv_Q}S4Q0o zl*)`51z4nH$IodR2nt@#6pEKWe024nby_We0Zz9CbW8>{L=I|pkyfG-_JS4XOt@{| z^k(#rx`LcbemYNfw0}u9j{hBjnhj41g+*5Siph2et+0e|bK^N3yK~q6&Tce^wKdb; zg4SeDg_GH^hez}SHfCh9xoW};#y3nngVktz^f)Id7`d4$a7dqqiOo1m)hOraIBsp7 z|IEk5U_p+kjar?HkMDix&F6nN?d5g%y}3I9WNacpviF`QQI98M(+@EWM(Xr37k^)9 zW~KSXO=;Ghdl;D_nBSC*rtM!qgMu=g0=#@o>DAR>Y)W{6?Kx|^)#BV2Bsinrzkh$bc~(N$_clYZG80yl`j9D@mfvqWB=nFO;DCBy zP!NF*-8ntQ%+U5*(ZucTi2zZ^4(RYhpKtDSc*G{;^9uL@Fd%{_{BC@?2?!0KQb*mn zoHsi~F@P8|z+o^@;Z)#+%F(PWd#VOCGq87aO^hgjkTiBW4RSfyDg7z|~nQ-3pBJ!tS+8Z6Gl zR@ccuCmVi!eHxhz#4yx6G6SGE^mE?2rE0gJ&p?;5TBWIc%sP+RuRfmbGww~EZpEwy zQX-R|MRBHso69|&yU)DhzJwof??+m`oMQInQX1>3)h8b^*N6Mpopke*|Dl>_9EF~m zo9C#rDCIVv`=nZE{6i-Xd^}*jJY9bMZCXjmLl8}uZ_2AeA>I0%j*-#t`RULrl$5Oo zgi;df>e07u-J(Tsb91}zU%21K0$h@>pIwP{4#pZa5qm%v(-H-eF8AdneU^&JP_w910I4tZTFSuzy47+!qmNm0JSWLS zNl#!q`iS2)E%{q~Hf;Ug>Fv_$13eTmtN4eTQAg?Cm{pG)rPc zo&-_bI_VYXsDaddD#|#y(avGlabuXz2)VV`PlEt@SUW{jR#CV$lBlsm9)T1ZCokHd zPhmY`ZdCXh_ZQH3GO+UT4VxU6&cwd3TS_3A$jBIWsvR%`Sq34g&PdwKA@US1 z_NQzijPx^0#f6*<;*fGT=93HuyytK6@~U@9;Gtuz@2dLQWwTVXNnebVM0=ii#9`di z{gs6<)#q;pNn7_lTTxd#Jb=u(k1q_Hm5Ft| zet$0DI(Po}1^HsnVoT>Y^8J_(iwxIK$4vV65I&tVmz9*Em}vi##%tT#A+>ED*8rP zAzSp>#Cq6F)p-Zu_E}AO*-d%jCo?)!Nt3Js*J|K@(}mhOH*!k}u_q>*Oe;iOnccuH zB^|kcd?X$IU}ZVc0wY?Y7JK_yWVCypf|yJVBchq&m+@zFB^t_yr6~nli`oYUX@8lT z$Dt0JvobdQ`UOUS3X#cqNG7Cx+PjuzvHNwClsJHdW4;`KgTs+vTBtEjp$1 z+S(qcN*;Zy)w5m5dbH_NYStV!&!Mwx`t%P%_he`X=!yuwJqL~$8CC>ZY#_ebHr>6m zYsg$b>cq))4r|>&S}Y!BEo={CRx<__Kyxr-0XP{*_#va!)mI7|hqkJZIWCB(tkV3= zE%HvWa_l__vF97q?j8QY3rU+^)zcKj?GU7P zU43;1pY#Se)Dd76(Wz;ll-#)f72KgyravWPzNmg|3Z_j-Ee@?E%$gq~kj(!F>w7Y+ z?5uqwvn`jH$Mneg_LnOmzdYqDR7Q&L8@koVJyf^^^aNh7$Jje_I-8SkO z2Q5YxNlY(;{G#ilK*@8eSW2Giue1=~)ZEzkoD0Drl~dmSNV=FKD*4dZ%DS2OBE>Yr zh9j`_fb6jX-ie$q^Yr9(Fg>9kBho1u@E!e_)QC0fKb|}NH%+Fk2ZHm3g7>G=$iZjg z#p>pl&G&?#D!19H+)S7iGyyjWB%*=a=>bJ)A1{d^-48irMT6Ey-u-v5WMpNUUFICU z%#lgU78jAV+K)=NN0C(*bnFzO3~F4!>&qOb`!V4uGm@6f>x*>?-+Q77tSBTkj zUeTU2$x(>#FDaK10)j8)L(3XT z(Q+kB2oea~56b4`MwuJ|}gI_=3T+FZ|j?Zo5;YP*}5oOELp^QE^Gh zo-CDuHp|{sqW=v9e&Lk863wr%Y}X%|a1)t)Pwf?z3lkS<%Db#Y!U`mqy;u>}5_`M9 zinMbO^VUvYwDfGhZRigEofCIHZ07 zLB`;U(38s|f^!j5J6 zkKj9*a4em{gm6-Y$Mr7*;>kb*4oO9o!l$*ZWD=@mVbUSUG`1_ddBbU=#$ zdkz-QSMIg9wJADnEe~gIvvs15g^>t3CJ2T$R%7Dg}_8Q zgj@R|B5z6URB1+s(&h_xgmLFY(00Mrk90DSO9RzyKVAn3yNoAGV9q<3nOs~o{_Wch zyIuvQIq+}F=;$QwZLh5KdVt2z*{C56>`L0ukN8u6PNnDNkCBn8^IMfJ+p*)~xHL;+ zf_e*zHiz|RP0r*+&L;t8p0s+P) zJpn)O#JMJdHPUdb=GAl_(di11Z|RE6hD!1tq`sE@8^+(h&&M5kcY);h-5g%#hou+O z(hne$mK}Nttc81P!FX*8j#HBw&lB^5#i-Is;H#$Bq2p)DctpLenMID8xdUA$qc{ci zb$%P#1SRZ(QDOJ67(YUuSOIH~ZNFYPR_*Bmq%FSa0j*z|y$79N|3Z}Kb*<6da$F;h zSV*lpe+0xw#n9wTdmIWP7S`ML>TbKmrR)L*>5s@{f!^b1A3utGV9cP(DVe|n#YhTd z$0}&>DXnw_e6@?#Vnvi`Zg9vC({j@yj(4Ts22vf;h;KsvJX-=9LXv2ZB1k5&&hzwo zy1HUWFxzTN5n`#`XAik`NdJvP@pv{5uakq@;AfUf5>}cS&C9K6DANoA%v< zB0~b}+5i_naig_#^H;almMH;^k7VD)+b*S?t~h3njpaI*Z9Q3su!fvRniZIZ0qUXF4XHJA1ZRZ=t+JVA^hpGgtF+Cif%9GZnzq z2h*0alswK+%%(*!(`I)m_cOgCFtRC4b{GxlVr&0CD{x#Y)Ww28hn#aPHtm<4UjRuW z9ekx&Lm-stsd89<8I%!|=nbC1zq>|W8{#)z5mp*59(C^qrMT4$#K(`?A<X<3ZHXN;w!GV3-N70-xrv6rc}0{w^rzlGpJc`iksr!i7y?}RNJgr z6DQ;A31e3(cMx?lV>XdDH#NQb)Vh?Mi0v*V0){a z!LEOenwq-gDntET$nv6rg0+Ztyc%!`>qV@M#%{;{y_Q7`jAN}751zKS#b%qE{514T zzV8eKp$TQ6dDdpsa!<|~O7^J&(xp)?Ia&XzMC`@k4Qq2)RBk?yx`3@$)QL* z-QZuGGfM$be1iAbZmAGWTm|7DdEPt@CsS-j_~zXox}Q#J%wDuC9u$Y^#Tx1PBs|y>!G&jjC+}`WXYG zX(eRx+1mLz@$6nrj!s1-3JuF0QM-V2sqw|(2*l<>$yKo*kT1Zss& zHlL~v9z59|x{AutFfnest`;vU5j(8KwDbBO~8WkCd{} z*>b+U8O+O6;w_rAFW(5?r^v@-#CDtQ1!+EybVfMK%Es{6VLL7f1P-1X85vB8?SY9{r!52{@C%fW!1wxk1|A+&pf>1mM-u5N zz#~Q%e%X)v=?cQ`b zQRKBEtE4MARjT*f1yJvy88vV)JI{GK=*F}ApiHGF$o2{~UrW7Es4UxjxZheu&TbeF z#tKHjU07?Dq@<(|x*7D=(xVx$C?SC~Aa$moMcxN*a z3wQ}B57xhe$|M(u7*YXEvW*#&hV9XXTZlO0SeDAHIQK(Lnqt<&9EZ_ERPsZF2jnY{ zuxB#l$piDrDf$97wtmYUcZ?@SvZt-*Eh00Rl5}B9DfRSIey~AF{lyy@A0Q<{C#+D) zG626Y`RDOF(;l2ZOzTMxclq+4M@iAk5A~H6tG$i7mUf3jHj_fv{%{Uc9FwIQ^y!`Gv=;&s3v zD7?4MJpLHVOT;W&MDLj0~QOC)Pz_c0ohbnwE$y3f%&BpmPJxx9do#ozE z*lu^Q4jD#^ii*k==lBV}S%(&T)1&Qbd~$Y2ijp`}FRP`#`%K){Z#inLU#OTeoid`l zb@ZRrxe6tbQ3QIq`q(|uVdeHgY8=iETNNLPBx$|NO23G8H1Xdr*=JeI=HWPS9?woX8V(lm zR$9@l@wt${BtUz_RByTLg{v~Lj3LJ2aCkRb*sx8OP=%a(h&$xpJI}eSQNR~?tUJ=K z&{7lN^WLa?*5MFyy=+sq9=b|eF4&!3sSk*9+UnOGyZ>^LN>c|>Rr_%JNW5D9(kR{t zc&Ds)R<)}a^b}T~AZntbqMCt=D1lEZ2rvQ2M#IG9&!SP5Yt((){rJ!Uy3yt4$@B_6 zaryu&mX3;=efCuPv!RkB`zoB+aP$izpqji&Murf|3?*<_`o?2Ie2o}4m$u?;oEbMY z%uws2m8=u>CwA+>4;v{Ay{K#b7OuyKf+7J;Nk($1_h-&JZ!kFEzG!MnY>Va|;&9;{ zSQuQO>?4Xvoc`uI-* zVO||uSyg7gH1EIi!|DKn;vAOxB^xCvhYK%QO90qtA4pUN2|J)WyoFN&R z>!c5mCOR_{>x*&q0!QQV9>?{Pk?iR`Yz6uGIMOvgb7FkfCT*1SZpDyjwQx=!G_yx& z@q}#FW*0lK()b1mmHtpw4D)G?Lb12S<@49G@rtpSyL#NO2CLmomuK9Zqn=!(7IDKb zDu^m@st>oKMhgec%d^!{9<3bcdl@Ch6(B21#_~p_O;nZRIW~))K>dkFVjQ_(<{vVb zrZ{auWTI}$biY8~>Gr2q-IloazLFn{0=g&T%?58B9a^-XQ7Rs?mWXJV5)-=@`0O?* zXUkVRv{QzghWXW(lbYj=XQ|0;j${sw6Yw2VrQ2(#)=#}&(`Iu_97HYhjC! z#6E0M(&-9lBY?bL)v{2fP>QwnS@Ak7t5=UyiN55FA`@`ujp8)ZfkxxLC3|So#I1qy zhB297GhO7r&kbgy$v%ozRZffg=&&=7JDq0kdpJ;xxONw$t16RL>=|e=m2?DSD@Pf3%letS1Q#5ZHSF1=yu`jgO5dKPy?;CSfkcOP&64f+H0L(OqE zRE0v^6&}v0fSsM4c=QPLm?jk&t||`TW+{*F-XS9`=_Di}Cj8&8`PhChgp6xpe9 z43tT!g`a|Bu?5N^ckJ3-&TqDC_#U$FB%6nOas+Ip_n=OH zIie&(R6*=l*O$BmT$KB}7sKUIuD^zmbhGwaNDjWvoPLe(dHBtKpLu|B1p z{5di}v!-gud}q&u;?3Cx>m5r(?qJ%Hv;KY0eaBZCHJ9F%_lm!$c?8O|PSaZZ-Q3q` zoxJFdGbUdhvE4tdN0U3_Pt2|<_FlOB_wby5eaOR81D!gC(6E6J7#&Q!iC<#5Wx8lH zeJ_^Fk_bHmjKZ6~z9gmPy|TltL6vHEK5cDneA0VkpEg?cNgr`~7n%9(psTZfP3>BQ z6zV9QRII>Ztr*+o`To76^vL-vjmSeWG0Oryzjxu9zAuhkGp(cx^jF8dPain9pF5Mx za`pw)J>A(3>uQ2@$5$sTpzLU}(;BOWeN$X-UhM7q3}Q_|>(|qEu+(gZtv|UvG-as8?IM5@!HBwpcc+im$ZBj@VG6H)4AC*zb@Aq zYI0`4hu`!H)_Q%_s=fuEnRCsNf`n_;deQ0El^+Z|tBp0IrF-+PJoZczhAv5b7)bLT zae{utF9yE&Y;<+uSe}>}aZaln^yVMa7P_=kKJ2g@rf2e-}N7`Dr>K%5vhy&9AMqouv&WkG=pW z8xYXX-_%<7I(X~gtH-6$=1rrBmYAro>r-<>j+0tXMN>P|WO&}3b>TFQ;$nR>Xx>~~ zWq4w`$}O+ZLRx3-wo3D>#`*w8Ol2ds55Ik-0#f8F=xZi>-Rqe4y7=H<@F$i+!DW6O zc$sl%fuDd=qfi-bP0u(sTwowA7Q52aK67VTkCZw;9QmxXKByfSxb^Lki=m(d;@&IB z{U8}^Q2S-I&ddFY~Q}8{Y{F>^KB}L;ZA>|t$n1So|Kf-Y!_z{Y6c(Xvu1Gn8rXcnBaUsyp31qKll`A( zRf7+gu&S^e|CXWFXw}%#g3m*hG5;;G_56W%YQV-uJFCv}5PnYSZ2{VL0nL$I77EfO zmh+!zj`p?YHy1?v%Ix6dLP#e^#Pv5`orE@^>if$%YT+ceZW&%`@d>DtzfLTHSzoOs zz@}qvYu(agG9bHS;Ijj;ZI#n)F%(@G+xZ?JC`ohmTgf3)U+pr8Gyc!>!RHIDKGGVK zn^K9~TCM`0C&=u%X)C0aw^3%P9p=}7n z_guD2A)sLavrrjT@Q-BbGaH0KZt?U2HZ-28f{E4(jJejB%ZQ9Stnko6|e zQ1Ac$_}D{8vTsF*M95OM7Am`BU&~syAz@@qDOp3d?4@K6*|H5nc2b1FSjQG4*|-05 zZr$$Z`~S^3_uO;txyO6v{eHb)ujlizJtG&qlB7)%&Yp-iDp7s#W&IX?Nkt$dPD?hs z^vUJ-emQBjwqKUIWGk&^)F%cCv$$^E*M=Oby2_G8k6N!eKIj<3i$Jvkxj5I)y!l&s z3hCWKdqdBktSP`0`X)qQmvBw&T;nhp>+UHoJmt>A__!U0Tnd|y(54KSYVZ%r#6)Y_ z=V$Z)Ly|tp?y+oZywERK;pdxJ$5u;R(K~*8vQv7mS+D-|(FgXu$Ny9du|j9D?o}f; z&bRc1V1X3Ii-v~Z2BwVi`_m`E#AoMi z$#W%u_oBjCIzx{^8*6}tm`#N56Nv|6h5=)yGAX?7q_>vF^yfl4xsGGCHD3*{UL^-p zh~E2`KU+IHo1iDh*`>HM0R_^$1wYO3!yS5X(`LdBY@?8sj{fwcyybb!B&BDS$C;`8 za`C%}vq5p&<(uv?k!ZN`A| zkF#V@{l*P?P^-U%f;qO#BWma}xQoj>Y9OZk+_JOFIv zU&@gd1mUL@NdXv8-vhLcW>~xsii4b&=PzH{V}`+Z04~yc(D-|j({Xixj4U8K$1{TA zJlWqWGfFikB}D_G+p<@}!fw^|SjaC9m4*WA%Z6h%bs<7PKG@+4{?PpR;Sv-1o5P;H z^4%e|?Oy*Ne>Tyy!t{#aIV-jsbn@06zEr13;nrN);n(beB%oGsXu@3`)6{Xbzyd>3 z3@&#akY>8=5s!ki#9-)xvVF075Qo?FlVDhBi17@h@I{ z0wujm)yT19$6kEoGORZ#G_PqhO}(D~hU(usG5cICQ6Z8&aGnMK(NqLPe@)O56M^S> z2BMsfi;EvURTVfOjrGNGR?#mR3%hhmZu#Kr$+2cviLQj;DxIX7Q(Vb|nsDFVC_gHk znwrwF0vm-y1mRcal)xLHbN+w!w3U%t`GEB|ySh8};vxFrCxmt(;Kkm;KBBwRlm5^Z z1idi{35N5vmPnHF8(+O}O{9*aq*dw0jVLjF z&eJIGwfQC>t^mml>rHJKE+Cex_W(<(YXMg^PwbVyRg^9p63x!Vr3sy2*h)u7M~<*I8k2#uxeC}F%!t7Zo|7y00vl+_J6kTlB!dPw6(8Nd#)CK3<+DV6WG|_ z8N`$bsD-pBTC*HXN*F6rf4Pml=-c{Z`Ju}c$?d0oFQSzBFIjUyt-RqM;H)(UUBhgaNCpQepB5M ztxYfK=J529BlF$Xb{VvpqGLfbTPWj~x@%O_B#Oe%y`tnzijE^C*^G#%TFz(}E4rAOh$L+J`2`FBUD$(O|DQEeIjoj5_r z;G~3v;7;2{`%)ck?Tb*x#pXM}Z3)O~LPLP%q0^^s>AE%*3|sSf&+GoApnW`1Mp;;W zv_3}b>Xuvv(V&8zyx}MHf=`dx6$V2}?%t%Tx_@FKT$*KNp|H8y;$e9JQ4>)i0AlV= z-P&=WG=x;K^Y^BL>4!}6_3J!ncywIt`vso-IdZ=mR#sLvyINbH7w&ZO1tU-&#)Ly-uD>iUnd z1{DF@qENkqeQ7UG%%yb4l0+Q-aaF`bQE~tijpP}u6FhX+MHl&UcWffTK*(h=3YuU$>@E23jsQ_nqHUz=Y+@QsUn-K81@mNt$J@I)Q2 z|8tuG02mAJ7nhI-N0%38zIj8GN>$PQ(CzvZiO8h)>hvy`C*QEiHTECOJ{m7yXz0Ee zMt1C^rptVwq2{$)G`z=+LU^KNoMWDiL@F518%fp#N*khc;gyTcvh}t6b3d<#>!k*i z7jw#?j+_+>a7aYo@q0t9DU2odps2%zoc>w)>r0@{;%0|UQo zOn=2|^lQrg_@HBzgJsN?lU!i9@~1zy&wE{Z2a#j_y7a?`bMq@mTk#XKYveShpIWL2 z%~ao8%`Tb7*5@a-F5%*GuuXl$mTfNt&)I(s2Dp{1rtod~okL9coIr!jpI`H|4*z@F z75R{uBTF6h4DfF=k3H|2Z1&=8zb#TH61~4iJ^SU&^G(#ojiq&F!}^Em#&F^AjmL}u8E?B$HcsBcYezL_jR2T@@ZbXB zJO^iLyqFZAWs?=qc{*Y$=mYZdgiS@5oy!H(3+@sXjyPulp$j%pw%>PRCdWMB&)xk> z`z<@rbG*UDx#C1z>B11nkxN`w!!=$F<02O!&ct=MQ+jMOs0slI24WE=rS>))-3elk z7*Ff7;9xlheQ{#bg(K1He~!dM`t=JYb8{{-LN=U*HB9x-Pq=oZI5dS*2Kb8yZ4Zzx zN12#I+uUGTgxJ4bFaRqnY*N8@y9X+K1ZV?T#I1u}HDJ%@p!*9;=?Dfo6@#zcIn2wu z=gH+umxu^KoZr^R@wX)y1mYZ@FsYFr*dCqqO2Fq9Dr66YMMS)XezPUn0GKYoKRy9b zd>&X{qJzTl<$=t%hZY+bs>YLpb%p=u62MJsXlZ3Z;s>E*gOD+n8YiMr@9wLb5n1-- z{tcpwuf-U=f}MJ$Oj}z8_J)|v?)Qq}FuofjN>{H!CEnP=?XM1{!d`)QZh*s4J$#5R z=l}ilgt!f(a%WBiurro}#Wu~QMkS8TD=|-(Pf%$M2frwDy7F_Vg$l*Mz`zQrFRr8M zmqQlb&B53OGu= ztlhM{ZeHbv>q=06D_-cG>*>4Y+(j-~qWnk*rJNJ-Uo&)URHGmCM!=n1Y$C0$O{yfi zO15l*jC~w2fakLqe;d?vIf+gI`yuWOd_}TGAY+kDqnHqMuj4 z6&+Kkh9d&<;zS^F6dvNEE;`3vZ3b_Apnnp1>7666YpnjeYh*q-B`j-kDt0 z3R4lZBKjANcMTD~_2)=O=cG6!eQ+UcO-Hlb!kxX5tmRb~oJdQ`bqjUW;_ z`COHhKiv7;)g=}2T88;_+PH`JkOZdfew@h{6$+qh7@`NLZDDiFv#3i2z0}VHH!CZv zyQ9_T5#YMOcnmu+mKB72g&z|KB@SeIfrrgpPxM-5zji43?|n0h>ge}-=pP;>px3A? zf{hF6P9ZlVy#|vSYDRWE6B83#ESmC@r5*oHFnPKFwU?MPM}DNt!;rh(SR3&~LPSp` z&JSNtvAgVlUR3i-EixNLq@A*iuy!D;vRF>U?8eVF9wqWA>Yfg*kIM?S8 z01=azc(((T_&iy}f44TqlkWpP3Fz?*5uWUpl3m{%;8hUrirRo_lVMytfINej}FX|zv8Q7)M|+!1mD$piHV7|>^AjoVT7OfXgXJY8FmnwoJPX#n_P>uwc^>j2RXbPKu{021PziloqLkCiu}!d6 zvr0L#KnywyG&eq<`{)0>Xol6O6-p#ZKdzYAykyYv*OYuJ6Ah#n??UpExKuXDENZFJ z=g{t_Z_S3d8*5>cU%%?s+5Lh)hba``(J}km=4T(b(Zg|dCm-zM6#Y)jfEX)$61dTL z2Tq`@1qnHJiMPd3LlT=1jcr$%YGw{FkhV^fNov4Gisz!KrFDJg3{va-oiY+{{zJTd%BmhD{h7=V97AtJM^w5Em?7X!`h&0(4;wI&!~m zkf-gpR&&xv*JW*d33CfPmrTyEv*6?O61@Sbt6PQ5o1;Zm zz6?ru8GW*4XyD{_U0%5QjktR`4wumclo)+x8Y)SY_^!dA;JYgNQfjU634AqxflY+0 z;n8J(Xnpy+`n^uJl8-GNl-slFynFX+&9VYHX~)PF-#8aBSL>qCw~Ohlg|4zsRRS(2 z$WWU5*Q-zuAHNWTw)H!nLKcv85fq%wD*&qP7LbwGVzUd@oE8wz&qYZfHL7aITNv1#k1SgWF+LzK|JxsT=py$@>vge zCLN{ECjZ~ncB}Qb%Os%4y!S&CW>#q#oA14Q&)!3W zN@(_Jw!nljQ1q~{kQ;8Uc1O>Dg(J1j4n+d-*+H$=4c6jf$Wb{sjpwCBB_-EL$J|{A z5(lzEX)GB8?Kaq#MyDYyv1pkxr_+>=7#Pf|ckfAMXA34gTnQ+TSxUQz$yB*yQ3XYq z9}dJF3W?=BJUaRB{$-W^xuqHk_k$~lNX{;gsEI`VvZ8JDidUrC_xS1}9bJcdAv@Q4 zIq%q}*>IzF^q~6bI4etmv-GH!1{R#nac5GGOTV{-#F7}`5eRY>5Tt4v8?!~q{k)z% z(Am);>~^J$!Sw?Wx+;Spe*MB3xC`U)+GSk>b23};_$rt+jKVqp*3 z9%2d&0$&g@ffxq}kR^KKB##c~yTCuflFUFyqOW+E=N>WM%r@5}5DpHz?9^@g1GN^*sVVg3@Kv70*OA>eAZtZu&D zB5r(8nIw-kmh0qz#@GuAlfiN%Hv*ti$s7mB2v7r*>qci%T-;UYf-e6o#gAD3xbqJ! z_!eV2nqr7RZ7+4*x2We!%Wsw}q$OjbE-y5i^gJNFbs#3C;SGZZ5~Pt_P((wWH$F8Q z7JOau)qk}k6e3zyScl`)G8nVrSsio1ir1(o)FoS*soqOYSoL(q*Vh#5cb4t$jks@N zJT1J9%YJ=e{!A{VjV9J#Wzyn50~8$_5e+k z@i}3`_vi%N@P*qGpPrrE(yf0|tZ~K5SFynlXe!`#pH&naQ;lCcd9B+c@@y?j5|2*|yd6*;nc<;j=>Baz!? zgrlZFvL9x6`M~h}wvoasQMHQT2QM6-$Eo@jOx~P--f{UB{t3-5Qep=~7%y@e3gT?o z{#t8J97eSdzpAgjL$By(AYSg@(Ooe=(Bf3OJ+jK!Giqzq(4U_-_WqKuyK-j#Uk39i zF;pk7z{N_Sz5o#?KH|1{)^n%B=)sP|E;1wQM?h0Fr5r69kf*TogphS_XE;V#WL%CD zgfq_#I@6zfDW!5hT&<_Lg9x)0Ou3`Ny*R~Z4u9M>ZW6uXFu04Sz|9DV=KVQ~cNp~q(| zy3RKd&B>ZxDL0caDs3wn@UqT?xc@qdnRo&0k1uc368Ee$_;2>C3|Q1rB#>Q{TDd=- z7DlqpXc38UZe+ke*wV*C#Pi;%<)51`zC9W!zRO^+jJcaET7I9Oq5H{QW^=>Goil^U zX9_Ex7Ksun*}tc#rZFf%v&D9@(um(DYhoJgtZ@&vJNQplpl~VbuU@MWxBKqMMdfzd zo|gCo*(H9L@`hg7a+HUxulJgG*KnzW9mm1;Lg6Kg zWhIaaPJWlhmiq2VzMXI=Btq`)IZYaGERi)AHIAQJ>j3&l-g*J5tn9zfDLE4y3Y#go zsi`AnmSoQAyP*ay%m-^#*CH=NnfJ)NhN@`z$D7nXn0+Fi>q;a7VfQ*#&|8_pPz8h> z_>Bm9@>|WwfO5Sn#CW-3G1pCiLf%cf+&Y+Mw(wi~kT@F%^AzQpS)B2@vy@Vk!Elm+Jo_@}E_VA#{Gs>&8{`+k%3-mkj`!L#U_( zRd1N{tEi;vlYywmiY#vAqx)pCo1Cu?^5YyoArKqxEB&%Loi2$E2EB=F?VdcH)8w0xL^~UECzVuO=lv3e8gkL|A7|yTjH*oRrKq_xYP#T+r4@^yPN*}pnF78`?N zyo*1ti=X*<^N>kt$oKI^fJ!=+`Q ze5CX-J`abdx7gO^ZU!$8Q}@3*At*SPIl#xG)0h44Q8Yyg#y7EhQ`hUnPP=@YXtF-q zE`3;ttJ7-JrF^U!OjmJ$Q~*jbH&&+z;ehwExjxoI@PZ5YizsM3iFkN<)xyDL8`7kL~%=&(eEm{^qH zMFYgd1ZH>aV9Q{U+@Tjs6QZnSF9AT-?`kPI9n=y)EdG#QKh$$dKE;zIf<%j*yvmn$ zWo2Y<#vOJ*xO+i98V`vITdkp7W&*9=TlG2gZ11(%u{v5KBYsTg8#!6{L&9qnZ}nSGN}u&pFKe zs!}v01Eu2M<9q7y-tKC*9}Y)M$IR{jX)Jt&oW?KjgCrSwHGG@3g$?g!R?R1L8;{>O zOZ&*=Dr^myUYS`aoD^|hzO}dSeW4Udhlc7MV50$*!uE3IE06nBekF({Z2Wi~e6~4A z(aBWyU{`DITkiX>dk^JN!_0+RN||MUrM340eMm;<`m$EVQ!QfmLdiR_JXd0`d~mF+ z`O<$3WG|r8cr$}RS*b`aGFyCixlqr^d<|CP1M=0MESTaqVgkpU*s6hfBZ>51XI=Lk zBg2}I7ni(uUCE36n!9nSXNSb(oO+VfkIaFSJokkD9+UTop@!T9Di#5A4cGQ98q;i1S(kq4(Z|@b0-%rpJA3^#xlhaUOZH8A#LjwRqT(3U#ojF(yW4{yfF2ii1Md+)mQa4H(|M}GMML{eD0Ed){8iW%;~ z!O8zAJCXz7N3!a@f$aVhDi;14T=b?*hyAkDR`MLNd|=BFaxw!Jk)Rb!au&)C_T8R4 z<*_VvbCv<0>V;2tt%iYBfSNP`IHXqk=9FlByRsshU6HxeseRu_5x=+O(Zox8i=2X% zln&*48bvbpIv9Ale{q8;QsIAy$V@e6o|(?cF?CC#nviRpXh!taJbi~Z`MGi+e|<#3 z{QSk#Txe3XWrjf^s#f7UNyq@(d4B~va>}=TeSKPY%pmT1vkfs7!P z*5r_NOkCVd`H7@>=w_m@|Lw?#G1Yz|57`0^3U2W{)F(<)8e!t&Vq!&K`Wad9WxwX$ zEVSFZug)YHo#cOT8SqE-u!<4|y5#+AyUXTWW7D|4ty6`P-es{11)(+*pRV7#r+&>W zzJ2Z-v3Yr`(mt74g7}-0@0`BlP0)QICx(X`>Irb&|9k-sfv1hP9p&^PJN~7e9Y`!> z)Gx1uDWf?Mny@Vtz&JQnlO*IOfX!wgmugQQu5>#Q%4FlR(iGJE-7Sf{2 zBZ@QlOl@jf8XX$?s4x!J_DDrzul=p-m`(7J`GnO8q@XBlO7k^eJOAGSqSc92o6AP|T0FT3-3EuMDucffJ9eq&-8Ed8+2@pmy!bddU zQdf4|{~LL-RWpkfGxLGJpPzz-uZ`7UF+RQ9xP(8J9P^(pDXJ_Y`RmD+@R0M!_@m?!m{Cg)8m7qexLp}Q6*So2& zALq)!z^O4mBdq_W2xU$2ydi*yB**gZ{l)K5CeD>XkX-5l@MGLgEpY1hf6NQE%DbRH zd0Qx1vMO@ftV?3f!WeU7Z_{ABAEGgXpdVs9@5`hsbYyCFct^6Xd|)h$Aa#P@gk za|n!Sprc2eXJ+n8cfsV1+w)%y?taNs(G#YLY5fEv;x=K(TZA`FtzNa3BF)woR$;>w zfk}9er^z))v-{_AryFgayXKYUgqhI`g2S#d>aKy^g-%nOmq z%m7f=A--2KbjdR-oTF)c7Ie@X&udD25hWAGnba6>!By|<$-a@K4ge_a(#PDBr&7iF z0&D9urv#fPgd$Gx@VZqj*UEJ$WIsltL9}8F6%yi3?<+DwTA6F7bNOi?U|0UK;8QYN z*A)rA=hHmwc#M|94tv#-&h04cWTNCW9m^;*A)9I#ga=Ra)W@(#n}v3ve- zGQV#7@yq-n##tJIDjWxkgQnZ#OJFYrDtE3Yg9NCF(*qJ<2ZETh!c7Q+R{?Sha3ccJ z3(M%1;6j!Dp{3ul^r)9j<;sl@^KUE)um(h&p=DsW*>5I!rQA6Pgd_@+&4Y$@qY`CN z65$IsZp?uW_`Skr`c;wq*1R*-Ecm#BLr5}g!pphJWK z6`wjk13<^1tQ!~Dm{C&Fyp*Mmt^zAOsGM4LCPfB%>*i44s*Zx8B%hJ{pd%uvcA>4Z zgp6Jgt3Mz6(;7-fBFUB`lZMz@d_`MH?EQ8E_V-c_vyoc(QEp%+ZO0U1Tz@1>rCF8G zD9lI*Kc)SGt1+2VBS%O)HSgBr7F{=`);R?ARnUlY%ec#Cc=?^)3G302;Ln1~FYfl< zDl(iMDm@JW1>7*R?*e%91UG8H;0^{c^7!_q(gE{!(DpZjS+^a?#Jl}@tOVr=NYxK* z)%;;M==hSlw%`r$%+Yg!Rechbl3u!~>@jRpP&kw!8aJeR`H4E;sIc zsn9%65yvt4vejBha?DzMOK;_Yq|?wZcHYAJ1a*FpgeJ;wi zhLup;C@)i>Lh-fhO_ z%ZF?DI_6ZWkfGAafr-fnv=sD(H6CBLZs+R9VumwF5Sm$iET?k`z-M@5WQ%=iDwx<%rFrz6Y;bkr3!i~*!i{fFe zlvF*PN?|5y+Y%%HCsU8f{Fo|z{lc{~s~Z~R4!quU^PIm?dti3A)Hq!6CQl2moE%5b zMoGxT{f7RAhlm6hi8V9oXDMAE9tnzDw$nnPWPresLmZPfJ8s`V+F@2Tu{b0-yH^Io zL#%G%x}cJ->z1w>;rium16<2q7eopFk}rJ%{ux7IraiY83{0D2S8Z%uB+cHBPEG4A z95{$cNHCnDw0!g|7{3@`tgRi;H+OFTcuGgjLvTGeNOa5HoN>Ewf7a#ez}7nJR8Dbp*B<4mpWQKPGQ41=_*8{Fy=2brCEXmkzzXx~ ze3x@M12=a!9l8qLiBMKn!nlwKn~-OvE%`TQT){6@HD~`QZhxU%CY7XwK(dg_rcJ2mIYJ5B{zBENu^KDyAKSebV^oT`BpXxXd9AAJy&szRx`9yCL7^oou zhlqG#R#w)IuY}w;5H7IQT-BW35M*rMx&2P@%Dq=UJAq&o-U~9+4Bjv}vSxHrKuAsw za|lIEMFr?^&IF^1#*{}@(V*kDpFR=B*|4^+B+*zVNQrOx0-qvSEK2AJj4h1FwLUhz zC?v$Qv(oaca!nsm+!84uCdqgcDxA99+gFO;YP^1LqxQO?90t`?EWyA8zY&n!)Wy5T z@M~zc79yQs^3RPKMP$^^L)6p~`?VI@+AcczhjU6|20b(S%kKcgL3;emnf#741c!_Z zA^<|MpDzB9fM$DnESI^QQe+CC&Et_hUl3xTdtRMChJKUj*fH&%T;|a+(RWo&N%Tt} zU%zgJv9@3QcfuP)%yv_6q>i~rCUpuMe+b^(L_zFK1#EDa4{YJk5-Y6@EdPyuLFWYn zT)82*RZ!B-Xk{tQjJWpvf9rHL&(!GWz^vx(Rp&GF^uT<8ZAm~;k=rxn!Y;Y#tlNlF zNz{J3Xa$?p;Rkid_QcnFPaJ@@f$1GIBJpZT8X>_iuH+YDB@@+6!KsSyA&jdlz)erD zz%)>z9^jw;+yAfj}P4$h13o3?}?7%sR6F!&g}xT}wrM!m#0emDHrJB#PbqlLbn zieup9Gz-ejHU%Ey6eX&TRN+i*92}OFlg*rK`#+s8!wc4egF_Sxx+a3N(`~uXFVD0x z8jMdvEOju9WOlTsYODs9r5sq+l5sI{+8x17JpvNA12S_)EWw^N_OyhnMSo5e!H`Tq*9iU=8Sl#;; zS={WK0txoj;Qt}qL7?oIO9new?UL&uOS1_=M5fA19-LbKUHW8;z{XPv|0}B;>MYQ3 zx%1PyvNyB3PGq4OEX#0oQjt(){q|g1hb+d;n|^c3G{l;c^e_r z4-Z)h+YXs*yOaF<;`U!pf$Uf>`_FyUr6{afXM^cKd&5o?T&EXH3n0gh_ z^LG2Y+}Gt@vRy|X>SbQc&%r|7xUmdll^%fYHMa3)hq*H(j9zY-iV(Q zE95`w!87$sMOo507Z4v0;g}bDdhT7UJn94r%{~iZec;UKnhZHzkpBL?HXwf2$$ABH zej`D65FTu&*xA_`^s45hZLNB~_v%Y&-f9nvT=T@fJ;7&)74EoO#}8f$&m0Q!Y3g(hSSXtA}d{Y zVXnnC8MxQ@K7;}`+N7DN(f|9$Onm~N2bj1i9L}m_Fvs@NHzoU=M6+xhLOcGETvNVj zVA7+e0SEY#|9Ex@+@YHv6qjL&2H?W9gZ8Xhl7MhMj!?MqyJ&h0PN{e{H4TmYz*t?; z)jChM7K6lE>je4G@FpC%kKq>N7#T9k5ay?!PBKF`7Ba^(l%yg|2)^JM655c0jxmPB4B9kI23yYTvIXsY5}Hz7#5xQ91__{zTj7Q zC_psvYr!vO035};t|==s8r*5J1w{}+2?R47Qh*tqxd4L&ZNg%qO%i0=ju8514eNA4 z%qVc;3Ajp-DNur1+0>K+QRTTT($*6KDV++*D(+>sDpK7IbD!P=M<_xY##`8SB^xD= zGg5;Y1InM3)z$VAd1a74BH%n_+1cKnG0q~ai0W&Uzt4cEdrOe)W0>FX(~TVY_|0lb z6+;A;_F!NYj~P2Q-EBRpXyrq#rjl=#1Y_I-K(Im}oq8ah&N8fElZ=#f>cULU5b%wk z#$6CFAc}-vGkLa1lb|#heZBnWWt>j-_I@Iymos&t4nlAuw*Uqt`d;U+2vi?ojwiJI zW!hH4_KAt$M5-j6N%4uyhr&|GpdgQw52uCySZ;Ud&>?UNcUYy=`u+d@aG-QycnK(> zPE9xZ zd=g35nQm)h)}_2(OJ&XnX$~O~wXc7l2QSP@nBR>%z+k_!U|^ zw7*}!R$xC8oeVU*qoHt|+DA|m?9C2{hAkE_AgUWmHltfL)19m{Js$~A6O)j*akdvy zAiGGH-|PZgXpE`oceAe`T$)KN~??5uojWUn1VY zBpGG1NmcyE0yp5c6qem#P#Ov3A>GSZU(nFhw1q|$Moa&M*JIK}Mr8gYxBoA@Wpg{d zyD|Jyenx(QU1Bka&!m=@udJ-}KD{-PsQ%WpMd#+t^FEtrPa71Riy$K>7Xl%pPVg_z z-+Oc>ha0jRtBR-PR*>s1wZ%S2A6@^EFgfYQhl073smpE~FRE^=9_t0;4B$i$;hz68=)V&o^OLm7gID8iEyS0}k%yqJRLz z<;$1l`UTd3H&yggZZ=$9 zK&ZXh4KA2f{|HJd)>U{bZEofU$tG^940L@+sT_7Y0`$@oi=+4C=N>uiK>;f+HjCAa8-I<(@t(&Stb4 zVVc4LygUUc6Y~L8}TU0V?wEg11_t)Q&v) zw((MK&1%!VzgX}sjBB6Oz+cRXcybtEDxU0=sJ$2YCnCngl0#- z8mW@+Z)s{Og5V^ubxpeNTJB7k=Ma#Lfg;FUJ;KC9P#gTLAeKU|+l(pL6^mWC5L%{K z6ETgyjp+KC+j4DCK7{w%BWVkmezpq>8B87kje5;yJe4!{pNhrSeD7RVQkrTYY$=3~ zV9QTc{L8N76FvD9KSXZH;c2irHS*7+>KAA!xUIX>h}V&W4UkflZCom(qM`y!ULx4% zZoE-tjI?6{Z85cIH5z=f_c;9_dJAUE=9!d75C$M6tEq^I`T0B-TON~)NZ%Oq)Kup; z&$&Tj;t^=TSdC*Qh`JD!P)o7?E41h#+T)BK1fvanW40r-IQ=l=Rq?C#M@4?;E!w>z~ z{CKpQiP}>$@$%}7!Q_JM$PXcgv&5U!6i$YiEV{&u41{TWrN)5BOycN!NYJ*D16DEz zN(ToG$o~^FFKvq)^Y?TYR&N-eZ7Y7Gb*syH<+-y|32)09^hGQ79X3YSuOET|0B?Zg zH+Acj1Sh*Y0$_%hK-Q+ES%_Ub#iLX9j^cOb$o2Da67>tK0~WBw5q);-d&1WFQq20Z zDwn_9$;jNo<1#45npB0W^YR-ZDzxfRLfD_0xQsn5HR-}A}gwmu%x*3fq-v0bs)y#-MaJ-h2aC#M(=s6=4q$~@fG4dO)s zkJ(G?k@pr3W1(*d_C2`vvDJvvn*ld;4%+#9ARX7vH!d~p{`G_~+jbJ}3d740kp?p# zA30hIu;IOT&AamS%tb2qfL>>ZI`ZA!-Pw__0>0)t}rbA%gNBe5{7J}KIh~#h11Cn#0Qq_ox#LI2pE`Kexq_> zzGl9Yi3Un;alrJx%z$7D*4xrGx#Z zh6!BL*KgnW`@+D1H*73SDr`)OE(_?FD=DLpvSTI>4CIhI@S&1_fYKlJn19ha)0yQp zlc;Ozggj8Ki7xwu7dT_|C69GkGu1I~W5bg_)JcjRuw3(J2Vm%xY=+z+lFt(L-rM(? z82Cw9SD7u;r7%|}{98^6^YW5V>2r0=LSISn5&ul!;N$xdX;dMnP~ z-`BI?(y;kzwlns$T=(O+rID%1%WuVeHgRdyvt{$QvCE4^QhE$<<;(wFSzbQnHoC4@ z;-kg2{iolqu@N6(ox|prM`!D{`lZUszBS;WiAiD$iLP+=_{&OR^BE3DWx@0 z;(q$=V^Z`EV>NiP!LrR608x53N^CVIF;H#}mU~ODHP)fO-7bH*CF3Ab_`0uJK+H~2 zk*R_jb;PCS3q-xM_&$OzO!Wex@+5rP1fMq6AJ1hpxbny=-@?+)Q3lM*L$iGX@&}=- zE3>cfHlui6KXX$WuX5#eDWDKV3Dgs)1;@egKwzuw?R5I>n~>jxE_3_7VCY=7LQd!* zbSGKF)}=laA;k+U4k?k$q{_=L4MWgsdxQq;lkfiiXicMh{Q@$M1Vbgyt6W}RWTY*X zgl34VtsF-#gr>@;{9x9hoKW5m9h+zhup=vUa4QdlBsoh+fIrMC{z<04z}+D*%{MM2 zoSmV+N?KucX4UYg(&X;h(X1zeOkjA;q+?TxJY9g*JWkI78&gzNR6vP*BTN%C!G4Dy z9`aJlmEw=lzKK`cGuFcsTa^sK zvt^%7GggCH3w9~LWCh1*Y?%1tE=S?~dZ}w>PgS~4e3gcUMjjlF0R3f@ce>Y)Z zLisA0x>SFrL>TE&nWM}U1pP&k9a0Eq-=bY;E)NXfo2dfWgf9Huj&8Q|x0Hk>5gig2 zSm}~&-Q9K|?(H>-_g%i-_~j7QJ!g|RrBi)*BwM#TlM?O{ACs&1hG76!yVD(syLQ7; z>PAK<85$ndyJch3E-%+LyGo51oxx;WVSA4VfFUFZsIna~ui>B~3ju>*W~TPv?MGE1 zw$(p=%(i3LOf1NIS)*lOKz5_>W($OtKf7NyC(M-0p1~)3nR13A{qjSGY5}cO(sc43 zhZ%KY@Ac=J2s7gT6(dz{9f>Y?o;8+8odp^93D+ z){^j4Wz-;E2gy0qMtZ5iyQGIh?BhtiKGOHEQsYIdv71h zy|Ti5(En?yH3mbo>m*K(U+qSO+43ZPDHQL&KWAyv@c5YD{?_5x)5F>3H5UlB9LV`V zokW3^9dPj!DI0W%FC7l24+_*_N#9c_Y|=Y_}LM=det>ojxcZOMZTW53(- z?5r$36?m>YQa3jyTMUQC$+snvI0t=EX2r#~R&DK&!FxOMqGmNi@$L(|o4czeo5@3s zJA=>60y;EPP=#}jdCRh%j~9leYnU$&Wdwj74NhPhKyqm*4oem1FoYE(#Z7;n|7+|v!Ci+ zlb_8h3hD8Tw-5TPT(Pkld46Kf%X~TY6Qt8h2%+|Nci-t|f0?d52ZxE}zYzsd_bj*W zDU#DrHQ7rN^`x$C{v<(UWMl;G@5*Z=>Fmwk7%JiN)<2|?I!lUv9k~R$hkEp-;{i}+ zJe=ud|2d4T4P#@xY|C$$&p)$N{jhMb%T5kG>dm-R8pBt4Km^Snv&i+=X|m?xp6k z9EQu;CnfA65CHr|9J#h5npVky{qw(Shk!Z$8+R7p>#4#=Q1F zsLu7QFHvp;zAoGqPFc|dWw_8WiNCw~!{xdS0X{z2N(bW>9p@7-N*vo1ERIo*maNT> z4~^z+NAZ$sB?N4J6(o#MEdsNxdvnDNUUqKxv~It#(_7N*tJTQmQP#sOF0PcLVC=Rs zg%X3fnhI`jwDR8*^VVp!o4kj`{V?8O-M2(7#gUB4lDTPhiqx2yhs(8ULHhac${Z70 zK3e$i#dfIUZ0|n2nRQgk<@mS0^_4R-nx!}PPq-Ck@*K9=8cA$Y0i z1*!km(UY2~=NK3!sV}-uR78DCCQEHsK#C^@hlB|IlG)wc+Y&uX;o_8QtE%y4pdkn| zUM3e=lKPDF zFYVPGyvFTrHOu*;5f8}8qpuU!)-te)HKg@uQ!uyJXgmrPf+IFl`0rj9W>ULr`g5Ju z?-ujfrXM~xevOgIMSrGv^yvIf6Z7|%=ZLVXw@%$6PVJ_*ux*J*_Sv$bwb_^lI7vhS zx6u0hY4y=+a0OR?V1`3WhnRpT5I#Cj27kQwt0|G{r#mfO{L%nnU_}BN5s2^#JsAh! zgH>{BDy@P-W*EC2M-uV(hbztl!bH&u`w3=Hytd2_6#BPzcjeL{wY7Wr#;y@I=fAb# z;o+jjr;kY)5Cg^Z*N*ta`W67Boo8Gc0%qc4D#H8wIH?CPE(C!d%4W#@d6#a5%Z2?p z)6oV4(C~27&FAEbYz+dIMF3uSY##o*{n~sVD#cwG_ON7BoBw)(*L%PB8aF-AAJ#>% zSG_kbaR}DnUy@8RiuRRj8cSP4GoTM8Clzr5v-%G>*RNy26f|?k!(wPR&)8k0emF7BOO&@Uf!XFB^UpiI2soQNSKI5V%Ss1T)t=D@4Wq~f`1tdLg+2?>c<(psD$)Jt`03#xydwtNl2^t^_} z)|AkP-39~%oWG_H;^OL#-?8fWC()n2-Jme^#2&(84A1cJyt;1H1$MuC_r$U4Guw}Y z=$V+}7Cr*9^@W9wRXp=zH!UUQ3IRlBnpJ?O$rrwFD){@kwt?9%PS{mS5`cUPcnRA| zXEt4DM`U08x^Fj8E}UPQW|M~vgl)#cA)ghlP3+{4{f^;zQk?RfN(-&=ACk(8wJr;bZqQ& zry(LN_VTc>fs@&swQ5~J!#dLP*+_yx`8EKhGnVzcA=bH^xyR|wR?{rRgN43 zJjV?dm7+s`vP1jX<#rUC*&YL8Jx9-|#9JDh_aqPThfk zW5Q>;4U$^#ahg=4#0D%BpOa7sBhDeCn;03=(0W}-nD-~L9R`SdKy^;MQCwq6L`0OC zl@*hkx)gT$TA*}CzSh}`FlWIFr18OFVZZD-{>hE9QHC-J?0;<=rV!>N|KJw_3-Tme z2nx9h2efQ0%m#Y|?J?l+|f-^zptR z>|M6N|D1E^@0cuX1RFTis*pNa*Hd67t6yN+3VLp{Q)jsUlnF1vg=xic^e8bJDmTLq zvlx@=;rub;=S0=SzeXy0W#TQ;hF@V-^JdChU!Epf^vgT@9V3+twUuCJbt)DJMr3&Z zVS+DHL1BxT(nOdE{OVL_Fu5zPjs1qyDi1ADj)GCdHuCc3ngK40hgYU?EzgPw0{Cb* z9a?B739dDsP)UIS0We5Ofat$c%BWqi&}#IbbK(V~xfZ_brDQt`L>*hW_`#4h>XwIKTxlz&5ioB3n z^zhEWfJZ9xofo`957z9hd}`;-m_wT^!v^wM-vQ zQxd56C$Rgj$;mZwzyJJ6X@fv%5R&f1#Mq`Mxz_SJY`*pN2AU}b_r$(w@KwG1ZGub) zra6dtmLg{%O)9YAkhXph3UpAl{0J@Z#=_ljn?8`vK;?hHA=imuZH?oiM!>3K5qCU+ozvg zjYTAB#B??SC;$`ACUt^@Y4YPl9@brJVn!XV3s^evuvGsaQQsX%<^R5atb`D%Ok* zK4654e*5#itKEA$JB5}%FF+sGDB7bJxl{p4@dB?MXIPqMM(L*f&TA7TEK>8Mw!Qyxs6l@HQ?9Zm2Fz69pVCg4Yt>$ z5C=uqnfFsIRb0r%cmN(jSrxAKzUnqyV(y~X6B!l&e8Md8qp@40@4pYi9p^$ati;@G zNqUWsqNvR5(!k-96f4*x(z&EZ66Mqw<0no2BIo->(JY#{dbAwN)qofZR25*nJCK+jK73tMsTp9w#XL2uQOmFZ6w`lI1| zB0mTm=JW>7M_-zz#>hw}de4{Ggx}|z9SLEPqHC^t)CYUxEQcyYL(ht)Azs^z_WU~> z=wbnY3>50l=mfx0pk=_Hgh77<1+`ecXAil=#h>RmdVJ&!4h`j7JgxKg4@jrj%$1F%o{Ux1Mng*mJh(utS@Qn0~oQGgn)U4KEvq0aLVlr z>yb>8M)qE|Qqj{leKBhV_Y{K~_xms9%r6G|qhNArT17d2l7xFIlRpJ209ass0@>|? zbvhnaa5Ll|m8`?OXzgHYgaFaHYUXHPhr0;Q?jCs#y#?S-_8$-dbK8g6DK#6l>9B75 z$y|3Rn0ZX}zs$MPTllTsBJ!z84WK2gL zb4MomwbP&1FXVh%{T~;=i=FBY8ZC6kZ3gB*C!j#Q37zGI^wb_2jNH+Fkx*Dzm>8Bb zlDl(bF)=Gy+T+*2|6ZFgxFf2otA}`iy^z+Dq0Wd)ukEt$kx*p9q%zvDPIggHzf)Ar zooA|YdP(=kx7gOhH$k29#QKreM(k-$MEV_7KxJ$S9uv|3A6J ze#klmOz0Hh7KV6S-(BVe3KH1Szo2AW1jlF4(T2MYFRskly?VvT$~s}wmU^YCF`OO$ z2VkCKq;p>;qj3)r3`U_24UYh^o>49iI6F?%G|4qy6J2SDGc-a$M?J{A=MP@}|M#-M zR_$>JP}h{Swc~_Rfq}d>-8l{MgWkJF%fKTLe#l#-;YBPFPqVS5W(V{ncGV5LZRWhn zNI5yC;B^}H(>BB8k1d5os(=kG<`@Dx69Oj)$P3_hLhlFjckmOcg~Ctf(7GCGLgbl# zMi?&+mhUPYS2YTflPS1d{Yo*2;8-u%k^oj1NADqNA-4p4%Jr6gerKqOV}Xz&g95@& zXK@}oCz^#KPEy1V1n$cR7p6I_s~-zz*J-DyJ+Y^zhe0VcO~E2 zci{E{y*XAPjc9&PRm{Y153#Sw2~rAJ^T!x zz~A3LaOYnV`s~pQs)4hlqwkYcwx` zS_$IXE-mr6T&P-vZX>s_g4Q~qr?Im$yux)(z0`gv4V`rSMxrh(CT4VH-Y4(_Vgj;1 zg5XEKl?E@5)|XR%Pi-?_B@Ci?D}S!WiF|35ty;I6py@HqL414Aya{CiRU8Go< z#EWUKtd;fH?yfQQEVDa^qzItni@b<1o3q(iXbDc5ekd86t&_6rzXBS6Nm!Eu216|I z@mhjUEHCvf1bF;fq5Ek|EGO6Db0|r?yYcMLgYjKJ=;-eb4o4LcJ3zntni~q+x4+sU zIKstk?7g>O5?M@CE`R(tet!Wsh-sXZ_A-NM>WD8FxS@oUvxsza-AKqI?mkk#R zoQ|)hwx7K2GoJ9AFb_}N4`7ZIn6u(J0uG;F9TU6({SU#L6oVi!I|^grV(h46N@YOR zek?tn!qY8%RdEN^EL~@JFw`U@CZ_jj8`dm$HVgN-ckiAo4|Hx5UZi%BqW{XX;L)s4 zM5ToJL#oY1ooAawo^Fgy@yM+!EG8&t_z~3};dS}D)sA3y2rns^~X zRKaKi?FC{=100oaqu&eY@F3;Aqb{H*YgJf$;q+o@=KAT+AGc<2%jX+_M^r=EB9IQv zVH@{tItydr#0|Fxw{A5sDK)4)(Avn$&vy{I11Apt-R6Vw54TM6k2`FQ7OiwB)mx&| z2VxqJJpbaAX0tYpW}aG~=+<=?cA2ty9%x6LfR~(UF!X4p;u$BV^CC(QuZ?ig_rTS@ z*=MN`)^6yO+N&T;#gv-cb$z~@97&1>enqD&kC+CmR7FY(iM4-KN%=wGfhzenovHC0 z&~TyiMoG`bv;k-2?OhG_#GK@C&zfAGe9RYyi~rskv{WhY4hv16yDuoMhJ9$8^qF#^ zYz+euBg0mIl!MSJTa}g<`--@Fn&R{l)A69e;TZ`Zf_6bQ zMH==F)z~w`Q_f93hc*JP_!!jx%iyF17Vj4i50-rC-6c5cfqAz=Fidh-*zo13tA z!3*^jPjAT*sNekD_Ss#p^YaBbBWEHE*IFXo{R*!S+Fs~W3HI)IbXky6L8m+d3{Vg~ z<9G#(*$r2Vl)eBB{Wn-qk5M3lqz9EbgotWBbd%Jh{72}I|H_~!G>FZ`!21zv zQiv?SfgQX0gXd|_0vpoYe2Pe%@UDV_k;MHri?c_g=JS$QTjG^}RJxz2^2{i57@?LA zd!kt`X7%eiB!Vf=5%*z5=!r!vI^|JX1rasn<^7sdoZ(|x<2;r`gQ)$8szXT104?&; zwGtT)Kw7>IGl5sHUn3rbgeOiIET5&X9J+2jJA~brUkeH;O1-<)L7?Z_2!GxbAhpW#5rl{B;dsu{3=48X1+3q6t=wV zi)aPEfK72mrBZS?i(y5I*U_$>aQsP9(lnFC*Uw+PFi>SUe#~@)(bOp=aF-R0!vkE7 zpcejEMsa(+JW*IK#~>vU7;0f45=NvgT%J)AYCn|oWcD#fekl!HsWfPE=xOi#{$!3b zto>bUbnfLJWy7oSnrmOj$@ApOQev~ySGhUq#?FB%B{MUVY#8x`!lEJ10HfTbbl@MW z@nGKtc&n+Vbf4xqsWQM7w-~4)G|{Lj!-nm{v`y%|2gR?kXu}kl}&+Y5dpZ{M5XU-tH?KRYN1}TYolb9 zwhSryf&)TRywF9zDo?)J^5>Q!E~nTI?gh$grPic>OV89R7j|S|z{98(TN6vVwbeV_ zp_N~KQG~a2|0LJj#JF!UD%@Y~y+`+6fXi20+{s!X7g%*=(EQKOf{t~W>#`z0w&ad#cZk!MPDc$^ZJ z5SDrC=rd;Q^AyiVJEF@WM;@c95NHCh>KY-H#Pg!0`r{)!bfVB$L|0xeLKG=lX4 z*qxui0Rx(K8cZjlyu5XEILg{GWLY8-A>OOZL$^jW`Y;PEQv$PgC*Z2#ErW-`@2^&L zLP8{M39d2sKd6^ydy=+aUTh5F9Zv{l@@5p_jML1$3_KmQTY4dv)~Xnn*3#$;awcKl zMLk>J!xnLs#rHk^^fD2Z3)-Eo(%;uB7weg+Z#0EXS1j-D?A(Wh4%K^DO^qDtXt$@v zau`#tRm};Hre1=s`q$@v6zp4YgEe4V(wz^%*Zt*(ax}EVW6&D2HbH>2W0vyXy~5_R zeIBWx!j}2(f^7jTz?M7q(ghD7Ku6Xj*y!D(=nYSSHLQiVqDq)x^!dSh^aEs3g z4^g{XSrZ$*ZRR3(V|dStiN(Mjz(0Lv;+>5akA9^NUUTzF+}196U(yOHRXFZL5|1X* zm|b-XfhzqsXo0U>xR`w442}UVGGw)c(!}d75}88#jAAZ)4n=;q>hUZYoRY9zh8B|} z4n=sxofb7yK#v7*;V!VRz{2XJkB`rTY|T)I>YW#GGKJC0M)|&WNF=ho6vJsqOv(Bf z+zA0(i2?G;_wD8wqkwsk^=)o$d!+n zM`?Q@6Yjt(L2W~$=$}N32~||qs~s%wP#au+?-i!4)ntU6qJi=5tq=0FRs$vY;j(AH7n&ZO zNJ>nbkIaVZg;dgzxZ=97leStb7}BcpCsCzsI(8 zJz$)TxPU^AM0lkkz2H-z1BK`vXt>BGZIJYSj30nn9-)hZRs0%!-RY}Gz$}JhULTH6 z2f*{nVE^}7Gxscz(YM@=+b#7IzBw$*y>GHUIw9UCH;G{dXi%fcD6%iALu!fe z90x}rvh}d+2IdmP5&7G^wGjBnorbN8D;_Sp5gp>&U+Ji6_O)tLjTk{cn^25=*=`T^ zGM`UhMhj@xcWJH3B^~%xa_~(Y2xPC89@YFEvJ7sjfT2iR;&kUL8VCF)KaM9$)!{^B z32WW0d~si6WHN1%wPj`!GI`$5k93WZt|J9p1Tcvu?gP#oZQ*ph1(*p_eD4=f8r5`RKC5 z7VOx?UxslH%+hX~m|TFK5Dy2H3GbsX4gb&~1xAk_S&&FsYWo5%h>D8#$S4K0wJC!*ghWDIRkzIXJjh5kwZR3hX8xy$-X} zSQvq9NNho;L&MD62GA$~dCvm_85IrvfQa4yzegNTIh_Mr{U8)zF&{OTE3`h#-@ZLr z{s|NcentK60P)|Z?n&?e(paQl2iUMP2Rb>IY1Y^z#A*KG3z`-ylrRs{rT?(nUoudlDE7kml8IgmASf{C3nCBQ(& z0`ZJ|m;%P|K+KCf?h4@*KHcwlq|Sp@OOh}SSleZ~pqH-(efJgemygsZ0ZYA-=PhHLqavj^5jWDEHb8blYsx^g8B_8rI3gfF(lS?`Q#QId3s@hcnu8dN58@SBbE6S zAW`bkFS%&AcI}NOdik2Q?g$1-UH#E_$zThR6S*|&w7a@Xj~PET9uB1Sxj!F~CSH>DpK9h?L_ zOs~_r?@M~q9MJ@Rw+ zzx9ropm1E-nc_<4h4rFX5}15ySHjN36yHM+*a`0UZB#G<`!MT4iwL96gF%`$$i619 zT^bZ!tU--8cHdo3I#|8i!K*7@Kh?eu6V#vARB**Md3B@R#QpjY9-KiM2Jkt{fD#(J z0(L;}Pa3?1GZsY;D6|2Pz_GnmY%n`4LU5^=rl(usy{_}UKmWTJLJ2SkgP1T17HFcE zWsV^Bd(i~agUULT)S&0i>|I?V2OpRv-gxy*GE46+>DH{xR{H`g!3%;^p(r7YHS^Ni z1NKLJI_Mk__fJD7fy8|r)MVsWJN}G_^`~X6-X4wv{HIl1c|?T{P|pH2%Yw(`#)|{I)P>ul2{YWi=igi zb3S-D{IHL#-xBd0`&&F3cqxA;ta|1dE0$k*Ve@h=)@_02>QWMj-ff z{jc6!6L={|c&-csCHTLq{2J+-nv>m!t=bT(Hr(;ha-REc+%O=spPxf99H`$N;Izpj zHAv0XCGpzQ4`>SG*lwgJNx2%0M@6+wP*_-qOpJ)g=+0;~c(|x7Z!V3bzNl3)x~Pv1 zJ`(BJn2oNZH?%MkPOcP#W88B9MywVgcW(s14xpt*Te05&i7%E%Y#*pIq7HU^2N(n*Vas-BSO3ueGhkt9XE>-giPi04l4m@Gy`vEL?@@n zM2^I@C_F$>#sI5am!JcdLrqQ1Pxu(Ln8n?tBev{OTlsr)!;Xtlh(N*r(zP@|9p`u3wOe$uB#`FxNx>Qgng7*#>k#&f8Fr7YKyE@s5_ZNuM#?O)4f8n+*?2{}HL++=k z!5dNottI_f7>nSie+bxuh8sO7>SS~GP3(zUcAN@sFXU7SSdNE=%c(*stqqPUFdUhJ z49tIz8OjP!M&fgE=qqmM9vpl|&*eV&G7zt(*8Q6m7~At9XQLB%%E=g*;>um}oB2s- zF^=}*)B9tfeVc+~A~Xdm3W10+IBB<5H7p1IBq(!QcjtHvi-N3-FQ*Bne=lFsgTY)< zRMeTQ2cPQ$h{zC+a_GshJ0Cx?BYjRDW>v|=)YL`a@UuEc_=L@MY7D4uuw`&j2YrtY zuC?UgKxlG7P!I+OY+gP`$)om#mA$jw93KqjzNCFP&qLPgPrzQiM$y%ogjY+rjzZ6H zbl4AIV>agS;$RY?29~>dRea9Q63lST8CwS7_regMaqBjl|k(6*-3C zGSbXhA7Y;Bo!ZP@lPZ$6P%%`HK0AP9s%wNt)7J z9kZXM4vXX)dO+O@g@uFgSg~i+j9beY4FH({UA

&Qzj|7zHS|?5XY`o!pq>KLS^a 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 }SE&Kr7l%dB5`wisj*ktfj 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 diff --git a/reference/smooth_vec-3.png b/reference/smooth_vec-3.png index aa4c9de1afb89292338e68520ec9f8ac0e3beba1..fd887701eeb18c004b4e5e4cce9ca3567358d1cd 100644 GIT binary patch literal 92251 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�+AEzP@X2ykr71L zl{4zW-m*_AKrJ`ET_j__|m{oWsku?%xj14>Pb>kBN%yUjI$M}`~E?=$XfSH z4bFsxr^EYQE=2|H`ya=k`0K!2y3){w#fVa0`+Q64SuB?>XXS?4(e-KFAom#l=j4){ zV;FZ?-iwaH1nWMRr2QiIJmu?2Pr1xPS(U#>bQq71?@krsKP?9;oOz&pKG}p+miZss zP0k&&07>hmlP)l@`ud0|;k4(W`26D*(Nn~=7LG`8eYuLNaOjAGVs&xCpfTyz&X)%6 ziSl`gFL!KXqRZbm4!RN_Mpc8W5@V}fJ z{h%K47nfu?c<-+g1AWK@dL45Op0pttUwszr$L_(-&Yp7hio}oQBGYq{_9qEWp0tq- zX%}x8PNraFw6$v8RJGxzj4PTZ$04^3(v@3`mxfM7@+eO?&>dbD5ebqF>Y@?*UZ^@) z=}I%?q|2}=L(03g7?9`bel|d`Nr&vVfQ??(vP>|HRk?XhPv(uC?tzJ{e{vh7DJm!b z1ApwpAMGaI@|lr24?9wU*W}JkhAV0lF2g6yNUeD|dr3&z@ziazJ3Z%=Z>pXF?4kW3MXie#w5k8;}X5S&LF2vpS1Ds zTyn*&uK7Cl*FJVe)LvK}Jygpul>FS6#{>-p>MhOdvE&yn?&9`>?3{v;`by=&0of0Lg9_zkA%o&(YWS=rk+5_|XF z{RPtO8nUv!qdP>2>>YEQqN1WRF0AY>RGcTK;}a9VJT+q~ZHeW4xVdmj#EDa6)+{j- zl%3R#%S6iCdZfCAzA!ZXB);QqsoaNyHo28wEJml4E+QF)PJw z1-GdyROi>IHd8><8R;1K|FHGm@l^M3{P?j$6tYDrWF=(JhLTw_Gqba|W6wlZk&xLU zn`{n_Ju)f@SqC9|XY;*I>;8Pdzn{nBe%yb2KDTqc->-39&vn)Q>Eu@Cz-VM@NxFqHq+EjTM4wc zBtCOdvnG28uM$p#LNAftd*##hoAV#``&OvYk>o`5_O-Jj`6LEUKi&-|{97!j2jCP8 zEnalSE1qjubYl_1z{QF3`kAoPDx=Ua^21W(ghA;GGd)?!*<3_JLv}5Dk5wt*>9IOL znIS4FdR!))wEzz^$e_-xPsLXb7{4TaLh*eRB6!pXJmsu%vX4qm{{Ez=_sjs!ecJ-2 zT`=7i1ok~swX?ejJ-MjNd~UJ)ty}!vGhIoozykdkEam{&J>R+*0Rg*Rom5CNlWN6K zsr6a=nz&o*j5jDWnZkSthwqT#8u&wJ_#WEEx+0KdpJZn4X2J|j@N--mp9s(Dt&<7A z87({we%SehE^~lbEWvjU1#@;uY4{hK?7#KWQw3`6deXkS6U#uwL`;H@B@_;_Fer`~ zP2f13jMFl>4*^RkfZML5Ic^t*-Fa;cwYURfVq#b+>ABq6^7=9EQA@iMss82S>MOWP zDdKTpHC_XoA_JoXaH9T@7>1i_)UP8c!ol$f?EI6XfFlb+a?l}Y3IxHFda(k7tE5rm zoZQAK|F6nae*qBt=g*%NA}vhu_Z}Y3-3QPxf=TSNXdNby6k$0~c>m)Lgi5VS^mJb4 zH&;5fIK*+ut1NRdp#6Kp6hp%+`rc5_A7@RL?#iBpN5lM0#4)g2a$QM!_s2QAx&ybE z$9uRelE^2}C&ax-N=lliUHMvISoirWr&^LmGz(GKpFNgW2-HvdWM65Z2sd{)By2hU z_;?lp7TeaEtx-~05S<2%0&r@=RITSQ8Ck@mqeeOKq6_0Ra@Fl?{1>lnMU?J`1A6*) z2(m!*IW<-S#S13mfT6{V^z`&En`n|zh;!1IUb}9^tMT8)UL`~N44qVOg|g6z9|Swl z5+9RwauQ(iUcmw5pX?wtsupKiVtF9aq2D;bI=_7;=!7t0S%8F2O|r+fn13lk@B)u? z!9`vMZ#E8&cn07M(;PwOHLsPD2RoqS<$q^dh}C^Ekf{7_3!tSnMN(cS_9O zVL#GC_c9VIj2edUt`-j?f&$$CpO2Jqy9^&mP#`i)u-)T#*a+bp;hTHQVT_kU#pCsF zd=KXn5WN`XCL7%212m&36Z=xdIYN7mpesRZ^pc`1*k$#(btZM+_rPHoc@A7R$Q!OU zpFRSPj4m#NIKwEgu2E1?ndqI!#gH8jmV0BYUgzoeXWxsN^}YE;c(trj(;6y$7wkE? zvryckJ@A-XiBGy4|1c<%3zlmPEcStlPgI|UZRfr>(-!k5N;<+6xun;7aWrhiq`o6ktRQP6Dx=5G>V zVQ#M37ZV871h=2vx26k5$m{sFUK@xsgz#;i71qMkp>4yj=chZ1a8qlm3u>M#yOazi zR2%O&Ev-~;fdK6b0p!y}7R?O=(WZk_-FF7We=Ux1te88u^M$vzv}k^-x^5*{YWepJ zQh)@ffpU8mL}rQ`15gburEtWm_q`W&`hE=dx(VDQEdv|zhSMBI;tqEVQVlDT{Q5LZ zy^o|Sx5j#=Q>Ap&BoEIvZnG5NI3lzgN0eSXQ_fUjt6v1Ov#9f|S~rjM*m2WSTJ@S+ zG-UPonk&;&Q}i?75#@S*UTt2z=ijbs=&Vay8ixLVv~m83w2%%jrBv){SDH_6=BzE_+BoZkU^Z> z=@fixFhh#Dk$z0o8t=k`Pq%w2+U!wOiFrgJ4_DD2JbC}3x8WZT(sZW-|WBgb4jWV3e^(( zBN`QP{&4-=-L1Oz>Pd23v!pJ`M;ybhr=q9uODx|30Szxb!o(h(^Yb`s+|B>a`^T>d zP!PwW@a-}Z@0R~DBf^ha+o%h|H2D>Qxja;i!oiO7dHlHsi^PVEB5wSS#=`gS8wp&2 zuD-;&{Md>OYkX3YVt0k(_ekc*A*<%NWTl^PZj}^hMH5{hc7HjowF1$AC0`P-C(-}) zm`P|>cI`@@Cni3?uZ?5l^HkUVJW#9LH4v;X zf@Q-$3`g$+{*85ReFtM4+CqtKDJ{LHJ#XV_o-sr}=9=xA-!m8yW<+>YR-QWbtd=h` z#Qwe8w+ESV40j0%v%U@Y;K0uf6LtMsTGG*d5x zU7cF!RYH!ppAausC*Vt^ISJJIOX#8jZsq;qBUB@ItyoTVqEde z(a)(06k&Vo@4_t7J+DpfyyNDd>0ag|x#{{MVUk07OY($uIi-;pTRT*Pr9pB8TGA(O0lhpRmROaf_93HSLnMBqde z0b0h;3Z3VDxK$D0ae)jwhia+&PRgXnMK=jx;W>na`sjW=34X0j+`p^U?VSoWij+3Q zxsj|WSHGXx|JWMc&{7u_xjPOhVeb1rKoe zp4s)LW3R;jDf8tDNespmR3A0o;haYQpb*r9$o`c0~Jj; z!O98e8dzDTOpx392(*oeC-L#E5ONq{4QKv$mwk4_{diWZp)mS_uXi^S6PGzLRz?yVYg7njS>Z%Ry~fCm(?{CEbaw(dcTG_q|! zTkkq{Avq%!gE6w1>u-!X|EuKg=-}9UdWs+HZkj;JcAQ?I>4z=p%BYvHlar)I^#PUd zeU`|?wre)wW#bAe(zE@w;E|0I!-l@F3kbx3KuP*=+XPtVW%m(X0=?LGfm(0o{^u`% zU%w2xqz?E-2rN4T*_(p-T`$Z8qtYb3PuxL%yYZ&PmNBMZS`(d=kkAIfBa!Ps&whNX zNLwc+R3vxpPbKibPuh$C1t#YWi6h8p#2G04&@k7Ry0UTE&55}#mR$0F@u!Vu+G}gy z;IeNq6^Qc~(XE;P;O;E^E|Hf(y`Edm^?#b76}$H|G&CW=op7;ZHb*+iE^#5pJaf*w zphEa|NJMyfXud)9lv!#+AJZQd9{$=^R%nGSUJn;}^&^PypH*>)r3+nGh7tl2^y)fH z#=6$w>Gq*s{H+Kk=xs$!pmI*MQ2-&WvlspD4}qG4#|S-(734 zNl9Px^{tbSwt%An^eox2h5m{N3xF-w#sv1-+H?Ru8H26IAA1_TA^AgbJXL`1TOC5K z+JQL8_T-G~U|hKYaj7Qofy`n~!IjP_re+@ZIF4f^4o$g<0>A|s@?FSh=jXUkqSE>E z=N-l$(qdnti?305$O|Y6_J=ONlM8}VBk|v}jp^T*s(x_K+k2m1 z_hK>$F9X`|wGh;<>dgNNSaocQT>xwc2cVqr3Za9Y{022bwv~=X!;}-wAx?(hooDJLdS+5%*2RrO64k+DS%9jf~m?7A`1GVEN+v19rpg>}!N()c&M<_c+}p#EQ2* zc!c$ub11T;{=Iwklb|pI&EGLJ)T{{q#_@L@Y#Q|CLy<#^glLDIfJRGAUejDhTCn$qUa5&zFeIp5Z&#lRfjEst4A;XbZQu+=-G&zN? z8gJl_DFi%QGhgo(m~gT^#aK&2?p^+KZmK^)KgY8xPlCQ}FVf7+4C>Cii662lN9Xk4 z4fvNA7Jht(uX2V)LU8crWrUPYTe#z-rB4&Fx{?t zr>y3aZN>dwE+|yq?9N{TRqYBi@xYwLXJaUl zhFkccmpz1>mtG70(oEd{`D%rMBHC}WL@=8|5TFP(qx$`Mt`AV-B?wv5fJNo3pPO8% zrGqHb+w50fcj8Y;F4E7%b|}!`K|UADc2{^ zgCr4qW>~CeIXGs%)6PypYLi)0D1{!R9G&&K`0Vsbs#16eY=s1DAcZ{-Asw3fhF3_q zimozw>fAW`qa;87YK4L7^*7>b|MQx-)!ZQ*$119v$o>q#s35QGDtXYm-{QVJ+64+c zEshT&goXwCo;`vB>$pn{OmuG|Z zMdbz_nr6CjEDq%MzjFaFFJ9K?xQuzu^J1k&8!tlTl_}j8AOii@j}xm3J4Ps}3sjrQ zDjd)#X9Aj!0Dg?6p8?Lt3NTzERQu*Z`%mG5MJ^7y;jU5z6|AdXf$Qa3AXSa~xg{l& z_xJZr2qEt_WEG9~so7#PfFnG*&g4}8XX7aYyJ`KkBAkyquUsZ3&jECC7OnHvK@SHrGlCXE2vTy&l61};RLnRLyA?x6}u`w$Ift?n{ z2xG>9>YpD;8nF`@@^?i$VaCV&X6Vzo52;ZBIQHQAL4t*O00e&g)4D!MiHWl!M-UNx zqU!78e9UH^q;R5=Z-2+#`f6i2QNP1k;*g;dPFB8UWz5-hkz2X^)B4|x1!azs>)W2P zU2%h}hMC!bYnz55E9<{qcyf%yAgQYb>N-%@oa0k^(G-uiMo&E=zpr2Y{D!PE#s=e! zDH-##z;}Jn=tAQs@pL9F96f$1js%G_3b$vS^O)5j+P^%vV;D~N?Ud!g;u+D=*&-<6 z8;iJ*(7;WOKYAUpKA-==1ngXh+N2w%qIDLD#`K_asj6l7=P5x7Q^~| ztNis(^~)7%Pf*Y`JtLtZV>7WhpeVHmphY4FtZ=X0wPk0)X~4j-jQl#+^*8QsKidi9vkMdK3xR2ah(SUcsaK7gVsUf zz>TcI;gh{{hXVTdeQzp|=oQ)O-l9uR_%SgRUko`p^~WQKP$@1)_!I2PB)i|B2wRg_ z9#p9vvr_&#r26T8^XuVTsx-!L z(aYbMLt;A3?-emoNd$zUdr`Y{m&$Bb@hbzUtD&UA@(7?5`3Tlk05Y*be+o5rKx!m1 zzE25#U23^PhO99xb{{Kc9M2zFnjZCX)~S_D@jW1E(|#YE=1ZIN%hOh3@V54|Nlx=1;tQ-=8`>9v+B@Qkf69t!y~OA~-ZQWrQ1Z z)ZNrt--}IJdnC7pg(Pn=e^PqOrWqp|uBq2P6!H3r!_Uw7mJ?g&%O%3*JuTKg%RK+I z+cUC&^L66EG=%ZCLt)YekS+p(JM!-6!}`?4qFh$kNEU1t6jShUncey(DV7%GpPF7< zYQjbLy1QrWkzCxd5z6;)y-=uK;nT%Xx5t6li!OQqPHR*HB=r6mD(8bbk7LXH`t@vz z|7u5UA;N%Xh&SFmzVz)z{F*}j>1IK_gf92BVP|_h3*0<9sa@hxKbctAEi<)y-+JG_ z&8(3XE)2k>DST0md_1bBe3`z*TF8{eC&4~>x!bx~=%^<7#NFw2(Vzi@OGEFg`yl3S zksSL<4AJ-J+cQaopV=~W483|;SoowwBF)5E^BUq?VSw~bG5_+2;=u0a_1)lVB7eW8 zrj@IDOrSOYbjPp`PSJfx#>fQr?JQCRq&<)RQi4xULIS7FKw$uwHW^I_2nZtZSs(Y1 z@>TdBS#MIS#FyV(GS$n^Iz_{LX(=q~;)8xHat~?YkPk1iZ;*2=q0!ycS$uqBa@6;z zwc}II8ikKegWQ+bra>j@;0Z}ndt^$38zf?r&T&$^QQWlcBnTmtz}%_01Wd9n@X0^r z!naqeV=50!d|Nc?r0sJ0mQxG-e+n~FmD!mcgpkeUaI=;^|L^N!s}qPqN(btTNfLR| zKcVqa<&Z`9=OM#MKT;`MBA(|;7)Jzf4d$H>KBfnZInVdyv_ep9B?xB%QC5TxJI}4{ zA4@(VEsJM#UUBxi;_k|c?yMtP1c7#9gG?B{-B9r(0<;R|#Y84JaRos4iGU{4Ub5yD z7m}AId`!q%o9^67a9P(fD%L~KO0W9I;=CxzS4#J5{#)i$H(DS6v$Dn?o&$@Ki!)vj zDsTJh@6mD|ABB_KIF14I;Ah0aTKFB#>fKJ?VZj|H6JMt_4q0&o7#;Xqk}j_U zrdHg}H&7DSTa`}W3nPl#O{MKWZG|jHit(+gz7OT^ejTtC@Ei@4$1T9xW#iOWMvHtT z>~Xa4^OCElFN^c zGgK|UXwTM2t?52@ZsfA$B#u2q$962RKw%viRd={6h2}xL56dJyGG!_(*!IMC zU`+Mz|4<(24pqWUkNDQiTxQgB<)jMF8I?)z%C~}vNMWVwl?GND;ht$5k7lU|A1ns& zuk3dE44Jfwk%KY^r~Ic}CTOJ3N%Z$x2%oKQmRL5WJgrZuy)-lvre`axn|LnDlOj7r$Iy6^w|GW;rXxy*W`}a(9Y^!^B__9FJ_y;aCkOCkjIB`j zEY273QyY4bAt#sZ8T+f;`7T94F_2}E>bpC8RyPfMOZ|OM-_Pgi6t^r(0s&M=&Fx?^ zVTcN>-YyuE@;tTHt4hByrx7}0$G4dbu@~_=k)#eF^^a!=4-LgYSSJDl)`JWH^Kk@y z@lbgTl>Re=QDKb$g~*Erqob zu46PS%-n?wU-KAek|$>;y&!yTbuOns089hepj@%~dy>Q6>o?Ghg;D2)-I&E170Ud= zlP}@SyN})P=psmm6jlGsyavb+j;_jBBl-HO{#mNZK(>Z|rtNi-cAH^sB7e|yg6-CH zI93-WY-mOX3fq&yMv3v`nu0Q{#--Y#T(b%+c}Y$>O4kY0}|~ zJ^k-g)2@1t85GixK^`AR%|(i*F93l1^KCiay?Yl5EzfSGPCyO~AA78J?fu)UmduTh zst=~ICSyPbb|M>2MH_7Dh1kg=>FJxNcmW0ec;0q;W(uMqMB7U3k0 z+hFdd+Y&k=X;84LQz9VvCEt8^!NdmWidMb59{ARuP8tlS)<=egDdAM%o}`_bK055F zGZxVfC$zuK!>X2)75GP}{2d?E5?ErfuIQ%!joDdLqXQH2+ogd;=g{coC6NL+0paO! zezzt$j#Or+f=Ml))e|&RAi5DPef8+jwXH*d-+3~TC#gEFxU8rCa5giTPaA_$d?^Jbb%! zVxfMh7U{#vTAK3j0-*ZNxT2CKof5ygpS@ss*+{x3ynyMI*@wlrvJ8;DV09Woph{89 zzF)W95YkJ$R3S>jhx#a(5Z{V<&KoKA(y|w0`{^SKa=*Bzux{@nVocyk%EQQTi@Y}m zH75c`Sq5I+2f~Y^hMnT+-GKi-_V(@DXwaAu$^zEuv*6~57`*PxW;iZ<*l|EW#_%Pt z#1+&xseqlmolf?xid9K@j2I~I>D=GZ1X-laSVC{FxnR^7L?yx;6iMhvZmOts6X$)H za{5HKP5Exp*80A{s^k1kA9E>HtGR&mt-Uf!Bn%IFFpAnC&bxN~`+v%g@A$d*N;}?h z)vPp--rC)@UJJ!=nXgFbKejN#;{(s1`h$5AU=e9naED#)-jZABRlQl{Ri1b?&3~&i zh$wOrEEkX%8vwzhpyCawFX2Ut+^^xXA%s5oxK#F~iDRq3f@Qmj-dv#;^} zXn4lScEz?aWDGY|^Z4K>4Y~CH^94l3n8-~gi$I6`QBoqwOb>mZ^05UE?li&yjs@q% z(tgcv-@F@p0BNFRVKJN@?oJ`qDY+07&Uf*0OX|?&P>tzzgk|c}`U3R4tj+2s6pe_l zK!km7)Arr})B&D00S64FVoY1)%a%rI%KD0 zh@dlJO7mK()K(xsjXA^24k~*3TiV*%Z}Z`7i%Bm59r{#Nt4&Dt@Wb|nprm)^xEVh@e@Nu>^@Y&=2u9lGNRbwd%ku~kgF0pr_QU!l$=b~aaC>!JoeE&R>}|CtD;FF zMCsHgm5+~kJF}IKXsY?_eUBC6(SOnXikkh|d<0fYNyTOGj-B@*X9*~53y9Xs6T3vPlU znbnS?C=ZgmnY9XFD$h2404gg8erkev79&zOIs`TSZ$VP_TqU=eWGXT&K8wk^YO`VK3h|3eOfmyKQ~d4 z>}jqrgCGXtVB#xPu-l*QAH=}KF-9^Pl9;$JYd^Uk#!;m?mtpnNrJaoc)OGmi?i7cm z%9WQ7=u~+2qidPQDG?2g_ZJ43YWLTUxm6EUjF|>P&KU%!vt3zz#!0bp;L57XPow2{ zoPs{F5x&9wpSRe&@kSvA0Q~uQvS1&sfQda3)^64MSS0SmzoV$NT?7LTz>#A}UUphq zeRb`xwtcDX_>(PDMqHyTw!Q3hhkZgNW~Z-h4<~GWxjPuaobsrdavzw`X@|wq9WzwN z#r(QMXB*-2v3K_9YG~0Xw?R5I2_vW`fW5-zIZ47ui{M8@%SYU-YK$6onOh_<`K7(B z%?Riu9>dyXI7^=Zl?y59KuzdXrh+7(9%efz~LhFL+=mR166QP%|TeL^^42P}ZH0sTAR0 zbs`Zr!yTpO)?5Kd_Bn%lWz?Z^t2L08k{chd`L4s{h#t6(5}~bvDG+G$;)nZxD4r}2 z0J!{yzkC&4^18)*dwqy#V|m&1#flkbk-eXZ5!N#$J4{KoEBtBq#ay09FOMh~ z3Lp~1Hazopkwr82o?M0c>cWDX1o@*zdlUpNaja`zzpmnusT58a-h35Q71*(iNN^v3 z?^~&IxvQhY7)HARxS3z`^B!pX1+k+JflO2Z8Xhn+Za&n?)wbo|;`yg9+8I~adsDX# zxn@szO-269zNglf*mcSDn9>V%$_j&arK%=ho&3FX94bxE#);iYJvWUH#AfLFmDulQ z?XbtT7d-CI0popZwF|}5dsEMdksxMlgWMu}&z}po)YK^9T~5`y1N$nPqEh9)+^sA! z5F~Nf^(*eEITZ^p6Wm=&qZa@U7$1$Lbu=i^Oaaa`x#{iEo2G zys*QdS=rrF8We{cEsnpP9Mzwy>Jj&=ok82M&s5GhR4RHdz38f+41M$FjZK z$;_``(RY0qaQx`kN`66f*Gnif!+5ls*8i1YPtzb&X}XQ?e`XVF)?-0BD#MCUdEVRe zc%v}SZ*5&l!V3gkqCb)W#Kv0zoBP9szYC($_yl>A#=h2^;$nD$AYW{TRNzs~iu&y@ z`KRk>So)nsLxF&P-F-s0H2eD~`DuiMcuI@5&M)B8+gnmIXA@r&DqOE*fu!7&Utx8r zX~&*#QZ)hZiYNpx%99bs3lb7Zpd$qn8;D(-zHH=aM>muo#f zHO>~xUmZvOj5|quW2}d(=zc4=}_``JR@Ai5yuEmyQSst;!^NifR2IaS0gQvZG zFy31q1f(=YJH;#)=~ zov~n*=}}pj(JHx(2{JQ?j*7x2y>-qD>8q=sVvi**AA+cE6%D?dRu`&Aq6Tf)MMTQ8 z<5`8&VV3V|P$dk4IZ((+KAF>}fJ9c*rnM6n4=uL%Sxiq)XUof~$Rm-WkogM_tW8x> z@sKM;-C~4u$6W}P!bYvDDASFAyUZ&+HzKv4q(sgZ)ESM411uIik6JI3-o0>N(Biq| zd4ZVWN6ZZx`pN@F6!!|{xuM>Okh2aZoNAm3hYsePCc=0?20Ze0&4DXEd=r12~eE`0tW ztPkU155V?S{EQ|P{>gi$Xl@jH{503 zyH!kracf*lN$vX5zSu#D}KSFc!KU$D@+LopaFqtXdeiJwUMN`_@+ zB|wFz-BBwc>sq~Pmg9SiKRz>!Dzvzst* zVRh>uFfcII%ItPZN@p!;X|3EfU^oykG{x)?9|LF_0;Up6nr{8pcFT7adzC-Dwo`;~ zF`^!9cho>Z2nX=6=<@V*|3HJ9l|$bvBep{k4*jQ3D|erZesVZuf68rkVk=^8KO|?+ z#vCS_0EI26xX#x0`8EL=Q{b zKn8_FrQSCiwd-$~tb7Ox+D#{5!W}*antMK1DL~EOY9jXs^@7_?jloOm4O+n# zksP4Jz?u|&TV1^ga%@;!wz^|0|1|to&o%1e)L-5xO8)WV2bZ4m6r?%I-a_xOtvpyQ z{gSWWep+Pd-B!Fil@kSpm^Ahh1zi)?*_rI+w`nrf5r;KCwQPfy^(Lg;A1uMLoP>#` z6Hjk4kApXN8vglN?F#~}RZP$cLZ6ZUKA1e7^sCK=O$Wm@nn7$td&Xle4Uc`#6`E5R z!b9?5JQTnA@sw~p%=>5Mz?z3LrQMyoX$~sZ?X=|r-)BNg^U2QL&flKx9`n%ML+;zF+oy@C>lHdvG`B-FoZtp+qo--I6-T&;Jzk2Ov9s zr%?0zIld8xTd02sU#tK%i*EP&@6|V<%qwIz_b(!^w>0zuF*bxwLn`QKrD&*$wLtVDZm^ce=UWMCIk+OpUnn{dTn2 zn=5$>^`!N9qp}64HIkVWcV;a;M*=v2u!tX5sPvuRo`ztVqy64xNjNhfYpNYUR83G< z($eK_L-WfrYqYnkxsX1M3r2la0jYk69*D#3$rI8$->I-=GWGSpU!nm(w*Br8cVFu0 z?t7JxiQGXPpJ2Q=!#m1XtC_@w1VYrFsV7NfIbq$|**S6&(uR8ZuS85x$OE=?iQY<9J~T?-0QfDAHy=d_!m9A@IFHGp3Uo@!GjEO(f& zo+M;#zF&C{92LM=i{xVwuJbM%VO+m|BaBzA`JxTIEp_f2&%~peUeVf)4YtMw9UC5L zk)$r54%NFFve6#!c=YOR!04HXRl|k`NBwy`hiNr?ar*gb6y%MPnUhS_G~Jv)FGn&jdG@v!>QUHzAU{3%Jdd9fp$+TK0b%oUI; zLq03W*Q~W1Lo{Cj1vu{VqL`pjD7XIJxo6PrQu)K7bqU-GF~;6%WLGhj*Uui2I&>k%He>VAyac?&1y`Qa@>}QpU1A*+9CDXaWCKwmN5Jy249mjTJ6f9%|kj zr!{`@)Oag9xUW%`ocRBdcqq|vZZ`Tbb6;`VJj@MnrW@|u#r7%n^0~PZ7;_=zcpvdobL4?A-bHV}j zod_eM?t1txF_#{d`q71Y%Al_hUyZqP8c( z<-Qd_4Bx{rDvp@AxMmm)9Nsuykvj6V++)PVtJ<0H@u6EkB(i_K9eILjs~*H{tW7-? zhN**>um0KzDbwT};#?w4Jk>mXMbq94CEdDIJG(7$r|v4XFj*&4pi z%I4;#XvY8Zb=)v$9FqlwmEFBP=k+d;UYH2LgHAy&%kJs*8$5qnza=}8yaNi-HJ=+0 zMbL_RckeV%C51pRMw?XTM63(i8zAyk$bEKAPri5JtYs8NIM8hqvLQ(+DJZUhGq$Ia z9k#rx1Q8otbP)UU=c41fw1xlfCS~t-MsVrtGLxO@v9Ovm|+a3q^<@159Q9{!Nn1y;q3X1Wr+aKcK z%%)^!j%qi31$c~yrx+0|?aCJ8qEmNWSXrmi#G8P?gCBJx2=-|aJ#z+4N2Hn{tDbLA z>4#U2@G34I1Xp96gxmQqhEYV-?5FHh|&< zKYaKr`8MA_lF?_dxAb|}|%f87(xjXfHFao9s;10>wG~@&^4-F}#W4r{181szU zU1g<&lct?SF3}u6M%+`VV#8>yzBWCN#b^*LSHe&<#z_eI>6}d7V!!P$Q48 z{#BsBJF~jy=Vy_FTc?q8CbO>|H(l%!W1$n?ieWkdKuQ=qqxVBKsfsGoEzf!3s33{g zccX`pH+&3)OfdJjsB(E>n+q_DT?v@66=pQ_-Fe$u)SIb1?08djzF$J*h=knj(xs_$ zZMUTTre|8e3t2~O&eeO3GlyEBdo8f$lxd4?G@%RJ^i6rzu;}W9F9&#Vu?#j8aFs2cyb%*4+q}VIsGb^qLH8 z6-n#io*|o$1%{%GBH}V%tOU#eHngXzaV{;IF4eO=uMS_r4z+qC+CyIc7-rvH2V~~q zw0zygvoGLSOa1Rlq>>m^pElGA>^B}S%ewpE(*%jPPiD2g8SV`nzwz|b;mcLwxgT#M z@+THDtZCPj><4PR%K5>Uc^QTsd?;qe`Und2W+9NcLY#(u(!s@I@bgXnnG$5%rKG{s z`P~fVBu}B~H69p8_f|1p4MODdQELkMwYydb5Fo(>!N#7Rg5YzfC^!wj1pTRzaX+MB zHh1RvI*Ex9rlr<5yQaJ7#a#%ZB`ITi`r;{=P%+Y~Ol*tY62!|xvVn9Il4&tzIs0asw_F!nrb9gBq-IS!kzn%VXOUq$YMXhn@>=$mJT@$$^DI3+>wd%Vdn=UK<%1 zAs_4fe9T)$WIF^WBV669q$a@?ZFIQ5b7P|P0yh%i8OsuUhZ%*H!_D{;it*yy@o=PFm>-b{|k*!9GZBh|bS4Ac$pYL0G(wCkMqlCl`O3zI-9m@)LEhe$h+B;lotvLa9tam(aNNmxJ|ZgP zqbaIIc-XA@f{LsJZ>eIE{IyempI2WJF9Qs1d!UZ>hNeAv@&uO~S$8y=CS>i6^Gyoh-*`BWrV2D`FE1}E z(LgHr`{Lpn$|K-R%_AgSejuLM2X1}IvSC*_E->9Alh!hJq}y058=h>!;ZNk$;y&sD z7IIdzfd6)lxj8!x=Gr5?1vjPyI(i{SFO~aCyyd2Att?@ZYx3ed3;H3=xY07HE#+gW zdDC5I{QK#Yr}A`(4T>7H=d&>c%Nncsy5-$;w8@yfo0?zwm_#u=GIpO>lWMz+J&t;0 zJVtH%g3x1PCbrqo+n7E4?~@^0`JBJsl&MSIQJp)xXmPz~SB(d3;RhU21h zRKMEtKghUvz5YlQRb8*lGlY?5dxvn`$-85;CG8+j&mrf!?p;5brqrApYH z8$0?Lo4o`3JJRIzw=%Zv*-S|ICBE;oHz8;*eIipypgS6)Z}noLu>aka7EJv{)q;Q> zUW`8s(W9iNCl(zN90s`LVU+Uq>u)M{p1B}?9Sp2$0MzwnDPKOl6Ear85G58ZVrBYT zHLYQ*?X<|nNIBAjLi5CgdZW}7iKn5=iYT@EY7p5&er*p#t45f(_h&U8b)`lwcc-)z zsnSh&E6XBodIY%-3R<2lP)=34caMQ|zP}X*Ae|)eQ)9KE@FK7oU8+bVa@?Q-_8~EN z)Bfy8v!Trs(Q8>xj}g4n?Qgls!e&x*>ae!ddZ@xHUGPeBK8ND+UFM~VmquoMF? ztVPNS2%vYOumluH{}nmu&ti4<-FLcLP>p5~9k_Jd+o#6)sLIurM=#-e&wP(jeI>=c z$LF3I)e>=0i`RQiG!Y}LaDB|Xo8Ehg(BpsPH6lyP7?ry>J*X1wIyV4#vkPGTh|r!a zjFk6wVNnLe>^*!8R>wCbxBm!j-r(*UFZim6Co_g0gvSM6j^5lAyjRva-7BVf=sm7D zSH$9P%3y4c=RAG+{?}ZDCS-h`9d8(Wkt*sKDB)kH%#Q1ONbk>)*c1|>+490}Bv&ap zp#x613IW!>+srP{^WxrnR)apK9o$q0&IC?OnzD6$S_t&`l z_sspR8Em=;^@A;M8a`lRnI>GI{I$W8s3D2Ibxv+uW-0tM^mDQRglX~^J& z$p?GapB4SyDvnQ8lG?7bdWA+9JvLS+pO!RI!m05(x+rcscbtJ4<-yz|8LN;cow&U# z-tDp25-D9`ryn*GA}$&tNKqrk^|*=8e0^t2Bf|CCBlGWGHC~h=($b^vFq`Y^=eW4$ z)C{2llMhq-w}*TRC=e@)1|MBBTR=>j~^R9P}-;bTv373)x&WLuy zG1^|KahVs!7e(N&j6WLdeI<9!_h=-Z-{fjr2QIYj!>9Y#sE4+n?F~3jJ+N7R==kGF zvFDcIQ3vS4B*tc{JXdhR?DPoq132A>)#k->sj$>+dQ}DfKrv_dKQ(=PX%So9|Nceu z21eCJcGX6>tU!*`WY}m(*u;Bx<37d@O^*>>T~(~ucVfgNGB0#8V?Efjz|5Esp`#ML z65E4WYGGbWP=wcUx+i{{7m;O_5O7w*pMN*A`)%C?xXvkmwR69&^OX_z!#5ez=iQa9 zwL2n%okGaOX2Q?adu90g=nWX1#Voq%WJq7Uka)l7Q6|;y$L_ zGQ&i6Y()2R1$bveL!S}-MVOvBbEqVQMQ#$L6RzsD@+IS>wu{*dB!)&sU0f60KRDRo zyF}z*n`5q^_`0Xz;qYA9MPA-WaOtki`yF0e=~WFH8BD#e75q>%pD1-IE0Y|!&9GsY z*iBRqucaW?6BsJ*k^cAm6Dx-m6O|k>$IH_c7WqclCTC`}zB|HA??6I_Q2H@M zJHOe_IAcKMJ@R#Fr|#(W*8Wb5qzOjWlZY_pI%{ohES*qC+Q-{Ov>i3dLE*plo#ek` zCt0_4-)8NnW~~LsrM^XP$Bi)p$(S~xz#uUQ+aGu#On`ARqBFux?V>i+oas(RuF8>5 zZ_MRs6);QB%(Xv>hITNHTMN2QZ0SJq@BWS&Tr70UD;EBGg1di}ln*Drg%CUlke5iU z$b*A}(;|BA9GQ@!M_y2iv z86ko6KLZrR zfU%?fC!^BoFDH|fhHZt5&(9#U>tw70ZU)>D6)}-OuABjg5(jNubjb+qAMWesOKh+e zTnt}W=k4E@NdF9+y;wQM)8yI`0-ee=o4|5znRONO41T`u?-#%KzQO?vUQu0fec65IaFLfJec%ymAQc=UEmC99{5^-mVUWX2r$4^CNk?vz?Wgbq$} zyIxx1rG|!vHNCB7T0^=?pbBZ`24U<5^Ew)hzB+Ofdr5st#tS~_;+FD78!YDO_JbFZn^Z`7gaxOcE zWOL!;$J@~!4h{}4mtY{e+P8l@xaGUbkEPL?ArodsYY5!euKsD`6*7)$m9gt9ddpUy zl$>nCL`p^`WfABO*$z9JT!x{;)TnPpP&ak_ySzIRfW!Cb9HBz#mhVEo%$25Qv6=DO z2Rz?ts@BgH2`3fhg9fCTGN*c-4SDVA)iw2RRe&D?e3EumMqUaHFsCnD zo`f)m(Fg+c0R3+;^!i#k42Fu{;Yjmt0LUj2NVS#-#QXQjttQ4c-mxR`EfRhRBN!0p zsC-L(Wp{fUWH5kL@03}JY7s2Mf8ldWqr9>JC>uCaXdkMqz%Z|P(@J0K71qBiv76UD z&>isF&P2gSICzABW(}4dU$2!APRu&ZS!SGy=Yyl(;&TpY^Xo#Qt z`};S9{HZ!$f}`P5PZ5OpI(G>L4b+X{%7$kQ>Iu)@(VIeXMlw7t^AtirLT3-ITb`4I6*H=4Db>Q}xnVWxx;1@)G z#RLgJ2IlA8>nkVc0SSc0{{kHAup$EC{cyJb?v9;surk}30r;}ejN5E3ZF)&J`R(bM zF!vXp{eB(^`Dl-&+i;?+@f$ zvE`@1a%8!79nKjlB=L`O-x|mKbm{Wu`Z#S~%UB^T+<^n_JB5|DqR>RD0pVW12UASw z^60Tdn722{MN04_VF_5oK8$a@d!+ySHYUZSVr&78?7k2@=IiXsB@o!F*T_JF=<>Jl zuPd_`$%kB}3uW5Q&OT0pU^b{8NwtVA9bS`|Cd1xI@*d-x_{+IE#SxB5N}V44kjgti z*OMwWG&KI_PmqA7tYsSx9X#Qrb>7iBoo<8o6(3q3b-oZ<*E3|`Le>vvoOLI#x2vzO zm!o_Hu7a37EG;Ecz=8Aw5ZA;ze@>q^yxBNHEAQUaq5~ENgdK7kF#bUsc!k1ZHzgQn z3MOf%x3>!qx5lt55PtDJO4L$P9u7VM0nQ4jjZf0hw7@K~$GKYhziuGZg$;IVg4Io_ zp)W_U)MpNw>klSHE4_Gsr%1^gxfhS)T&9ro9@3 z1qEX_He5`Wti}KxliB^b7(TeL`Qm&Kwv$scKpte8fvzZG6^^3rY9RaTy0-59dg2uA zXbzJ$SQLJVRKGV60W3;q~qxBp%^} ztYY-p%tT?f#$zuX;&`5al#>HXAQFQDjn{#Jt7W(Ez-^qz<>!wdl(UBb1_N$}4yliC zK#m*?_sj6Guxmg7YYaX^@*dpjApqnBwBIRi*njtd@^QV|c#p3^!c>zyTEyDVr7l~* zj}CNz69Ct1Sb&G7i}k}~YbDR(5}`4OQV$q7Au6GjHvu`jQ2KTv-3;JY&_|{`xEKDP z{l$fZB8p+&bu)32_u~E<2=0~Ms~>m zfxE-ThWdaUw9nUg!;sR6{E0RMS<^-BlD3b_stGz2!$NLjHL)k>*s!n6tlo8?bW z9=l-mZeinPIQyLRXz6jV+;y=;Q(@Az075->2lKwrx(iX1!?0mMgVWT~LW~CsKK|gw z!?~#fljG{22S6{p2ell2kjV8{$1hC3Q;dWM7*1%Ge75rVb|%}NEgT@^<3l-CK#wej zQv?1HP@d0Y$0b61X|Vm#&?BVUy}ejFV~5_HjJIW!_mY8wtkt2zq$T14tE4@t54ikZ zm5n}JIecZniRe|>4mu;PMlq}dT}ta4f+^~n!Uuwn#S|8%BA^1@Fnm3~OKH&sb~A@h z5N2fozae-=m_gGwr3>B-xYRr0s4_yZw0TeNkZbOtZ&&E@#Y>lRQ?K*>1`%n-H**>X zsreJ4-oBqK1zD%cbBkZUeOqTGZd5w(CLo~Rw20`iw?C~Gx{99z)3?yUxgVd7!E@DF zbsRhZm7plDdUyHmgO_kL!5@<*fNcUXR~OD-x(Uk(#?18=U)=VF8_tbp1gRb&!r!H* z-jIEHo-_63$FFvBa&oZm$b8^%VQM^VEmG~U`vX5FM|;~Gbhhro;@+!#hF8&cstlb- ze}9N$`4QkyfZ(8@B^FyOX1Kb{zijW5D>9|~Z{M~cJT?yxtndc#+yCx)AM81QB>M)w zwv}!RDeEhg`Zlx7Z6DgCP^6)ES3kP`j|*^X!9UFIrGK=YF@s<=sjY#50mTh?ClA+= z!wxu0ECg^kW-{uZ?BP^mi49HzAfH+X zs^@56hS$Jh@PqI?tj_=Yl@anc&IL%_zj8Ex#xSH&+X7n{u{wZEN4Cech+Trl)Ery& za8!ixSZ!?;Zddpx%kC8#6!bg%nfaGA;i__|AU+)ok5D?|Rk8G93rJe$E;Mho-u4n; zhAVa>tRA8(pA;kibbpTjzrPt_RN%@qi%em>$g~3155nI29+3LsR=eR2M$vHmv&Tp~ zUjmttEI9a5xbnGFYMz<3HtUFS+3h+@#Y0MTvR<6;cIV{%j;&?2+HB;aq%i6tTg$@A z+BR73fSAan!cY(#$A1#?CSlcrL?x6>fN8QLF*{`Za5<^opQjjx3HV87W{b9|&SbDd zTw&KLHoqFeCX4pmUUglN@Z5GZ+J%;zC?67cWo8tOe0xS=#zJB~QbjW&U~iK$d6&M3 zIhfGLImL|uItG%r%vq1+1iZYir>BPyGfa)NLCD)dl@2|N?{b4%(ev6Dc!ILg#Wsm>DmcNj;sHZ>swO%#B-EaA=LT`5G1y^hw<4o+c5pplT7 zgf@Z{-zk64R#Z~_c#)ecHU=%+6mu}(%oV@IKpmgy z5FLzWL*_WJJzwukJ_Tc9Qasq*7{DonTD9#y-ujmABFR@`IdbZ{+83#`O$#9E-}SeR zUaJ#s_=YlFk(2H_kwczF(o97T#3(wjp>a*peMo`$S-?v~3de(>il^b!KhvcH3@&m@ z+wzQrP>=^N+P#{z;CjFY(?Buv`~Ur7P{SaIhb_MSNDZ*{17?~3trK=2nFL{gElC9Q z7jS9vc@K#$=D&DRUrC;|dDQKBw0K&jo>AMCnZF!QwA&FWgNs+fJLruc*C)=y?iLon ztf;Ox<8!Lp;=OqBAhRUbS3W)<=F+^b)@^c}gWKZ1w{@yu( z_OdG2tz0yv5)<>a+7J&w^A>60tXAB7Hy}MwL|nDvyRr3?+l3zP1mEgXH|Y`Z~eQEe{4&Uk}-t@M!wp?#E?UsIJ4$*k4`-}@}j^W^R>Eu ztDhV2Hi(*f+e;TUSt=V3nV)ReZKxpj_H*)!g^RivU?u+w6y* z-Zskc@@Du%!soNUbhD%xKvekC|$#RHnB*H45 zBuq-Xow~uyFCDDq*u`@zz#EAXq#y+inh|ZLm1m&CTYB|yiT3y7%9)uN?K)(| zAUb1v()9XbnD2~Im_+7h-XpFA1xnY_XP znY(IOoAe6{%O_FMM552#^*tjk9fsYJ%pADjf|EDH$0=Kk-FmVoky#i6{y2&Beuuc$ z_k_>0N1|3|De$5A&(ItfG-&)ndNp8?p;RikR-o+~A3NR3Z8@@2Eq0wCiAVAweQ^uh`wXrKd*PXT@j_>GxoZAdFcoH26BM6Om#z z3Cbf?9lwnjRUXkhkW>&Y4pk?!x0~jYc&XeIpWg<)-!i1O($597W0q5y?6`71UvX!X z4O13KXdaAyPNMHo`$g8>9xQMOQa#*`6IWrOLo}2y>})*PF9}Q|m&lf!yNZhd_egg( z#^}UdHRYNJKlLKh?pc zYmsD_j5*jVQsqy*D7NVWN8+(rvmULB(gl5NqLW6rK;f_?z&kuZAt`B=<2Yk#(m*L+ znDH&>;zt(Q7&ea>smx5$-Z?CJF^SHCIn*{mK5&0{3n&S9_;iZ?${X5J--4@yRvdjd z11dW-nT4no^a^}|QUxZ*RD`cEXV+ORQY-?+(|1_+VN}RaN2wx}^w6_&opP(ZH&OR? zAS33&zw3B}n{Cw=H?%^vh6PZ~k3ju=^y3^I6Le#0YTd39q<58+j5)j7%$N^GkIa@! zHODG_FSX_N+%e5}UZA-Z@=UE9rgRZ-I?}m}lnyI?FuE;j)^P(BUEo_?{$ZPbGA;1K z?}B7=5}jkaaYg&U*z2_tzewNesy_fe;M3qA0{shIB?1B51G=1HskFk~iuxFRGq2>O z^`hzFJR)^n(8E3It@f@iC;`tHhF#=Zo5`qnlX@6Le)*6N4MFM}KRz68g3}k&lhvUt zzNO<=M8~BRIWOoTZZ=&hWKj6|>=K8lqP)K@OU7%~DZ?~yeXhuL`jaYPUSf~ZxqoIp zqKAHE9KN*S=Hh5ulI%{xj*DuZjoIenf={^Q?Y7z86+x*4t+r=z#EYhtZivIa-F`f) zyw|R;-iT3%EDo|j`l>vo7pf2T$#e-cES7!=QxYQ9Q)ccL6NfrfoLRu*s|W1UPWgb1 zB;5I&9&`frD|C4wjL!wJPXyZ~2%35`G{1ZNca(rOgG8vCqAUR8ZG_&i*L$m^R$@<6+Iiv_JoX)sPKR5h^%I4lFLX%_eVD z!Hr222d)bcXG&2qbPt-Z4)-~;6_eT!)qjwgn zli~kEpoi*R^)l}ze2@tB=m>m!$c~`xzb8B=E*^E8&GjW<``{v2|B`|hr2(cR)`FbU z>etlr^Z-5tgo$X1XRzb9O36jc$m!!}K@2lh=C?C{%xJ@=vrvb<&^2slD|6z&+@rxh z4>zXyfTb~7pW9(7@d>N^e5{fRM*_R+JND!k3k+tM0c$mzvRcKte(~i;&;p&WjZaK$ zj|ILZ0>MK9>$lEM7+D-e{do9rb1JEn>8l&(PKNCuLA;8f*%y!n1+c-clH_l2)^=~F4i%;PJqD<_A46+fAm7vf;G7T_6rMTtf zh0uPvRg#n-!}|Hu-J)(gzY7MwQT zB+1r0@CC`1hn1F>yHQJ6{Cd6RFlD&2qEcn!#^b3bzW}%98m(MY^iSLBGY$$z6Qz^q z>Sm^oj7tZ$kTXSA9Xv@4gD30G zfXzJA1~=C1N9n-{Mf(FFqSE4!CP4SdxH^LM8@PRT6Ykb-!kd&a3n`Zl+2-AXbeiUC-5pNjnQ zZMlY9xns)o?{1(`K^(zdskrQ%%^l_LQG8!Q&n~E3VdjivLQ%`Eo&<apQm+ zCjtgUdEVAY>*c{4%B>IE%>d4UKo*H$IE#O5Hbo&HzG-WAptN(-+`}ff@~qSN6LUv4z18XXk{LA5%#pjKgI(=Isk6?Dh zpnp6CLue_s)qgWue_hgTb;QS^s2E^RF>qzp)l&^H74{0mGMn} zaOGR6$H4|m>R64j2vd9mun%6tQx{?gw-8?G`4S|}2{1GSI^x*sN0vh0)EcQR5K^GI z`2;ahNNkd8hc^iIp_dPVneZ|sSpNWw7gP)#Ai~0)IYg}@uFwCjm}j>nml03pvj$Q= z5=#PTrcr^0`R^<`xU;dK05!xyWGWZk7+G^$n;4%V5tuTvhpeb&{|4JV=|u*+M9jYH z{$1K<@0R;5Q++A$ zdxV&%=C+R@YBcIm+qhoR7@f#M*^9v17eq3AQFldZwSmq+{#>lo=rQ47tToX(_V=EV z+gc0Qst&T`J|?yqFY2s|6}#}-Hrg*da>dQFiTD{Rz(>7#k`h1L(_$qq3h7lT9(Uj& zA6|v4e1+ZUHKRd5m_rzG!-h*n zW-unYn{qfJ;`GO?FJNH=7=vqq?f3UYVAoHUAixWV-tyo_F+ea4C);9u90M7e zN@3J#Sdk|CmUP%nnAl5K+P(f>W-JVh;Z6)?LuYrAU+ z@`y+aM@Pph%Q&&8#OQ2K=h@x|7csgy%JDJ-bZ}bnsQC8uef=QEjbm<i1Nqsjm%fOW9IElyM5RA z>AS*17;!q=r$+M63ku{mCWf4VyJJet)R0q;?#;b0qzd^iy7~6(op*pDjoXBwF5-+l z;<@oeJlWF<<`Y3n;3)Ec&jEm?2oBco`etHLF}O3xdkr!&sD7DNTqFkS-{&SHzCiH6 z{B2YPonpvv-KDC)#?T_7zCERM5=%{L8LGh6$CWx3T4JiXR)M+)L7%{U{)@Imr=K`W z6fMsm(wByxxV*d0TU~xJe~*wR=x(H46a!XL6qJ->Q103{G@+IbI{s9?xrSKpr}{3r zAw!k(BLw&LSt2}yg07<3PM$Of+*lY{_&2LcjZjcjGz8<&)H3U=$Bgp=%q?IkeH8}v zb^g#)(7P)6VVj}Z8rZ3mPBQfMnqC`mca|xe4e=1iUZy>eT^o5te zb@(RTwkxRPo)l=HO0x_D{6zIVuC`d_J*gZ$QaDgtt5$l6s`Oy8`^HU-#ZT^s!*0i* zq`h;X_916;L9w$Z%XC@{ef`q7a~AsQ(7Q0bvxSB%2xDQ9C9DVHGz6bp(O9rU2V&;+ zjFArK;W}J50s(dYk)tVUQ$9iOwlP1qB#m#d=Nf^wZV?b%g@{N$%3 zjK*2!egKDT+!Ex7qk!MMo!M6K)Xatu*xDIAUJS2#q~+65JcJI`99*eq#jXn<))T{c%TfcDxg3ysJFG$^#uTW)^OCt5)J7W^YZ zgatT1zocgwXy;sWXyiC)b&g3_eChk|&=$VOg;lwZ`xJhGaeo@kgz$!vglX#^$= z@tt((FpcKuEP&cq0IC*{Jt%-MNrpeRGaBy%Ged*HGR*2sPp5P(av+YwHr{{~S7EQG zdw|7f0!IhNL1cL3S1R&?>xxei!vg&1`TzC>DbiC7LOduA3+W|VWmD7Y7bK%x4M!s$tru$KeEh|u(ddEgoM zfxRpWy5H_wB*-V5sDYb}D;)B&!H|)KUs$j$UgT4PdTR;Ei4l>M!vj73;3jM-SUKTp+#_Uk*`P?_!+P=GDq}(KVBqJuKg->zEbKS>JZLdz( z18nQM+|1)T_J)U&?l#zhKnL;t&K>oKd)(gMd?Svu51vV{Ot))E5#O);nka1aW0}*L z$cO|kjC6gUKKL?p*zD@um$`7^0(Pxi8;1p zrceU!!)>P%^1_k`0R9*Pts3&`8EX{giLLqyxjMH&USI$w60VAhlwg9Gqf;IRa|}o( z?70t%$ia)a4VVY+h4~<+ff;@olqSsrLo&S8O?noVfV@20su}O?X&yZgD)$p_%#Nsh z2|lA4)14UN`a;a$_IJH)&+eF)q@tHCdMPL{a0`r0x)$d0Ch zGSL(J67#(U=V57lgdPCM6uoG@e!dW7PCf>Wi!*$TUaOL8`tmSV5xjLcUye3}n$Gt5 z)S!T7;WvfFBV=R`1O&-3`~#!5nD*%tQx5=AQP3W{?hc!a$0M3AU}QCK zxX#ldbjblR5Mk%3FYbdY{4INivzIOfLv1?ENC19C8H39U1;eMEi^UaN30G|d zi3j^j_3}wO)`gyZe|JWj88RxrXM_eVRNdv^`)jp4IBLfj|Drrczj{9PxgcQ zzVTe9qc|HCQ@HX1cZq*ws$6{$?&NL>&;W^wpIk|Uo6v-02~16iX|X)PiQhu*s1gpE zE{*5)|IU*9)7u5rDpo1+E2^SW@;mD>aSq7_iY!J;=ea^S+&{D>CmXAFCT)AK&r3^X zWz7&aogZ>1zPo=d@8S8Iim0paIEWP=pM3E4bqHDh*`xI1ry7V;e5>U6-UG%KdiLfG zH*%t@p~EjokG@<@iromgb4m09Y28cGP0wz7*ZJ~|qzWEmuJFV}Pmc3%f`i3#FR10j zTz3z|TJ?{27=>(w5BL{yGPrz~3880S`*_b27!8j07tEi1htzA3&%yW~8qcBAI~eS8 z3qRl>p-9E-lr0&5HhFN>9Xb6Ky6~%{wxEVnxO=yC4clNi3fBmoGP~NCY#3P8CkG;5 zKw)$T<^y>yauZFbc9YzxLdcGpTME=NwM7sD>o4nFIa=dO7D2ZDB%7$+>Lh+%FZS23 zi7VCy>^v%72{S9Rw2MD6{{Q0wVAtue1~c{X@7^JQ@x9-zFg)p4>W?_Bv14Sr-~6G4 zPL9M2=D3aU_*I*m8j|+k=!*Ij8{X0@M&#os$f~N;d|y;9t*)YEAYttYzj`jIqNwi; zZkkp}UyZsKSo7@|bT)guM8(Q)bv>CKD-IOUU@s^21A9V4#nfuh02MzXp}dhg4??R)|pI#Qrt zLY81>q7QPIkK>wWf5vG##b$CZN^xHcE?;ghplN$@V&>@yA3+9Q+*QSbfDcMzr|Ni3 zOHEzz67L1&5(FfG7jf>&Wb%B^1in^~NsKqB`|~3Z^!^_0++P9V*pzJ{Jsn-7^*kh( z^i7V9Daq^=OC0Frb2%$(WIoYr`w$UXbHqRbb%I6hBdF+5jp~m8LFo2XOQ5sFp4sh=x_5 zFcIU&1^VjkUVUAdc%klms>CDVvPt97tPj}k`+2-yR znG#{wqNt~*PeLLv=OtMgnZn23rra)xFpL}ddp6vYY+--TM&GyzS*9gfHhh}cKbzWQ;mnl5Tgq?S{ zahYs3U7E^<@sHGt%|qOoFSj>fV)zt>Aoja1Y(yQk$`3pdma2UP@2@b;@aAtYH#tg0 zWeSeAQ0ik~olzDd;uo-$-Pv%z4>Ur>x0vF>9GQ-iyYq>!k?nmvgf=4$mDj~0_6AY zpv+D{|48(`TvuA>l5QQB9NQy^?JYxp{gf6)Y^AK+U|4{*CS(t4iGk(D`kcem{?6W= zdsRC2Gq;#WR?y@+-eb>kf@T#xot+DDN&4mXCjLhJ_h){qQ?N-zs65Y<>7~_0GKec;Dnu6nuF)G0x)2u8VxtW?gH{%&!Z64?1ssx0>hQY%8$lG`*l1 z_UHTkd%N4&n8c8f&dZflhiwAduWG^)j>MoPAf0HtJcqLM`Y0TjRL#0RV+}K18Q)CT zMcxQijOWIlDYn@oH(hygMRIpn%Wir6<`L?oYXQQ8Lq?mb4Hb+G-jFhw|hVaN;WB0<}b`v@1iHyj29N=>+h<7;c#6Go5 zjhR{JGTkBreyv0L-i}Lesdb zviyv1_ecY+?O%*DSTj-_pClfM-F_6<8lSpKhpjCP0JZDvPo-PyID|71<)3;5H4 z5npC}cdz63*Pb~1+T!ASrC1Rv2VjkxLAVa;;*qrS{f@5pw|1|{!wclLVqd8gOZ|O! zL)7HHfZHO|)!8F@WPeGnQdw4Y%~8`Q*j{f|6R;boU=Y!(kFROb`hq%o?3ie7o<_mg z|6eyr_%9=?S7i^a2yAjzS6ky_G%wOarw!uHmQ&x{I#zh;b%^YEBJ<)ro5vf>B;N>} z+68Ji(}wf(j|Omat+^}6Wrx4Qd5qzfsHfXSh_!AMtkyA@_#2Mh?mRnInmgq()sZ?u zqs>0)@J?%WO1e#FSjL*aJ#+L~LhP53bJMlCoEvkk356z_#?E<-yIZ8iR(A>-*$6-8 zz5A+1B6o|Y+O4|qb92gYnG-Qx7@JBKJfQ2pxc$iYkqpss(ubmxLqkJwCr>vFRKGMB_L3}5J~~K_J<+zgZHWR#sda+-;pHUt5AQ1J0(dkAK~mU=?(0L! z!k`{K#F7JXatqi}BsIX#0^tOya^@8gZOOZjQ8Egq8LrII1#Ys)_;(4^s;;Hkm*`=e( zHipk*Iu11c?p?ePfom|~Wn(Mx^=T?LJTA2;)n4y4*{&!WqngGqE4(CZ@MWfYXX9;v z*t7;5fFv3BKX9(ikpDt;;?7SA{&^7RL`r)9iuGzW~ zBGe3?>S(7$>tV^h9K>_xlRnW>< z6qD<`WIQ)=VVY(-KZ?EJVv6*e%_UpKliK0)DLlu5R-y_`B>VE%Yir^H%K>=_jf?wx zzgGLhH9t$QGsu2?D3nmu9M@o2o@EKs-ET0`ashThkn2vt;RenDiWmvV=CA3ohzEKu zv_Cmoui29Q@)5lcjgA4XKKX~m4_XaRPohPMc#7l4IYpN3m-FGQ=)pc`>=hsKoCn`0 z5e{EluPrhk8)`WPs5GeFuTMxq!6U(O-XrYP`4sSG^$%hhBI+$_43c#p^bves75JXo zn!)pW`(?|`4e#n7=Y=B}vjr|?)791M9;KEja>|xY_GW8*LCtLzZ~FGQ$y>Zo# zxd}|i>EGGWMTcz7P<|nzkVl~m3oFLqCSU8z4Rum5;iH3lTdFxscN&xc#&l9xoaDhg z?Ua*bWneH1glk0*2F8#X`tm`^-od8b7ge~GmnUa6cjOf;k0szkqXjs*pK)Kr(5!ps zPtIV1%Z#-b`o7(O_^Q!HZQJt2L5DYzIAhCBJefyZfziQeZ$T^jiz^(ljptc;f?=d0 z%BKbK9%h{B=iJF`r+<9PnJh0H#Dns-mSW&8b*Z`oExXui3;l}v3WTme&2+XPC zoyNcY{v8R_w=C7nYfy9TV0At_%zKsiBEP@+0&qcuRpmc!<^}8u2N-H#md0*gyM7%3 zM*-0IC|q^%i7-zFu@7}ugo)G_DNYg3Zqc%Grw*s~oI6!B%8UIxas&dTlzaO2Ky=)2o)z90!`rg(v zCKVp#u@kNBk~f^TJ{L-72I9}_5p>_4s(>f$#tTqrlxK)Eeh== z8^GBJR<1rQu>{7Z(o{!@cPDI>TY-$Bgg6+MIcDG!A=OS#PY;;}gSdefh!245B>dkS zlC717lg>;K{5?4AwKc&v2-x&Ei!X4Eq?6lQeH15Qo3yZ2b+GRa^hBzfmCov#;-@n) zvI9Zp;&v}zpLd}M3R_^=DHyguj*cbxum{2;v=|C5PJ;cly|vhzawFU zi5av;3aO`HoqbIlM)&^xlco;$C=8c>f1S06RpN$1Q0B6fBHU9A)m)o*b$%!w z8g7B{kczbGBDl@<67OhMdB|V5@B~+0>f`RycDgv^H{~&}vAu^g8TPg;7cakB z?%GXzsawnyJ5Ug}z<5Qn!=O%)BR}2f_CvYd00C*|Wk}LP%TxdqSB^8$*R>Rn&--g+ ze9&V(JUpzvt9AP1N&LG**d?hGW%!4?xT( zQ2Qa?-aUiEe_^C}g-m8Ek&{n4f&bQV=M|yWKGGW5jX^@btGW$h9pg_BF=^51>CxZe zR0S)q0yQ|Igck^e@EK9XsEgBfShqC`qg{#n6ut7UBHlsFHyHxRoNHK5)voY+`$ozy zF@B2aIB8-3n(gJ7qEs^*+e>bq6*i$lZ*S(F-1h5_vtT&R0lPkEjU3eKmOAT8?yj!7 zD~(MJ4HIuEhI0Q%k20WsfYvM7JkFw9+ulr1a_W6vfp80psWsXid4hc)hdPD zXs=te;N_;YEfeO^y6w>adAr*Mo3LRs zjcHpP8M>+p^urIp0uC3#t^y$SQ{XP-V*1qiALnQ+Wyyi7trxh1piTm}MaxE(vk+?o zLx4j-->fPLntzB)qk@^F`Ow$PsOr7-c#JX}d~336+>@iDz`ISZO1@L&>h8`$w+kbA zP97cx`y2K}lt+)Ay?l8stNQjEA{sh zydjjRhHX3NR=v%)QmqxVX73dZHALreg62rNE~K%oTcc)o=JlS2Uv^&?U@OdeluiY% zLEaw$fX8PYW) z=QBXEfZ72;b<$1OtIxaYG{4$x-24eDDsD8o_e0PPE32G(*TW0(_HrWLx;OtrsBo#u zpZ-pL>Y~0j!1fy9r|{}wH=XhjE{MHozKXe7#7j)N(Ogod>VWI~ORF6}&e$j}r0C-d|>d$dosw*za zZ45fxx_JXc6Ts9L04e*ZC|-2unDabmzPcdfX1stV3{o?N?nUxG;28L-9{wx$aW*}` z`*nr|_X`XgWb&%jfL)8*gxgFkC>Fpg8MAql7_kv`(k(y`$EKhM#@b@wC=YDHWbpG; z0&}QL(?R5kw41aFv~qPM{a0MA?M3ZVsaYiS_KWtUX49Dl%xl<^@GLS%)(w`vy}9-K zDV*)BhfV_>C8joz-J}4Aci#3ke|a3`Fh7?|p6U<_GWFNh(E(pXK2QLN_dik1xc?ju z43d(llK@So!7!LAK3ey}^Mq(igXzOkq%koKb$XPW z(_A~qXYyGsMtLRc5B?hcx>i2&|# zzF`9;3MeFD3r^r;(+*kA_?-O19_dJnvu`P^fF3b#0pQldZuXc^g3^O9Z^UBY23ga4JKH#69bV zHtzxPK@y({6B7;a5+C%AA~z<5bG(HD%zUaD27%P$Q`j|o`QB$arljn`>@LR_1t0j9y05n_xkAo`*mfSQufFNLDGQU&_@VqK zBp{E$WHhyB`<6msgPZng9{>arfus-&C~!QW=u=y}Fqtxr7mZaq&L&f)z;iGAaW)S8 z_b^UQm1Cxd98>!lzCsE;K=_=WNi!gV)IqAk^#lR+TviaaoD~y0?E?TG_(ON(@9%A$ za0$>%Xp9;>!5QZ45~QVMhMI08zgPpXaoo(x;Ls2Na2UrFstQbTT5>r6XE9dNfg99E>U(W<4^;{fn>AIQ zCng*Af(!sCa2qJFqvnS-e*b+ZEwbG(Q6B1x>kA{vkiTSxBd!6gKA|cNdDiwiIe>S= z-UC|l>xd~ykdNQ0!5M3jj-*D5=-Kx1z;;_(PIh*7I6&=X%nmRYcmdpy1>6i^vGJ^a zDdc^ul#9YB6XiNA7AH=wQ%mSyaMRZ<~d*i zh?y3xM+*FfHslVRd>>>-1_t6mtU=$8=q_&DSUx{OF$~;sJz>P3q7BA!V7=w+3|kIV z(m*knhtkJ5g}6j6^1Oyu#!;Hhiqyl!w(Ygk01%9V(n#rNrl3Zl?ipF@Y$SJ z)J4r}AP&yWB)5LB2>t02j5{6z4S-q9+$TGm9~>=tXAd{}jkm=fJP?Pg89q}EK4fmN zU9Z3pQq;6f2=H|{fnb5G{CcE<%rxGDEhMn+BF16;g%0T56JVB6%XvTUcdTtvm~Cq3 zqH`e0j|}~4ITW~Gasi*}1GFF#yoOWL-#@&#zAykk9z^RMK$Ag&St*4N-Go9@_~8W% zrlzOEot_`mk5_>))(41T$(ax^R{;FP1ZL;RtQ&6Tr)X&EAkYJY+|mw_afu)(sYVI0 z_{)O2ip0a%He-U$8=9qGS!;Ch65h9AGYWJ^$k3q5+uLTMc9Tc-ao6 zzNc>AQ(3&EkzZrpE(Eeat7cty=v-a) z^Bz3juYyRIQu;WuWJ5Vxr{zc6!Eb?)oSb~h)e~mfflH7+h@Z7X_N04W4@uELF@(in z&IRPi9f*W?yd)wj3hX<`@K9GoCLupZU*lZ!xXfJLLW~uWUojGV&;zTSc7rPS1^0C&PjA9b5;Xi#^i; z2Y$-Cl(6i`So|4EQs-%3*Xf7*jYYVvt1oDpdrSZQyl-0+!(iRPLI63laOceR>(?Ey zNPSo~gEKKf-a82vAFM=1e+Nz4s)wrx`}4%+al4@4Ne-^fSUr@ByY}=?p7Q&I!|flM z(lAXiY?fT9^JKYAv~v*>{wCe#hAZ8fWL)wwGC(lZ$wO9db`j7$jbvch_S_yun&K?>fw>E4219l)7&i@9yUK(Z>AS`FG&4OF(=8FdNakq@;VmGDjry(4eva z(1qw(clUP|5E&j+tI#-$nR7irU4@Cw)W5GNjgaHk2I0HwApwJ=3c1)V1U-<`2QRfbQWMIk-(@U=GXmu@C~z| zHo&F*2prwYfL6jwzoaYGvjd7z1%SMm&~^q_{du=k1^Fm_1d87~kBjWfnhcD9EwJKD zcfSsRxA2D*un-2T_)kC=cnK%(cc9tnj&IR0<+ej80 zGVg?{=kE|3?>K?Tg~^!Wbo^m=$EAP5`1BW>(H-FE$bpU4!l3`nP#nVA4&Nf$-i^!_ z5{tfpAABp&20;W$fDv>r}t|c>B!x7p7`de^kp7*){d}Eq%1W08;}e!DVxil=yD|Ru&S=yHuj^--^|o&!T*GIZ@;oc;UVvh3wq(s z19#f8Ib90GP-cSd^ilDn%?7Gcf0HCt}7Mw}%qN0xUZm*cmbsa-mYVgkv zG~#jz2-eiE=o-J|ohFcF-u7kmuCKN}-?t28l|XCy;4B4#wgT>hkXvFwpbaNI*%Bji z6tuw1*cIAdwDWvIy@#P82mBW#XV0A@Lebu*u_J>`aTCOb!0iddglLJKKH(rkZu)(8uFd* zuf723E2<3+WT3Yqj~AMh)Da+9r2yim1cc$=B*3-eZh0?QKu_r>3HhRoXI!37QZEe_ zbJ^mZ%(IJXb_$Gqwc49uVM;PPfr3xz2NnjT^TVQK+Kq!xk)IaS!`hJ?s3J)kpa;z`C!IP%gByN9I1B%a8Fnw>k}T3cqa{bQM~uLK_-%qv>pF8Fk?OgLV` z_R=Q9IVx_I^|9|y1{V6WF@YGaSBq-E#`({1H#8eCs|E0ZFbkC5UA*r9%|;FOktsA< zNU6+!0+!T<35bD0lK>oh$NDCZP_ZiT7sXO9m-U>c^Bc*3BD1;H6C*ka(M^XJxT%f_ zL@Tp|W4RZiY41Gtl0VtoX28AXW#ocuLS$%q;0j!xf#i5v%>_AOIP7ULKtlpi2@VZ^ z8ZC3WTcxjU%=Xdxq^5FKZB4S6`2#D-{w@@NCh;CDcx_mdV2urRK7pPV+l**I{H77LeYAskf8e+ORFyGLXTi4!fDjp?5# zP7)Q>tZ(z~3ntXA^Pc0irK6F6g( zevhlt-UO9J95R*vbO2;F$M`&m06q2Z)ff;gX^kkzUoB5|A=Y-!3S#O(E)@*<@|dU84F@#l-~_II@ByJR!E&#IPT;V!fZD)_SZ((*%7d_F7uZXPHxQUj zFs`V`u0lM?x~4#{~k@p9WULW--!%4jr6;kM+7OJ_8dpXmwfW z?tm%;5j6d`itWHFHV(C6d@n``tGdFlo=Qf7pF2aMO3X}bQ*)d!3?vJjioB~qK^$7E zO2$~HiXIdZh%1uKza`74bWf}7a!hGivbM(Nu z%DL$~$^L92!JP?`k81M9yWy`wvOsI0*9P5UsjzMJh2f16cV>dwzyjBwt#de*e8J}v zOh#}@_)=>eZa*7Ivcl|Ge}Dg_WLfAi-krPt`puhjGBOD;zzKsN2eO*Q_4P}y@56s> z;|6sCBr4z8UcWyrxFr0!n&nkPRP{ux84c)xIZlA4XP$y`*<^p$ocXe%=wykF(^O)< z3OeL-T(Raun%|Rc!s3z;D)40sG*y`z1ss4@n|yzNl`6h9>XI(APX;gTG5X$N>hcOr zCXs6XG_ir|W*URCA-DhR;zM_N-;vrTQ9EHi0Odgy2;kZ@@D$_EHUJd)QRV55#5BUx zT(ivXoL)`h=Ff!B9(4hn>HSrHHxX!Z6Sk ze9gctAdrnETWQ< z;~{c!-> zK=;7p1(c>XO*7coGg6L6@0wCLiE~r2S>cA9$roqxOpVqX$|!IyC*Q?PTtc#}kk)wj zknx%NTGD0Fprrg+neYo9B0Hyo<(a$(N{P(3{V1cu13`g=Y;OQ2g5feeGzv9A<%5}u z_Oa)woV22r*qe~tgHlzvGb+#2!^Okn0Gny5IzwAYRW+g>1ARjVfPA>F_ynmn@#sr^ ze9p46pFMVe-P3yMPn=JVPO6Wy=sJ72FSb4$y3U*mcM|8xL z>lhIc-SY=X7D}eomf?B9i+{}9+B-~?|1);vls`Q5FBp!EjiKzw#DPbGtv)c-HM~pk znCY0`(ki_fpvtFK{CIbNE1l(bR`L1IHoD*{9jk(NT{iZ*UTqCV`OE~!Z$YAjfQ;wm zMM9+Q3&^+&y@z-3w(V+t1ZM9EJA0b(AOL@S{+AE!reMP?Uq=wXP!4W6xg?94XYU&Z z%VWmIG;X@XU)-HpKJ3oLP3yRjWW`!7*%AG+Dq6yHCTz+3@#18Am2WAq`*3K!tYqQ& znS=90bNyrXAb)@QJF82W%kQ++@2^nZs4Tyh{jrWcTy;9qdz^?Z?>7iX5oI%vz$Cn8 z(AKe9`_d4gUB1$hFd(WE)W~+1qsYC!(8ToC!n|!lg(%@b@$fH`5E42GNhL#YJN;wX zcHzk0?&;jy!M&G6Vtd70gm@lWH*Y})H}?1M-~6=y>RTB5_ML0M(R>XPgY?XyrMJR& z6$;9T09fMd2`9$_i&kz=tQ);QHuZKl`6(l6O=R*{$~jxW-NqX3iny2Xyg0JW-*JuZPb!X!ze(%)wxOH8HXacuUlq zjaVjF_K8eKSs$zI>%)ZZ81`N@(_8ASO)!7E-Bo4NtT?q zaKwQTmrxqUCt zuzZtZ*MDeBx!Qlf$8SR;$-7Mb1#tul6Vy@4LhxZyUK&$Nm#H`QmGcY>Bpev=swtIP zvm-8muYec~VOlYe?h7LZ;f^zM9x>nq_k1FNfdGupq(^B&J8ew!hUkI(FIq>(Sb6@1ZT4Zf%}f;3eLfFT)6q@f4dFKB54Nb& zH|9;gQOo0#g-e4T1Wu9=;++2d5TpnoAZQwH_kWbD zFZi^JvM)ib8FG9&Wma_1xg(gz3$O~`Iwr)xov-xFM8H?+=L+?5u`@mwy$tio{qEHG z(j0hSY@X8~0d)+2wElUx4chKnmh0o#{`^3+vqHJEI@&EKbK5}op7_BARzBZ(Zg$kc z&b^OI6?!^d?+cG#VL+V_ZooF3Y2a1mC$9lgITv?#nsx58oWt;$XoRf1`Yp^)SK9Hj zQL5EW7aSKwr7PpJyiZLqv96(x`aE4UD71k$!72kXAbn3{L=?%Ioc!hudsckC>1%r@k z_dd(2s;ci02v}`d^q-mJzVtJb41JX`qZ#4fk}y(qiw7~iSA8%P?&2)cNZgh<*1;lL z{vBCRP=M*}r3T_6#?FIp)~B~J)yI;n1UaC_A}XKT!|h9B=bYcN{2QZUX5)Sr$ixjN zAe^J{(-M1jd@uDK9r7MWs_Q6gqm*^bhs!1?YNEJ4fx;94YGZGmws`;b?;3MQvyG`% zoRg!E6VGvMJq>j4dbnLCznVlc6eCJhg7^7*wKF}ydE@7+piTiy!g`~!DQ(0!d1SnO*O9kgL%h({JU8F>YEFl^whT>1%-#VCqB~2B$Uw#D^5U# z>0h8|lbO(NcyMnNnphycX|J^eU>(?%^t&T*Xi5t3CeW;^m;7L=tbu?fVS7;Xy7EfF~1Nbbab+SQXLp^rM3c1f;mfBY*gfzrq)${IRrhJItdCxMr^x*b8P%%tfx zzILt6PikUFa#Sbrp;zTjksA8okU@hVzE7VIq1Ny2L=-ko>({)8`}9mmQ_ZIsQwCd! zU+Zt$C#)c;4K5q#UneXHZCHMxxTk=+u`cd?z2Xk2jM2|S?xH(}{|VApLdB(7v1n$N zd&c$+>z~k@TYv?otTM5+tqpS>vmju#&Ev}h8sFt(eZoJ2{SwVJfuZ*EO6vAzE3NL( zY}wY_?AH9m{sUaQe2<#2p`g|ZG6oEKtTE&ix*OXB9}+yeV%$9@>Lu1E6_X0|_MyuR zc(qfZ-3JsHExpSA+j!|Ih~DI#bTU~vISm@~yZoOWT(@%ZnB=+Ny8tGIR&2KZ#e@iI z>S|q%p5xX|2trn<#|2Ex(2nCoJ8!VFGGFV~{dadMvc;5jV9f-}F{$+5q)@Cf!g&B` z%~|eB!r$C3$H%teA861X&hzOr`nCYbA-G&HswxQaKGzo`dC#9j%8xqo_dw)ak5Jg{ z`4LcD0RFrTcm|0By@(C=#rM5gg-ul}5KzQ0aZ=M|<^K7{rnV1sj-pY6Mk z@3-E)Chua`!!*9+dpDGQa`q`tNsNSq#FbWFmk8{Ji1Fidr1kq_0>JKiWq1VGK0A`D zoz4&E(w|1Vh*j!~7+=6!P-Zy4w*~4@33ydjbdt7eooMAnT`kB}3Z3THin!80=4s(P>#I-Jv6CwcqJgR%!iCvstYi@#jQCN!oK{P1Qv?aQ~ zrDcSs6%_Cx#K=&;b#HYnF5|u;PlA--HW(%2E;F`$b^B(yoW_ItRMX_k8?pq6pmtyc zN?_`STy>UV?F}#;t-wk2cL_}_+_7>G?Htq3KwcO{M;{`DmyPxH?dV?hivO+E+W5|a z0SX`6<+-@4hdypOJ)&Hle+TY`IzYw@;S8TegioQoRhb7}P^zeJrqOV=lq@SVmj*QBiUX#$z3pscG$Y++tl*~P|c9LPl>l5jIKP=D4rt@=M;&hszDh=UsV{%NPY|vuXym4Kx>E6n3&J6{ms1T z-~H|u<^WxClJ-~y9kXKF{;!gvF&qAekwLjPs+8tUep-j5x;hM-+QL9T!-;{6E44h- zn~)!z|7N~{zj63n<~f;j!}!l7+nWVVDHRRG3fCy0oT{uoUYAgJ>NTS9iPu4}FJ^Cl ze)-ts8nsd$azmL)I#C~D+kP6D-Q!6cD$KCtTB~IaFW(IvUOuahq^F?uD4t^(++Tly zIY+nkP*?d67U_g`ow84G+G0UupS~y&et+A0%gD$ff z#no)E@``cR{wLfgd1_8O+clfygFuwQIMMz0a7eXi`8b-`bEIT>w-zQRZ$j+=;JQ!^rl4Z(=WV#$@WrEpba0OBSTK(X z>kek*bL($*AR2pFH{lsHO(SjW1#EAsU;J&FZ1(>a!CEgCV;aP{h7+MWv4Gio zyTPKAjsDAq`D7&6w1O!1lO1(oOd7^7!HvMgM47i6Nwm*|6tm-!?xb02gAiFMTmH(h;C0KNM7FlJ)1t-4FFi3U zp_Nnu?&vl*K~v4o_R}&<-ZixO^{dT8M(*S^W?uq$?h@%w(SK!`)kZx)Vf4m>d`kRL zJ(^_U{JZ!7w8h3TKk-m`G7>HpQ-JxF&+U3eCDj8RSGZ{@z^XXKIM`Pnl})M`|NT{% z{vZpp!9Qf0=j3{y?danDe8UqM3_Vm~gysO+?T|g;37W#^h={P28|1F)sM359at~qD zZM^VDJ@Ph+0Rz|PHsQIm+d@C_?Aqhd7S-};{GKigtPw_*Lf3m_?VS0&mcNa%e3X2`dxsJ@M{~2RO z%F*vEkmQR0wZFx)y*S(78eBI1Y3y%ZptyQCifkx@w1V<@ywJ@BkOb3rAu%rpy}*Fb z$uX?`BMLH=GRmrCy}tdvjV=5Uq^?}n7k-F!$tv32V8a$XUFVaYOiJjA4!xDtE!AW{ zP5#WKFUEI#b#(iNS3Kb@J|$2mA&vA%v?>mLxsb`kR> zCeIzsY*n?TY(3^h3#wc_s$sp|%%A()_QA4QglaOaF9|t23VaB=nTqgPusfvsnOQ`{ zK$_U3&SvO#eoPBozF-8G3`ThVCkPL2<3C9@bdK~-yk z9v#C83M*0Eo%)p@J{a5);hFeywDUr`hzZB<->cGEca^6tYhG=|+Q;$3K9))&X6-+; zDHN1Vp!U$1fRPWMl^&PAY0DhJniWJRluZp?pp>gWztBvMHip~L24lF8pDQ(2^Zjvr z9oRb>D?}%7u3+2XUGQtRI#?AKHb}T-giFD^{3UdUh2uHv=_KptuWyMB+8mVU@03vs zr={>w=7_&HtNgt4aByiPHXb+u?x!^NIdI=%DKm6oaexwOBOWtRUZLzO^p~{wXh)=D zEhjoVt@L}YRw{?-@Cl20F$LtdkZK?D%huWln>>9Ac*O<>8q-OY} zrnm2kjr?+<4y93MW9Q{vtTRI8V@3K@%3#L`nvpbVX2J zc3v4{lo0i=_+4ylrn=8hrs3zjcIz)=%~PBj6`(`RssybQ>}ierzi~@YxZgAS?UK9> zlBboiZ2pG@xI^3FUHOW!{@1M$|9pX!+T98=7v>m%l@aFGCnYs_Hh5nlaK=b-Tg+0= zpZ&l0pKv1YN628O-pO6SVnoqOh(=eCX5h?Af3_$$^Z73BQe0f@T)hMBLUT~0H-*%U z!ShbGMh~cJy~Q{RR$ZVKwq0dN_+nJQFlo{0xU?y-E?{>nnkQjA70XY2DE-qXa8xmX z$jD27(NRM~L#Y=Ty1JuQDL}_rvl3?J=TFT=-5YU4fZ=H#b=^uwK0NJt;A!{Z#8Eq> zXGU)3Y)%ZvGuEKsT9NWTUNY+TsF%gCeFsiNap4{BQAlxqa7zTTQULJKGJs-TG(H9U za#@?5XbsKU9ppG>>_mOGQz-XsGEdxrqlU3xqgzJXQi9q>k$Yrg6E)tbzd0Qh z71auO$d`cPsZRvDswug(^Uxgt=`2@QSF7>5+8!SfcJ?CbKq*06ZvG9^N1nCmB@W@sEq^9A^TArZa+`ZVW3#)F zD39!vf5r{m3fXEl6_dEn9UOc=;=M?OMXX-A91l_7=4^M`9Lz)8ZBofQz>&A`YXf(+ ziaYk@%c3t*Bp*PltOFn2*hE26|psyS$h-C-Ad(ev7=R4zy2tQeB63>T!r;o zs66Yf#y-l58`w3io-XA8Yo%HTe(4v^(eEST;s|7bF$(Mi;oK6q6d}$u>$lXD-XL;1 zfD?#jx&3BY;~2eiiJHgB0&EI@lpuY;=}>19>=WTcvrhfAG|guYm7adpc%Z15Bifxtt{MSQw5h z5%T!Eoj$uAm&1wLz(s=DMA&y<#gf_K+nMogNkp%6ZP5|2t|WA0pS(-%2dE3F<~U;w z+lrDqt`Ah?KExe9YH)AqWBkfiYCG5vrydZi9s|^CX&|FtYJA?` z`hpkjIwr6S^3k3yn@JDP550xgq%Zct?WuYB&ZT!3?d~ZlA*4TzmFgI_H!)(Lv~MyL zkT2|vCwY`)ntNUncL_Aw;Klv!6RM1Xi>2X{mdVcBYiVpGxffdSc-D z@5iA>^4X|9{RDm%0ov1zaPN`-y^*KvBjH=tEQuWb@-T>@Fd#=Pj(EHY!2~WeJg*)4 zQcp)JxAC3_&i5a&i5^o%JDfj7O*k5hzOCLGA$2aa`BQ=)Fa|QB`v2;;4S|asGKQ+q z@N{2%rR3O4rJc#$YS3O++@)W1n#j;)5(gscUCZbKwB>ZxI?Yg4h}gN+xkCi^;iPQv zIV1OLJqh?S!lf~7g$AvWS7*skRg4jRa-3VPc2YTb1Q)IwcejN$dIHRyOhSj)NwOvv zmT-}5ogGLvflljW=5P>%(xIk=OIpm$Jwfbu3s5mTM(l=R-%lsbrIar9wU4t(cM#Ws5%mTx=(q`;2cbcbw8PI%WE`%k|IKS4c03aT0Br{jfEI%;njOn!LIwW z(NK~lZF-IzsqbT3FmLLmA0i{0LEvQ{*v?*6PT{2<*F3mp*we{Unc`D;^zu>7&DW}d zUpT%OOj;#*xnbA3QI+b7&c!^DmzTc?_8xW%WVR??SEDBFVjx8Z>6r`IH9uBZEb+cS z@@H%Vqa^p}5ew8ovKOAC4?!0{90D!N`hy?&dr+i*g{Tw3%qY2RJWd*}iZU@4S1_PC z6n%H}(GDiVL)i9&ZJk|?Q7E9!(;24(VGIH?E|1+&=c6f_`YT&P;5GcNa z)dh+=+31VN__RJqg3b8x0Dd$p2)_c2VT4&9tM%855QP`LzrE0Q{lSa~R*IR5%ig4Y zLwrNtXdT->;O9kdT4=%+Fe2mAuu8pKqjziLAcmbEA3c0bKk!9A2{bR495 z7gzAFtg~tHTN_kMThsUnZg+IF&3pkbq=8={3+%Fx>i_ZySQ%u_eNB+-s%)-5*~r4i z&gyC^Kz7NdzE{w6rZAy8JN07)KKVQe_XDg2kItzE))??6ZUG7tr+o+QnzAy=!?&bc zEP+cFbR#S@^yx(3#*2gXdxrjra^0d+0ZOnm=Ro)|gi&0$VlD%>X1YB*{00q}+I=r% z46G|*$ldhk0K^XIL%jF9jRc--o5%IXwU)n_urlN=+*AN)xDqfNXX%$CLq}9=5GnGN zEr2CxaM0QUQgbl@G4}8{yogW~Oz}@h7Nar&KNvplNaG0JK~658PiM~O-+c~Coqb*; z2-Nz{L(sZWx|RA>s@|s42VsX@JPSKm|H?ea%V&KSUU#s_Eo?KQ^X=(!G2%c01{+24 z>_^ZIZG)RGK-@4pa&g3Z;IoesuP4SYgE>h6#+Ml7Cw}-q9TLrJ#N^mVO^jY8tWH>^ z5`BdGmm|Rr6X>g-0%U;dVV@Lm*U9qLaZz6K+BEq&5a54H1bd5Aq9D{4i!{872mB#` zDuMG7E&vtzW49H6t>8>U$}rR6oxDl?Dkm~xbzS5ls{Xgp&Wt6?GRqci&;-?L?y?k5 zRfhGSSUmbw@7F{V#(IozreFDL{kzELz+T_E%m1E!3g z-s_B{u1gGW01yh0pO;IIACvS%w*iNDcF#WZ&I}U8u>Q^9gFUnI6Hwtwy|vI^L8aPR z2QamHSbA}m3B?Ie*kND90#pVDG+o{7PjYQM0L2XK>0{SSJzcQ8*P(!^WibY`36Fbm zkq&}ZCrh}^KFvXg`XNE4$=dAf>;~}1$5C-V_)3zg5~F6okiaa+9@$L79Z)s5TD?Zn z<~(BGj*)el0a$3LwBN_^ESPy2N z52n6`X$&bldPx%D-Ic= z0-hgol9k~WDk&++^eHdenS2OWCf_O}$(Eamj-AI`tQeIVvUc#hQRv?VP$WLm4i72= zT%so{w%*+U?bgB2TG8Dg84GKmGqRo%Jiz=~;Y3~QHmha)6#d7H42a1QI4+QFhJGg| z#}nXlW|fqzt?B-g22*Os#OF_TD$mSRVn!=rF3#`O8i~A8>-I?nw*uDygcz^v_4M?z zd}t6p{aM}b;eU#rv#Fe)a$22L%OjriwtsdD=K*?7zc)UC-On`u<)K&h2x*?8B3J1g zlyi96gS-r?V+CDb4_72hV>^h96pZc=Azznn(T&*T&w$Xzorax`1t^P^Od+7+e^&W( z`^lfHI^CloL}91v{wqh5q{G|=myqd*AmKs0zF6oUIv*0uT(AT8P_&-L^9)*eb1pDuDB z|FESrBx5kLdt`(2;4<`npzn<36RFY(pXn1SxlStXtGD87rnv2xVv8dW;w#2cl9$&9C8 zfecT3j$$VGsfh`n)3Oe*?>540KO4$p1SMpFc1CB0NxMB6C=*F9!W_{L5@_csw?QU?phM}S*qUiiM-9i0CeXFA!>h(+pT ziXi7Mdd4>=NeqLWDyb+bmp6=9$$zi>Lt3dKlz1M&y$tl!A0SnQ6tkFIXU-#PsGx<> zwJ|EM{toUkylDvH0*;P6P+;A7@+#*p0I0ehiT>wG0io{6$79p4styOq{AUgw3eow} z)z!r-+V=dA#5DCcRubdfd6wKhdMdqe^o-25f`5-_BPBrM;_yW;Y=BD8Q@L{WstLp@ zhHY$J~Gj@!!?DfLz`Q}W#@|@Ve!+8M2y!-W;p(BD*mFap`+8W{JU5TlE&Th zp;43j^Ax`ys1o`(xP-P63m#hG6Ru|3;Gau$w9-<5bV?);mEi|pEvfy2FZZGzMuC(TM1j)L}@AS@P_+eyJxH$v#f~xt{ZozImmb1BuHU zNAfFZ)HS%%nUEb7(G`!era~5YhgQUf0X3iCa6fAc3ImN{6Hr6`U}+s;Q3fjH>KJQ4 zB_w*Vkfv0s5d+}YQ?CtKbrtc@mfPXR-Td>BV#5CQ_IN5=^hKEu=PX&DKIO;P!7TAU zcDxlEi}!c*{Yo?GG*DLYs7S@iJ2`#B`hmM4RoQcyjqQ_xC3!fDbe*{ug-)U^l7}1 z*KNrWA7|Z4K4qP*-R*GMeMq1v;gU;i_j_};h0%eif7F>7#L=Z)Y^^e$b~haz3~}Bp zpug0_H)edDMgR}6Rm-Y+=-s{8##F=9wb@1o4bd{BfQdK)n zZ#RG{)5{HT>1x}J1RnMkCe$52EYsMTkI~YnA2{r<2gQ1iJ}L3!;=ZmY?e(YkMi#zZ zt)FM|Dsz~(NpxH?KmB_9C^y9i$?FjE*1QET=MBOy0GwA0Uw55{tplxwA8fm(4Nb` zYkRx49b0yG&?)J$-PM&Zur);)cHA$olt+vcwzjseXb1nuPRUuex82vRdJVEMIMWET zf!DDcn2pO}qEqKij^?GK59Y2om}ROlOnqSEFU;gM0WTW%eDyJ|C#0L*J;;Uu3S>S~ zv0+#roy|o_u%Gecpz}x?8*KrY1WZ7v#(55I_+Y((D`K%;!)_a*6ff<{z4S0f!w9xk z%99J+{$(`yHLy@pH{mh2Y&PN**6iqA%d2GftBXGM^)`9B@$I2AKfXL}9||Gez7Hu< zcI6mUgX?@E4VCDrrjZwZBs*0obQcSr)H9k>>f$w2Qa@|Xtudu_6AvycV5(vHY_6GMW`OW$@X15s#P;I9P={Lm%O~@2{B-ct@ok6p~r?S z2=KPU@&G2}Nd-W>A>f(^l7N|1esjL$dSDB_FcxE)L_g5iyM0PdsMU{>+c*y#by(b4?Z zY^t6($MXXVT^i#3em>nk5O0a-)C128*1?#Q6gP>_QqdZ5)9CL8Tc^GuPF-}!tned7 z+{G8#HQvW5-M>EvWL6nqTnrq4Xd%|8)N<%MWPOb9Z6s$=?oM7)0!TdH*Z}n=M0Y&Z z%SEF}DsV4H*L|RZ&boK7Ls-c+$e1%-h z>txqlV)#9%|I+7(UGfs1&S1W4Fyizxceo2MAQ z$<=@KJv|x2p)!_Dc}|>XTFk3g2dD(ZvXij>?SCmCGxQRB_wfoH&lEH2=*w+9T<=5B zEgXVPyf$R{6FQ&w3~GV;ME|;ZJ=Ad_0jix_Z?iN3SUb|X{+_-*r%0b2B`d3|ke~IE z9Pr{kal@6B-uiI#`@tWYz`#ICN=on-52u4a3A{fV%e>(&b-=k|N95vt2QDaZ-0={> zF&L&AhAjwWqM)!gy7I5}(Nim{Wv0W7A6Xjy-1#-n%jXgGgj{dc9Iz%|Ez@t*t1ucs ztZXN`e9H3C8OiKj-;3G4)bgsP?ZpB1JiTDj-Q&CG?;lBn4tO{80KRg73@I_@)>hvu zuj9wGB0Rp}zlU*ZK&KJIrg^t}$*ko4S)#GY6Is#%pVkqj*Y_G=3zBvue^*XsYL63= z-TfQM=YRY8hg-@-D%Y(QSK*>t0M7G&b6o`f}fbcy$4&Eh&q8GOMwPH*9Gne~dU=nh&Of3X#&!S(x!~}5x5=y^n zHuul}rb8}{ZX7Xve zL-#e1i`J(son!1X=1bnVI&Mdbl|_70Qd;)z-GJ(~F)H%p(p(fMz=1D zTtP0rY)&GV-6rUT!2n|B;5Zc}B|@f}G6-`8@~@o;&NIJZjd)Q24j%hns3|ySPKkSS z;$zdR69vxsL%u`4=fJ<@QY`Cj3Ef;JP`YI$-B0@3&(j1KY5j)~}J zDCn1&fO^WwH+MzkR?=jI`!N6xCN7ILELK_{L@r(@Tgg}mMSXOY6SytFE_EKA<-EbG zfOordw5Zk7`N{VISN9HmkJ}umxB?&0g5+9+`tMJaY<&$he3C=YYC6QY(g$v`*BHyr zPbv_Y6C22ppW>wW@Z}4}^=GUda3kT(eX&_eP&>N81Jq}C!IguT{Scq zoMRUgYg!nP`xf(2RU}_u1Xh`BPztaU5HB63IVzof{@|XEGenLOpzjC0*H^PMR3V8C zG%)kPqJWbE-L&as!)IVd+laIKnwZ05Isw+G?d^}e+Sl|bH&?6mMJ1v z;L!)(7>E3nP1WDe0{KztuO2~LN@InFB0*M0a^I<^JNeQxY?<-ZScAP`)7Q6TRZ6by z7rcUX`3Ch(Pq$h-(H`I&iUDFd5OhEQjv$@*Zs#aM*>s&M@pnxchVyu0@2Ioc2IzI% zd079rHArBs+R-v#vU%xklolnC^TONyrF^sRnUAD?CwnPks*=%nZxx%axYZ}#SkYKP z)`wNgQAlb6QpM9C6{F7x6#3~pZspaGidqdaq~4Gyk z!1X2I)}~$=S^1jkQ$9X+YqaXTaCmaZBk{wXzOMfH{BWrY2F|~qMz3h23m~joS}-ac zb7;E7+m(urkVsfMtToUn#SBFc+pXp0Yr^7vzxS-;1@b|>La zb~d&`q=x6>jWre#gf&KFEap(@Tfccx1e4F(>nh**J)!kWC{T3(fu&IB)4z1yWj+ym zwMH;-wmaA&EZo2T)RWtB>26Aj4=x+#=+H&;e!C`o4lwBc$p-bvtSe|KgswGmEBpZ7 zWy=bxj>$WDv)?l9pvEl7xsQhrH;~#869o3ZtQ)M4e9LJS=|8L_5M%J7hH#f4a=m#I z!@%3q`efc){iPkvM3Q^a!XRg|s*^CMwxPnP>lW%4k%Y#SV?L16CmU3sy$~r(X{-S-+I4H$cp-EByw+pJU7(wZ{=f#a&yj(2GSGFNQiR&qiL!~-uu@iq12hR1EW zzBH5MO*tQbA3>LYKgi4yqq-KpmA))a6rbN}qt~z4o3eWRGoQn;gN%I4ja$?k=WVHj z0f_pA0eSI2N$H!7 zrZ5CP3Hi|~3GXr2ngRz;U|WIA>PZv$uH-ym7P zaK3MXv2P;rBZcL~wY0Hi(IW!#)mZuE8rRoQ-|5IpY}ZeAdHIrrv7@8o+#J|`cbO%0 z7BVXv(*5aNJeM!O3f|muC6~YW#%6>e;jq`%X?f$%D@JrrE)Y^Aj32K$qiVM9tEIS; zud73XOs|MlhhF3fuDzh?d)MTA0QZ&wgWLYzvZy z)p%}~7+x_kg2KxJ^q6Mt1DO#yREGS0nHqw8v0{gE=xqP3_P(*LV>u4y?eO@^ zW)mlp-(y$4$AmV&KTIIQrrFBYdlZx`n8a3sb5WSurq)qh`qZ^A+;A8!4-g*01Rn{~ zG!j>YNG@E@95jHuCU9$EPv}o9>~H-oa}%lu)lKaTWzM+M9et$VnX)u;4{#YTm%z@d zSmk&Jpi^JjzafF0MG&l88KD;6Ps)`2px)~S$hkH;4q0M`S7Yz8wq`;w zPt_G#BiJ3No563GyFiQ(94(NvA@_l_PXe5H=A%pKJY)7_WDbH9Rl+BecyaOCT}K?g zx-BrBs|T9NXMg}jOb#TIF|L%pDxYco1$pc`f%&rxB@ePvIJ2{j0bizm8>r&>oYb_> zeQk%~e0<40TnqU(!6$7*2$w66LZM_J_ca&?ooxM$F5r|jR)AQ>tVa5oEe=6!G5_Dc z{0W{;Tx<8Th-Ju!#r!PAX5QY0#Ao)z;?7mgw#ab+ZxEnxNtt>eXK)X|MoPJ2;8>Ho zS);d(mMro?emVLy&7B+>0@ivAD1ORK=e!vW>hEwr6Xe;PA`1cxbI|~hVe*N*eotzm3H+1%|DX*6>AiQdKAm}7>i7Xk*a4 zqkHydH{{K-p!b@4w6%Y&aYOUq+r=Xc8r1m|a8jrq4Ew(5;cq7+@qY!@ke-5KI+`23 zC%UFodSD8{xqdUBbQsaoWQtbj=cFt*oqCDV@pQFEn5IpS;|Aa4F0P4e^jY%u zla^HMLYJ}myw+qaR6>SBIC4owB-u= zxpJtM$nMyhUPqaOsn*6niwIm0hMvxB26tB!;yNRa^5x4|qKsE88tn)ob$Y44dl%GI zl|o$_nPm5N{~QH%wi1v1&BRF?OuHw1r-W?+bs_)G0B)>VrpN~>nuFsZLrY7{fG1;J zMB5?WBf9fTeF>r~^f~KAN|jMxAsO#mkI{@er_mt2&$cF_GPCY=teEQzH9O?jgd(BJ znnkWxV2sD64_fbR3`2J8^kb)Q2iNL?^Obkr5Wg#~H%?ALRB)|4Un6Q>my zCmqXbcBD9=IYv?}7V5wRgoM5yN2^m+Ge0V#cc=nY2bA?R@vj;E5~fY=95y*#v7K>V zC8GQ{45&y?yRnmMWNKJ{7$Cc`b7r>jP3R~}{-XbC25W@F&TlnK2oLUXYO zJ?v~cWZ}pIp}S3l;N^7l_s?pOan3@jd4D$g&?Nx#oq?7li!X?Wvzn~wc z5S55njshy~ri4Kb-|8e=B@%qp^+#06o7W*s`7*JHevbN6Qy421D|sNw?)a(SRh@U_ zJ;|NHcNXqWhY>Hps>()jAPX3gjY1X$6)w3$3;or`d+Ql{CN`d^#p1wrIvKCz4A)cX z$XJ1=1i(y0Wsr6DjXlaF0M5GxtN@5sHstf$!o{z~)W`YnnGJ=8cs*r+ST(PK0BtkX zwI0ET%r579A9F(>CnHWkhYR~nRAP>k$HltptiGb~#}ZkH2?diYvMHC{7}$z%N{vRedwQc;5}k=##KIXoIO?r@ddKo3gu$KG2Z z1uhN{Fq+9N|9~~^TmEWa+8%GMEMG1iAQoTlojvRx^050S`~BDMToUwYY#dSRNyQ5< zoSKQ`&f`0K(o@9Xi0RZzy=i9>e>2r5+L=mp(v-aamclhw;!l~Sb|KE$@#N}cf`^eH zA;9vo3rcRLT@s6-YWel#L?BuFt z!-WaeGo(O72{Y`2zZa`dPgn^EgWI$>Y2^xteENNj)(kX&el+OHeeiNf(gU=iEG>LNdWV@Om1Hyos@?tU=K1tk#1J4>}=P(fe}4pzH{k3#KP<- z0YO1J{>RwRDHWh62oV+Z82MFaWt}&?vGMGLPAnSxxeI~IdHH+yu8lXHZKP7fA{`o! z)wrs)12Gm8h`MPFj%2EpzT7C~@ND!ut)uqAoRGT6$r%VVdgymXcyYme{=u__LR3~I zKtB;qD~y7tN&!Pgyl$C#SN9FXocL0gtx$%cfsg2b!|Q?J?AdZ!pg~RP*&iW-1EkxR z9tS9pkcf=ATqeE{V$vQ)hBDi_aZiV^;b(=YO@B9*RX-Yb5<$X%yiqCHbB7K*ukn?A zghBAL<9*Eg7!!~0zH{&5lqj~QFZbA?(|68W8mm2QzUGPRhihl&nBN)J$FQTj`w8G3 zP>}KD2Nq9o#R+AAzqBIVQk!~olQfUZ3R|Xso#yrG9u{N)&7kAA(Q^zuI^ZBPJh7EI zI~GcCQKU1gsj4>AxNiM|dxhBs$)?zeypNJiRN|SOkv{TmYMOp&dB6}a2X$(QXar-b z7d{3r0Kj#hn)mF3gpdzn0)@IHD3=sMPTF`i=1CZSTj|LL>6G*8a$=K0|Js5anZ{S}U)Q-ta26o_$HznBEb{fO0zXy?*~RF)p)^~4;$M*4 z7u6dtG7sd0SM!U`HVQFfaoj=fqbYM5c0!m$(ZWp&{&?Z@B9_!Ruf?QK9LwfEFB=HO zuGJfLVUbFZ88}0ug*qS(H@WoB)`ARw6l z$KxAxKXiUt2vm?Lr0@Yi;|F0{=zuFdt_d8D9VoUQ446Ri=%xKp^_oDW;Yee$Von96 zPD`H^jSmu)wzTXiE1^gGVj@;l{yP&Q%D58AuwM8nUqp!%e}CHaIc zJR#5b7bw#z2hkXc2n#0k6amySa~h~yX?*^ak6`ZaD^I3Rj1Y^od@ zZRrb0v3w`Rq`@7k!(Rc;164$F5l612XD!hTpuj4OQ(~ptAxra+(y_MM`OM>OL=K(1 zYLRTSt=ASkiagmB_oBrv=tQ{6d?Oi$OAa)@RCZTK(IwD)9rS24r@>|U&P2I3aZf>k zg@J?ul(+Ow_wZ1WPjGRU!ldi2AdotM5d!h)hjrkSp2}1s?#QxtZvU+rGB_TZoD8qT4RI+^?YS zihkymeV>q)}PmmfDeIp)bpqMgrR7HEiT7STKT z*GQebUG7d0)5kL3H%I#eHye*QGkzuAJUg0*b>V6T@+d@!6D9XzRk^DMD(&r+HC@@E z3Md9A9SkhIIW3dev$=VL#K!{ft@`a;4|iTiU!A00oxOY?b&-v&Ns0FC<~r} zqGpAD{e8x`-lSg2`yYKiW@IHgJ|N*pwpx35wi`AOkLEQ*#&V2C-wH4D>zA!#V7;ou zz#=-^W9qXAh?@`y_k~dc;Q1>u8Cy+isgGm&kUV+OK^)@+~*>U8WSgh{$ zjC&l`*J3j%;tP}y?mR;eRpAqCI(2+V4dJ_Q%xG;4OAOM=r0rpI3WUl{Ve{J;OqZ?-{I<7&6M)f zYJW3xhv*f=M`#!is}?#qymhlNkFhFI>gcUK5q{YJcFI!(*}_IyZoWsy=WXb4()^tgL%r&RD$%cC)_o9vvHSCdU@I4R%%c-`WUlj zSrt+}^m$Q$NJS&<7AS<*2bfqTjV`JIk&fSvL_fCETga=X6+;Cwfgn%$>97{IM=$?3o?SxcpxD< zR$>1H=RsOFs|d{lep(-w=X6^$&n=1dAwcBODetTn4R8sO-COXZ6 z%knpi$;wEr`>i9*@Ap^r8mZ6^XI)8x-+zrP74%-)!*zbL@CRziTR?**+Y26&JNJ`E z<;EV5GuGBSEzZ7QKyX6q6VlBM@w~E^mlTrc+M4elpFTj66`*}3gz$;K(*2knSR)aW z>?MJEM6lrbA^9xoSD!U?OI2J0yhp%|I!MgzRGfs0jGb!(zZP{Bh+3DIm$8fzvZJz? zDc{m5U`>dACL1oljiY_$N0gZ1)?{x({7dO50hBXPo=}_n1J~(lP{Ko*=%oXU z+$}4yR$YO@un)h@f9t}eUMW|>g|q2|@a>DD?dnM7r#V2sufu_o5Clp zK)Q#Z4I59hG%W4L8G^c+%UBf1{1Mhq%;^frxLd|7A= zJ7_@Q`bYU#7f_1&etbXzGnV^y_j8xo_JZDsgNnMH2XDD*FtHUj(gXxkoUYgp6Wk?O zAJ?^JDE4NgY3ejC1AE@k4gYSvX2+z*?SR-j!Zo*g-gLI8%IoqQERR$UCW%MeJbRYl zx?HF{E>;hj3D^&I1>-?T%HeUv-_L&DTsR$5Jm(9(fwpZZ~`>_UWFpaAo>P57f&+$L?W`>2z8(|&w|`P@7J$O)XOO_=O%eY}S`m9UbSy(D`bcujo$A^` zf5wsJ3U8;_3b}f}7>D_EN}SojwoXy;ZPfN!vfNaVUt^{0|6RSrU;^GlRbBz{g{Q&c zyPL=iIusCNPRvA7{QdTXV6A>U21*ftweM9`@)1CE*lz%}_FHBpC&u_tbCJE17a=DaI|X8-28Zf74V z9M7-?Z0s@$b)J?x&rhm7a6WAxkMw*hhjBCWVo^ZA(`T~6=f81jsx^AfW(7H>{V{qc zWxf;^q*vNXY=F9neeGfZ70x&RUYzuE0hhY!cv;8T!%eSiG&P-ti9RMdl3UiRH1Ww>4s=Z}4qU^64CKwr&Kk9NGJl(-UU6NyL)uN-jV~=x|ry_uPjN<mER z&x4%f9ZrjHQ=sf)+n@}3A06Eec7WtyL)vp0#8d1uZ*xWe z%n6+S953*s+`Ih_YSU|vkA*ytEOah<`G2S2rg6iU=TD%PQfOClKk){5Z_zHyNRLzM zFx=m>Ss6(|KN63*3*Ip#&AR>6NL1UNQoq}>xc#Qt%%QXOZ%=%*j6I97DmUqNzFt^l>3fZv?Gj<-16VsV;8r0@HgZ zB}3^4dU^A@D5qq*TPNPmYhk4#|DDvcZ-m@r;g3kjl7IRxcZG7Q?r`-oCBZik?}M7I z3yP;^{T8$z{KDNvJ-~?it*l~bCK}Bj5gd3~`di}8BQCQ9wLtb#@;%G;)6KsVg(G(V zevG^rxQFzSg8y0DQ3tJ~Ag5y+N>_}g7 z#D&L|cBjYBJWgD_%=JGhzAwxexs5xF(SZQ7(YEC&GOH5}zJ=4!b@M?_8r~rZwJPFf ze^L(0uKd;uG&Jq@?TmO0Rw*p&{~}e2jJDwZ9v)*E&Q$4i5Ek&~llSv1bWokT zOPy{x2@lnu+@J%wPxFKATgQoB2Y(BvAvlZP+lmFWN$N1P$KW0Ps;QC4tKIo?YnSRs z`Q%@|cT`uTqWLQS&cX?f-786oCn?N+1Kb1*p0;Odq;rxDyo{ zOGhX`$N+i(h0|6kQ~$5MFOSA@57&N?l&O@VP|8$>WJhJlmY#v14Bu-Up5F2v|Sl(&GmEB-ncll07GA`*c>RMvVQS*rydc6NDWoH&>Ufkm$Bhza-u&6=yuX zg+pevCt4Fj@U=XZ>*?85TjpbJ!oEE|gWm~rf&dz;AA$(`GkIis51t(9&&r(S(Q%`JP}_1rt=`^&j0 zXvTi31dpQQ=mKg=F~`dVDw1W!E^tZ|+76c}v0NU;t~{^bkIeMDZ*V-0^InjJE>#NH z%W`wDUFV>Wv4BrJ!#rW*1UnMpHabv znRVd6LI%T27}@a-*j|zV0BzqMQHC6PnSd>ECVTUo+Z&>O8}^EtK3rogqh!syv+s4J zU&HSbCJ*EkhMn(#%do$i|7>J7`1v#>DbPN6w-MbBSa??B%G~w;$psi{S|)s8|LKu7 zLy0}Rqgtg8c6IEE&dIAXKEEL=$X)houI5P6Ctc-Z7M+{5&YlMV_cOVB6rNFc2&!?M*y~>`~C~8A~O>z23b?8f4i5B6uC|#mwJkbk6e=RU%#CiO zNV&!~V_Y!X;Ob8H^!O*tpa(rYwGtb%IL+qtT3t|#5dH>y(D~YQvj+xp-LlVpJ>jPs zB7MeSps=~>-}%eu{g*FgI7#7kbu?)Z(qUJ`?PkS3YB-r@(?D=|gJ#9G2ZxePu>Hbn zYJ~k=uFJGrbt z<8!(Yb>4nRqAhs5cbtBNb7YyMRmC0UW%=Ne^U4o>@e=5pR8ogKB}JU+T2ALT>*=p; zul-avYya(xidXJS{20eZlbViQKT-Ml`SZJ(Q?RCs>>ZTmw!)a#N+E`BO`v)dKn%?D z;ZmH`;M^|B%yYM-cC&~_flSGe4ZpruQ}MQ_6Vx|@7U!rXUbE@tJTc`;eTOeHl?huv zwLGz_UM5x}_v#DY0;5^SXR?98G9ni@zXYuxKJ%(oo~ktNs?TwxUL}Hn zvuDqmd&Q;Bm4EmkC@Z^2R{w|TiC#SsG(~mKKQnG<-kMOy=la3yp@0w(-Ig<+)IdxyA zl_z;rp1yQbKy|}ihc#yQ%ZEoDTLQ%&h}2wCn7jJtuI;;q%iN{ShdRKkuf?m@6tHjt#JL^VY zdfpcrjW)-*wfQ5ajH~HC#BV$NZ;aMk%OHM{^*_G`*A{w8*fw7G4_=J-l-9!Vt-PWl zLG>CVGp|et+5N+zl~pXGZCB5rz+#k@jW4KR;YAD?Mid4o5f( z(vEajTE|&+v@TYERAvmJ5jT5zI}nQQ$yZUg+eGf#|0D43#(G8mTk(6JPxYHUKhwHU zX3sTNslf}`Cxs9rc`oF{>*ctE3G!ywbuldigFAV{)jgHlcaOdoXzZ)qeBf<>(n4vQ zr%tb6VcS=esy%52oeQ(Bz1O(3CKw!7sNde-{xEv1^n}la_{jHyOg`RpXphJ)mbpG% z@9+JY5Hs!>eY5uZ5(_|NHS^`99iOlatzi`1VYyZ0iFdHvpzn%Y^?v!x+-PtU@J4ad z{B=I)=?vma7IvQ!TXA{PF#E!ZAyCh-mGdBAs|okO4pdB~VZt~AhS0!LVZYAyZCs9!2%7o4utbf%RBtP}@QO0G6 z+i8wIHK)Nb5&LwyL|3&QO~%IB7qGpk!hNk&#u?1TsmaB}?dC1{oEj(9%|BW^xvHXv zAJzo+eYihv>DlNi-ODO$Khf;n9)safN`IuEkhZFcLshVLRL!F2F0O-Tb=ORrwN53N zDhMCEe*lnT2;Wbgs2$hH8cFbeurb20%V}vgP$5QVn#!D%oDAx$J)Fb6ig%u0CEZp4 zBLmX=LO?D{5k{*|z@*J4!avrp4&gwhK zv!pVtYhNAkD(UPdKz-qQTMfUIZrur9Y-Vp{c=(}ri6T4z704<*V579PnU)#^BbMh2 zRQFfoe>0pLeOz|5{BS{T|L^`NoxBFm(Tn>3?h3rrGR<}&&vties!;1NPDs_>Ri35Q zu})D+8UHlC>>ZX_kX#H_l3MMfd&S*HTjTcD7sbY4>r<&m*N3A;%nv%VP|yyc&NM!9BNj^6-cwE5+zy$mnRrZPwx($dkvycN8x zO1G_yDP|S!i8(nrS0y%_Ddt%Xz378;$;)5gkMG_-9Y}^u>!Eu?OVOe0JyTC(`|!v{ zwM!1`4~?H%em=H%O;BsU2Nn~n2i>mCxmf;tx=veus&rB9rkWV%E2W57kG-B}9rs)T zXRR}}Mo~b^%d>N>j!b;l@&^J2*gQ5+`p|65gt~Vv<23->I^rjh=i+ zO?GY@%By!>m@bH1##gGfz&1nocqg0!3_BqE}F z_aVnx{OAKRyr-cXuu@>BH&j<&E+QgA!Kwaz^8`y_@AzD9`fIUNHEG#VwF~A_hu6KI zXW^EV+Z`EPlu?#+`zCz>6PNH)`;)X8`C+PYit^awuz{Ma0ZD@p9(dwKHf@j6cFEv9 zJN(M{T4`g{-Q0w~eJjr#kDc;~b`6;EC>Jk`*LB<-y?i0L)~~g|-KBJCSm&rFcd2N6 zd*9PEh<4DNoTt5DTo}_>EpzoynnW9uP6y|L%89~TF9OxuqpS^(e;H5YJ*-Xptol7W z?nAh)SMhzO1H!tdZ$`_!--HLZuG~XAr^q>U{pKY;@9r0Gp7)K7*yZF`vn~{0_@Wwb z574Zp8;lGEaV5H?NLUK4o`FBIPy%%D$_qV)x~tZgoPp-{t?>P>BX{+KIX?C1?oq!v z$G%%$9x_*})vRXBO=X^wC*F**q}7g5A=H2JraLlD-Faf4+EnKI%X?h2ELhjdMxP(* z4Q=@v<}mo8X@@x_Rq0##;LFAfF!?dN?fGJ9Le{q*uxsiYl2Kwvx8Kn_?z8qvj?CF2@WuA_ufDhu8F6?5~EqBh5}5g$rj< zhL+vUwoy4^u*d1Bj{HL@pQ3TLkLWWJ$E z%Y7vMedVe>#e0Jl-c4ZRURP;@53*`lRFo#n>Y$h(Gqv4bGe+gl%_x|2>lQP%KVk|(BaSn(i(*P+tw&lpNj^9opq zeNVNtv@D>Yv{GPRdOZYuqtlljil%|`-}whP(f|L;rGDf8=s8?V_-K=r4#T6y0{7h- zV~c5C^D~(!C1BixQC?Yvn+#(Le$V!5MMn%@ZS?%553HK87#<+y0J}QbL~h31a!fIG z>k~rV$Wm;!Fvb<6FwwAMW2i4Q&9Yp54-Vdwyn-!;wB#&8M0bb$RmG&boFOa&Exu=+ zp)_5p+y?KGl-nAHa*$&Bqm+A*vr=deXGEBvpTMm5XW(_;axMyhX9w*91|5R)s${3= z_QEMzvfa8@K+~!N?DS3;@iCYKP_Et=R`CY4t%ZaBkt25${<)0@bT z(tqjvh0#|0ok(c@FTNCwPiNRf1K8^-)PS(wLgf(V^|~4(HKMGhV4X(AW$7@lR2_xi z*u0fWs|+Z*^3Q((sjNCF(v-0{vuvaByTs66+K}ZwYAC9~P3xm}ic|e)BYphK)g{_; znBcs}-MluT!6` zeUl6PxDTkeO`PpUw;!8zWZM1agH9Msug2f#VjfNSddLnpFq_sdaC0JNSdkJZWPYY3 zvQEi`RhZWHB*JGBuF9)^6m}54< zILn5O_&Z@n;vRdh_5sZ*jDt|Oy2nO?G6%eU*mN@PQiTXIu)^D*UT7|RL5@YFBgHnm;8DYUlfw;#UlMkhS?yw3Sz1{>6FhU4tFV2?iz{IJZ_@<8A z`joq3td%Knz0`FhQ`e-1U3mIJn_oNG7_44)QIYXRDe*v><#o8SFh5HSlRMj9ezC@lnZ7!LNbfAT}upN zbvXQXO-(mq%+rQA4=d`zj_uylOnBA!K}T2f(h1WtTHTwFKqT_WI`%EDy`$i&Z1}WO zFe3Ir%|1d51^O|eqU5dFy*H#c;bWqP6s-AhT5?cm*nCdoK!FF(?P!2@7}omjo%yz3 zF5g#%k078InsO{^GT@#Ex&;bi$VuMT%wD+z`UZ!XlvMcQtEU$V`wnd z*t+nJ>}kN6%>TM&2adVG_U*yWgWoSg*7j~FLqBmjK#bLqC!C=|{Qy#xll$Wo1@Lxd z@W&z>iV6p1ONpQLiLjKz-IsxJstZ~%W=3?FXH)S(42}mit;B9ReAFfW!%#c>N}&pb z(FCReH0-}}w@Oq$-c1!y!8ssf2HYwIJZf(P9D{~jm^u-|B2i@$~&PWa044OT*F zOG759v_>uUE^cx*#HJ=>@o;o{db%o}myLMw*0e%Rm<65ZfT*Wl+m$+vXk!_F!P$A@ zWZxl!KBf|rUm%Kx+`IRlZ()R?NMX~4cwb2_O}Vj%uemk|P|98hD-}@5YCIW}I=I6lf={qO{1u&v=1QF`nTvocQH9=+ax);Hhd!f3@slh`;pS#OZq8DP>US#eJ- zQO|Bqi5X1#0LScdX>r|x-(6DO4eB$amR^3%BIfRk5&`OoST#uRgC}yQ!AU5>uKS|m z_eiv)&*3?c2J=ch^Hth$Lgi~% z1c@FLZ;TD_Fzc9$%kkSvXcZ3$+Jx);{>n)V(;(#qql_Y0tU6Jd)aS#;)5*;ya>x2wxYT@HIjwbCy7{2TRX5@(0cp z7$q9k9MBNC{!~E=wP+75(efCH{RY=#QatLUOKW<=ur#CmH?OX$j!wwQq&+pj z5E30cHhoHyu|I@*+DKk>*$xHNl8SK;!HSGnWmc%rbEwZiF#Menk-{KwozC?Ar@9Ubq`eNkgiIx+w3TI zF!1nc(j0E-P4M-0*~ia@qNNm{%Of8d7N&}NqrAGh2l?FsQ2CzUpAHGtWl&2q@@q8S zuE$_Hq=@a5UT*ontVb~&fRxq)tIkP&k{`~0-tbD0{?X?z&~**`b{=Y4*;VvZTk1Rs z)fkA+Aqj6MASCv$lW$7;5=X7$@XNJ9?jf*G9z1+Qen$%qnyv0hm`}yy6sJg}gl`c! ziePX!MQ^h+=!TR0jaYB9(uY_nzI>)@@O0TpMbV0i2r;tI8`FuH%N_nnUv$qn&}Xpj zf6e5CTgy8CEey$XaD43@R4KGi@wLUdBv@K;`T&`G;<$W%Epim{WhBONVDH8eF?T8M zIc)8n+#jR{d!QSq=pHMU!h|`cbG6c<2W6x8+(pv3Sj=mSo=}Op#i|BS4`deI1|+1D zgGP1nOcf?s)~RU(SNMkCfr4`kfEWYKC_44;-sRs6Ok6e<>S9~|gQi1`5|9od^3X7g# zgf6a{@#k^QWg<#D;V?i!>9qP$6=DZdhes9(Tbb^Y7lLGa)}6%(Iy=wH3MR>s*G#_= zA*m#g;8&z{E_VjPN3a$wfEMRZd_RXkMoUa3XC{YhhMM#623z^t{>XG4KaDo<9ju}) zJyjM?Yap0eVxozl3{fvT2`Ky|9pLgOk{_@}yl_o2M_H7GKH)m^`Vu4)Mq3MHDe}IM z$pRL=+&Kg<%p?B4#ZrGQyC^{m0~0z7dpzbw%b0m~i61eR;$BpMwU| zoS&v`bm0_1^MEX|`cl@uCSYj#g#MXTs77vn4raclI-4Fh7VJHD6|Q6hPK$^$fD*hz zgHthE4Bj)g0@=wuwz9mu9X4$K%|UAXnHf8WWls{86jB|{ba?SX%W5ouk+N?q<}VXX z^Y58wD=wHDdeT0{x zYWKPcN7xkcv2DKfOPj50dc~O1ilUAHF$$rgAicc}Qd%)Lbd`0#G<37c(Jg;Oh#}nrcDd%)=(+^-+ttiY4rGJY2AAD?2!K0Ki5JdK7$Y)h0_rBx z0;0<;ny#{&s|aQ{SGjjfaKp6k4z9y#hJPmcsBt85_R04^atnWLk^%XlA4t#)7xqe2 zW=whTVIMtm?pwUFuCNFJfrGm;a(gmFDKG;o>H#;Y;Fdj=!t~u^*$8Y7X{UuY`EDHY z{YxAIVd^R1xWAn@4G{<~HB$fgzKrkzErM9|ph~Mi116|BLl0O49g>zZ&|O~E=de*R z=(mIgKm0{QVMqn|R{Jp@E|gwF_1G$+?5VqgZU??)4Vn11E=KUMTv)c&P$nrbSB zf0`}Et$*oRf|~#R%QH#|AGh*(O>K@exwH~NEg8)v4A5f<{W>zzMfqz3Y7NY~sdiWq z1L6Fwl&j|0c@RK zUnYqMsEnu&AJ(Pl3y^FSBkSPRvWoa3cVAyZKxX01REg^M0|p|;ek@=Ou$0%_<>N5t z#+!%{j#h*yhwFv%Fd@S2hAn#S!-G66fC)tnQ=S^-`Br^qgbvmJG}P< zIp7v@C}&>Sq&f5Y9e!BgH^?!x@Ch=yzNXx9(|GdWD|Y{R#Hs6GfMX5Z=#Nwj`SaneS<8qtlpL7g-l+|)Pe+Fe#h?nv5k_rKnX!z=b_BZ{jUbhcc-4xO$ zpoG3Lu@{<)x|19Mce}VSC05@P(oPNXL_v?Me~v2GjVgYUgNGvM_|uo8l}!*}V{wzX{jYBI9}&s{O>l5O`} zdlVY_nvKL5rQ-UZw~oq>h#|l^1i$ZV`>y9vFzm=5DPg+NWQH{cgknR1mtys1v+W3{ z2wId8IK#8^3~~NaFfXQTDw426*RXjK@F%sj^xzkKE|otWvnpo~fN}%RZE<<10>0U8 zXaPeG_r4Bun>ProC=ZAwi9uljhrR4)U(4mrK!Vv^``ORQ%jFSo zS91|tK(GAz_3P>o(T&{z>j*!{&<`J37S#XwQFhHsR1D!da{g#uxf*-Wbq78UQy_zu z5V{tH3=SC0PGzE$W@skg$hv)rYq4)C*Z8oXYP>~F!Q5D-l33HWmF`d8<6W-{B?>Ma zLsf)D%d%D+5XDCIM1A5X-IcpvaLuE~a8H4@4UbzVX_}0xykkShmQShPkZ#l0>J}w zyS4AP50V{2#Gj9J0|Xquypd! zk2#1;-nYHJI_Vk+w`QVzB_$!{rCqCzo7;@(ppIN0wczKxu&^+#JwAk!F=?~+)oj2I zZgHN&sR*Rk31gS0gG6h=)O9#c5To9LNojJ!F0ee?v3*#?P_aE3xE6>{RRIcdH~{c- zm!1DrKPmr^OhYqfQTF472W6+A`UGtL@{!sNpP0B7eT8ttU}TBjHyaWY^8ta%6{gdD zc&)Lg6)Lf7AQOipd`iO73&1Gu0s&odan8ZieQ+nL5j8YKctx^cb4)~@i0z<(cqn(G zOk^SCOET>yD$2(#&5?*UxI%7XJc|ufnsE3flS)u!P(ogUZJMNgn=-Ie3_}$hl{@i# p4W`ZiQmIHb`b(hve+TZK_byUX=eoA6dz6BIH23MKJyA9H{SS(Y+amw~ literal 92249 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

&Qzj|7zHS|?5XY`o!pq>KLS^a z7PLE{+||n)hkDE$RL5Y+f3j9#5g+zBi1zFP1YlY^5b6Q6Ghibln``Z8QxqpBkL&1vEw%0xxwE0HM_cftlcQ>TKq+ZW@vb8ksgC||p+ zJa7Cb^MmxtbGgzXbB=T8+#Bb&SH^ds+d#!ZDuQEJ+SFrpba+7TwV;{(D%EGzbVOE! zg7{;G1=Xmw3Y)z|>7~{k-_cPD*+Yp}^WICVQ7)0iFrojIZzu=(xNNiEhJ>8F%1HS( z_jHXDyfv%-uiO9`nnUZ3U5U{2;Dwhq84l$m1cpZQBHHa;_$D4gXA#u4oEcP(8T3gR%M!M#rF6RF z<8rkN)0$inf{&S*M^%73fUkfXoP(|xkxDX+LpxB;h7MLRv26YDd25x3V90>5tk|K- zawTcbc>W!pl)D&iH0ZtYO(t0IsgSNT9Wf1R>t5zIGw_y*UB`4~dwZ<5+zVqCnwD_6 znOA)Oz8koVrP&Xy)er+64~}_(dNJi4ps%3dzNO!RPNic<6ebN++&TzVDNg93mSNW2 z_s1kxg_Z*6Nu_GwNqKcPH8h}%q`cx7t*izkn-Z?ze6Qtp%5mjDSAf#`@WQ1$r74`P)72KRk{wR88mn9&8_nnMM{gh28Wv}3 zy8fuHdX*q55+`hi=jJK$j*-sxmUBYn1F`PKVY|`yL5HbTdtqT&v%3<9$x(`2>`_0m z|0ukr&N_FSFe>X@+8HV~GNbFKd7Cf3Cb~uB?fu{yNTe@ZKTS2mLP&V~DJAu})4x0s z>3(_J$I~ZisBv45S|`h=hdmcl-b5?AxoxhDXQZZu&h~+sFIet`+CT+8^@H`IK%!Xr z+TRa{6PxdOTZmW%J2M)C4nAwJ!DiTGJ<X2IxpT{0rpN!$b~Tu^ z@ua9pIuq7dq&Aw4-spdH*YSkNq{O&mDE(>t0>|@a{@%UT*F=~I%PO@vMO`KDG4(dJ zM6ylpO79Wo_Y)n;{ErLZO(f6@V`p}D_{E7D8>_II+XW-WLDYTtBgoe|(>YMhpUtv& zSt!N3giTgfGmP1((Y8drFfEXpgBR`LpPwI%GjfoYkwH;zE+m4MiO2s}2>V;b2IsJI zF{>znIN1vwvrSX&i(WhF^bnm-)5n*ilHj;U?cKb80F!=)5u6lwW?Xt0W?g68Z#Y#;wv62j#*7G z5;e!c+MsDHW)-64+`-YcP9%8Rl1 z??iqG-3>Uf?#eezh2DF5Zn)k^I39kNamfx~;q*7IAkQty^Yz7j0JO~O0*DZ+Lcsmu z6Hx}SF(Wm?M@PLfM}K%-&z6@RYfG-{e9}Sx4phX{Tg^JYwAfC4J4p2M1G|M~Bdfe% zo43GH&6nV1KHZmle=qVH7@(NbMKUC@@gg4-Rb1y=N%{9zgTe3H%c`5#PkdzkybKGn z54a&cDCkbfY-bx`ei09PL6_z6mwen%%}D5U%38WX)iuqWf+|_9Upoq8h* zlv9#8$_Ln^?;YXEJB#Nk(rBv2)qbm$EaT2{KT(^IHhRj#Sm1-_@Y7Zp9cfFZGZll zVAdA(=XXT{Ve~~aP{_j+^U?986wBh3qQEl-s9j^>&|2%_A&0`+jMS$9_1S;5t4sn? z8>-@~LwIZY-Li%z)7PPmXXx*2{du77m;3oMbg3D3UeUV2C$hV~S9>oGx~Iyuw8Y-E zA5s{XVjcIJ3m+WWPPg3xtXBW`8Vqvg9c_uMt5!+tzP(r>5e%KyzRtz39^l(qwz@su zxa_<8V#Wsh*53aJU3_<4-2Edore$mxMO(a@?h6Is5$; zNH6o&R#wVC^&qgx1)_`}rCvZ@{v>n=gH}?3WBvB|D_8!UFDJW)LCc(t?rk&Rq%n^j z6fJrtW_MU?>w~%!lxj$(nu2M5b6$hw)c!!3{f@H;o9}#k8;2-ML}hy~_G&-18qZWw zvKC`YD_+;5{dG0zpR=n61105aKR*V|v~KNR6QJ9#h@dXEruvad)i_Yn2mxegeg083 z;UPX|*k{0sjdG8U9EgGVwu;LI1#8l4A^C3yUF&YR`ASbZaC>SA`ZXq$I2I#H#~8?OQta+*=yL#@ zEv2>FB(KDKmRmT~-xV<4SjNF539ARGK7R(>brHS^_c~#|_s9?+yk|@hH0=UxTNN|4 zO~X&$Ng;-F?G`@ zF4__A%kB`?7=Lq=dGfbHj&+moENHi_Lq@!NLJ#)rmP~mZ6UHBy3CT!w$g>jtYAM&* z(xJhyva&{TYhaD@&?{ph%#zf89JNn+MkLSvdAT&B=I(=izF=A%`{Jw5itHzfyxVHB z9507zd9Hb%Yc_80sXVHyU$f)xt01!X+`56aK@(^{%BDjB!h+pEq$U4%ZfG!@iL(F1 z>5T{$h8@#Z%pg4s*Fh8#KiNR z#Z*-ROsI;T*9R}B$(kF9?IM{uUTU;m6cKeS5eIA+XT>m(ORJsFh~MC;cRaE zjo-f*dgctSviJtQplts{o6FtEh~h0PkSP{=e`=h$I8;>n)rX`V>2_)NHJU1qx#`nw z0|H!IH2$724~#eTCaQ%dCls0&M9O`JB`^i24<_wG_7HH+%OmH=+4B*|L!gHPs?-i8 z3hG>OsL8IR|y!DCJblJbhl68~D;Xy*ngz(Vcz*pg@Z2hC58ZEt#iW$~lt!SGYS(TVEoGL^60#$JO53_IswcL2{XJ)bwuW} z>m<2ca$#LP^eEq=_}bcQ7cL5LQ6l!2?MyHI?S2ngjCh8FJ<0a&bSmE8!&-u4HZ_{n$<_7*jfZ{z=MQrP`vztZzZujqyE(H4&k&COSZ z{bOHr&PxvlE<1|omR79wSvW~AUvn;r69(QSBU6+I`pS5)Km{H_=vtTLch3+rzBm0} zIMS7(O#p5HZ@t>gJU-1FhUv~!@kQ>3S${-*LkynIa10I&!5;d@ux~9+xnyE>a=4;I zlNw?2jxB6B-Wg7OO24GT$1LfXl457T$zV8a!ksHIQ{dCj;{HajMm9z@Sz)m+QYBl{ zX@9R(1`SK&;-x)=xzzd>0mW?9O4ET?c#HJKZyF5T63{45c^lJ#LOBg=I6M9!(0MR` zlfP|H))T1`!$>jx+UXTmMgGTXk(IVc#Orv3GY9pW+SsoYZ)XX9{tkvFEcWa;Fn+;K z>a5(snfCcUNa*u0YT5LC(@h~!_f6oDg7W+g?Xk!6M@H>EU!G9B5w4aUfPx6uxis{_26}KvWXpAV^v8L*`g*+Lgi~EuG?RVr|!XhGaI6 zhHZ3byhsq3V8Tc!e|r$3{M7|fBtX5#nW0yDedi0%I^&Sz5EseYNl(nn! zW9)o}lgnJhT*9MBubxC)v6>gQsfo!HTA$e1*l#lM?Q#?4hbpX+u5QST_zVzb;`wFs ze9TB~Ozg6qaLsZ_x?UTTT5bM!z4Eip1{I8RyIb9$SZR$-ba^?us%z%1&e#%!`7U+l z;){iAa<(&uUDA&@S86{a9K}_4iqV=Q7WuWQ^Xw>3KPi-)5yk1FRIb1M zo{WcT-W^;bcVRo$TEgN->RJwK$GBG*dEIWOf?FiJ`p+l*M8_-My*t-7l|o zB^<8|o?K2VW4BH1VFck(a_=uP{H!@BxfvX)3?nPIOa$P#AZq>R9mH77{%UInnE~>} zldv-+2HXq=1_r9R+n20`4Rxm|FJIUhotk2~smd7p{4@)9U91lx~d<6J$W)2)5PYEb_2nKb7*UIMYpY(VOLZ0Vg3Nr8Ts4Am(HE5g}H+BM6+}%D1)0| z2oAgu^%56|49qf5&lGs8fFs?etJa&lqmHhwM783kF1Oy=Oqy>c%Brb#>iNFqh@gjm z5ZE_d5+)K4dM-LRIPlWlJuk1}n8&r0LAaz+-`F@=qOgoV+sL~Uv*Yox^L&fIUjA*M z$i*C1@DNQut)bJ$px*+VCD{h{8OU%SXzK`smtS7h1-x5-QuL~n;sZActq=yC)zhtg zgtZ{ZS}5?)vR^D4rwAGsHv6vE(_^^D{s0!l6l#J-Kxk=vJaSG%DTa5(5rfFk_Qmg! z^vao$`i8QqXay6w*D_Ppx$yWtkCt1#lpa@i&)WHA%JVU$t1Yao&pEl)_yw(NQD=Md z+MhklDgYT1I01!jz&DMv(c4_{^zhJMYifqadQCE%bEFAXQB9V`DJHQHSWo5KfW@kV zSSqBG3Nd^Iv=(K1gjJ###;jK>lXE$Q04 zotFsNsZ&>c{8|RrZ%^pJi5s1r&4M>p3ZaLoh9&IPtNTRx6TzjW;&4`X4t0R^AZa?7 z^GF12{}3BNqr2=WQtn}(KQQdlp(6vjnUs4sw&6m=N&I(bs7_7jUM>tJ$eD8C*YYa? zFY_#uPMwy?g#~YYL*IpwOhXL%r#6oblmB4K=*)~qyP~y~=V6Za zN|vlVOs~;sH0m_;vpV)N>|ZeU5We*E^it+5s#BopEii4O00`6)_6wqF4mJ~=RDgfA zA+y0bH9G2_nwnajs#xve>B&U953oNw7Z<(rE$1Rqa6^QZbXhfbUOk?io3p`8zX}f* z_(7)~IP=t}FlC8w3C0{D;-s6tX%=#+Y~aNSbrYBZK9uBuvbL0E@3k6Cu7N>g%8tg9 z4`)rb2?_K}Y#E@asO)RCu;uEv1fO+d8qV)xR!PaK^+GqCePW@c)O(opXe2{_ ziPL7&4mH2GXkZm7>bc3s`Xx&vgTkR|gARod(A09Zue;z#Y;&2Y{qOq0D)r~e@i#U? zwn{8&4!X53+5|4c*zj*pJ{yNpRGA5F3&6>bKv<`l9Sykdg8{<(w?d_AfBQQPDFM$d>XdDTpTcc`*>;8HpHRGu z6sTFkiYoKYewVPd0LcfUz5O-N#ma1PkhWJ1gf_$Aoiw!bzwz;Vp2J4 z(GE!zC?H~ozbEoV_$ zjF!@}!RHF-5o#GK%gO|S53iYTVE6S~=Dqj$kT6cz@|_1&f--<)%whtS>iCiZJqaIc z=r&1)=R9im0rp>oEeS50^N-Tf(oT|)i~^h9>Bcegr~U&zjSR50!g3j$6Kiy!V1mNf z4;ZV-FjjGd;-6D3r48Wd)v8ZOVbXqK?vvi5$Yuwo=1uqZG#T;w{XYE~Tnv`(a&_wBbNVVoOVJT!MtAGY7y8J;NQRX`!2&xn3K2{V zCbmUWvxn?M_y0@{qsUqMo(~&N;QW z)Fb(Qn-Py78N=peY}8C2&6o9#s+iY90Z|%6`CZmkvvlMrP@%E_ahw(*w;?qx5+j}S zs_kGuf=zdhP#Ew?y^)@*7X0SN9qk~J zpfajsV3YMKJAF)EFL#;;MY7T|aAfchF=$7M#Pv=IhYHoRwH|YmJ_QSp+7)CU<1Jsp z8Kx0Bz^HkA4G<}_b;D#~v)8{3JG;K?)KwzNAqtk+dv6o9j@OtWa~Kq2$_#tEdBGm> zBcPxjvNcc=^-Y0J6k#y^di5K;s|sN!HBujx^(7(|=U~Na+kl?O!YjE$9gRpUUHU9X z#-cTv=MKyoVAMl|uy?`RQN*hj`J@4 zyCV#KC|62+YQ!VF1H@rzH?r}(ub&Ux7K?j|EYvF87G48N@QL?ft7MB#i{6*ViipTk zL81AfTv5T9u1zZBPjEIp(?=)(B@zLt6yfnjyKEDD!Vki?%S1C3faGMgV8h&bt2Ua` ztH~6Fexu->AoSv5gZZFgp~-CnkRB|8=@gIb@1dcpdy$p#LS^OUZ(%tl#HGTSN1UK; zO&ln$a&5P{dDRn8m?sh`Aj?&GJ9w-Y{W;=KZP| z3U*`&#uvM_==;H-KOD|4{gY-@W8wG^*2+hbmDl`B*+3OM2&E_LtNl;{RN-`g*N_74 zRuabuEr#I4De!l1k1s?aHpdzH2+PO0s6cJGzm)xw0Y;+OU-H^TBPy9kcLqX=rVINy zJVhi;*9Mqcnwo;*;^LS)`+W6C!Hmtj3AjCQoy)UID3JGc;r8`v8Vo4axL|q)Km8ad zXZ`m?`e(%u6<AZWstLqR09Pm+dQ%!SKM zbmZLJ(p5e(jsA95#<^vUDOE)BuHv>#{b3Ii~c^ zL?l>0#6$g2^khbz!{a#m#%ctg2!~}&9;5g!=%}V`{#KT8|0`g+K%A~T}_7f!1K~k_00c!{nH%;N*AP6%@~Wc`q-SNiOba$a5@77g$77zUXriHeDN(Pd49 zYhv@gGS!oBXsCU@lctZP^Q`!adsh0qYN2 z)^=fRVCq%0unr?E^)m}2HK}m8ew5hhLKVx>5q;@?+MBe9?C5wL%LzjFh1WZ=hTCkN z4AaDvs_dpCI>^IQQB8B9rJnpX3h~_@4U*2MBqwiQLBy*qsU$RM`XU*aBRzc0{H) zR}4mEk^!2PMqc7;9QLvT2U)D;q*J$>+dASOq<{2%Hmm{dcUha)b1M zj%hVgT~&l+sPYAbrP1R8o0%&7-zxY-y?&kMgWa}G$9l~kra9$#Zbj9TDE)hc9E|(* zN_j9)0KU3EkVXn&F(e8ptOm`Tl*B?Rz5c3$ZIp+yjRv@bEPIzy6%EK7O{b<{4Uy(EzU< zfOf#JdjXjO3QiahZ-cu0QK1PDAPPiOfF3pT&43{HBPbJ*c_-N3NF=ome&i7ciPYuh z9}`!h82^2NFO=ZVCxYy4@jMAsb+sl?e(8!HEifKG8eBCVDDsp!5zZEfj}iNJ7^aTG zgZbrt0X>K_H14#2#v!=aTWNe!#sfpB0A%_Haro>sD63X6Bi6;U0v4~|fx2Pwg#4=P zD>UA{4ArwEUNm=$t!Dz6{)slvC=$isil>1L2L$oYkBX*35jAHsA0J0!A*Br(UG~k% z%gZap23VbA3kwT>$|iO>m}Qhs@oh5>_?&2b{fLA-lvD6tbmj32iYUUj`U!u^1)^!_ zj47I6JnAA*oj^LA86umn{Uc~6& zuq1s1HT2u0WC^DLFdcaVfQMuoo22veuV1g!cBhKlgd6yQ3lP=m(?-lZb-GX54!?(T zy6=d1JKZ+T<1;)xIHi7G9_f)_L>-K;xQxYOe*x46+ka}|_Phj-gqKYah6gp_5MsgC zqZOhh^ArsY&GF`H#DG4|FT#%p6le}0FGYhNN2uqYwD*?Va{}T9KIshcWM=>40x*20 z(?aPfW(bH#)COG zJ(A)2*r>;2@fqHVMZG>F!*8R%j&Xl-43T&TgQ!3z5O5>UcP7c8t`fEcme}^;UjtqW zNT7J2&ZzC`>MHx>Fj5Wl!B>F!jLponK#>ith3j8fs_^gbb3E3Z>d)5xxyf}PKyXv; zkO4+xnXuqU`W0U}8P0QC(0`$SRLEDhae*2G9@;RkkPl(F4osOoc++(?C!GY%UegCr z4EXdIgqns32t|p58|MEE-t<@?;z6IRYr0=Y%qGF^R+I(0D(K!Wa&y0ej{-Yi$Nwb~ z5@2#Pi;082Unj90liF1EDf80)3(9H#{ObB7A$nTcMnIV3VL>=Te}sO<{b^f7B@LI} z&b-LLFac){)POl5(q>8GKw^a9R6#w`oKd|^d31PECn8cMgk|pLlmYr?{B^RD0-^DP`w-obPXLazfeh*YJ`rzH3XU8$ z{$Mxd;=okP)HW5zcR%g95Cu88>oJYH^m!7HH+i+fVlvbS-kg#)_)J~7R30RGjqr_L z#g(6H(=_5%5l)@H{=3&6KV}Db&Q)6g_5}H*#VR+2mH$c)mII?A>(AaQE0{)!U;cKC zJ%|oXevce^4^(e4kZb1va2odlFgCQ%o9+5u!x9iylMxrCX1?`y;i(UNJ^%e1fgiRv zq7kX4ih%*(;9vbhcL?aTz->7XT*pa>+gGM?H5tSgSE~s-WfK*C+MP{(_T~SqM-qZA|qlo>)PtPu%--dGqhjXHYIM&?>^kLY8s= zE8Aim#~MfyQ0^A0ampC&HH*!UL{J5>5In#?i*H}6JU-mSCIH6bPmKx_By_5!AM5?Z z2bbUwCw)NO{A?7fkCK!x;ku!+DJ`h_P2i373| zrk~hmPQq+MImPQtvn~0Xus-PoVKZLT^PtM*HW8oozoVTiXJZG>S53|+ju5k53F}Of z)Tqs$=!Rd_0H?77m}>RFH4OFGQ(39r>-fze_uE+DdMCN)u%9;`ZzsbZWC^d@e_5iH z`;C4(l=mS=^H5t>E?Hrun%3&aJAWs&dv65D=x+Vayq_Rc>Y6R(5aiwFVcYewJt87g%ssEL z<@059emkghlmI{hAultOfNs5dB~NC4p>Exd*Dm|9>C-&a{{08hkYIY>p-K$?#rbYP zKaOw8#2tTj^qN;@Fqzr+sQ2JM*B602MQJ5W)MMe${s0P8M~X}<$T64k7aLNiY$r_( z&PjG{@=0H6u6OC=KrR3M5L>DWtJTs}lb`q;h`#QW4Q?D5AgxXDzAimtS?H8J62$h4 z?}PI?GL(i~reei;(c~ z$fbY9G`m1x1hTW??O@=G7ps7_6vD0=C@`AfM_S=wn$ThQ$qS0j&=YUjV+6u42>yt{ zEDTkO14x8_j=iD#bzLLT?z-YstAMFMeoa1^1+k2SRDt&P6-!zzR zpNFbSTlj8fk&x4}k%&&oDO`_XJ9eJTi6(T#=$ufi{;~fbyq}$8!lwe23ozkrT^5{7 zIn}@f&}6d5@I#y!Ul=JZ%(f2>4jzF3V8myS4`7;vZwFgLu{ZJ!O6c$v6*wLx8=ZiJmJLM;)l2$&K_ch5r9X=}@2BMOIa}N4(e0L3S`i{C8EI-{05l6j!5b*05uIh{$>0Rp*v!B>V2y_ z@+pSBEpdsFtqK1*94q+zb7pD)*Cjk0sqJD<_>S*UdqsmLc1KKqaIM%rnC>$e}6s}#rCJvXm7f)}n%yAXFS&}8|D-?2M${|?dWSZ8UdvUUQ zPr~;Q*ccIYuCO=@aWYF4L&W&mNzmGeWc<(gg7`KG#;o(oxfy@44yc zB?ShtDpjwxYgskCytP=~)Xjgcf2_%2kocP5X%-fhCr`d=q_~J6l_BsE&B18}?B5Jm z`hkXgV)O=i^`zr164PoT-IJnQ#+cGqslFtHB4zS!46fRYEJY(jc)E>o(S&fIpjhYR7<2GU-R}1T?o#w+ z4%i;KW@rui1*oebhJ=VNh@1cSN?7d!S^VIDOJv2zHKRFQBtG1~`B|Ngj_>s+>#lX_ zMU0q!#m9S?vgpi9G(3MB@}InCZAIz+KdQb0Dyn|%cW4PgK|<01K|oSE4V09Y4n;r# z>23*;5D=s!MGyfA>5>+tm6YyokdnI39^UWX`<=Dk6YDTDd;jx^Uoeb8&3E=&eGWLY zj!f+4t$)77 z=v;JfCv19PUJA6f{%E4z)k{#TZ3~dRr>mvl_HSE^lNX=u2I}9ATe@S1<-zHH#f=+HUv|D@!jy5hP;%t%3aKKmS+4clv1T5H8e~l%Hv}zBcNESKDi?jKySMP^oBRF~T@(F*I|$1f z>Jcb_9bW~zQ6)EA^vl_Bpm$tQcv;QKl%n?K=8g~PE|^NWU+7=veQNTpk+c|}D@)lFn&odo^$4l-HObgi$uL`KWbZKwubB2c+hHzcKDi z>hD_T(IF>Rgo@@}0hGMv^MTw6vZ^T7^qzD%0@UXI28-Q(tWcGqgDK!LaZZj>Cv0)7 zJan}lxVv5_Wltg=h!rHVM}7XCp{UaueJg&xLWs#3ymxXX4ADdN?#xc*QUTDQpu!^! z+#r?@fN4kRj+UsV`pv#>-1z;_rpP?zDXo{HSA=t5%5YkuBvex-0txM8=C^R4JC(1b zUK_{M`$kG+@#7f}_=Id^YY%jFaSo5bZJS6|gg)2Lo$bXeP)kG9gMdR*#^oU_(K9MI zkU#l$c!8bkSN+iecW>@-IrpAem(tck3k}7+CqZC=oH(iZg-}vGv@ih`szXiIbY()L z_OZffx*R2xH*M6H0qwE7*n_t>@?jSpkiVJnMc*O*&!LP4fRTj1y=p#tYYx&Iq4avo z1Wv-qE!f7b?HQsvsB@pLJuEpG|3yV0Har1S*RyleZ?3VnIY56HF)Y;hZrM+9 z9s;k*Brf!<+%G_jd#7E{tFXuS=I|y|A8boRVdMPxRqb&=L$3(Jn(48Yv{s^jHeNSR zSU@oW%4qKr5)zjAHqEoi6l74sTOwY!%kEEj>|LHe+*xjhnj=#CB4<@ATQW7xnNa^v zP%)t+Cm#!rvhu_qO-+~^qWQ7(P43J6l&@BfbqI%$qT`XwTbp@86&uslACNX{ zZgbC){}x_aN+$9MX&0bisY?0$0k?^@%XZG;x+2?qXOJ$Y;@hdQpAkS!u~&mW`1Wqd zTW}oKW~CK%4o4E8dEMRB`BB%l#nWZ7Mia)K^=DWPN#AxR!7CO~On@MJ9(a3$Y|h8W zR$P;q~X$ibe-xpv;rd-G!neU$+5%K*)N zVmlD{!M<{k?4|kJ1y?ndQ)8`v&gs#{m1@sW_0j=!!~_fc=JT_4m->GDogZl{RKpCf zy?XHW#`LT)M^P-q@GL*NoFlMnyT^~uk<=WF@vuYJW_Sb&JhjO{b{zgLavI|-RIVdn zD2%som-gcRz946LQnA#%e!sK$`sYr?fu}Z{^5y=zLt1fs_NdwhCjS-&+GmU1-~6c~ z0|M|KzA;7>Vn{1EJy}qa=u9X-DLs$4VFC>SJT7$iv|U=h_7^*WPG{4Y6T@$AhdD>#UsKM#9 z^Th&)F@uC7br&gmd`T@!W=x-@1wLfhFr#jo?6>s=OI`*d z>f3J+brM+TB^H@a5@>#w?%)2R`sTNu34gp0RsxQ2VZ!L*&U1THOw`SrYwZb(9Uupo z>!O#v)AX|6WIXAkgSieH?&$? z4!>z;kd_w|To8L;KyvXIrr21b3c1vCw4Lh)H#atF3EDdZa}Cc=2g{PJ3Eegn4?mSTu^L{=)yhq$VG{olH-X5E3}%$U za0j2(uK12-oQ+yUPewfTJR(T~*<MMNRE1khhMms@p_B4N4lBZo0VKu>#rT{G2Ua-$$Edp+fE+DVVy_MepP@BeYabB zw<}ax$V)m+e_`0(&oJqrp;xu!VROc)X4Q%)QxvaTnz~Cup-MVDXU5H~fKSqO!hfwW z=H(;s@1hIkjm+;vmcT=6E;3@0E95#3_5&O(Ux%sgZO@f-jDa}sJ)OAOzN3m9x-+l{+Qcx zUS2*q_0%mm{Qa|GKX!JObNTADF+WPQMhv{lH#-E9i1+j}^DO)6t0+13?X}zE<~l@V zbVnXt33>mX;ZLF_jrUfr>E&HV?hJ{ubUrQrY^P!+NO;l5zPi;yn10Um)}GSq!n6_# zt=NyoM$lmAKM(%(sD!QU>leA6%--ZEjieGAqI8aFFTGS=3@#QqgRIVgSXj2Eg?cdr zUvN`BfnxJt;O&D=^=#Jk$t)$W(SvcE-k*+^DgjK+hq^l||E-bprS-%hbTH#+y`)C^ ziymc={EYv`$UTMStKDpm8<$l7@`ORF33@WnCVvDyHs#IDBO+0vs(L(k#h1j~SEiS~ zNiuQ?4N#nirOFfWBMw?ft>Ev8q4Ts1sek?kzSKi%Drg-W4 z_U4_0Ps|^0^Bl_rhd*oex=qbziq1&h>AXYVu$JD(huN4nP{Lylejobpq0$C2Ro^Jj zc6xp)20e;bVEXQRE6zKCFWK*RPEtbQV!j7D)JhrHo-$s0bSWA z$I8mm+$1QNm)pGzI6$lIwk4{O_?!&WAH^D2D(!iqyVLW^UZc4Gnq=zZ;SnJj--n9&vM8M_=mf%?WOK*6N^e7SHOOB^Wp>0Suz~ z+Amw0%-kPlHh5u#>zDJiB#Ka)JlA*$%Ly~4#64u>VpJP(^^Ua`;Kh!ACk|A%@a zNpvugNluh@?HCX+G781TwxBvDB<>jBs`t`IfW6%x#ICnzWAsBVPs?r3VI+vZbfY0# zh-|c4+vD|7MD0^RR@lr}V{-QP@$b;*6wboL9gUNN=EufM%}@U26MFw$>XY$Y_*hT0 z8YB*e6S`fi*h458(Bv$d=S(t|ZPEff(f;q8cnO`-p@@Oq)yoh#zAh~-wMiKCtP_6) z9&Qi8se{|-dmJxYPnpe?FtNuW1Nz&O*?FRY!G-GgDX+i2wRwIac8d+g=IsqoObESC z464pnox*+es>3WYe3iky)}<@2i6KqJi#swx!1h(t0b)XkwFTSD%XB@5H<<%52ge zXJXdkh0JrD-0rj*U3#=Wc5<{GMgtcR-(2AhXTX4YKsyAVhzMK0Hh^7MlQNsnEhJI1 zj(SKr@*av71J~ys;ko~oL*m(h%=~>pIoDo3l52PgVzEr!xS9AA|5_*)NFhiw1Of{C zdKU0?{GAV-T`uk(%+q3t$~+Z&8QcE6wLB5;3LiQBvi%#vY<^{$FRPPx8oJYOn#BC+ zyje$c>5?BPaB|T**Ts_H2i8BM#uxp`Znj0U_xp`rT9J8kYcoT}RcqpNKfkb3pdYH7 z?$T)YRY->8{~T;{{9Rk^`Vm|*o<6o%9Vns_hPp6N%2{^lc>J5IvvWQu0fELC0#N3T zlLujkA;IMEa7lTk3mvbzystKL2a!1Qyc7mbjFhakFcUWK>Ba?#sicHf%C~nj+r;Z_ zrb%BoLp^$YZS=3WXF`Ky#i0DrX`$2jqYw~rM(aZ8HVlykNhrzwI}C{w+Ia41#6pI}f%i#;Q|doJ7~N#d@ht-Pej!`Bet+m!$BO(pUV!8inV`?9^)=P!KXEyxg+AM1>JY{& zD^U^j)3p}rsvdGIIjpsJ7&Y56|1z8}C;xashqEdiQ6>jlCES5Osdvy%^0bysrW<3o zQ>1ctUVKmYh8{)8`Osv%r)--IeV+2lRwLIyHw9YM*O%NqJ;g;LBB%;2E;H~3>S|+{ zqD;3M$(An**^1cM_@mfU=@@J=b)?^Vo-f$HrMSVQr`c%T8GnSqO(XCiCk~62CNTf` zsx}0V^bVbLRq*Q(W)WG3WS<#jqJCwmbAyJtl!3lZ5lfmunEX`rKBl)qtxqh~(=5r; z(b1dbzD{rg)De$Gz}<+5Mn)z+T&xvAL13a<>qtr(y_F$Rj1jaJ6|N*{*%?6FWSY>= z5^X;6%tQmBh>J}AFkz& zR)Qet1pzmT6(Uv%+^1O^YkDl-eM`T3?;)DMd;(7!-xvagWZ0Xc_R7Cqy3QWO)5voK z4=%s^A1r|HKBrUuG$l~EH`G6W-=n9*T*ul5#{A^YKo4OV$v%nHBu6b!=G2#p|L^Y) zNf^WL2O^=V=$5om3Kj|;f^=`PXyT|@ZFQGO$raBER1_=+lI*)>bb%QIS!JvoM>%7x zqO2??kGI!F0=ka5jznL(on=Zf-CO0BdiuEfxS{JqQQIQ+Dc18J05ieE!-Luf(2v}A zOEWXGOd)u6nXKHbUB$Qv#;8ch!x_$-a+Xcp;J4VP^#%)-MVDtBn_h9$38z$`dM@%t zo!;H8(3f%ox{&jEUdQHf>!mCcw+cKC9r>dd@`eGSq>=~L8ZGtyguc_B$N#vW)ccM0 zQxOO3O(jYri*3g+7*{4@_X;y}02CV%0Z6?G{H|3;J=cFGkMrnp{ZLeYjJS6?sUNI- z)k0Yi`0u~YVi1oe()TL!6`&=Ce%5u+K6?zV?C(Zj4+7ex&KdA5P; z@uRXe@b6nP%jl%ccnz`)pI# zLAiw%kaKtwK7N^4~n0HuZ>rx zoA_oU8R#W>)Qm;KR$x>&UYm$w>|+6YK0fHj%?+97&AwNCga8NKbOB1)g*RPQCHik~ zy$hlU2y~wSqh9pi^J~rYIx(OYP5qUom4;S}i^jYD-%g9`kD?qfX~&HKX^;My5kWveA{BU~*d?t=Q2GCPGGpXdktuLxq16|TD}VuNi@$Wr zJ*aqmi`r=sQ}U#9v{Eu^y^gTbabs?7?tylzZ=Reu5di-SHZx{yv>jmHF*3)smz(=Pj4Y z#-N({dAv$TIov9+36WsU(+zUkz`R2k49f?!j`IihSeEa+U>fE{6+vCE_rnzWYKl;6 zg#T1CdQapWCOGxRunIr{JOf@397)9DW5l4GaCy7z@bh?*uS#}zmdj5t92~fVFrnnm zXq`@Xb&)9wcpwIu^&`%NxjHQC9}1H$WVjMMUCn zPYk^MkpFb3uNJ@VfGn;(SeKx-#`{&Re?~&R-(lJEI7k2?>7EibT(Q zM@jCT?oNG@l3FGktdlzm^5TAjYcX@r@EjM;LSG&OP#_2`RrTN)A<_mb<_4oMu_joy z-@En>p47&F_@Hgp@$=nv-%WPn3BNxOkhkD`qbTZ( z?K2!`7?xd|$btQK_bz4(5ULfc6~T;d5h~UjT$KfwV@fQI;aBf@ZkZ!*tKwh`7lz7P zC7ubfzrXH*)-!(SG!M@gyGegPlTOAM=iE7&rFWf@H?|FkN%}{34P&*NX**(Sg;QWF zLp|@Dw|Q>)YfvU6r?na^!10DF&M+5N5uQp5|9M#0IkmFLG-jG@!S+>on{Pc?Z#a^x zCjt;)88EHfNTAi%EAX?vgTcGlvF`GwYe8e_-_?7zg1di2`7Ku{+JQC~1_GhqfQ$^D zio_SlX=yf2%7QtoW8q?ngY5DOdkpdet76EwshbN434y^2oYp78v230fhPurArhX*Q zMi3HEwQ&jt3%t3&YO`~nnm?hVM=>nLX+4#n5K3&f0f`8a;IAAV0VrnsSW{l1B?eEs zdN`hay-O>^o~=p>ujDuEgTNaLJ9`=sEXegj(aTc^S)OLA8a4mO0gwB{nwE_09^3=? zK-ss`DUBeqU=Cb<%D^09aA~bSC%$X0qXv6y=I3?1p1ko~?-IbAhtLRwg4AQE!O;|@ zakU9RJRxH`Pd_$CJSG+#7M8a_iXOk#0zBAlL#?f?K?F`1unlFl+T+sB)5|B;-;K6C zHyYOzbYz11yM#j`Axi8__NREbGz~CJwskm^;jyurbITN^FMf7(FflVXpB+N>zmU5o zD+f{i?bQwI&&k}*Hn`aO)9}Xk#X1X$ZaVKjn)}1!h6h{StF*gP5Y2Fn6&Mqei2YTv zwtyP}){byE5nS_q{YMAeavkRb-!c_BuwA^XOTBmPaxc~uAs05)&zG#*xi{b_$659= zs}%u%Ch>m@pCE2szEm+mHhrZ8WIGsI!*XiN7;Zd8xNyOz(4}0AE*{jpBOt)PF zqZE0Jnlyoyd=IW=xX&?CARYp_1FK|%Qe;CTBKXSlXAvU2jRiJ~Ojb$sEgf9MvfTM7 zxAKcy>&<5`{a?wO@O3yQ=_oqx+M$5>z`XPi{)&{qfA_!v&VEpRR-Q+m1jYm}0ttQG z{=y;i4M=f897f6DxaSL(4a!9BDf zYEe;IN9LVQ8d+bXu5dXBo$OC9_UF)$F+cjcV7uD_@?Jih>K`v`Mlu&B zJrKQAaW&R!;?+wcYJ2Bi2e1W#`fDOA?e}2bwlZK2ykilndAJ1=gYREEbWlW|HKG;C zOonnmC=hOlo1En{q`+;|`-ZdXJLO$UZ#~$Z?%q84_X#fHHK|vYZP7U33M3asFP55X z4r+S<@0x@-?#j)ZFKYA;e_jtugQkUXQd@ibNS>Q4^7U#ISo$*EmdE*g4WJ3y47Y>9 zoxYX$ss3{VsKxU0La$%2&t3qb{A;2+Y7~=P00?~-5kaa;NoHqQeOn(=TI0^seC9l4 z9AqT?;kJ2E3MD;lvo#pp9Bs|NyT5XpyGXPPNt+EZH314@%@QQT6&Hg6e9>CZ&B$?beIXS}&KtLWOlzki}J?cZI zrY4SJx#MUZHShHD0o})mt9m+Agjkwx(mIwcw=A{SU5h~#J&wCE=!Xk(iobE=h6?Z( zQE)=2zhgT7;E0Gk}c+C4|Rsx9+t>hl20JpF^C6;qt_+(qzS{*CGGvK&Wwj0p3>%gc)$38OO$o0G#Gq+fYoq_!g`uiqe+l~mqLWl^*C|g-Y0lCCE z4hY+fPET|X^7LLU{h(a`v+4kBv#Ymmy|or}uQh{CqY2m~xdX!b*|TR#AbJj54Ex$O zPV@^PH@Q351%w)ndF+M+%$UDYEX5mM z&qli`z&(%-|ID6LpojKD9mV;GG@dATDor@cAowK-Wiw|OL!zze=$)m_U9ZXu9~VBp zxYyOrEH191oQ{3~dnM#FYE|QzP>_=gCU8bR0#_#9wD=@f9%a&H+GLvtkEGtCmqPa) zV_3GVJ+K9RY#=0ny-E=3bvQh}H5JVHSW?~Xag}fBb?bi`@%tg3sN1=TQtM+b2)DwcoHy@D)knL@8E#4z#eXr$b%*_fF)Ro5 zJPe>0%mUC9_X;m>By`|xLCFN~yMq@pk9SyfN0L6KeF_z3r2;|UdAy3h$6Hg`FCey@ z)OZtCQ-+z1RIeB_-OGGqQuQoxaB$p?Cn07jPeI$g#>4Fqs4SbpX3x(L z2ZI2+5u4_yE*iFm?JnkmoD>Sw{04O}jm5urZ0M=Wq93W#xhvmZ?Ij2eQaT`KA||pm z|N8O}Q@D>xZ*C}ju!iZpNF0DT&;rt2;vBhL_u4JpGOnfl^ca22H%rY3>ns37v7^4KR#*!hy<^nr3RHx8t5xDQDzxj(1|`do(fJ&a%Bw+aD3ACdp=T#KcL12PjQ>3;EUdzIis;L zH@+rj5wKa|Iq?=p->){1OfU9jb0~_(Njp0J#_Ge}7B6qV&cu|iYksz-QmHmhuwfnF z@fs~~Rjbd%yQm%=a6u;PGO)%wU{Yi|IJFAWdUdJ8T@UZ$w!4NrE3r8zcex&WZ6-{& zQ`KHttMRMIIOBHmDdY6_y`Ro|dIYkf&N=6;2e)P$={#|r>gI*n6q3gc({PzI6cr(uEBKxfe$zE(4bu|&vJ>i zxVo&y7@U621vD6s6~a{|Irvdl2EN@C8mg6Ibh?qq%u~_fYao{&{jCqHHQH>o+K0ZY?baAohokQGx6Wl(VNa2`dr`W>yo>9MUsdwgI~5i}vv z29PYd!%+g@Tz|mrb){DewT@giyA)7nEF;gpL>LzzFL&ooon_6PaiBQSGc@v>v{O+F zSXK?Jr)LrP-#vLz?8$RVQinbPK<8c-V0~-P zK@7VIWj9`U$K09|SBN(bz{wnOS&`M#IC?eSWA#xMw*vMRUbV9f>%Eqf$^be?sxHxO zBIx%rp#o4wZzfAtYo~+*0sJv?69;_u~&0~BXKHJ zWQJ2{qStu4Vzal??&<{31Y{29`=Ob>ps9Lf%KF2@xlKh$=|ad}k-sRowzP3n zT9hJ3L~DAUu@tl@7%vfA47}gELc_ZH7BFv65E~pEB-fMm*U2}$!v#8bOd^gefc))8 ziQXrqHz7)v`iEm)(b#2j^ta(n@Nj2^gHD`~-3`>_#)Fgf(=F$tP0R;jp|edi(>G7v zmpZV?fB4I5$RSYZ*W%u6EZUrRxlJaL`C*@3intd!MSUA5v&to=2B{+~Z!d?1+Hk8H zCa3udNO6x{J3x5=Cpp_`<W4vB%7W=wgv7Ay;WcjVcRoItwsv-2?%&j2M~u^`&v!kPNT&|4Tdu;UX?W&8<=9plz#ZoeMay zJBFTPF28ELh^CvEHrBnGxs7E-f5hFRf9VodQq_Djp;Kg}W&wjDKh`ZUAOBC8%{0b= z>W9UiY0bjV3*sJRbJo(GDsKWO13xRYfUL9OD3sgwmQU{h-|@nR<#_cd!<%9QIJF=? z*s*)Jt0PDY#cB|LV=KF+E(J$e9jEBA>*wQlfS$yz0vH8o+%c}oK(z#vbUdxnjzJBa zZ0GxL#TUj(amVlZUzI%nLkI*R78G#MmA8?w)DS|9%H!3#3I{1K;SuPw`)YnH*?@n#o>9f1mNE}{na}xhs z5POV^&N=z~G1m1p!8HQ~eL3ZA__sRW0k~`Q=8AuK%^fv_-;W@U1_%On&2NjI&mFmB z)m;I(~Y zYQ#vc3^bv={wATXX>~l@Dv77C!0t#7gY3>1J2;nWi=6^Q z;`C0r?m8vgQVW~$(b&KCWAy(h#(&{^-(a6edKeZ`VF~nI$={rL5O6d?881^KZ!D}@ zUs*2T<$dP}Ol_=zca2^cELYl>L*}*@D^FUlLUA$@?ro5;50&Hm{vM=+*EdhL=YH@w zTeAjJQWlrXJPPIdSEPLVGfQvB@>n90wG?+jJqb#IC(lR!dwf3eiBTwp0FO%)3JAeV zH{U}M8`R>;L6#i@h6E2Di_PH}fVBAjcijQ_76Kk; }SE&Kr7l%dB5`wisj*ktfj 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 diff --git a/reference/step_box_cox.html b/reference/step_box_cox.html index 35e542ce..e74b964a 100644 --- a/reference/step_box_cox.html +++ b/reference/step_box_cox.html @@ -293,10 +293,10 @@

Examples#> # A tibble: 4 × 3 #> terms lambda id #> <chr> <dbl> <chr> -#> 1 FB 0.671 box_cox_mIBbM -#> 2 AMZN 0.135 box_cox_mIBbM -#> 3 NFLX 0.458 box_cox_mIBbM -#> 4 GOOG -0.0388 box_cox_mIBbM +#> 1 FB 0.671 box_cox_LIhbt +#> 2 AMZN 0.135 box_cox_LIhbt +#> 3 NFLX 0.458 box_cox_LIhbt +#> 4 GOOG -0.0388 box_cox_LIhbt

diff --git a/reference/step_diff.html b/reference/step_diff.html index 56862438..fa23c0a4 100644 --- a/reference/step_diff.html +++ b/reference/step_diff.html @@ -281,24 +281,24 @@

Examples#> # A tibble: 1 × 6 #> number operation type trained skip id #> <int> <chr> <chr> <lgl> <lgl> <chr> -#> 1 1 step diff TRUE FALSE diff_mgS6G +#> 1 1 step diff TRUE FALSE diff_Sldy6 recipe_diff %>% tidy(1) #> # A tibble: 12 × 5 #> terms lag diff log id #> <chr> <int> <dbl> <lgl> <chr> -#> 1 diff_FB_1_1 1 1 FALSE diff_mgS6G -#> 2 diff_AMZN_1_1 1 1 FALSE diff_mgS6G -#> 3 diff_NFLX_1_1 1 1 FALSE diff_mgS6G -#> 4 diff_GOOG_1_1 1 1 FALSE diff_mgS6G -#> 5 diff_FB_2_1 2 1 FALSE diff_mgS6G -#> 6 diff_AMZN_2_1 2 1 FALSE diff_mgS6G -#> 7 diff_NFLX_2_1 2 1 FALSE diff_mgS6G -#> 8 diff_GOOG_2_1 2 1 FALSE diff_mgS6G -#> 9 diff_FB_3_1 3 1 FALSE diff_mgS6G -#> 10 diff_AMZN_3_1 3 1 FALSE diff_mgS6G -#> 11 diff_NFLX_3_1 3 1 FALSE diff_mgS6G -#> 12 diff_GOOG_3_1 3 1 FALSE diff_mgS6G +#> 1 diff_FB_1_1 1 1 FALSE diff_Sldy6 +#> 2 diff_AMZN_1_1 1 1 FALSE diff_Sldy6 +#> 3 diff_NFLX_1_1 1 1 FALSE diff_Sldy6 +#> 4 diff_GOOG_1_1 1 1 FALSE diff_Sldy6 +#> 5 diff_FB_2_1 2 1 FALSE diff_Sldy6 +#> 6 diff_AMZN_2_1 2 1 FALSE diff_Sldy6 +#> 7 diff_NFLX_2_1 2 1 FALSE diff_Sldy6 +#> 8 diff_GOOG_2_1 2 1 FALSE diff_Sldy6 +#> 9 diff_FB_3_1 3 1 FALSE diff_Sldy6 +#> 10 diff_AMZN_3_1 3 1 FALSE diff_Sldy6 +#> 11 diff_NFLX_3_1 3 1 FALSE diff_Sldy6 +#> 12 diff_GOOG_3_1 3 1 FALSE diff_Sldy6 diff --git a/reference/step_fourier.html b/reference/step_fourier.html index 7ce87fa7..9d5c0bc8 100644 --- a/reference/step_fourier.html +++ b/reference/step_fourier.html @@ -332,19 +332,19 @@

Examples#> # A tibble: 1 × 6 #> number operation type trained skip id #> <int> <chr> <chr> <lgl> <lgl> <chr> -#> 1 1 step fourier TRUE FALSE fourier_SXOLn +#> 1 1 step fourier TRUE FALSE fourier_be1T3 tidy(prep(rec_obj), number = 1) #> # A tibble: 8 × 5 #> terms type K period id #> <chr> <chr> <int> <dbl> <chr> -#> 1 date_sin63_K1 sin 1 63 fourier_SXOLn -#> 2 date_cos63_K1 cos 1 63 fourier_SXOLn -#> 3 date_sin63_K2 sin 2 63 fourier_SXOLn -#> 4 date_cos63_K2 cos 2 63 fourier_SXOLn -#> 5 date_sin252_K1 sin 1 252 fourier_SXOLn -#> 6 date_cos252_K1 cos 1 252 fourier_SXOLn -#> 7 date_sin252_K2 sin 2 252 fourier_SXOLn -#> 8 date_cos252_K2 cos 2 252 fourier_SXOLn +#> 1 date_sin63_K1 sin 1 63 fourier_be1T3 +#> 2 date_cos63_K1 cos 1 63 fourier_be1T3 +#> 3 date_sin63_K2 sin 2 63 fourier_be1T3 +#> 4 date_cos63_K2 cos 2 63 fourier_be1T3 +#> 5 date_sin252_K1 sin 1 252 fourier_be1T3 +#> 6 date_cos252_K1 cos 1 252 fourier_be1T3 +#> 7 date_sin252_K2 sin 2 252 fourier_be1T3 +#> 8 date_cos252_K2 cos 2 252 fourier_be1T3 diff --git a/reference/step_holiday_signature.html b/reference/step_holiday_signature.html index 57fe9e6c..6fd0a4b7 100644 --- a/reference/step_holiday_signature.html +++ b/reference/step_holiday_signature.html @@ -286,9 +286,9 @@

Examples#> # A tibble: 3 × 4 #> terms param value id #> <chr> <chr> <chr> <chr> -#> 1 index holiday_pattern ^US_ holiday_signature_L26gp -#> 2 index locale_set US holiday_signature_L26gp -#> 3 index exchange_set NYSE holiday_signature_L26gp +#> 1 index holiday_pattern ^US_ holiday_signature_NrYDb +#> 2 index locale_set US holiday_signature_NrYDb +#> 3 index exchange_set NYSE holiday_signature_NrYDb # Prep the recipe rec_holiday_prep <- prep(rec_holiday) @@ -298,26 +298,26 @@

Examples#> # A tibble: 20 × 3 #> terms value id #> <fct> <fct> <chr> -#> 1 index exch_NYSE holiday_signature_L26gp -#> 2 index locale_US holiday_signature_L26gp -#> 3 index US_NewYearsDay holiday_signature_L26gp -#> 4 index US_MLKingsBirthday holiday_signature_L26gp -#> 5 index US_InaugurationDay holiday_signature_L26gp -#> 6 index US_LincolnsBirthday holiday_signature_L26gp -#> 7 index US_PresidentsDay holiday_signature_L26gp -#> 8 index US_WashingtonsBirthday holiday_signature_L26gp -#> 9 index US_CPulaskisBirthday holiday_signature_L26gp -#> 10 index US_GoodFriday holiday_signature_L26gp -#> 11 index US_DecorationMemorialDay holiday_signature_L26gp -#> 12 index US_MemorialDay holiday_signature_L26gp -#> 13 index US_JuneteenthNationalIndependenceDay holiday_signature_L26gp -#> 14 index US_IndependenceDay holiday_signature_L26gp -#> 15 index US_LaborDay holiday_signature_L26gp -#> 16 index US_ColumbusDay holiday_signature_L26gp -#> 17 index US_ElectionDay holiday_signature_L26gp -#> 18 index US_VeteransDay holiday_signature_L26gp -#> 19 index US_ThanksgivingDay holiday_signature_L26gp -#> 20 index US_ChristmasDay holiday_signature_L26gp +#> 1 index exch_NYSE holiday_signature_NrYDb +#> 2 index locale_US holiday_signature_NrYDb +#> 3 index US_NewYearsDay holiday_signature_NrYDb +#> 4 index US_MLKingsBirthday holiday_signature_NrYDb +#> 5 index US_InaugurationDay holiday_signature_NrYDb +#> 6 index US_LincolnsBirthday holiday_signature_NrYDb +#> 7 index US_PresidentsDay holiday_signature_NrYDb +#> 8 index US_WashingtonsBirthday holiday_signature_NrYDb +#> 9 index US_CPulaskisBirthday holiday_signature_NrYDb +#> 10 index US_GoodFriday holiday_signature_NrYDb +#> 11 index US_DecorationMemorialDay holiday_signature_NrYDb +#> 12 index US_MemorialDay holiday_signature_NrYDb +#> 13 index US_JuneteenthNationalIndependenceDay holiday_signature_NrYDb +#> 14 index US_IndependenceDay holiday_signature_NrYDb +#> 15 index US_LaborDay holiday_signature_NrYDb +#> 16 index US_ColumbusDay holiday_signature_NrYDb +#> 17 index US_ElectionDay holiday_signature_NrYDb +#> 18 index US_VeteransDay holiday_signature_NrYDb +#> 19 index US_ThanksgivingDay holiday_signature_NrYDb +#> 20 index US_ChristmasDay holiday_signature_NrYDb # Apply the recipe to add new holiday features! bake(rec_holiday_prep, dates_in_2017_tbl) diff --git a/reference/step_log_interval.html b/reference/step_log_interval.html index ba8dd567..d03faaf4 100644 --- a/reference/step_log_interval.html +++ b/reference/step_log_interval.html @@ -318,10 +318,10 @@

Examples#> # A tibble: 4 × 5 #> terms limit_lower limit_upper offset id #> <chr> <dbl> <dbl> <dbl> <chr> -#> 1 FB 0 145. 1 log_interval_PuiJW -#> 2 AMZN 0 905. 1 log_interval_PuiJW -#> 3 NFLX 0 144. 1 log_interval_PuiJW -#> 4 GOOG 0 860. 1 log_interval_PuiJW +#> 1 FB 0 145. 1 log_interval_rnEPA +#> 2 AMZN 0 905. 1 log_interval_rnEPA +#> 3 NFLX 0 144. 1 log_interval_rnEPA +#> 4 GOOG 0 860. 1 log_interval_rnEPA diff --git a/reference/step_slidify_augment.html b/reference/step_slidify_augment.html index caed0912..3686a763 100644 --- a/reference/step_slidify_augment.html +++ b/reference/step_slidify_augment.html @@ -286,7 +286,7 @@

Examples#> recipes::fixed() masks stringr::fixed() #> dplyr::lag() masks stats::lag() #> recipes::step() masks stats::step() -#> Use tidymodels_prefer() to resolve common conflicts. +#> Learn how to get started at https://www.tidymodels.org/start/ library(dplyr) library(timetk) diff --git a/reference/step_timeseries_signature.html b/reference/step_timeseries_signature.html index 9a3c835f..0c5923f1 100644 --- a/reference/step_timeseries_signature.html +++ b/reference/step_timeseries_signature.html @@ -299,21 +299,21 @@

Examples#> # A tibble: 1 × 6 #> number operation type trained skip id #> <int> <chr> <chr> <lgl> <lgl> <chr> -#> 1 1 step timeseries_signature FALSE FALSE timeseries_signature_2rHiP +#> 1 1 step timeseries_signature FALSE FALSE timeseries_signature_MY12H tidy(rec_obj, number = 1) #> # A tibble: 27 × 3 #> terms value id #> <fct> <fct> <chr> -#> 1 date index.num timeseries_signature_2rHiP -#> 2 date year timeseries_signature_2rHiP -#> 3 date year.iso timeseries_signature_2rHiP -#> 4 date half timeseries_signature_2rHiP -#> 5 date quarter timeseries_signature_2rHiP -#> 6 date month timeseries_signature_2rHiP -#> 7 date month.xts timeseries_signature_2rHiP -#> 8 date month.lbl timeseries_signature_2rHiP -#> 9 date day timeseries_signature_2rHiP -#> 10 date hour timeseries_signature_2rHiP +#> 1 date index.num timeseries_signature_MY12H +#> 2 date year timeseries_signature_MY12H +#> 3 date year.iso timeseries_signature_MY12H +#> 4 date half timeseries_signature_MY12H +#> 5 date quarter timeseries_signature_MY12H +#> 6 date month timeseries_signature_MY12H +#> 7 date month.xts timeseries_signature_MY12H +#> 8 date month.lbl timeseries_signature_MY12H +#> 9 date day timeseries_signature_MY12H +#> 10 date hour timeseries_signature_MY12H #> # ℹ 17 more rows diff --git a/reference/step_ts_clean.html b/reference/step_ts_clean.html index 7c962091..d892c3c1 100644 --- a/reference/step_ts_clean.html +++ b/reference/step_ts_clean.html @@ -300,10 +300,10 @@

Examples#> # A tibble: 4 × 3 #> terms lambda id #> <chr> <dbl> <chr> -#> 1 FB 0.912 ts_clean_HgyG5 -#> 2 AMZN 0.557 ts_clean_HgyG5 -#> 3 NFLX 0.532 ts_clean_HgyG5 -#> 4 GOOG -1.00 ts_clean_HgyG5 +#> 1 FB 0.912 ts_clean_uVtKI +#> 2 AMZN 0.557 ts_clean_uVtKI +#> 3 NFLX 0.532 ts_clean_uVtKI +#> 4 GOOG -1.00 ts_clean_uVtKI diff --git a/reference/step_ts_impute.html b/reference/step_ts_impute.html index b97020b5..b92a3f32 100644 --- a/reference/step_ts_impute.html +++ b/reference/step_ts_impute.html @@ -298,10 +298,10 @@

Examples#> # A tibble: 4 × 3 #> terms lambda id #> <chr> <dbl> <chr> -#> 1 FB 0.912 ts_impute_gTaDW -#> 2 AMZN 0.557 ts_impute_gTaDW -#> 3 NFLX 0.532 ts_impute_gTaDW -#> 4 GOOG -1.00 ts_impute_gTaDW +#> 1 FB 0.912 ts_impute_uYJSB +#> 2 AMZN 0.557 ts_impute_uYJSB +#> 3 NFLX 0.532 ts_impute_uYJSB +#> 4 GOOG -1.00 ts_impute_uYJSB diff --git a/reference/step_ts_pad.html b/reference/step_ts_pad.html index 26e5cb4a..e9ad44cf 100644 --- a/reference/step_ts_pad.html +++ b/reference/step_ts_pad.html @@ -305,12 +305,12 @@

Examples#> # A tibble: 1 × 6 #> number operation type trained skip id #> <int> <chr> <chr> <lgl> <lgl> <chr> -#> 1 1 step ts_pad TRUE FALSE ts_padding_AppOW +#> 1 1 step ts_pad TRUE FALSE ts_padding_IGMKC tidy(prep(rec_obj), number = 1) #> # A tibble: 1 × 4 #> terms by pad_value id #> <chr> <chr> <lgl> <chr> -#> 1 date day NA ts_padding_AppOW +#> 1 date day NA ts_padding_IGMKC diff --git a/reference/tk_index.html b/reference/tk_index.html index d3ca9a06..31a0551e 100644 --- a/reference/tk_index.html +++ b/reference/tk_index.html @@ -209,21 +209,21 @@

Examples#> # A tibble: 5 × 2 #> x y #> <dbl> <dbl> -#> 1 -5.21 5 -#> 2 -18.1 4 -#> 3 -2.62 3 -#> 4 -3.46 2 -#> 5 -5.77 1 +#> 1 3.62 5 +#> 2 -18.9 4 +#> 3 8.34 3 +#> 4 22.4 2 +#> 5 3.27 1 tk_tbl(data_ts, timetk_idx = TRUE) # Returns time-based tbl #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 #> index x y #> <date> <dbl> <dbl> -#> 1 2000-01-01 -5.21 5 -#> 2 2000-01-02 -18.1 4 -#> 3 2000-01-03 -2.62 3 -#> 4 2000-01-04 -3.46 2 -#> 5 2000-01-05 -5.77 1 +#> 1 2000-01-01 3.62 5 +#> 2 2000-01-02 -18.9 4 +#> 3 2000-01-03 8.34 3 +#> 4 2000-01-04 22.4 2 +#> 5 2000-01-05 3.27 1 diff --git a/reference/tk_ts.html b/reference/tk_ts.html index e2775a5b..f40ca0ad 100644 --- a/reference/tk_ts.html +++ b/reference/tk_ts.html @@ -233,12 +233,12 @@

Examples#> Start = 2016 #> End = 2020 #> Frequency = 1 -#> x y z -#> 2016 1 1 3.860834 -#> 2017 1 3 8.072653 -#> 2018 1 6 12.635456 -#> 2019 1 10 17.549245 -#> 2020 1 15 22.814018 +#> x y z +#> 2016 1 1 -25.32330 +#> 2017 1 3 -52.94872 +#> 2018 1 6 -82.87625 +#> 2019 1 10 -115.10591 +#> 2020 1 15 -149.63768 # tk_ts: Only numeric columns get coerced; Result retains index in numeric format data_ts <- tk_ts(data_tbl, start = 2016) @@ -248,12 +248,12 @@

Examples#> Start = 2016 #> End = 2020 #> Frequency = 1 -#> y z -#> 2016 1 3.860834 -#> 2017 3 8.072653 -#> 2018 6 12.635456 -#> 2019 10 17.549245 -#> 2020 15 22.814018 +#> y z +#> 2016 1 -25.32330 +#> 2017 3 -52.94872 +#> 2018 6 -82.87625 +#> 2019 10 -115.10591 +#> 2020 15 -149.63768 #> attr(,"index") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,"index")attr(,"tzone") @@ -272,13 +272,13 @@

Examplesdata_ts %>% tk_tbl(timetk_idx = TRUE) #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 -#> index y z -#> <date> <dbl> <dbl> -#> 1 2016-01-01 1 3.86 -#> 2 2016-01-02 3 8.07 -#> 3 2016-01-03 6 12.6 -#> 4 2016-01-04 10 17.5 -#> 5 2016-01-05 15 22.8 +#> index y z +#> <date> <dbl> <dbl> +#> 1 2016-01-01 1 -25.3 +#> 2 2016-01-02 3 -52.9 +#> 3 2016-01-03 6 -82.9 +#> 4 2016-01-04 10 -115. +#> 5 2016-01-05 15 -150. ### Using select diff --git a/reference/tk_xts.html b/reference/tk_xts.html index 4b6b4fe3..8190f226 100644 --- a/reference/tk_xts.html +++ b/reference/tk_xts.html @@ -198,22 +198,22 @@

Examples# xts: Character columns cause coercion issues; order.by must be passed a vector of dates xts::xts(data_tbl[,-1], order.by = data_tbl$date) #> x y z -#> 2016-01-01 chr values 1 8.409128 -#> 2016-01-02 chr values 3 17.582722 -#> 2016-01-03 chr values 6 27.520782 -#> 2016-01-04 chr values 10 38.223308 -#> 2016-01-05 chr values 15 49.690300 +#> 2016-01-01 chr values 1 8.052092 +#> 2016-01-02 chr values 3 16.836192 +#> 2016-01-03 chr values 6 26.352300 +#> 2016-01-04 chr values 10 36.600416 +#> 2016-01-05 chr values 15 47.580541 # tk_xts: Non-numeric columns automatically dropped; No need to specify date column tk_xts(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z -#> 2016-01-01 1 8.409128 -#> 2016-01-02 3 17.582722 -#> 2016-01-03 6 27.520782 -#> 2016-01-04 10 38.223308 -#> 2016-01-05 15 49.690300 +#> 2016-01-01 1 8.052092 +#> 2016-01-02 3 16.836192 +#> 2016-01-03 6 26.352300 +#> 2016-01-04 10 36.600416 +#> 2016-01-05 15 47.580541 # ts can be coerced back to xts data_tbl %>% @@ -222,11 +222,11 @@

Examples#> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z -#> 2016-01-01 1 8.409128 -#> 2016-01-02 3 17.582722 -#> 2016-01-03 6 27.520782 -#> 2016-01-04 10 38.223308 -#> 2016-01-05 15 49.690300 +#> 2016-01-01 1 8.052092 +#> 2016-01-02 3 16.836192 +#> 2016-01-03 6 26.352300 +#> 2016-01-04 10 36.600416 +#> 2016-01-05 15 47.580541 ### Using select and date_var tk_xts(data_tbl, select = y, date_var = date) diff --git a/reference/tk_zoo.html b/reference/tk_zoo.html index 1b3459b1..c146fe97 100644 --- a/reference/tk_zoo.html +++ b/reference/tk_zoo.html @@ -200,22 +200,22 @@

Examples# zoo: Characters will cause error; order.by must be passed a vector of dates zoo::zoo(data_tbl[,-c(1,2)], order.by = data_tbl$date) #> y z -#> 2016-01-01 1 5.986002 -#> 2016-01-02 3 12.516187 -#> 2016-01-03 6 19.590553 -#> 2016-01-04 10 27.209102 -#> 2016-01-05 15 35.371833 +#> 2016-01-01 1 17.95465 +#> 2016-01-02 3 37.54154 +#> 2016-01-03 6 58.76067 +#> 2016-01-04 10 81.61205 +#> 2016-01-05 15 106.09566 # tk_zoo: Character columns dropped with a warning; No need to specify dates (auto detected) tk_zoo(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z -#> 2016-01-01 1 5.986002 -#> 2016-01-02 3 12.516187 -#> 2016-01-03 6 19.590553 -#> 2016-01-04 10 27.209102 -#> 2016-01-05 15 35.371833 +#> 2016-01-01 1 17.95465 +#> 2016-01-02 3 37.54154 +#> 2016-01-03 6 58.76067 +#> 2016-01-04 10 81.61205 +#> 2016-01-05 15 106.09566 # ts can be coerced back to zoo data_tbl %>% @@ -224,11 +224,11 @@

Examples#> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z -#> 2016-01-01 1 5.986002 -#> 2016-01-02 3 12.516187 -#> 2016-01-03 6 19.590553 -#> 2016-01-04 10 27.209102 -#> 2016-01-05 15 35.371833 +#> 2016-01-01 1 17.95465 +#> 2016-01-02 3 37.54154 +#> 2016-01-03 6 58.76067 +#> 2016-01-04 10 81.61205 +#> 2016-01-05 15 106.09566 ### Using select and date_var diff --git a/reference/tk_zooreg.html b/reference/tk_zooreg.html index a258ff5e..942c42da 100644 --- a/reference/tk_zooreg.html +++ b/reference/tk_zooreg.html @@ -243,12 +243,12 @@

Examples# zoo::zooreg: Values coerced to character; Result does not retain index data_zooreg <- zoo::zooreg(data_tbl[,-1], start = 2016, freq = 365) data_zooreg # Numeric values coerced to character -#> x y z -#> 2016(1) chr values 1 -2.628004 -#> 2016(2) chr values 3 -5.494917 -#> 2016(3) chr values 6 -8.600739 -#> 2016(4) chr values 10 -11.945471 -#> 2016(5) chr values 15 -15.529113 +#> x y z +#> 2016(1) chr values 1 3.614062 +#> 2016(2) chr values 3 7.556675 +#> 2016(3) chr values 6 11.827839 +#> 2016(4) chr values 10 16.427554 +#> 2016(5) chr values 15 21.355821 rownames(data_zooreg) # NULL, no dates retained #> NULL @@ -256,12 +256,12 @@

Examplesdata_tk_zooreg <- tk_zooreg(data_tbl, start = 2016, freq = 365) #> Warning: Non-numeric columns being dropped: date, x data_tk_zooreg # No inadvertent coercion to character class -#> y z -#> 2016(1) 1 -2.628004 -#> 2016(2) 3 -5.494917 -#> 2016(3) 6 -8.600739 -#> 2016(4) 10 -11.945471 -#> 2016(5) 15 -15.529113 +#> y z +#> 2016(1) 1 3.614062 +#> 2016(2) 3 7.556675 +#> 2016(3) 6 11.827839 +#> 2016(4) 10 16.427554 +#> 2016(5) 15 21.355821 # timetk index tk_index(data_tk_zooreg, timetk_idx = FALSE) # Regularized index returned diff --git a/search.json b/search.json index d870d695..5e8eb8f6 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Time Series Class Conversion","text":"time series landscape R vast, deep, complex causing many inconsistencies data attributes formats ultimately making difficult coerce different data structures. zoo xts packages solved number issues dealing various classes (ts, zoo, xts, irts, msts, list goes …). However, packages deal classes data frame, issues conversion tbl time series object classes still present. timetk package provides tools solve issues conversion, maximizing attribute extensibility (required data attributes retained conversion primary time series classes). following tools available coerce retrieve key information: Conversion functions: tk_tbl, tk_ts, tk_xts, tk_zoo, tk_zooreg. functions coerce time-based tibbles tbl main time-series data types xts, zoo, zooreg, ts, maintaining time-based index. Index function: tk_index returns index. argument, timetk_idx = TRUE, time-based index (non-regularized index) forecast objects, models, ts objects returned present. Refer tk_ts() learn non-regularized index persistence conversion process. vignette includes brief case study conversion issues detailed explanation timetk function conversion time-based tbl objects several primary time series classes (xts, zoo, zooreg ts).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Time Series Class Conversion","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Class Conversion","text":"’ll use “Q10” dataset - first ID sample quarterly datasets (see m4_quarterly) M4 Competition. return structure tibble, conducive many popular time series analysis packages including quantmod, TTR, forecast many others.","code":"q10_quarterly <- m4_quarterly %>% filter(id == \"Q10\") q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"case-study-conversion-issues-with-ts","dir":"Articles","previous_headings":"","what":"Case Study: Conversion issues with ts()","title":"Time Series Class Conversion","text":"ts object class roots stats package many popular packages use time series data structure including popular forecast package. said, ts data structure difficult coerce back forth default contain time-based index. Rather uses regularized index computed using start frequency arguments. Conversion ts done using ts() function stats library, results various problems.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"problems","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Problems","title":"Time Series Class Conversion","text":"First, numeric columns get coerced. user forgets add [,\"pct\"] drop “date” column, ts() returns dates numeric format user wants. correct method call specific column desired. However, presents new issue. date index lost, different “regularized” index built using start frequency attributes. can see structure (using str() function) regularized time series present, date index retained. can get index using index() function zoo package. index retained regular sequence numeric values. many cases, regularized values coerced back original time-base date date time data contains significantly information (.e. year-month-day, hour-minute-second, timezone attributes) data may regularized interval (frequency).","code":"# date column gets coerced to numeric ts(q10_quarterly, start = c(2000, 1), freq = 4) %>% head() ## id date value ## [1,] 1 10957 2329.0 ## [2,] 1 11048 2349.9 ## [3,] 1 11139 2332.9 ## [4,] 1 11231 2381.5 ## [5,] 1 11323 2382.6 ## [6,] 1 11413 2405.0 q10_quarterly_ts <- ts(q10_quarterly$value, start = c(2000, 1), freq = 4) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # No date index attribute str(q10_quarterly_ts) ## Time-Series [1:59] from 2000 to 2014: 2329 2350 2333 2382 2383 ... # Regularized numeric sequence zoo::index(q10_quarterly_ts) ## [1] 2000.00 2000.25 2000.50 2000.75 2001.00 2001.25 2001.50 2001.75 2002.00 ## [10] 2002.25 2002.50 2002.75 2003.00 2003.25 2003.50 2003.75 2004.00 2004.25 ## [19] 2004.50 2004.75 2005.00 2005.25 2005.50 2005.75 2006.00 2006.25 2006.50 ## [28] 2006.75 2007.00 2007.25 2007.50 2007.75 2008.00 2008.25 2008.50 2008.75 ## [37] 2009.00 2009.25 2009.50 2009.75 2010.00 2010.25 2010.50 2010.75 2011.00 ## [46] 2011.25 2011.50 2011.75 2012.00 2012.25 2012.50 2012.75 2013.00 2013.25 ## [55] 2013.50 2013.75 2014.00 2014.25 2014.50"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"solution","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Solution","title":"Time Series Class Conversion","text":"timetk package contains new function, tk_ts(), enables maintaining original date index attribute. repeat tbl ts conversion process using new function, tk_ts(), can see differences. First, numeric columns get coerced, prevents unintended consequences due R conversion rules (e.g. dates getting unintentionally converted characters causing homogeneous data structure converting numeric values character). column dropped, user gets warning. Second, data returned additional attributes. important numeric attribute, “index”, contains original date information number. ts() function preserve index tk_ts() preserve index numeric form along time zone class.","code":"# date automatically dropped and user is warned q10_quarterly_ts_timetk <- tk_ts(q10_quarterly, start = 2000, freq = 4) ## Warning: Non-numeric columns being dropped: id, date q10_quarterly_ts_timetk ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # More attributes including time index, time class, time zone str(q10_quarterly_ts_timetk) ## Time-Series [1:59, 1] from 2000 to 2014: 2329 2350 2333 2382 2383 ... ## - attr(*, \"dimnames\")=List of 2 ## ..$ : NULL ## ..$ : chr \"value\" ## - attr(*, \"index\")= num [1:59] 9.47e+08 9.55e+08 9.62e+08 9.70e+08 9.78e+08 ... ## ..- attr(*, \"tzone\")= chr \"UTC\" ## ..- attr(*, \"tclass\")= chr \"Date\""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"advantages-of-conversion-with-tk_tbl","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Advantages of conversion with tk_tbl()","title":"Time Series Class Conversion","text":"Since used tk_ts() conversion, can extract original index date format using tk_index(timetk_idx = TRUE) (default timetk_idx = FALSE returns default regularized index). Next, tk_tbl() function argument timetk_idx also can used select index return. First, show conversion using default index. Notice index returned “regularized” meaning actually numeric index rather time-based index. can now get original date index using tk_tbl() argument timetk_idx = TRUE. can see case (cases) can get data frame began .","code":"# Can now retrieve the original date index timetk_index <- q10_quarterly_ts_timetk %>% tk_index(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent head(timetk_index) ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" class(timetk_index) ## [1] \"Date\" # Conversion back to tibble using the default index (regularized) q10_quarterly_ts_timetk %>% tk_tbl(index_rename = \"date\", timetk_idx = FALSE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # Conversion back to tibble now using the timetk index (date / date-time) q10_quarterly_timetk <- q10_quarterly_ts_timetk %>% tk_tbl(timetk_idx = TRUE) %>% rename(date = index) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent q10_quarterly_timetk ## # A tibble: 59 × 2 ## date value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows # Comparing the coerced tibble with the original tibble identical(q10_quarterly_timetk, q10_quarterly %>% select(-id)) ## [1] TRUE"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"conversion-methods","dir":"Articles","previous_headings":"","what":"Conversion Methods","title":"Time Series Class Conversion","text":"Using q10_quarterly, ’ll go various conversion methods using tk_tbl, tk_xts, tk_zoo, tk_zooreg, tk_ts.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-tbl","dir":"Articles","previous_headings":"Conversion Methods","what":"From tbl","title":"Time Series Class Conversion","text":"starting point q10_quarterly. coerce xts, zoo, zooreg ts classes.","code":"# Start: q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-xts","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to xts","title":"Time Series Class Conversion","text":"Use tk_xts(). default “date” used date index “date” column dropped output. numeric columns coerced avoid unintentional conversion issues. Use select argument specify columns drop. Use date_var argument specify column use date index. Notice message warning longer present. Also, alternative, can set silent = TRUE bypass warnings since default dropping “date” column desired. Notice warnings messages.","code":"# End q10_quarterly_xts <- tk_xts(q10_quarterly) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `select` and `date_var` args tk_xts(q10_quarterly, select = -(id:date), date_var = date) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `silent` to silence warnings tk_xts(q10_quarterly, silent = TRUE) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-zoo","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to zoo","title":"Time Series Class Conversion","text":"Use tk_zoo(). coercing xts, non-numeric “date” column automatically dropped index automatically selected date column.","code":"# End q10_quarterly_zoo <- tk_zoo(q10_quarterly, silent = TRUE) head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-zooreg","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to zooreg","title":"Time Series Class Conversion","text":"Use tk_zooreg(). coercing xts, non-numeric “date” column automatically dropped. regularized index built function arguments start freq. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_zooreg <- tk_zooreg(q10_quarterly, start = 2000, freq = 4, silent = TRUE) head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # Retrieve original time-based index tk_index(q10_quarterly_zooreg, timetk_idx = TRUE) %>% str() ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-ts","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to ts","title":"Time Series Class Conversion","text":"Use tk_ts(). non-numeric “date” column automatically dropped. regularized index built function arguments. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_ts <- tk_ts(q10_quarterly, start = 2000, freq = 4, silent = TRUE) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # Retrieve original time-based index tk_index(q10_quarterly_ts, timetk_idx = TRUE) %>% str() ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-tbl","dir":"Articles","previous_headings":"Conversion Methods","what":"To tbl","title":"Time Series Class Conversion","text":"Going back tibble just easy using tk_tbl().","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-xts","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From xts","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_xts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-zoo","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From zoo","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_zoo) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-zooreg","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From zooreg","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # End - with default regularized index tk_tbl(q10_quarterly_zooreg) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index that is the same as original time-based index tk_tbl(q10_quarterly_zooreg, timetk_idx = TRUE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-ts","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From ts","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # End - with default regularized index tk_tbl(q10_quarterly_ts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"testing-if-an-object-has-a-timetk-index","dir":"Articles","previous_headings":"","what":"Testing if an object has a timetk index","title":"Time Series Class Conversion","text":"function has_timetk_idx() can used test whether toggling timetk_idx argument tk_index() tk_tbl() functions effect output. several examples using ten year treasury data used case study:","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"tk_ts","dir":"Articles","previous_headings":"Testing if an object has a timetk index","what":"tk_ts()","title":"Time Series Class Conversion","text":"tk_ts() function returns object “timetk index” attribute. toggle timetk_idx = TRUE retrieving index tk_index(), get index dates rather regularized time series. toggle timetk_idx = TRUE conversion tbl using tk_tbl(), get index dates rather regularized index returned tbl.","code":"# Data coerced with tk_ts() has timetk index has_timetk_idx(q10_quarterly_ts) ## [1] TRUE tk_index(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"testing-other-data-types","dir":"Articles","previous_headings":"Testing if an object has a timetk index","what":"Testing other data types","title":"Time Series Class Conversion","text":"timetk_idx argument effect objects use regularized time series. Therefore, has_timetk_idx() returns FALSE object types (e.g. tbl, xts, zoo) since toggling argument effect classes. Toggling timetk_idx argument effect output. Output timetk_idx = TRUE timetk_idx = FALSE.","code":"has_timetk_idx(q10_quarterly_xts) ## [1] FALSE tk_index(q10_quarterly_xts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"working-with-zooyearmon-and-zooyearqtr-index","dir":"Articles","previous_headings":"","what":"Working with zoo::yearmon and zoo::yearqtr index","title":"Time Series Class Conversion","text":"zoo package yearmon yearqtr classes working regularized monthly quarterly data, respectively. “timetk index” tracks format conversion. ’s example yearqtr. can coerce xts yearqtr class intact. can coerce ts , although “timetk index” hidden, yearqtr class intact. Coercing ts tbl using timetk_idx = TRUE shows original index maintained conversion steps.","code":"yearqtr_tbl <- q10_quarterly %>% mutate(date = zoo::as.yearqtr(date)) yearqtr_tbl ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000 Q1 2329 ## 2 Q10 2000 Q2 2350. ## 3 Q10 2000 Q3 2333. ## 4 Q10 2000 Q4 2382. ## 5 Q10 2001 Q1 2383. ## 6 Q10 2001 Q2 2405 ## 7 Q10 2001 Q3 2411 ## 8 Q10 2001 Q4 2428. ## 9 Q10 2002 Q1 2392. ## 10 Q10 2002 Q2 2418. ## # ℹ 49 more rows yearqtr_xts <- tk_xts(yearqtr_tbl) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. yearqtr_xts %>% head() ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 yearqtr_ts <- tk_ts(yearqtr_xts, start = 1997, freq = 4) yearqtr_ts %>% head() ## value ## [1,] 2329.0 ## [2,] 2349.9 ## [3,] 2332.9 ## [4,] 2381.5 ## [5,] 2382.6 ## [6,] 2405.0 yearqtr_ts %>% tk_tbl(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Class Conversion","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Calendar Features","text":"time series index consists collection time-based values define observation occurred, important part time series object. index gives user lot information simple timestamp. Consider datetime “2016-01-01 00:00:00”. timestamp, can decompose date time information get signature, consists year, quarter, month, day, day year, day month, hour, minute, second occurrence single observation. , difference two observations frequency can obtain even information periodicity data whether observations regular interval. information critical provides basis performance time finance, decay rates biology, growth rates economics, . vignette user exposed : Time Series Index Time Series Signature Time Series Summary","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Calendar Features","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Calendar Features","text":"’ll use Facebook stock prices FANG data set. historical stock prices (open, high, low, close, volume, adjusted) “FB” stock 2013 2016. simplify tutorial, select “date” “volume” columns. FB_vol_date data frame, can see “date” column observations daily beginning second day 2013.","code":"data(\"FANG\") FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows FB_vol_date <- FB_tbl %>% select(date, volume) FB_vol_date ## # A tibble: 1,008 × 2 ## date volume ## ## 1 2013-01-02 69846400 ## 2 2013-01-03 63140600 ## 3 2013-01-04 72715400 ## 4 2013-01-07 83781800 ## 5 2013-01-08 45871300 ## 6 2013-01-09 104787700 ## 7 2013-01-10 95316400 ## 8 2013-01-11 89598000 ## 9 2013-01-14 98892800 ## 10 2013-01-15 173242600 ## # ℹ 998 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-index","dir":"Articles","previous_headings":"","what":"Time Series Index","title":"Calendar Features","text":"can analyze index, need extract object. function tk_index() extracts index time series object including data frame (tbl), xts, zoo, etc. index always returned native date, datetime, yearmon, yearqtr format. Note index must one time-based classes extraction work: datetimes: Must inherit POSIXt dates: Must inherit Date yearmon: Must inherit yearmon zoo package yearqtr: Must inherit yearqtr zoo package Extract index using tk_index(). structure shown see output format, vector dates.","code":"# idx_date idx_date <- tk_index(FB_vol_date) str(idx_date) ## Date[1:1008], format: \"2013-01-02\" \"2013-01-03\" \"2013-01-04\" \"2013-01-07\" \"2013-01-08\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-signature","dir":"Articles","previous_headings":"","what":"Time Series Signature","title":"Calendar Features","text":"index can decomposed signature. time series signature unique set properties time series values describe time series.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"get-functions---turning-an-index-into-information","dir":"Articles","previous_headings":"Time Series Signature","what":"Get Functions - Turning an Index into Information","title":"Calendar Features","text":"function tk_get_timeseries_signature() can used convert index tibble containing following values (columns): index: index value decomposed index.num: numeric value index seconds. base “1970-01-01 00:00:00” (Execute \"1970-01-01 00:00:00\" %>% ymd_hms() %>% .numeric() see value returned zero). Every time series value date can converted numeric value seconds. diff: difference seconds previous numeric index value. year: year component index. year.iso: ISO year number year (Monday start). half: half component index. quarter: quarter component index. month: month component index base 1. month.xts: month component index base 0, xts implements. month.lbl: month label ordered factor begining January ending December. day: day component index. hour: hour component index. minute: minute component index. second: second component index. hour12: hour component 12 hour scale. .pm: Morning () = 1, Afternoon (PM) = 2. wday: day week base 1. Sunday = 1 Saturday = 7. wday.xts: day week base 0, xts implements. Sunday = 0 Saturday = 6. wday.lbl: day week label ordered factor begining Sunday ending Saturday. mday: day month. qday: day quarter. yday: day year. mweek: week month. week: week number year (Sunday start). week.iso: ISO week number year (Monday start). week2: modulus bi-weekly frequency. week3: modulus tri-weekly frequency. week4: modulus quad-weekly frequency. mday7: integer division day month seven, returns first, second, third, … instance day appeared month. Values begin 1. example, first Saturday month mday7 = 1. second mday7 = 2.","code":"# idx_date signature tk_get_timeseries_signature(idx_date) ## # A tibble: 1,008 × 29 ## index index.num diff year year.iso half quarter month month.xts ## ## 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 ## 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 ## 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 ## 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 ## 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 ## 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 ## 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 ## 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 ## 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 ## 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 ## # ℹ 998 more rows ## # ℹ 20 more variables: month.lbl , day , hour , minute , ## # second , hour12 , am.pm , wday , wday.xts , ## # wday.lbl , mday , qday , yday , mweek , ## # week , week.iso , week2 , week3 , week4 , ## # mday7 "},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"augment-functions-adding-many-features-to-a-data-frame","dir":"Articles","previous_headings":"Time Series Signature","what":"Augment Functions (Adding Many Features to a Data Frame)","title":"Calendar Features","text":"’s usually important keep index signature values (e.g. volume example). can use expedited approach tk_augment_timeseries_signature(), adds signature end time series object. Modeling now much easier. example, can use linear regression model using lm() function month year predictor volume.","code":"# Augmenting a data frame FB_vol_date_signature <- FB_vol_date %>% tk_augment_timeseries_signature(.date_var = date) FB_vol_date_signature ## # A tibble: 1,008 × 30 ## date volume index.num diff year year.iso half quarter month ## ## 1 2013-01-02 69846400 1357084800 NA 2013 2013 1 1 1 ## 2 2013-01-03 63140600 1357171200 86400 2013 2013 1 1 1 ## 3 2013-01-04 72715400 1357257600 86400 2013 2013 1 1 1 ## 4 2013-01-07 83781800 1357516800 259200 2013 2013 1 1 1 ## 5 2013-01-08 45871300 1357603200 86400 2013 2013 1 1 1 ## 6 2013-01-09 104787700 1357689600 86400 2013 2013 1 1 1 ## 7 2013-01-10 95316400 1357776000 86400 2013 2013 1 1 1 ## 8 2013-01-11 89598000 1357862400 86400 2013 2013 1 1 1 ## 9 2013-01-14 98892800 1358121600 259200 2013 2013 1 1 1 ## 10 2013-01-15 173242600 1358208000 86400 2013 2013 1 1 1 ## # ℹ 998 more rows ## # ℹ 21 more variables: month.xts , month.lbl , day , hour , ## # minute , second , hour12 , am.pm , wday , ## # wday.xts , wday.lbl , mday , qday , yday , ## # mweek , week , week.iso , week2 , week3 , ## # week4 , mday7 # Example Benefit 2: Modeling is easier fit <- lm(volume ~ year + month.lbl, data = FB_vol_date_signature) summary(fit) ## ## Call: ## lm(formula = volume ~ year + month.lbl, data = FB_vol_date_signature) ## ## Residuals: ## Min 1Q Median 3Q Max ## -51042223 -13528407 -4588594 8296073 304011277 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 2.494e+10 1.414e+09 17.633 < 2e-16 *** ## year -1.236e+07 7.021e+05 -17.604 < 2e-16 *** ## month.lbl.L -9.589e+06 2.740e+06 -3.499 0.000488 *** ## month.lbl.Q 7.348e+06 2.725e+06 2.697 0.007122 ** ## month.lbl.C -9.773e+06 2.711e+06 -3.605 0.000328 *** ## month.lbl^4 -2.885e+06 2.720e+06 -1.060 0.289176 ## month.lbl^5 -2.994e+06 2.749e+06 -1.089 0.276428 ## month.lbl^6 3.169e+06 2.753e+06 1.151 0.249851 ## month.lbl^7 6.000e+05 2.721e+06 0.221 0.825514 ## month.lbl^8 8.281e+03 2.702e+06 0.003 0.997555 ## month.lbl^9 9.504e+06 2.704e+06 3.515 0.000459 *** ## month.lbl^10 -5.911e+06 2.701e+06 -2.188 0.028888 * ## month.lbl^11 -4.738e+06 2.696e+06 -1.757 0.079181 . ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 24910000 on 995 degrees of freedom ## Multiple R-squared: 0.2714, Adjusted R-squared: 0.2626 ## F-statistic: 30.89 on 12 and 995 DF, p-value: < 2.2e-16"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-summary","dir":"Articles","previous_headings":"","what":"Time Series Summary","title":"Calendar Features","text":"next index analysis tool summary metrics, can retrieved using tk_get_timeseries_summary() function. summary reports following attributes single-row tibble. General Summary: first six columns general summary information. n.obs: total number observations start: start appropriate time class end: end appropriate time class units: label describes unit index value independent frequency (.e. date class always “days” whereas datetime class always “seconds”). Values can days, hours, mins, secs. scale: label describes median difference (frequency) observations. Values can quarter, month, day, hour, minute, second. tzone: timezone index. Differences Summary: next group values differences summary (.e. summary frequency). values seconds: diff.minimum: minimum difference index values. diff.q1: first quartile index differences. diff.median: median difference index values (.e. common frequency). diff.mean: average difference index values. diff.q3: third quartile index differences. diff.maximum: maximum difference index values. differences provide information regularity frequency. Generally speaking difference values equal, index regular. However, scales beyond “day” never theoretically regular since differences seconds equivalent. However, conceptually monthly, quarterly yearly data can thought regular index contains consecutive months, quarters, years, respectively. Therefore, difference attributes meaningful daily lower time scales difference summary always indicates level regularity. second group (differences summary), immediately recognize mean different median therefore index irregular (meaning certain days missing). can see maximum difference 345,600 seconds, indicating maximum difference 4 days (345,600 seconds / 86400 seconds/day).","code":"# idx_date: First six columns, general summary tk_get_timeseries_summary(idx_date)[,1:6] ## # A tibble: 1 × 6 ## n.obs start end units scale tzone ## ## 1 1008 2013-01-02 2016-12-30 days day UTC # idx_date: Last six columns, difference summary tk_get_timeseries_summary(idx_date)[,7:12] ## # A tibble: 1 × 6 ## diff.minimum diff.q1 diff.median diff.mean diff.q3 diff.maximum ## ## 1 86400 86400 86400 125096. 86400 345600"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Calendar Features","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Intelligent Date & Time Sequences","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"making-a-time-series-sequence","dir":"Articles","previous_headings":"","what":"Making a Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"tk_make_timeseries() improves seq.Date() seq.POSIXt() functions simplifying 1 function. Intelligently handles character dates logical assumptions based user inputs. Day Can use = \"day\" leave blank. include_endpoints = FALSE removes last value series 7 observations. 2 Seconds Can use = \"2 sec\" adjust interval width. include_endpoints = TRUE keeps last value series ends 6th second. Length = 1 year 6 months length_out = \"1 year 6 months\" - Can include complex expressions like “1 year 4 months 6 days”. Go Reverse go reverse, just use end_date want series end.","code":"# Selects by day automatically tk_make_timeseries(\"2011\", length_out = \"7 days\", include_endpoints = FALSE) ## [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-05\" ## [6] \"2011-01-06\" \"2011-01-07\" # Guesses by second tk_make_timeseries(\"2016\", by = \"2 sec\", length_out = \"6 seconds\") ## [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:02 UTC\" ## [3] \"2016-01-01 00:00:04 UTC\" \"2016-01-01 00:00:06 UTC\" tk_make_timeseries(\"2012-07\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) ## [1] \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" \"2012-11-01\" ## [6] \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" \"2013-04-01\" ## [11] \"2013-05-01\" \"2013-06-01\" \"2013-07-01\" \"2013-08-01\" \"2013-09-01\" ## [16] \"2013-10-01\" \"2013-11-01\" \"2013-12-01\" tk_make_timeseries(end_date = \"2012-07-01\", by = \"1 month\", length_out = \"1 year 6 months\") ## [1] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" ## [6] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" ## [11] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" ## [16] \"2012-04-01\" \"2012-05-01\" \"2012-06-01\" \"2012-07-01\""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"future-time-series-sequence","dir":"Articles","previous_headings":"","what":"Future Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"common operation make future time series sequence mimics existing. tk_make_future_timeseries() . Suppose existing time index. Make Future Time Series Existing can create future time sequence existing sequence using tk_make_future_timeseries().","code":"idx <- tk_make_timeseries(\"2012\", by = \"3 months\", length_out = \"2 years\", include_endpoints = FALSE) idx ## [1] \"2012-01-01\" \"2012-04-01\" \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" ## [6] \"2013-04-01\" \"2013-07-01\" \"2013-10-01\" tk_make_future_timeseries(idx, length_out = \"2 years\") ## [1] \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" \"2014-10-01\" \"2015-01-01\" ## [6] \"2015-04-01\" \"2015-07-01\" \"2015-10-01\""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"weekends-holidays","dir":"Articles","previous_headings":"","what":"Weekends & Holidays","title":"Intelligent Date & Time Sequences","text":"Make weekday sequence removing holidays Result 252 days. holidays removed? NYSE Trading holidays days businesses observe Make future index removing holidays","code":"idx <- tk_make_weekday_sequence(\"2012\", remove_weekends = TRUE, remove_holidays = TRUE, calendar = \"NYSE\") tk_get_timeseries_summary(idx) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 250 2012-01-03 2012-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum tk_make_holiday_sequence(\"2012\", calendar = \"NYSE\") ## [1] \"2012-01-02\" \"2012-01-16\" \"2012-02-20\" \"2012-04-06\" \"2012-05-28\" ## [6] \"2012-07-04\" \"2012-09-03\" \"2012-10-29\" \"2012-10-30\" \"2012-11-22\" ## [11] \"2012-12-25\" holidays <- tk_make_holiday_sequence( start_date = \"2013-01-01\", end_date = \"2013-12-31\", calendar = \"NYSE\") idx_future <- idx %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) tk_get_timeseries_summary(idx_future) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 252 2013-01-02 2013-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Intelligent Date & Time Sequences","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Time Series Machine Learning","text":"time series signature collection useful features describe time series index time-based data set. contains wealth features can used forecast time series contain patterns. vignette, user learn methods implement machine learning predict future outcomes time-based data set. vignette example uses well known time series dataset, Bike Sharing Dataset, UCI Machine Learning Repository. vignette follows example ’ll use timetk build basic Machine Learning model predict future values using time series signature. objective build model predict next six months Bike Sharing daily counts.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Time Series Machine Learning","text":"get started, load following packages.","code":"library(tidymodels) library(modeltime) library(dplyr) library(timetk) # Used to convert plots from interactive to static interactive = FALSE"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Machine Learning","text":"’ll using Bike Sharing Dataset UCI Machine Learning Repository. Source: Fanaee-T, Hadi, Gama, Joao, ‘Event labeling combining ensemble detectors background knowledge’, Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg Next, visualize dataset plot_time_series() function. Toggle .interactive = TRUE get plotly interactive plot. FALSE returns ggplot2 static plot.","code":"# Read data bike_transactions_tbl <- bike_sharing_daily %>% select(dteday, cnt) %>% set_names(c(\"date\", \"value\")) bike_transactions_tbl ## # A tibble: 731 × 2 ## date value ## ## 1 2011-01-01 985 ## 2 2011-01-02 801 ## 3 2011-01-03 1349 ## 4 2011-01-04 1562 ## 5 2011-01-05 1600 ## 6 2011-01-06 1606 ## 7 2011-01-07 1510 ## 8 2011-01-08 959 ## 9 2011-01-09 822 ## 10 2011-01-10 1321 ## # ℹ 721 more rows bike_transactions_tbl %>% plot_time_series(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"train-test","dir":"Articles","previous_headings":"","what":"Train / Test","title":"Time Series Machine Learning","text":"Next, use time_series_split() make train/test set. Setting assess = \"3 months\" tells function use last 3-months data testing set. Setting cumulative = TRUE tells sampling use prior data training set. Next, visualize train/test split. tk_time_series_cv_plan(): Converts splits object data frame plot_time_series_cv_plan(): Plots time series sampling data using “date” “value” columns.","code":"splits <- bike_transactions_tbl %>% time_series_split(assess = \"3 months\", cumulative = TRUE) splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeling","dir":"Articles","previous_headings":"","what":"Modeling","title":"Time Series Machine Learning","text":"Machine learning models complex univariate models (e.g. ARIMA, Exponential Smoothing). complexity typically requires workflow (sometimes called pipeline languages). general process goes like : Create Preprocessing Recipe Create Model Specifications Use Workflow combine Model Spec Preprocessing, Fit Model","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"recipe-preprocessing-specification","dir":"Articles","previous_headings":"Modeling","what":"Recipe Preprocessing Specification","title":"Time Series Machine Learning","text":"first step add time series signature training set, used learn patterns. New timetk 0.1.3 integration recipes R package: recipes package allows us add preprocessing steps applied sequentially part data transformation pipeline. timetk step_timeseries_signature(), used add number features can help machine learning models. can see happens apply prepared recipe prep() using bake() function. Many new columns added timestamp “date” feature. features can use machine learning models. Next, apply various preprocessing steps improve modeling behavior. wish learn , Advanced Time Series course help learn techniques.","code":"# Add time series signature recipe_spec_timeseries <- recipe(value ~ ., data = training(splits)) %>% step_timeseries_signature(date) bake(prep(recipe_spec_timeseries), new_data = training(splits)) ## # A tibble: 641 × 29 ## date value date_index.num date_year date_year.iso date_half ## ## 1 2011-01-01 985 1293840000 2011 2010 1 ## 2 2011-01-02 801 1293926400 2011 2010 1 ## 3 2011-01-03 1349 1294012800 2011 2011 1 ## 4 2011-01-04 1562 1294099200 2011 2011 1 ## 5 2011-01-05 1600 1294185600 2011 2011 1 ## 6 2011-01-06 1606 1294272000 2011 2011 1 ## 7 2011-01-07 1510 1294358400 2011 2011 1 ## 8 2011-01-08 959 1294444800 2011 2011 1 ## 9 2011-01-09 822 1294531200 2011 2011 1 ## 10 2011-01-10 1321 1294617600 2011 2011 1 ## # ℹ 631 more rows ## # ℹ 23 more variables: date_quarter , date_month , ## # date_month.xts , date_month.lbl , date_day , ## # date_hour , date_minute , date_second , date_hour12 , ## # date_am.pm , date_wday , date_wday.xts , ## # date_wday.lbl , date_mday , date_qday , date_yday , ## # date_mweek , date_week , date_week.iso , date_week2 , … recipe_spec_final <- recipe_spec_timeseries %>% step_fourier(date, period = 365, K = 5) %>% step_rm(date) %>% step_rm(contains(\"iso\"), contains(\"minute\"), contains(\"hour\"), contains(\"am.pm\"), contains(\"xts\")) %>% step_normalize(contains(\"index.num\"), date_year) %>% step_dummy(contains(\"lbl\"), one_hot = TRUE) juice(prep(recipe_spec_final)) ## # A tibble: 641 × 47 ## value date_index.num date_year date_half date_quarter date_month date_day ## ## 1 985 -1.73 -0.869 1 1 1 1 ## 2 801 -1.72 -0.869 1 1 1 2 ## 3 1349 -1.72 -0.869 1 1 1 3 ## 4 1562 -1.71 -0.869 1 1 1 4 ## 5 1600 -1.71 -0.869 1 1 1 5 ## 6 1606 -1.70 -0.869 1 1 1 6 ## 7 1510 -1.70 -0.869 1 1 1 7 ## 8 959 -1.69 -0.869 1 1 1 8 ## 9 822 -1.68 -0.869 1 1 1 9 ## 10 1321 -1.68 -0.869 1 1 1 10 ## # ℹ 631 more rows ## # ℹ 40 more variables: date_second , date_wday , date_mday , ## # date_qday , date_yday , date_mweek , date_week , ## # date_week2 , date_week3 , date_week4 , date_mday7 , ## # date_sin365_K1 , date_cos365_K1 , date_sin365_K2 , ## # date_cos365_K2 , date_sin365_K3 , date_cos365_K3 , ## # date_sin365_K4 , date_cos365_K4 , date_sin365_K5 , …"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"model-specification","dir":"Articles","previous_headings":"Modeling","what":"Model Specification","title":"Time Series Machine Learning","text":"Next, let’s create model specification. ’ll use Elastic Net penalized regression via glmnet package.","code":"model_spec_lm <- linear_reg( mode = \"regression\", penalty = 0.1 ) %>% set_engine(\"glmnet\")"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"workflow","dir":"Articles","previous_headings":"Modeling","what":"Workflow","title":"Time Series Machine Learning","text":"can mary preprocessing recipe model using workflow().","code":"workflow_lm <- workflow() %>% add_recipe(recipe_spec_final) %>% add_model(model_spec_lm) workflow_lm ## ══ Workflow ════════════════════════════════════════════════════════════════════ ## Preprocessor: Recipe ## Model: linear_reg() ## ## ── Preprocessor ──────────────────────────────────────────────────────────────── ## 6 Recipe Steps ## ## • step_timeseries_signature() ## • step_fourier() ## • step_rm() ## • step_rm() ## • step_normalize() ## • step_dummy() ## ## ── Model ─────────────────────────────────────────────────────────────────────── ## Linear Regression Model Specification (regression) ## ## Main Arguments: ## penalty = 0.1 ## ## Computational engine: glmnet"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"training","dir":"Articles","previous_headings":"Modeling","what":"Training","title":"Time Series Machine Learning","text":"workflow can trained fit() function.","code":"workflow_fit_lm <- workflow_lm %>% fit(data = training(splits))"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"hyperparameter-tuning","dir":"Articles","previous_headings":"Modeling","what":"Hyperparameter Tuning","title":"Time Series Machine Learning","text":"Linear regression parameters. Therefore, step needed. complex models hyperparameters require tuning. Algorithms include: Elastic Net XGBoost Random Forest Support Vector Machine (SVM) K-Nearest Neighbors Multivariate Adaptive Regression Spines (MARS) like learn tune models time series, join waitlist advanced Time Series Analysis & Forecasting Course.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecasting-with-modeltime","dir":"Articles","previous_headings":"","what":"Forecasting with Modeltime","title":"Time Series Machine Learning","text":"Modeltime Workflow designed speed model evaluation selection. Now several time series models, let’s analyze forecast future modeltime package.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeltime-table","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Modeltime Table","title":"Time Series Machine Learning","text":"Modeltime Table organizes models IDs creates generic descriptions help us keep track models. Let’s add models modeltime_table().","code":"model_table <- modeltime_table( workflow_fit_lm ) model_table ## # Modeltime Table ## # A tibble: 1 × 3 ## .model_id .model .model_desc ## ## 1 1 GLMNET"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"calibration","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Calibration","title":"Time Series Machine Learning","text":"Model Calibration used quantify error estimate confidence intervals. ’ll perform model calibration --sample data (aka. Testing Set) modeltime_calibrate() function. Two new columns generated (“.type” “.calibration_data”), important “.calibration_data”. includes actual values, fitted values, residuals testing set.","code":"calibration_table <- model_table %>% modeltime_calibrate(testing(splits)) calibration_table ## # Modeltime Table ## # A tibble: 1 × 5 ## .model_id .model .model_desc .type .calibration_data ## ## 1 1 GLMNET Test "},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecast-testing-set","dir":"Articles","previous_headings":"Forecasting with Modeltime > Calibration","what":"Forecast (Testing Set)","title":"Time Series Machine Learning","text":"calibrated data, can visualize testing predictions (forecast). Use modeltime_forecast() generate forecast data testing set tibble. Use plot_modeltime_forecast() visualize results interactive static plot formats.","code":"calibration_table %>% modeltime_forecast(actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"accuracy-testing-set","dir":"Articles","previous_headings":"Forecasting with Modeltime > Calibration","what":"Accuracy (Testing Set)","title":"Time Series Machine Learning","text":"Next, calculate testing accuracy compare models. Use modeltime_accuracy() generate --sample accuracy metrics tibble. Use table_modeltime_accuracy() generate interactive static","code":"calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"refit-and-forecast-forward","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Refit and Forecast Forward","title":"Time Series Machine Learning","text":"Refitting best-practice forecasting future. modeltime_refit(): re-train full data (bike_transactions_tbl) modeltime_forecast(): models depend “date” feature, can use h (horizon) forecast forward. Setting h = \"12 months\" forecasts next 12-months data.","code":"calibration_table %>% modeltime_refit(bike_transactions_tbl) %>% modeltime_forecast(h = \"12 months\", actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Time Series Machine Learning","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Feature Engineering Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"take-the-high-performance-forecasting-course","dir":"Articles","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Time Series Machine Learning","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"time-series-is-changing","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Time Series Machine Learning","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Time Series Machine Learning","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Visualizing Time Series","text":"Run following code setup tutorial.","code":"library(dplyr) library(ggplot2) library(lubridate) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- FALSE"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"plotting-time-series","dir":"Articles","previous_headings":"","what":"Plotting Time Series","title":"Visualizing Time Series","text":"Let’s start popular time series, taylor_30_min, includes energy demand megawatts sampling interval 30-minutes. single time series. plot_time_series() function generates interactive plotly chart default. Simply provide date variable (time-based column, .date_var) numeric variable (.value) changes time first 2 arguments .interactive = TRUE, .plotly_slider = TRUE adds date slider bottom chart.","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows taylor_30_min %>% plot_time_series(date, value, .interactive = interactive, .plotly_slider = TRUE)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"plotting-groups","dir":"Articles","previous_headings":"Plotting Time Series","what":"Plotting Groups","title":"Visualizing Time Series","text":"Next, let’s move dataset time series groups, m4_daily, sample 4 time series M4 competition sampled daily frequency. Visualizing grouped data simple grouping data set group_by() prior piping plot_time_series() function. Key points: Groups can added 2 ways: group_by() using ... add groups. Groups converted facets. .facet_ncol = 2 returns 2-column faceted plot .facet_scales = \"free\" allows x y-axis plot scale independently plots","code":"m4_daily %>% group_by(id) #> # A tibble: 9,743 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows m4_daily %>% group_by(id) %>% plot_time_series(date, value, .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"visualizing-transformations-sub-groups","dir":"Articles","previous_headings":"Plotting Time Series","what":"Visualizing Transformations & Sub-Groups","title":"Visualizing Time Series","text":"Let’s switch hourly dataset multiple groups. can showcase: Log transformation .value Use .color_var highlight sub-groups. intent showcase groups faceted plots, highlight weekly windows (sub-groups) within data simultaneously log() transformation value. simple : .value = log(value) Applies Log Transformation .color_var = week(date) date column transformed lubridate::week() number. color applied week numbers.","code":"m4_hourly %>% group_by(id) #> # A tibble: 3,060 × 3 #> # Groups: id [4] #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows m4_hourly %>% group_by(id) %>% plot_time_series(date, log(value), # Apply a Log Transformation .color_var = week(date), # Color applied to Week transformation # Facet formatting .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"static-ggplot2-visualizations-customizations","dir":"Articles","previous_headings":"Plotting Time Series","what":"Static ggplot2 Visualizations & Customizations","title":"Visualizing Time Series","text":"visualizations can converted interactive plotly (great exploring shiny apps) static ggplot2 visualizations (great reports).","code":"taylor_30_min %>% plot_time_series(date, value, .color_var = month(date, label = TRUE), # Returns static ggplot .interactive = FALSE, # Customization .title = \"Taylor's MegaWatt Data\", .x_lab = \"Date (30-min intervals)\", .y_lab = \"Energy Demand (MW)\", .color_lab = \"Month\") + scale_y_continuous(labels = scales::comma_format())"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"box-plots-time-series","dir":"Articles","previous_headings":"","what":"Box Plots (Time Series)","title":"Visualizing Time Series","text":"plot_time_series_boxplot() function can used make box plots. Box plots use aggregation, key parameter defined .period argument.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_boxplot( date, value, .period = \"1 year\", .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"regression-plots-time-series","dir":"Articles","previous_headings":"","what":"Regression Plots (Time Series)","title":"Visualizing Time Series","text":"time series regression plot, plot_time_series_regression(), can useful quickly assess key features correlated time series. Internally function passes formula stats::lm() function. linear regression summary can output toggling show_summary = TRUE.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE, .show_summary = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Visualizing Time Series","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"take-the-high-performance-forecasting-course","dir":"Articles","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Visualizing Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"time-series-is-changing","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Visualizing Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Visualizing Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Plotting Seasonality and Correlation","text":"Run following code set tutorial.","code":"library(dplyr) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- TRUE"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-acf-diagnostics","dir":"Articles","previous_headings":"Correlation Plots","what":"Grouped ACF Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = interactive )"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-ccf-plots","dir":"Articles","previous_headings":"Correlation Plots","what":"Grouped CCF Plots","title":"Plotting Seasonality and Correlation","text":"","code":"walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = interactive )"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"seasonal-visualizations","dir":"Articles","previous_headings":"Seasonality","what":"Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-seasonal-visualizations","dir":"Articles","previous_headings":"Seasonality","what":"Grouped Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"stl-diagnostics","dir":"Articles","previous_headings":"","what":"STL Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .frequency = \"auto\", .trend = \"auto\", .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Plotting Seasonality and Correlation","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Frequency and Trend Selection","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Frequency and Trend Selection","text":"Daily Irregular Data daily stock prices Facebook 2013 2016. Note trading days occur “business days” (non-weekends non-business-holidays). Sub-Daily Data Taylor’s Energy Demand data 30-minute timestamp interval.","code":"data(FANG) FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows taylor_30_min ## # A tibble: 4,032 × 2 ## date value ## ## 1 2000-06-05 00:00:00 22262 ## 2 2000-06-05 00:30:00 21756 ## 3 2000-06-05 01:00:00 22247 ## 4 2000-06-05 01:30:00 22759 ## 5 2000-06-05 02:00:00 22549 ## 6 2000-06-05 02:30:00 22313 ## 7 2000-06-05 03:00:00 22128 ## 8 2000-06-05 03:30:00 21860 ## 9 2000-06-05 04:00:00 21751 ## 10 2000-06-05 04:30:00 21336 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"applications","dir":"Articles","previous_headings":"","what":"Applications","title":"Frequency and Trend Selection","text":"example automatic frequency detection occurs plot_stl_diagnostics() function.","code":"taylor_30_min %>% plot_stl_diagnostics(date, value, .frequency = \"auto\", .trend = \"auto\", .interactive = FALSE) ## frequency = 48 observations per 1 day ## trend = 672 observations per 14 days"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"specifying-a-frequency-or-trend","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Specifying a Frequency or Trend","title":"Frequency and Trend Selection","text":"period argument three basic options returning frequency. Options include: “auto”: target frequency determined using pre-defined Time Scale Template (see ). time-based duration: (e.g. “7 days” “2 quarters” per cycle) numeric number observations: (e.g. 5 5 observations per cycle)","code":""},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"frequency","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Frequency","title":"Frequency and Trend Selection","text":"frequency loosely defined number observations comprise cycle data set. Using tk_get_frequency(), can pick number observations roughly define frequency series. Daily Irregular Data FB_tbl irregular (weekends holidays present), frequency selected weekly week 5-days typically. 5 selected. Sub-Daily Data works well sub-daily time series. ’ll use taylor_30_min 30-minute timestamp series. frequency selected 48 48 timestamps (observations) 1 day 30-minute cycle.","code":"FB_tbl %>% tk_index() %>% tk_get_frequency(period = \"auto\") ## frequency = 5 observations per 1 week ## [1] 5 taylor_30_min %>% tk_index() %>% tk_get_frequency(\"1 day\") ## frequency = 48 observations per 1 day ## [1] 48"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"trend","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Trend","title":"Frequency and Trend Selection","text":"trend loosely defined time span can aggregated across visualize central tendency data. Using tk_get_trend(), can pick number observations help describe trend data. Daily Irregular Data FB_tbl irregular (weekends holidays present), trend selected 3 months week 5-days typically. 64 observations selected. Sub-Daily Data 14-day (2 week) interval selected “30-minute” interval data.","code":"FB_tbl %>% tk_index() %>% tk_get_trend(period = \"auto\") ## trend = 64 observations per 3 months ## [1] 64 taylor_30_min %>% tk_index() %>% tk_get_trend(\"auto\") ## trend = 672 observations per 14 days ## [1] 672"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"time-scale-template","dir":"Articles","previous_headings":"","what":"Time Scale Template","title":"Frequency and Trend Selection","text":"Time-Scale Template used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Accessing Default Template can access current template get_tk_time_scale_template(). Changing Default Template can modify current template set_tk_time_scale_template().","code":"get_tk_time_scale_template() ## # A tibble: 8 × 3 ## time_scale frequency trend ## ## 1 second 1 hour 12 hours ## 2 minute 1 day 14 days ## 3 hour 1 day 1 month ## 4 day 1 week 3 months ## 5 week 1 quarter 1 year ## 6 month 1 year 5 years ## 7 quarter 1 year 10 years ## 8 year 5 years 30 years"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Frequency and Trend Selection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Time Series Data Wrangling","text":"Load following libraries.","code":"library(dplyr) library(tidyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Data Wrangling","text":"tutorial use FANG dataset: Daily Irregular (missing business holidays weekends) 4 groups (FB, AMZN, NFLX, GOOG). adjusted column contains adjusted closing prices day. volume column contains trade volume (number times stock transacted) day.","code":"FANG ## # A tibble: 4,032 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 4,022 more rows FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) FANG %>% group_by(symbol) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"summarize-by-time","dir":"Articles","previous_headings":"","what":"Summarize by Time","title":"Time Series Data Wrangling","text":"summarise_by_time() aggregates period. ’s great : Period Aggregation - sum() Period Smoothing - mean(), first(), last()","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"period-summarization","dir":"Articles","previous_headings":"Summarize by Time","what":"Period Summarization","title":"Time Series Data Wrangling","text":"Objective: Get total trade volume quarter Use sum() Aggregate using .= \"quarter\"","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"quarter\", volume = sum(volume) ) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE, .y_intercept = 0)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"period-smoothing","dir":"Articles","previous_headings":"Summarize by Time","what":"Period Smoothing","title":"Time Series Data Wrangling","text":"Objective: Get first value month can use first() get first value, effect reducing data (.e. smoothing). use mean() median(). Use summarization time: .= \"month\" aggregate month.","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"month\", adjusted = first(adjusted) ) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"filter-by-time","dir":"Articles","previous_headings":"","what":"Filter By Time","title":"Time Series Data Wrangling","text":"Used quickly filter continuous time range.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"time-range-filtering","dir":"Articles","previous_headings":"Filter By Time","what":"Time Range Filtering","title":"Time Series Data Wrangling","text":"Objective: Get adjusted stock prices 3rd quarter 2013. .start_date = \"2013-09\": Converts “2013-09-01 .end_date = \"2013\": Converts “2013-12-31 advanced example filtering using %+time %-time shown “Padding Data: Low High Frequency”.","code":"FANG %>% group_by(symbol) %>% filter_by_time(date, \"2013-09\", \"2013\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"padding-data","dir":"Articles","previous_headings":"","what":"Padding Data","title":"Time Series Data Wrangling","text":"Used fill (pad) gaps go low frequency high frequency. function uses awesome padr library filling expanding timestamps.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"fill-in-gaps","dir":"Articles","previous_headings":"Padding Data","what":"Fill in Gaps","title":"Time Series Data Wrangling","text":"Objective: Make irregular series regular. leave padded values NA. can add value using .pad_value can impute using function like ts_impute_vec() (shown next).","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"auto\") # Guesses .by = \"day\" ## pad applied on the interval: day ## # A tibble: 5,836 × 8 ## # Groups: symbol [4] ## symbol date open high low close volume adjusted ## ## 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. ## 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. ## 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. ## 4 AMZN 2013-01-05 NA NA NA NA NA NA ## 5 AMZN 2013-01-06 NA NA NA NA NA NA ## 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. ## 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. ## 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. ## 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. ## 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. ## # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"low-to-high-frequency","dir":"Articles","previous_headings":"Padding Data","what":"Low to High Frequency","title":"Time Series Data Wrangling","text":"Objective: Go Daily Hourly timestamp intervals 1 month start date. Impute missing values. .= \"hour\" pads daily hourly Imputation hourly data accomplished ts_impute_vec(), performs linear interpolation period = 1. “start”: special keyword signals start series FIRST(date) %+time% \"1 month\": Selecting first date sequence using special infix operation, %+time%, called “add time”. case add “1 month”.","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"hour\") %>% mutate_at(vars(open:adjusted), .funs = ts_impute_vec, period = 1) %>% filter_by_time(date, \"start\", first(date) %+time% \"1 month\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"sliding-rolling-calculations","dir":"Articles","previous_headings":"","what":"Sliding (Rolling) Calculations","title":"Time Series Data Wrangling","text":"new function, slidify() turns function sliding (rolling) window function. takes concepts tibbletime::rollify() improves R package slider.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"rolling-mean","dir":"Articles","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Mean","title":"Time Series Data Wrangling","text":"Objective: Calculate “centered” simple rolling average partial window rolling start end windows. slidify() turns mean() function rolling average. simple rolling calculations (rolling average), can accomplish operation faster slidify_vec() - vectorized rolling function simple summary rolls (e.g. mean(), sd(), sum(), etc)","code":"# Make the rolling function roll_avg_30 <- slidify(.f = mean, .period = 30, .align = \"center\", .partial = TRUE) # Apply the rolling function FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply Sliding Function mutate(rolling_avg_30 = roll_avg_30(adjusted)) %>% pivot_longer(cols = c(adjusted, rolling_avg_30)) %>% plot_time_series(date, value, .color_var = name, .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE) FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply roll apply Function mutate(rolling_avg_30 = slidify_vec(adjusted, ~ mean(.), .period = 30, .partial = TRUE)) ## # A tibble: 4,032 × 4 ## # Groups: symbol [4] ## symbol date adjusted rolling_avg_30 ## ## 1 FB 2013-01-02 28 30.0 ## 2 FB 2013-01-03 27.8 30.1 ## 3 FB 2013-01-04 28.8 30.2 ## 4 FB 2013-01-07 29.4 30.2 ## 5 FB 2013-01-08 29.1 30.3 ## 6 FB 2013-01-09 30.6 30.3 ## 7 FB 2013-01-10 31.3 30.3 ## 8 FB 2013-01-11 31.7 30.2 ## 9 FB 2013-01-14 31.0 30.1 ## 10 FB 2013-01-15 30.1 30.1 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"rolling-regression","dir":"Articles","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Regression","title":"Time Series Data Wrangling","text":"Objective: Calculate rolling regression. complex sliding (rolling) calculation requires multiple columns involved. slidify() built . Use multi-variable purrr ..1, ..2, ..3, etc notation setup function","code":"# Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~ lm(..1 ~ ..2 + ..3), .period = 90, .unlist = FALSE, .align = \"right\") FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% mutate(numeric_date = as.numeric(date)) %>% # Apply rolling regression mutate(rolling_lm = lm_roll(adjusted, volume, numeric_date)) %>% filter(!is.na(rolling_lm)) ## # A tibble: 3,676 × 6 ## # Groups: symbol [4] ## symbol date adjusted volume numeric_date rolling_lm ## ## 1 FB 2013-05-10 26.7 30847100 15835 ## 2 FB 2013-05-13 26.8 29068800 15838 ## 3 FB 2013-05-14 27.1 24930300 15839 ## 4 FB 2013-05-15 26.6 30299800 15840 ## 5 FB 2013-05-16 26.1 35499100 15841 ## 6 FB 2013-05-17 26.2 29462700 15842 ## 7 FB 2013-05-20 25.8 42402900 15845 ## 8 FB 2013-05-21 25.7 26261300 15846 ## 9 FB 2013-05-22 25.2 45314500 15847 ## 10 FB 2013-05-23 25.1 37663100 15848 ## # ℹ 3,666 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Data Wrangling","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Anomaly Detection","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"anomaly-visualization","dir":"Articles","previous_headings":"","what":"Anomaly Visualization","title":"Anomaly Detection","text":"Using plot_anomaly_diagnostics() function, can interactively detect anomalies scale.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2)"},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"automatic-anomaly-detection","dir":"Articles","previous_headings":"","what":"Automatic Anomaly Detection","title":"Anomaly Detection","text":"get data anomalies, use tk_anomaly_diagnostics(), preprocessing function.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) ## # A tibble: 1,001 × 13 ## # Groups: Store, Dept [7] ## Store Dept Date observed season trend remainder seasadj remainder_l1 ## ## 1 1 1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. ## 2 1 1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. ## 3 1 1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. ## 4 1 1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. ## 5 1 1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. ## 6 1 1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. ## 7 1 1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. ## 8 1 1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. ## 9 1 1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. ## 10 1 1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. ## # ℹ 991 more rows ## # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , ## # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Anomaly Detection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Time Series Clustering","text":"get started, load following libraries.","code":"library(dplyr) library(purrr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Clustering","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"ts-features","dir":"Articles","previous_headings":"","what":"TS Features","title":"Time Series Clustering","text":"Using tk_tsfeatures() function, can quickly get “tsfeatures” time series. important points: features parameter come tsfeatures R package. Use one function names tsfeatures R package e.g.(“lumpiness”, “stl_features”). can supply function returns aggregation (e.g. “mean” apply base::mean() function). can supply custom functions creating function providing (e.g. my_mean() defined )","code":"# Custom Function my_mean <- function(x, na.rm=TRUE) { mean(x, na.rm = na.rm) } tsfeature_tbl <- walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"my_mean\"), .scale = TRUE, .prefix = \"ts_\" ) %>% ungroup() tsfeature_tbl ## # A tibble: 7 × 22 ## id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 1_1 52 1 52 0.000670 0.0000280 ## 2 1_3 52 1 52 0.0614 0.00000987 ## 3 1_8 52 1 52 0.756 0.00000195 ## 4 1_13 52 1 52 0.354 0.00000475 ## 5 1_38 52 1 52 0.425 0.0000179 ## 6 1_93 52 1 52 0.791 0.000000754 ## 7 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"clustering-with-k-means","dir":"Articles","previous_headings":"","what":"Clustering with K-Means","title":"Time Series Clustering","text":"can quickly add cluster assignments kmeans() function tidyverse data wrangling.","code":"set.seed(123) cluster_tbl <- tibble( cluster = tsfeature_tbl %>% select(-id) %>% as.matrix() %>% kmeans(centers = 3, nstart = 100) %>% pluck(\"cluster\") ) %>% bind_cols( tsfeature_tbl ) cluster_tbl ## # A tibble: 7 × 23 ## cluster id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 2 1_1 52 1 52 0.000670 0.0000280 ## 2 2 1_3 52 1 52 0.0614 0.00000987 ## 3 2 1_8 52 1 52 0.756 0.00000195 ## 4 1 1_13 52 1 52 0.354 0.00000475 ## 5 3 1_38 52 1 52 0.425 0.0000179 ## 6 3 1_93 52 1 52 0.791 0.000000754 ## 7 1 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"visualize-the-cluster-assignments","dir":"Articles","previous_headings":"","what":"Visualize the Cluster Assignments","title":"Time Series Clustering","text":"Finally, can visualize cluster assignments joining cluster_tbl original walmart_sales_weekly plotting plot_time_series().","code":"cluster_tbl %>% select(cluster, id) %>% right_join(walmart_sales_weekly, by = \"id\") %>% group_by(id) %>% plot_time_series( Date, Weekly_Sales, .color_var = cluster, .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Clustering","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Time Series Class Conversion","text":"time series landscape R vast, deep, complex causing many inconsistencies data attributes formats ultimately making difficult coerce different data structures. zoo xts packages solved number issues dealing various classes (ts, zoo, xts, irts, msts, list goes …). However, packages deal classes data frame, issues conversion tbl time series object classes still present. timetk package provides tools solve issues conversion, maximizing attribute extensibility (required data attributes retained conversion primary time series classes). following tools available coerce retrieve key information: Conversion functions: tk_tbl, tk_ts, tk_xts, tk_zoo, tk_zooreg. functions coerce time-based tibbles tbl main time-series data types xts, zoo, zooreg, ts, maintaining time-based index. Index function: tk_index returns index. argument, timetk_idx = TRUE, time-based index (non-regularized index) forecast objects, models, ts objects returned present. Refer tk_ts() learn non-regularized index persistence conversion process. vignette includes brief case study conversion issues detailed explanation timetk function conversion time-based tbl objects several primary time series classes (xts, zoo, zooreg ts).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Time Series Class Conversion","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Class Conversion","text":"’ll use “Q10” dataset - first ID sample quarterly datasets (see m4_quarterly) M4 Competition. return structure tibble, conducive many popular time series analysis packages including quantmod, TTR, forecast many others.","code":"q10_quarterly <- m4_quarterly %>% filter(id == \"Q10\") q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"case-study-conversion-issues-with-ts","dir":"Articles > Temp_archive","previous_headings":"","what":"Case Study: Conversion issues with ts()","title":"Time Series Class Conversion","text":"ts object class roots stats package many popular packages use time series data structure including popular forecast package. said, ts data structure difficult coerce back forth default contain time-based index. Rather uses regularized index computed using start frequency arguments. Conversion ts done using ts() function stats library, results various problems.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"problems","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Problems","title":"Time Series Class Conversion","text":"First, numeric columns get coerced. user forgets add [,\"pct\"] drop “date” column, ts() returns dates numeric format user wants. correct method call specific column desired. However, presents new issue. date index lost, different “regularized” index built using start frequency attributes. can see structure (using str() function) regularized time series present, date index retained. can get index using index() function zoo package. index retained regular sequence numeric values. many cases, regularized values coerced back original time-base date date time data contains significantly information (.e. year-month-day, hour-minute-second, timezone attributes) data may regularized interval (frequency).","code":"# date column gets coerced to numeric ts(q10_quarterly, start = c(2000, 1), freq = 4) %>% head() ## id date value ## [1,] 1 10957 2329.0 ## [2,] 1 11048 2349.9 ## [3,] 1 11139 2332.9 ## [4,] 1 11231 2381.5 ## [5,] 1 11323 2382.6 ## [6,] 1 11413 2405.0 q10_quarterly_ts <- ts(q10_quarterly$value, start = c(2000, 1), freq = 4) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # No date index attribute str(q10_quarterly_ts) ## Time-Series [1:59] from 2000 to 2014: 2329 2350 2333 2382 2383 ... # Regularized numeric sequence zoo::index(q10_quarterly_ts) ## [1] 2000.00 2000.25 2000.50 2000.75 2001.00 2001.25 2001.50 2001.75 2002.00 ## [10] 2002.25 2002.50 2002.75 2003.00 2003.25 2003.50 2003.75 2004.00 2004.25 ## [19] 2004.50 2004.75 2005.00 2005.25 2005.50 2005.75 2006.00 2006.25 2006.50 ## [28] 2006.75 2007.00 2007.25 2007.50 2007.75 2008.00 2008.25 2008.50 2008.75 ## [37] 2009.00 2009.25 2009.50 2009.75 2010.00 2010.25 2010.50 2010.75 2011.00 ## [46] 2011.25 2011.50 2011.75 2012.00 2012.25 2012.50 2012.75 2013.00 2013.25 ## [55] 2013.50 2013.75 2014.00 2014.25 2014.50"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"solution","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Solution","title":"Time Series Class Conversion","text":"timetk package contains new function, tk_ts(), enables maintaining original date index attribute. repeat tbl ts conversion process using new function, tk_ts(), can see differences. First, numeric columns get coerced, prevents unintended consequences due R conversion rules (e.g. dates getting unintentionally converted characters causing homogeneous data structure converting numeric values character). column dropped, user gets warning. Second, data returned additional attributes. important numeric attribute, “index”, contains original date information number. ts() function preserve index tk_ts() preserve index numeric form along time zone class.","code":"# date automatically dropped and user is warned q10_quarterly_ts_timetk <- tk_ts(q10_quarterly, start = 2000, freq = 4) ## Warning: Non-numeric columns being dropped: id, date q10_quarterly_ts_timetk ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # More attributes including time index, time class, time zone str(q10_quarterly_ts_timetk) ## Time-Series [1:59, 1] from 2000 to 2014: 2329 2350 2333 2382 2383 ... ## - attr(*, \"dimnames\")=List of 2 ## ..$ : NULL ## ..$ : chr \"value\" ## - attr(*, \"index\")= num [1:59] 9.47e+08 9.55e+08 9.62e+08 9.70e+08 9.78e+08 ... ## ..- attr(*, \"tzone\")= chr \"UTC\" ## ..- attr(*, \"tclass\")= chr \"Date\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"advantages-of-conversion-with-tk_tbl","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Advantages of conversion with tk_tbl()","title":"Time Series Class Conversion","text":"Since used tk_ts() conversion, can extract original index date format using tk_index(timetk_idx = TRUE) (default timetk_idx = FALSE returns default regularized index). Next, tk_tbl() function argument timetk_idx also can used select index return. First, show conversion using default index. Notice index returned “regularized” meaning actually numeric index rather time-based index. can now get original date index using tk_tbl() argument timetk_idx = TRUE. can see case (cases) can get data frame began .","code":"# Can now retrieve the original date index timetk_index <- q10_quarterly_ts_timetk %>% tk_index(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent head(timetk_index) ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" class(timetk_index) ## [1] \"Date\" # Conversion back to tibble using the default index (regularized) q10_quarterly_ts_timetk %>% tk_tbl(index_rename = \"date\", timetk_idx = FALSE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # Conversion back to tibble now using the timetk index (date / date-time) q10_quarterly_timetk <- q10_quarterly_ts_timetk %>% tk_tbl(timetk_idx = TRUE) %>% rename(date = index) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent q10_quarterly_timetk ## # A tibble: 59 × 2 ## date value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows # Comparing the coerced tibble with the original tibble identical(q10_quarterly_timetk, q10_quarterly %>% select(-id)) ## [1] TRUE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"conversion-methods","dir":"Articles > Temp_archive","previous_headings":"","what":"Conversion Methods","title":"Time Series Class Conversion","text":"Using q10_quarterly, ’ll go various conversion methods using tk_tbl, tk_xts, tk_zoo, tk_zooreg, tk_ts.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-tbl","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods","what":"From tbl","title":"Time Series Class Conversion","text":"starting point q10_quarterly. coerce xts, zoo, zooreg ts classes.","code":"# Start: q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-xts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to xts","title":"Time Series Class Conversion","text":"Use tk_xts(). default “date” used date index “date” column dropped output. numeric columns coerced avoid unintentional conversion issues. Use select argument specify columns drop. Use date_var argument specify column use date index. Notice message warning longer present. Also, alternative, can set silent = TRUE bypass warnings since default dropping “date” column desired. Notice warnings messages.","code":"# End q10_quarterly_xts <- tk_xts(q10_quarterly) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `select` and `date_var` args tk_xts(q10_quarterly, select = -(id:date), date_var = date) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `silent` to silence warnings tk_xts(q10_quarterly, silent = TRUE) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-zoo","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to zoo","title":"Time Series Class Conversion","text":"Use tk_zoo(). coercing xts, non-numeric “date” column automatically dropped index automatically selected date column.","code":"# End q10_quarterly_zoo <- tk_zoo(q10_quarterly, silent = TRUE) head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-zooreg","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to zooreg","title":"Time Series Class Conversion","text":"Use tk_zooreg(). coercing xts, non-numeric “date” column automatically dropped. regularized index built function arguments start freq. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_zooreg <- tk_zooreg(q10_quarterly, start = 2000, freq = 4, silent = TRUE) head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # Retrieve original time-based index tk_index(q10_quarterly_zooreg, timetk_idx = TRUE) %>% str() ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-ts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to ts","title":"Time Series Class Conversion","text":"Use tk_ts(). non-numeric “date” column automatically dropped. regularized index built function arguments. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_ts <- tk_ts(q10_quarterly, start = 2000, freq = 4, silent = TRUE) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # Retrieve original time-based index tk_index(q10_quarterly_ts, timetk_idx = TRUE) %>% str() ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-tbl","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods","what":"To tbl","title":"Time Series Class Conversion","text":"Going back tibble just easy using tk_tbl().","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-xts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From xts","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_xts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-zoo","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From zoo","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_zoo) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-zooreg","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From zooreg","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # End - with default regularized index tk_tbl(q10_quarterly_zooreg) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index that is the same as original time-based index tk_tbl(q10_quarterly_zooreg, timetk_idx = TRUE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-ts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From ts","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # End - with default regularized index tk_tbl(q10_quarterly_ts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"testing-if-an-object-has-a-timetk-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Testing if an object has a timetk index","title":"Time Series Class Conversion","text":"function has_timetk_idx() can used test whether toggling timetk_idx argument tk_index() tk_tbl() functions effect output. several examples using ten year treasury data used case study:","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"tk_ts","dir":"Articles > Temp_archive","previous_headings":"Testing if an object has a timetk index","what":"tk_ts()","title":"Time Series Class Conversion","text":"tk_ts() function returns object “timetk index” attribute. toggle timetk_idx = TRUE retrieving index tk_index(), get index dates rather regularized time series. toggle timetk_idx = TRUE conversion tbl using tk_tbl(), get index dates rather regularized index returned tbl.","code":"# Data coerced with tk_ts() has timetk index has_timetk_idx(q10_quarterly_ts) ## [1] TRUE tk_index(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"testing-other-data-types","dir":"Articles > Temp_archive","previous_headings":"Testing if an object has a timetk index","what":"Testing other data types","title":"Time Series Class Conversion","text":"timetk_idx argument effect objects use regularized time series. Therefore, has_timetk_idx() returns FALSE object types (e.g. tbl, xts, zoo) since toggling argument effect classes. Toggling timetk_idx argument effect output. Output timetk_idx = TRUE timetk_idx = FALSE.","code":"has_timetk_idx(q10_quarterly_xts) ## [1] FALSE tk_index(q10_quarterly_xts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"working-with-zooyearmon-and-zooyearqtr-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Working with zoo::yearmon and zoo::yearqtr index","title":"Time Series Class Conversion","text":"zoo package yearmon yearqtr classes working regularized monthly quarterly data, respectively. “timetk index” tracks format conversion. ’s example yearqtr. can coerce xts yearqtr class intact. can coerce ts , although “timetk index” hidden, yearqtr class intact. Coercing ts tbl using timetk_idx = TRUE shows original index maintained conversion steps.","code":"yearqtr_tbl <- q10_quarterly %>% mutate(date = zoo::as.yearqtr(date)) yearqtr_tbl ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000 Q1 2329 ## 2 Q10 2000 Q2 2350. ## 3 Q10 2000 Q3 2333. ## 4 Q10 2000 Q4 2382. ## 5 Q10 2001 Q1 2383. ## 6 Q10 2001 Q2 2405 ## 7 Q10 2001 Q3 2411 ## 8 Q10 2001 Q4 2428. ## 9 Q10 2002 Q1 2392. ## 10 Q10 2002 Q2 2418. ## # ℹ 49 more rows yearqtr_xts <- tk_xts(yearqtr_tbl) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. yearqtr_xts %>% head() ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 yearqtr_ts <- tk_ts(yearqtr_xts, start = 1997, freq = 4) yearqtr_ts %>% head() ## value ## [1,] 2329.0 ## [2,] 2349.9 ## [3,] 2332.9 ## [4,] 2381.5 ## [5,] 2382.6 ## [6,] 2405.0 yearqtr_ts %>% tk_tbl(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Class Conversion","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Calendar Features","text":"time series index consists collection time-based values define observation occurred, important part time series object. index gives user lot information simple timestamp. Consider datetime “2016-01-01 00:00:00”. timestamp, can decompose date time information get signature, consists year, quarter, month, day, day year, day month, hour, minute, second occurrence single observation. , difference two observations frequency can obtain even information periodicity data whether observations regular interval. information critical provides basis performance time finance, decay rates biology, growth rates economics, . vignette user exposed : Time Series Index Time Series Signature Time Series Summary","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Calendar Features","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Calendar Features","text":"’ll use Facebook stock prices FANG data set. historical stock prices (open, high, low, close, volume, adjusted) “FB” stock 2013 2016. simplify tutorial, select “date” “volume” columns. FB_vol_date data frame, can see “date” column observations daily beginning second day 2013.","code":"data(\"FANG\") FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows FB_vol_date <- FB_tbl %>% select(date, volume) FB_vol_date ## # A tibble: 1,008 × 2 ## date volume ## ## 1 2013-01-02 69846400 ## 2 2013-01-03 63140600 ## 3 2013-01-04 72715400 ## 4 2013-01-07 83781800 ## 5 2013-01-08 45871300 ## 6 2013-01-09 104787700 ## 7 2013-01-10 95316400 ## 8 2013-01-11 89598000 ## 9 2013-01-14 98892800 ## 10 2013-01-15 173242600 ## # ℹ 998 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Index","title":"Calendar Features","text":"can analyze index, need extract object. function tk_index() extracts index time series object including data frame (tbl), xts, zoo, etc. index always returned native date, datetime, yearmon, yearqtr format. Note index must one time-based classes extraction work: datetimes: Must inherit POSIXt dates: Must inherit Date yearmon: Must inherit yearmon zoo package yearqtr: Must inherit yearqtr zoo package Extract index using tk_index(). structure shown see output format, vector dates.","code":"# idx_date idx_date <- tk_index(FB_vol_date) str(idx_date) ## Date[1:1008], format: \"2013-01-02\" \"2013-01-03\" \"2013-01-04\" \"2013-01-07\" \"2013-01-08\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-signature","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Signature","title":"Calendar Features","text":"index can decomposed signature. time series signature unique set properties time series values describe time series.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"get-functions---turning-an-index-into-information","dir":"Articles > Temp_archive","previous_headings":"Time Series Signature","what":"Get Functions - Turning an Index into Information","title":"Calendar Features","text":"function tk_get_timeseries_signature() can used convert index tibble containing following values (columns): index: index value decomposed index.num: numeric value index seconds. base “1970-01-01 00:00:00” (Execute \"1970-01-01 00:00:00\" %>% ymd_hms() %>% .numeric() see value returned zero). Every time series value date can converted numeric value seconds. diff: difference seconds previous numeric index value. year: year component index. year.iso: ISO year number year (Monday start). half: half component index. quarter: quarter component index. month: month component index base 1. month.xts: month component index base 0, xts implements. month.lbl: month label ordered factor begining January ending December. day: day component index. hour: hour component index. minute: minute component index. second: second component index. hour12: hour component 12 hour scale. .pm: Morning () = 1, Afternoon (PM) = 2. wday: day week base 1. Sunday = 1 Saturday = 7. wday.xts: day week base 0, xts implements. Sunday = 0 Saturday = 6. wday.lbl: day week label ordered factor begining Sunday ending Saturday. mday: day month. qday: day quarter. yday: day year. mweek: week month. week: week number year (Sunday start). week.iso: ISO week number year (Monday start). week2: modulus bi-weekly frequency. week3: modulus tri-weekly frequency. week4: modulus quad-weekly frequency. mday7: integer division day month seven, returns first, second, third, … instance day appeared month. Values begin 1. example, first Saturday month mday7 = 1. second mday7 = 2.","code":"# idx_date signature tk_get_timeseries_signature(idx_date) ## # A tibble: 1,008 × 29 ## index index.num diff year year.iso half quarter month month.xts ## ## 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 ## 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 ## 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 ## 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 ## 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 ## 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 ## 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 ## 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 ## 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 ## 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 ## # ℹ 998 more rows ## # ℹ 20 more variables: month.lbl , day , hour , minute , ## # second , hour12 , am.pm , wday , wday.xts , ## # wday.lbl , mday , qday , yday , mweek , ## # week , week.iso , week2 , week3 , week4 , ## # mday7 "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"augment-functions-adding-many-features-to-a-data-frame","dir":"Articles > Temp_archive","previous_headings":"Time Series Signature","what":"Augment Functions (Adding Many Features to a Data Frame)","title":"Calendar Features","text":"’s usually important keep index signature values (e.g. volume example). can use expedited approach tk_augment_timeseries_signature(), adds signature end time series object. Modeling now much easier. example, can use linear regression model using lm() function month year predictor volume.","code":"# Augmenting a data frame FB_vol_date_signature <- FB_vol_date %>% tk_augment_timeseries_signature(.date_var = date) FB_vol_date_signature ## # A tibble: 1,008 × 30 ## date volume index.num diff year year.iso half quarter month ## ## 1 2013-01-02 69846400 1357084800 NA 2013 2013 1 1 1 ## 2 2013-01-03 63140600 1357171200 86400 2013 2013 1 1 1 ## 3 2013-01-04 72715400 1357257600 86400 2013 2013 1 1 1 ## 4 2013-01-07 83781800 1357516800 259200 2013 2013 1 1 1 ## 5 2013-01-08 45871300 1357603200 86400 2013 2013 1 1 1 ## 6 2013-01-09 104787700 1357689600 86400 2013 2013 1 1 1 ## 7 2013-01-10 95316400 1357776000 86400 2013 2013 1 1 1 ## 8 2013-01-11 89598000 1357862400 86400 2013 2013 1 1 1 ## 9 2013-01-14 98892800 1358121600 259200 2013 2013 1 1 1 ## 10 2013-01-15 173242600 1358208000 86400 2013 2013 1 1 1 ## # ℹ 998 more rows ## # ℹ 21 more variables: month.xts , month.lbl , day , hour , ## # minute , second , hour12 , am.pm , wday , ## # wday.xts , wday.lbl , mday , qday , yday , ## # mweek , week , week.iso , week2 , week3 , ## # week4 , mday7 # Example Benefit 2: Modeling is easier fit <- lm(volume ~ year + month.lbl, data = FB_vol_date_signature) summary(fit) ## ## Call: ## lm(formula = volume ~ year + month.lbl, data = FB_vol_date_signature) ## ## Residuals: ## Min 1Q Median 3Q Max ## -51042223 -13528407 -4588594 8296073 304011277 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 2.494e+10 1.414e+09 17.633 < 2e-16 *** ## year -1.236e+07 7.021e+05 -17.604 < 2e-16 *** ## month.lbl.L -9.589e+06 2.740e+06 -3.499 0.000488 *** ## month.lbl.Q 7.348e+06 2.725e+06 2.697 0.007122 ** ## month.lbl.C -9.773e+06 2.711e+06 -3.605 0.000328 *** ## month.lbl^4 -2.885e+06 2.720e+06 -1.060 0.289176 ## month.lbl^5 -2.994e+06 2.749e+06 -1.089 0.276428 ## month.lbl^6 3.169e+06 2.753e+06 1.151 0.249851 ## month.lbl^7 6.000e+05 2.721e+06 0.221 0.825514 ## month.lbl^8 8.281e+03 2.702e+06 0.003 0.997555 ## month.lbl^9 9.504e+06 2.704e+06 3.515 0.000459 *** ## month.lbl^10 -5.911e+06 2.701e+06 -2.188 0.028888 * ## month.lbl^11 -4.738e+06 2.696e+06 -1.757 0.079181 . ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 24910000 on 995 degrees of freedom ## Multiple R-squared: 0.2714, Adjusted R-squared: 0.2626 ## F-statistic: 30.89 on 12 and 995 DF, p-value: < 2.2e-16"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Summary","title":"Calendar Features","text":"next index analysis tool summary metrics, can retrieved using tk_get_timeseries_summary() function. summary reports following attributes single-row tibble. General Summary: first six columns general summary information. n.obs: total number observations start: start appropriate time class end: end appropriate time class units: label describes unit index value independent frequency (.e. date class always “days” whereas datetime class always “seconds”). Values can days, hours, mins, secs. scale: label describes median difference (frequency) observations. Values can quarter, month, day, hour, minute, second. tzone: timezone index. Differences Summary: next group values differences summary (.e. summary frequency). values seconds: diff.minimum: minimum difference index values. diff.q1: first quartile index differences. diff.median: median difference index values (.e. common frequency). diff.mean: average difference index values. diff.q3: third quartile index differences. diff.maximum: maximum difference index values. differences provide information regularity frequency. Generally speaking difference values equal, index regular. However, scales beyond “day” never theoretically regular since differences seconds equivalent. However, conceptually monthly, quarterly yearly data can thought regular index contains consecutive months, quarters, years, respectively. Therefore, difference attributes meaningful daily lower time scales difference summary always indicates level regularity. second group (differences summary), immediately recognize mean different median therefore index irregular (meaning certain days missing). can see maximum difference 345,600 seconds, indicating maximum difference 4 days (345,600 seconds / 86400 seconds/day).","code":"# idx_date: First six columns, general summary tk_get_timeseries_summary(idx_date)[,1:6] ## # A tibble: 1 × 6 ## n.obs start end units scale tzone ## ## 1 1008 2013-01-02 2016-12-30 days day UTC # idx_date: Last six columns, difference summary tk_get_timeseries_summary(idx_date)[,7:12] ## # A tibble: 1 × 6 ## diff.minimum diff.q1 diff.median diff.mean diff.q3 diff.maximum ## ## 1 86400 86400 86400 125096. 86400 345600"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Calendar Features","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Intelligent Date & Time Sequences","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"making-a-time-series-sequence","dir":"Articles > Temp_archive","previous_headings":"","what":"Making a Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"tk_make_timeseries() improves seq.Date() seq.POSIXt() functions simplifying 1 function. Intelligently handles character dates logical assumptions based user inputs. Day Can use = \"day\" leave blank. include_endpoints = FALSE removes last value series 7 observations. 2 Seconds Can use = \"2 sec\" adjust interval width. include_endpoints = TRUE keeps last value series ends 6th second. Length = 1 year 6 months length_out = \"1 year 6 months\" - Can include complex expressions like “1 year 4 months 6 days”. Go Reverse go reverse, just use end_date want series end.","code":"# Selects by day automatically tk_make_timeseries(\"2011\", length_out = \"7 days\", include_endpoints = FALSE) ## [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-05\" ## [6] \"2011-01-06\" \"2011-01-07\" # Guesses by second tk_make_timeseries(\"2016\", by = \"2 sec\", length_out = \"6 seconds\") ## [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:02 UTC\" ## [3] \"2016-01-01 00:00:04 UTC\" \"2016-01-01 00:00:06 UTC\" tk_make_timeseries(\"2012-07\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) ## [1] \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" \"2012-11-01\" ## [6] \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" \"2013-04-01\" ## [11] \"2013-05-01\" \"2013-06-01\" \"2013-07-01\" \"2013-08-01\" \"2013-09-01\" ## [16] \"2013-10-01\" \"2013-11-01\" \"2013-12-01\" tk_make_timeseries(end_date = \"2012-07-01\", by = \"1 month\", length_out = \"1 year 6 months\") ## [1] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" ## [6] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" ## [11] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" ## [16] \"2012-04-01\" \"2012-05-01\" \"2012-06-01\" \"2012-07-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"future-time-series-sequence","dir":"Articles > Temp_archive","previous_headings":"","what":"Future Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"common operation make future time series sequence mimics existing. tk_make_future_timeseries() . Suppose existing time index. Make Future Time Series Existing can create future time sequence existing sequence using tk_make_future_timeseries().","code":"idx <- tk_make_timeseries(\"2012\", by = \"3 months\", length_out = \"2 years\", include_endpoints = FALSE) idx ## [1] \"2012-01-01\" \"2012-04-01\" \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" ## [6] \"2013-04-01\" \"2013-07-01\" \"2013-10-01\" tk_make_future_timeseries(idx, length_out = \"2 years\") ## [1] \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" \"2014-10-01\" \"2015-01-01\" ## [6] \"2015-04-01\" \"2015-07-01\" \"2015-10-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"weekends-holidays","dir":"Articles > Temp_archive","previous_headings":"","what":"Weekends & Holidays","title":"Intelligent Date & Time Sequences","text":"Make weekday sequence removing holidays Result 252 days. holidays removed? NYSE Trading holidays days businesses observe Make future index removing holidays","code":"idx <- tk_make_weekday_sequence(\"2012\", remove_weekends = TRUE, remove_holidays = TRUE, calendar = \"NYSE\") tk_get_timeseries_summary(idx) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 250 2012-01-03 2012-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum tk_make_holiday_sequence(\"2012\", calendar = \"NYSE\") ## [1] \"2012-01-02\" \"2012-01-16\" \"2012-02-20\" \"2012-04-06\" \"2012-05-28\" ## [6] \"2012-07-04\" \"2012-09-03\" \"2012-10-29\" \"2012-10-30\" \"2012-11-22\" ## [11] \"2012-12-25\" holidays <- tk_make_holiday_sequence( start_date = \"2013-01-01\", end_date = \"2013-12-31\", calendar = \"NYSE\") idx_future <- idx %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) tk_get_timeseries_summary(idx_future) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 252 2013-01-02 2013-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Intelligent Date & Time Sequences","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Time Series Machine Learning","text":"time series signature collection useful features describe time series index time-based data set. contains wealth features can used forecast time series contain patterns. vignette, user learn methods implement machine learning predict future outcomes time-based data set. vignette example uses well known time series dataset, Bike Sharing Dataset, UCI Machine Learning Repository. vignette follows example ’ll use timetk build basic Machine Learning model predict future values using time series signature. objective build model predict next six months Bike Sharing daily counts.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Time Series Machine Learning","text":"get started, load following packages.","code":"library(tidymodels) library(modeltime) library(dplyr) library(timetk) # Used to convert plots from interactive to static interactive = TRUE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Machine Learning","text":"’ll using Bike Sharing Dataset UCI Machine Learning Repository. Source: Fanaee-T, Hadi, Gama, Joao, ‘Event labeling combining ensemble detectors background knowledge’, Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg Next, visualize dataset plot_time_series() function. Toggle .interactive = TRUE get plotly interactive plot. FALSE returns ggplot2 static plot.","code":"# Read data bike_transactions_tbl <- bike_sharing_daily %>% select(dteday, cnt) %>% set_names(c(\"date\", \"value\")) bike_transactions_tbl ## # A tibble: 731 × 2 ## date value ## ## 1 2011-01-01 985 ## 2 2011-01-02 801 ## 3 2011-01-03 1349 ## 4 2011-01-04 1562 ## 5 2011-01-05 1600 ## 6 2011-01-06 1606 ## 7 2011-01-07 1510 ## 8 2011-01-08 959 ## 9 2011-01-09 822 ## 10 2011-01-10 1321 ## # ℹ 721 more rows bike_transactions_tbl %>% plot_time_series(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"train-test","dir":"Articles > Temp_archive","previous_headings":"","what":"Train / Test","title":"Time Series Machine Learning","text":"Next, use time_series_split() make train/test set. Setting assess = \"3 months\" tells function use last 3-months data testing set. Setting cumulative = TRUE tells sampling use prior data training set. Next, visualize train/test split. tk_time_series_cv_plan(): Converts splits object data frame plot_time_series_cv_plan(): Plots time series sampling data using “date” “value” columns.","code":"splits <- bike_transactions_tbl %>% time_series_split(assess = \"3 months\", cumulative = TRUE) splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeling","dir":"Articles > Temp_archive","previous_headings":"","what":"Modeling","title":"Time Series Machine Learning","text":"Machine learning models complex univariate models (e.g. ARIMA, Exponential Smoothing). complexity typically requires workflow (sometimes called pipeline languages). general process goes like : Create Preprocessing Recipe Create Model Specifications Use Workflow combine Model Spec Preprocessing, Fit Model","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"recipe-preprocessing-specification","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Recipe Preprocessing Specification","title":"Time Series Machine Learning","text":"first step add time series signature training set, used learn patterns. New timetk 0.1.3 integration recipes R package: recipes package allows us add preprocessing steps applied sequentially part data transformation pipeline. timetk step_timeseries_signature(), used add number features can help machine learning models. can see happens apply prepared recipe prep() using bake() function. Many new columns added timestamp “date” feature. features can use machine learning models. Next, apply various preprocessing steps improve modeling behavior. wish learn , Advanced Time Series course help learn techniques.","code":"# Add time series signature recipe_spec_timeseries <- recipe(value ~ ., data = training(splits)) %>% step_timeseries_signature(date) bake(prep(recipe_spec_timeseries), new_data = training(splits)) ## # A tibble: 641 × 29 ## date value date_index.num date_year date_year.iso date_half ## ## 1 2011-01-01 985 1293840000 2011 2010 1 ## 2 2011-01-02 801 1293926400 2011 2010 1 ## 3 2011-01-03 1349 1294012800 2011 2011 1 ## 4 2011-01-04 1562 1294099200 2011 2011 1 ## 5 2011-01-05 1600 1294185600 2011 2011 1 ## 6 2011-01-06 1606 1294272000 2011 2011 1 ## 7 2011-01-07 1510 1294358400 2011 2011 1 ## 8 2011-01-08 959 1294444800 2011 2011 1 ## 9 2011-01-09 822 1294531200 2011 2011 1 ## 10 2011-01-10 1321 1294617600 2011 2011 1 ## # ℹ 631 more rows ## # ℹ 23 more variables: date_quarter , date_month , ## # date_month.xts , date_month.lbl , date_day , ## # date_hour , date_minute , date_second , date_hour12 , ## # date_am.pm , date_wday , date_wday.xts , ## # date_wday.lbl , date_mday , date_qday , date_yday , ## # date_mweek , date_week , date_week.iso , date_week2 , … recipe_spec_final <- recipe_spec_timeseries %>% step_fourier(date, period = 365, K = 5) %>% step_rm(date) %>% step_rm(contains(\"iso\"), contains(\"minute\"), contains(\"hour\"), contains(\"am.pm\"), contains(\"xts\")) %>% step_normalize(contains(\"index.num\"), date_year) %>% step_dummy(contains(\"lbl\"), one_hot = TRUE) juice(prep(recipe_spec_final)) ## # A tibble: 641 × 47 ## value date_index.num date_year date_half date_quarter date_month date_day ## ## 1 985 -1.73 -0.869 1 1 1 1 ## 2 801 -1.72 -0.869 1 1 1 2 ## 3 1349 -1.72 -0.869 1 1 1 3 ## 4 1562 -1.71 -0.869 1 1 1 4 ## 5 1600 -1.71 -0.869 1 1 1 5 ## 6 1606 -1.70 -0.869 1 1 1 6 ## 7 1510 -1.70 -0.869 1 1 1 7 ## 8 959 -1.69 -0.869 1 1 1 8 ## 9 822 -1.68 -0.869 1 1 1 9 ## 10 1321 -1.68 -0.869 1 1 1 10 ## # ℹ 631 more rows ## # ℹ 40 more variables: date_second , date_wday , date_mday , ## # date_qday , date_yday , date_mweek , date_week , ## # date_week2 , date_week3 , date_week4 , date_mday7 , ## # date_sin365_K1 , date_cos365_K1 , date_sin365_K2 , ## # date_cos365_K2 , date_sin365_K3 , date_cos365_K3 , ## # date_sin365_K4 , date_cos365_K4 , date_sin365_K5 , …"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"model-specification","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Model Specification","title":"Time Series Machine Learning","text":"Next, let’s create model specification. ’ll use lm.","code":"model_spec_lm <- linear_reg(mode = \"regression\") %>% set_engine(\"lm\")"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"workflow","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Workflow","title":"Time Series Machine Learning","text":"can mary preprocessing recipe model using workflow().","code":"workflow_lm <- workflow() %>% add_recipe(recipe_spec_final) %>% add_model(model_spec_lm) workflow_lm ## ══ Workflow ════════════════════════════════════════════════════════════════════ ## Preprocessor: Recipe ## Model: linear_reg() ## ## ── Preprocessor ──────────────────────────────────────────────────────────────── ## 6 Recipe Steps ## ## • step_timeseries_signature() ## • step_fourier() ## • step_rm() ## • step_rm() ## • step_normalize() ## • step_dummy() ## ## ── Model ─────────────────────────────────────────────────────────────────────── ## Linear Regression Model Specification (regression) ## ## Computational engine: lm"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"training","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Training","title":"Time Series Machine Learning","text":"workflow can trained fit() function.","code":"workflow_fit_lm <- workflow_lm %>% fit(data = training(splits))"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"hyperparameter-tuning","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Hyperparameter Tuning","title":"Time Series Machine Learning","text":"Linear regression parameters. Therefore, step needed. complex models hyperparameters require tuning. Algorithms include: Elastic Net XGBoost Random Forest Support Vector Machine (SVM) K-Nearest Neighbors Multivariate Adaptive Regression Spines (MARS) like learn tune models time series, join waitlist advanced Time Series Analysis & Forecasting Course.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecasting-with-modeltime","dir":"Articles > Temp_archive","previous_headings":"","what":"Forecasting with Modeltime","title":"Time Series Machine Learning","text":"Modeltime Workflow designed speed model evaluation selection. Now several time series models, let’s analyze forecast future modeltime package.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeltime-table","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Modeltime Table","title":"Time Series Machine Learning","text":"Modeltime Table organizes models IDs creates generic descriptions help us keep track models. Let’s add models modeltime_table().","code":"model_table <- modeltime_table( workflow_fit_lm ) model_table ## # Modeltime Table ## # A tibble: 1 × 3 ## .model_id .model .model_desc ## ## 1 1 LM"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"calibration","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Calibration","title":"Time Series Machine Learning","text":"Model Calibration used quantify error estimate confidence intervals. ’ll perform model calibration --sample data (aka. Testing Set) modeltime_calibrate() function. Two new columns generated (“.type” “.calibration_data”), important “.calibration_data”. includes actual values, fitted values, residuals testing set.","code":"calibration_table <- model_table %>% modeltime_calibrate(testing(splits)) calibration_table ## # Modeltime Table ## # A tibble: 1 × 5 ## .model_id .model .model_desc .type .calibration_data ## ## 1 1 LM Test "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecast-testing-set","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime > Calibration","what":"Forecast (Testing Set)","title":"Time Series Machine Learning","text":"calibrated data, can visualize testing predictions (forecast). Use modeltime_forecast() generate forecast data testing set tibble. Use plot_modeltime_forecast() visualize results interactive static plot formats.","code":"calibration_table %>% modeltime_forecast(actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"accuracy-testing-set","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime > Calibration","what":"Accuracy (Testing Set)","title":"Time Series Machine Learning","text":"Next, calculate testing accuracy compare models. Use modeltime_accuracy() generate --sample accuracy metrics tibble. Use table_modeltime_accuracy() generate interactive static","code":"calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"refit-and-forecast-forward","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Refit and Forecast Forward","title":"Time Series Machine Learning","text":"Refitting best-practice forecasting future. modeltime_refit(): re-train full data (bike_transactions_tbl) modeltime_forecast(): models depend “date” feature, can use h (horizon) forecast forward. Setting h = \"12 months\" forecasts next 12-months data.","code":"calibration_table %>% modeltime_refit(bike_transactions_tbl) %>% modeltime_forecast(h = \"12 months\", actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Summary","title":"Time Series Machine Learning","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Feature Engineering Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"take-the-high-performance-forecasting-course","dir":"Articles > Temp_archive","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Time Series Machine Learning","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"time-series-is-changing","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Time Series Machine Learning","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Time Series Machine Learning","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Visualizing Time Series","text":"Run following code setup tutorial.","code":"library(dplyr) library(ggplot2) library(lubridate) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- FALSE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"plotting-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Plotting Time Series","title":"Visualizing Time Series","text":"Let’s start popular time series, taylor_30_min, includes energy demand megawatts sampling interval 30-minutes. single time series. plot_time_series() function generates interactive plotly chart default. Simply provide date variable (time-based column, .date_var) numeric variable (.value) changes time first 2 arguments .interactive = TRUE, .plotly_slider = TRUE adds date slider bottom chart.","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows taylor_30_min %>% plot_time_series(date, value, .interactive = interactive, .plotly_slider = TRUE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"plotting-groups","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Plotting Groups","title":"Visualizing Time Series","text":"Next, let’s move dataset time series groups, m4_daily, sample 4 time series M4 competition sampled daily frequency. Visualizing grouped data simple grouping data set group_by() prior piping plot_time_series() function. Key points: Groups can added 2 ways: group_by() using ... add groups. Groups converted facets. .facet_ncol = 2 returns 2-column faceted plot .facet_scales = \"free\" allows x y-axis plot scale independently plots","code":"m4_daily %>% group_by(id) #> # A tibble: 9,743 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows m4_daily %>% group_by(id) %>% plot_time_series(date, value, .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"visualizing-transformations-sub-groups","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Visualizing Transformations & Sub-Groups","title":"Visualizing Time Series","text":"Let’s switch hourly dataset multiple groups. can showcase: Log transformation .value Use .color_var highlight sub-groups. intent showcase groups faceted plots, highlight weekly windows (sub-groups) within data simultaneously log() transformation value. simple : .value = log(value) Applies Log Transformation .color_var = week(date) date column transformed lubridate::week() number. color applied week numbers.","code":"m4_hourly %>% group_by(id) #> # A tibble: 3,060 × 3 #> # Groups: id [4] #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows m4_hourly %>% group_by(id) %>% plot_time_series(date, log(value), # Apply a Log Transformation .color_var = week(date), # Color applied to Week transformation # Facet formatting .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"static-ggplot2-visualizations-customizations","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Static ggplot2 Visualizations & Customizations","title":"Visualizing Time Series","text":"visualizations can converted interactive plotly (great exploring shiny apps) static ggplot2 visualizations (great reports).","code":"taylor_30_min %>% plot_time_series(date, value, .color_var = month(date, label = TRUE), # Returns static ggplot .interactive = FALSE, # Customization .title = \"Taylor's MegaWatt Data\", .x_lab = \"Date (30-min intervals)\", .y_lab = \"Energy Demand (MW)\", .color_lab = \"Month\") + scale_y_continuous(labels = scales::comma_format())"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"box-plots-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Box Plots (Time Series)","title":"Visualizing Time Series","text":"plot_time_series_boxplot() function can used make box plots. Box plots use aggregation, key parameter defined .period argument.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_boxplot( date, value, .period = \"1 year\", .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"regression-plots-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Regression Plots (Time Series)","title":"Visualizing Time Series","text":"time series regression plot, plot_time_series_regression(), can useful quickly assess key features correlated time series. Internally function passes formula stats::lm() function. linear regression summary can output toggling show_summary = TRUE.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE, .show_summary = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Summary","title":"Visualizing Time Series","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"take-the-high-performance-forecasting-course","dir":"Articles > Temp_archive","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Visualizing Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"time-series-is-changing","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Visualizing Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Visualizing Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Plotting Seasonality and Correlation","text":"Run following code set tutorial.","code":"library(dplyr) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- TRUE"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-acf-diagnostics","dir":"Articles > Temp_archive","previous_headings":"Correlation Plots","what":"Grouped ACF Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = interactive )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-ccf-plots","dir":"Articles > Temp_archive","previous_headings":"Correlation Plots","what":"Grouped CCF Plots","title":"Plotting Seasonality and Correlation","text":"","code":"walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = interactive )"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"seasonal-visualizations","dir":"Articles > Temp_archive","previous_headings":"Seasonality","what":"Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-seasonal-visualizations","dir":"Articles > Temp_archive","previous_headings":"Seasonality","what":"Grouped Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"stl-diagnostics","dir":"Articles > Temp_archive","previous_headings":"","what":"STL Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .frequency = \"auto\", .trend = \"auto\", .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Plotting Seasonality and Correlation","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Frequency and Trend Selection","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Frequency and Trend Selection","text":"Daily Irregular Data daily stock prices Facebook 2013 2016. Note trading days occur “business days” (non-weekends non-business-holidays). Sub-Daily Data Taylor’s Energy Demand data 30-minute timestamp interval.","code":"data(FANG) FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows taylor_30_min ## # A tibble: 4,032 × 2 ## date value ## ## 1 2000-06-05 00:00:00 22262 ## 2 2000-06-05 00:30:00 21756 ## 3 2000-06-05 01:00:00 22247 ## 4 2000-06-05 01:30:00 22759 ## 5 2000-06-05 02:00:00 22549 ## 6 2000-06-05 02:30:00 22313 ## 7 2000-06-05 03:00:00 22128 ## 8 2000-06-05 03:30:00 21860 ## 9 2000-06-05 04:00:00 21751 ## 10 2000-06-05 04:30:00 21336 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"applications","dir":"Articles > Temp_archive","previous_headings":"","what":"Applications","title":"Frequency and Trend Selection","text":"example automatic frequency detection occurs plot_stl_diagnostics() function.","code":"taylor_30_min %>% plot_stl_diagnostics(date, value, .frequency = \"auto\", .trend = \"auto\", .interactive = FALSE) ## frequency = 48 observations per 1 day ## trend = 672 observations per 14 days"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"specifying-a-frequency-or-trend","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Specifying a Frequency or Trend","title":"Frequency and Trend Selection","text":"period argument three basic options returning frequency. Options include: “auto”: target frequency determined using pre-defined Time Scale Template (see ). time-based duration: (e.g. “7 days” “2 quarters” per cycle) numeric number observations: (e.g. 5 5 observations per cycle)","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"frequency","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Frequency","title":"Frequency and Trend Selection","text":"frequency loosely defined number observations comprise cycle data set. Using tk_get_frequency(), can pick number observations roughly define frequency series. Daily Irregular Data FB_tbl irregular (weekends holidays present), frequency selected weekly week 5-days typically. 5 selected. Sub-Daily Data works well sub-daily time series. ’ll use taylor_30_min 30-minute timestamp series. frequency selected 48 48 timestamps (observations) 1 day 30-minute cycle.","code":"FB_tbl %>% tk_index() %>% tk_get_frequency(period = \"auto\") ## frequency = 5 observations per 1 week ## [1] 5 taylor_30_min %>% tk_index() %>% tk_get_frequency(\"1 day\") ## frequency = 48 observations per 1 day ## [1] 48"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"trend","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Trend","title":"Frequency and Trend Selection","text":"trend loosely defined time span can aggregated across visualize central tendency data. Using tk_get_trend(), can pick number observations help describe trend data. Daily Irregular Data FB_tbl irregular (weekends holidays present), trend selected 3 months week 5-days typically. 64 observations selected. Sub-Daily Data 14-day (2 week) interval selected “30-minute” interval data.","code":"FB_tbl %>% tk_index() %>% tk_get_trend(period = \"auto\") ## trend = 64 observations per 3 months ## [1] 64 taylor_30_min %>% tk_index() %>% tk_get_trend(\"auto\") ## trend = 672 observations per 14 days ## [1] 672"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"time-scale-template","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Scale Template","title":"Frequency and Trend Selection","text":"Time-Scale Template used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Accessing Default Template can access current template get_tk_time_scale_template(). Changing Default Template can modify current template set_tk_time_scale_template().","code":"get_tk_time_scale_template() ## # A tibble: 8 × 3 ## time_scale frequency trend ## ## 1 second 1 hour 12 hours ## 2 minute 1 day 14 days ## 3 hour 1 day 1 month ## 4 day 1 week 3 months ## 5 week 1 quarter 1 year ## 6 month 1 year 5 years ## 7 quarter 1 year 10 years ## 8 year 5 years 30 years"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Frequency and Trend Selection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Time Series Data Wrangling","text":"Load following libraries.","code":"library(dplyr) library(tidyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Data Wrangling","text":"tutorial use FANG dataset: Daily Irregular (missing business holidays weekends) 4 groups (FB, AMZN, NFLX, GOOG). adjusted column contains adjusted closing prices day. volume column contains trade volume (number times stock transacted) day.","code":"FANG ## # A tibble: 4,032 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 4,022 more rows FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) FANG %>% group_by(symbol) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"summarize-by-time","dir":"Articles > Temp_archive","previous_headings":"","what":"Summarize by Time","title":"Time Series Data Wrangling","text":"summarise_by_time() aggregates period. ’s great : Period Aggregation - sum() Period Smoothing - mean(), first(), last()","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"period-summarization","dir":"Articles > Temp_archive","previous_headings":"Summarize by Time","what":"Period Summarization","title":"Time Series Data Wrangling","text":"Objective: Get total trade volume quarter Use sum() Aggregate using .= \"quarter\"","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"quarter\", volume = sum(volume) ) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE, .y_intercept = 0)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"period-smoothing","dir":"Articles > Temp_archive","previous_headings":"Summarize by Time","what":"Period Smoothing","title":"Time Series Data Wrangling","text":"Objective: Get first value month can use first() get first value, effect reducing data (.e. smoothing). use mean() median(). Use summarization time: .= \"month\" aggregate month.","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"month\", adjusted = first(adjusted) ) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"filter-by-time","dir":"Articles > Temp_archive","previous_headings":"","what":"Filter By Time","title":"Time Series Data Wrangling","text":"Used quickly filter continuous time range.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"time-range-filtering","dir":"Articles > Temp_archive","previous_headings":"Filter By Time","what":"Time Range Filtering","title":"Time Series Data Wrangling","text":"Objective: Get adjusted stock prices 3rd quarter 2013. .start_date = \"2013-09\": Converts “2013-09-01 .end_date = \"2013\": Converts “2013-12-31 advanced example filtering using %+time %-time shown “Padding Data: Low High Frequency”.","code":"FANG %>% group_by(symbol) %>% filter_by_time(date, \"2013-09\", \"2013\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"padding-data","dir":"Articles > Temp_archive","previous_headings":"","what":"Padding Data","title":"Time Series Data Wrangling","text":"Used fill (pad) gaps go low frequency high frequency. function uses awesome padr library filling expanding timestamps.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"fill-in-gaps","dir":"Articles > Temp_archive","previous_headings":"Padding Data","what":"Fill in Gaps","title":"Time Series Data Wrangling","text":"Objective: Make irregular series regular. leave padded values NA. can add value using .pad_value can impute using function like ts_impute_vec() (shown next).","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"auto\") # Guesses .by = \"day\" ## pad applied on the interval: day ## # A tibble: 5,836 × 8 ## # Groups: symbol [4] ## symbol date open high low close volume adjusted ## ## 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. ## 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. ## 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. ## 4 AMZN 2013-01-05 NA NA NA NA NA NA ## 5 AMZN 2013-01-06 NA NA NA NA NA NA ## 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. ## 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. ## 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. ## 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. ## 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. ## # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"low-to-high-frequency","dir":"Articles > Temp_archive","previous_headings":"Padding Data","what":"Low to High Frequency","title":"Time Series Data Wrangling","text":"Objective: Go Daily Hourly timestamp intervals 1 month start date. Impute missing values. .= \"hour\" pads daily hourly Imputation hourly data accomplished ts_impute_vec(), performs linear interpolation period = 1. “start”: special keyword signals start series FIRST(date) %+time% \"1 month\": Selecting first date sequence using special infix operation, %+time%, called “add time”. case add “1 month”.","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"hour\") %>% mutate_at(vars(open:adjusted), .funs = ts_impute_vec, period = 1) %>% filter_by_time(date, \"start\", first(date) %+time% \"1 month\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"sliding-rolling-calculations","dir":"Articles > Temp_archive","previous_headings":"","what":"Sliding (Rolling) Calculations","title":"Time Series Data Wrangling","text":"new function, slidify() turns function sliding (rolling) window function. takes concepts tibbletime::rollify() improves R package slider.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"rolling-mean","dir":"Articles > Temp_archive","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Mean","title":"Time Series Data Wrangling","text":"Objective: Calculate “centered” simple rolling average partial window rolling start end windows. slidify() turns mean() function rolling average. simple rolling calculations (rolling average), can accomplish operation faster slidify_vec() - vectorized rolling function simple summary rolls (e.g. mean(), sd(), sum(), etc)","code":"# Make the rolling function roll_avg_30 <- slidify(.f = mean, .period = 30, .align = \"center\", .partial = TRUE) # Apply the rolling function FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply Sliding Function mutate(rolling_avg_30 = roll_avg_30(adjusted)) %>% pivot_longer(cols = c(adjusted, rolling_avg_30)) %>% plot_time_series(date, value, .color_var = name, .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE) FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply roll apply Function mutate(rolling_avg_30 = slidify_vec(adjusted, ~ mean(.), .period = 30, .partial = TRUE)) ## # A tibble: 4,032 × 4 ## # Groups: symbol [4] ## symbol date adjusted rolling_avg_30 ## ## 1 FB 2013-01-02 28 30.0 ## 2 FB 2013-01-03 27.8 30.1 ## 3 FB 2013-01-04 28.8 30.2 ## 4 FB 2013-01-07 29.4 30.2 ## 5 FB 2013-01-08 29.1 30.3 ## 6 FB 2013-01-09 30.6 30.3 ## 7 FB 2013-01-10 31.3 30.3 ## 8 FB 2013-01-11 31.7 30.2 ## 9 FB 2013-01-14 31.0 30.1 ## 10 FB 2013-01-15 30.1 30.1 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"rolling-regression","dir":"Articles > Temp_archive","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Regression","title":"Time Series Data Wrangling","text":"Objective: Calculate rolling regression. complex sliding (rolling) calculation requires multiple columns involved. slidify() built . Use multi-variable purrr ..1, ..2, ..3, etc notation setup function","code":"# Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~ lm(..1 ~ ..2 + ..3), .period = 90, .unlist = FALSE, .align = \"right\") FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% mutate(numeric_date = as.numeric(date)) %>% # Apply rolling regression mutate(rolling_lm = lm_roll(adjusted, volume, numeric_date)) %>% filter(!is.na(rolling_lm)) ## # A tibble: 3,676 × 6 ## # Groups: symbol [4] ## symbol date adjusted volume numeric_date rolling_lm ## ## 1 FB 2013-05-10 26.7 30847100 15835 ## 2 FB 2013-05-13 26.8 29068800 15838 ## 3 FB 2013-05-14 27.1 24930300 15839 ## 4 FB 2013-05-15 26.6 30299800 15840 ## 5 FB 2013-05-16 26.1 35499100 15841 ## 6 FB 2013-05-17 26.2 29462700 15842 ## 7 FB 2013-05-20 25.8 42402900 15845 ## 8 FB 2013-05-21 25.7 26261300 15846 ## 9 FB 2013-05-22 25.2 45314500 15847 ## 10 FB 2013-05-23 25.1 37663100 15848 ## # ℹ 3,666 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Data Wrangling","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Anomaly Detection","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"anomaly-visualization","dir":"Articles > Temp_archive","previous_headings":"","what":"Anomaly Visualization","title":"Anomaly Detection","text":"Using plot_anomaly_diagnostics() function, can interactively detect anomalies scale.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"automatic-anomaly-detection","dir":"Articles > Temp_archive","previous_headings":"","what":"Automatic Anomaly Detection","title":"Anomaly Detection","text":"get data anomalies, use tk_anomaly_diagnostics(), preprocessing function.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) ## # A tibble: 1,001 × 13 ## # Groups: Store, Dept [7] ## Store Dept Date observed season trend remainder seasadj remainder_l1 ## ## 1 1 1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. ## 2 1 1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. ## 3 1 1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. ## 4 1 1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. ## 5 1 1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. ## 6 1 1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. ## 7 1 1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. ## 8 1 1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. ## 9 1 1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. ## 10 1 1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. ## # ℹ 991 more rows ## # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , ## # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Anomaly Detection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Time Series Clustering","text":"get started, load following libraries.","code":"library(dplyr) library(purrr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Clustering","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"ts-features","dir":"Articles > Temp_archive","previous_headings":"","what":"TS Features","title":"Time Series Clustering","text":"Using tk_tsfeatures() function, can quickly get “tsfeatures” time series. important points: features parameter come tsfeatures R package. Use one function names tsfeatures R package e.g.(“lumpiness”, “stl_features”). can supply function returns aggregation (e.g. “mean” apply base::mean() function). can supply custom functions creating function providing (e.g. my_mean() defined )","code":"# Custom Function my_mean <- function(x, na.rm=TRUE) { mean(x, na.rm = na.rm) } tsfeature_tbl <- walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"my_mean\"), .scale = TRUE, .prefix = \"ts_\" ) %>% ungroup() tsfeature_tbl ## # A tibble: 7 × 22 ## id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 1_1 52 1 52 0.000670 0.0000280 ## 2 1_3 52 1 52 0.0614 0.00000987 ## 3 1_8 52 1 52 0.756 0.00000195 ## 4 1_13 52 1 52 0.354 0.00000475 ## 5 1_38 52 1 52 0.425 0.0000179 ## 6 1_93 52 1 52 0.791 0.000000754 ## 7 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"clustering-with-k-means","dir":"Articles > Temp_archive","previous_headings":"","what":"Clustering with K-Means","title":"Time Series Clustering","text":"can quickly add cluster assignments kmeans() function tidyverse data wrangling.","code":"set.seed(123) cluster_tbl <- tibble( cluster = tsfeature_tbl %>% select(-id) %>% as.matrix() %>% kmeans(centers = 3, nstart = 100) %>% pluck(\"cluster\") ) %>% bind_cols( tsfeature_tbl ) cluster_tbl ## # A tibble: 7 × 23 ## cluster id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 2 1_1 52 1 52 0.000670 0.0000280 ## 2 2 1_3 52 1 52 0.0614 0.00000987 ## 3 2 1_8 52 1 52 0.756 0.00000195 ## 4 1 1_13 52 1 52 0.354 0.00000475 ## 5 3 1_38 52 1 52 0.425 0.0000179 ## 6 3 1_93 52 1 52 0.791 0.000000754 ## 7 1 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"visualize-the-cluster-assignments","dir":"Articles > Temp_archive","previous_headings":"","what":"Visualize the Cluster Assignments","title":"Time Series Clustering","text":"Finally, can visualize cluster assignments joining cluster_tbl original walmart_sales_weekly plotting plot_time_series().","code":"cluster_tbl %>% select(cluster, id) %>% right_join(walmart_sales_weekly, by = \"id\") %>% group_by(id) %>% plot_time_series( Date, Weekly_Sales, .color_var = cluster, .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Clustering","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Matt Dancho. Author, maintainer. Davis Vaughan. Author.","code":""},{"path":"https://business-science.github.io/timetk/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Dancho M, Vaughan D (2023). timetk: Tool Kit Working Time Series. https://github.com/business-science/timetk, https://business-science.github.io/timetk/.","code":"@Manual{, title = {timetk: A Tool Kit for Working with Time Series}, author = {Matt Dancho and Davis Vaughan}, year = {2023}, note = {https://github.com/business-science/timetk, https://business-science.github.io/timetk/}, }"},{"path":"https://business-science.github.io/timetk/index.html","id":"timetk","dir":"","previous_headings":"","what":"A Tool Kit for Working with Time Series","title":"A Tool Kit for Working with Time Series","text":"Time series analysis tidyverse","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"A Tool Kit for Working with Time Series","text":"Download development version latest features: , download CRAN approved version:","code":"remotes::install_github(\"business-science/timetk\") install.packages(\"timetk\")"},{"path":"https://business-science.github.io/timetk/index.html","id":"package-functionality","dir":"","previous_headings":"","what":"Package Functionality","title":"A Tool Kit for Working with Time Series","text":"many R packages working Time Series data. ’s timetk compares “tidy” time series R packages data visualization, wrangling, feature engineeering (leverage data frames tibbles).","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"getting-started","dir":"","previous_headings":"","what":"Getting Started","title":"A Tool Kit for Working with Time Series","text":"Visualizing Time Series Wrangling Time Series Full Time Series Machine Learning Feature Engineering Tutorial API Documentation articles complete list function references.","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"summary","dir":"","previous_headings":"","what":"Summary","title":"A Tool Kit for Working with Time Series","text":"Timetk amazing package part modeltime ecosystem time series analysis forecasting. forecasting system extensive, can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"take-the-high-performance-forecasting-course","dir":"","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"A Tool Kit for Working with Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"time-series-is-changing","dir":"","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"A Tool Kit for Working with Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"A Tool Kit for Working with Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"acknowledgements","dir":"","previous_headings":"","what":"Acknowledgements","title":"A Tool Kit for Working with Time Series","text":"timetk package wouldn’t possible without amazing time series packages. plot_acf_diagnostics(): Leverages stats::acf(), stats::pacf() & stats::ccf() plot_stl_diagnostics(): Leverages stats::stl() Add Subtract Time (%+time% & %-time%): \"2012-01-01\" %+time% \"1 month 4 days\" uses lubridate intelligently offset day xts: Used calculate periodicity fast lag automation. ts_impute_vec() function low-level vectorized imputation using STL + Linear Interpolation uses na.interp() hood. ts_clean_vec() function low-level vectorized imputation using STL + Linear Interpolation uses tsclean() hood. Box Cox transformation auto_lambda() uses BoxCox.Lambda(). tk_make_timeseries() - Extends seq.Date() seq.POSIXt() using simple phase like “2012-02” populate entire time series start finish February 2012. filter_by_time(), between_time() - Uses innovative endpoint detection phrases like “2012” slidify() basically rollify() using slider (see ). slidify() uses slider::pslide hood. slidify_vec() uses slider::slide_vec() simple vectorized rolls (slides). pad_by_time() function wrapper padr::pad(). See step_ts_pad() apply padding preprocessing recipe! TSstudio: best interactive time series visualization tool . leverages ts system, system forecast R package uses. ton inspiration visuals came using TSstudio.","code":""},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":null,"dir":"Reference","previous_headings":"","what":"Stock prices for the ","title":"Stock prices for the ","text":"dataset containing daily historical stock prices \"FANG\" tech stocks, \"FB\", \"AMZN\", \"NFLX\", \"GOOG\", spanning beginning 2013 end 2016.","code":""},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Stock prices for the ","text":"","code":"FANG"},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Stock prices for the ","text":"\"tibble\" (\"tidy\" data frame) 4,032 rows 8 variables: symbol stock ticker symbol date trade date open stock price open trading, USD high stock price highest point trading, USD low stock price lowest point trading, USD close stock price close trading, USD volume number shares traded adjusted stock price close trading adjusted stock splits, USD","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Between (For Time Series): Range detection for date or date-time sequences — between_time","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"easiest way filter time series date date-time vectors. Returns logical vector indicating date date-time values within range. See filter_by_time() data.frame (tibble) implementation.","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"","code":"between_time(index, start_date = \"start\", end_date = \"end\")"},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"index date date-time vector. start_date starting date end_date ending date","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"logical vector length index indicating whether timestamp value within start_date end_date range.","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"Pure Time Series Filtering Flexibilty start_date end_date parameters designed flexibility mind. side time_formula specified character 'YYYY-MM-DD HH:MM:SS', powerful shorthand available. examples : Year: start_date = '2013', end_date = '2015' Month: start_date = '2013-01', end_date = '2016-06' Day: start_date = '2013-01-05', end_date = '2016-06-04' Second: start_date = '2013-01-05 10:22:15', end_date = '2018-06-03 12:14:22' Variations: start_date = '2013', end_date = '2016-06' Key Words: \"start\" \"end\" Use keywords \"start\" \"end\" shorthand, instead specifying actual start end values. examples: Start series end 2015: start_date = 'start', end_date = '2015' Start 2014 end series: start_date = '2014', end_date = 'end' Internal Calculations shorthand dates expanded: start_date expanded first date period end_date side expanded last date period means following examples equivalent (assuming index POSIXct): start_date = '2015' equivalent start_date = '2015-01-01 + 00:00:00' end_date = '2016' equivalent 2016-12-31 + 23:59:59'","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"function based tibbletime::filter_time() function developed Davis Vaughan.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"","code":"library(dplyr) #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union library(timetk) index_daily <- tk_make_timeseries(\"2016-01-01\", \"2017-01-01\", by = \"day\") index_min <- tk_make_timeseries(\"2016-01-01\", \"2017-01-01\", by = \"min\") # How it works # - Returns TRUE/FALSE length of index # - Use sum() to tally the number of TRUE values index_daily %>% between_time(\"start\", \"2016-01\") %>% sum() #> [1] 31 # ---- INDEX SLICING ---- # Daily Series: Month of January 2016 index_daily[index_daily %>% between_time(\"start\", \"2016-01\")] #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" #> [6] \"2016-01-06\" \"2016-01-07\" \"2016-01-08\" \"2016-01-09\" \"2016-01-10\" #> [11] \"2016-01-11\" \"2016-01-12\" \"2016-01-13\" \"2016-01-14\" \"2016-01-15\" #> [16] \"2016-01-16\" \"2016-01-17\" \"2016-01-18\" \"2016-01-19\" \"2016-01-20\" #> [21] \"2016-01-21\" \"2016-01-22\" \"2016-01-23\" \"2016-01-24\" \"2016-01-25\" #> [26] \"2016-01-26\" \"2016-01-27\" \"2016-01-28\" \"2016-01-29\" \"2016-01-30\" #> [31] \"2016-01-31\" # Daily Series: March 1st - June 15th, 2016 index_daily[index_daily %>% between_time(\"2016-03\", \"2016-06-15\")] #> [1] \"2016-03-01\" \"2016-03-02\" \"2016-03-03\" \"2016-03-04\" \"2016-03-05\" #> [6] \"2016-03-06\" \"2016-03-07\" \"2016-03-08\" \"2016-03-09\" \"2016-03-10\" #> [11] \"2016-03-11\" \"2016-03-12\" \"2016-03-13\" \"2016-03-14\" \"2016-03-15\" #> [16] \"2016-03-16\" \"2016-03-17\" \"2016-03-18\" \"2016-03-19\" \"2016-03-20\" #> [21] \"2016-03-21\" \"2016-03-22\" \"2016-03-23\" \"2016-03-24\" \"2016-03-25\" #> [26] \"2016-03-26\" \"2016-03-27\" \"2016-03-28\" \"2016-03-29\" \"2016-03-30\" #> [31] \"2016-03-31\" \"2016-04-01\" \"2016-04-02\" \"2016-04-03\" \"2016-04-04\" #> [36] \"2016-04-05\" \"2016-04-06\" \"2016-04-07\" \"2016-04-08\" \"2016-04-09\" #> [41] \"2016-04-10\" \"2016-04-11\" \"2016-04-12\" \"2016-04-13\" \"2016-04-14\" #> [46] \"2016-04-15\" \"2016-04-16\" \"2016-04-17\" \"2016-04-18\" \"2016-04-19\" #> [51] \"2016-04-20\" \"2016-04-21\" \"2016-04-22\" \"2016-04-23\" \"2016-04-24\" #> [56] \"2016-04-25\" \"2016-04-26\" \"2016-04-27\" \"2016-04-28\" \"2016-04-29\" #> [61] \"2016-04-30\" \"2016-05-01\" \"2016-05-02\" \"2016-05-03\" \"2016-05-04\" #> [66] \"2016-05-05\" \"2016-05-06\" \"2016-05-07\" \"2016-05-08\" \"2016-05-09\" #> [71] \"2016-05-10\" \"2016-05-11\" \"2016-05-12\" \"2016-05-13\" \"2016-05-14\" #> [76] \"2016-05-15\" \"2016-05-16\" \"2016-05-17\" \"2016-05-18\" \"2016-05-19\" #> [81] \"2016-05-20\" \"2016-05-21\" \"2016-05-22\" \"2016-05-23\" \"2016-05-24\" #> [86] \"2016-05-25\" \"2016-05-26\" \"2016-05-27\" \"2016-05-28\" \"2016-05-29\" #> [91] \"2016-05-30\" \"2016-05-31\" \"2016-06-01\" \"2016-06-02\" \"2016-06-03\" #> [96] \"2016-06-04\" \"2016-06-05\" \"2016-06-06\" \"2016-06-07\" \"2016-06-08\" #> [101] \"2016-06-09\" \"2016-06-10\" \"2016-06-11\" \"2016-06-12\" \"2016-06-13\" #> [106] \"2016-06-14\" \"2016-06-15\" # Minute Series: index_min[index_min %>% between_time(\"2016-02-01 12:00\", \"2016-02-01 13:00\")] #> [1] \"2016-02-01 12:00:00 UTC\" \"2016-02-01 12:01:00 UTC\" #> [3] \"2016-02-01 12:02:00 UTC\" \"2016-02-01 12:03:00 UTC\" #> [5] \"2016-02-01 12:04:00 UTC\" \"2016-02-01 12:05:00 UTC\" #> [7] \"2016-02-01 12:06:00 UTC\" \"2016-02-01 12:07:00 UTC\" #> [9] \"2016-02-01 12:08:00 UTC\" \"2016-02-01 12:09:00 UTC\" #> [11] \"2016-02-01 12:10:00 UTC\" \"2016-02-01 12:11:00 UTC\" #> [13] \"2016-02-01 12:12:00 UTC\" \"2016-02-01 12:13:00 UTC\" #> [15] \"2016-02-01 12:14:00 UTC\" \"2016-02-01 12:15:00 UTC\" #> [17] \"2016-02-01 12:16:00 UTC\" \"2016-02-01 12:17:00 UTC\" #> [19] \"2016-02-01 12:18:00 UTC\" \"2016-02-01 12:19:00 UTC\" #> [21] \"2016-02-01 12:20:00 UTC\" \"2016-02-01 12:21:00 UTC\" #> [23] \"2016-02-01 12:22:00 UTC\" \"2016-02-01 12:23:00 UTC\" #> [25] \"2016-02-01 12:24:00 UTC\" \"2016-02-01 12:25:00 UTC\" #> [27] \"2016-02-01 12:26:00 UTC\" \"2016-02-01 12:27:00 UTC\" #> [29] \"2016-02-01 12:28:00 UTC\" \"2016-02-01 12:29:00 UTC\" #> [31] \"2016-02-01 12:30:00 UTC\" \"2016-02-01 12:31:00 UTC\" #> [33] \"2016-02-01 12:32:00 UTC\" \"2016-02-01 12:33:00 UTC\" #> [35] \"2016-02-01 12:34:00 UTC\" \"2016-02-01 12:35:00 UTC\" #> [37] \"2016-02-01 12:36:00 UTC\" \"2016-02-01 12:37:00 UTC\" #> [39] \"2016-02-01 12:38:00 UTC\" \"2016-02-01 12:39:00 UTC\" #> [41] \"2016-02-01 12:40:00 UTC\" \"2016-02-01 12:41:00 UTC\" #> [43] \"2016-02-01 12:42:00 UTC\" \"2016-02-01 12:43:00 UTC\" #> [45] \"2016-02-01 12:44:00 UTC\" \"2016-02-01 12:45:00 UTC\" #> [47] \"2016-02-01 12:46:00 UTC\" \"2016-02-01 12:47:00 UTC\" #> [49] \"2016-02-01 12:48:00 UTC\" \"2016-02-01 12:49:00 UTC\" #> [51] \"2016-02-01 12:50:00 UTC\" \"2016-02-01 12:51:00 UTC\" #> [53] \"2016-02-01 12:52:00 UTC\" \"2016-02-01 12:53:00 UTC\" #> [55] \"2016-02-01 12:54:00 UTC\" \"2016-02-01 12:55:00 UTC\" #> [57] \"2016-02-01 12:56:00 UTC\" \"2016-02-01 12:57:00 UTC\" #> [59] \"2016-02-01 12:58:00 UTC\" \"2016-02-01 12:59:00 UTC\" #> [61] \"2016-02-01 13:00:00 UTC\" # ---- FILTERING WITH DPLYR ---- FANG %>% group_by(symbol) %>% filter(date %>% between_time(\"2016-01\", \"2016-01\")) #> # A tibble: 76 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 FB 2016-01-04 102. 102. 99.8 102. 37912400 102. #> 2 FB 2016-01-05 103. 104. 102. 103. 23258200 103. #> 3 FB 2016-01-06 101. 104. 101. 103. 25096200 103. #> 4 FB 2016-01-07 100. 101. 97.3 97.9 45172900 97.9 #> 5 FB 2016-01-08 99.9 100. 97.0 97.3 35402300 97.3 #> 6 FB 2016-01-11 97.9 98.6 95.4 97.5 29932400 97.5 #> 7 FB 2016-01-12 99 100. 97.6 99.4 28395400 99.4 #> 8 FB 2016-01-13 101. 101. 95.2 95.4 33410600 95.4 #> 9 FB 2016-01-14 95.8 98.9 92.4 98.4 48658600 98.4 #> 10 FB 2016-01-15 94.0 96.4 93.5 95.0 45935600 95.0 #> # ℹ 66 more rows"},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Daily Bike Sharing Data — bike_sharing_daily","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"dataset contains daily count rental bike transactions years 2011 2012 Capital bikeshare system corresponding weather seasonal information.","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"","code":"bike_sharing_daily"},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"tibble: 731 x 16 instant: record index dteday : date season : season (1:winter, 2:spring, 3:summer, 4:fall) yr : year (0: 2011, 1:2012) mnth : month ( 1 12) hr : hour (0 23) holiday : weather day holiday weekday : day week workingday : day neither weekend holiday 1, otherwise 0. weathersit : 1: Clear, clouds, Partly cloudy, Partly cloudy 2: Mist + Cloudy, Mist + Broken clouds, Mist + clouds, Mist 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog temp : Normalized temperature Celsius. values derived via (t-t_min)/(t_max-t_min), t_min=-8, t_max=+39 (hourly scale) atemp: Normalized feeling temperature Celsius. values derived via (t-t_min)/(t_max-t_min), t_min=-16, t_max=+50 (hourly scale) hum: Normalized humidity. values divided 100 (max) windspeed: Normalized wind speed. values divided 67 (max) casual: count casual users registered: count registered users cnt: count total rental bikes including casual registered","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"Fanaee-T, Hadi, Gama, Joao, 'Event labeling combining ensemble detectors background knowledge', Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg.","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"","code":"bike_sharing_daily #> # A tibble: 731 × 16 #> instant dteday season yr mnth holiday weekday workingday weathersit #> #> 1 1 2011-01-01 1 0 1 0 6 0 2 #> 2 2 2011-01-02 1 0 1 0 0 0 2 #> 3 3 2011-01-03 1 0 1 0 1 1 1 #> 4 4 2011-01-04 1 0 1 0 2 1 1 #> 5 5 2011-01-05 1 0 1 0 3 1 1 #> 6 6 2011-01-06 1 0 1 0 4 1 1 #> 7 7 2011-01-07 1 0 1 0 5 1 2 #> 8 8 2011-01-08 1 0 1 0 6 0 2 #> 9 9 2011-01-09 1 0 1 0 0 0 1 #> 10 10 2011-01-10 1 0 1 0 1 1 1 #> # ℹ 721 more rows #> # ℹ 7 more variables: temp , atemp , hum , windspeed , #> # casual , registered , cnt "},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Box Cox Transformation — box_cox_vec","title":"Box Cox Transformation — box_cox_vec","text":"mainly wrapper BoxCox transformation forecast R package. box_cox_vec() function performs transformation. box_cox_inv_vec() inverts transformation. auto_lambda() helps selecting optimal lambda value.","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Box Cox Transformation — box_cox_vec","text":"","code":"box_cox_vec(x, lambda = \"auto\", silent = FALSE) box_cox_inv_vec(x, lambda) auto_lambda( x, method = c(\"guerrero\", \"loglik\"), lambda_lower = -1, lambda_upper = 2 )"},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Box Cox Transformation — box_cox_vec","text":"x numeric vector. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection using auto_lambda(). silent Whether report automated lambda selection message. method method used automatic lambda selection. Either \"guerrero\" \"loglik\". lambda_lower lower limit automatic lambda selection lambda_upper upper limit automatic lambda selection","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Box Cox Transformation — box_cox_vec","text":"Returns numeric vector transformed.","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Box Cox Transformation — box_cox_vec","text":"Box Cox transformation power transformation commonly used reduce variance time series. Automatic Lambda Selection desired, lambda argument can selected using auto_lambda(), wrapper Forecast R Package's forecast::BoxCox.lambda() function. Use either 2 methods: \"guerrero\" - Minimizes non-seasonal variance \"loglik\" - Maximizes log-likelihood linear model fit x","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Box Cox Transformation — box_cox_vec","text":"Forecast R Package Forecasting: Principles & Practices: Transformations & Adjustments Guerrero, V.M. (1993) Time-series analysis supported power transformations. Journal Forecasting, 12, 37--48.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Box Cox Transformation — box_cox_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_bc <- box_cox_vec(d10_daily$value) #> Registered S3 method overwritten by 'quantmod': #> method from #> as.zoo.data.frame zoo #> box_cox_vec(): Using value for lambda: 1.25119350454964 value <- box_cox_inv_vec(value_bc, lambda = 1.25119350454964) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_bc = box_cox_vec(value)) #> box_cox_vec(): Using value for lambda: 1.25119350454964 #> box_cox_vec(): Using value for lambda: 0.0882021886505848 #> box_cox_vec(): Using value for lambda: 1.99992424816297 #> box_cox_vec(): Using value for lambda: 0.401716085353735 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_bc #> #> 1 D10 2014-07-03 2076. 11303. #> 2 D10 2014-07-04 2073. 11284. #> 3 D10 2014-07-05 2049. 11116. #> 4 D10 2014-07-06 2049. 11117. #> 5 D10 2014-07-07 2006. 10829. #> 6 D10 2014-07-08 2018. 10905. #> 7 D10 2014-07-09 2019. 10915. #> 8 D10 2014-07-10 2007. 10836. #> 9 D10 2014-07-11 2010 10854. #> 10 D10 2014-07-12 2002. 10796. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"Convert data.frame object daily monthly, minute data hourly, . allows user easily aggregate data less granular level taking value either beginning end period.","code":""},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"","code":"condense_period(.data, .date_var, .period = \"1 day\", .side = c(\"start\", \"end\"))"},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":".data tbl object data.frame .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period condense time series . Time units condensed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\" .side One \"start\" \"end\". Determines first observation period returned last.","code":""},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"","code":"# Libraries library(timetk) library(dplyr) # First value in each month m4_daily %>% group_by(id) %>% condense_period(.period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # Last value in each month m4_daily %>% group_by(id) %>% condense_period(.period = \"1 month\", .side = \"end\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows"},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Differencing Transformation — diff_vec","title":"Differencing Transformation — diff_vec","text":"diff_vec() applies Differencing Transformation. diff_inv_vec() inverts differencing transformation.","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Differencing Transformation — diff_vec","text":"","code":"diff_vec( x, lag = 1, difference = 1, log = FALSE, initial_values = NULL, silent = FALSE ) diff_inv_vec(x, lag = 1, difference = 1, log = FALSE, initial_values = NULL)"},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Differencing Transformation — diff_vec","text":"x numeric vector differenced inverted. lag lag (far back) included differencing calculation. difference number differences perform. 1 Difference equivalent measuring period change. 2 Differences equivalent measuring period acceleration. log log differences calculated. Note difference inversion log-difference approximate. initial_values used diff_vec_inv() operation. numeric vector initial values, used invert differences. vector original values length NA missing differences. silent Whether report initial values used invert difference message.","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Differencing Transformation — diff_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Differencing Transformation — diff_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. Difference Calculation Single differencing, diff_vec(x_t) equivalent : x_t - x_t1, subscript _t1 indicates first lag. transformation can interpereted change. Double Differencing Calculation Double differencing, diff_vec(x_t, difference = 2) equivalent : (x_t - x_t1) - (x_t - x_t1)_t1, subscript _t1 indicates first lag. transformation can interpereted acceleration. Log Difference Calculation Log differencing, diff_vec(x_t, log = TRUE) equivalent : log(x_t) - log(x_t1) = log(x_t / x_t1), x_t series x_t1 first lag. 1st difference diff_vec(difference = 1, log = TRUE) interesting property diff_vec(difference = 1, log = TRUE) %>% exp() approximately 1 + rate change.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Differencing Transformation — diff_vec","text":"","code":"library(dplyr) library(timetk) # --- USAGE ---- diff_vec(1:10, lag = 2, difference = 2) %>% diff_inv_vec(lag = 2, difference = 2, initial_values = 1:4) #> diff_vec(): Initial values: 1, 2, 3, 4 #> [1] 1 2 3 4 5 6 7 8 9 10 # --- VECTOR ---- # Get Change 1:10 %>% diff_vec() #> diff_vec(): Initial values: 1 #> [1] NA 1 1 1 1 1 1 1 1 1 # Get Acceleration 1:10 %>% diff_vec(difference = 2) #> diff_vec(): Initial values: 1, 2 #> [1] NA NA 0 0 0 0 0 0 0 0 # Get approximate rate of change 1:10 %>% diff_vec(log = TRUE) %>% exp() - 1 #> diff_vec(): Initial values: 1 #> [1] NA 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667 #> [8] 0.1428571 0.1250000 0.1111111 # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(difference = diff_vec(value, lag = 1)) %>% mutate( difference_inv = diff_inv_vec( difference, lag = 1, # Add initial value to calculate the inverse difference initial_values = value[1] ) ) #> diff_vec(): Initial values: 2076.2 #> diff_vec(): Initial values: 1821.9 #> diff_vec(): Initial values: 9109.38 #> diff_vec(): Initial values: 5647.3 #> # A tibble: 9,743 × 5 #> # Groups: id [4] #> id date value difference difference_inv #> #> 1 D10 2014-07-03 2076. NA 2076. #> 2 D10 2014-07-04 2073. -2.80 2073. #> 3 D10 2014-07-05 2049. -24.7 2049. #> 4 D10 2014-07-06 2049. 0.200 2049. #> 5 D10 2014-07-07 2006. -42.5 2006. #> 6 D10 2014-07-08 2018. 11.2 2018. #> 7 D10 2014-07-09 2019. 1.5 2019. #> 8 D10 2014-07-10 2007. -11.7 2007. #> 9 D10 2014-07-11 2010 2.60 2010 #> 10 D10 2014-07-12 2002. -8.5 2002. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Filter (for Time-Series Data) — filter_by_time","title":"Filter (for Time-Series Data) — filter_by_time","text":"easiest way filter time-based start/end ranges using shorthand timeseries notation. See filter_period() applying filter expression period (windows).","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter (for Time-Series Data) — filter_by_time","text":"","code":"filter_by_time(.data, .date_var, .start_date = \"start\", .end_date = \"end\")"},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter (for Time-Series Data) — filter_by_time","text":".data tibble time-based column. .date_var column containing date date-time values filter. missing, attempts auto-detect date column. .start_date starting date filter sequence .end_date ending date filter sequence","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Filter (for Time-Series Data) — filter_by_time","text":"Returns tibble data.frame filtered.","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter (for Time-Series Data) — filter_by_time","text":"Pure Time Series Filtering Flexibilty .start_date .end_date parameters designed flexibility mind. side time_formula specified character 'YYYY-MM-DD HH:MM:SS', powerful shorthand available. examples : Year: .start_date = '2013', .end_date = '2015' Month: .start_date = '2013-01', .end_date = '2016-06' Day: .start_date = '2013-01-05', .end_date = '2016-06-04' Second: .start_date = '2013-01-05 10:22:15', .end_date = '2018-06-03 12:14:22' Variations: .start_date = '2013', .end_date = '2016-06' Key Words: \"start\" \"end\" Use keywords \"start\" \"end\" shorthand, instead specifying actual start end values. examples: Start series end 2015: .start_date = 'start', .end_date = '2015' Start 2014 end series: .start_date = '2014', .end_date = 'end' Internal Calculations shorthand dates expanded: .start_date expanded first date period .end_date side expanded last date period means following examples equivalent (assuming index POSIXct): .start_date = '2015' equivalent .start_date = '2015-01-01 + 00:00:00' .end_date = '2016' equivalent 2016-12-31 + 23:59:59'","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Filter (for Time-Series Data) — filter_by_time","text":"function based tibbletime::filter_time() function developed Davis Vaughan.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Filter (for Time-Series Data) — filter_by_time","text":"","code":"library(dplyr) library(timetk) # Filter values in January 1st through end of February, 2013 FANG %>% group_by(symbol) %>% filter_by_time(.start_date = \"start\", .end_date = \"2013-02\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) #> .date_var is missing. Using: date"},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Apply filtering expressions inside periods (windows) — filter_period","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"Applies dplyr filtering expression inside time-based period (window). See filter_by_time() filtering continuous ranges defined start/end dates. filter_period() enables filtering expressions like: Filtering maximum value month. Filtering first date month. Filtering rows value greater monthly average","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"","code":"filter_period(.data, ..., .date_var, .period = \"1 day\")"},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Apply filtering expressions inside periods (windows) — filter_period","text":".data tbl object data.frame ... Filtering expression. Expressions return logical value, defined terms variables .data. multiple expressions included, combined & operator. rows conditions evaluate TRUE kept. .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period filter within. Time units grouped using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\"","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"","code":"# Libraries library(timetk) library(dplyr) # Max value in each month m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", value == max(value)) #> .date_var is missing. Using: date #> # A tibble: 350 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-08 2028. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-12 2155. #> 5 D10 2014-11-13 2245. #> 6 D10 2014-12-30 2345. #> 7 D10 2015-01-09 2369. #> 8 D10 2015-02-09 2341. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-13 2500. #> # ℹ 340 more rows # First date each month m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", date == first(date)) #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # All observations that are greater than a monthly average m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", value > mean(value)) #> .date_var is missing. Using: date #> # A tibble: 4,880 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 4,870 more rows"},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Fourier Series — fourier_vec","title":"Fourier Series — fourier_vec","text":"fourier_vec() calculates Fourier Series date date-time index.","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fourier Series — fourier_vec","text":"","code":"fourier_vec(x, period, K = 1, type = c(\"sin\", \"cos\"), scale_factor = NULL)"},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fourier Series — fourier_vec","text":"x date, POSIXct, yearmon, yearqtr, numeric sequence (scaled difference 1 period alignment) converted fourier series. period number observations complete one cycle. K fourier term order. type Either \"sin\" \"cos\" appropriate type fourier term. scale_factor Scale factor calculated value scales date sequences numeric sequences. user can provide different value scale factor override date scaling. Default: NULL (auto-scale).","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fourier Series — fourier_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fourier Series — fourier_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. Fourier Series Calculation internal calculation relatively straightforward: fourier(x) = sin(2 * pi * term * x) cos(2 * pi * term * x), term = K / period. Period Alignment, period period alignment sequence essential part fourier series calculation. Date, Date-Time, Zoo (yearqtr yearmon) Sequences - scaled unit difference 1. happens internally, nothing need worry . Future time series scaled appropriately. Numeric Sequences - scaled, means transform unit difference 1 x sequence increases 1. Otherwise period fourier order incorrectly calculated. solution just take sequence divide median difference values. Fourier Order, K fourier order parameter increases frequency. K = 2 doubles frequency. common time series analysis add multiple fourier orders (e.g. 1 5) account seasonalities occur faster primary seasonality. Type (Sin/Cos) type fourier series can either sin cos. common time series analysis add sin cos series.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fourier Series — fourier_vec","text":"","code":"library(tibble) library(dplyr) library(tidyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) date_sequence <- tk_make_timeseries(\"2016-01-01\", \"2016-01-31\", by = \"hour\") # --- VECTOR --- fourier_vec(date_sequence, period = 7 * 24, K = 1, type = \"sin\") #> [1] 0.7818315 0.8045978 0.8262388 0.8467242 0.8660254 0.8841154 0.9009689 #> [8] 0.9165623 0.9308737 0.9438833 0.9555728 0.9659258 0.9749279 0.9825665 #> [15] 0.9888308 0.9937122 0.9972038 0.9993007 1.0000000 0.9993007 0.9972038 #> [22] 0.9937122 0.9888308 0.9825665 0.9749279 0.9659258 0.9555728 0.9438833 #> [29] 0.9308737 0.9165623 0.9009689 0.8841154 0.8660254 0.8467242 0.8262388 #> [36] 0.8045978 0.7818315 0.7579717 0.7330519 0.7071068 0.6801727 0.6522874 #> [43] 0.6234898 0.5938202 0.5633201 0.5320321 0.5000000 0.4672686 0.4338837 #> [50] 0.3998920 #> [ reached getOption(\"max.print\") -- omitted 671 entries ] # --- MUTATE --- tibble(date = date_sequence) %>% # Add cosine series that oscilates at a 7-day period mutate( C1_7 = fourier_vec(date, period = 7*24, K = 1, type = \"cos\"), C2_7 = fourier_vec(date, period = 7*24, K = 2, type = \"cos\") ) %>% # Visualize pivot_longer(cols = contains(\"_\"), names_to = \"name\", values_to = \"value\") %>% plot_time_series( date, value, .color_var = name, .smooth = FALSE, .interactive = FALSE, .title = \"7-Day Fourier Terms\" ) options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":null,"dir":"Reference","previous_headings":"","what":"Make future time series from existing — future_frame","title":"Make future time series from existing — future_frame","text":"Make future time series existing","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make future time series from existing — future_frame","text":"","code":"future_frame( .data, .date_var, .length_out, .inspect_weekdays = FALSE, .inspect_months = FALSE, .skip_values = NULL, .insert_values = NULL, .bind_data = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make future time series from existing — future_frame","text":".data data.frame tibble .date_var date date-time variable. .length_out Number future observations. Can numeric number phrase like \"1 year\". .inspect_weekdays Uses logistic regression algorithm inspect whether certain weekdays (e.g. weekends) excluded future dates. Default FALSE. .inspect_months Uses logistic regression algorithm inspect whether certain days months (e.g. last two weeks year seasonal days) excluded future dates. Default FALSE. .skip_values vector class idx timeseries values skip. .insert_values vector class idx timeseries values insert. .bind_data Whether perform row-wise bind .data future data. Default: FALSE","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make future time series from existing — future_frame","text":"tibble extended future date, date-time timestamps.","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make future time series from existing — future_frame","text":"wrapper tk_make_future_timeseries() works data.frames. respects dplyr groups. Specifying Length Future Observations argument .length_out determines many future index observations compute. can specified : numeric value - number future observations return. number observations returned always equal value user inputs. end date can vary based number timestamps chosen. time-based phrase - duration future include (e.g. \"6 months\" \"30 minutes\"). duration defines end date observations. end date change timestamps fall within end date returned (e.g. quarterly time series return 4 quarters .length_out = \"1 year\"). number observations vary fit within end date. Weekday Month Inspection .inspect_weekdays .inspect_months arguments apply \"daily\" (scale = \"day\") data (refer tk_get_timeseries_summary() get index scale). .inspect_weekdays argument useful determining missing days week occur weekly frequency every week, every week, . recommended least 60 days use option. .inspect_months argument useful determining missing days month, quarter year; however, algorithm can inadvertently select incorrect dates pattern erratic. Skipping / Inserting Values .skip_values .insert_values arguments can used remove add values series future times. values must format idx class. .skip_values argument useful passing holidays special index values excluded future time series. .insert_values argument useful adding values back algorithm may excluded. Binding Data Rowwise binding original common added argument .bind_data perform row-wise bind future data incoming data. replaces need : Now can just :","code":"df %>% future_frame(.length_out = \"6 months\") %>% bind_rows(df, .) df %>% future_frame(.length_out = \"6 months\", .bind_data = TRUE)"},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make future time series from existing — future_frame","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # 30-min interval data taylor_30_min %>% future_frame(date, .length_out = \"1 week\") #> # A tibble: 336 × 1 #> date #> #> 1 2000-08-28 00:00:00 #> 2 2000-08-28 00:30:00 #> 3 2000-08-28 01:00:00 #> 4 2000-08-28 01:30:00 #> 5 2000-08-28 02:00:00 #> 6 2000-08-28 02:30:00 #> 7 2000-08-28 03:00:00 #> 8 2000-08-28 03:30:00 #> 9 2000-08-28 04:00:00 #> 10 2000-08-28 04:30:00 #> # ℹ 326 more rows # Daily Data (Grouped) m4_daily %>% group_by(id) %>% future_frame(date, .length_out = \"6 weeks\") #> # A tibble: 168 × 2 #> # Groups: id [4] #> id date #> #> 1 D10 2016-05-07 #> 2 D10 2016-05-08 #> 3 D10 2016-05-09 #> 4 D10 2016-05-10 #> 5 D10 2016-05-11 #> 6 D10 2016-05-12 #> 7 D10 2016-05-13 #> 8 D10 2016-05-14 #> 9 D10 2016-05-15 #> 10 D10 2016-05-16 #> # ℹ 158 more rows # Specify how many observations to project into the future m4_daily %>% group_by(id) %>% future_frame(date, .length_out = 100) #> # A tibble: 400 × 2 #> # Groups: id [4] #> id date #> #> 1 D10 2016-05-07 #> 2 D10 2016-05-08 #> 3 D10 2016-05-09 #> 4 D10 2016-05-10 #> 5 D10 2016-05-11 #> 6 D10 2016-05-12 #> 7 D10 2016-05-13 #> 8 D10 2016-05-14 #> 9 D10 2016-05-15 #> 10 D10 2016-05-16 #> # ℹ 390 more rows # Bind with Original Data m4_daily %>% group_by(id) %>% future_frame(date, .length_out = 100, .bind_data = TRUE) #> # A tibble: 10,143 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 10,133 more rows holidays <- tk_make_holiday_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\", calendar = \"NYSE\") weekends <- tk_make_weekend_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\" ) FANG %>% group_by(symbol) %>% future_frame( .length_out = \"1 year\", .skip_values = c(holidays, weekends) ) #> .date_var is missing. Using: date #> # A tibble: 1,008 × 2 #> # Groups: symbol [4] #> symbol date #> #> 1 FB 2016-12-31 #> 2 FB 2017-01-03 #> 3 FB 2017-01-04 #> 4 FB 2017-01-05 #> 5 FB 2017-01-06 #> 6 FB 2017-01-09 #> 7 FB 2017-01-10 #> 8 FB 2017-01-11 #> 9 FB 2017-01-12 #> 10 FB 2017-01-13 #> # ℹ 998 more rows # }"},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":null,"dir":"Reference","previous_headings":"","what":"Check if an object is a date class — is_date_class","title":"Check if an object is a date class — is_date_class","text":"Check object date class","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Check if an object is a date class — is_date_class","text":"","code":"is_date_class(x)"},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Check if an object is a date class — is_date_class","text":"x vector check","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Check if an object is a date class — is_date_class","text":"Logical (TRUE/FALSE)","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Check if an object is a date class — is_date_class","text":"","code":"library(dplyr) tk_make_timeseries(\"2011\") %>% is_date_class() #> Using by: day #> [1] TRUE letters %>% is_date_class() #> [1] FALSE"},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Lag Transformation — lag_vec","title":"Lag Transformation — lag_vec","text":"lag_vec() applies Lag Transformation.","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lag Transformation — lag_vec","text":"","code":"lag_vec(x, lag = 1) lead_vec(x, lag = -1)"},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lag Transformation — lag_vec","text":"x vector lagged. lag lag (far back) included differencing calculation. Negative lags leads.","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Lag Transformation — lag_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Lag Transformation — lag_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. function allows lags leads (negative lags). Lag Calculation lag offset lag periods. NA values returned number lag periods. Lead Calculation negative lag considered lead. difference lead_vec() lag_vec() lead_vec() function contains starting negative value.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Lag Transformation — lag_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- # Lag 1:10 %>% lag_vec(lag = 1) #> [1] NA 1 2 3 4 5 6 7 8 9 # Lead 1:10 %>% lag_vec(lag = -1) #> [1] 2 3 4 5 6 7 8 9 10 NA # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(lag_1 = lag_vec(value, lag = 1)) #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value lag_1 #> #> 1 D10 2014-07-03 2076. NA #> 2 D10 2014-07-04 2073. 2076. #> 3 D10 2014-07-05 2049. 2073. #> 4 D10 2014-07-06 2049. 2049. #> 5 D10 2014-07-07 2006. 2049. #> 6 D10 2014-07-08 2018. 2006. #> 7 D10 2014-07-09 2019. 2018. #> 8 D10 2014-07-10 2007. 2019. #> 9 D10 2014-07-11 2010 2007. #> 10 D10 2014-07-12 2002. 2010 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"log_interval_vec() transformation constrains forecast interval specified upper_limit lower_limit. transformation provides similar benefits log() transformation, ensuring inverted transformation stays within upper lower limit.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"","code":"log_interval_vec( x, limit_lower = \"auto\", limit_upper = \"auto\", offset = 0, silent = FALSE ) log_interval_inv_vec(x, limit_lower, limit_upper, offset = 0)"},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"x positive numeric vector. limit_lower lower limit. Must less minimum value. set \"auto\", selects zero. limit_upper upper limit. Must greater maximum value. set \"auto\", selects value 10% greater maximum value. offset offset include log transformation. Useful data contains values less equal zero. silent Whether report parameter selections message.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"numeric vector transformed series.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"Log Interval Transformation Log Interval Transformation constrains values specified upper lower limits. transformation maps limits function: log(((x + offset) - )/(b - (x + offset))) lower limit b upper limit Inverse Transformation inverse transformation: (b-)*(exp(x)) / (1 + exp(x)) + - offset","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"Forecasting: Principles & Practices: Forecasts constrained interval","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"","code":"library(dplyr) library(timetk) values_trans <- log_interval_vec(1:10, limit_lower = 0, limit_upper = 11) #> log_interval_vec(): #> Using limit_lower: 0 #> Using limit_upper: 11 #> Using offset: 0 values_trans #> [1] -2.3025851 -1.5040774 -0.9808293 -0.5596158 -0.1823216 0.1823216 #> [7] 0.5596158 0.9808293 1.5040774 2.3025851 values_trans_forecast <- c(values_trans, 3.4, 4.4, 5.4) values_trans_forecast %>% log_interval_inv_vec(limit_lower = 0, limit_upper = 11) %>% plot()"},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 daily time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"","code":"m4_daily"},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Daily format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"sample 4 daily data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"","code":"m4_daily #> # A tibble: 9,743 × 3 #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 hourly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"","code":"m4_hourly"},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"tibble: 3,060 x 3 id Factor. Unique series identifier (4 total) date Date-time. Timestamp information. Hourly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"sample 4 hourly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"","code":"m4_hourly #> # A tibble: 3,060 × 3 #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 monthly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"","code":"m4_monthly"},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Monthly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"sample 4 Monthly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"","code":"m4_monthly #> # A tibble: 1,574 × 3 #> id date value #> #> 1 M1 1976-06-01 8000 #> 2 M1 1976-07-01 8350 #> 3 M1 1976-08-01 8570 #> 4 M1 1976-09-01 7700 #> 5 M1 1976-10-01 7080 #> 6 M1 1976-11-01 6520 #> 7 M1 1976-12-01 6070 #> 8 M1 1977-01-01 6650 #> 9 M1 1977-02-01 6830 #> 10 M1 1977-03-01 5710 #> # ℹ 1,564 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 quarterly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"","code":"m4_quarterly"},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Quarterly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"sample 4 Quarterly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"","code":"m4_quarterly #> # A tibble: 196 × 3 #> id date value #> #> 1 Q10 2000-01-01 2329 #> 2 Q10 2000-04-01 2350. #> 3 Q10 2000-07-01 2333. #> 4 Q10 2000-10-01 2382. #> 5 Q10 2001-01-01 2383. #> 6 Q10 2001-04-01 2405 #> 7 Q10 2001-07-01 2411 #> 8 Q10 2001-10-01 2428. #> 9 Q10 2002-01-01 2392. #> 10 Q10 2002-04-01 2418. #> # ℹ 186 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 weekly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"","code":"m4_weekly"},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Weekly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"sample 4 Weekly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"","code":"m4_weekly #> # A tibble: 2,295 × 3 #> id date value #> #> 1 W10 1999-01-01 247. #> 2 W10 1999-01-08 222. #> 3 W10 1999-01-15 450. #> 4 W10 1999-01-22 450. #> 5 W10 1999-01-29 450. #> 6 W10 1999-02-05 450. #> 7 W10 1999-02-12 450. #> 8 W10 1999-02-19 450. #> 9 W10 1999-02-26 450. #> 10 W10 1999-03-05 450. #> # ℹ 2,285 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 yearly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"","code":"m4_yearly"},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Yearly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"sample 4 Yearly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"","code":"m4_yearly #> # A tibble: 135 × 3 #> id date value #> #> 1 Y1 1979-01-01 5172. #> 2 Y1 1980-01-01 5134. #> 3 Y1 1981-01-01 5187. #> 4 Y1 1982-01-01 5085. #> 5 Y1 1983-01-01 5182 #> 6 Y1 1984-01-01 5414. #> 7 Y1 1985-01-01 5576. #> 8 Y1 1986-01-01 5753. #> 9 Y1 1987-01-01 5955. #> 10 Y1 1988-01-01 6088. #> # ℹ 125 more rows"},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Mutate (for Time Series Data) — mutate_by_time","title":"Mutate (for Time Series Data) — mutate_by_time","text":"mutate_by_time() time-based variant popular dplyr::mutate() function uses .date_var specify date date-time column .group calculation groups like \"5 seconds\", \"week\", \"3 months\".","code":""},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mutate (for Time Series Data) — mutate_by_time","text":"","code":"mutate_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\") )"},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mutate (for Time Series Data) — mutate_by_time","text":".data tbl object data.frame .date_var column containing date date-time values summarize. missing, attempts auto-detect date column. .time unit summarise . Time units collapsed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed. ... Name-value pairs. name gives name column output. value can : vector length 1, recycled correct length. vector length current group (whole data frame ungrouped). NULL, remove column. data frame tibble, create multiple columns output. .type One \"floor\", \"ceiling\", \"round. Defaults \"floor\". See lubridate::round_date.","code":""},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Mutate (for Time Series Data) — mutate_by_time","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Mutate (for Time Series Data) — mutate_by_time","text":"","code":"# Libraries library(timetk) library(dplyr) library(tidyr) # First value in each month m4_daily_first_by_month_tbl <- m4_daily %>% group_by(id) %>% mutate_by_time( .date_var = date, .by = \"month\", # Setup for monthly aggregation # mutate recycles a single value first_value_by_month = first(value) ) m4_daily_first_by_month_tbl #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value first_value_by_month #> #> 1 D10 2014-07-03 2076. 2076. #> 2 D10 2014-07-04 2073. 2076. #> 3 D10 2014-07-05 2049. 2076. #> 4 D10 2014-07-06 2049. 2076. #> 5 D10 2014-07-07 2006. 2076. #> 6 D10 2014-07-08 2018. 2076. #> 7 D10 2014-07-09 2019. 2076. #> 8 D10 2014-07-10 2007. 2076. #> 9 D10 2014-07-11 2010 2076. #> 10 D10 2014-07-12 2002. 2076. #> # ℹ 9,733 more rows # Visualize Time Series vs 1st Value Each Month m4_daily_first_by_month_tbl %>% pivot_longer(value:first_value_by_month) %>% plot_time_series(date, value, name, .facet_scale = \"free\", .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Normalize to Range (0, 1) — normalize_vec","title":"Normalize to Range (0, 1) — normalize_vec","text":"Normalization commonly used center scale numeric features prevent one dominating algorithms require data scale.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Normalize to Range (0, 1) — normalize_vec","text":"","code":"normalize_vec(x, min = NULL, max = NULL, silent = FALSE) normalize_inv_vec(x, min, max)"},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Normalize to Range (0, 1) — normalize_vec","text":"x numeric vector. min population min value normalization process. max population max value normalization process. silent Whether report automated min max parameters message.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Normalize to Range (0, 1) — normalize_vec","text":"numeric vector transformation applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Normalize to Range (0, 1) — normalize_vec","text":"Standardization vs Normalization Standardization refers transformation reduces range mean 0, standard deviation 1 Normalization refers transformation reduces min-max range: (0, 1)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Normalize to Range (0, 1) — normalize_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_norm <- normalize_vec(d10_daily$value) #> Normalization Parameters #> min: 1781.6 #> max: 2649.3 value <- normalize_inv_vec(value_norm, min = 1781.6, max = 2649.3) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_norm = normalize_vec(value)) #> Normalization Parameters #> min: 1781.6 #> max: 2649.3 #> Normalization Parameters #> min: 1734.9 #> max: 19432.5 #> Normalization Parameters #> min: 6309.38 #> max: 9540.62 #> Normalization Parameters #> min: 4172.1 #> max: 14954.1 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_norm #> #> 1 D10 2014-07-03 2076. 0.340 #> 2 D10 2014-07-04 2073. 0.336 #> 3 D10 2014-07-05 2049. 0.308 #> 4 D10 2014-07-06 2049. 0.308 #> 5 D10 2014-07-07 2006. 0.259 #> 6 D10 2014-07-08 2018. 0.272 #> 7 D10 2014-07-09 2019. 0.274 #> 8 D10 2014-07-10 2007. 0.260 #> 9 D10 2014-07-11 2010 0.263 #> 10 D10 2014-07-12 2002. 0.253 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Insert time series rows with regularly spaced timestamps — pad_by_time","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"easiest way fill missing timestamps convert granular period (e.g. quarter month). Wraps padr::pad() function padding tibbles.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"","code":"pad_by_time( .data, .date_var, .by = \"auto\", .pad_value = NA, .fill_na_direction = c(\"none\", \"down\", \"up\", \"downup\", \"updown\"), .start_date = NULL, .end_date = NULL )"},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":".data tibble time-based column. .date_var column containing date date-time values pad .Either \"auto\", time-based frequency like \"year\", \"month\", \"day\", \"hour\", etc, time expression like \"5 min\", \"7 days\". See Details. .pad_value Fills padded values. Default NA. .fill_na_direction Users can provide NA fill strategy using tidyr::fill(). Possible values: 'none', '', '', 'downup', 'updown'. Default: 'none' .start_date Specifies start padded series. NULL use lowest value input variable. .end_date Specifies end padded series. NULL use highest value input variable.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"tibble data.frame rows containing missing timestamps added.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"Padding Missing Observations common use case pad_by_time() add rows timestamps missing. sales data missing values weekends holidays. high frequency data observations irregularly spaced reset regular frequency. Going Low High Frequency second use case going low frequency (e.g. day) high frequency (e.g. hour). possible supplying higher frequency pad_by_time(). Interval, .Padding can applied following ways: .= \"auto\" - pad_by_time() detect time-stamp frequency apply padding. eight intervals : year, quarter, month, week, day, hour, min, sec. Intervals like 5 minutes, 6 hours, 10 days possible. Pad Value, .pad_value pad value can supplied fills missing numeric data. Note applied numeric columns. Fill NA Direction, .fill_na_directions Uses tidyr::fill() fill missing observations using fill strategy.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"function wraps padr::pad() function developed Edwin Thoen.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"","code":"library(tibble) library(dplyr) library(timetk) # Create a quarterly series with 1 missing value missing_data_tbl <- tibble( date = tk_make_timeseries(\"2014-01-01\", \"2015-01-01\", by = \"quarter\"), value = 1:5 ) %>% slice(-4) # Lose the 4th quarter on purpose missing_data_tbl #> # A tibble: 4 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2015-01-01 5 # Detects missing quarter, and pads the missing regularly spaced quarter with NA missing_data_tbl %>% pad_by_time(date, .by = \"quarter\") #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 NA #> 5 2015-01-01 5 # Can specify a shorter period. This fills monthly. missing_data_tbl %>% pad_by_time(date, .by = \"month\") #> # A tibble: 13 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-02-01 NA #> 3 2014-03-01 NA #> 4 2014-04-01 2 #> 5 2014-05-01 NA #> 6 2014-06-01 NA #> 7 2014-07-01 3 #> 8 2014-08-01 NA #> 9 2014-09-01 NA #> 10 2014-10-01 NA #> 11 2014-11-01 NA #> 12 2014-12-01 NA #> 13 2015-01-01 5 # Can let pad_by_time() auto-detect date and period missing_data_tbl %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: quarter #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 NA #> 5 2015-01-01 5 # Can specify a .pad_value missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .pad_value = 0) #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 0 #> 5 2015-01-01 5 # Can then impute missing values missing_data_tbl %>% pad_by_time(date, .by = \"quarter\") %>% mutate(value = ts_impute_vec(value, period = 1)) #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 4 #> 5 2015-01-01 5 # Can specify a custom .start_date and .end_date missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .start_date = \"2013\", .end_date = \"2015-07-01\") #> # A tibble: 11 × 2 #> date value #> #> 1 2013-01-01 NA #> 2 2013-04-01 NA #> 3 2013-07-01 NA #> 4 2013-10-01 NA #> 5 2014-01-01 1 #> 6 2014-04-01 2 #> 7 2014-07-01 3 #> 8 2014-10-01 NA #> 9 2015-01-01 5 #> 10 2015-04-01 NA #> 11 2015-07-01 NA # Can specify a tidyr::fill() direction missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .fill_na_direction = \"downup\", .start_date = \"2013\", .end_date = \"2015-07-01\") #> # A tibble: 11 × 2 #> date value #> #> 1 2013-01-01 1 #> 2 2013-04-01 1 #> 3 2013-07-01 1 #> 4 2013-10-01 1 #> 5 2014-01-01 1 #> 6 2014-04-01 2 #> 7 2014-07-01 3 #> 8 2014-10-01 3 #> 9 2015-01-01 5 #> 10 2015-04-01 5 #> 11 2015-07-01 5 # --- GROUPS ---- # Apply standard NA padding to groups FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\") #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 NA NA NA NA NA NA #> 5 AMZN 2013-01-06 NA NA NA NA NA NA #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows # Apply constant pad value FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\", .pad_value = 0) #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 0 0 0 0 0 0 #> 5 AMZN 2013-01-06 0 0 0 0 0 0 #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows # Apply filled padding to groups FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\", .fill_na_direction = \"down\") #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 258. 260. 257. 259. 1874200 259. #> 5 AMZN 2013-01-06 258. 260. 257. 259. 1874200 259. #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":null,"dir":"Reference","previous_headings":"","what":"Fast, flexible date and datetime parsing — parse_date2","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Significantly faster time series parsing readr::parse_date, readr::parse_datetime, lubridate::as_date(), lubridate::as_datetime(). Uses anytime package, relies Boost.Date_Time C++ library date/datetime parsing.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fast, flexible date and datetime parsing — parse_date2","text":"","code":"parse_date2(x, ..., silent = FALSE) parse_datetime2(x, tz = \"UTC\", tz_shift = FALSE, ..., silent = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fast, flexible date and datetime parsing — parse_date2","text":"x character vector ... Additional parameters passed anytime() anydate() silent TRUE, warns user parsing failures. tz Datetime . timezone (see OlsenNames()). tz_shift Datetime . FALSE, forces datetime time zone. TRUE, offsets datetime UTC new time zone.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Returns date datatime vector transformation applied character timestamp vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Parsing Formats Date Formats: Must follow Year, Month, Day sequence. (e.g. parse_date2(\"2011 June\") OK, parse_date2(\"June 2011\") OK). Date Time Formats: Must follow YMD HMS sequence. Refer lubridate::mdy() Month, Day, Year additional formats. Time zones (Datetime) Time zones handled similar way lubridate::as_datetime() time zones forced rather shifted. key difference anytime::anytime(), shifts datetimes specified timezone default.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fast, flexible date and datetime parsing — parse_date2","text":"function wraps anytime::anytime() anytime::anydate functions developed Dirk Eddelbuettel.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fast, flexible date and datetime parsing — parse_date2","text":"","code":"# Fast date parsing parse_date2(\"2011\") #> [1] \"2011-01-01\" parse_date2(\"2011 June 3rd\") #> [1] \"2011-06-03\" # Fast datetime parsing parse_datetime2(\"2011\") #> [1] \"2011-01-01 UTC\" parse_datetime2(\"2011 Jan 1 12:35:21\") #> [1] \"2011-01-01 12:35:21 UTC\" # Time Zones (datetime only) parse_datetime2(\"2011 Jan 1 12:35:21\", tz = \"Europe/London\") #> [1] \"2011-01-01 12:35:21 GMT\""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"Returns ACF PACF target optionally CCF's one lagged predictors interactive plotly plots. Scales multiple time series group_by().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"","code":"plot_acf_diagnostics( .data, .date_var, .value, .ccf_vars = NULL, .lags = 1000, .show_ccf_vars_only = FALSE, .show_white_noise_bars = TRUE, .facet_ncol = 1, .facet_scales = \"fixed\", .line_color = \"#2c3e50\", .line_size = 0.5, .line_alpha = 1, .point_color = \"#2c3e50\", .point_size = 1, .point_alpha = 1, .x_intercept = NULL, .x_intercept_color = \"#E31A1C\", .hline_color = \"#2c3e50\", .white_noise_line_type = 2, .white_noise_line_color = \"#A6CEE3\", .title = \"Lag Diagnostics\", .x_lab = \"Lag\", .y_lab = \"Correlation\", .interactive = TRUE, .plotly_slider = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":".data data frame tibble numeric features (values) descending chronological order .date_var column containing either date date-time values .value numeric column value ACF PACF calculations performed. .ccf_vars Additional features perform Lag Cross Correlations (CCFs) versus .value. Useful evaluating external lagged regressors. .lags sequence one lags evaluate. .show_ccf_vars_only Hides ACF PACF plots can focus CCFs. .show_white_noise_bars Shows white noise significance bounds. .facet_ncol Facets: Number facet columns. effect using grouped_df. .facet_scales Facets: Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .line_color Line color. Use keyword: \"scale_color\" change color facet. .line_size Line size .line_alpha Line opacity. Adjust transparency line. Range: (0, 1) .point_color Point color. Use keyword: \"scale_color\" change color facet. .point_size Point size .point_alpha Opacity. Adjust transparency points. Range: (0, 1) .x_intercept Numeric lag. Adds vertical line. .x_intercept_color Color x-intercept line. .hline_color Color y-intercept = 0 line. .white_noise_line_type Line type white noise bars. Set 2 \"dashed\" default. .white_noise_line_color Line color white noise bars. Set tidyquant::palette_light() \"steel blue\" default. .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly x-axis range slider.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"Simplified ACF, PACF, & CCF often interested 3 functions. get 3+ ? Now can. ACF - Autocorrelation target variable lagged versions PACF - Partial Autocorrelation removes dependence lags lags highlighting key seasonalities. CCF - Shows lagged predictors can used prediction target variable. Lag Specification Lags (.lags) can either specified : time-based phrase indicating duraction (e.g. 2 months) maximum lag (e.g. .lags = 28) sequence lags (e.g. .lags = 7:28) Scales Multiple Time Series Groups plot_acf_diagnostics() works grouped_df's, meaning can group time series one categorical columns dplyr::group_by() apply plot_acf_diagnostics() return group-wise lag diagnostics. Special Note Groups Unlike plotting utilities, .facet_vars arguments included. Use dplyr::group_by() processing multiple time series groups. Calculating White Noise Significance Bars formula significance bars +2/sqrt(T) -2/sqrt(T) T length time series. white noise time series, 95% data points fall within range. may significant autocorrelations.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Apply Transformations # - Differencing transformation to identify ARIMA & SARIMA Orders m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = FALSE ) # Apply Transformations # - Differencing transformation to identify ARIMA & SARIMA Orders m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, diff_vec(value, lag = 1), # Difference the value column .lags = 0:(24*7), # 7-Days of hourly lags .interactive = FALSE ) + ggtitle(\"ACF Diagnostics\", subtitle = \"1st Difference\") #> diff_vec(): Initial values: 513 #> diff_vec(): Initial values: 39325 #> diff_vec(): Initial values: 45 #> diff_vec(): Initial values: 153 # CCFs Too! walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"interactive scalable function visualizing anomalies time series data. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"","code":"plot_anomaly_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .frequency = \"auto\", .trend = \"auto\", .alpha = 0.05, .max_anomalies = 0.2, .message = TRUE, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .anom_color = \"#e31a1c\", .anom_alpha = 1, .anom_size = 1.5, .ribbon_fill = \"grey20\", .ribbon_alpha = 0.2, .legend_show = TRUE, .title = \"Anomaly Diagnostics\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Anomaly\", .interactive = TRUE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity LOESS smoother, used remove remainder. Refer tk_get_trend(). .alpha Controls width \"normal\" range. Lower values conservative higher values less prone incorrectly classifying \"normal\" observations. .max_anomalies maximum percent anomalies permitted identified. .message boolean. TRUE, output information related automatic frequency trend selection (applicable). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .anom_color Color anomaly dots .anom_alpha Opacity anomaly dots. Range: (0, 1). .anom_size Size anomaly dots .ribbon_fill Fill color acceptable range .ribbon_alpha Fill opacity acceptable range. Range: (0, 1). .legend_show Toggles /Legend .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .color_lab Plot label color legend .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"plot_anomaly_diagnostics() visualization wrapper tk_anomaly_diagnostics() group-wise anomaly detection, implements 2-step process detect outliers time series. Step 1: Detrend & Remove Seasonality using STL Decomposition decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\" anomaly detection. user can control two parameters: frequency trend. .frequency: Adjusts \"season\" component removed \"observed\" values. .trend: Adjusts trend window (t.window parameter stats::stl() used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", predetermines frequency /trend based scale time series using tk_time_scale_template(). Step 2: Anomaly Detection \"trend\" \"season\" (seasonality) removed, anomaly detection performed \"remainder\". Anomalies identified, boundaries (recomposed_l1 recomposed_l2) determined. Anomaly Detection Method uses inner quartile range (IQR) +/-25 median. IQR Adjustment, alpha parameter default alpha = 0.05, limits established expanding 25/75 baseline IQR Factor 3 (3X). IQR Factor = 0.15 / alpha (hence 3X alpha = 0.05): increase IQR Factor controlling limits, decrease alpha, makes difficult outlier. Increase alpha make easier outlier. IQR outlier detection method used forecast::tsoutliers(). similar outlier detection method used Twitter's AnomalyDetection package. Twitter Forecast tsoutliers methods implemented Business Science's anomalize package.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"CLEVELAND, R. B., CLEVELAND, W. S., MCRAE, J. E., TERPENNING, . STL: Seasonal-Trend Decomposition Procedure Based Loess. Journal Official Statistics, Vol. 6, . 1 (1990), pp. 3-73. Owen S. Vallis, Jordan Hochenbaum Arun Kejariwal (2014). Novel Technique Long-Term Anomaly Detection Cloud. Twitter Inc.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% group_by(id) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .message = FALSE, .facet_ncol = 3, .ribbon_alpha = 0.25, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"interactive scalable function visualizing time series seasonality. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"","code":"plot_seasonal_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .feature_set = \"auto\", .geom = c(\"boxplot\", \"violin\"), .geom_color = \"#2c3e50\", .geom_outlier_color = \"#2c3e50\", .title = \"Seasonal Diagnostics\", .x_lab = \"\", .y_lab = \"\", .interactive = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .feature_set One multiple selections analyze seasonality. Choices include: \"auto\" - Automatically selects features based time stamps length series. \"second\" - Good analyzing seasonality second minute. \"minute\" - Good analyzing seasonality minute hour \"hour\" - Good analyzing seasonality hour day \"wday.lbl\" - Labeled weekdays. Good analyzing seasonality day week. \"week\" - Good analyzing seasonality week year. \"month.lbl\" - Labeled months. Good analyzing seasonality month year. \"quarter\" - Good analyzing seasonality quarter year \"year\" - Good analyzing seasonality multiple years. .geom Either \"boxplot\" \"violin\" .geom_color Geometry color. Line color. Use keyword: \"scale_color\" change color facet. .geom_outlier_color Color used highlight outliers. .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"Automatic Feature Selection Internal calculations performed detect sub-range features include useing following logic: minimum feature selected based median difference consecutive timestamps maximum feature selected based 2 full periods. Example: Hourly timestamp data lasts 2 weeks following features: \"hour\", \"wday.lbl\", \"week\". Scalable Grouped Data Frames function respects grouped data.frame tibbles made dplyr::group_by(). grouped data, automatic feature selection returned collection features within sub-groups. means extra features returned even though may meaningless groups. Transformations .value parameter respects transformations (e.g. .value = log(sales)).","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # ---- MULTIPLE FREQUENCY ---- # Taylor 30-minute dataset from forecast package taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows # Visualize series taylor_30_min %>% plot_time_series(date, value, .interactive = FALSE) # Visualize seasonality taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = FALSE) # ---- GROUPED EXAMPLES ---- # m4 hourly dataset m4_hourly #> # A tibble: 3,060 × 3 #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows # Visualize series m4_hourly %>% group_by(id) %>% plot_time_series(date, value, .facet_scales = \"free\", .interactive = FALSE) # Visualize seasonality m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = FALSE) # }"},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"interactive scalable function visualizing time series STL Decomposition. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"","code":"plot_stl_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\", \"seasadj\"), .frequency = \"auto\", .trend = \"auto\", .message = TRUE, .facet_scales = \"free\", .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .title = \"STL Diagnostics\", .x_lab = \"\", .y_lab = \"\", .interactive = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .feature_set STL decompositions visualize. Select one \"observed\", \"season\", \"trend\", \"remainder\", \"seasadj\". .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity lowess smoother, used remove remainder. .message boolean. TRUE, output information related automatic frequency trend selection (applicable). .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .line_color Line color. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"plot_stl_diagnostics() function generates Seasonal-Trend-Loess decomposition. function \"tidy\" sense works data frames designed work dplyr groups. STL method: STL method implements time series decomposition using underlying stats::stl(). decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\". Frequency & Trend Selection user can control two parameters: .frequency .trend. .frequency parameter adjusts \"season\" component removed \"observed\" values. .trend parameter adjusts trend window (t.window parameter stl()) used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", automatically selects frequency /trend based scale time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- SINGLE TIME SERIES DECOMPOSITION ---- m4_hourly %>% filter(id == \"H10\") %>% plot_stl_diagnostics( date, value, # Set features to return, desired frequency and trend .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .frequency = \"24 hours\", .trend = \"1 week\", .interactive = FALSE) #> frequency = 24 observations per 24 hours #> trend = 168 observations per 1 week # ---- GROUPS ---- m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .feature_set = c(\"observed\", \"season\", \"trend\"), .interactive = FALSE) #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":null,"dir":"Reference","previous_headings":"","what":"Interactive Plotting for One or More Time Series — plot_time_series","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"workhorse time-series plotting function generates interactive plotly plots, consolidates 20+ lines ggplot2 code, scales well many time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"","code":"plot_time_series( .data, .date_var, .value, .color_var = NULL, .facet_vars = NULL, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free_y\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .y_intercept = NULL, .y_intercept_color = \"#2c3e50\", .x_intercept = NULL, .x_intercept_color = \"#2c3e50\", .smooth = TRUE, .smooth_period = \"auto\", .smooth_message = FALSE, .smooth_span = NULL, .smooth_degree = 2, .smooth_color = \"#3366FF\", .smooth_size = 1, .smooth_alpha = 1, .legend_show = TRUE, .title = \"Time Series Plot\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Legend\", .interactive = TRUE, .plotly_slider = FALSE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .color_var categorical column can used change line color .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. Overrided .color_var specified. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .y_intercept Value y-intercept plot .y_intercept_color Color y-intercept .x_intercept Value x-intercept plot .x_intercept_color Color x-intercept .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .smooth_period Number observations include Loess Smoother. Set \"auto\" default, uses tk_get_trend() determine logical trend cycle. .smooth_message Logical. Whether return trend selected message. Useful want see .smooth_period selected. .smooth_span Percentage observations include Loess Smoother. can use either period span. See smooth_vec(). .smooth_degree Flexibility Loess Polynomial. Either 0, 1, 2 (0 = lest flexible, 2 = flexible). .smooth_color Smoother line color .smooth_size Smoother line size .smooth_alpha Smoother alpha (opacity). Range: (0, 1). .legend_show Toggles /Legend .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .color_lab Legend label color_var used. .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly date range slider. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"plot_time_series() scalable function works ungrouped grouped data.frame objects (tibbles!). Interactive Default plot_time_series() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series(.facet_vars) - can manually supply facets well. Can Transform Values just like ggplot .values argument accepts transformations just like ggplot2. example, want take log sales can use call like plot_time_series(date, log(sales)) log transformation applied. Smoother Period / Span Calculation .smooth = TRUE option returns smoother calculated based either: .smooth_period: Number observations .smooth_span: percentage observations default, .smooth_period automatically calculated using 75% observertions. geom_smooth(method = \"loess\", span = 0.75). user can specify time-based window (e.g. .smooth_period = \"1 year\") numeric value (e.g. smooth_period = 365). Time-based windows return median number observations window using tk_get_trend().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"","code":"library(dplyr) library(lubridate) #> #> Attaching package: ‘lubridate’ #> The following objects are masked from ‘package:base’: #> #> date, intersect, setdiff, union library(timetk) # Works with individual time series FANG %>% filter(symbol == \"FB\") %>% plot_time_series(date, adjusted, .interactive = FALSE) # Works with groups FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, # 2-column layout .interactive = FALSE) # Can also group inside & use .color_var FANG %>% mutate(year = year(date)) %>% plot_time_series(date, adjusted, .facet_vars = c(symbol, year), # add groups/facets .color_var = year, # color by year .facet_ncol = 4, .facet_scales = \"free\", .facet_collapse = TRUE, # combine group strip text into 1 line .interactive = FALSE) # Can apply transformations to .value or .color_var # - .value = log(adjusted) # - .color_var = year(date) FANG %>% plot_time_series(date, log(adjusted), .color_var = year(date), .facet_vars = contains(\"symbol\"), .facet_ncol = 2, .facet_scales = \"free\", .y_lab = \"Log Scale\", .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Interactive Time Series Box Plots — plot_time_series_boxplot","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"boxplot function generates interactive plotly plots time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"","code":"plot_time_series_boxplot( .data, .date_var, .value, .period, .color_var = NULL, .facet_vars = NULL, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free_y\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .y_intercept = NULL, .y_intercept_color = \"#2c3e50\", .smooth = TRUE, .smooth_func = ~mean(.x, na.rm = TRUE), .smooth_period = \"auto\", .smooth_message = FALSE, .smooth_span = NULL, .smooth_degree = 2, .smooth_color = \"#3366FF\", .smooth_size = 1, .smooth_alpha = 1, .legend_show = TRUE, .title = \"Time Series Plot\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Legend\", .interactive = TRUE, .plotly_slider = FALSE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .period time series unit aggregation boxplot. Examples include: \"1 week\" \"3 years\" \"30 minutes\" .color_var categorical column can used change line color .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. Overrided .color_var specified. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .y_intercept Value y-intercept plot .y_intercept_color Color y-intercept .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .smooth_func Defines aggregate .value show smoothed trendline. default ~ mean(.x, na.rm = TRUE), uses lambda function ensure NA values removed. Possible values : function, e.g. mean. purrr-style lambda, e.g. ~ mean(.x, na.rm = TRUE) .smooth_period Number observations include Loess Smoother. Set \"auto\" default, uses tk_get_trend() determine logical trend cycle. .smooth_message Logical. Whether return trend selected message. Useful want see .smooth_period selected. .smooth_span Percentage observations include Loess Smoother. can use either period span. See smooth_vec(). .smooth_degree Flexibility Loess Polynomial. Either 0, 1, 2 (0 = lest flexible, 2 = flexible). .smooth_color Smoother line color .smooth_size Smoother line size .smooth_alpha Smoother alpha (opacity). Range: (0, 1). .legend_show Toggles /Legend .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .color_lab Legend label color_var used. .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly date range slider. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"plot_time_series_boxplot() scalable function works ungrouped grouped data.frame objects (tibbles!). Interactive Default plot_time_series_boxplot() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series_boxplot() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series_boxplot(.facet_vars) - can manually supply facets well. Can Transform Values just like ggplot .values argument accepts transformations just like ggplot2. example, want take log sales can use call like plot_time_series_boxplot(date, log(sales)) log transformation applied. Smoother Period / Span Calculation .smooth = TRUE option returns smoother calculated based either: .smooth_func: method aggregation. Usually aggregation like mean used. purrr-style function syntax can used apply complex functions. .smooth_period: Number observations .smooth_span: percentage observations default, .smooth_period automatically calculated using 75% observertions. geom_smooth(method = \"loess\", span = 0.75). user can specify time-based window (e.g. .smooth_period = \"1 year\") numeric value (e.g. smooth_period = 365). Time-based windows return median number observations window using tk_get_trend().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"","code":"# \\donttest{ library(dplyr) library(lubridate) library(timetk) # Works with individual time series FANG %>% filter(symbol == \"FB\") %>% plot_time_series_boxplot( date, adjusted, .period = \"3 month\", .interactive = FALSE) # Works with groups FANG %>% group_by(symbol) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .facet_ncol = 2, # 2-column layout .interactive = FALSE) # Can also group inside & use .color_var FANG %>% mutate(year = year(date)) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .facet_vars = c(symbol, year), # add groups/facets .color_var = year, # color by year .facet_ncol = 4, .facet_scales = \"free\", .interactive = FALSE) # Can apply transformations to .value or .color_var # - .value = log(adjusted) # - .color_var = year(date) FANG %>% plot_time_series_boxplot( date, log(adjusted), .period = \"3 months\", .color_var = year(date), .facet_vars = contains(\"symbol\"), .facet_ncol = 2, .facet_scales = \"free\", .y_lab = \"Log Scale\", .interactive = FALSE) # Can adjust the smoother FANG %>% group_by(symbol) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .smooth = TRUE, .smooth_func = median, # Smoother function .smooth_period = \"5 years\", # Smoother Period .facet_ncol = 2, .interactive = FALSE) # }"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"plot_time_series_cv_plan() function provides visualization time series resample specification (rset) either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"","code":"plot_time_series_cv_plan( .data, .date_var, .value, ..., .smooth = FALSE, .title = \"Time Series Cross Validation Plan\" )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":".data time series resample specification either rolling_origin time_series_cv class data frame (tibble) prepared using tk_time_series_cv_plan(). .date_var column containing either date date-time values .value column containing numeric values ... Additional parameters passed plot_time_series() .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .title Title plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"Returns static ggplot interactive plotly object depending whether .interactive FALSE TRUE, respectively.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"Resample Set resample set output timetk::time_series_cv() function rsample::rolling_origin() function.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"","code":"library(dplyr) library(rsample) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) resample_spec <- time_series_cv( FB_tbl, initial = \"1 year\", assess = \"6 weeks\", skip = \"3 months\", lag = \"1 month\", cumulative = FALSE, slice_limit = 6 ) #> Using date_var: date resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 1,812 × 5 #> .id .key symbol date adjusted #> #> 1 Slice1 training FB 2015-11-19 106. #> 2 Slice1 training FB 2015-11-20 107. #> 3 Slice1 training FB 2015-11-23 107. #> 4 Slice1 training FB 2015-11-24 106. #> 5 Slice1 training FB 2015-11-25 105. #> 6 Slice1 training FB 2015-11-27 105. #> 7 Slice1 training FB 2015-11-30 104. #> 8 Slice1 training FB 2015-12-01 107. #> 9 Slice1 training FB 2015-12-02 106. #> 10 Slice1 training FB 2015-12-03 104. #> # ℹ 1,802 more rows resample_spec %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan( date, adjusted, # date variable and value variable # Additional arguments passed to plot_time_series(), .facet_ncol = 2, .line_alpha = 0.5, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"wrapper stats::lm() overlays linear regression fitted model time series, can help show effect feature engineering","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"","code":"plot_time_series_regression( .data, .date_var, .formula, .show_summary = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .formula linear regression formula. left-hand side formula used y-axis value. right-hand side formula used develop linear regression model. See stats::lm() details. .show_summary TRUE, prints summary.lm(). ... Additional arguments passed plot_time_series()","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"plot_time_series_regression() scalable function works ungrouped grouped data.frame objects (tibbles!). Time Series Formula .formula uses stats::lm() apply linear regression, used visualize effect feature engineering time series. left-hand side formula used y-axis value. right-hand side formula used develop linear regression model. Interactive Default plot_time_series_regression() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series_regression() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series_regression(.facet_vars) - can manually supply facets well.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"","code":"library(dplyr) library(lubridate) # ---- SINGLE SERIES ---- m4_monthly %>% filter(id == \"M750\") %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .show_summary = TRUE, .facet_ncol = 2, .interactive = FALSE ) #> #> Call: #> stats::lm(formula = .formula, data = df) #> #> Residuals: #> Min 1Q Median 3Q Max #> -0.12770 -0.05159 -0.01753 0.05142 0.17828 #> #> Coefficients: #> Estimate Std. Error t value Pr(>|t|) #> (Intercept) 8.407e+00 1.651e-02 509.199 < 2e-16 *** #> as.numeric(date) 5.679e-05 1.348e-06 42.118 < 2e-16 *** #> month(date, label = TRUE).L -3.584e-02 1.256e-02 -2.854 0.004625 ** #> month(date, label = TRUE).Q 7.509e-02 1.256e-02 5.979 6.51e-09 *** #> month(date, label = TRUE).C 7.879e-02 1.256e-02 6.273 1.27e-09 *** #> month(date, label = TRUE)^4 -4.931e-02 1.256e-02 -3.926 0.000108 *** #> month(date, label = TRUE)^5 -7.964e-02 1.256e-02 -6.341 8.61e-10 *** #> month(date, label = TRUE)^6 1.215e-02 1.256e-02 0.967 0.334270 #> month(date, label = TRUE)^7 5.196e-02 1.256e-02 4.137 4.60e-05 *** #> month(date, label = TRUE)^8 1.200e-02 1.256e-02 0.955 0.340143 #> month(date, label = TRUE)^9 -3.433e-02 1.256e-02 -2.733 0.006652 ** #> month(date, label = TRUE)^10 -1.566e-02 1.256e-02 -1.247 0.213483 #> month(date, label = TRUE)^11 1.182e-02 1.256e-02 0.941 0.347375 #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #> #> Residual standard error: 0.06341 on 293 degrees of freedom #> Multiple R-squared: 0.8695,\tAdjusted R-squared: 0.8641 #> F-statistic: 162.6 on 12 and 293 DF, p-value: < 2.2e-16 #> # ---- GROUPED SERIES ---- m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"Recipe-adjacent packages always list required package steps can function properly within parallel processing schemes.","code":""},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"","code":"# S3 method for step_box_cox required_pkgs(x, ...) # S3 method for step_diff required_pkgs(x, ...) # S3 method for step_fourier required_pkgs(x, ...) # S3 method for step_holiday_signature required_pkgs(x, ...) # S3 method for step_log_interval required_pkgs(x, ...) # S3 method for step_slidify required_pkgs(x, ...) # S3 method for step_slidify_augment required_pkgs(x, ...) # S3 method for step_smooth required_pkgs(x, ...) # S3 method for step_timeseries_signature required_pkgs(x, ...) # S3 method for step_ts_clean required_pkgs(x, ...) # S3 method for step_ts_impute required_pkgs(x, ...) # S3 method for step_ts_pad required_pkgs(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"x recipe step","code":""},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Apply slice inside periods (windows) — slice_period","title":"Apply slice inside periods (windows) — slice_period","text":"Applies dplyr slice inside time-based period (window).","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply slice inside periods (windows) — slice_period","text":"","code":"slice_period(.data, ..., .date_var, .period = \"1 day\")"},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Apply slice inside periods (windows) — slice_period","text":".data tbl object data.frame ... slice(): Integer row values. Provide either positive values keep, negative values drop. values provided must either positive negative. Indices beyond number rows input silently ignored. slice_*(), arguments passed methods. .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period slice within. Time units grouped using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\"","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Apply slice inside periods (windows) — slice_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Apply slice inside periods (windows) — slice_period","text":"","code":"# Libraries library(timetk) library(dplyr) # First 5 observations in each month m4_daily %>% group_by(id) %>% slice_period(1:5, .period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 1,612 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-08-01 1923. #> 7 D10 2014-08-02 1957. #> 8 D10 2014-08-03 1956. #> 9 D10 2014-08-04 1999. #> 10 D10 2014-08-05 2003. #> # ℹ 1,602 more rows # Last observation in each month m4_daily %>% group_by(id) %>% slice_period(n(), .period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows"},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a rolling (sliding) version of any function — slidify","title":"Create a rolling (sliding) version of any function — slidify","text":"slidify returns rolling (sliding) version input function, rolling (sliding) .period specified user.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a rolling (sliding) version of any function — slidify","text":"","code":"slidify( .f, .period = 1, .align = c(\"center\", \"left\", \"right\"), .partial = FALSE, .unlist = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a rolling (sliding) version of any function — slidify","text":".f function, formula, vector (necessarily atomic). function, used . formula, e.g. ~ .x + 2, converted function. three ways refer arguments: single argument function, use . two argument function, use .x .y arguments, use ..1, ..2, ..3 etc syntax allows create compact anonymous functions. Note formula functions conceptually take dots (can use ..1 etc). silently ignore additional arguments used formula expression. character vector, numeric vector, list, converted extractor function. Character vectors index name numeric vectors index position; use list index position name different levels. component present, value .default returned. .period period size roll .align One \"center\", \"left\" \"right\". .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. .unlist function returns single value time called, use .unlist = TRUE. function returns one value, complicated object (like linear model), use .unlist = FALSE create list-column rolling results.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a rolling (sliding) version of any function — slidify","text":"function rolling/sliding conversion applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create a rolling (sliding) version of any function — slidify","text":"slidify() function almost identical tibbletime::rollify() 3 improvements: Alignment (\"center\", \"left\", \"right\") Partial windows allowed Uses slider hood, improves speed reliability implementing code C++ level Make function Sliding (Rolling) Function slidify() turns function sliding version use inside call dplyr::mutate(), however works equally well called purrr::map(). intended use dplyr::mutate(), slidify creates function always returns output length input Alignment Rolling / Sliding functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: center (default): NA .partial values divided added beginning end series \"Center\" moving average. common Time Series applications (e.g. denoising). left: NA .partial values added end shift series Left. right: NA .partial values added beginning shift series Right. common Financial Applications (e.g moving average cross-overs). Allowing Partial Windows key improvement tibbletime::slidify() timetk::slidify() implements .partial rolling windows. Just set .partial = TRUE.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create a rolling (sliding) version of any function — slidify","text":"Tibbletime R Package Davis Vaughan, includes original rollify() Function","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a rolling (sliding) version of any function — slidify","text":"","code":"library(dplyr) library(tidyr) library(stringr) library(timetk) FB <- FANG %>% filter(symbol == \"FB\") # --- ROLLING MEAN (SINGLE ARG EXAMPLE) --- # Turn the normal mean function into a rolling mean with a 5 row .period mean_roll_5 <- slidify(mean, .period = 5, .align = \"right\") FB %>% mutate(rolling_mean_5 = mean_roll_5(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted rolling_mean_5 #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.6 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # Use `partial = TRUE` to allow partial windows (those with less than the full .period) mean_roll_5_partial <- slidify(mean, .period = 5, .align = \"right\", .partial = TRUE) FB %>% mutate(rolling_mean_5 = mean_roll_5_partial(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted rolling_mean_5 #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 28 #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 27.9 #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 28.2 #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 28.5 #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.6 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # There's nothing stopping you from combining multiple rolling functions with # different .period sizes in the same mutate call mean_roll_10 <- slidify(mean, .period = 10, .align = \"right\") FB %>% select(symbol, date, adjusted) %>% mutate( rolling_mean_5 = mean_roll_5(adjusted), rolling_mean_10 = mean_roll_10(adjusted) ) #> # A tibble: 1,008 × 5 #> symbol date adjusted rolling_mean_5 rolling_mean_10 #> #> 1 FB 2013-01-02 28 NA NA #> 2 FB 2013-01-03 27.8 NA NA #> 3 FB 2013-01-04 28.8 NA NA #> 4 FB 2013-01-07 29.4 NA NA #> 5 FB 2013-01-08 29.1 28.6 NA #> 6 FB 2013-01-09 30.6 29.1 NA #> 7 FB 2013-01-10 31.3 29.8 NA #> 8 FB 2013-01-11 31.7 30.4 NA #> 9 FB 2013-01-14 31.0 30.7 NA #> 10 FB 2013-01-15 30.1 30.9 29.8 #> # ℹ 998 more rows # For summary operations like rolling means, we can accomplish large-scale # multi-rolls with tk_augment_slidify() FB %>% select(symbol, date, adjusted) %>% tk_augment_slidify( adjusted, .period = 5:10, .f = mean, .align = \"right\", .names = str_c(\"MA_\", 5:10) ) #> # A tibble: 1,008 × 9 #> symbol date adjusted MA_5 MA_6 MA_7 MA_8 MA_9 MA_10 #> #> 1 FB 2013-01-02 28 NA NA NA NA NA NA #> 2 FB 2013-01-03 27.8 NA NA NA NA NA NA #> 3 FB 2013-01-04 28.8 NA NA NA NA NA NA #> 4 FB 2013-01-07 29.4 NA NA NA NA NA NA #> 5 FB 2013-01-08 29.1 28.6 NA NA NA NA NA #> 6 FB 2013-01-09 30.6 29.1 28.9 NA NA NA NA #> 7 FB 2013-01-10 31.3 29.8 29.5 29.3 NA NA NA #> 8 FB 2013-01-11 31.7 30.4 30.1 29.8 29.6 NA NA #> 9 FB 2013-01-14 31.0 30.7 30.5 30.3 29.9 29.7 NA #> 10 FB 2013-01-15 30.1 30.9 30.6 30.4 30.2 30.0 29.8 #> # ℹ 998 more rows # --- GROUPS AND ROLLING ---- # One of the most powerful things about this is that it works with # groups since `mutate` is being used data(FANG) mean_roll_3 <- slidify(mean, .period = 3, .align = \"right\") FANG %>% group_by(symbol) %>% mutate(mean_roll = mean_roll_3(adjusted)) %>% slice(1:5) #> # A tibble: 20 × 9 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted mean_roll #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. NA #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. NA #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. 258. #> 4 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. 262. #> 5 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. 265. #> 6 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 7 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 8 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 28.2 #> 9 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 28.6 #> 10 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 29.1 #> 11 GOOG 2013-01-02 719. 727. 717. 723. 5101500 361. NA #> 12 GOOG 2013-01-03 725. 732. 721. 724. 4653700 361. NA #> 13 GOOG 2013-01-04 729. 741. 728. 738. 5547600 369. 364. #> 14 GOOG 2013-01-07 735. 739. 731. 735. 3323800 367. 366. #> 15 GOOG 2013-01-08 736. 736. 724. 733. 3364700 366. 367. #> 16 NFLX 2013-01-02 95.2 95.8 90.7 92.0 19431300 13.1 NA #> 17 NFLX 2013-01-03 92.0 97.9 91.5 96.6 27912500 13.8 NA #> 18 NFLX 2013-01-04 96.5 97.7 95.5 96.0 17761100 13.7 13.6 #> 19 NFLX 2013-01-07 96.4 102. 96.1 99.2 45550400 14.2 13.9 #> 20 NFLX 2013-01-08 100. 101. 96.8 97.2 24714900 13.9 13.9 # --- ROLLING CORRELATION (MULTIPLE ARG EXAMPLE) --- # With 2 args, use the purrr syntax of ~ and .x, .y # Rolling correlation example cor_roll <- slidify(~cor(.x, .y), .period = 5, .align = \"right\") FB %>% mutate(running_cor = cor_roll(adjusted, open)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted running_cor #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 0.749 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 0.805 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 0.859 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 0.884 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 0.667 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 0.379 #> # ℹ 998 more rows # With >2 args, create an anonymous function with >2 args or use # the purrr convention of ..1, ..2, ..3 to refer to the arguments avg_of_avgs <- slidify( function(x, y, z) (mean(x) + mean(y) + mean(z)) / 3, .period = 10, .align = \"right\" ) # Or avg_of_avgs <- slidify( ~(mean(..1) + mean(..2) + mean(..3)) / 3, .period = 10, .align = \"right\" ) FB %>% mutate(avg_of_avgs = avg_of_avgs(open, high, low)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted avg_of_avgs #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 NA #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 NA #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 NA #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 NA #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 NA #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 29.7 #> # ℹ 998 more rows # Optional arguments MUST be passed at the creation of the rolling function # Only data arguments that are \"rolled over\" are allowed when calling the # rolling version of the function FB$adjusted[1] <- NA roll_mean_na_rm <- slidify(~mean(.x, na.rm = TRUE), .period = 5, .align = \"right\") FB %>% mutate(roll_mean = roll_mean_na_rm(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted roll_mean #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 NA NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.8 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # --- ROLLING REGRESSIONS ---- # Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~lm(.x ~ .y), .period = 90, .unlist = FALSE, .align = \"right\") FB %>% drop_na() %>% mutate(numeric_date = as.numeric(date)) %>% mutate(rolling_lm = lm_roll(adjusted, numeric_date)) %>% filter(!is.na(rolling_lm)) #> # A tibble: 918 × 10 #> symbol date open high low close volume adjusted numeric_date #> #> 1 FB 2013-05-13 26.6 27.3 26.5 26.8 29068800 26.8 15838 #> 2 FB 2013-05-14 26.9 27.3 26.8 27.1 24930300 27.1 15839 #> 3 FB 2013-05-15 26.9 27.0 26.4 26.6 30299800 26.6 15840 #> 4 FB 2013-05-16 26.5 26.5 25.9 26.1 35499100 26.1 15841 #> 5 FB 2013-05-17 26.4 26.6 26.2 26.2 29462700 26.2 15842 #> 6 FB 2013-05-20 26.2 26.2 25.7 25.8 42402900 25.8 15845 #> 7 FB 2013-05-21 25.9 26.1 25.6 25.7 26261300 25.7 15846 #> 8 FB 2013-05-22 25.6 25.8 24.9 25.2 45314500 25.2 15847 #> 9 FB 2013-05-23 24.8 25.5 24.8 25.1 37663100 25.1 15848 #> 10 FB 2013-05-24 25.0 25.0 24.1 24.3 58727900 24.3 15849 #> # ℹ 908 more rows #> # ℹ 1 more variable: rolling_lm "},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Rolling Window Transformation — slidify_vec","title":"Rolling Window Transformation — slidify_vec","text":"slidify_vec() applies summary function rolling sequence windows.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rolling Window Transformation — slidify_vec","text":"","code":"slidify_vec( .x, .f, ..., .period = 1, .align = c(\"center\", \"left\", \"right\"), .partial = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Rolling Window Transformation — slidify_vec","text":".x vector rolling window transformation applied. .f summary [function / formula] function, e.g. mean, function used additional arguments, .... formula, e.g. ~ mean(., na.rm = TRUE), converted function. syntax allows create compact anonymous functions. ... Additional arguments passed .f function. .period number periods include local rolling window. effectively \"window size\". .align One \"center\", \"left\" \"right\". .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Rolling Window Transformation — slidify_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rolling Window Transformation — slidify_vec","text":"slidify_vec() function wrapper slider::slide_vec() parameters simplified \"center\", \"left\", \"right\" alignment. Vector Length == Vector Length NA values .partial values always returned ensure length return vector length incoming vector. ensures easier use dplyr::mutate(). Alignment Rolling functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using .partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative smooth_vec(), implements local polynomial regression.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Rolling Window Transformation — slidify_vec","text":"Slider R Package Davis Vaughan","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Rolling Window Transformation — slidify_vec","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # ---- FUNCTION FORMAT ---- # - The `.f = mean` function is used. Argument `na.rm = TRUE` is passed as ... FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .period = 30, .f = mean, na.rm = TRUE, .align = \"center\")) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") #> Warning: Removed 29 rows containing missing values (`geom_line()`). # ---- FORMULA FORMAT ---- # - Anonymous function `.f = ~ mean(., na.rm = TRUE)` is used FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .period = 30, .f = ~ mean(., na.rm = TRUE), .align = \"center\")) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") #> Warning: Removed 29 rows containing missing values (`geom_line()`). # ---- PARTIAL VALUES ---- # - set `.partial = TRUE` FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .f = ~ mean(., na.rm = TRUE), .period = 30, .align = \"center\", .partial = TRUE)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") # ---- Loess vs Moving Average ---- # - Loess: Using `.degree = 0` to make less flexible. Comparable to a moving average. FB_tbl %>% mutate( adjusted_loess_30 = smooth_vec(adjusted, period = 30, degree = 0), adjusted_ma_30 = slidify_vec(adjusted, .f = mean, .period = 30, .partial = TRUE) ) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_loess_30), color = \"red\") + geom_line(aes(y = adjusted_ma_30), color = \"blue\") + labs(title = \"Loess vs Moving Average\")"},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Smoothing Transformation using Loess — smooth_vec","title":"Smoothing Transformation using Loess — smooth_vec","text":"smooth_vec() applies LOESS transformation numeric vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Smoothing Transformation using Loess — smooth_vec","text":"","code":"smooth_vec(x, period = 30, span = NULL, degree = 2)"},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Smoothing Transformation using Loess — smooth_vec","text":"x numeric vector smoothing transformation applied. period number periods include local smoothing. Similar window size moving average. See details explanation period vs span specification. span span percentage data included smoothing window. Period preferred shorter windows fix window size. See details explanation period vs span specification. degree degree polynomials used. Accetable values (least flexible): 0, 1, 2. Set 2 default 2nd order polynomial (flexible).","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Smoothing Transformation using Loess — smooth_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Smoothing Transformation using Loess — smooth_vec","text":"Benefits: using period, effect similar moving average without creating missing values. using span, effect detect trend series using percentage total number observations. Loess Smoother Algorithm function simplified wrapper stats::loess() modification set fixed period rather percentage data points via span. Period vs Span? period fixed whereas span changes number observations change. use Period? effect using period similar Moving Average Window Size Fixed Period. helps trying smooth local trends. want 30-day moving average, specify period = 30. use Span? Span easier specify want Long-Term Trendline window size unknown. can specify span = 0.75 locally regress using window 75% data.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Smoothing Transformation using Loess — smooth_vec","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # ---- PERIOD ---- FB_tbl %>% mutate(adjusted_30 = smooth_vec(adjusted, period = 30, degree = 2)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30), color = \"red\") # ---- SPAN ---- FB_tbl %>% mutate(adjusted_30 = smooth_vec(adjusted, span = 0.75, degree = 2)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30), color = \"red\") # ---- Loess vs Moving Average ---- # - Loess: Using `degree = 0` to make less flexible. Comperable to a moving average. FB_tbl %>% mutate( adjusted_loess_30 = smooth_vec(adjusted, period = 30, degree = 0), adjusted_ma_30 = slidify_vec(adjusted, .period = 30, .f = mean, .partial = TRUE) ) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_loess_30), color = \"red\") + geom_line(aes(y = adjusted_ma_30), color = \"blue\") + labs(title = \"Loess vs Moving Average\")"},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Standardization commonly used center scale numeric features prevent one dominating algorithms require data scale.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"","code":"standardize_vec(x, mean = NULL, sd = NULL, silent = FALSE) standardize_inv_vec(x, mean, sd)"},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"x numeric vector. mean mean used invert standardization sd standard deviation used invert standardization process. silent Whether report automated mean sd parameters message.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Returns numeric vector standardization transformation applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Standardization vs Normalization Standardization refers transformation reduces range mean 0, standard deviation 1 Normalization refers transformation reduces min-max range: (0, 1)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_std <- standardize_vec(d10_daily$value) #> Standardization Parameters #> mean: 2261.60682492582 #> standard deviation: 175.603721730477 value <- standardize_inv_vec(value_std, mean = 2261.60682492582, sd = 175.603721730477) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_std = standardize_vec(value)) #> Standardization Parameters #> mean: 2261.60682492582 #> standard deviation: 175.603721730477 #> Standardization Parameters #> mean: 9243.15525375268 #> standard deviation: 4663.16194403596 #> Standardization Parameters #> mean: 8259.78634615385 #> standard deviation: 927.592527167825 #> Standardization Parameters #> mean: 8287.72878932316 #> standard deviation: 2456.05840988041 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_std #> #> 1 D10 2014-07-03 2076. -1.06 #> 2 D10 2014-07-04 2073. -1.07 #> 3 D10 2014-07-05 2049. -1.21 #> 4 D10 2014-07-06 2049. -1.21 #> 5 D10 2014-07-07 2006. -1.45 #> 6 D10 2014-07-08 2018. -1.39 #> 7 D10 2014-07-09 2019. -1.38 #> 8 D10 2014-07-10 2007. -1.45 #> 9 D10 2014-07-11 2010 -1.43 #> 10 D10 2014-07-12 2002. -1.48 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":null,"dir":"Reference","previous_headings":"","what":"Box-Cox Transformation using Forecast Methods — step_box_cox","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"step_box_cox creates specification recipe step transform data using Box-Cox transformation. function differs recipes::step_BoxCox adding multiple methods including Guerrero lambda optimization handling negative data used Forecast R Package.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"","code":"step_box_cox( recipe, ..., method = c(\"guerrero\", \"loglik\"), limits = c(-1, 2), role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"box_cox\") ) # S3 method for step_box_cox tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. method One \"guerrero\" \"loglik\" limits length 2 numeric vector defining range compute transformation parameter lambda. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained numeric vector transformation values. NULL computed prep(). skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_box_cox object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"step_box_cox() function designed specifically handle time series using methods implemented Forecast R Package. Negative Data function can applied Negative Data. Lambda Optimization Methods function uses 2 methods optimizing lambda selection Forecast R Package: method = \"guerrero\": Guerrero's (1993) method used, lambda minimizes coefficient variation subseries x. method = loglik: value lambda chosen maximize profile log likelihood linear model fitted x. non-seasonal data, linear time trend fitted seasonal data, linear time trend seasonal dummy variables used.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"Guerrero, V.M. (1993) Time-series analysis supported power transformations. Journal Forecasting, 12, 37–48. Box, G. E. P. Cox, D. R. (1964) analysis transformations. JRSS B 26 211–246.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"","code":"library(dplyr) library(tidyr) library(recipes) #> #> Attaching package: ‘recipes’ #> The following object is masked from ‘package:stringr’: #> #> fixed #> The following object is masked from ‘package:stats’: #> #> step library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_box_cox(FB, AMZN, NFLX, GOOG) %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,008 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 12.5 8.28 4.92 5.26 #> 2 2013-01-03 12.4 8.28 5.08 5.27 #> 3 2013-01-04 12.7 8.29 5.06 5.28 #> 4 2013-01-07 12.9 8.37 5.17 5.28 #> 5 2013-01-08 12.8 8.35 5.10 5.28 #> 6 2013-01-09 13.3 8.35 5.06 5.28 #> 7 2013-01-10 13.5 8.34 5.13 5.28 #> 8 2013-01-11 13.7 8.36 5.24 5.28 #> 9 2013-01-14 13.4 8.40 5.32 5.26 #> 10 2013-01-15 13.1 8.39 5.26 5.27 #> # ℹ 998 more rows recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.671 box_cox_mIBbM #> 2 AMZN 0.135 box_cox_mIBbM #> 3 NFLX 0.458 box_cox_mIBbM #> 4 GOOG -0.0388 box_cox_mIBbM"},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a differenced predictor — step_diff","title":"Create a differenced predictor — step_diff","text":"step_diff creates specification recipe step add new columns differenced data. Differenced data include NA values difference induced. can removed step_naomit().","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a differenced predictor — step_diff","text":"","code":"step_diff( recipe, ..., role = \"predictor\", trained = FALSE, lag = 1, difference = 1, log = FALSE, prefix = \"diff_\", columns = NULL, skip = FALSE, id = rand_id(\"diff\") ) # S3 method for step_diff tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a differenced predictor — step_diff","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. role Defaults \"predictor\" trained logical indicate quantities preprocessing estimated. lag vector positive integers identifying lags (far back) included differencing calculation. difference number differences perform. log Calculates log differences instead differences. prefix prefix generated column names, default \"diff_\". columns character string variable names populated (eventually) terms argument. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations id character string unique step identify . x step_diff object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a differenced predictor — step_diff","text":"updated version recipe new step added sequence existing steps ().","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create a differenced predictor — step_diff","text":"step assumes data already proper sequential order lagging.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a differenced predictor — step_diff","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) # Make and apply recipe ---- recipe_diff <- recipe(~ ., data = FANG_wide) %>% step_diff(FB, AMZN, NFLX, GOOG, lag = 1:3, difference = 1) %>% prep() recipe_diff %>% bake(FANG_wide) #> # A tibble: 1,008 × 17 #> date FB AMZN NFLX GOOG diff_1_1_FB diff_1_1_AMZN diff_1_1_NFLX #> #> 1 2013-01-02 28 257. 13.1 361. NA NA NA #> 2 2013-01-03 27.8 258. 13.8 361. -0.230 1.17 0.654 #> 3 2013-01-04 28.8 259. 13.7 369. 0.990 0.670 -0.0871 #> 4 2013-01-07 29.4 268. 14.2 367. 0.66 9.31 0.460 #> 5 2013-01-08 29.1 266. 13.9 366. -0.360 -2.08 -0.291 #> 6 2013-01-09 30.6 266. 13.7 369. 1.53 -0.0300 -0.179 #> 7 2013-01-10 31.3 265. 14 370. 0.710 -1.01 0.299 #> 8 2013-01-11 31.7 268. 14.5 370. 0.420 2.60 0.470 #> 9 2013-01-14 31.0 273. 14.8 361. -0.770 4.79 0.309 #> 10 2013-01-15 30.1 272. 14.5 362. -0.850 -0.830 -0.251 #> # ℹ 998 more rows #> # ℹ 9 more variables: diff_1_1_GOOG , diff_2_1_FB , #> # diff_2_1_AMZN , diff_2_1_NFLX , diff_2_1_GOOG , #> # diff_3_1_FB , diff_3_1_AMZN , diff_3_1_NFLX , #> # diff_3_1_GOOG # Get information with tidy ---- recipe_diff %>% tidy() #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step diff TRUE FALSE diff_mgS6G recipe_diff %>% tidy(1) #> # A tibble: 12 × 5 #> terms lag diff log id #> #> 1 diff_FB_1_1 1 1 FALSE diff_mgS6G #> 2 diff_AMZN_1_1 1 1 FALSE diff_mgS6G #> 3 diff_NFLX_1_1 1 1 FALSE diff_mgS6G #> 4 diff_GOOG_1_1 1 1 FALSE diff_mgS6G #> 5 diff_FB_2_1 2 1 FALSE diff_mgS6G #> 6 diff_AMZN_2_1 2 1 FALSE diff_mgS6G #> 7 diff_NFLX_2_1 2 1 FALSE diff_mgS6G #> 8 diff_GOOG_2_1 2 1 FALSE diff_mgS6G #> 9 diff_FB_3_1 3 1 FALSE diff_mgS6G #> 10 diff_AMZN_3_1 3 1 FALSE diff_mgS6G #> 11 diff_NFLX_3_1 3 1 FALSE diff_mgS6G #> 12 diff_GOOG_3_1 3 1 FALSE diff_mgS6G"},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":null,"dir":"Reference","previous_headings":"","what":"Fourier Features for Modeling Seasonality — step_fourier","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"step_fourier creates specification recipe step convert Date Date-time column Fourier series","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"","code":"step_fourier( recipe, ..., period, K, role = \"predictor\", trained = FALSE, columns = NULL, scale_factor = NULL, skip = FALSE, id = rand_id(\"fourier\") ) # S3 method for step_fourier tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"recipe recipe object. step added sequence operations recipe. ... single column class Date POSIXct. See recipes::selections() details. tidy method, currently used. period numeric period oscillation frequency. See details examples period specification. K number orders include sine/cosine fourier series. orders increase number fourier terms therefore variance fitted model expense bias. See details examples K specification. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. scale_factor factor scaling numeric index extracted date date-time feature. placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_fourier object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"step_fourier, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"Date Variable Unlike steps, step_fourier remove original date variables. recipes::step_rm() can used purpose. Period Specification period argument used generate distance peaks fourier sequence. key line peaks unique seasonalities data. Daily Data, typical period specifications : Yearly frequency 365 Quarterly frequency 365 / 4 = 91.25 Monthly frequency 365 / 12 = 30.42 K Specification K argument specifies maximum number orders Fourier terms. Examples: Specifying period = 365 K = 1 return cos365_K1 sin365_K1 fourier series Specifying period = 365 K = 2 return cos365_K1, cos365_K2, sin365_K1 sin365_K2 sequence, tends increase models ability fit vs K = 1 specification (expense possibly overfitting). Multiple values period K possible specify multiple values period single step step_fourier(period = c(91.25, 365), K = 2. returns 8 Fouriers series: cos91.25_K1, sin91.25_K1, cos91.25_K2, sin91.25_K2 cos365_K1, sin365_K1, cos365_K2, sin365_K2","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # Create a recipe object with a timeseries signature step # - 252 Trade days per year # - period = c(252/4, 252): Adds quarterly and yearly fourier series # - K = 2: Adds 1st and 2nd fourier orders rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_fourier(date, period = c(252/4, 252), K = 2) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Operations #> • Fourier series features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Fourier series features from: date | Trained # Bake the recipe object - Adds the Fourier Series bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,008 × 11 #> symbol date adjusted date_sin63_K1 date_cos63_K1 date_sin63_K2 #> #> 1 FB 2013-01-02 28 0.912 -0.411 -0.750 #> 2 FB 2013-01-03 27.8 0.866 -0.500 -0.866 #> 3 FB 2013-01-04 28.8 0.812 -0.584 -0.948 #> 4 FB 2013-01-07 29.4 0.604 -0.797 -0.963 #> 5 FB 2013-01-08 29.1 0.521 -0.853 -0.890 #> 6 FB 2013-01-09 30.6 0.434 -0.901 -0.782 #> 7 FB 2013-01-10 31.3 0.342 -0.940 -0.643 #> 8 FB 2013-01-11 31.7 0.247 -0.969 -0.478 #> 9 FB 2013-01-14 31.0 -0.0498 -0.999 0.0996 #> 10 FB 2013-01-15 30.1 -0.149 -0.989 0.295 #> # ℹ 998 more rows #> # ℹ 5 more variables: date_cos63_K2 , date_sin252_K1 , #> # date_cos252_K1 , date_sin252_K2 , date_cos252_K2 # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(prep(rec_obj)) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step fourier TRUE FALSE fourier_SXOLn tidy(prep(rec_obj), number = 1) #> # A tibble: 8 × 5 #> terms type K period id #> #> 1 date_sin63_K1 sin 1 63 fourier_SXOLn #> 2 date_cos63_K1 cos 1 63 fourier_SXOLn #> 3 date_sin63_K2 sin 2 63 fourier_SXOLn #> 4 date_cos63_K2 cos 2 63 fourier_SXOLn #> 5 date_sin252_K1 sin 1 252 fourier_SXOLn #> 6 date_cos252_K1 cos 1 252 fourier_SXOLn #> 7 date_sin252_K2 sin 2 252 fourier_SXOLn #> 8 date_cos252_K2 cos 2 252 fourier_SXOLn"},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":null,"dir":"Reference","previous_headings":"","what":"Holiday Feature (Signature) Generator — step_holiday_signature","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"step_holiday_signature creates specification recipe step convert date date-time data many holiday features can aid machine learning time-series data. default, many features returned different holidays, locales, stock exchanges.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"","code":"step_holiday_signature( recipe, ..., holiday_pattern = \".\", locale_set = \"all\", exchange_set = \"all\", role = \"predictor\", trained = FALSE, columns = NULL, features = NULL, skip = FALSE, id = rand_id(\"holiday_signature\") ) # S3 method for step_holiday_signature tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables used create new variables. selected variables class Date POSIXct. See recipes::selections() details. tidy method, currently used. holiday_pattern regular expression pattern search \"Holiday Set\". locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. features character string features generated. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_holiday_signature object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"step_holiday_signature, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"Use Holiday Pattern Feature Sets Pare Features default, going get LOT Features. good thing many machine learning algorithms regularization built . , many cases still want reduce number unnecessary features. : Holiday Pattern: Regular Expression pattern can used filter. Try holiday_pattern = \"(US_Christ)|(US_Thanks)\" return just Christmas Thanksgiving features. Locale Sets: logical whether locale holiday. locales outside US may want combine multiple locales. example, locale_set = c(\"World\", \"GB\") returns World Holidays Great Britain. Exchange Sets: logical whether Business due holiday. Different Stock Exchanges used proxy business holiday calendars. example, exchange_set = \"NYSE\" returns business holidays New York Stock Exchange. Removing Unnecessary Features default, many features created automatically. Unnecessary features can removed using recipes::step_rm() recipes::selections() details.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"","code":"library(recipes) library(timetk) library(tibble) library(dplyr) # Sample Data dates_in_2017_tbl <- tibble( index = tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\") ) # Add US holidays and Non-Working Days due to Holidays # - Physical Holidays are added with holiday pattern (individual) and locale_set rec_holiday <- recipe(~ ., dates_in_2017_tbl) %>% step_holiday_signature(index, holiday_pattern = \"^US_\", locale_set = \"US\", exchange_set = \"NYSE\") # Not yet prep'ed - just returns parameters selected rec_holiday %>% tidy(1) #> # A tibble: 3 × 4 #> terms param value id #> #> 1 index holiday_pattern ^US_ holiday_signature_L26gp #> 2 index locale_set US holiday_signature_L26gp #> 3 index exchange_set NYSE holiday_signature_L26gp # Prep the recipe rec_holiday_prep <- prep(rec_holiday) # Now prep'ed - returns new features that will be created rec_holiday_prep %>% tidy(1) #> # A tibble: 20 × 3 #> terms value id #> #> 1 index exch_NYSE holiday_signature_L26gp #> 2 index locale_US holiday_signature_L26gp #> 3 index US_NewYearsDay holiday_signature_L26gp #> 4 index US_MLKingsBirthday holiday_signature_L26gp #> 5 index US_InaugurationDay holiday_signature_L26gp #> 6 index US_LincolnsBirthday holiday_signature_L26gp #> 7 index US_PresidentsDay holiday_signature_L26gp #> 8 index US_WashingtonsBirthday holiday_signature_L26gp #> 9 index US_CPulaskisBirthday holiday_signature_L26gp #> 10 index US_GoodFriday holiday_signature_L26gp #> 11 index US_DecorationMemorialDay holiday_signature_L26gp #> 12 index US_MemorialDay holiday_signature_L26gp #> 13 index US_JuneteenthNationalIndependenceDay holiday_signature_L26gp #> 14 index US_IndependenceDay holiday_signature_L26gp #> 15 index US_LaborDay holiday_signature_L26gp #> 16 index US_ColumbusDay holiday_signature_L26gp #> 17 index US_ElectionDay holiday_signature_L26gp #> 18 index US_VeteransDay holiday_signature_L26gp #> 19 index US_ThanksgivingDay holiday_signature_L26gp #> 20 index US_ChristmasDay holiday_signature_L26gp # Apply the recipe to add new holiday features! bake(rec_holiday_prep, dates_in_2017_tbl) #> # A tibble: 365 × 21 #> index index_exch_NYSE index_locale_US index_US_NewYearsDay #> #> 1 2017-01-01 0 1 1 #> 2 2017-01-02 1 0 0 #> 3 2017-01-03 0 0 0 #> 4 2017-01-04 0 0 0 #> 5 2017-01-05 0 0 0 #> 6 2017-01-06 0 0 0 #> 7 2017-01-07 0 0 0 #> 8 2017-01-08 0 0 0 #> 9 2017-01-09 0 0 0 #> 10 2017-01-10 0 0 0 #> # ℹ 355 more rows #> # ℹ 17 more variables: index_US_MLKingsBirthday , #> # index_US_InaugurationDay , index_US_LincolnsBirthday , #> # index_US_PresidentsDay , index_US_WashingtonsBirthday , #> # index_US_CPulaskisBirthday , index_US_GoodFriday , #> # index_US_MemorialDay , index_US_DecorationMemorialDay , #> # index_US_JuneteenthNationalIndependenceDay , …"},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":null,"dir":"Reference","previous_headings":"","what":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"step_log_interval creates specification recipe step transform data using Log-Inerval transformation. function provides recipes interface log_interval_vec() transformation function.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"","code":"step_log_interval( recipe, ..., limit_lower = \"auto\", limit_upper = \"auto\", offset = 0, role = NA, trained = FALSE, limit_lower_trained = NULL, limit_upper_trained = NULL, skip = FALSE, id = rand_id(\"log_interval\") ) # S3 method for step_log_interval tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. limit_lower lower limit. Must less minimum value. set \"auto\", selects zero. limit_upper upper limit. Must greater maximum value. set \"auto\", selects value 10% greater maximum value. offset offset include log transformation. Useful data contains values less equal zero. role used step since new variables created. trained logical indicate quantities preprocessing estimated. limit_lower_trained numeric vector transformation values. NULL computed prep(). limit_upper_trained numeric vector transformation values. NULL computed prep(). skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_log_interval object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"step_log_interval() function designed specifically handle time series using methods implemented Forecast R Package. Positive Data data includes values zero, use offset adjust series make values positive. Implementation Refer log_interval_vec() function transformation implementation details.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) recipe_log_interval <- recipe(~ ., data = FANG_wide) %>% step_log_interval(FB, AMZN, NFLX, GOOG, offset = 1) %>% prep() #> $FB #> [1] 0 #> #> $FB #> [1] 145.318 #> #> $AMZN #> [1] 0 #> #> $AMZN #> [1] 904.973 #> #> $NFLX #> [1] 0 #> #> $NFLX #> [1] 143.7086 #> #> $GOOG #> [1] 0 #> #> $GOOG #> [1] 860.3125 #> recipe_log_interval %>% bake(FANG_wide) %>% pivot_longer(-date) %>% plot_time_series(date, value, name, .smooth = FALSE, .interactive = FALSE) #> $FB #> [1] 0 #> #> $FB #> [1] 145.318 #> #> $AMZN #> [1] 0 #> #> $AMZN #> [1] 904.973 #> #> $NFLX #> [1] 0 #> #> $NFLX #> [1] 143.7086 #> #> $GOOG #> [1] 0 #> #> $GOOG #> [1] 860.3125 #> recipe_log_interval %>% tidy(1) #> # A tibble: 4 × 5 #> terms limit_lower limit_upper offset id #> #> 1 FB 0 145. 1 log_interval_PuiJW #> 2 AMZN 0 905. 1 log_interval_PuiJW #> 3 NFLX 0 144. 1 log_interval_PuiJW #> 4 GOOG 0 860. 1 log_interval_PuiJW"},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Slidify Rolling Window Transformation — step_slidify","title":"Slidify Rolling Window Transformation — step_slidify","text":"step_slidify creates specification recipe step apply function one Numeric column(s).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Slidify Rolling Window Transformation — step_slidify","text":"","code":"step_slidify( recipe, ..., period, .f, align = c(\"center\", \"left\", \"right\"), partial = FALSE, names = NULL, role = \"predictor\", trained = FALSE, columns = NULL, f_name = NULL, skip = FALSE, id = rand_id(\"slidify\") ) # S3 method for step_slidify tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Slidify Rolling Window Transformation — step_slidify","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local rolling window. effectively \"window size\". .f summary formula one following formats: mean arguments function(x) mean(x, na.rm = TRUE) ~ mean(.x, na.rm = TRUE), converted function. align Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. names optional character string length number terms selected terms. names new columns created step. NULL, existing columns transformed. NULL, new columns created. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. f_name character string function applied. field placeholder populated tidy() step. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_slidify object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Slidify Rolling Window Transformation — step_slidify","text":"step_slidify, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Slidify Rolling Window Transformation — step_slidify","text":"Alignment Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA partial values added end shift series Left. Right: NA partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative step_smooth(), implements local polynomial regression.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Slidify Rolling Window Transformation — step_slidify","text":"","code":"library(recipes) library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # New Data - Make some fake new data next 90 time stamps new_data <- FB_tbl %>% tail(90) %>% mutate(date = date %>% tk_make_future_timeseries(length_out = 90)) # OVERWRITE EXISTING COLUMNS ----- # Create a recipe object with a step_slidify rec_ma_50 <- recipe(adjusted ~ ., data = FB_tbl) %>% step_slidify(adjusted, period = 50, .f = ~ mean(.x)) # Bake the recipe object - Applies the Moving Average Transformation training_data_baked <- bake(prep(rec_ma_50), FB_tbl) # Apply to New Data new_data_baked <- bake(prep(rec_ma_50), new_data) # Visualize effect training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) #> Warning: Removed 49 rows containing missing values (`geom_line()`). #> Warning: Removed 49 rows containing missing values (`geom_line()`). # ---- NEW COLUMNS ---- # Use the `names` argument to create new columns instead of overwriting existing rec_ma_30_names <- recipe(adjusted ~ ., data = FB_tbl) %>% step_slidify(adjusted, period = 30, .f = mean, names = \"adjusted_ma_30\") bake(prep(rec_ma_30_names), FB_tbl) %>% ggplot(aes(date, adjusted)) + geom_line(alpha = 0.5) + geom_line(aes(y = adjusted_ma_30), color = \"red\", size = 1) #> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. #> ℹ Please use `linewidth` instead. #> Warning: Removed 29 rows containing missing values (`geom_line()`)."},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":null,"dir":"Reference","previous_headings":"","what":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"step_slidify_augment creates specification recipe step \"augment\" (add multiple new columns) sliding function applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"","code":"step_slidify_augment( recipe, ..., period, .f, align = c(\"center\", \"left\", \"right\"), partial = FALSE, prefix = \"slidify_\", role = \"predictor\", trained = FALSE, columns = NULL, f_name = NULL, skip = FALSE, id = rand_id(\"slidify_augment\") ) # S3 method for step_slidify_augment tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local rolling window. effectively \"window size\". .f summary formula one following formats: mean arguments function(x) mean(x, na.rm = TRUE) ~ mean(.x, na.rm = TRUE), converted function. align Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. prefix prefix generated column names, default \"slidify_\". role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variable names populated (eventually) terms argument. f_name character string function applied. field placeholder populated tidy() step. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations id character string unique step identify . x step_slidify_augment object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"step_slidify_augment, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"Alignment Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA partial values added end shift series Left. Right: NA partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative step_smooth(), implements local polynomial regression.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"","code":"library(tidymodels) #> ── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ── #> ✔ broom 1.0.5 ✔ purrr 1.0.2 #> ✔ dials 1.2.0 ✔ tune 1.1.2 #> ✔ infer 1.0.5 ✔ workflows 1.1.3 #> ✔ modeldata 1.2.0 ✔ workflowsets 1.0.1 #> ✔ parsnip 1.1.1 ✔ yardstick 1.2.0 #> ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ── #> ✖ purrr::discard() masks scales::discard() #> ✖ dplyr::filter() masks stats::filter() #> ✖ recipes::fixed() masks stringr::fixed() #> ✖ dplyr::lag() masks stats::lag() #> ✖ recipes::step() masks stats::step() #> • Use tidymodels_prefer() to resolve common conflicts. library(dplyr) library(timetk) m750 <- m4_monthly %>% filter(id == \"M750\") %>% mutate(value_2 = value / 2) m750_splits <- time_series_split(m750, assess = \"2 years\", cumulative = TRUE) #> Using date_var: date # Make a recipe recipe_spec <- recipe(value ~ date + value_2, training(m750_splits)) %>% step_slidify_augment( value, value_2, period = c(6, 12, 24), .f = ~ mean(.x), align = \"center\", partial = FALSE ) recipe_spec %>% prep() %>% juice() #> # A tibble: 282 × 9 #> date value_2 value slidify_6_value slidify_6_value_2 slidify_12_value #> #> 1 1990-01-01 3185 6370 NA NA NA #> 2 1990-02-01 3215 6430 NA NA NA #> 3 1990-03-01 3260 6520 6535 3268. NA #> 4 1990-04-01 3290 6580 6473. 3237. NA #> 5 1990-05-01 3310 6620 6310 3155 NA #> 6 1990-06-01 3345 6690 6303. 3152. 6481. #> 7 1990-07-01 3000 6000 6343. 3172. 6527. #> 8 1990-08-01 2725 5450 6383. 3192. 6567. #> 9 1990-09-01 3240 6480 6427. 3213. 6603. #> 10 1990-10-01 3410 6820 6580 3290 6638. #> # ℹ 272 more rows #> # ℹ 3 more variables: slidify_12_value_2 , slidify_24_value , #> # slidify_24_value_2 bake(prep(recipe_spec), testing(m750_splits)) #> # A tibble: 24 × 9 #> date value_2 value slidify_6_value slidify_6_value_2 slidify_12_value #> #> 1 2013-07-01 4515 9030 NA NA NA #> 2 2013-08-01 4810 9620 NA NA NA #> 3 2013-09-01 5025 10050 10107. 5053. NA #> 4 2013-10-01 5305 10610 10390 5195 NA #> 5 2013-11-01 5380 10760 10563. 5282. NA #> 6 2013-12-01 5285 10570 10705 5352. 10472. #> 7 2014-01-01 5365 10730 10773. 5387. 10498. #> 8 2014-02-01 5330 10660 10803. 5402. 10521. #> 9 2014-03-01 5450 10900 10837. 5418. 10547. #> 10 2014-04-01 5510 11020 10605 5302. 10575 #> # ℹ 14 more rows #> # ℹ 3 more variables: slidify_12_value_2 , slidify_24_value , #> # slidify_24_value_2 "},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":null,"dir":"Reference","previous_headings":"","what":"Smoothing Transformation using Loess — step_smooth","title":"Smoothing Transformation using Loess — step_smooth","text":"step_smooth creates specification recipe step apply local polynomial regression one Numeric column(s). effect smoothing time series similar moving average without creating missing values using partial smoothing.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Smoothing Transformation using Loess — step_smooth","text":"","code":"step_smooth( recipe, ..., period = 30, span = NULL, degree = 2, names = NULL, role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"smooth\") ) # S3 method for step_smooth tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Smoothing Transformation using Loess — step_smooth","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local smoothing. Similar window size moving average. See details explanation period vs span specification. span span percentage data included smoothing window. Period preferred shorter windows fix window size. See details explanation period vs span specification. degree degree polynomials used. Set 2 default 2nd order polynomial. names optional character string length number terms selected terms. names new columns created step. NULL, existing columns transformed. NULL, new columns created. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_smooth object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Smoothing Transformation using Loess — step_smooth","text":"step_smooth, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Smoothing Transformation using Loess — step_smooth","text":"Smoother Algorithm function recipe specification wraps stats::loess() modification set fixed period rather percentage data points via span. Period vs Span? period fixed whereas span changes number observations change. use Period? effect using period similar Moving Average Window Size Fixed Period. helps trying smooth local trends. want 30-day moving average, specify period = 30. use Span? Span easier specify want Long-Term Trendline window size unknown. can specify span = 0.75 locally regress using window 75% data. Warning - Using Span New Data using span New Data, number observations likely different trained . means trendline / smoother can vastly different smoother trained . Solution Span New Data use span. Rather, use period fix window size. ensures new data includes number observations local polynomial regression (loess) training data.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Smoothing Transformation using Loess — step_smooth","text":"","code":"library(recipes) library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # New Data - Make some fake new data next 90 time stamps new_data <- FB_tbl %>% tail(90) %>% mutate(date = date %>% tk_make_future_timeseries(length_out = 90)) # ---- PERIOD ---- # Create a recipe object with a step_smooth() rec_smooth_period <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, period = 30) # Bake the recipe object - Applies the Loess Transformation training_data_baked <- bake(prep(rec_smooth_period), FB_tbl) # \"Period\" Effect on New Data new_data_baked <- bake(prep(rec_smooth_period), new_data) # Smoother's fit on new data is very similar because # 30 days are used in the new data regardless of the new data being 90 days training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) # ---- SPAN ---- # Create a recipe object with a step_smooth rec_smooth_span <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, span = 0.03) # Bake the recipe object - Applies the Loess Transformation training_data_baked <- bake(prep(rec_smooth_span), FB_tbl) # \"Period\" Effect on New Data new_data_baked <- bake(prep(rec_smooth_span), new_data) #> Warning: span too small. fewer data values than degrees of freedom. #> Warning: pseudoinverse used at 0.555 #> Warning: neighborhood radius 1.445 #> Warning: reciprocal condition number 0 #> Warning: There are other near singularities as well. 2.088 # Smoother's fit is not the same using span because new data is only 90 days # and 0.03 x 90 = 2.7 days training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) # ---- NEW COLUMNS ---- # Use the `names` argument to create new columns instead of overwriting existing rec_smooth_names <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, period = 30, names = \"adjusted_smooth_30\") %>% step_smooth(adjusted, period = 180, names = \"adjusted_smooth_180\") %>% step_smooth(adjusted, span = 0.75, names = \"long_term_trend\") bake(prep(rec_smooth_names), FB_tbl) %>% ggplot(aes(date, adjusted)) + geom_line(alpha = 0.5) + geom_line(aes(y = adjusted_smooth_30), color = \"red\", size = 1) + geom_line(aes(y = adjusted_smooth_180), color = \"blue\", size = 1) + geom_line(aes(y = long_term_trend), color = \"orange\", size = 1)"},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Feature (Signature) Generator — step_timeseries_signature","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"step_timeseries_signature creates specification recipe step convert date date-time data many features can aid machine learning time-series data","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"","code":"step_timeseries_signature( recipe, ..., role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"timeseries_signature\") ) # S3 method for step_timeseries_signature tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables used create new variables. selected variables class Date POSIXct. See recipes::selections() details. tidy method, currently used. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_timeseries_signature object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"step_timeseries_signature, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"Date Variable Unlike steps, step_timeseries_signature remove original date variables. recipes::step_rm() can used purpose. Scaling index.num index.num feature created large magnitude (number seconds since 1970-01-01). good idea scale center feature (e.g. use recipes::step_normalize()). Removing Unnecessary Features default, many features created automatically. Unnecessary features can removed using recipes::step_rm().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") # Create a recipe object with a timeseries signature step rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_timeseries_signature(date) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 7 #> #> ── Operations #> • Timeseries signature features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 7 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Timeseries signature features from: date | Trained # Bake the recipe object - Adds the Time Series Signature bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,008 × 35 #> symbol date open high low close volume adjusted date_index.num #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 1357084800 #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 1357171200 #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 1357257600 #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 1357516800 #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 1357603200 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 1357689600 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 1357776000 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 1357862400 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 1358121600 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 1358208000 #> # ℹ 998 more rows #> # ℹ 26 more variables: date_year , date_year.iso , date_half , #> # date_quarter , date_month , date_month.xts , #> # date_month.lbl , date_day , date_hour , date_minute , #> # date_second , date_hour12 , date_am.pm , date_wday , #> # date_wday.xts , date_wday.lbl , date_mday , date_qday , #> # date_yday , date_mweek , date_week , date_week.iso , … # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(rec_obj) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step timeseries_signature FALSE FALSE timeseries_signature_2rHiP tidy(rec_obj, number = 1) #> # A tibble: 27 × 3 #> terms value id #> #> 1 date index.num timeseries_signature_2rHiP #> 2 date year timeseries_signature_2rHiP #> 3 date year.iso timeseries_signature_2rHiP #> 4 date half timeseries_signature_2rHiP #> 5 date quarter timeseries_signature_2rHiP #> 6 date month timeseries_signature_2rHiP #> 7 date month.xts timeseries_signature_2rHiP #> 8 date month.lbl timeseries_signature_2rHiP #> 9 date day timeseries_signature_2rHiP #> 10 date hour timeseries_signature_2rHiP #> # ℹ 17 more rows"},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":null,"dir":"Reference","previous_headings":"","what":"Clean Outliers and Missing Data for Time Series — step_ts_clean","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"step_ts_clean creates specification recipe step clean outliers impute time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"","code":"step_ts_clean( recipe, ..., period = 1, lambda = \"auto\", role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"ts_clean\") ) # S3 method for step_ts_clean tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained named numeric vector lambdas. NULL computed recipes::prep(). Note , original data integers, mean converted integer maintain data type. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_clean object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"step_ts_clean() function designed specifically handle time series using seasonal outlier detection methods implemented Forecast R Package. Cleaning Outliers #' Outliers replaced missing values using following methods: Non-Seasonal (period = 1): Uses stats::supsmu() Seasonal (period > 1): Uses forecast::mstl() robust = TRUE (robust STL decomposition) seasonal series. Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) # Get missing values FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: day FANG_wide #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 NA NA NA NA #> 5 2013-01-06 NA NA NA NA #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Apply Imputation recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_ts_clean(FB, AMZN, NFLX, GOOG, period = 252) %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 28.2 262. 14.1 365. #> 5 2013-01-06 28.4 264. 14.6 366. #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Lambda parameter used during imputation process recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.912 ts_clean_HgyG5 #> 2 AMZN 0.557 ts_clean_HgyG5 #> 3 NFLX 0.532 ts_clean_HgyG5 #> 4 GOOG -1.00 ts_clean_HgyG5"},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":null,"dir":"Reference","previous_headings":"","what":"Missing Data Imputation for Time Series — step_ts_impute","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"step_ts_impute creates specification recipe step impute time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"","code":"step_ts_impute( recipe, ..., period = 1, lambda = NULL, role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"ts_impute\") ) # S3 method for step_ts_impute tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained named numeric vector lambdas. NULL computed recipes::prep(). Note , original data integers, mean converted integer maintain data type. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_impute object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"step_ts_impute() function designed specifically handle time series Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) # Get missing values FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: day FANG_wide #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 NA NA NA NA #> 5 2013-01-06 NA NA NA NA #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Apply Imputation recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_ts_impute(FB, AMZN, NFLX, GOOG, period = 252, lambda = \"auto\") %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 28.2 262. 14.1 365. #> 5 2013-01-06 28.4 264. 14.6 366. #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Lambda parameter used during imputation process recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.912 ts_impute_gTaDW #> 2 AMZN 0.557 ts_impute_gTaDW #> 3 NFLX 0.532 ts_impute_gTaDW #> 4 GOOG -1.00 ts_impute_gTaDW"},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":null,"dir":"Reference","previous_headings":"","what":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"step_ts_pad creates specification recipe step analyze Date Date-time column adding rows specified interval.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"","code":"step_ts_pad( recipe, ..., by = \"day\", pad_value = NA, role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"ts_padding\") ) # S3 method for step_ts_pad tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"recipe recipe object. step added sequence operations recipe. ... single column class Date POSIXct. See recipes::selections() details. tidy method, currently used. Either \"auto\", time-based frequency like \"year\", \"month\", \"day\", \"hour\", etc, time expression like \"5 min\", \"7 days\". See Details. pad_value Fills padded values. Default NA. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_pad object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"step_ts_pad, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"Date Variable one date date-time variable may supplied. step_ts_pad()) remove original date variables. Interval Specification () Padding can applied following ways: eight intervals : year, quarter, month, week, day, hour, min, sec. Intervals like 30 minutes, 1 hours, 14 days possible. Imputing Missing Values generic pad_value defaults NA, typically requires imputation. common strategies include: Numeric data: step_ts_impute() preprocessing step can used impute numeric time series data without seasonality Nominal data: step_mode_impute() preprocessing step can used replace missing values common value.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_ts_pad(date, by = \"day\", pad_value = NA) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Operations #> • Padded time series features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Padded time series features from: date | Trained # Bake the recipe object - Adds the padding bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,459 × 3 #> symbol date adjusted #> #> 1 FB 2013-01-02 28 #> 2 FB 2013-01-03 27.8 #> 3 FB 2013-01-04 28.8 #> 4 NA 2013-01-05 NA #> 5 NA 2013-01-06 NA #> 6 FB 2013-01-07 29.4 #> 7 FB 2013-01-08 29.1 #> 8 FB 2013-01-09 30.6 #> 9 FB 2013-01-10 31.3 #> 10 FB 2013-01-11 31.7 #> # ℹ 1,449 more rows # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(prep(rec_obj)) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step ts_pad TRUE FALSE ts_padding_AppOW tidy(prep(rec_obj), number = 1) #> # A tibble: 1 × 4 #> terms by pad_value id #> #> 1 date day NA ts_padding_AppOW"},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Summarise (for Time Series Data) — summarise_by_time","title":"Summarise (for Time Series Data) — summarise_by_time","text":"summarise_by_time() time-based variant popular dplyr::summarise() function uses .date_var specify date date-time column .group calculation groups like \"5 seconds\", \"week\", \"3 months\". summarise_by_time() summarize_by_time() synonyms.","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarise (for Time Series Data) — summarise_by_time","text":"","code":"summarise_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\"), .week_start = NULL ) summarize_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\"), .week_start = NULL )"},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarise (for Time Series Data) — summarise_by_time","text":".data tbl object data.frame .date_var column containing date date-time values summarize. missing, attempts auto-detect date column. .time unit summarise . Time units collapsed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed. ... Name-value pairs summary functions. name name variable result. value can : vector length 1, e.g. min(x), n(), sum(.na(y)). vector length n, e.g. quantile(). data frame, add multiple columns single expression. .type One \"floor\", \"ceiling\", \"round. Defaults \"floor\". See lubridate::round_date. .week_start unit weeks, specify reference day. 7 represents Sunday 1 represents Monday.","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summarise (for Time Series Data) — summarise_by_time","text":"tibble data.frame","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"useful-summary-functions","dir":"Reference","previous_headings":"","what":"Useful summary functions","title":"Summarise (for Time Series Data) — summarise_by_time","text":"Sum: sum() Center: mean(), median() Spread: sd(), var() Range: min(), max() Count: dplyr::n(), dplyr::n_distinct() Position: dplyr::first(), dplyr::last(), dplyr::nth() Correlation: cor(), cov()","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarise (for Time Series Data) — summarise_by_time","text":"","code":"# Libraries library(timetk) library(dplyr) # First value in each month m4_daily %>% group_by(id) %>% summarise_by_time( .date_var = date, .by = \"month\", # Setup for monthly aggregation # Summarization value = first(value) ) #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-01 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # Last value in each month (day is first day of next month with ceiling option) m4_daily %>% group_by(id) %>% summarise_by_time( .by = \"month\", value = last(value), .type = \"ceiling\" ) %>% # Shift to the last day of the month mutate(date = date %-time% \"1 day\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows # Total each year (.by is set to \"year\" now) m4_daily %>% group_by(id) %>% summarise_by_time( .by = \"year\", value = sum(value) ) #> .date_var is missing. Using: date #> # A tibble: 30 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-01-01 377389. #> 2 D10 2015-01-01 839533. #> 3 D10 2016-01-01 307401. #> 4 D160 2000-01-01 767500. #> 5 D160 2001-01-01 871497. #> 6 D160 2002-01-01 1464374. #> 7 D160 2003-01-01 3160291. #> 8 D160 2004-01-01 5424860 #> 9 D160 2005-01-01 6127995. #> 10 D160 2006-01-01 3694712. #> # ℹ 20 more rows"},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":null,"dir":"Reference","previous_headings":"","what":"Half-hourly electricity demand — taylor_30_min","title":"Half-hourly electricity demand — taylor_30_min","text":"Half-hourly electricity demand England Wales Monday 5 June 2000 Sunday 27 August 2000. Discussed Taylor (2003).","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Half-hourly electricity demand — taylor_30_min","text":"","code":"taylor_30_min"},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Half-hourly electricity demand — taylor_30_min","text":"tibble: 4,032 x 2 date: date-time variable 30-minute increments value: Electricity demand Megawatts","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Half-hourly electricity demand — taylor_30_min","text":"James W Taylor","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Half-hourly electricity demand — taylor_30_min","text":"Taylor, J.W. (2003) Short-term electricity demand forecasting using double seasonal exponential smoothing. Journal Operational Research Society, 54, 799-805.","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Half-hourly electricity demand — taylor_30_min","text":"","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/reference/tidyeval.html","id":null,"dir":"Reference","previous_headings":"","what":"Tidy eval helpers — tidyeval","title":"Tidy eval helpers — tidyeval","text":"sym creates symbol string syms creates list symbols character vector. enquo enquos delay execution one several function arguments. enquo() returns single quoted expression, like blueprint delayed computation. enquos() returns list quoted expressions. expr quotes new expression locally. mostly useful build new expressions around arguments captured enquo() enquos(): expr(mean(!!enquo(arg), na.rm = TRUE)). as_name transforms quoted variable name string. Supplying something else quoted variable name error. unlike as_label also returns single string supports kind R object input, including quoted function calls vectors. purpose summarise object single label. label often suitable default name. know quoted expression contains (instance expressions captured enquo() variable name, call function, unquoted constant), use as_label(). know quoted simple variable name, like enforce , use as_name(). learn tidy eval use tools, visit Metaprogramming section Advanced R.","code":""},{"path":"https://business-science.github.io/timetk/reference/tidyeval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tidy eval helpers — tidyeval","text":"Nothing returned. document important functions rlang used internal R package.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":null,"dir":"Reference","previous_headings":"","what":"Add / Subtract (For Time Series) — time_arithmetic","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"easiest way add / subtract period time series date date-time vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"","code":"add_time(index, period) subtract_time(index, period) index %+time% period index %-time% period"},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"index date date-time vector. Can also accept character representation. period period add. Accepts character strings like \"5 seconds\", \"2 days\", complex strings like \"1 month 4 days 34 minutes\".","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"date datetime (POSIXct) vector length index time values shifted +/- period.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"convenient wrapper lubridate::period(). Adds subtracts period time-based index. Great : Finding timestamp n-periods future past Shifting time-based index. Note NA values may present dates exist. Period Specification period argument accepts complex strings like: \"1 month 4 days 43 minutes\" \"second = 3, minute = 1, hour = 2, day = 13, week = 1\"","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"","code":"library(timetk) # ---- LOCATING A DATE N-PERIODS IN FUTURE / PAST ---- # Forward (Plus Time) \"2021\" %+time% \"1 hour 34 seconds\" #> [1] \"2021-01-01 01:00:34 UTC\" \"2021\" %+time% \"3 months\" #> [1] \"2021-04-01\" \"2021\" %+time% \"1 year 3 months 6 days\" #> [1] \"2022-04-07\" # Backward (Minus Time) \"2021\" %-time% \"1 hour 34 seconds\" #> [1] \"2020-12-31 22:59:26 UTC\" \"2021\" %-time% \"3 months\" #> [1] \"2020-10-01\" \"2021\" %-time% \"1 year 3 months 6 days\" #> [1] \"2019-09-25\" # ---- INDEX SHIFTING ---- index_daily <- tk_make_timeseries(\"2016\", \"2016-02-01\") #> Using by: day # ADD TIME # - Note `NA` values created where a daily dates aren't possible # (e.g. Feb 29 & 30, 2016 doesn't exist). index_daily %+time% \"1 month\" #> Warning: Missing values created during time addition. This can happen if dates do not exist. #> [1] \"2016-02-01\" \"2016-02-02\" \"2016-02-03\" \"2016-02-04\" \"2016-02-05\" #> [6] \"2016-02-06\" \"2016-02-07\" \"2016-02-08\" \"2016-02-09\" \"2016-02-10\" #> [11] \"2016-02-11\" \"2016-02-12\" \"2016-02-13\" \"2016-02-14\" \"2016-02-15\" #> [16] \"2016-02-16\" \"2016-02-17\" \"2016-02-18\" \"2016-02-19\" \"2016-02-20\" #> [21] \"2016-02-21\" \"2016-02-22\" \"2016-02-23\" \"2016-02-24\" \"2016-02-25\" #> [26] \"2016-02-26\" \"2016-02-27\" \"2016-02-28\" \"2016-02-29\" NA #> [31] NA \"2016-03-01\" # Subtracting Time index_daily %-time% \"1 month\" #> [1] \"2015-12-01\" \"2015-12-02\" \"2015-12-03\" \"2015-12-04\" \"2015-12-05\" #> [6] \"2015-12-06\" \"2015-12-07\" \"2015-12-08\" \"2015-12-09\" \"2015-12-10\" #> [11] \"2015-12-11\" \"2015-12-12\" \"2015-12-13\" \"2015-12-14\" \"2015-12-15\" #> [16] \"2015-12-16\" \"2015-12-17\" \"2015-12-18\" \"2015-12-19\" \"2015-12-20\" #> [21] \"2015-12-21\" \"2015-12-22\" \"2015-12-23\" \"2015-12-24\" \"2015-12-25\" #> [26] \"2015-12-26\" \"2015-12-27\" \"2015-12-28\" \"2015-12-29\" \"2015-12-30\" #> [31] \"2015-12-31\" \"2016-01-01\""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Cross Validation — time_series_cv","title":"Time Series Cross Validation — time_series_cv","text":"Create rsample cross validation sets time series. function produces sampling plan starting recent time series observations, rolling backwards. sampling procedure similar rsample::rolling_origin(), places focus cross validation recent time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Cross Validation — time_series_cv","text":"","code":"time_series_cv( data, date_var = NULL, initial = 5, assess = 1, skip = 1, lag = 0, cumulative = FALSE, slice_limit = n(), point_forecast = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Cross Validation — time_series_cv","text":"data data frame. date_var date date-time variable. initial number samples used analysis/modeling initial resample. assess number samples used assessment resample. skip integer indicating many () additional resamples skip thin total amount data points analysis resample. See example . lag value include lag assessment analysis set. useful lagged predictors used training testing. cumulative logical. analysis resample grow beyond size specified initial resample?. slice_limit number slices return. Set dplyr::n(), returns maximum number slices. point_forecast Whether testing set single point forecast forecast horizon. default forecast horizon. Default: FALSE ... currently used.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Cross Validation — time_series_cv","text":"tibble classes time_series_cv, rset, tbl_df, tbl, data.frame. results include column data split objects column called id character string resample identifier.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Cross Validation — time_series_cv","text":"Time-Based Specification initial, assess, skip, lag variables can specified : Numeric: initial = 24 Time-Based Phrases: initial = \"2 years\", data contains date_var (date datetime) Initial (Training Set) Assess (Testing Set) main options, initial assess, control number data points original data analysis (training set) assessment (testing set), respectively. Skip skip enables function use every data point resamples. skip = 1, resampling data sets increment one position. Example: Suppose rows data set consecutive days. Using skip = 7 make analysis data set operate weeks instead days. assessment set size affected option. Lag Lag parameter creates overlap Testing set. needed lagged predictors used. Cumulative vs Sliding Window cumulative = TRUE, initial parameter ignored analysis (training) set grow resampling continues assessment (testing) set size always remain static. cumulative = FALSE, initial parameter fixes analysis (training) set resampling occurs fixed window. Slice Limit controls number slices. slice_limit = 5, recent 5 slices returned. Point Forecast point forecast sometimes desired want forecast value \"4-weeks\" future. can setting following parameters: assess = \"4 weeks\" point_forecast = TRUE Panel Data / Time Series Groups / Overlapping Timestamps Overlapping timestamps occur data one time series group. sometimes called Panel Data Time Series Groups. timestamps duplicated (case \"Panel Data\" \"Time Series Groups\"), resample calculation applies sliding window fixed length dataset. See example using walmart_sales_weekly dataset .","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Cross Validation — time_series_cv","text":"","code":"library(dplyr) library(timetk) # DATA ---- m750 <- m4_monthly %>% filter(id == \"M750\") # RESAMPLE SPEC ---- resample_spec <- time_series_cv(data = m750, initial = \"6 years\", assess = \"24 months\", skip = \"24 months\", cumulative = FALSE, slice_limit = 3) #> Using date_var: date resample_spec #> # Time Series Cross Validation Plan #> # A tibble: 3 × 2 #> splits id #> #> 1 Slice1 #> 2 Slice2 #> 3 Slice3 # VISUALIZE CV PLAN ---- # Select date and value columns from the tscv diagnostic tool resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 288 × 5 #> .id .key id date value #> #> 1 Slice1 training M750 2007-07-01 8710 #> 2 Slice1 training M750 2007-08-01 8300 #> 3 Slice1 training M750 2007-09-01 8910 #> 4 Slice1 training M750 2007-10-01 9710 #> 5 Slice1 training M750 2007-11-01 9870 #> 6 Slice1 training M750 2007-12-01 9980 #> 7 Slice1 training M750 2008-01-01 9970 #> 8 Slice1 training M750 2008-02-01 9970 #> 9 Slice1 training M750 2008-03-01 10120 #> 10 Slice1 training M750 2008-04-01 10150 #> # ℹ 278 more rows # Plot the date and value columns to see the CV Plan resample_spec %>% plot_time_series_cv_plan(date, value, .interactive = FALSE) # PANEL DATA / TIME SERIES GROUPS ---- # - Time Series Groups are processed using an *ungrouped* data set # - The data has sliding windows applied starting with the beginning of the series # - The seven groups of weekly time series are # processed together for dimensions walmart_tscv <- walmart_sales_weekly %>% time_series_cv( date_var = Date, initial = \"12 months\", assess = \"3 months\", skip = \"3 months\", slice_limit = 4 ) #> Data is not ordered by the 'date_var'. Resamples will be arranged by `Date`. #> Overlapping Timestamps Detected. Processing overlapping time series together using sliding windows. walmart_tscv #> # Time Series Cross Validation Plan #> # A tibble: 4 × 2 #> splits id #> #> 1 Slice1 #> 2 Slice2 #> 3 Slice3 #> 4 Slice4 walmart_tscv %>% plot_time_series_cv_plan(Date, Weekly_Sales, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":null,"dir":"Reference","previous_headings":"","what":"Simple Training/Test Set Splitting for Time Series — time_series_split","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"time_series_split creates resample splits using time_series_cv() returns single split. useful creating single train/test split.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"","code":"time_series_split( data, date_var = NULL, initial = 5, assess = 1, skip = 1, lag = 0, cumulative = FALSE, slice = 1, point_forecast = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"data data frame. date_var date date-time variable. initial number samples used analysis/modeling initial resample. assess number samples used assessment resample. skip integer indicating many () additional resamples skip thin total amount data points analysis resample. See example . lag value include lag assessment analysis set. useful lagged predictors used training testing. cumulative logical. analysis resample grow beyond size specified initial resample?. slice Returns single slice time_series_cv point_forecast Whether testing set single point forecast forecast horizon. default forecast horizon. Default: FALSE ... currently used.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"rsplit object can used training testing functions extract data split.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"Time-Based Specification initial, assess, skip, lag variables can specified : Numeric: initial = 24 Time-Based Phrases: initial = \"2 years\", data contains date_var (date datetime) Initial (Training Set) Assess (Testing Set) main options, initial assess, control number data points original data analysis (training set) assessment (testing set), respectively. Skip skip enables function use every data point resamples. skip = 1, resampling data sets increment one position. Example: Suppose rows data set consecutive days. Using skip = 7 make analysis data set operate weeks instead days. assessment set size affected option. Lag Lag parameter creates overlap Testing set. needed lagged predictors used. Cumulative vs Sliding Window cumulative = TRUE, initial parameter ignored analysis (training) set grow resampling continues assessment (testing) set size always remain static. cumulative = FALSE, initial parameter fixes analysis (training) set resampling occurs fixed window. Slice controls slice returned. slice = 1, recent slice returned.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"","code":"library(dplyr) library(timetk) # DATA ---- m750 <- m4_monthly %>% filter(id == \"M750\") # Get the most recent 3 years as testing, and previous 10 years as training m750 %>% time_series_split(initial = \"10 years\", assess = \"3 years\") #> Using date_var: date #> #> <120/36/306> # Skip the most recent 3 years m750 %>% time_series_split( initial = \"10 years\", assess = \"3 years\", skip = \"3 years\", slice = 2 # <- Returns 2nd slice, 3-years back ) #> Using date_var: date #> #> <120/36/306> # Add 1 year lag for testing overlap m750 %>% time_series_split( initial = \"10 years\", assess = \"3 years\", skip = \"3 years\", slice = 2, lag = \"1 year\" # <- Overlaps training/testing by 1 year ) #> Using date_var: date #> #> <120/48/306>"},{"path":"https://business-science.github.io/timetk/reference/timetk.html","id":null,"dir":"Reference","previous_headings":"","what":"timetk: Time Series Analysis in the Tidyverse — timetk","title":"timetk: Time Series Analysis in the Tidyverse — timetk","text":"timetk package combines collection coercion tools time series analysis.","code":""},{"path":"https://business-science.github.io/timetk/reference/timetk.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"timetk: Time Series Analysis in the Tidyverse — timetk","text":"timetk package several benefits: Visualizing Time Series Wrangling Time Series. Preprocessing Feature Engineering. learn timetk, start documentation: https://business-science.github.io/timetk/","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"tk_acf_diagnostics() function provides simple interface detect Autocorrelation (ACF), Partial Autocorrelation (PACF), Cross Correlation (CCF) Lagged Predictors one tibble. function powers plot_acf_diagnostics() visualization.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"","code":"tk_acf_diagnostics(.data, .date_var, .value, .ccf_vars = NULL, .lags = 1000)"},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":".data data frame tibble numeric features (values) descending chronological order .date_var column containing either date date-time values .value numeric column value ACF PACF calculations performed. .ccf_vars Additional features perform Lag Cross Correlations (CCFs) versus .value. Useful evaluating external lagged regressors. .lags seqence one lags evaluate.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"tibble data.frame containing autocorrelation, partial autocorrelation cross correlation data.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"Simplified ACF, PACF, & CCF often interested 3 functions. get 3 ? Now can! ACF - Autocorrelation target variable lagged versions PACF - Partial Autocorrelation removes dependence lags lags highlighting key seasonalities. CCF - Shows lagged predictors can used prediction target variable. Lag Specification Lags (.lags) can either specified : time-based phrase indicating duraction (e.g. 2 months) maximum lag (e.g. .lags = 28) sequence lags (e.g. .lags = 7:28) Scales Multiple Time Series Groupes tk_acf_diagnostics() works grouped_df's, meaning can group time series one categorical columns dplyr::group_by() apply tk_acf_diagnostics() return group-wise lag diagnostics. Special Note Dots (...) Unlike plotting utilities, ... arguments used group-wise analysis. Rather, used processing Cross Correlations (CCFs). Use dplyr::group_by() processing multiple time series groups.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"","code":"library(dplyr) library(timetk) # ACF, PACF, & CCF in 1 Data Frame # - Get ACF & PACF for target (adjusted) # - Get CCF between adjusted and volume and close FANG %>% filter(symbol == \"FB\") %>% tk_acf_diagnostics(date, adjusted, # ACF & PACF .ccf_vars = c(volume, close), # CCFs .lags = 500) #> # A tibble: 501 × 7 #> lag ACF PACF CCF_volume CCF_close .white_noise_upper #> #> 1 0 1 1 -0.447 1 0.0630 #> 2 1 0.997 0.997 -0.444 0.997 0.0630 #> 3 2 0.994 -0.0227 -0.442 0.994 0.0630 #> 4 3 0.990 0.0101 -0.438 0.990 0.0630 #> 5 4 0.987 0.0311 -0.437 0.987 0.0630 #> 6 5 0.985 0.0180 -0.438 0.985 0.0630 #> 7 6 0.982 0.00502 -0.437 0.982 0.0630 #> 8 7 0.979 0.0171 -0.437 0.979 0.0630 #> 9 8 0.976 -0.000118 -0.436 0.976 0.0630 #> 10 9 0.974 -0.00243 -0.435 0.974 0.0630 #> # ℹ 491 more rows #> # ℹ 1 more variable: .white_noise_lower # Scale with groups using group_by() FANG %>% group_by(symbol) %>% tk_acf_diagnostics(date, adjusted, .ccf_vars = c(volume, close), .lags = \"3 months\") #> # A tibble: 248 × 8 #> # Groups: symbol [4] #> symbol lag ACF PACF CCF_volume CCF_close .white_noise_upper #> #> 1 FB 0 1 1 -0.447 1 0.0630 #> 2 FB 1 0.997 0.997 -0.444 0.997 0.0630 #> 3 FB 2 0.994 -0.0227 -0.442 0.994 0.0630 #> 4 FB 3 0.990 0.0101 -0.438 0.990 0.0630 #> 5 FB 4 0.987 0.0311 -0.437 0.987 0.0630 #> 6 FB 5 0.985 0.0180 -0.438 0.985 0.0630 #> 7 FB 6 0.982 0.00502 -0.437 0.982 0.0630 #> 8 FB 7 0.979 0.0171 -0.437 0.979 0.0630 #> 9 FB 8 0.976 -0.000118 -0.436 0.976 0.0630 #> 10 FB 9 0.974 -0.00243 -0.435 0.974 0.0630 #> # ℹ 238 more rows #> # ℹ 1 more variable: .white_noise_lower # Apply Transformations FANG %>% group_by(symbol) %>% tk_acf_diagnostics( date, diff_vec(adjusted), # Apply differencing transformation .lags = 0:500 ) #> diff_vec(): Initial values: 257.309998 #> diff_vec(): Initial values: 28 #> diff_vec(): Initial values: 361.264351 #> diff_vec(): Initial values: 13.144286 #> # A tibble: 2,004 × 6 #> # Groups: symbol [4] #> symbol lag ACF PACF .white_noise_upper .white_noise_lower #> #> 1 FB 0 1 1 0.0630 -0.0630 #> 2 FB 1 0.0272 0.0272 0.0630 -0.0630 #> 3 FB 2 -0.0219 -0.0226 0.0630 -0.0630 #> 4 FB 3 -0.0973 -0.0962 0.0630 -0.0630 #> 5 FB 4 -0.0554 -0.0512 0.0630 -0.0630 #> 6 FB 5 0.0104 0.00896 0.0630 -0.0630 #> 7 FB 6 -0.0622 -0.0751 0.0630 -0.0630 #> 8 FB 7 0.00363 -0.00334 0.0630 -0.0630 #> 9 FB 8 -0.0168 -0.0212 0.0630 -0.0630 #> 10 FB 9 0.0300 0.0187 0.0630 -0.0630 #> # ℹ 1,994 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tk_anomaly_diagnostics() preprocessor plot_anomaly_diagnostics(). performs automatic anomaly detection one time series groups.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"","code":"tk_anomaly_diagnostics( .data, .date_var, .value, .frequency = \"auto\", .trend = \"auto\", .alpha = 0.05, .max_anomalies = 0.2, .message = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity LOESS smoother, used remove remainder. Refer tk_get_trend(). .alpha Controls width \"normal\" range. Lower values conservative higher values less prone incorrectly classifying \"normal\" observations. .max_anomalies maximum percent anomalies permitted identified. .message boolean. TRUE, output information related automatic frequency trend selection (applicable).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tibble data.frame STL Decomposition Features (observed, season, trend, remainder, seasadj) Anomaly Features (remainder_l1, remainder_l2, anomaly, recomposed_l1, recomposed_l2)","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tk_anomaly_diagnostics() method anomaly detection implements 2-step process detect outliers time series. Step 1: Detrend & Remove Seasonality using STL Decomposition decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\" anomaly detection. user can control two parameters: frequency trend. .frequency: Adjusts \"season\" component removed \"observed\" values. .trend: Adjusts trend window (t.window parameter stats::stl() used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", predetermines frequency /trend based scale time series using tk_time_scale_template(). Step 2: Anomaly Detection \"trend\" \"season\" (seasonality) removed, anomaly detection performed \"remainder\". Anomalies identified, boundaries (recomposed_l1 recomposed_l2) determined. Anomaly Detection Method uses inner quartile range (IQR) +/-25 median. IQR Adjustment, alpha parameter default alpha = 0.05, limits established expanding 25/75 baseline IQR Factor 3 (3X). IQR Factor = 0.15 / alpha (hence 3X alpha = 0.05): increase IQR Factor controlling limits, decrease alpha, makes difficult outlier. Increase alpha make easier outlier. IQR outlier detection method used forecast::tsoutliers(). similar outlier detection method used Twitter's AnomalyDetection package. Twitter Forecast tsoutliers methods implemented Business Science's anomalize package.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"CLEVELAND, R. B., CLEVELAND, W. S., MCRAE, J. E., TERPENNING, . STL: Seasonal-Trend Decomposition Procedure Based Loess. Journal Official Statistics, Vol. 6, . 1 (1990), pp. 3-73. Owen S. Vallis, Jordan Hochenbaum Arun Kejariwal (2014). Novel Technique Long-Term Anomaly Detection Cloud. Twitter Inc.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% filter(id %in% c(\"1_1\", \"1_3\")) %>% group_by(id) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) #> frequency = 13 observations per 1 quarter #> trend = 52 observations per 1 year #> frequency = 13 observations per 1 quarter #> trend = 52 observations per 1 year #> # A tibble: 286 × 12 #> # Groups: id [2] #> id Date observed season trend remainder seasadj remainder_l1 #> #> 1 1_1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. #> 2 1_1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. #> 3 1_1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. #> 4 1_1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. #> 5 1_1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. #> 6 1_1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. #> 7 1_1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. #> 8 1_1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. #> 9 1_1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. #> 10 1_1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. #> # ℹ 276 more rows #> # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , #> # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many differenced columns to the data — tk_augment_differences","title":"Add many differenced columns to the data — tk_augment_differences","text":"handy function adding multiple lagged difference values data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many differenced columns to the data — tk_augment_differences","text":"","code":"tk_augment_differences( .data, .value, .lags = 1, .differences = 1, .log = FALSE, .names = \"auto\" )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many differenced columns to the data — tk_augment_differences","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .lags One lags difference(s) .differences number differences apply. .log TRUE, applies log-differences. .names vector names new columns. Must length number output columns. Use \"auto\" automatically rename columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many differenced columns to the data — tk_augment_differences","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many differenced columns to the data — tk_augment_differences","text":"Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple differences adding sequence differences using .lags argument (e.g. lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many differenced columns to the data — tk_augment_differences","text":"","code":"library(dplyr) library(timetk) m4_monthly %>% group_by(id) %>% tk_augment_differences(value, .lags = 1:20) #> # A tibble: 1,574 × 23 #> # Groups: id [4] #> id date value value_lag1_diff1 value_lag2_diff1 value_lag3_diff1 #> #> 1 M1 1976-06-01 8000 NA NA NA #> 2 M1 1976-07-01 8350 350 NA NA #> 3 M1 1976-08-01 8570 220 570 NA #> 4 M1 1976-09-01 7700 -870 -650 -300 #> 5 M1 1976-10-01 7080 -620 -1490 -1270 #> 6 M1 1976-11-01 6520 -560 -1180 -2050 #> 7 M1 1976-12-01 6070 -450 -1010 -1630 #> 8 M1 1977-01-01 6650 580 130 -430 #> 9 M1 1977-02-01 6830 180 760 310 #> 10 M1 1977-03-01 5710 -1120 -940 -360 #> # ℹ 1,564 more rows #> # ℹ 17 more variables: value_lag4_diff1 , value_lag5_diff1 , #> # value_lag6_diff1 , value_lag7_diff1 , value_lag8_diff1 , #> # value_lag9_diff1 , value_lag10_diff1 , value_lag11_diff1 , #> # value_lag12_diff1 , value_lag13_diff1 , value_lag14_diff1 , #> # value_lag15_diff1 , value_lag16_diff1 , value_lag17_diff1 , #> # value_lag18_diff1 , value_lag19_diff1 , value_lag20_diff1 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many fourier series to the data — tk_augment_fourier","title":"Add many fourier series to the data — tk_augment_fourier","text":"handy function adding multiple fourier series data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many fourier series to the data — tk_augment_fourier","text":"","code":"tk_augment_fourier(.data, .date_var, .periods, .K = 1, .names = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many fourier series to the data — tk_augment_fourier","text":".data tibble. .date_var date date-time column used calculate fourier series .periods One periods fourier series .K maximum number fourier orders. .names vector names new columns. Must length number output columns. Use \"auto\" automatically rename columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many fourier series to the data — tk_augment_fourier","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many fourier series to the data — tk_augment_fourier","text":"Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple differences adding sequence differences using .periods argument (e.g. lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many fourier series to the data — tk_augment_fourier","text":"","code":"library(dplyr) library(timetk) m4_monthly %>% group_by(id) %>% tk_augment_fourier(date, .periods = c(6, 12), .K = 2) #> # A tibble: 1,574 × 11 #> # Groups: id [4] #> id date value date_sin6_K1 date_cos6_K1 date_sin6_K2 date_cos6_K2 #> #> 1 M1 1976-06-01 8000 -0.571 -0.821 0.938 0.347 #> 2 M1 1976-07-01 8350 -0.999 0.0506 -0.101 -0.995 #> 3 M1 1976-08-01 8570 -0.455 0.890 -0.811 0.585 #> 4 M1 1976-09-01 7700 0.543 0.840 0.912 0.410 #> 5 M1 1976-10-01 7080 1.00 -0.0169 -0.0338 -0.999 #> 6 M1 1976-11-01 6520 0.485 -0.874 -0.849 0.529 #> 7 M1 1976-12-01 6070 -0.485 -0.874 0.849 0.529 #> 8 M1 1977-01-01 6650 -1.00 -0.0169 0.0338 -0.999 #> 9 M1 1977-02-01 6830 -0.515 0.857 -0.882 0.470 #> 10 M1 1977-03-01 5710 0.394 0.919 0.725 0.689 #> # ℹ 1,564 more rows #> # ℹ 4 more variables: date_sin12_K1 , date_cos12_K1 , #> # date_sin12_K2 , date_cos12_K2 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many holiday features to the data — tk_augment_holiday","title":"Add many holiday features to the data — tk_augment_holiday","text":"Quickly add \"holiday signature\" - sets holiday features correspond calendar dates. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many holiday features to the data — tk_augment_holiday","text":"","code":"tk_augment_holiday_signature( .data, .date_var = NULL, .holiday_pattern = \".\", .locale_set = c(\"all\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"IT\", \"JP\", \"CH\", \"DE\"), .exchange_set = c(\"all\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\") )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many holiday features to the data — tk_augment_holiday","text":".data time-based tibble time-series object. .date_var column containing either date date-time values. NULL, time-based column interpret object (tibble). .holiday_pattern regular expression pattern search \"Holiday Set\". .locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". .exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many holiday features to the data — tk_augment_holiday","text":"Returns tibble object describing holiday timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many holiday features to the data — tk_augment_holiday","text":"tk_augment_holiday_signature adds holiday signature features. See tk_get_holiday_signature() (powers augment function) full description examples use. 1. Individual Holidays single holiday features can filtered using pattern. helps identifying holidays important machine learning model. can useful example e-commerce initiatives (e.g. sales Christmas Thanskgiving). 2. Locale-Based Summary Sets Locale-based holdiay sets useful e-commerce initiatives (e.g. sales Christmas Thanskgiving). Filter locale identify holidays locale. 3. Stock Exchange Calendar Summary Sets Exchange-based holdiay sets useful identifying non-working days. Filter index identify holidays commonly non-working.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many holiday features to the data — tk_augment_holiday","text":"","code":"library(dplyr) library(timetk) dates_in_2017_tbl <- tibble(index = tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\")) # Non-working days in US due to Holidays using NYSE stock exchange calendar dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"^$\", # Returns nothing on purpose .locale_set = \"none\", .exchange_set = \"NYSE\") #> # A tibble: 365 × 2 #> index exch_NYSE #> #> 1 2017-01-01 0 #> 2 2017-01-02 1 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows # All holidays in US dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"US_\", .locale_set = \"US\", .exchange_set = \"none\") #> # A tibble: 365 × 20 #> index locale_US US_NewYearsDay US_MLKingsBirthday US_InaugurationDay #> #> 1 2017-01-01 1 1 0 0 #> 2 2017-01-02 0 0 0 0 #> 3 2017-01-03 0 0 0 0 #> 4 2017-01-04 0 0 0 0 #> 5 2017-01-05 0 0 0 0 #> 6 2017-01-06 0 0 0 0 #> 7 2017-01-07 0 0 0 0 #> 8 2017-01-08 0 0 0 0 #> 9 2017-01-09 0 0 0 0 #> 10 2017-01-10 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 15 more variables: US_LincolnsBirthday , US_PresidentsDay , #> # US_WashingtonsBirthday , US_CPulaskisBirthday , #> # US_GoodFriday , US_MemorialDay , US_DecorationMemorialDay , #> # US_JuneteenthNationalIndependenceDay , US_IndependenceDay , #> # US_LaborDay , US_ColumbusDay , US_ElectionDay , #> # US_VeteransDay , US_ThanksgivingDay , US_ChristmasDay # All holidays for World and Italy-specific Holidays # - Note that Italy celebrates specific holidays in addition to many World Holidays dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"(World)|(IT_)\", .locale_set = c(\"World\", \"IT\"), .exchange_set = \"none\") #> # A tibble: 365 × 45 #> index locale_World locale_IT World_NewYearsDay World_SolemnityOfMary #> #> 1 2017-01-01 1 0 1 1 #> 2 2017-01-02 0 0 0 0 #> 3 2017-01-03 0 0 0 0 #> 4 2017-01-04 0 0 0 0 #> 5 2017-01-05 0 0 0 0 #> 6 2017-01-06 1 1 0 0 #> 7 2017-01-07 0 0 0 0 #> 8 2017-01-08 0 0 0 0 #> 9 2017-01-09 0 0 0 0 #> 10 2017-01-10 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 40 more variables: World_Epiphany , IT_Epiphany , #> # World_PresentationOfLord , World_Septuagesima , #> # World_Quinquagesima , World_AshWednesday , #> # World_Annunciation , World_PalmSunday , World_GoodFriday , #> # World_Easter , World_EasterSunday , World_EasterMonday , #> # IT_LiberationDay , World_LaborDay , World_RogationSunday , …"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many lags to the data — tk_augment_lags","title":"Add many lags to the data — tk_augment_lags","text":"handy function adding multiple lagged columns data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many lags to the data — tk_augment_lags","text":"","code":"tk_augment_lags(.data, .value, .lags = 1, .names = \"auto\") tk_augment_leads(.data, .value, .lags = -1, .names = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many lags to the data — tk_augment_lags","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .lags One lags difference(s) .names vector names new columns. Must length .lags.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many lags to the data — tk_augment_lags","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many lags to the data — tk_augment_lags","text":"Lags vs Leads negative lag considered lead. tk_augment_leads() function identical tk_augment_lags() exception automatic naming convetion (.names = 'auto') convert column names negative lags leads. Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple lags adding sequence lags using .lags argument (e.g. .lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many lags to the data — tk_augment_lags","text":"","code":"library(dplyr) library(timetk) # Lags m4_monthly %>% group_by(id) %>% tk_augment_lags(contains(\"value\"), .lags = 1:20) #> # A tibble: 1,574 × 23 #> # Groups: id [4] #> id date value value_lag1 value_lag2 value_lag3 value_lag4 value_lag5 #> #> 1 M1 1976-06-01 8000 NA NA NA NA NA #> 2 M1 1976-07-01 8350 8000 NA NA NA NA #> 3 M1 1976-08-01 8570 8350 8000 NA NA NA #> 4 M1 1976-09-01 7700 8570 8350 8000 NA NA #> 5 M1 1976-10-01 7080 7700 8570 8350 8000 NA #> 6 M1 1976-11-01 6520 7080 7700 8570 8350 8000 #> 7 M1 1976-12-01 6070 6520 7080 7700 8570 8350 #> 8 M1 1977-01-01 6650 6070 6520 7080 7700 8570 #> 9 M1 1977-02-01 6830 6650 6070 6520 7080 7700 #> 10 M1 1977-03-01 5710 6830 6650 6070 6520 7080 #> # ℹ 1,564 more rows #> # ℹ 15 more variables: value_lag6 , value_lag7 , value_lag8 , #> # value_lag9 , value_lag10 , value_lag11 , value_lag12 , #> # value_lag13 , value_lag14 , value_lag15 , value_lag16 , #> # value_lag17 , value_lag18 , value_lag19 , value_lag20 # Leads m4_monthly %>% group_by(id) %>% tk_augment_leads(value, .lags = 1:-20) #> # A tibble: 1,574 × 25 #> # Groups: id [4] #> id date value value_lag1 value_lag0 value_lead1 value_lead2 #> #> 1 M1 1976-06-01 8000 NA 8000 8350 8570 #> 2 M1 1976-07-01 8350 8000 8350 8570 7700 #> 3 M1 1976-08-01 8570 8350 8570 7700 7080 #> 4 M1 1976-09-01 7700 8570 7700 7080 6520 #> 5 M1 1976-10-01 7080 7700 7080 6520 6070 #> 6 M1 1976-11-01 6520 7080 6520 6070 6650 #> 7 M1 1976-12-01 6070 6520 6070 6650 6830 #> 8 M1 1977-01-01 6650 6070 6650 6830 5710 #> 9 M1 1977-02-01 6830 6650 6830 5710 5260 #> 10 M1 1977-03-01 5710 6830 5710 5260 5470 #> # ℹ 1,564 more rows #> # ℹ 18 more variables: value_lead3 , value_lead4 , value_lead5 , #> # value_lead6 , value_lead7 , value_lead8 , value_lead9 , #> # value_lead10 , value_lead11 , value_lead12 , #> # value_lead13 , value_lead14 , value_lead15 , #> # value_lead16 , value_lead17 , value_lead18 , #> # value_lead19 , value_lead20 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many rolling window calculations to the data — tk_augment_slidify","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"Quickly use function rolling function apply multiple .periods. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"","code":"tk_augment_slidify( .data, .value, .period, .f, ..., .align = c(\"center\", \"left\", \"right\"), .partial = FALSE, .names = \"auto\" )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .period One periods rolling window(s) .f summary [function / formula], ... Optional arguments summary function .align Rolling functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Select one \"center\", \"left\", \"right\". .partial .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. .names vector names new columns. Must length .period. Default \"auto\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"tk_augment_slidify() scales slidify_vec() function multiple time series .periods. See slidify_vec() examples usage core function arguments.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"","code":"library(dplyr) library(stringr) library(timetk) # Single Column | Multiple Rolling Windows FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% tk_augment_slidify( .value = contains(\"adjust\"), # Multiple rolling windows .period = c(10, 30, 60, 90), .f = mean, .partial = TRUE, .names = str_c(\"MA_\", c(10, 30, 60, 90)) ) %>% ungroup() #> # A tibble: 4,032 × 7 #> symbol date adjusted MA_10 MA_30 MA_60 MA_90 #> #> 1 FB 2013-01-02 28 28.9 30.0 29.7 29.1 #> 2 FB 2013-01-03 27.8 29.3 30.1 29.7 29.1 #> 3 FB 2013-01-04 28.8 29.6 30.2 29.7 29.0 #> 4 FB 2013-01-07 29.4 29.7 30.2 29.6 29.0 #> 5 FB 2013-01-08 29.1 29.8 30.3 29.6 29.0 #> 6 FB 2013-01-09 30.6 30.0 30.3 29.5 28.9 #> 7 FB 2013-01-10 31.3 30.2 30.3 29.4 28.9 #> 8 FB 2013-01-11 31.7 30.3 30.2 29.4 28.8 #> 9 FB 2013-01-14 31.0 30.4 30.1 29.3 28.8 #> 10 FB 2013-01-15 30.1 30.6 30.1 29.3 28.7 #> # ℹ 4,022 more rows # Multiple Columns | Multiple Rolling Windows FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% tk_augment_slidify( .value = c(adjusted, volume), .period = c(10, 30, 60, 90), .f = mean, .partial = TRUE ) %>% ungroup() #> # A tibble: 4,032 × 12 #> symbol date adjusted volume adjusted_roll_10 volume_roll_10 #> #> 1 FB 2013-01-02 28 69846400 28.9 73357200 #> 2 FB 2013-01-03 27.8 63140600 29.3 76494229. #> 3 FB 2013-01-04 28.8 72715400 29.6 78132200 #> 4 FB 2013-01-07 29.4 83781800 29.7 80438933. #> 5 FB 2013-01-08 29.1 45871300 29.8 89719300 #> 6 FB 2013-01-09 30.6 104787700 30.0 90267930 #> 7 FB 2013-01-10 31.3 95316400 30.2 87979540 #> 8 FB 2013-01-11 31.7 89598000 30.3 85671150 #> 9 FB 2013-01-14 31.0 98892800 30.4 82817300 #> 10 FB 2013-01-15 30.1 173242600 30.6 83120150 #> # ℹ 4,022 more rows #> # ℹ 6 more variables: adjusted_roll_30 , volume_roll_30 , #> # adjusted_roll_60 , volume_roll_60 , adjusted_roll_90 , #> # volume_roll_90 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many time series features to the data — tk_augment_timeseries","title":"Add many time series features to the data — tk_augment_timeseries","text":"Add many time series features data","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many time series features to the data — tk_augment_timeseries","text":"","code":"tk_augment_timeseries_signature(.data, .date_var = NULL)"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many time series features to the data — tk_augment_timeseries","text":".data time-based tibble time-series object. .date_var tibbles, column containing either date date-time values. NULL, time-based column interpret object (tibble, xts, zoo, etc).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many time series features to the data — tk_augment_timeseries","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many time series features to the data — tk_augment_timeseries","text":"tk_augment_timeseries_signature() adds 25+ time series features including: Trend Seconds Granularity: index.num Yearly Seasonality: Year, Month, Quarter Weekly Seasonality: Week Month, Day Month, Day Week, Daily Seasonality: Hour, Minute, Second Weekly Cyclic Patterns: 2 weeks, 3 weeks, 4 weeks","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many time series features to the data — tk_augment_timeseries","text":"","code":"library(dplyr) library(timetk) m4_daily %>% group_by(id) %>% tk_augment_timeseries_signature(date) #> # A tibble: 9,743 × 31 #> # Groups: id [4] #> id date value index.num diff year year.iso half quarter month #> #> 1 D10 2014-07-03 2076. 1404345600 NA 2014 2014 2 3 7 #> 2 D10 2014-07-04 2073. 1404432000 86400 2014 2014 2 3 7 #> 3 D10 2014-07-05 2049. 1404518400 86400 2014 2014 2 3 7 #> 4 D10 2014-07-06 2049. 1404604800 86400 2014 2014 2 3 7 #> 5 D10 2014-07-07 2006. 1404691200 86400 2014 2014 2 3 7 #> 6 D10 2014-07-08 2018. 1404777600 86400 2014 2014 2 3 7 #> 7 D10 2014-07-09 2019. 1404864000 86400 2014 2014 2 3 7 #> 8 D10 2014-07-10 2007. 1404950400 86400 2014 2014 2 3 7 #> 9 D10 2014-07-11 2010 1405036800 86400 2014 2014 2 3 7 #> 10 D10 2014-07-12 2002. 1405123200 86400 2014 2014 2 3 7 #> # ℹ 9,733 more rows #> # ℹ 21 more variables: month.xts , month.lbl , day , hour , #> # minute , second , hour12 , am.pm , wday , #> # wday.xts , wday.lbl , mday , qday , yday , #> # mweek , week , week.iso , week2 , week3 , #> # week4 , mday7 "},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":null,"dir":"Reference","previous_headings":"","what":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"Automatic frequency trend calculation time series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"","code":"tk_get_frequency(idx, period = \"auto\", message = TRUE) tk_get_trend(idx, period = \"auto\", message = TRUE)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"idx date datetime index. period Either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). message boolean. message = TRUE, frequency trend output message along units scale data.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"Returns scalar numeric value indicating number observations frequency trend span.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"frequency loosely defined number observations comprise cycle data set. trend loosely defined time span can aggregated across visualize central tendency data. often easiest think frequency trend terms time-based units data already . tk_get_frequency() time_trend() enable: using time-based periods define frequency trend. Frequency: example, weekly cycle often 5-days (working days) 7-days (calendar days). Rather specify frequency 5 7, user can specify period = \"1 week\", tk_get_frequency() detect scale time series return 5 7 based actual data. period argument three basic options returning frequency. Options include: \"auto\": target frequency determined using pre-defined template (see template ). time-based duration: (e.g. \"1 week\" \"2 quarters\" per cycle) numeric number observations: (e.g. 5 5 observations per cycle) period = \"auto\", tk_time_scale_template() used calculate frequency. Trend: example, trend daily data often best aggregated evaluating moving average quarter month span. Rather specify number days quarter month, user can specify \"1 quarter\" \"1 month\", time_trend() function return correct number observations per trend cycle. addition, option, period = \"auto\", auto-detect appropriate trend span depending data. template used define appropriate trend span. Time Scale Template tk_time_scale_template() Look-Table used trend period find appropriate time scale. contains three features: time_scale, frequency, trend. algorithm inspect scale time series select best frequency trend matches scale number observations per target frequency. frequency chosen best match. predefined template stored function tk_time_scale_template(). can modify template set_tk_time_scale_template().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"","code":"library(dplyr) library(timetk) idx_FB <- FANG %>% filter(symbol == \"FB\") %>% pull(date) # Automated Frequency Calculation tk_get_frequency(idx_FB, period = \"auto\") #> frequency = 5 observations per 1 week #> [1] 5 # Automated Trend Calculation tk_get_trend(idx_FB, period = \"auto\") #> trend = 64 observations per 3 months #> [1] 64 # Manually Override Trend tk_get_trend(idx_FB, period = \"1 year\") #> trend = 252 observations per 1 year #> [1] 252"},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":null,"dir":"Reference","previous_headings":"","what":"Get holiday features from a time-series index — tk_get_holiday","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Get holiday features time-series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get holiday features from a time-series index — tk_get_holiday","text":"","code":"tk_get_holiday_signature( idx, holiday_pattern = \".\", locale_set = c(\"all\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"IT\", \"JP\", \"CH\", \"DE\"), exchange_set = c(\"all\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\") ) tk_get_holidays_by_year(years = year(today()))"},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get holiday features from a time-series index — tk_get_holiday","text":"idx time-series index vector dates datetimes. holiday_pattern regular expression pattern search \"Holiday Set\". locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". years One years collect holidays .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Returns tibble object describing timeseries holidays.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Feature engineering holidays can help identify critical patterns machine learning algorithms. tk_get_holiday_signature() helps providing feature sets 3 types features: 1. Individual Holidays single holiday features can filtered using pattern. helps identifying holidays important machine learning model. can useful example e-commerce initiatives (e.g. sales Christmas Thanskgiving). 2. Locale-Based Summary Sets Locale-based holdiay sets useful e-commerce initiatives (e.g. sales Christmas Thanskgiving). Filter locale identify holidays locale. 3. Stock Exchange Calendar Summary Sets Exchange-based holdiay sets useful identifying non-working days. Filter index identify holidays commonly non-working.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get holiday features from a time-series index — tk_get_holiday","text":"","code":"library(dplyr) library(stringr) library(timetk) # Works with time-based tibbles idx <- tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\") # --- BASIC USAGE ---- tk_get_holiday_signature(idx) #> # A tibble: 365 × 133 #> index exch_NYSE exch_LONDON exch_NERC exch_TSX exch_ZURICH locale_GB #> #> 1 2017-01-01 0 0 0 0 0 0 #> 2 2017-01-02 1 1 1 1 1 0 #> 3 2017-01-03 0 0 0 0 0 0 #> 4 2017-01-04 0 0 0 0 0 0 #> 5 2017-01-05 0 0 0 0 0 0 #> 6 2017-01-06 0 0 0 0 0 0 #> 7 2017-01-07 0 0 0 0 0 0 #> 8 2017-01-08 0 0 0 0 0 0 #> 9 2017-01-09 0 0 0 0 0 0 #> 10 2017-01-10 0 0 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 126 more variables: locale_JP , locale_US , locale_World , #> # locale_CH , locale_IT , locale_CA , locale_FR , #> # locale_DE , GB_MilleniumDay , JP_Gantan , #> # JP_NewYearsDay , World_NewYearsDay , World_SolemnityOfMary , #> # US_NewYearsDay , CH_BerchtoldsDay , JP_BankHolidayJan2 , #> # JP_BankHolidayJan3 , World_Epiphany , IT_Epiphany , … # ---- FILTERING WITH PATTERNS & SETS ---- # List available holidays - see patterns tk_get_holidays_by_year(2020) %>% filter(holiday_name %>% str_detect(\"US_\")) #> # A tibble: 18 × 3 #> date locale holiday_name #> #> 1 2020-01-01 US US_NewYearsDay #> 2 2020-01-20 US US_InaugurationDay #> 3 2020-01-20 US US_MLKingsBirthday #> 4 2020-02-12 US US_LincolnsBirthday #> 5 2020-02-17 US US_PresidentsDay #> 6 2020-02-22 US US_WashingtonsBirthday #> 7 2020-03-02 US US_CPulaskisBirthday #> 8 2020-04-10 US US_GoodFriday #> 9 2020-05-25 US US_MemorialDay #> 10 2020-05-30 US US_DecorationMemorialDay #> 11 2020-06-19 US US_JuneteenthNationalIndependenceDay #> 12 2020-07-04 US US_IndependenceDay #> 13 2020-09-07 US US_LaborDay #> 14 2020-10-12 US US_ColumbusDay #> 15 2020-11-03 US US_ElectionDay #> 16 2020-11-11 US US_VeteransDay #> 17 2020-11-26 US US_ThanksgivingDay #> 18 2020-12-25 US US_ChristmasDay # Filter using holiday patterns # - Get New Years, Christmas and Thanksgiving Features in US tk_get_holiday_signature( idx, holiday_pattern = \"(US_NewYears)|(US_Christmas)|(US_Thanks)\", locale_set = \"none\", exchange_set = \"none\") #> # A tibble: 365 × 4 #> index US_NewYearsDay US_ThanksgivingDay US_ChristmasDay #> #> 1 2017-01-01 1 0 0 #> 2 2017-01-02 0 0 0 #> 3 2017-01-03 0 0 0 #> 4 2017-01-04 0 0 0 #> 5 2017-01-05 0 0 0 #> 6 2017-01-06 0 0 0 #> 7 2017-01-07 0 0 0 #> 8 2017-01-08 0 0 0 #> 9 2017-01-09 0 0 0 #> 10 2017-01-10 0 0 0 #> # ℹ 355 more rows # ---- APPLYING FILTERS ---- # Filter with locale sets - Signals all holidays in a locale tk_get_holiday_signature( idx, holiday_pattern = \"$^\", # Matches nothing on purpose locale_set = \"US\", exchange_set = \"none\") #> # A tibble: 365 × 2 #> index locale_US #> #> 1 2017-01-01 1 #> 2 2017-01-02 0 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows # Filter with exchange sets - Signals Common Non-Business Days tk_get_holiday_signature( idx, holiday_pattern = \"$^\", # Matches nothing on purpose locale_set = \"none\", exchange_set = \"NYSE\") #> # A tibble: 365 × 2 #> index exch_NYSE #> #> 1 2017-01-01 0 #> 2 2017-01-02 1 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Get date features from a time-series index — tk_get_timeseries","title":"Get date features from a time-series index — tk_get_timeseries","text":"Get date features time-series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get date features from a time-series index — tk_get_timeseries","text":"","code":"tk_get_timeseries_signature(idx) tk_get_timeseries_summary(idx)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get date features from a time-series index — tk_get_timeseries","text":"idx time-series index vector dates datetimes.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get date features from a time-series index — tk_get_timeseries","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get date features from a time-series index — tk_get_timeseries","text":"tk_get_timeseries_signature decomposes timeseries commonly needed features numeric value, differences, year, month, day, day week, day month, day year, hour, minute, second. tk_get_timeseries_summary returns summary returns start, end, units, scale, \"summary\" timeseries differences seconds including minimum, 1st quartile, median, mean, 3rd quartile, maximum frequency. timeseries differences give user better picture index frequency user can understand level regularity irregularity. perfectly regular time series equal values seconds metric. However, often case. Important Note: functions work time-based indexes datetime, date, yearmon, yearqtr values. Regularized dates decomposed.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get date features from a time-series index — tk_get_timeseries","text":"","code":"library(dplyr) library(timetk) library(lubridate) library(zoo) #> #> Attaching package: ‘zoo’ #> The following objects are masked from ‘package:base’: #> #> as.Date, as.Date.numeric # Works with time-based tibbles FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_idx <- tk_index(FB_tbl) tk_get_timeseries_signature(FB_idx) #> # A tibble: 1,008 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 #> 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 #> 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 #> 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 #> 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 #> 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 #> 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 #> 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 #> 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 #> 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 #> # ℹ 998 more rows #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(FB_idx) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 1008 2013-01-02 2016-12-30 days day UTC 86400 86400 86400 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # Works with dates in any periodicity idx_weekly <- seq.Date(from = ymd(\"2016-01-01\"), by = 'week', length.out = 6) tk_get_timeseries_signature(idx_weekly) #> # A tibble: 6 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 2016-01-01 1451606400 NA 2016 2015 1 1 1 0 #> 2 2016-01-08 1452211200 604800 2016 2016 1 1 1 0 #> 3 2016-01-15 1452816000 604800 2016 2016 1 1 1 0 #> 4 2016-01-22 1453420800 604800 2016 2016 1 1 1 0 #> 5 2016-01-29 1454025600 604800 2016 2016 1 1 1 0 #> 6 2016-02-05 1454630400 604800 2016 2016 1 1 2 1 #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(idx_weekly) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 6 2016-01-01 2016-02-05 days week UTC 604800 604800 604800 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # Works with zoo yearmon and yearqtr classes idx_yearmon <- seq.Date(from = ymd(\"2016-01-01\"), by = \"month\", length.out = 12) %>% as.yearmon() tk_get_timeseries_signature(idx_yearmon) #> # A tibble: 12 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 Jan 2016 1451606400 NA 2016 2015 1 1 1 0 #> 2 Feb 2016 1454284800 2678400 2016 2016 1 1 2 1 #> 3 Mar 2016 1456790400 2505600 2016 2016 1 1 3 2 #> 4 Apr 2016 1459468800 2678400 2016 2016 1 2 4 3 #> 5 May 2016 1462060800 2592000 2016 2016 1 2 5 4 #> 6 Jun 2016 1464739200 2678400 2016 2016 1 2 6 5 #> 7 Jul 2016 1467331200 2592000 2016 2016 2 3 7 6 #> 8 Aug 2016 1470009600 2678400 2016 2016 2 3 8 7 #> 9 Sep 2016 1472688000 2678400 2016 2016 2 3 9 8 #> 10 Oct 2016 1475280000 2592000 2016 2016 2 4 10 9 #> 11 Nov 2016 1477958400 2678400 2016 2016 2 4 11 10 #> 12 Dec 2016 1480550400 2592000 2016 2016 2 4 12 11 #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(idx_yearmon) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median diff.mean #> #> 1 12 Jan … Dec … days month UTC 2505600 2592000 2678400 2631273. #> # ℹ 2 more variables: diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"Get timeseries unit frequency primary time scales","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"","code":"tk_get_timeseries_unit_frequency()"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"tk_get_timeseries_unit_frequency returns tibble containing timeseries frequencies seconds primary time scales including \"sec\", \"min\", \"hour\", \"day\", \"week\", \"month\", \"quarter\", \"year\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"","code":"tk_get_timeseries_unit_frequency() #> # A tibble: 1 × 8 #> sec min hour day week month quarter year #> #> 1 0 60 3600 86400 604800 2678400 7948800 31795200"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":null,"dir":"Reference","previous_headings":"","what":"Get date or datetime variables (column names) — tk_get_timeseries_variables","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"Get date datetime variables (column names)","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"","code":"tk_get_timeseries_variables(data)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"data object class data.frame","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"tk_get_timeseries_variables returns vector containing column names date-like classes.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"tk_get_timeseries_variables returns column names date datetime variables data frame. Classes meet criteria return include inherit POSIXt, Date, zoo::yearmon, zoo::yearqtr. Function adapted padr:::get_date_variables(). See padr helpers.R","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"","code":"library(timetk) library(dplyr) FANG %>% tk_get_timeseries_variables() #> [1] \"date\""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"Extract index date datetime time series objects, models, forecasts","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"","code":"tk_index(data, timetk_idx = FALSE, silent = FALSE) has_timetk_idx(data)"},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"data time-based tibble, time-series object, time-series model, forecast object. timetk_idx timetk_idx TRUE timetk time-based index attribute attempted returned. FALSE default index returned. See discussion details. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"Returns vector date date times","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"tk_index() used extract date datetime index various time series objects, models forecasts. method can used tbl, xts, zoo, zooreg, ts objects. method can additionally used forecast objects number objects generated modeling functions Arima, ets, HoltWinters classes get index underlying data. boolean timetk_idx argument applicable regularized time series objects ts zooreg classes regularized index potentially \"timetk index\" (time-based attribute). set FALSE regularized index returned. set TRUE time-based timetk index returned present. has_timetk_idx() used determine object \"timetk index\" attribute can thus benefit tk_index(timetk_idx = TRUE). TRUE indicates \"timetk index\" attribute present. FALSE indicates \"timetk index\" attribute present. FALSE, tk_index() function return default index data type. Important Note: gain benefit timetk_idx time series must timetk index. Use has_timetk_idx determine object timetk index. particularly important ts objects, default contain time-based index therefore must coerced time-based objects tbl, xts, zoo using tk_ts() function order get \"timetk index\" attribute. Refer tk_ts() creating persistent date / datetime index coercion ts.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"","code":"library(timetk) # Create time-based tibble data_tbl <- tibble::tibble( date = seq.Date(from = as.Date(\"2000-01-01\"), by = 1, length.out = 5), x = rnorm(5) * 10, y = 5:1 ) tk_index(data_tbl) # Returns time-based index vector #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" \"2000-01-05\" # Coerce to ts using tk_ts(): Preserves time-basis data_ts <- tk_ts(data_tbl) #> Warning: Non-numeric columns being dropped: date tk_index(data_ts, timetk_idx = FALSE) # Returns regularized index #> [1] 1 2 3 4 5 tk_index(data_ts, timetk_idx = TRUE) # Returns original time-based index vector #> Warning: 'tzone' attributes are inconsistent #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" \"2000-01-05\" # Coercing back to tbl tk_tbl(data_ts, timetk_idx = FALSE) # Returns regularized tbl #> Warning: Warning: No index to preserve. Object otherwise converted to tibble successfully. #> # A tibble: 5 × 2 #> x y #> #> 1 -5.21 5 #> 2 -18.1 4 #> 3 -2.62 3 #> 4 -3.46 2 #> 5 -5.77 1 tk_tbl(data_ts, timetk_idx = TRUE) # Returns time-based tbl #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 #> index x y #> #> 1 2000-01-01 -5.21 5 #> 2 2000-01-02 -18.1 4 #> 3 2000-01-03 -2.62 3 #> 4 2000-01-04 -3.46 2 #> 5 2000-01-05 -5.77 1"},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Make future time series from existing — tk_make_future_timeseries","title":"Make future time series from existing — tk_make_future_timeseries","text":"Make future time series existing","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make future time series from existing — tk_make_future_timeseries","text":"","code":"tk_make_future_timeseries( idx, length_out, inspect_weekdays = FALSE, inspect_months = FALSE, skip_values = NULL, insert_values = NULL, n_future = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make future time series from existing — tk_make_future_timeseries","text":"idx vector dates length_out Number future observations. Can numeric number phrase like \"1 year\". inspect_weekdays Uses logistic regression algorithm inspect whether certain weekdays (e.g. weekends) excluded future dates. Default FALSE. inspect_months Uses logistic regression algorithm inspect whether certain days months (e.g. last two weeks year seasonal days) excluded future dates. Default FALSE. skip_values vector class idx timeseries values skip. insert_values vector class idx timeseries values insert. n_future (DEPRECATED) Number future observations. Can numeric number phrase like \"1 year\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make future time series from existing — tk_make_future_timeseries","text":"vector containing future index class incoming index idx","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make future time series from existing — tk_make_future_timeseries","text":"Future Sequences tk_make_future_timeseries returns time series based input index frequency attributes. Specifying Length Future Observations argument length_out determines many future index observations compute. can specified : numeric value - number future observations return. number observations returned always equal value user inputs. end date can vary based number timestamps chosen. time-based phrase - duration future include (e.g. \"6 months\" \"30 minutes\"). duration defines end date observations. end date change timestamps fall within end date returned (e.g. quarterly time series return 4 quarters length_out = \"1 year\"). number observations vary fit within end date. Weekday Month Inspection inspect_weekdays inspect_months arguments apply \"daily\" (scale = \"day\") data (refer tk_get_timeseries_summary() get index scale). inspect_weekdays argument useful determining missing days week occur weekly frequency every week, every week, . recommended least 60 days use option. inspect_months argument useful determining missing days month, quarter year; however, algorithm can inadvertently select incorrect dates pattern erratic. Skipping / Inserting Values skip_values insert_values arguments can used remove add values series future times. values must format idx class. skip_values argument useful passing holidays special index values excluded future time series. insert_values argument useful adding values back algorithm may excluded.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make future time series from existing — tk_make_future_timeseries","text":"","code":"library(dplyr) library(timetk) # Basic example - By 3 seconds idx <- tk_make_timeseries(\"2016-01-01 00:00:00\", by = \"3 sec\", length_out = 3) idx #> [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:03 UTC\" #> [3] \"2016-01-01 00:00:06 UTC\" # Make next three timestamps in series idx %>% tk_make_future_timeseries(length_out = 3) #> [1] \"2016-01-01 00:00:09 UTC\" \"2016-01-01 00:00:12 UTC\" #> [3] \"2016-01-01 00:00:15 UTC\" # Make next 6 seconds of timestamps from the next timestamp idx %>% tk_make_future_timeseries(length_out = \"6 sec\") #> [1] \"2016-01-01 00:00:09 UTC\" \"2016-01-01 00:00:12 UTC\" # Basic Example - By 1 Month idx <- tk_make_timeseries(\"2016-01-01\", by = \"1 month\", length_out = \"12 months\") idx #> [1] \"2016-01-01\" \"2016-02-01\" \"2016-03-01\" \"2016-04-01\" \"2016-05-01\" #> [6] \"2016-06-01\" \"2016-07-01\" \"2016-08-01\" \"2016-09-01\" \"2016-10-01\" #> [11] \"2016-11-01\" \"2016-12-01\" \"2017-01-01\" # Make 12 months of timestamps from the next timestamp idx %>% tk_make_future_timeseries(length_out = \"12 months\") #> [1] \"2017-02-01\" \"2017-03-01\" \"2017-04-01\" \"2017-05-01\" \"2017-06-01\" #> [6] \"2017-07-01\" \"2017-08-01\" \"2017-09-01\" \"2017-10-01\" \"2017-11-01\" #> [11] \"2017-12-01\" \"2018-01-01\" # --- APPLICATION --- # - Combine holiday sequences with future sequences # Create index of days that FB stock will be traded in 2017 based on 2016 + holidays FB_tbl <- FANG %>% filter(symbol == \"FB\") holidays <- tk_make_holiday_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\", calendar = \"NYSE\") # Remove holidays with skip_values, and remove weekends with inspect_weekdays = TRUE FB_tbl %>% tk_index() %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [51] \"2017-03-16\" \"2017-03-17\" \"2017-03-20\" \"2017-03-21\" \"2017-03-22\" #> [56] \"2017-03-23\" \"2017-03-24\" \"2017-03-27\" \"2017-03-28\" \"2017-03-29\" #> [61] \"2017-03-30\" \"2017-03-31\" \"2017-04-03\" \"2017-04-04\" \"2017-04-05\" #> [66] \"2017-04-06\" \"2017-04-07\" \"2017-04-10\" \"2017-04-11\" \"2017-04-12\" #> [71] \"2017-04-13\" \"2017-04-17\" \"2017-04-18\" \"2017-04-19\" \"2017-04-20\" #> [76] \"2017-04-21\" \"2017-04-24\" \"2017-04-25\" \"2017-04-26\" \"2017-04-27\" #> [81] \"2017-04-28\" \"2017-05-01\" \"2017-05-02\" \"2017-05-03\" \"2017-05-04\" #> [86] \"2017-05-05\" \"2017-05-08\" \"2017-05-09\" \"2017-05-10\" \"2017-05-11\" #> [91] \"2017-05-12\" \"2017-05-15\" \"2017-05-16\" \"2017-05-17\" \"2017-05-18\" #> [96] \"2017-05-19\" \"2017-05-22\" \"2017-05-23\" \"2017-05-24\" \"2017-05-25\" #> [101] \"2017-05-26\" \"2017-05-30\" \"2017-05-31\" \"2017-06-01\" \"2017-06-02\" #> [106] \"2017-06-05\" \"2017-06-06\" \"2017-06-07\" \"2017-06-08\" \"2017-06-09\" #> [111] \"2017-06-12\" \"2017-06-13\" \"2017-06-14\" \"2017-06-15\" \"2017-06-16\" #> [116] \"2017-06-19\" \"2017-06-20\" \"2017-06-21\" \"2017-06-22\" \"2017-06-23\" #> [121] \"2017-06-26\" \"2017-06-27\" \"2017-06-28\" \"2017-06-29\" \"2017-06-30\" #> [126] \"2017-07-03\" \"2017-07-05\" \"2017-07-06\" \"2017-07-07\" \"2017-07-10\" #> [131] \"2017-07-11\" \"2017-07-12\" \"2017-07-13\" \"2017-07-14\" \"2017-07-17\" #> [136] \"2017-07-18\" \"2017-07-19\" \"2017-07-20\" \"2017-07-21\" \"2017-07-24\" #> [141] \"2017-07-25\" \"2017-07-26\" \"2017-07-27\" \"2017-07-28\" \"2017-07-31\" #> [146] \"2017-08-01\" \"2017-08-02\" \"2017-08-03\" \"2017-08-04\" \"2017-08-07\" #> [151] \"2017-08-08\" \"2017-08-09\" \"2017-08-10\" \"2017-08-11\" \"2017-08-14\" #> [156] \"2017-08-15\" \"2017-08-16\" \"2017-08-17\" \"2017-08-18\" \"2017-08-21\" #> [161] \"2017-08-22\" \"2017-08-23\" \"2017-08-24\" \"2017-08-25\" \"2017-08-28\" #> [166] \"2017-08-29\" \"2017-08-30\" \"2017-08-31\" \"2017-09-01\" \"2017-09-05\" #> [171] \"2017-09-06\" \"2017-09-07\" \"2017-09-08\" \"2017-09-11\" \"2017-09-12\" #> [176] \"2017-09-13\" \"2017-09-14\" \"2017-09-15\" \"2017-09-18\" \"2017-09-19\" #> [181] \"2017-09-20\" \"2017-09-21\" \"2017-09-22\" \"2017-09-25\" \"2017-09-26\" #> [186] \"2017-09-27\" \"2017-09-28\" \"2017-09-29\" \"2017-10-02\" \"2017-10-03\" #> [191] \"2017-10-04\" \"2017-10-05\" \"2017-10-06\" \"2017-10-09\" \"2017-10-10\" #> [196] \"2017-10-11\" \"2017-10-12\" \"2017-10-13\" \"2017-10-16\" \"2017-10-17\" #> [201] \"2017-10-18\" \"2017-10-19\" \"2017-10-20\" \"2017-10-23\" \"2017-10-24\" #> [206] \"2017-10-25\" \"2017-10-26\" \"2017-10-27\" \"2017-10-30\" \"2017-10-31\" #> [211] \"2017-11-01\" \"2017-11-02\" \"2017-11-03\" \"2017-11-06\" \"2017-11-07\" #> [216] \"2017-11-08\" \"2017-11-09\" \"2017-11-10\" \"2017-11-13\" \"2017-11-14\" #> [221] \"2017-11-15\" \"2017-11-16\" \"2017-11-17\" \"2017-11-20\" \"2017-11-21\" #> [226] \"2017-11-22\" \"2017-11-24\" \"2017-11-27\" \"2017-11-28\" \"2017-11-29\" #> [231] \"2017-11-30\" \"2017-12-01\" \"2017-12-04\" \"2017-12-05\" \"2017-12-06\" #> [236] \"2017-12-07\" \"2017-12-08\" \"2017-12-11\" \"2017-12-12\" \"2017-12-13\" #> [241] \"2017-12-14\" \"2017-12-15\" \"2017-12-18\" \"2017-12-19\" \"2017-12-20\" #> [246] \"2017-12-21\" \"2017-12-22\" \"2017-12-26\" \"2017-12-27\" \"2017-12-28\" #> [251] \"2017-12-29\""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":null,"dir":"Reference","previous_headings":"","what":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"Make daily Holiday Weekend date sequences","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"","code":"tk_make_holiday_sequence( start_date, end_date, calendar = c(\"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\"), skip_values = NULL, insert_values = NULL ) tk_make_weekend_sequence(start_date, end_date) tk_make_weekday_sequence( start_date, end_date, remove_weekends = TRUE, remove_holidays = FALSE, calendar = c(\"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\"), skip_values = NULL, insert_values = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"start_date Used define starting date date sequence generation. Provide \"YYYY-MM-DD\" format. end_date Used define ending date date sequence generation. Provide \"YYYY-MM-DD\" format. calendar calendar used Date Sequence calculations Holidays timeDate package. Acceptable values : \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". skip_values daily date sequence skip insert_values daily date sequence insert remove_weekends logical value indicating whether remove weekends (Saturday Sunday) date sequence remove_holidays logical value indicating whether remove common holidays date sequence","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"vector containing future dates","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"Start End Date Specification Accept shorthand notation (.e. tk_make_timeseries() specifications apply) available Daily Periods. Holiday Sequences tk_make_holiday_sequence() wrapper various holiday calendars timeDate package, making easy generate holiday sequences common business calendars: New York Stock Exchange: calendar = \"NYSE\" Londo Stock Exchange: \"LONDON\" North American Reliability Council: \"NERC\" Toronto Stock Exchange: \"TSX\" Zurich Stock Exchange: \"ZURICH\" Weekend Weekday Sequences simply populate","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"","code":"library(dplyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) # ---- HOLIDAYS & WEEKENDS ---- # Business Holiday Sequence tk_make_holiday_sequence(\"2017-01-01\", \"2017-12-31\", calendar = \"NYSE\") #> [1] \"2017-01-02\" \"2017-01-16\" \"2017-02-20\" \"2017-04-14\" \"2017-05-29\" #> [6] \"2017-07-04\" \"2017-09-04\" \"2017-11-23\" \"2017-12-25\" tk_make_holiday_sequence(\"2017\", calendar = \"NYSE\") # Same thing as above (just shorter) #> [1] \"2017-01-02\" \"2017-01-16\" \"2017-02-20\" \"2017-04-14\" \"2017-05-29\" #> [6] \"2017-07-04\" \"2017-09-04\" \"2017-11-23\" \"2017-12-25\" # Weekday Sequence tk_make_weekday_sequence(\"2017\", \"2018\", remove_holidays = TRUE) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 453 entries ] # Weekday Sequence + Removing Business Holidays tk_make_weekday_sequence(\"2017\", \"2018\", remove_holidays = TRUE) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 453 entries ] # ---- COMBINE HOLIDAYS WITH MAKE FUTURE TIMESERIES FROM EXISTING ---- # - A common machine learning application is creating a future time series data set # from an existing # Create index of days that FB stock will be traded in 2017 based on 2016 + holidays FB_tbl <- FANG %>% filter(symbol == \"FB\") holidays <- tk_make_holiday_sequence( start_date = \"2016\", end_date = \"2017\", calendar = \"NYSE\") weekends <- tk_make_weekend_sequence( start_date = \"2016\", end_date = \"2017\") # Remove holidays and weekends with skip_values # We could also remove weekends with inspect_weekdays = TRUE FB_tbl %>% tk_index() %>% tk_make_future_timeseries(length_out = 366, skip_values = c(holidays, weekends)) #> The following `skip_values` were not in the future date sequence: 2016-01-01, 2016-01-18, 2016-02-15, 2016-03-25, 2016-05-30, 2016-07-04, 2016-09-05, 2016-11-24, 2016-12-26, 2016-01-02, 2016-01-03, 2016-01-09, 2016-01-10, 2016-01-16, 2016-01-17, 2016-01-23, 2016-01-24, 2016-01-30, 2016-01-31, 2016-02-06, 2016-02-07, 2016-02-13, 2016-02-14, 2016-02-20, 2016-02-21, 2016-02-27, 2016-02-28, 2016-03-05, 2016-03-06, 2016-03-12, 2016-03-13, 2016-03-19, 2016-03-20, 2016-03-26, 2016-03-27, 2016-04-02, 2016-04-03, 2016-04-09, 2016-04-10, 2016-04-16, 2016-04-17, 2016-04-23, 2016-04-24, 2016-04-30, 2016-05-01, 2016-05-07, 2016-05-08, 2016-05-14, 2016-05-15, 2016-05-21, 2016-05-22, 2016-05-28, 2016-05-29, 2016-06-04, 2016-06-05, 2016-06-11, 2016-06-12, 2016-06-18, 2016-06-19, 2016-06-25, 2016-06-26, 2016-07-02, 2016-07-03, 2016-07-09, 2016-07-10, 2016-07-16, 2016-07-17, 2016-07-23, 2016-07-24, 2016-07-30, 2016-07-31, 2016-08-06, 2016-08-07, 2016-08-13, 2016-08-14, 2016-08-20, 2016-08-21, 2016-08-27, 2016-08-28, 2016-09-03, 2016-09-04, 2016-09-10, 2016-09-11, 2016-09-17, 2016-09-18, 2016-09-24, 2016-09-25, 2016-10-01, 2016-10-02, 2016-10-08, 2016-10-09, 2016-10-15, 2016-10-16, 2016-10-22, 2016-10-23, 2016-10-29, 2016-10-30, 2016-11-05, 2016-11-06, 2016-11-12, 2016-11-13, 2016-11-19, 2016-11-20, 2016-11-26, 2016-11-27, 2016-12-03, 2016-12-04, 2016-12-10, 2016-12-11, 2016-12-17, 2016-12-18, 2016-12-24, 2016-12-25 #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 316 entries ] options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Intelligent date and date-time sequence creation — tk_make_timeseries","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"Improves seq.Date() seq.POSIXt() functions simplifying 1 function tk_make_timeseries(). Intelligently handles character dates logical assumptions based user inputs.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"","code":"tk_make_timeseries( start_date, end_date, by, length_out = NULL, include_endpoints = TRUE, skip_values = NULL, insert_values = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"start_date Used define starting date date sequence generation. Provide \"YYYY-MM-DD\" format. end_date Used define ending date date sequence generation. Provide \"YYYY-MM-DD\" format. character string, containing one \"sec\", \"min\", \"hour\", \"day\", \"week\", \"month\", \"quarter\" \"year\". can create regularly spaced sequences using phrases like = \"10 min\". See Details. length_out Optional length sequence. Can used instead one : start_date, end_date, . Can specified number time-based phrase. include_endpoints Logical. Whether keep last value length_out time-based phrase. Default TRUE (keep last value). skip_values sequence skip insert_values sequence insert","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"vector containing date date-times","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"tk_make_timeseries() function handles date date-time sequences automatically. Parses date date times character Intelligently guesses sequence desired based arguments provided Handles spacing intelligently length_out missing, guesses either second day sequences Can skip insert values needed. Start End Date Specification Start end dates can specified reduced time-based phrases: start_date = \"2014\": converted \"2014-01-01\" (start period) end_date = \"2014\": converted \"2014-12-31\" (end period) start_date = \"2014-03\": converted \"2014-03-01\" (start period) end_date = \"2014-03\": converted \"2014-03-31\" (end period) similar process can used date-times. : Daily Sequences Make daily sequence tk_make_timeseries(). Examples: Every Day: = \"day\" Every 2-Weeks: = \"2 weeks\" Every 6-months: = \"6 months\" missing, guess = \"day\" : Sub-Daily Sequences Make sub-daily sequence tk_make_timeseries(). Examples: Every minute: = \"min\" Every 30-seconds: = \"30 sec\" Every 2-hours: = \"2 hours missing, guess = \"sec\" start end date date-time specification. Length length_out can specified number observation complex time-based expressions. following examples possible. length_out = 12 Creates 12 evenly spaced observations. length_out = \"12 months\" Adjusts end date falls 12th month. Include Endpoint Sometimes last date desired. example, user specifies length_out = 12 months, user may want last value 12th month 13th. Just toggle, include_endpoint = FALSE obtain behavior. Skip / Insert Timestamps Skips inserts performed sequence generated. means use length_out parameter, length may differ length_out.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"","code":"library(dplyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) # ---- DATE ---- # Start + End, Guesses by = \"day\" tk_make_timeseries(\"2017-01-01\", \"2017-12-31\") #> Using by: day #> [1] \"2017-01-01\" \"2017-01-02\" \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" #> [6] \"2017-01-06\" \"2017-01-07\" \"2017-01-08\" \"2017-01-09\" \"2017-01-10\" #> [11] \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-14\" \"2017-01-15\" #> [16] \"2017-01-16\" \"2017-01-17\" \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" #> [21] \"2017-01-21\" \"2017-01-22\" \"2017-01-23\" \"2017-01-24\" \"2017-01-25\" #> [26] \"2017-01-26\" \"2017-01-27\" \"2017-01-28\" \"2017-01-29\" \"2017-01-30\" #> [31] \"2017-01-31\" \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" #> [36] \"2017-02-05\" \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" #> [41] \"2017-02-10\" \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" #> [46] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 315 entries ] # Just Start tk_make_timeseries(\"2017\") # Same result #> Using by: day #> [1] \"2017-01-01\" \"2017-01-02\" \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" #> [6] \"2017-01-06\" \"2017-01-07\" \"2017-01-08\" \"2017-01-09\" \"2017-01-10\" #> [11] \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-14\" \"2017-01-15\" #> [16] \"2017-01-16\" \"2017-01-17\" \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" #> [21] \"2017-01-21\" \"2017-01-22\" \"2017-01-23\" \"2017-01-24\" \"2017-01-25\" #> [26] \"2017-01-26\" \"2017-01-27\" \"2017-01-28\" \"2017-01-29\" \"2017-01-30\" #> [31] \"2017-01-31\" \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" #> [36] \"2017-02-05\" \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" #> [41] \"2017-02-10\" \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" #> [46] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 315 entries ] # Only dates in February, 2017 tk_make_timeseries(\"2017-02\") #> Using by: day #> [1] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" \"2017-02-05\" #> [6] \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" #> [11] \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" \"2017-02-15\" #> [16] \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" \"2017-02-20\" #> [21] \"2017-02-21\" \"2017-02-22\" \"2017-02-23\" \"2017-02-24\" \"2017-02-25\" #> [26] \"2017-02-26\" \"2017-02-27\" \"2017-02-28\" # Start + Length Out, Guesses by = \"day\" tk_make_timeseries(\"2012\", length_out = 6) # Guesses by = \"day\" #> Using by: day #> [1] \"2012-01-01\" \"2012-01-02\" \"2012-01-03\" \"2012-01-04\" \"2012-01-05\" #> [6] \"2012-01-06\" # Start + By + Length Out, Spacing 6 observations by monthly interval tk_make_timeseries(\"2012\", by = \"1 month\", length_out = 6) #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" # Start + By + Length Out, Phrase \"1 year 6 months\" tk_make_timeseries(\"2012\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" #> [11] \"2012-11-01\" \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" #> [16] \"2013-04-01\" \"2013-05-01\" \"2013-06-01\" # Going in Reverse, End + Length Out tk_make_timeseries(end_date = \"2012-01-01\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) #> [1] \"2010-08-01\" \"2010-09-01\" \"2010-10-01\" \"2010-11-01\" \"2010-12-01\" #> [6] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" #> [11] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" #> [16] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" # ---- DATE-TIME ---- # Start + End, Guesses by second tk_make_timeseries(\"2016-01-01 01:01:02\", \"2016-01-01 01:01:04\") #> Using by: sec #> [1] \"2016-01-01 01:01:02 UTC\" \"2016-01-01 01:01:03 UTC\" #> [3] \"2016-01-01 01:01:04 UTC\" # Date-Time Sequence - By 10 Minutes # - Converts to date-time automatically & applies 10-min interval tk_make_timeseries(\"2017-01-01\", \"2017-01-02\", by = \"10 min\") #> [1] \"2017-01-01 00:00:00 UTC\" \"2017-01-01 00:10:00 UTC\" #> [3] \"2017-01-01 00:20:00 UTC\" \"2017-01-01 00:30:00 UTC\" #> [5] \"2017-01-01 00:40:00 UTC\" \"2017-01-01 00:50:00 UTC\" #> [7] \"2017-01-01 01:00:00 UTC\" \"2017-01-01 01:10:00 UTC\" #> [9] \"2017-01-01 01:20:00 UTC\" \"2017-01-01 01:30:00 UTC\" #> [11] \"2017-01-01 01:40:00 UTC\" \"2017-01-01 01:50:00 UTC\" #> [13] \"2017-01-01 02:00:00 UTC\" \"2017-01-01 02:10:00 UTC\" #> [15] \"2017-01-01 02:20:00 UTC\" \"2017-01-01 02:30:00 UTC\" #> [17] \"2017-01-01 02:40:00 UTC\" \"2017-01-01 02:50:00 UTC\" #> [19] \"2017-01-01 03:00:00 UTC\" \"2017-01-01 03:10:00 UTC\" #> [21] \"2017-01-01 03:20:00 UTC\" \"2017-01-01 03:30:00 UTC\" #> [23] \"2017-01-01 03:40:00 UTC\" \"2017-01-01 03:50:00 UTC\" #> [25] \"2017-01-01 04:00:00 UTC\" \"2017-01-01 04:10:00 UTC\" #> [27] \"2017-01-01 04:20:00 UTC\" \"2017-01-01 04:30:00 UTC\" #> [29] \"2017-01-01 04:40:00 UTC\" \"2017-01-01 04:50:00 UTC\" #> [31] \"2017-01-01 05:00:00 UTC\" \"2017-01-01 05:10:00 UTC\" #> [33] \"2017-01-01 05:20:00 UTC\" \"2017-01-01 05:30:00 UTC\" #> [35] \"2017-01-01 05:40:00 UTC\" \"2017-01-01 05:50:00 UTC\" #> [37] \"2017-01-01 06:00:00 UTC\" \"2017-01-01 06:10:00 UTC\" #> [39] \"2017-01-01 06:20:00 UTC\" \"2017-01-01 06:30:00 UTC\" #> [41] \"2017-01-01 06:40:00 UTC\" \"2017-01-01 06:50:00 UTC\" #> [43] \"2017-01-01 07:00:00 UTC\" \"2017-01-01 07:10:00 UTC\" #> [45] \"2017-01-01 07:20:00 UTC\" \"2017-01-01 07:30:00 UTC\" #> [47] \"2017-01-01 07:40:00 UTC\" \"2017-01-01 07:50:00 UTC\" #> [49] \"2017-01-01 08:00:00 UTC\" \"2017-01-01 08:10:00 UTC\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 95 entries ] # --- REMOVE / INCLUDE ENDPOINTS ---- # Last value in this case is desired tk_make_timeseries(\"2017-01-01\", by = \"30 min\", length_out = \"6 hours\") #> [1] \"2017-01-01 00:00:00 UTC\" \"2017-01-01 00:30:00 UTC\" #> [3] \"2017-01-01 01:00:00 UTC\" \"2017-01-01 01:30:00 UTC\" #> [5] \"2017-01-01 02:00:00 UTC\" \"2017-01-01 02:30:00 UTC\" #> [7] \"2017-01-01 03:00:00 UTC\" \"2017-01-01 03:30:00 UTC\" #> [9] \"2017-01-01 04:00:00 UTC\" \"2017-01-01 04:30:00 UTC\" #> [11] \"2017-01-01 05:00:00 UTC\" \"2017-01-01 05:30:00 UTC\" #> [13] \"2017-01-01 06:00:00 UTC\" # Last value in monthly case is not wanted tk_make_timeseries(\"2012-01-01\", by = \"1 month\", length_out = \"12 months\", include_endpoints = FALSE) # Removes unnecessary last value #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" #> [11] \"2012-11-01\" \"2012-12-01\" # ---- SKIP & INSERT VALUES ---- tk_make_timeseries( \"2011-01-01\", length_out = 5, skip_values = \"2011-01-05\", insert_values = \"2011-01-06\" ) #> Using by: day #> [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-06\" options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"tk_seasonal_diagnostics() preprocessor plot_seasonal_diagnostics(). helps automating feature collection time series seasonality analysis.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"","code":"tk_seasonal_diagnostics(.data, .date_var, .value, .feature_set = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .feature_set One multiple selections analyze seasonality. Choices include: \"auto\" - Automatically selects features based time stamps length series. \"second\" - Good analyzing seasonality second minute. \"minute\" - Good analyzing seasonality minute hour \"hour\" - Good analyzing seasonality hour day \"wday.lbl\" - Labeled weekdays. Good analyzing seasonality day week. \"week\" - Good analyzing seasonality week year. \"month.lbl\" - Labeled months. Good analyzing seasonality month year. \"quarter\" - Good analyzing seasonality quarter year \"year\" - Good analyzing seasonality multiple years.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"tibble data.frame seasonal features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"Automatic Feature Selection Internal calculations performed detect sub-range features include useing following logic: minimum feature selected based median difference consecutive timestamps maximum feature selected based 2 full periods. Example: Hourly timestamp data lasts 2 weeks following features: \"hour\", \"wday.lbl\", \"week\". Scalable Grouped Data Frames function respects grouped data.frame tibbles made dplyr::group_by(). grouped data, automatic feature selection returned collection features within sub-groups. means extra features returned even though may meaningless groups. Transformations .value parameter respects transformations (e.g. .value = log(sales)).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # ---- GROUPED EXAMPLES ---- # Hourly Data m4_hourly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value) #> # A tibble: 3,060 × 6 #> # Groups: id [4] #> id date .value hour wday.lbl week #> #> 1 H10 2015-07-01 12:00:00 513 12 Wednesday 26 #> 2 H10 2015-07-01 13:00:00 512 13 Wednesday 26 #> 3 H10 2015-07-01 14:00:00 506 14 Wednesday 26 #> 4 H10 2015-07-01 15:00:00 500 15 Wednesday 26 #> 5 H10 2015-07-01 16:00:00 490 16 Wednesday 26 #> 6 H10 2015-07-01 17:00:00 484 17 Wednesday 26 #> 7 H10 2015-07-01 18:00:00 467 18 Wednesday 26 #> 8 H10 2015-07-01 19:00:00 446 19 Wednesday 26 #> 9 H10 2015-07-01 20:00:00 434 20 Wednesday 26 #> 10 H10 2015-07-01 21:00:00 422 21 Wednesday 26 #> # ℹ 3,050 more rows # Monthly Data m4_monthly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value) #> # A tibble: 1,574 × 6 #> # Groups: id [4] #> id date .value month.lbl quarter year #> #> 1 M1 1976-06-01 8000 June 2 1976 #> 2 M1 1976-07-01 8350 July 3 1976 #> 3 M1 1976-08-01 8570 August 3 1976 #> 4 M1 1976-09-01 7700 September 3 1976 #> 5 M1 1976-10-01 7080 October 4 1976 #> 6 M1 1976-11-01 6520 November 4 1976 #> 7 M1 1976-12-01 6070 December 4 1976 #> 8 M1 1977-01-01 6650 January 1 1977 #> 9 M1 1977-02-01 6830 February 1 1977 #> 10 M1 1977-03-01 5710 March 1 1977 #> # ℹ 1,564 more rows # ---- TRANSFORMATION ---- m4_weekly %>% group_by(id) %>% tk_seasonal_diagnostics(date, log(value)) #> # A tibble: 2,295 × 7 #> # Groups: id [4] #> id date .value week month.lbl quarter year #> #> 1 W10 1999-01-01 5.51 1 January 1 1999 #> 2 W10 1999-01-08 5.40 2 January 1 1999 #> 3 W10 1999-01-15 6.11 3 January 1 1999 #> 4 W10 1999-01-22 6.11 4 January 1 1999 #> 5 W10 1999-01-29 6.11 5 January 1 1999 #> 6 W10 1999-02-05 6.11 6 February 1 1999 #> 7 W10 1999-02-12 6.11 7 February 1 1999 #> 8 W10 1999-02-19 6.11 8 February 1 1999 #> 9 W10 1999-02-26 6.11 9 February 1 1999 #> 10 W10 1999-03-05 6.11 10 March 1 1999 #> # ℹ 2,285 more rows # ---- CUSTOM FEATURE SELECTION ---- m4_hourly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value, .feature_set = c(\"hour\", \"week\")) #> # A tibble: 3,060 × 5 #> # Groups: id [4] #> id date .value hour week #> #> 1 H10 2015-07-01 12:00:00 513 12 26 #> 2 H10 2015-07-01 13:00:00 512 13 26 #> 3 H10 2015-07-01 14:00:00 506 14 26 #> 4 H10 2015-07-01 15:00:00 500 15 26 #> 5 H10 2015-07-01 16:00:00 490 16 26 #> 6 H10 2015-07-01 17:00:00 484 17 26 #> 7 H10 2015-07-01 18:00:00 467 18 26 #> 8 H10 2015-07-01 19:00:00 446 19 26 #> 9 H10 2015-07-01 20:00:00 434 20 26 #> 10 H10 2015-07-01 21:00:00 422 21 26 #> # ℹ 3,050 more rows # }"},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tk_stl_diagnostics() preprocessor plot_stl_diagnostics(). helps automating frequency trend selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"","code":"tk_stl_diagnostics( .data, .date_var, .value, .frequency = \"auto\", .trend = \"auto\", .message = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity lowess smoother, used remove remainder. .message boolean. TRUE, output information related automatic frequency trend selection (applicable).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tibble data.frame Observed, Season, Trend, Remainder, Seasonally-Adjusted features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tk_stl_diagnostics() function generates Seasonal-Trend-Loess decomposition. function \"tidy\" sense works data frames designed work dplyr groups. STL method: STL method implements time series decomposition using underlying stats::stl(). decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\". Frequency & Trend Selection user can control two parameters: .frequency .trend. .frequency parameter adjusts \"season\" component removed \"observed\" values. .trend parameter adjusts trend window (t.window parameter stl()) used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", automatically selects frequency /trend based scale time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- GROUPS & TRANSFORMATION ---- m4_daily %>% group_by(id) %>% tk_stl_diagnostics(date, box_cox_vec(value)) #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 1.25119350454964 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 0.0882021886505848 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 1.99992424816297 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 0.401716085353735 #> # A tibble: 9,743 × 7 #> # Groups: id [4] #> id date observed season trend remainder seasadj #> #> 1 D10 2014-07-03 11303. -8.25 10796. 516. 11311. #> 2 D10 2014-07-04 11284. -7.93 10790. 502. 11292. #> 3 D10 2014-07-05 11116. -14.8 10784. 347. 11131. #> 4 D10 2014-07-06 11117. -6.28 10778. 346. 11124. #> 5 D10 2014-07-07 10829. 10.7 10772. 47.0 10819. #> 6 D10 2014-07-08 10905. 16.6 10766. 123. 10889. #> 7 D10 2014-07-09 10915. 10.0 10760. 145. 10905. #> 8 D10 2014-07-10 10836. -8.25 10754. 90.5 10844. #> 9 D10 2014-07-11 10854. -7.93 10748. 114. 10862. #> 10 D10 2014-07-12 10796. -14.8 10742. 69.1 10811. #> # ℹ 9,733 more rows # ---- CUSTOM TREND ---- m4_weekly %>% group_by(id) %>% tk_stl_diagnostics(date, box_cox_vec(value), .trend = \"2 quarters\") #> frequency = 13 observations per 1 quarter #> trend = 25 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.374719526760349 #> frequency = 13 observations per 1 quarter #> trend = 25 observations per 2 quarters #> box_cox_vec(): Using value for lambda: 0.0597533426736463 #> frequency = 13 observations per 1 quarter #> trend = 26 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.937375922566063 #> frequency = 13 observations per 1 quarter #> trend = 26 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.195493340612351 #> # A tibble: 2,295 × 7 #> # Groups: id [4] #> id date observed season trend remainder seasadj #> #> 1 W10 1999-01-01 2.33 -0.000172 2.40 -0.0678 2.33 #> 2 W10 1999-01-08 2.32 -0.000195 2.40 -0.0814 2.32 #> 3 W10 1999-01-15 2.40 0.0000406 2.40 0.000106 2.40 #> 4 W10 1999-01-22 2.40 0.000252 2.40 -0.000127 2.40 #> 5 W10 1999-01-29 2.40 0.000371 2.40 -0.000261 2.40 #> 6 W10 1999-02-05 2.40 0.000397 2.40 -0.000314 2.40 #> 7 W10 1999-02-12 2.40 0.000162 2.40 -0.0000956 2.40 #> 8 W10 1999-02-19 2.40 -0.0000578 2.40 0.000114 2.40 #> 9 W10 1999-02-26 2.40 -0.000171 2.40 0.000235 2.40 #> 10 W10 1999-03-05 2.40 -0.000163 2.40 0.000216 2.40 #> # ℹ 2,285 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise Time Series Summary — tk_summary_diagnostics","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"tk_summary_diagnostics() returns time series summary one timeseries groups tibble.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"","code":"tk_summary_diagnostics(.data, .date_var)"},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values. missing, attempts auto-detect date date-time column.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"tibble data.frame timeseries summary features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"Applies tk_get_timeseries_summary() group-wise returning summary one time series groups. Respects dplyr groups Returns time series summary time-based feature.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- NON-GROUPED EXAMPLES ---- # Monthly Data m4_monthly %>% filter(id == \"M750\") %>% tk_summary_diagnostics() #> tk_augment_timeseries_signature(): Using the following .date_var variable: date #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 306 1990-01-01 2015-06-01 days month UTC 2419200 2592000 2678400 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # ---- GROUPED EXAMPLES ---- # Monthly Data m4_monthly %>% group_by(id) %>% tk_summary_diagnostics() #> tk_augment_timeseries_signature(): Using the following .date_var variable: date #> # A tibble: 4 × 13 #> # Groups: id [4] #> id n.obs start end units scale tzone diff.minimum diff.q1 #> #> 1 M1 469 1976-06-01 2015-06-01 days month UTC 2419200 2592000 #> 2 M2 469 1976-06-01 2015-06-01 days month UTC 2419200 2592000 #> 3 M750 306 1990-01-01 2015-06-01 days month UTC 2419200 2592000 #> 4 M1000 330 1988-01-01 2015-06-01 days month UTC 2419200 2592000 #> # ℹ 4 more variables: diff.median , diff.mean , diff.q3 , #> # diff.maximum "},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time-series objects to tibble. — tk_tbl","title":"Coerce time-series objects to tibble. — tk_tbl","text":"Coerce time-series objects tibble.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time-series objects to tibble. — tk_tbl","text":"","code":"tk_tbl( data, preserve_index = TRUE, rename_index = \"index\", timetk_idx = FALSE, silent = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time-series objects to tibble. — tk_tbl","text":"data time-series object. preserve_index Attempts preserve time series index. Default TRUE. rename_index Enables index column renamed. timetk_idx Used return date / datetime index regularized objects contain timetk \"index\" attribute. Refer tk_index() information returning index information regularized timeseries objects (.e. ts). silent Used toggle printing messages warnings. ... Additional parameters passed tibble::as_tibble() function.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time-series objects to tibble. — tk_tbl","text":"Returns tibble object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time-series objects to tibble. — tk_tbl","text":"tk_tbl designed coerce time series objects (e.g. xts, zoo, ts, timeSeries, etc) tibble objects. main advantage function keeps date / date-time information underlying time-series object. preserve_index = TRUE specified, new column, index, created object coercion, function attempts preserve date date-time information. date / date-time column name can changed using rename_index argument. timetk_idx argument applicable coercing ts objects created using tk_ts() object time base (e.g. tbl, xts, zoo). Setting timetk_idx = TRUE enables returning timetk \"index\" attribute present, original (non-regularized) time-based index.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time-series objects to tibble. — tk_tbl","text":"","code":"library(tibble) library(dplyr) library(timetk) data_tbl <- tibble( date = seq.Date(from = as.Date(\"2010-01-01\"), by = 1, length.out = 5), x = seq(100, 120, by = 5) ) ### ts to tibble: Comparison between as.data.frame() and tk_tbl() data_ts <- tk_ts(data_tbl, start = c(2010,1), freq = 365) #> Warning: Non-numeric columns being dropped: date # No index as.data.frame(data_ts) #> x #> 1 100 #> 2 105 #> 3 110 #> 4 115 #> 5 120 # Defualt index returned is regularized numeric index tk_tbl(data_ts) #> # A tibble: 5 × 2 #> index x #> #> 1 2010 100 #> 2 2010. 105 #> 3 2010. 110 #> 4 2010. 115 #> 5 2010. 120 # Original date index returned (Only possible if original data has time-based index) tk_tbl(data_ts, timetk_idx = TRUE) #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 2 #> index x #> #> 1 2010-01-01 100 #> 2 2010-01-02 105 #> 3 2010-01-03 110 #> 4 2010-01-04 115 #> 5 2010-01-05 120 ### xts to tibble: Comparison between as.data.frame() and tk_tbl() data_xts <- tk_xts(data_tbl) #> Warning: Non-numeric columns being dropped: date #> Using column `date` for date_var. # Dates are character class stored in row names as.data.frame(data_xts) #> x #> 2010-01-01 100 #> 2010-01-02 105 #> 2010-01-03 110 #> 2010-01-04 115 #> 2010-01-05 120 # Dates are appropriate date class and within the data frame tk_tbl(data_xts) #> # A tibble: 5 × 2 #> index x #> #> 1 2010-01-01 100 #> 2 2010-01-02 105 #> 3 2010-01-03 110 #> 4 2010-01-04 115 #> 5 2010-01-05 120 ### zooreg to tibble: Comparison between as.data.frame() and tk_tbl() data_zooreg <- tk_zooreg(1:8, start = zoo::yearqtr(2000), frequency = 4) # Dates are character class stored in row names as.data.frame(data_zooreg) #> data_zooreg #> 2000 Q1 1 #> 2000 Q2 2 #> 2000 Q3 3 #> 2000 Q4 4 #> 2001 Q1 5 #> 2001 Q2 6 #> 2001 Q3 7 #> 2001 Q4 8 # Dates are appropriate zoo yearqtr class within the data frame tk_tbl(data_zooreg) #> # A tibble: 8 × 2 #> index value #> #> 1 2000 Q1 1 #> 2 2000 Q2 2 #> 3 2000 Q3 3 #> 4 2000 Q4 4 #> 5 2001 Q1 5 #> 6 2001 Q2 6 #> 7 2001 Q3 7 #> 8 2001 Q4 8 ### zoo to tibble: Comparison between as.data.frame() and tk_tbl() data_zoo <- zoo::zoo(1:12, zoo::yearmon(2016 + seq(0, 11)/12)) # Dates are character class stored in row names as.data.frame(data_zoo) #> data_zoo #> Jan 2016 1 #> Feb 2016 2 #> Mar 2016 3 #> Apr 2016 4 #> May 2016 5 #> Jun 2016 6 #> Jul 2016 7 #> Aug 2016 8 #> Sep 2016 9 #> Oct 2016 10 #> Nov 2016 11 #> Dec 2016 12 # Dates are appropriate zoo yearmon class within the data frame tk_tbl(data_zoo) #> # A tibble: 12 × 2 #> index value #> #> 1 Jan 2016 1 #> 2 Feb 2016 2 #> 3 Mar 2016 3 #> 4 Apr 2016 4 #> 5 May 2016 5 #> 6 Jun 2016 6 #> 7 Jul 2016 7 #> 8 Aug 2016 8 #> 9 Sep 2016 9 #> 10 Oct 2016 10 #> 11 Nov 2016 11 #> 12 Dec 2016 12"},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":null,"dir":"Reference","previous_headings":"","what":"Get and modify the Time Scale Template — set_tk_time_scale_template","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"Get modify Time Scale Template","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"","code":"set_tk_time_scale_template(.data) get_tk_time_scale_template() tk_time_scale_template()"},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":".data tibble \"time_scale\", \"frequency\", \"trend\" columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"get_tk_time_scale_template(): Returns tibble containing time scale template information. set_tk_time_scale_template(): Returns nothing.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"Used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Changing Default Template can access current template get_tk_time_scale_template(). can modify current template set_tk_time_scale_template().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"","code":"get_tk_time_scale_template() #> # A tibble: 8 × 3 #> time_scale frequency trend #> #> 1 second 1 hour 12 hours #> 2 minute 1 day 14 days #> 3 hour 1 day 1 month #> 4 day 1 week 3 months #> 5 week 1 quarter 1 year #> 6 month 1 year 5 years #> 7 quarter 1 year 10 years #> 8 year 5 years 30 years set_tk_time_scale_template(tk_time_scale_template())"},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"tk_time_series_cv_plan() function provides simple interface prepare time series resample specification (rset) either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"","code":"tk_time_series_cv_plan(.data)"},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":".data time series resample specification either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"tibble containing time series crossvalidation plan.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"Resample Set resample set output timetk::time_series_cv() function rsample::rolling_origin() function.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"","code":"library(dplyr) library(rsample) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) resample_spec <- time_series_cv( FB_tbl, initial = 150, assess = 50, skip = 50, cumulative = FALSE, lag = 30, slice_limit = n()) #> Using date_var: date resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 3,910 × 5 #> .id .key symbol date adjusted #> #> 1 Slice01 training FB 2016-03-18 111. #> 2 Slice01 training FB 2016-03-21 112. #> 3 Slice01 training FB 2016-03-22 112. #> 4 Slice01 training FB 2016-03-23 113. #> 5 Slice01 training FB 2016-03-24 113. #> 6 Slice01 training FB 2016-03-28 114. #> 7 Slice01 training FB 2016-03-29 116. #> 8 Slice01 training FB 2016-03-30 115. #> 9 Slice01 training FB 2016-03-31 114. #> 10 Slice01 training FB 2016-04-01 116. #> # ℹ 3,900 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"Coerce time series objects tibbles date/date-time columns ts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"","code":"tk_ts( data, select = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), silent = FALSE ) tk_ts_( data, select = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), silent = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. start time first observation. Either single number vector two numbers (second integer), specify natural time unit (1-based) number samples time unit. See examples use second form. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"Returns ts object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"tk_ts() wrapper stats::ts() designed coerce tibble objects \"time-base\" (meaning values vary time) ts class objects. two main advantages: Non-numeric columns get removed instead populated NA's. returned ts object retains \"timetk index\" (various attributes) detected. \"timetk index\" can used coerce tbl, xts, zoo, ts data types. select argument used select subsets columns incoming data.frame. columns containing numeric data coerced. minimum, frequency start specified. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using stats::ts(). tk_ts_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to ts: Comparison between tk_ts() and stats::ts() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # as.ts: Character columns introduce NA's; Result does not retain index stats::ts(data_tbl[,-1], start = 2016) #> Time Series: #> Start = 2016 #> End = 2020 #> Frequency = 1 #> x y z #> 2016 1 1 3.860834 #> 2017 1 3 8.072653 #> 2018 1 6 12.635456 #> 2019 1 10 17.549245 #> 2020 1 15 22.814018 # tk_ts: Only numeric columns get coerced; Result retains index in numeric format data_ts <- tk_ts(data_tbl, start = 2016) #> Warning: Non-numeric columns being dropped: date, x data_ts #> Time Series: #> Start = 2016 #> End = 2020 #> Frequency = 1 #> y z #> 2016 1 3.860834 #> 2017 3 8.072653 #> 2018 6 12.635456 #> 2019 10 17.549245 #> 2020 15 22.814018 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date # timetk index tk_index(data_ts, timetk_idx = FALSE) # Regularized index returned #> [1] 2016 2017 2018 2019 2020 tk_index(data_ts, timetk_idx = TRUE) # Original date index returned #> Warning: 'tzone' attributes are inconsistent #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" # Coerce back to tibble data_ts %>% tk_tbl(timetk_idx = TRUE) #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 #> index y z #> #> 1 2016-01-01 1 3.86 #> 2 2016-01-02 3 8.07 #> 3 2016-01-03 6 12.6 #> 4 2016-01-04 10 17.5 #> 5 2016-01-05 15 22.8 ### Using select tk_ts(data_tbl, select = y) #> Time Series: #> Start = 1 #> End = 5 #> Frequency = 1 #> y #> [1,] 1 #> [2,] 3 #> [3,] 6 #> [4,] 10 #> [5,] 15 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date ### NSE: Enables programming select <- \"y\" tk_ts_(data_tbl, select = select) #> Time Series: #> Start = 1 #> End = 5 #> Frequency = 1 #> y #> [1,] 1 #> [2,] 3 #> [3,] 6 #> [4,] 10 #> [5,] 15 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date"},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for ts method dispatch — tk_ts_dispatch_","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"Method dispatch ts","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"","code":"tk_ts_dispatch_(data, select, start, end, frequency, deltat, ts.eps, silent) tk_ts_.data.frame(data, select, start, end, frequency, deltat, ts.eps, silent) tk_ts_.default(data, select, start, end, frequency, deltat, ts.eps, silent)"},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. start time first observation. Either single number vector two numbers (second integer), specify natural time unit (1-based) number samples time unit. See examples use second form. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":null,"dir":"Reference","previous_headings":"","what":"Time series feature matrix (Tidy) — tk_tsfeatures","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"tk_tsfeatures() tidyverse compliant wrapper tsfeatures::tsfeatures(). function computes matrix time series features describes various time series. designed groupwise analysis using dplyr groups.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"","code":"tk_tsfeatures( .data, .date_var, .value, .period = \"auto\", .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\"), .scale = TRUE, .trim = FALSE, .trim_amount = 0.1, .parallel = FALSE, .na_action = na.pass, .prefix = \"ts_\", .silent = TRUE, ... )"},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .period periodicity (frequency) time series data. Values can provided follows: \"auto\" (default) Calculates using tk_get_frequency(). \"2 weeks\": calculate median number observations 2-week window. 7 (numeric): interpret ts frequency 7 observations per cycle (common weekly data) .features Passed features underlying tsfeatures() function. vector function names represent feature aggregation function. Examples: Use one function names tsfeatures R package e.g.(\"lumpiness\", \"stl_features\"). Use function name (e.g. \"mean\" \"median\") Create function provide function name .scale TRUE, time series scaled mean 0 sd 1 features computed. .trim TRUE, time series trimmed trim_amount features computed. Values larger trim_amount absolute value set NA. .trim_amount Default level trimming trim==TRUE. Default: 0.1. .parallel TRUE, multiple cores (multiple sessions) used. speeds things large number time series. .parallel = TRUE, multiprocess = future::multisession. can adjusted setting multiprocess parameter. See tsfeatures::tsfeatures() function mor details. .na_action function handle missing values. Use na.interp estimate missing values. .prefix prefix prefix feature columns. Default: \"ts_\". .silent Whether show messages warnings. ... arguments get passed feature functions.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"tibble data.frame aggregated features describe time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"timetk::tk_tsfeatures() function implements tsfeatures package computing aggregated feature matrix time series useful many types analysis clustering time series. timetk version ports tsfeatures::tsfeatures() function tidyverse-compliant format uses tidy data frame containing grouping columns (optional), date column, value column. columns ignored. becomes easy summarize time series group-wise application .features, simply functions evaluate time series return single aggregated value. (Example: \"mean\" return mean time series (note values scaled mean 1 sd 0 first)) Function Internals: Internally, time series converted ts class using tk_ts(.period) period frequency time series. Values can provided .period, used prior convertion ts class. function leverages tsfeatures::tsfeatures() compute feature matrix summarized feature values.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"Rob Hyndman, Yanfei Kang, Pablo Montero-Manso, Thiyanga Talagala, Earo Wang, Yangzhuoran Yang, Mitchell O'Hara-Wild: tsfeatures R package","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"mean\"), .scale = TRUE, .prefix = \"ts_\" ) #> # A tibble: 7 × 22 #> # Groups: id [7] #> id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike #> #> 1 1_1 52 1 52 0.000670 0.0000280 #> 2 1_3 52 1 52 0.0614 0.00000987 #> 3 1_8 52 1 52 0.756 0.00000195 #> 4 1_13 52 1 52 0.354 0.00000475 #> 5 1_38 52 1 52 0.425 0.0000179 #> 6 1_93 52 1 52 0.791 0.000000754 #> 7 1_95 52 1 52 0.639 0.000000567 #> # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , #> # ts_e_acf10 , ts_seasonal_strength , ts_peak , #> # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , #> # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , #> # ts_diff2_acf10 , ts_seas_acf1 , ts_mean "},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"Coerce time series objects tibbles date/date-time columns xts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"","code":"tk_xts(data, select = NULL, date_var = NULL, silent = FALSE, ...) tk_xts_(data, select = NULL, date_var = NULL, silent = FALSE, ...)"},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. silent Used toggle printing messages warnings. ... Additional parameters passed xts::xts(). Refer xts::xts().","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"Returns xts object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"tk_xts wrapper xts::xts() designed coerce tibble objects \"time-base\" (meaning values vary time) xts class objects. three main advantages: Non-numeric columns removed via select dropped user warned. prevents error coercion issue occurring. date column auto-detected specified date_var. takes effort user assign date vector coercion. ts objects automatically coerced \"timetk index\" present. Refer tk_ts(). select argument can used select subsets columns incoming data.frame. columns containing numeric data coerced. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying xts::xts() function can used. user must pass vector dates date-times order.used. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using xts::xts(). tk_xts_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to xts: Comparison between tk_xts() and xts::xts() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # xts: Character columns cause coercion issues; order.by must be passed a vector of dates xts::xts(data_tbl[,-1], order.by = data_tbl$date) #> x y z #> 2016-01-01 chr values 1 8.409128 #> 2016-01-02 chr values 3 17.582722 #> 2016-01-03 chr values 6 27.520782 #> 2016-01-04 chr values 10 38.223308 #> 2016-01-05 chr values 15 49.690300 # tk_xts: Non-numeric columns automatically dropped; No need to specify date column tk_xts(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z #> 2016-01-01 1 8.409128 #> 2016-01-02 3 17.582722 #> 2016-01-03 6 27.520782 #> 2016-01-04 10 38.223308 #> 2016-01-05 15 49.690300 # ts can be coerced back to xts data_tbl %>% tk_ts(start = 2016, freq = 365) %>% tk_xts() #> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z #> 2016-01-01 1 8.409128 #> 2016-01-02 3 17.582722 #> 2016-01-03 6 27.520782 #> 2016-01-04 10 38.223308 #> 2016-01-05 15 49.690300 ### Using select and date_var tk_xts(data_tbl, select = y, date_var = date) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15 ### NSE: Enables programming date_var <- \"date\" select <- \"y\" tk_xts_(data_tbl, select = select, date_var = date_var) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"Coerce time series objects tibbles date/date-time columns xts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"","code":"tk_zoo(data, select = NULL, date_var = NULL, silent = FALSE, ...) tk_zoo_(data, select = NULL, date_var = NULL, silent = FALSE, ...)"},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. silent Used toggle printing messages warnings. ... Additional parameters passed xts::xts(). Refer xts::xts().","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"Returns zoo object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"tk_zoo wrapper zoo::zoo() designed coerce tibble objects \"time-base\" (meaning values vary time) zoo class objects. three main advantages: Non-numeric columns removed via select dropped user warned. prevents error coercion issue occurring. date column auto-detected specified date_var. takes effort user assign date vector coercion. ts objects automatically coerced \"timetk index\" present. Refer tk_ts(). select argument can used select subsets columns incoming data.frame. columns containing numeric data coerced. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying zoo::zoo() function can used. user must pass vector dates date-times order.used. Important Note: ... arguments passed xts::xts(), enables additional information (e.g. time zone) attribute zoo object. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using zoo::zoo(). tk_zoo_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to zoo: Comparison between tk_zoo() and zoo::zoo() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # zoo: Characters will cause error; order.by must be passed a vector of dates zoo::zoo(data_tbl[,-c(1,2)], order.by = data_tbl$date) #> y z #> 2016-01-01 1 5.986002 #> 2016-01-02 3 12.516187 #> 2016-01-03 6 19.590553 #> 2016-01-04 10 27.209102 #> 2016-01-05 15 35.371833 # tk_zoo: Character columns dropped with a warning; No need to specify dates (auto detected) tk_zoo(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z #> 2016-01-01 1 5.986002 #> 2016-01-02 3 12.516187 #> 2016-01-03 6 19.590553 #> 2016-01-04 10 27.209102 #> 2016-01-05 15 35.371833 # ts can be coerced back to zoo data_tbl %>% tk_ts(start = 2016, freq = 365) %>% tk_zoo() #> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z #> 2016-01-01 1 5.986002 #> 2016-01-02 3 12.516187 #> 2016-01-03 6 19.590553 #> 2016-01-04 10 27.209102 #> 2016-01-05 15 35.371833 ### Using select and date_var tk_zoo(data_tbl, select = y, date_var = date) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15 ### NSE: Enables programming date_var <- \"date\" select <- \"y\" tk_zoo_(data_tbl, select = select, date_var = date_var) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"Coerce time series objects tibbles date/date-time columns ts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"","code":"tk_zooreg( data, select = NULL, date_var = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), order.by = NULL, silent = FALSE ) tk_zooreg_( data, select = NULL, date_var = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), order.by = NULL, silent = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced zooreg class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. start time first observation. Either single number vector two integers, specify natural time unit (1-based) number samples time unit. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. order.vector observations x ordered. specified arguments start end ignored zoo(data, order., frequency) called. See zoo information. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"Returns zooreg object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"tk_zooreg() wrapper zoo::zooreg() designed coerce tibble objects \"time-base\" (meaning values vary time) zooreg class objects. two main advantages: Non-numeric columns get removed instead causing coercion issues. index present, returned zooreg object retains index retrievable using tk_index(). select argument used select subsets columns incoming data.frame. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying xts::xts() function can used. user must pass vector dates date-times order.used. columns containing numeric data coerced. minimum, frequency start specified. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using zoo::zooreg(). tk_zooreg_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"","code":"### tibble to zooreg: Comparison between tk_zooreg() and zoo::zooreg() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # zoo::zooreg: Values coerced to character; Result does not retain index data_zooreg <- zoo::zooreg(data_tbl[,-1], start = 2016, freq = 365) data_zooreg # Numeric values coerced to character #> x y z #> 2016(1) chr values 1 -2.628004 #> 2016(2) chr values 3 -5.494917 #> 2016(3) chr values 6 -8.600739 #> 2016(4) chr values 10 -11.945471 #> 2016(5) chr values 15 -15.529113 rownames(data_zooreg) # NULL, no dates retained #> NULL # tk_zooreg: Only numeric columns get coerced; Result retains index as rownames data_tk_zooreg <- tk_zooreg(data_tbl, start = 2016, freq = 365) #> Warning: Non-numeric columns being dropped: date, x data_tk_zooreg # No inadvertent coercion to character class #> y z #> 2016(1) 1 -2.628004 #> 2016(2) 3 -5.494917 #> 2016(3) 6 -8.600739 #> 2016(4) 10 -11.945471 #> 2016(5) 15 -15.529113 # timetk index tk_index(data_tk_zooreg, timetk_idx = FALSE) # Regularized index returned #> [1] 2016.000 2016.003 2016.005 2016.008 2016.011 tk_index(data_tk_zooreg, timetk_idx = TRUE) # Original date index returned #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" ### Using select and date_var tk_zooreg(data_tbl, select = y, date_var = date, start = 2016, freq = 365) #> y #> 2016(1) 1 #> 2016(2) 3 #> 2016(3) 6 #> 2016(4) 10 #> 2016(5) 15 ### NSE: Enables programming select <- \"y\" date_var <- \"date\" tk_zooreg_(data_tbl, select = select, date_var = date_var, start = 2016, freq = 365) #> y #> 2016(1) 1 #> 2016(2) 3 #> 2016(3) 6 #> 2016(4) 10 #> 2016(5) 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"Method dispatch Zooreg","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"","code":"tk_zooreg_dispatch_( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent ) tk_zooreg_.data.frame( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent ) tk_zooreg_.default( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent )"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced zooreg class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. start time first observation. Either single number vector two integers, specify natural time unit (1-based) number samples time unit. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. order.vector observations x ordered. specified arguments start end ignored zoo(data, order., frequency) called. See zoo information. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"mainly wrapper outlier cleaning function, tsclean(), forecast R package. ts_clean_vec() function includes arguments applying seasonality numeric vector (non-ts) via period argument.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"","code":"ts_clean_vec(x, period = 1, lambda = NULL)"},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"x numeric vector. period seasonal period use transformation. period = 1, seasonality included supsmu() used fit trend. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"numeric vector missing values /anomalies transformed imputed values.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"Cleaning Outliers Non-Seasonal (period = 1): Uses stats::supsmu() Seasonal (period > 1): Uses forecast::mstl() robust = TRUE (robust STL decomposition) seasonal series. estimate missing values outlier replacements, linear interpolation used (possibly seasonally adjusted) series. See forecast::tsoutliers() outlier detection method. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- values <- c(1,2,3, 4*2, 5,6,7, NA, 9,10,11, 12*2) values #> [1] 1 2 3 8 5 6 7 NA 9 10 11 24 # Linear interpolation + Outlier Cleansing ts_clean_vec(values, period = 1, lambda = NULL) #> [1] 1 2 3 4 5 6 7 8 9 9 9 9 # Seasonal Interpolation: set period = 4 ts_clean_vec(values, period = 4, lambda = NULL) #> [1] 1.00000 2.00000 3.00000 8.00000 5.00000 6.00000 7.00000 11.25703 #> [9] 9.00000 10.00000 10.00000 14.00000 # Seasonal Interpolation with Box Cox Transformation (internal) ts_clean_vec(values, period = 4, lambda = \"auto\") #> [1] 1.000000 2.000000 3.000000 8.444127 3.832690 6.000000 7.000000 #> [8] 15.895521 9.000000 10.000000 11.000000 24.000000"},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Missing Value Imputation for Time Series — ts_impute_vec","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"mainly wrapper Seasonally Adjusted Missing Value using Linear Interpolation function, na.interp(), forecast R package. ts_impute_vec() function includes arguments applying seasonality numeric vector (non-ts) via period argument.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"","code":"ts_impute_vec(x, period = 1, lambda = NULL)"},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"x numeric vector. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"numeric vector missing values imputed.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- values <- c(1,2,3, 4*2, 5,6,7, NA, 9,10,11, 12*2) values #> [1] 1 2 3 8 5 6 7 NA 9 10 11 24 # Linear interpolation ts_impute_vec(values, period = 1, lambda = NULL) #> [1] 1 2 3 8 5 6 7 8 9 10 11 24 # Seasonal Interpolation: set period = 4 ts_impute_vec(values, period = 4, lambda = NULL) #> [1] 1 2 3 8 5 6 7 8 9 10 11 24 # Seasonal Interpolation with Box Cox Transformation (internal) ts_impute_vec(values, period = 4, lambda = \"auto\") #> [1] 1.000000 2.000000 3.000000 8.000000 5.000000 6.000000 7.000000 #> [8] 7.960572 9.000000 10.000000 11.000000 24.000000"},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"Kaggle \"Walmart Recruiting - Store Sales Forecasting\" Competition used retail data combinations stores departments within store. competition began February 20th, 2014 ended May 5th, 2014. competition included data 45 retail stores located different regions. dataset included various external features including Holiday information, Temperature, Fuel Price, Markdown. dataset includes Sample 7 departments Store ID 1 (7 total time series).","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"","code":"walmart_sales_weekly"},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) Store Numeric. Store ID. Dept Numeric. Department ID. Date Date. Weekly timestamp. Weekly_Sales Numeric. Sales given department given store. IsHoliday Logical. Whether week \"special\" holiday store. Type Character. Type identifier store. Size Numeric. Store square-footage Temperature Numeric. Average temperature region. Fuel_Price Numeric. Cost fuel region. MarkDown1, MarkDown2, MarkDown3, MarkDown4, MarkDown5 Numeric. Anonymized data related promotional markdowns Walmart running. MarkDown data available Nov 2011, available stores time. missing value marked NA. CPI Numeric. consumer price index. Unemployment Numeric. unemployment rate region.","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"Kaggle Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"sample 7 Weekly data sets Kaggle Walmart Recruiting Store Sales Forecasting competition. Holiday Features four holidays fall within following weeks dataset (holidays data): Super Bowl: 12-Feb-10, 11-Feb-11, 10-Feb-12, 8-Feb-13 Labor Day: 10-Sep-10, 9-Sep-11, 7-Sep-12, 6-Sep-13 Thanksgiving: 26-Nov-10, 25-Nov-11, 23-Nov-12, 29-Nov-13 Christmas: 31-Dec-10, 30-Dec-11, 28-Dec-12, 27-Dec-13","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"","code":"walmart_sales_weekly #> # A tibble: 1,001 × 17 #> id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature #> #> 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 #> 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 #> 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 #> 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 #> 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 #> 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 #> 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 #> 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 #> 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 #> 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 #> # ℹ 991 more rows #> # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , #> # MarkDown3 , MarkDown4 , MarkDown5 , CPI , #> # Unemployment "},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"Kaggle \"Web Traffic Forecasting\" (Wikipedia) Competition used Google Analytics Web Traffic Data 145,000 websites. time series represent number daily views different Wikipedia articles. competition began July 13th, 2017 ended November 15th, 2017. dataset includes Sample 10 article pages (10 total time series).","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"","code":"wikipedia_traffic_daily"},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"tibble: 9,743 x 3 Page Character. Page information. date Date. Daily timestamp. value Numeric. Daily views wikipedia article.","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"Kaggle Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"sample 10 Daily data sets Kaggle Web Traffic Forecasting (Wikipedia) Competition","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"","code":"wikipedia_traffic_daily #> # A tibble: 5,500 × 3 #> Page date value #> #> 1 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-01 791 #> 2 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-02 704 #> 3 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-03 903 #> 4 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-04 732 #> 5 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-05 558 #> 6 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-06 504 #> 7 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-07 543 #> 8 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-08 1156 #> 9 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-09 1196 #> 10 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-10 701 #> # ℹ 5,490 more rows"},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-284","dir":"Changelog","previous_headings":"","what":"timetk 2.8.4","title":"timetk 2.8.4","text":"Update forecasting vignette: Use glmnet time series forecasting. CRAN Fixes: - tzdata time zone fixes: - GB -> Europe/London - NZ -> Pacific/Auckland - US/Eastern -> America/New_York - US/Pacific -> America/Los_Angeles - Add @aliases timetk-package","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-283","dir":"Changelog","previous_headings":"","what":"timetk 2.8.3","title":"timetk 2.8.3","text":"CRAN release: 2023-03-30 remove support robets remove tidyquant examples remove tidyverse examples add FANG dataset timetk (port tidyquant) cran: fix return, dontrun -> donttest, options(max.print)","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-282","dir":"Changelog","previous_headings":"","what":"timetk 2.8.2","title":"timetk 2.8.2","text":"CRAN release: 2022-11-17 New Features plot_time_series(): Gets new arguments specify .x_intercept .x_intercept_color. #131 Fixes Fix error plot_time_series() .group_names found. #121 Merge variable checking update needed recipes >= 1.0.3 #132","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-281","dir":"Changelog","previous_headings":"","what":"timetk 2.8.1","title":"timetk 2.8.1","text":"CRAN release: 2022-05-31","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"trelliscope-plotting-2-8-1","dir":"Changelog","previous_headings":"","what":"Trelliscope Plotting","title":"timetk 2.8.1","text":"plot_time_series() plot_time_series_boxplot() plot_anomaly_diagnostics()","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-280","dir":"Changelog","previous_headings":"","what":"timetk 2.8.0","title":"timetk 2.8.0","text":"CRAN release: 2022-04-07 New Features Many plotting functions upgraded use trelliscopejs easier visualization many time series. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Updates & Bug Fixes Recipes steps (e.g. step_timeseries_signature()) use new recipes::print_step() function. Requires recipes >= 0.2.0. #110 Offset parameter step_log_interval() working properly. Now works. #103 Potential Breaking Changes default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-270","dir":"Changelog","previous_headings":"","what":"timetk 2.7.0","title":"timetk 2.7.0","text":"CRAN release: 2022-01-19 New Features tk_tsfeatures(): new function makes easy generate time series feature matrix using tsfeatures. main benefit can pipe time series data tibbles dplyr groups. features produced group. #95 #84 plot_time_series_boxplot(): new function makes plotting time series boxplots simple using .period argument time series aggregation. New Vignettes Time Series Clustering: Uses new tk_tsfeatures() function perform time series clustering. #95 #84 Time Series Visualization: Updated include plot_time_series_boxplot() plot_time_series_regression(). Improvements Improvements point forecasting target n-periods future. time_series_cv(), time_series_split(): New parameter point_forecast. useful testing / assessing n-th prediction future. set TRUE, return single point returns last value assess. Fixes Updates rlang > 0.4.11 (dev version) #98 plot_time_series(): Smoother longer fails time series 1 observation #106","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-262","dir":"Changelog","previous_headings":"","what":"timetk 2.6.2","title":"timetk 2.6.2","text":"CRAN release: 2021-11-16 Improvements summarize_by_time(): Added .week_start argument allow specifying .week_start = 1 Monday start. Default 7 Sunday Start. can also changed lubridate setting lubridate.week.start option. Plotting Functions: Several plotting functions gain new .facet_dir argument adjusting direction facet_wrap(dir). #94 Plot ACF Diagnostics (plot_acf_diagnostics()): Change default parameter .show_white_noise_bars = TRUE. #85 plot_timeseries_regression(): Can now show_summary group-wise models visualizing groups Time Series CV (time_series_cv()): Add Label tune_results Improve speed pad_by_time(). #93 Bug Fixes tk_make_timeseries() tk_make_future_timeseries() now able handle end months. #72 tk_tbl.zoo(): Fix issue readr::type_convert() produces warning messages character columns inputs. #89 plot_time_series_regression(): Fixed issue lags added .formula. Pads lags NA. step_fourier() fourier_vec(): Fixed issue step_fourier failing one observation. Added scale_factor argument override date sequences stored scale factor. #77","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-261","dir":"Changelog","previous_headings":"","what":"timetk 2.6.1","title":"timetk 2.6.1","text":"CRAN release: 2021-01-18 Improvements tk_augment_slidify(), tk_augment_lags(), tk_augment_leads(), tk_augment_differences(): Now works multiple columns (passed via .value) tidyselect (e.g. contains()). Fixes Reduce “New names” messages. Remove dependency lazyeval. #24 Fix deprecated functions: select_() used tk_xts_(). #52","code":"#> New names: #> * NA -> ...1"},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-260","dir":"Changelog","previous_headings":"","what":"timetk 2.6.0","title":"timetk 2.6.0","text":"CRAN release: 2020-11-21 New Functions filter_period() (#64): Applies filtering expressions within time-based periods (windows). slice_period() (#64): Applies slices within time-based periods (windows). condense_period() (#64): Converts periodicity higher (e.g. daily) lower (e.g. monthly) frequency. Similar xts::.period() tibbletime::as_period(). tk_augment_leads() lead_vec() (#65): Added make easier / obvious create leads. Fixes time_series_cv(): Fix bug Panel Data. Train/Test Splits returning 1st observation final time stamp. return observations. future_frame() tk_make_future_timeseries(): Now sort incoming index ensure dates returned go future. tk_augment_lags() tk_augment_slidify(): Now overwrite column names match behavior tk_augment_fourier() tk_augment_differences().","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-250","dir":"Changelog","previous_headings":"","what":"timetk 2.5.0","title":"timetk 2.5.0","text":"CRAN release: 2020-10-22 Improvements time_series_cv(): Now works time series groups. great working panel data. future_frame(): Gets new argument called .bind_data. set TRUE, performs data binding operation incoming data future frame. Miscellaneous Tune startup messages (#63)","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-240","dir":"Changelog","previous_headings":"","what":"timetk 2.4.0","title":"timetk 2.4.0","text":"CRAN release: 2020-10-08 step_slidify_augment() - variant step slidify adds multiple rolling columns inside recipe. Bug Fixes Add warning %+time% %-time% return missing values Fix issues tk_make_timeseries() tk_make_future_timeseries() providing odd results regular time series. GitHub Issue 60","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-230","dir":"Changelog","previous_headings":"","what":"timetk 2.3.0","title":"timetk 2.3.0","text":"CRAN release: 2020-09-29 New Functionality tk_time_series_cv_plan() - Now works k-fold cross validation objects vfold_cv() function. pad_by_time() - Added new argument .fill_na_direction specify tidyr::fill() strategy filling missing data. Bug Fixes Augment functions (e.g. tk_augment_lags()) - Fix bug grouped functions exported Vectorized Functions - Compatabiliy ts class","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-221","dir":"Changelog","previous_headings":"","what":"timetk 2.2.1","title":"timetk 2.2.1","text":"CRAN release: 2020-09-01 New Functions step_log_interval_vec() - Extends log_interval_vec() recipes preprocessing. Parallel Processing Parallel backend use tune recipes Bug Fixes log_interval_vec() - Correct messaging complement.ts_cv_split - Helper show time series cross validation splits list explorer.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-220","dir":"Changelog","previous_headings":"","what":"timetk 2.2.0","title":"timetk 2.2.0","text":"CRAN release: 2020-07-18 New Functions mutate_by_time(): applying mutates time windows log_interval_vec() & log_interval_inv_vec(): constrained interval forecasting. Improvements plot_acf_diagnostics(): new argument, .show_white_noise_bars adding white noise bars ACF / PACF Plot. pad_by_time(): New arguments .start_date .end_date expanding/contracting padding windows.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-210","dir":"Changelog","previous_headings":"","what":"timetk 2.1.0","title":"timetk 2.1.0","text":"CRAN release: 2020-07-03 New Functions plot_time_series_regression(): Convenience function visualize & explore features using Linear Regression (stats::lm() formula). time_series_split(): convenient way return single split time_series_cv(). Returns split format rsample::initial_time_split(). Improvements Auto-detect date date-time: Affects summarise_by_time(), filter_by_time(), tk_summary_diagnostics tk_time_series_cv_plan(): Allow single resample rsample::initial_time_split timetk::time_series_split Updated Vignette: vignette, “Forecasting Using Time Series Signature”, updated modeltime tidymodels. Plotting Improvements plotting functions now support Tab Completion (minor breaking change needed , see breaking changes ) Add .legend_show toggle /legends. Permit numeric index (fix issue smoother failing) Breaking Changes plot_time_series() plot_acf_diagnostics() plot_anomaly_diagnostics() plot_seasonal_diagnostics() plot_stl_diagnostics() Bug Fixes fourier_vec() step_fourier_vec(): Add error observations zero difference. Issue #40.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-200","dir":"Changelog","previous_headings":"","what":"timetk 2.0.0","title":"timetk 2.0.0","text":"CRAN release: 2020-05-31 New Interactive Plotting Functions plot_anomaly_diagnostics(): Visualize Anomalies One Time Series New Data Wrangling Functions future_frame(): Make future tibble existing time-based tibble. New Diagnostic / Data Processing Functions tk_anomaly_diagnostics() - Group-wise anomaly detection diagnostics. wrapper anomalize R package functions without importing anomalize. New Vectorized Functions: ts_clean_vec() - Replace Outliers & Missing Values Time Series standardize_vec() - Centers scales time series mean 0, standard deviation 1 normalize_vec() - Normalizes time series Range: (0, 1) New Recipes Preprocessing Steps: step_ts_pad() - Preprocessing padding time series data. Adds rows fill gaps can used step_ts_impute() interpolate going low high frequency! step_ts_clean() - Preprocessing step cleaning outliers imputing missing values time series. New Parsing Functions parse_date2() parse_datetime2(): similar readr::parse_date() lubridate::as_date() parse character vectors date datetimes. key advantage SPEED. parse_date2() uses anytime package process using C++ Boost.Date_Time library. Improvements: plot_acf_diagnostics(): .lags argument now handles time-based phrases (e.g. .lags = \"1 month\"). time_series_cv(): Implements time-based phrases (e.g. initial = \"5 years\" assess = \"1 year\") tk_make_future_timeseries(): n_future argument deprecated new length_out argument accepts numeric input (e.g. length_out = 12) time-based phrases (e.g. length_out = \"12 months\"). major improvement numeric values define number timestamps returned even weekends removed holidays removed. Thus, can always anticipate length. (Issue #19). diff_vec: Now reports initial values used differencing calculation. Bug Fixes: Fix name collision .value = .value. Respect timezones Fix incorrect calculation starts/stops Make skip = 1 default. skip = 0 make sense. Fix issue skip adding 1 stops. Fix printing method Prevent name collisions underlying data column “id” “splits” Fix bug day month doesn’t exist. Lubridate period() returns NA. Fix implemented ceiling_date(). Fix pad_value inserts pad values new row inserted. Fix issue lambda = NULL Breaking Changes: major impact since 1.0.0 version just released. Renamed impute_ts_vec() ts_impute_vec() consistency ts_clean_vec() Renamed step_impute_ts() step_ts_impute() consistency underlying function Renamed roll_apply_vec() slidify_vec() consistency slidify() & relationship slider R package Renamed step_roll_apply step_slidify() consistency slidify() & relationship slider R package Renamed tk_augment_roll_apply tk_augment_slidify() consistency slidify() & relationship slider R package plot_time_series_cv_plan() tk_time_series_cv_plan(): Changed argument .rset .data.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-100","dir":"Changelog","previous_headings":"","what":"timetk 1.0.0","title":"timetk 1.0.0","text":"CRAN release: 2020-04-19 New Interactive Plotting Functions: plot_time_series() - workhorse time-series plotting function generates interactive plotly plots, consolidates 20+ lines ggplot2 code, scales well many time series using dplyr groups. plot_acf_diagnostics() - Visualize ACF, PACF, number CCFs one plot Multiple Time Series. Interactive plotly default. plot_seasonal_diagnostics() - Visualize Multiple Seasonality Features One Time Series. Interactive plotly default. plot_stl_diagnostics() - Visualize STL Decomposition Features One Time Series. plot_time_series_cv_plan() - Visualize Time Series Cross Validation plan made time_series_cv(). New Time Series Data Wrangling: summarise_by_time() - time-based variant dplyr::summarise() flexible summarization using common time-based criteria. filter_by_time() - time-based variant dplyr::filter() flexible filtering time-ranges. pad_by_time() - Insert time series rows regularly spaced timestamps. slidify() - Make function rolling / sliding function. between_time() - time-based variant dplyr::() flexible time-range detection. add_time() - Add time series index. Shifts index period. New Recipe Functions: Feature Generators: step_holiday_signature() - New recipe step adding 130 holiday features based individual holidays, locales, stock exchanges / business holidays. step_fourier() - New recipe step adding fourier transforms adding seasonal features time series data step_roll_apply() - New recipe step adding rolling summary functions. Similar recipes::step_window() flexible enabling application summary function. step_smooth() - New recipe step adding Local Polynomial Regression (LOESS) smoothing noisy time series step_diff() - New recipe adding multiple differenced columns. Similar recipes::step_lag(). step_box_cox() - New recipe transforming predictors. Similar step_BoxCox() improvements forecasting including “guerrero” method lambda selection handling negative data. step_impute_ts() - New recipe imputing time series. New Rsample Functions time_series_cv() - Create rsample cross validation sets time series. function produces sampling plan starting recent time series observations, rolling backwards. New Vector Functions: functions useful inside mutate() power many new plotting recipes functions. roll_apply_vec() - Vectorized rolling apply function - wraps slider::slide_vec() smooth_vec() - Vectorized smoothing function - Applies Local Polynomial Regression (LOESS) diff_vec() diff_inv_vec() - Vectorized differencing function. Pads NA’s default (unlike stats::diff). lag_vec() - Vectorized lag functions. Returns lags leads (negative lags) adjusting .lag argument. box_cox_vec(), box_cox_inv_vec(), & auto_lambda() - Vectorized Box Cox transformation. Leverages forecast::BoxCox.lambda() automatic lambda selection. fourier_vec() - Vectorized Fourier Series calculation. impute_ts_vec() - Vectorized imputation missing values time series. Leverages forecast::na.interp(). New Augment Functions: functions designed scale. respect dplyr::group_by(). tk_augment_holiday_signature() - Add holiday features data.frame using time-series index. tk_augment_roll_apply() - Add multiple columns rolling window calculations data.frame. tk_augment_differences() - Add multiple columns differences data.frame. tk_augment_lags() - Add multiple columns lags data.frame. tk_augment_fourier() - Add multiple columns fourier series data.frame. New Make Functions: Make date date-time sequences start end dates. tk_make_timeseries() - Super flexible function creating daily sub-daily time series. tk_make_weekday_sequence() - Weekday sequence accounts stripping weekends holidays tk_make_holiday_sequence() - Makes sequence dates corresponding business holidays calendars timeDate (common non-working days) tk_make_weekend_sequence() - Weekday sequence dates Saturday Sunday (common non-working days) New Get Functions: tk_get_holiday_signature() - Get 100+ holiday features using time-series index. tk_get_frequency() tk_get_trend() - Automatic frequency trend calculation time series index. New Diagnostic / Data Processing Functions tk_summary_diagnostics() - Group-wise time series summary. tk_acf_diagnostics() - data preparation function plot_acf_diagnostics() tk_seasonal_diagnostics() - data preparation function plot_seasonal_diagnostics() tk_stl_diagnostics() - Group-wise STL Decomposition (Season, Trend, Remainder). Data prep plot_stl_diagnostics(). tk_time_series_cv_plan - data preparation function plot_time_series_cv_plan() New Datasets M4 Competition - Sample “economic” datasets hourly, daily, weekly, monthly, quarterly, yearly. Walmart Recruiting Retail Sales Forecasting Competition - Sample 7 retail time series Web Traffic Forecasting (Wikipedia) Competition - Sample 10 website time series Taylor’s Energy Demand - Single time series 30-minute interval energy demand UCI Bike Sharing Daily - time series consisting Capital Bikesharing Transaction Counts related time-based features. Improvements: * tk_make_future_timeseries() - Now accepts n_future time-based phrase like “12 seconds” “1 year”. Bug Fixes: Don’t set timezone date - Accommodate recent changes lubridate::tz<- now returns POSIXct used Date objects. Fixed PR32 @vspinu. Potential Breaking Changes: tk_augment_timeseries_signature() - Changed data .data prevent name collisions piping.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-013","dir":"Changelog","previous_headings":"","what":"timetk 0.1.3","title":"timetk 0.1.3","text":"CRAN release: 2020-03-18 New Features: step_timeseries_signature() - New step_timeseries_signature() adding date date-time features. New Vignette - “Time Series Machine Learning” (previously forecasting using time series signature) Bug Fixes: xts::indexTZ deprecated. Use tzone instead. Replace arrange_ arrange. Fix failing tests due tidyquant 1.0.0 upagrade (single stocks now return extra symbol column).","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-012","dir":"Changelog","previous_headings":"","what":"timetk 0.1.2","title":"timetk 0.1.2","text":"CRAN release: 2019-09-25 Compatability tidyquant v0.5.7 - Removed dependency tidyverse Dependency cleanup - removed devtools unncessary dependencies.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-011","dir":"Changelog","previous_headings":"","what":"timetk 0.1.1","title":"timetk 0.1.1","text":"CRAN release: 2018-05-14 Added timeSeries Suggests satisfy CRAN issue.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-010","dir":"Changelog","previous_headings":"","what":"timetk 0.1.0","title":"timetk 0.1.0","text":"CRAN release: 2017-07-25 Renamed package timetk. formerly timekit. Fixed issue back-ticked date columns Update pkgdown support robets","code":""}] +[{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Time Series Class Conversion","text":"time series landscape R vast, deep, complex causing many inconsistencies data attributes formats ultimately making difficult coerce different data structures. zoo xts packages solved number issues dealing various classes (ts, zoo, xts, irts, msts, list goes …). However, packages deal classes data frame, issues conversion tbl time series object classes still present. timetk package provides tools solve issues conversion, maximizing attribute extensibility (required data attributes retained conversion primary time series classes). following tools available coerce retrieve key information: Conversion functions: tk_tbl, tk_ts, tk_xts, tk_zoo, tk_zooreg. functions coerce time-based tibbles tbl main time-series data types xts, zoo, zooreg, ts, maintaining time-based index. Index function: tk_index returns index. argument, timetk_idx = TRUE, time-based index (non-regularized index) forecast objects, models, ts objects returned present. Refer tk_ts() learn non-regularized index persistence conversion process. vignette includes brief case study conversion issues detailed explanation timetk function conversion time-based tbl objects several primary time series classes (xts, zoo, zooreg ts).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Time Series Class Conversion","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Class Conversion","text":"’ll use “Q10” dataset - first ID sample quarterly datasets (see m4_quarterly) M4 Competition. return structure tibble, conducive many popular time series analysis packages including quantmod, TTR, forecast many others.","code":"q10_quarterly <- m4_quarterly %>% filter(id == \"Q10\") q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"case-study-conversion-issues-with-ts","dir":"Articles","previous_headings":"","what":"Case Study: Conversion issues with ts()","title":"Time Series Class Conversion","text":"ts object class roots stats package many popular packages use time series data structure including popular forecast package. said, ts data structure difficult coerce back forth default contain time-based index. Rather uses regularized index computed using start frequency arguments. Conversion ts done using ts() function stats library, results various problems.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"problems","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Problems","title":"Time Series Class Conversion","text":"First, numeric columns get coerced. user forgets add [,\"pct\"] drop “date” column, ts() returns dates numeric format user wants. correct method call specific column desired. However, presents new issue. date index lost, different “regularized” index built using start frequency attributes. can see structure (using str() function) regularized time series present, date index retained. can get index using index() function zoo package. index retained regular sequence numeric values. many cases, regularized values coerced back original time-base date date time data contains significantly information (.e. year-month-day, hour-minute-second, timezone attributes) data may regularized interval (frequency).","code":"# date column gets coerced to numeric ts(q10_quarterly, start = c(2000, 1), freq = 4) %>% head() ## id date value ## [1,] 1 10957 2329.0 ## [2,] 1 11048 2349.9 ## [3,] 1 11139 2332.9 ## [4,] 1 11231 2381.5 ## [5,] 1 11323 2382.6 ## [6,] 1 11413 2405.0 q10_quarterly_ts <- ts(q10_quarterly$value, start = c(2000, 1), freq = 4) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # No date index attribute str(q10_quarterly_ts) ## Time-Series [1:59] from 2000 to 2014: 2329 2350 2333 2382 2383 ... # Regularized numeric sequence zoo::index(q10_quarterly_ts) ## [1] 2000.00 2000.25 2000.50 2000.75 2001.00 2001.25 2001.50 2001.75 2002.00 ## [10] 2002.25 2002.50 2002.75 2003.00 2003.25 2003.50 2003.75 2004.00 2004.25 ## [19] 2004.50 2004.75 2005.00 2005.25 2005.50 2005.75 2006.00 2006.25 2006.50 ## [28] 2006.75 2007.00 2007.25 2007.50 2007.75 2008.00 2008.25 2008.50 2008.75 ## [37] 2009.00 2009.25 2009.50 2009.75 2010.00 2010.25 2010.50 2010.75 2011.00 ## [46] 2011.25 2011.50 2011.75 2012.00 2012.25 2012.50 2012.75 2013.00 2013.25 ## [55] 2013.50 2013.75 2014.00 2014.25 2014.50"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"solution","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Solution","title":"Time Series Class Conversion","text":"timetk package contains new function, tk_ts(), enables maintaining original date index attribute. repeat tbl ts conversion process using new function, tk_ts(), can see differences. First, numeric columns get coerced, prevents unintended consequences due R conversion rules (e.g. dates getting unintentionally converted characters causing homogeneous data structure converting numeric values character). column dropped, user gets warning. Second, data returned additional attributes. important numeric attribute, “index”, contains original date information number. ts() function preserve index tk_ts() preserve index numeric form along time zone class.","code":"# date automatically dropped and user is warned q10_quarterly_ts_timetk <- tk_ts(q10_quarterly, start = 2000, freq = 4) ## Warning: Non-numeric columns being dropped: id, date q10_quarterly_ts_timetk ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # More attributes including time index, time class, time zone str(q10_quarterly_ts_timetk) ## Time-Series [1:59, 1] from 2000 to 2014: 2329 2350 2333 2382 2383 ... ## - attr(*, \"dimnames\")=List of 2 ## ..$ : NULL ## ..$ : chr \"value\" ## - attr(*, \"index\")= num [1:59] 9.47e+08 9.55e+08 9.62e+08 9.70e+08 9.78e+08 ... ## ..- attr(*, \"tzone\")= chr \"UTC\" ## ..- attr(*, \"tclass\")= chr \"Date\""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"advantages-of-conversion-with-tk_tbl","dir":"Articles","previous_headings":"Case Study: Conversion issues with ts()","what":"Advantages of conversion with tk_tbl()","title":"Time Series Class Conversion","text":"Since used tk_ts() conversion, can extract original index date format using tk_index(timetk_idx = TRUE) (default timetk_idx = FALSE returns default regularized index). Next, tk_tbl() function argument timetk_idx also can used select index return. First, show conversion using default index. Notice index returned “regularized” meaning actually numeric index rather time-based index. can now get original date index using tk_tbl() argument timetk_idx = TRUE. can see case (cases) can get data frame began .","code":"# Can now retrieve the original date index timetk_index <- q10_quarterly_ts_timetk %>% tk_index(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent head(timetk_index) ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" class(timetk_index) ## [1] \"Date\" # Conversion back to tibble using the default index (regularized) q10_quarterly_ts_timetk %>% tk_tbl(index_rename = \"date\", timetk_idx = FALSE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # Conversion back to tibble now using the timetk index (date / date-time) q10_quarterly_timetk <- q10_quarterly_ts_timetk %>% tk_tbl(timetk_idx = TRUE) %>% rename(date = index) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent q10_quarterly_timetk ## # A tibble: 59 × 2 ## date value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows # Comparing the coerced tibble with the original tibble identical(q10_quarterly_timetk, q10_quarterly %>% select(-id)) ## [1] TRUE"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"conversion-methods","dir":"Articles","previous_headings":"","what":"Conversion Methods","title":"Time Series Class Conversion","text":"Using q10_quarterly, ’ll go various conversion methods using tk_tbl, tk_xts, tk_zoo, tk_zooreg, tk_ts.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-tbl","dir":"Articles","previous_headings":"Conversion Methods","what":"From tbl","title":"Time Series Class Conversion","text":"starting point q10_quarterly. coerce xts, zoo, zooreg ts classes.","code":"# Start: q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-xts","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to xts","title":"Time Series Class Conversion","text":"Use tk_xts(). default “date” used date index “date” column dropped output. numeric columns coerced avoid unintentional conversion issues. Use select argument specify columns drop. Use date_var argument specify column use date index. Notice message warning longer present. Also, alternative, can set silent = TRUE bypass warnings since default dropping “date” column desired. Notice warnings messages.","code":"# End q10_quarterly_xts <- tk_xts(q10_quarterly) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `select` and `date_var` args tk_xts(q10_quarterly, select = -(id:date), date_var = date) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `silent` to silence warnings tk_xts(q10_quarterly, silent = TRUE) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-zoo","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to zoo","title":"Time Series Class Conversion","text":"Use tk_zoo(). coercing xts, non-numeric “date” column automatically dropped index automatically selected date column.","code":"# End q10_quarterly_zoo <- tk_zoo(q10_quarterly, silent = TRUE) head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-zooreg","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to zooreg","title":"Time Series Class Conversion","text":"Use tk_zooreg(). coercing xts, non-numeric “date” column automatically dropped. regularized index built function arguments start freq. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_zooreg <- tk_zooreg(q10_quarterly, start = 2000, freq = 4, silent = TRUE) head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # Retrieve original time-based index tk_index(q10_quarterly_zooreg, timetk_idx = TRUE) %>% str() ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-ts","dir":"Articles","previous_headings":"Conversion Methods > From tbl","what":"to ts","title":"Time Series Class Conversion","text":"Use tk_ts(). non-numeric “date” column automatically dropped. regularized index built function arguments. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_ts <- tk_ts(q10_quarterly, start = 2000, freq = 4, silent = TRUE) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # Retrieve original time-based index tk_index(q10_quarterly_ts, timetk_idx = TRUE) %>% str() ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"to-tbl","dir":"Articles","previous_headings":"Conversion Methods","what":"To tbl","title":"Time Series Class Conversion","text":"Going back tibble just easy using tk_tbl().","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-xts","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From xts","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_xts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-zoo","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From zoo","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_zoo) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-zooreg","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From zooreg","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # End - with default regularized index tk_tbl(q10_quarterly_zooreg) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index that is the same as original time-based index tk_tbl(q10_quarterly_zooreg, timetk_idx = TRUE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"from-ts","dir":"Articles","previous_headings":"Conversion Methods > To tbl","what":"From ts","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # End - with default regularized index tk_tbl(q10_quarterly_ts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"testing-if-an-object-has-a-timetk-index","dir":"Articles","previous_headings":"","what":"Testing if an object has a timetk index","title":"Time Series Class Conversion","text":"function has_timetk_idx() can used test whether toggling timetk_idx argument tk_index() tk_tbl() functions effect output. several examples using ten year treasury data used case study:","code":""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"tk_ts","dir":"Articles","previous_headings":"Testing if an object has a timetk index","what":"tk_ts()","title":"Time Series Class Conversion","text":"tk_ts() function returns object “timetk index” attribute. toggle timetk_idx = TRUE retrieving index tk_index(), get index dates rather regularized time series. toggle timetk_idx = TRUE conversion tbl using tk_tbl(), get index dates rather regularized index returned tbl.","code":"# Data coerced with tk_ts() has timetk index has_timetk_idx(q10_quarterly_ts) ## [1] TRUE tk_index(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"testing-other-data-types","dir":"Articles","previous_headings":"Testing if an object has a timetk index","what":"Testing other data types","title":"Time Series Class Conversion","text":"timetk_idx argument effect objects use regularized time series. Therefore, has_timetk_idx() returns FALSE object types (e.g. tbl, xts, zoo) since toggling argument effect classes. Toggling timetk_idx argument effect output. Output timetk_idx = TRUE timetk_idx = FALSE.","code":"has_timetk_idx(q10_quarterly_xts) ## [1] FALSE tk_index(q10_quarterly_xts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\""},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"working-with-zooyearmon-and-zooyearqtr-index","dir":"Articles","previous_headings":"","what":"Working with zoo::yearmon and zoo::yearqtr index","title":"Time Series Class Conversion","text":"zoo package yearmon yearqtr classes working regularized monthly quarterly data, respectively. “timetk index” tracks format conversion. ’s example yearqtr. can coerce xts yearqtr class intact. can coerce ts , although “timetk index” hidden, yearqtr class intact. Coercing ts tbl using timetk_idx = TRUE shows original index maintained conversion steps.","code":"yearqtr_tbl <- q10_quarterly %>% mutate(date = zoo::as.yearqtr(date)) yearqtr_tbl ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000 Q1 2329 ## 2 Q10 2000 Q2 2350. ## 3 Q10 2000 Q3 2333. ## 4 Q10 2000 Q4 2382. ## 5 Q10 2001 Q1 2383. ## 6 Q10 2001 Q2 2405 ## 7 Q10 2001 Q3 2411 ## 8 Q10 2001 Q4 2428. ## 9 Q10 2002 Q1 2392. ## 10 Q10 2002 Q2 2418. ## # ℹ 49 more rows yearqtr_xts <- tk_xts(yearqtr_tbl) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. yearqtr_xts %>% head() ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 yearqtr_ts <- tk_ts(yearqtr_xts, start = 1997, freq = 4) yearqtr_ts %>% head() ## value ## [1,] 2329.0 ## [2,] 2349.9 ## [3,] 2332.9 ## [4,] 2381.5 ## [5,] 2382.6 ## [6,] 2405.0 yearqtr_ts %>% tk_tbl(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK00_Time_Series_Coercion.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Class Conversion","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Calendar Features","text":"time series index consists collection time-based values define observation occurred, important part time series object. index gives user lot information simple timestamp. Consider datetime “2016-01-01 00:00:00”. timestamp, can decompose date time information get signature, consists year, quarter, month, day, day year, day month, hour, minute, second occurrence single observation. , difference two observations frequency can obtain even information periodicity data whether observations regular interval. information critical provides basis performance time finance, decay rates biology, growth rates economics, . vignette user exposed : Time Series Index Time Series Signature Time Series Summary","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Calendar Features","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Calendar Features","text":"’ll use Facebook stock prices FANG data set. historical stock prices (open, high, low, close, volume, adjusted) “FB” stock 2013 2016. simplify tutorial, select “date” “volume” columns. FB_vol_date data frame, can see “date” column observations daily beginning second day 2013.","code":"data(\"FANG\") FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows FB_vol_date <- FB_tbl %>% select(date, volume) FB_vol_date ## # A tibble: 1,008 × 2 ## date volume ## ## 1 2013-01-02 69846400 ## 2 2013-01-03 63140600 ## 3 2013-01-04 72715400 ## 4 2013-01-07 83781800 ## 5 2013-01-08 45871300 ## 6 2013-01-09 104787700 ## 7 2013-01-10 95316400 ## 8 2013-01-11 89598000 ## 9 2013-01-14 98892800 ## 10 2013-01-15 173242600 ## # ℹ 998 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-index","dir":"Articles","previous_headings":"","what":"Time Series Index","title":"Calendar Features","text":"can analyze index, need extract object. function tk_index() extracts index time series object including data frame (tbl), xts, zoo, etc. index always returned native date, datetime, yearmon, yearqtr format. Note index must one time-based classes extraction work: datetimes: Must inherit POSIXt dates: Must inherit Date yearmon: Must inherit yearmon zoo package yearqtr: Must inherit yearqtr zoo package Extract index using tk_index(). structure shown see output format, vector dates.","code":"# idx_date idx_date <- tk_index(FB_vol_date) str(idx_date) ## Date[1:1008], format: \"2013-01-02\" \"2013-01-03\" \"2013-01-04\" \"2013-01-07\" \"2013-01-08\" ..."},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-signature","dir":"Articles","previous_headings":"","what":"Time Series Signature","title":"Calendar Features","text":"index can decomposed signature. time series signature unique set properties time series values describe time series.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"get-functions---turning-an-index-into-information","dir":"Articles","previous_headings":"Time Series Signature","what":"Get Functions - Turning an Index into Information","title":"Calendar Features","text":"function tk_get_timeseries_signature() can used convert index tibble containing following values (columns): index: index value decomposed index.num: numeric value index seconds. base “1970-01-01 00:00:00” (Execute \"1970-01-01 00:00:00\" %>% ymd_hms() %>% .numeric() see value returned zero). Every time series value date can converted numeric value seconds. diff: difference seconds previous numeric index value. year: year component index. year.iso: ISO year number year (Monday start). half: half component index. quarter: quarter component index. month: month component index base 1. month.xts: month component index base 0, xts implements. month.lbl: month label ordered factor begining January ending December. day: day component index. hour: hour component index. minute: minute component index. second: second component index. hour12: hour component 12 hour scale. .pm: Morning () = 1, Afternoon (PM) = 2. wday: day week base 1. Sunday = 1 Saturday = 7. wday.xts: day week base 0, xts implements. Sunday = 0 Saturday = 6. wday.lbl: day week label ordered factor begining Sunday ending Saturday. mday: day month. qday: day quarter. yday: day year. mweek: week month. week: week number year (Sunday start). week.iso: ISO week number year (Monday start). week2: modulus bi-weekly frequency. week3: modulus tri-weekly frequency. week4: modulus quad-weekly frequency. mday7: integer division day month seven, returns first, second, third, … instance day appeared month. Values begin 1. example, first Saturday month mday7 = 1. second mday7 = 2.","code":"# idx_date signature tk_get_timeseries_signature(idx_date) ## # A tibble: 1,008 × 29 ## index index.num diff year year.iso half quarter month month.xts ## ## 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 ## 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 ## 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 ## 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 ## 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 ## 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 ## 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 ## 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 ## 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 ## 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 ## # ℹ 998 more rows ## # ℹ 20 more variables: month.lbl , day , hour , minute , ## # second , hour12 , am.pm , wday , wday.xts , ## # wday.lbl , mday , qday , yday , mweek , ## # week , week.iso , week2 , week3 , week4 , ## # mday7 "},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"augment-functions-adding-many-features-to-a-data-frame","dir":"Articles","previous_headings":"Time Series Signature","what":"Augment Functions (Adding Many Features to a Data Frame)","title":"Calendar Features","text":"’s usually important keep index signature values (e.g. volume example). can use expedited approach tk_augment_timeseries_signature(), adds signature end time series object. Modeling now much easier. example, can use linear regression model using lm() function month year predictor volume.","code":"# Augmenting a data frame FB_vol_date_signature <- FB_vol_date %>% tk_augment_timeseries_signature(.date_var = date) FB_vol_date_signature ## # A tibble: 1,008 × 30 ## date volume index.num diff year year.iso half quarter month ## ## 1 2013-01-02 69846400 1357084800 NA 2013 2013 1 1 1 ## 2 2013-01-03 63140600 1357171200 86400 2013 2013 1 1 1 ## 3 2013-01-04 72715400 1357257600 86400 2013 2013 1 1 1 ## 4 2013-01-07 83781800 1357516800 259200 2013 2013 1 1 1 ## 5 2013-01-08 45871300 1357603200 86400 2013 2013 1 1 1 ## 6 2013-01-09 104787700 1357689600 86400 2013 2013 1 1 1 ## 7 2013-01-10 95316400 1357776000 86400 2013 2013 1 1 1 ## 8 2013-01-11 89598000 1357862400 86400 2013 2013 1 1 1 ## 9 2013-01-14 98892800 1358121600 259200 2013 2013 1 1 1 ## 10 2013-01-15 173242600 1358208000 86400 2013 2013 1 1 1 ## # ℹ 998 more rows ## # ℹ 21 more variables: month.xts , month.lbl , day , hour , ## # minute , second , hour12 , am.pm , wday , ## # wday.xts , wday.lbl , mday , qday , yday , ## # mweek , week , week.iso , week2 , week3 , ## # week4 , mday7 # Example Benefit 2: Modeling is easier fit <- lm(volume ~ year + month.lbl, data = FB_vol_date_signature) summary(fit) ## ## Call: ## lm(formula = volume ~ year + month.lbl, data = FB_vol_date_signature) ## ## Residuals: ## Min 1Q Median 3Q Max ## -51042223 -13528407 -4588594 8296073 304011277 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 2.494e+10 1.414e+09 17.633 < 2e-16 *** ## year -1.236e+07 7.021e+05 -17.604 < 2e-16 *** ## month.lbl.L -9.589e+06 2.740e+06 -3.499 0.000488 *** ## month.lbl.Q 7.348e+06 2.725e+06 2.697 0.007122 ** ## month.lbl.C -9.773e+06 2.711e+06 -3.605 0.000328 *** ## month.lbl^4 -2.885e+06 2.720e+06 -1.060 0.289176 ## month.lbl^5 -2.994e+06 2.749e+06 -1.089 0.276428 ## month.lbl^6 3.169e+06 2.753e+06 1.151 0.249851 ## month.lbl^7 6.000e+05 2.721e+06 0.221 0.825514 ## month.lbl^8 8.281e+03 2.702e+06 0.003 0.997555 ## month.lbl^9 9.504e+06 2.704e+06 3.515 0.000459 *** ## month.lbl^10 -5.911e+06 2.701e+06 -2.188 0.028888 * ## month.lbl^11 -4.738e+06 2.696e+06 -1.757 0.079181 . ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 24910000 on 995 degrees of freedom ## Multiple R-squared: 0.2714, Adjusted R-squared: 0.2626 ## F-statistic: 30.89 on 12 and 995 DF, p-value: < 2.2e-16"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"time-series-summary","dir":"Articles","previous_headings":"","what":"Time Series Summary","title":"Calendar Features","text":"next index analysis tool summary metrics, can retrieved using tk_get_timeseries_summary() function. summary reports following attributes single-row tibble. General Summary: first six columns general summary information. n.obs: total number observations start: start appropriate time class end: end appropriate time class units: label describes unit index value independent frequency (.e. date class always “days” whereas datetime class always “seconds”). Values can days, hours, mins, secs. scale: label describes median difference (frequency) observations. Values can quarter, month, day, hour, minute, second. tzone: timezone index. Differences Summary: next group values differences summary (.e. summary frequency). values seconds: diff.minimum: minimum difference index values. diff.q1: first quartile index differences. diff.median: median difference index values (.e. common frequency). diff.mean: average difference index values. diff.q3: third quartile index differences. diff.maximum: maximum difference index values. differences provide information regularity frequency. Generally speaking difference values equal, index regular. However, scales beyond “day” never theoretically regular since differences seconds equivalent. However, conceptually monthly, quarterly yearly data can thought regular index contains consecutive months, quarters, years, respectively. Therefore, difference attributes meaningful daily lower time scales difference summary always indicates level regularity. second group (differences summary), immediately recognize mean different median therefore index irregular (meaning certain days missing). can see maximum difference 345,600 seconds, indicating maximum difference 4 days (345,600 seconds / 86400 seconds/day).","code":"# idx_date: First six columns, general summary tk_get_timeseries_summary(idx_date)[,1:6] ## # A tibble: 1 × 6 ## n.obs start end units scale tzone ## ## 1 1008 2013-01-02 2016-12-30 days day UTC # idx_date: Last six columns, difference summary tk_get_timeseries_summary(idx_date)[,7:12] ## # A tibble: 1 × 6 ## diff.minimum diff.q1 diff.median diff.mean diff.q3 diff.maximum ## ## 1 86400 86400 86400 125096. 86400 345600"},{"path":"https://business-science.github.io/timetk/articles/TK01_Working_With_Time_Series_Index.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Calendar Features","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Intelligent Date & Time Sequences","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"making-a-time-series-sequence","dir":"Articles","previous_headings":"","what":"Making a Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"tk_make_timeseries() improves seq.Date() seq.POSIXt() functions simplifying 1 function. Intelligently handles character dates logical assumptions based user inputs. Day Can use = \"day\" leave blank. include_endpoints = FALSE removes last value series 7 observations. 2 Seconds Can use = \"2 sec\" adjust interval width. include_endpoints = TRUE keeps last value series ends 6th second. Length = 1 year 6 months length_out = \"1 year 6 months\" - Can include complex expressions like “1 year 4 months 6 days”. Go Reverse go reverse, just use end_date want series end.","code":"# Selects by day automatically tk_make_timeseries(\"2011\", length_out = \"7 days\", include_endpoints = FALSE) ## [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-05\" ## [6] \"2011-01-06\" \"2011-01-07\" # Guesses by second tk_make_timeseries(\"2016\", by = \"2 sec\", length_out = \"6 seconds\") ## [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:02 UTC\" ## [3] \"2016-01-01 00:00:04 UTC\" \"2016-01-01 00:00:06 UTC\" tk_make_timeseries(\"2012-07\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) ## [1] \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" \"2012-11-01\" ## [6] \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" \"2013-04-01\" ## [11] \"2013-05-01\" \"2013-06-01\" \"2013-07-01\" \"2013-08-01\" \"2013-09-01\" ## [16] \"2013-10-01\" \"2013-11-01\" \"2013-12-01\" tk_make_timeseries(end_date = \"2012-07-01\", by = \"1 month\", length_out = \"1 year 6 months\") ## [1] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" ## [6] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" ## [11] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" ## [16] \"2012-04-01\" \"2012-05-01\" \"2012-06-01\" \"2012-07-01\""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"future-time-series-sequence","dir":"Articles","previous_headings":"","what":"Future Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"common operation make future time series sequence mimics existing. tk_make_future_timeseries() . Suppose existing time index. Make Future Time Series Existing can create future time sequence existing sequence using tk_make_future_timeseries().","code":"idx <- tk_make_timeseries(\"2012\", by = \"3 months\", length_out = \"2 years\", include_endpoints = FALSE) idx ## [1] \"2012-01-01\" \"2012-04-01\" \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" ## [6] \"2013-04-01\" \"2013-07-01\" \"2013-10-01\" tk_make_future_timeseries(idx, length_out = \"2 years\") ## [1] \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" \"2014-10-01\" \"2015-01-01\" ## [6] \"2015-04-01\" \"2015-07-01\" \"2015-10-01\""},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"weekends-holidays","dir":"Articles","previous_headings":"","what":"Weekends & Holidays","title":"Intelligent Date & Time Sequences","text":"Make weekday sequence removing holidays Result 252 days. holidays removed? NYSE Trading holidays days businesses observe Make future index removing holidays","code":"idx <- tk_make_weekday_sequence(\"2012\", remove_weekends = TRUE, remove_holidays = TRUE, calendar = \"NYSE\") tk_get_timeseries_summary(idx) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 250 2012-01-03 2012-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum tk_make_holiday_sequence(\"2012\", calendar = \"NYSE\") ## [1] \"2012-01-02\" \"2012-01-16\" \"2012-02-20\" \"2012-04-06\" \"2012-05-28\" ## [6] \"2012-07-04\" \"2012-09-03\" \"2012-10-29\" \"2012-10-30\" \"2012-11-22\" ## [11] \"2012-12-25\" holidays <- tk_make_holiday_sequence( start_date = \"2013-01-01\", end_date = \"2013-12-31\", calendar = \"NYSE\") idx_future <- idx %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) tk_get_timeseries_summary(idx_future) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 252 2013-01-02 2013-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/articles/TK02_Time_Series_Date_Sequences.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Intelligent Date & Time Sequences","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Time Series Machine Learning","text":"time series signature collection useful features describe time series index time-based data set. contains wealth features can used forecast time series contain patterns. vignette, user learn methods implement machine learning predict future outcomes time-based data set. vignette example uses well known time series dataset, Bike Sharing Dataset, UCI Machine Learning Repository. vignette follows example ’ll use timetk build basic Machine Learning model predict future values using time series signature. objective build model predict next six months Bike Sharing daily counts.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Time Series Machine Learning","text":"get started, load following packages.","code":"library(tidymodels) library(modeltime) library(dplyr) library(timetk) # Used to convert plots from interactive to static interactive = FALSE"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Machine Learning","text":"’ll using Bike Sharing Dataset UCI Machine Learning Repository. Source: Fanaee-T, Hadi, Gama, Joao, ‘Event labeling combining ensemble detectors background knowledge’, Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg Next, visualize dataset plot_time_series() function. Toggle .interactive = TRUE get plotly interactive plot. FALSE returns ggplot2 static plot.","code":"# Read data bike_transactions_tbl <- bike_sharing_daily %>% select(dteday, cnt) %>% set_names(c(\"date\", \"value\")) bike_transactions_tbl ## # A tibble: 731 × 2 ## date value ## ## 1 2011-01-01 985 ## 2 2011-01-02 801 ## 3 2011-01-03 1349 ## 4 2011-01-04 1562 ## 5 2011-01-05 1600 ## 6 2011-01-06 1606 ## 7 2011-01-07 1510 ## 8 2011-01-08 959 ## 9 2011-01-09 822 ## 10 2011-01-10 1321 ## # ℹ 721 more rows bike_transactions_tbl %>% plot_time_series(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"train-test","dir":"Articles","previous_headings":"","what":"Train / Test","title":"Time Series Machine Learning","text":"Next, use time_series_split() make train/test set. Setting assess = \"3 months\" tells function use last 3-months data testing set. Setting cumulative = TRUE tells sampling use prior data training set. Next, visualize train/test split. tk_time_series_cv_plan(): Converts splits object data frame plot_time_series_cv_plan(): Plots time series sampling data using “date” “value” columns.","code":"splits <- bike_transactions_tbl %>% time_series_split(assess = \"3 months\", cumulative = TRUE) splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeling","dir":"Articles","previous_headings":"","what":"Modeling","title":"Time Series Machine Learning","text":"Machine learning models complex univariate models (e.g. ARIMA, Exponential Smoothing). complexity typically requires workflow (sometimes called pipeline languages). general process goes like : Create Preprocessing Recipe Create Model Specifications Use Workflow combine Model Spec Preprocessing, Fit Model","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"recipe-preprocessing-specification","dir":"Articles","previous_headings":"Modeling","what":"Recipe Preprocessing Specification","title":"Time Series Machine Learning","text":"first step add time series signature training set, used learn patterns. New timetk 0.1.3 integration recipes R package: recipes package allows us add preprocessing steps applied sequentially part data transformation pipeline. timetk step_timeseries_signature(), used add number features can help machine learning models. can see happens apply prepared recipe prep() using bake() function. Many new columns added timestamp “date” feature. features can use machine learning models. Next, apply various preprocessing steps improve modeling behavior. wish learn , Advanced Time Series course help learn techniques.","code":"# Add time series signature recipe_spec_timeseries <- recipe(value ~ ., data = training(splits)) %>% step_timeseries_signature(date) bake(prep(recipe_spec_timeseries), new_data = training(splits)) ## # A tibble: 641 × 29 ## date value date_index.num date_year date_year.iso date_half ## ## 1 2011-01-01 985 1293840000 2011 2010 1 ## 2 2011-01-02 801 1293926400 2011 2010 1 ## 3 2011-01-03 1349 1294012800 2011 2011 1 ## 4 2011-01-04 1562 1294099200 2011 2011 1 ## 5 2011-01-05 1600 1294185600 2011 2011 1 ## 6 2011-01-06 1606 1294272000 2011 2011 1 ## 7 2011-01-07 1510 1294358400 2011 2011 1 ## 8 2011-01-08 959 1294444800 2011 2011 1 ## 9 2011-01-09 822 1294531200 2011 2011 1 ## 10 2011-01-10 1321 1294617600 2011 2011 1 ## # ℹ 631 more rows ## # ℹ 23 more variables: date_quarter , date_month , ## # date_month.xts , date_month.lbl , date_day , ## # date_hour , date_minute , date_second , date_hour12 , ## # date_am.pm , date_wday , date_wday.xts , ## # date_wday.lbl , date_mday , date_qday , date_yday , ## # date_mweek , date_week , date_week.iso , date_week2 , … recipe_spec_final <- recipe_spec_timeseries %>% step_fourier(date, period = 365, K = 5) %>% step_rm(date) %>% step_rm(contains(\"iso\"), contains(\"minute\"), contains(\"hour\"), contains(\"am.pm\"), contains(\"xts\")) %>% step_normalize(contains(\"index.num\"), date_year) %>% step_dummy(contains(\"lbl\"), one_hot = TRUE) juice(prep(recipe_spec_final)) ## # A tibble: 641 × 47 ## value date_index.num date_year date_half date_quarter date_month date_day ## ## 1 985 -1.73 -0.869 1 1 1 1 ## 2 801 -1.72 -0.869 1 1 1 2 ## 3 1349 -1.72 -0.869 1 1 1 3 ## 4 1562 -1.71 -0.869 1 1 1 4 ## 5 1600 -1.71 -0.869 1 1 1 5 ## 6 1606 -1.70 -0.869 1 1 1 6 ## 7 1510 -1.70 -0.869 1 1 1 7 ## 8 959 -1.69 -0.869 1 1 1 8 ## 9 822 -1.68 -0.869 1 1 1 9 ## 10 1321 -1.68 -0.869 1 1 1 10 ## # ℹ 631 more rows ## # ℹ 40 more variables: date_second , date_wday , date_mday , ## # date_qday , date_yday , date_mweek , date_week , ## # date_week2 , date_week3 , date_week4 , date_mday7 , ## # date_sin365_K1 , date_cos365_K1 , date_sin365_K2 , ## # date_cos365_K2 , date_sin365_K3 , date_cos365_K3 , ## # date_sin365_K4 , date_cos365_K4 , date_sin365_K5 , …"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"model-specification","dir":"Articles","previous_headings":"Modeling","what":"Model Specification","title":"Time Series Machine Learning","text":"Next, let’s create model specification. ’ll use Elastic Net penalized regression via glmnet package.","code":"model_spec_lm <- linear_reg( mode = \"regression\", penalty = 0.1 ) %>% set_engine(\"glmnet\")"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"workflow","dir":"Articles","previous_headings":"Modeling","what":"Workflow","title":"Time Series Machine Learning","text":"can mary preprocessing recipe model using workflow().","code":"workflow_lm <- workflow() %>% add_recipe(recipe_spec_final) %>% add_model(model_spec_lm) workflow_lm ## ══ Workflow ════════════════════════════════════════════════════════════════════ ## Preprocessor: Recipe ## Model: linear_reg() ## ## ── Preprocessor ──────────────────────────────────────────────────────────────── ## 6 Recipe Steps ## ## • step_timeseries_signature() ## • step_fourier() ## • step_rm() ## • step_rm() ## • step_normalize() ## • step_dummy() ## ## ── Model ─────────────────────────────────────────────────────────────────────── ## Linear Regression Model Specification (regression) ## ## Main Arguments: ## penalty = 0.1 ## ## Computational engine: glmnet"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"training","dir":"Articles","previous_headings":"Modeling","what":"Training","title":"Time Series Machine Learning","text":"workflow can trained fit() function.","code":"workflow_fit_lm <- workflow_lm %>% fit(data = training(splits))"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"hyperparameter-tuning","dir":"Articles","previous_headings":"Modeling","what":"Hyperparameter Tuning","title":"Time Series Machine Learning","text":"Linear regression parameters. Therefore, step needed. complex models hyperparameters require tuning. Algorithms include: Elastic Net XGBoost Random Forest Support Vector Machine (SVM) K-Nearest Neighbors Multivariate Adaptive Regression Spines (MARS) like learn tune models time series, join waitlist advanced Time Series Analysis & Forecasting Course.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecasting-with-modeltime","dir":"Articles","previous_headings":"","what":"Forecasting with Modeltime","title":"Time Series Machine Learning","text":"Modeltime Workflow designed speed model evaluation selection. Now several time series models, let’s analyze forecast future modeltime package.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeltime-table","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Modeltime Table","title":"Time Series Machine Learning","text":"Modeltime Table organizes models IDs creates generic descriptions help us keep track models. Let’s add models modeltime_table().","code":"model_table <- modeltime_table( workflow_fit_lm ) model_table ## # Modeltime Table ## # A tibble: 1 × 3 ## .model_id .model .model_desc ## ## 1 1 GLMNET"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"calibration","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Calibration","title":"Time Series Machine Learning","text":"Model Calibration used quantify error estimate confidence intervals. ’ll perform model calibration --sample data (aka. Testing Set) modeltime_calibrate() function. Two new columns generated (“.type” “.calibration_data”), important “.calibration_data”. includes actual values, fitted values, residuals testing set.","code":"calibration_table <- model_table %>% modeltime_calibrate(testing(splits)) calibration_table ## # Modeltime Table ## # A tibble: 1 × 5 ## .model_id .model .model_desc .type .calibration_data ## ## 1 1 GLMNET Test "},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecast-testing-set","dir":"Articles","previous_headings":"Forecasting with Modeltime > Calibration","what":"Forecast (Testing Set)","title":"Time Series Machine Learning","text":"calibrated data, can visualize testing predictions (forecast). Use modeltime_forecast() generate forecast data testing set tibble. Use plot_modeltime_forecast() visualize results interactive static plot formats.","code":"calibration_table %>% modeltime_forecast(actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"accuracy-testing-set","dir":"Articles","previous_headings":"Forecasting with Modeltime > Calibration","what":"Accuracy (Testing Set)","title":"Time Series Machine Learning","text":"Next, calculate testing accuracy compare models. Use modeltime_accuracy() generate --sample accuracy metrics tibble. Use table_modeltime_accuracy() generate interactive static","code":"calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"refit-and-forecast-forward","dir":"Articles","previous_headings":"Forecasting with Modeltime","what":"Refit and Forecast Forward","title":"Time Series Machine Learning","text":"Refitting best-practice forecasting future. modeltime_refit(): re-train full data (bike_transactions_tbl) modeltime_forecast(): models depend “date” feature, can use h (horizon) forecast forward. Setting h = \"12 months\" forecasts next 12-months data.","code":"calibration_table %>% modeltime_refit(bike_transactions_tbl) %>% modeltime_forecast(h = \"12 months\", actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Time Series Machine Learning","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Feature Engineering Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"take-the-high-performance-forecasting-course","dir":"Articles","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Time Series Machine Learning","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"time-series-is-changing","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Time Series Machine Learning","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK03_Forecasting_Using_Time_Series_Signature.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Time Series Machine Learning","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Visualizing Time Series","text":"Run following code setup tutorial.","code":"library(dplyr) library(ggplot2) library(lubridate) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- FALSE"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"plotting-time-series","dir":"Articles","previous_headings":"","what":"Plotting Time Series","title":"Visualizing Time Series","text":"Let’s start popular time series, taylor_30_min, includes energy demand megawatts sampling interval 30-minutes. single time series. plot_time_series() function generates interactive plotly chart default. Simply provide date variable (time-based column, .date_var) numeric variable (.value) changes time first 2 arguments .interactive = TRUE, .plotly_slider = TRUE adds date slider bottom chart.","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows taylor_30_min %>% plot_time_series(date, value, .interactive = interactive, .plotly_slider = TRUE)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"plotting-groups","dir":"Articles","previous_headings":"Plotting Time Series","what":"Plotting Groups","title":"Visualizing Time Series","text":"Next, let’s move dataset time series groups, m4_daily, sample 4 time series M4 competition sampled daily frequency. Visualizing grouped data simple grouping data set group_by() prior piping plot_time_series() function. Key points: Groups can added 2 ways: group_by() using ... add groups. Groups converted facets. .facet_ncol = 2 returns 2-column faceted plot .facet_scales = \"free\" allows x y-axis plot scale independently plots","code":"m4_daily %>% group_by(id) #> # A tibble: 9,743 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows m4_daily %>% group_by(id) %>% plot_time_series(date, value, .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"visualizing-transformations-sub-groups","dir":"Articles","previous_headings":"Plotting Time Series","what":"Visualizing Transformations & Sub-Groups","title":"Visualizing Time Series","text":"Let’s switch hourly dataset multiple groups. can showcase: Log transformation .value Use .color_var highlight sub-groups. intent showcase groups faceted plots, highlight weekly windows (sub-groups) within data simultaneously log() transformation value. simple : .value = log(value) Applies Log Transformation .color_var = week(date) date column transformed lubridate::week() number. color applied week numbers.","code":"m4_hourly %>% group_by(id) #> # A tibble: 3,060 × 3 #> # Groups: id [4] #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows m4_hourly %>% group_by(id) %>% plot_time_series(date, log(value), # Apply a Log Transformation .color_var = week(date), # Color applied to Week transformation # Facet formatting .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"static-ggplot2-visualizations-customizations","dir":"Articles","previous_headings":"Plotting Time Series","what":"Static ggplot2 Visualizations & Customizations","title":"Visualizing Time Series","text":"visualizations can converted interactive plotly (great exploring shiny apps) static ggplot2 visualizations (great reports).","code":"taylor_30_min %>% plot_time_series(date, value, .color_var = month(date, label = TRUE), # Returns static ggplot .interactive = FALSE, # Customization .title = \"Taylor's MegaWatt Data\", .x_lab = \"Date (30-min intervals)\", .y_lab = \"Energy Demand (MW)\", .color_lab = \"Month\") + scale_y_continuous(labels = scales::comma_format())"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"box-plots-time-series","dir":"Articles","previous_headings":"","what":"Box Plots (Time Series)","title":"Visualizing Time Series","text":"plot_time_series_boxplot() function can used make box plots. Box plots use aggregation, key parameter defined .period argument.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_boxplot( date, value, .period = \"1 year\", .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"regression-plots-time-series","dir":"Articles","previous_headings":"","what":"Regression Plots (Time Series)","title":"Visualizing Time Series","text":"time series regression plot, plot_time_series_regression(), can useful quickly assess key features correlated time series. Internally function passes formula stats::lm() function. linear regression summary can output toggling show_summary = TRUE.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE, .show_summary = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Visualizing Time Series","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"take-the-high-performance-forecasting-course","dir":"Articles","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Visualizing Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"time-series-is-changing","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Visualizing Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/TK04_Plotting_Time_Series.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Visualizing Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Plotting Seasonality and Correlation","text":"Run following code set tutorial.","code":"library(dplyr) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- TRUE"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-acf-diagnostics","dir":"Articles","previous_headings":"Correlation Plots","what":"Grouped ACF Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = interactive )"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-ccf-plots","dir":"Articles","previous_headings":"Correlation Plots","what":"Grouped CCF Plots","title":"Plotting Seasonality and Correlation","text":"","code":"walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = interactive )"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"seasonal-visualizations","dir":"Articles","previous_headings":"Seasonality","what":"Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-seasonal-visualizations","dir":"Articles","previous_headings":"Seasonality","what":"Grouped Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"stl-diagnostics","dir":"Articles","previous_headings":"","what":"STL Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .frequency = \"auto\", .trend = \"auto\", .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/TK05_Plotting_Seasonality_and_Correlation.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Plotting Seasonality and Correlation","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"prerequisites","dir":"Articles","previous_headings":"","what":"Prerequisites","title":"Frequency and Trend Selection","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Frequency and Trend Selection","text":"Daily Irregular Data daily stock prices Facebook 2013 2016. Note trading days occur “business days” (non-weekends non-business-holidays). Sub-Daily Data Taylor’s Energy Demand data 30-minute timestamp interval.","code":"data(FANG) FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows taylor_30_min ## # A tibble: 4,032 × 2 ## date value ## ## 1 2000-06-05 00:00:00 22262 ## 2 2000-06-05 00:30:00 21756 ## 3 2000-06-05 01:00:00 22247 ## 4 2000-06-05 01:30:00 22759 ## 5 2000-06-05 02:00:00 22549 ## 6 2000-06-05 02:30:00 22313 ## 7 2000-06-05 03:00:00 22128 ## 8 2000-06-05 03:30:00 21860 ## 9 2000-06-05 04:00:00 21751 ## 10 2000-06-05 04:30:00 21336 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"applications","dir":"Articles","previous_headings":"","what":"Applications","title":"Frequency and Trend Selection","text":"example automatic frequency detection occurs plot_stl_diagnostics() function.","code":"taylor_30_min %>% plot_stl_diagnostics(date, value, .frequency = \"auto\", .trend = \"auto\", .interactive = FALSE) ## frequency = 48 observations per 1 day ## trend = 672 observations per 14 days"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"specifying-a-frequency-or-trend","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Specifying a Frequency or Trend","title":"Frequency and Trend Selection","text":"period argument three basic options returning frequency. Options include: “auto”: target frequency determined using pre-defined Time Scale Template (see ). time-based duration: (e.g. “7 days” “2 quarters” per cycle) numeric number observations: (e.g. 5 5 observations per cycle)","code":""},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"frequency","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Frequency","title":"Frequency and Trend Selection","text":"frequency loosely defined number observations comprise cycle data set. Using tk_get_frequency(), can pick number observations roughly define frequency series. Daily Irregular Data FB_tbl irregular (weekends holidays present), frequency selected weekly week 5-days typically. 5 selected. Sub-Daily Data works well sub-daily time series. ’ll use taylor_30_min 30-minute timestamp series. frequency selected 48 48 timestamps (observations) 1 day 30-minute cycle.","code":"FB_tbl %>% tk_index() %>% tk_get_frequency(period = \"auto\") ## frequency = 5 observations per 1 week ## [1] 5 taylor_30_min %>% tk_index() %>% tk_get_frequency(\"1 day\") ## frequency = 48 observations per 1 day ## [1] 48"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"trend","dir":"Articles","previous_headings":"Automatic Frequency & Trend Selection","what":"Trend","title":"Frequency and Trend Selection","text":"trend loosely defined time span can aggregated across visualize central tendency data. Using tk_get_trend(), can pick number observations help describe trend data. Daily Irregular Data FB_tbl irregular (weekends holidays present), trend selected 3 months week 5-days typically. 64 observations selected. Sub-Daily Data 14-day (2 week) interval selected “30-minute” interval data.","code":"FB_tbl %>% tk_index() %>% tk_get_trend(period = \"auto\") ## trend = 64 observations per 3 months ## [1] 64 taylor_30_min %>% tk_index() %>% tk_get_trend(\"auto\") ## trend = 672 observations per 14 days ## [1] 672"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"time-scale-template","dir":"Articles","previous_headings":"","what":"Time Scale Template","title":"Frequency and Trend Selection","text":"Time-Scale Template used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Accessing Default Template can access current template get_tk_time_scale_template(). Changing Default Template can modify current template set_tk_time_scale_template().","code":"get_tk_time_scale_template() ## # A tibble: 8 × 3 ## time_scale frequency trend ## ## 1 second 1 hour 12 hours ## 2 minute 1 day 14 days ## 3 hour 1 day 1 month ## 4 day 1 week 3 months ## 5 week 1 quarter 1 year ## 6 month 1 year 5 years ## 7 quarter 1 year 10 years ## 8 year 5 years 30 years"},{"path":"https://business-science.github.io/timetk/articles/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Frequency and Trend Selection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Time Series Data Wrangling","text":"Load following libraries.","code":"library(dplyr) library(tidyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Data Wrangling","text":"tutorial use FANG dataset: Daily Irregular (missing business holidays weekends) 4 groups (FB, AMZN, NFLX, GOOG). adjusted column contains adjusted closing prices day. volume column contains trade volume (number times stock transacted) day.","code":"FANG ## # A tibble: 4,032 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 4,022 more rows FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) FANG %>% group_by(symbol) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"summarize-by-time","dir":"Articles","previous_headings":"","what":"Summarize by Time","title":"Time Series Data Wrangling","text":"summarise_by_time() aggregates period. ’s great : Period Aggregation - sum() Period Smoothing - mean(), first(), last()","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"period-summarization","dir":"Articles","previous_headings":"Summarize by Time","what":"Period Summarization","title":"Time Series Data Wrangling","text":"Objective: Get total trade volume quarter Use sum() Aggregate using .= \"quarter\"","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"quarter\", volume = sum(volume) ) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE, .y_intercept = 0)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"period-smoothing","dir":"Articles","previous_headings":"Summarize by Time","what":"Period Smoothing","title":"Time Series Data Wrangling","text":"Objective: Get first value month can use first() get first value, effect reducing data (.e. smoothing). use mean() median(). Use summarization time: .= \"month\" aggregate month.","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"month\", adjusted = first(adjusted) ) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"filter-by-time","dir":"Articles","previous_headings":"","what":"Filter By Time","title":"Time Series Data Wrangling","text":"Used quickly filter continuous time range.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"time-range-filtering","dir":"Articles","previous_headings":"Filter By Time","what":"Time Range Filtering","title":"Time Series Data Wrangling","text":"Objective: Get adjusted stock prices 3rd quarter 2013. .start_date = \"2013-09\": Converts “2013-09-01 .end_date = \"2013\": Converts “2013-12-31 advanced example filtering using %+time %-time shown “Padding Data: Low High Frequency”.","code":"FANG %>% group_by(symbol) %>% filter_by_time(date, \"2013-09\", \"2013\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"padding-data","dir":"Articles","previous_headings":"","what":"Padding Data","title":"Time Series Data Wrangling","text":"Used fill (pad) gaps go low frequency high frequency. function uses awesome padr library filling expanding timestamps.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"fill-in-gaps","dir":"Articles","previous_headings":"Padding Data","what":"Fill in Gaps","title":"Time Series Data Wrangling","text":"Objective: Make irregular series regular. leave padded values NA. can add value using .pad_value can impute using function like ts_impute_vec() (shown next).","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"auto\") # Guesses .by = \"day\" ## pad applied on the interval: day ## # A tibble: 5,836 × 8 ## # Groups: symbol [4] ## symbol date open high low close volume adjusted ## ## 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. ## 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. ## 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. ## 4 AMZN 2013-01-05 NA NA NA NA NA NA ## 5 AMZN 2013-01-06 NA NA NA NA NA NA ## 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. ## 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. ## 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. ## 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. ## 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. ## # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"low-to-high-frequency","dir":"Articles","previous_headings":"Padding Data","what":"Low to High Frequency","title":"Time Series Data Wrangling","text":"Objective: Go Daily Hourly timestamp intervals 1 month start date. Impute missing values. .= \"hour\" pads daily hourly Imputation hourly data accomplished ts_impute_vec(), performs linear interpolation period = 1. “start”: special keyword signals start series FIRST(date) %+time% \"1 month\": Selecting first date sequence using special infix operation, %+time%, called “add time”. case add “1 month”.","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"hour\") %>% mutate_at(vars(open:adjusted), .funs = ts_impute_vec, period = 1) %>% filter_by_time(date, \"start\", first(date) %+time% \"1 month\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"sliding-rolling-calculations","dir":"Articles","previous_headings":"","what":"Sliding (Rolling) Calculations","title":"Time Series Data Wrangling","text":"new function, slidify() turns function sliding (rolling) window function. takes concepts tibbletime::rollify() improves R package slider.","code":""},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"rolling-mean","dir":"Articles","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Mean","title":"Time Series Data Wrangling","text":"Objective: Calculate “centered” simple rolling average partial window rolling start end windows. slidify() turns mean() function rolling average. simple rolling calculations (rolling average), can accomplish operation faster slidify_vec() - vectorized rolling function simple summary rolls (e.g. mean(), sd(), sum(), etc)","code":"# Make the rolling function roll_avg_30 <- slidify(.f = mean, .period = 30, .align = \"center\", .partial = TRUE) # Apply the rolling function FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply Sliding Function mutate(rolling_avg_30 = roll_avg_30(adjusted)) %>% pivot_longer(cols = c(adjusted, rolling_avg_30)) %>% plot_time_series(date, value, .color_var = name, .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE) FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply roll apply Function mutate(rolling_avg_30 = slidify_vec(adjusted, ~ mean(.), .period = 30, .partial = TRUE)) ## # A tibble: 4,032 × 4 ## # Groups: symbol [4] ## symbol date adjusted rolling_avg_30 ## ## 1 FB 2013-01-02 28 30.0 ## 2 FB 2013-01-03 27.8 30.1 ## 3 FB 2013-01-04 28.8 30.2 ## 4 FB 2013-01-07 29.4 30.2 ## 5 FB 2013-01-08 29.1 30.3 ## 6 FB 2013-01-09 30.6 30.3 ## 7 FB 2013-01-10 31.3 30.3 ## 8 FB 2013-01-11 31.7 30.2 ## 9 FB 2013-01-14 31.0 30.1 ## 10 FB 2013-01-15 30.1 30.1 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"rolling-regression","dir":"Articles","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Regression","title":"Time Series Data Wrangling","text":"Objective: Calculate rolling regression. complex sliding (rolling) calculation requires multiple columns involved. slidify() built . Use multi-variable purrr ..1, ..2, ..3, etc notation setup function","code":"# Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~ lm(..1 ~ ..2 + ..3), .period = 90, .unlist = FALSE, .align = \"right\") FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% mutate(numeric_date = as.numeric(date)) %>% # Apply rolling regression mutate(rolling_lm = lm_roll(adjusted, volume, numeric_date)) %>% filter(!is.na(rolling_lm)) ## # A tibble: 3,676 × 6 ## # Groups: symbol [4] ## symbol date adjusted volume numeric_date rolling_lm ## ## 1 FB 2013-05-10 26.7 30847100 15835 ## 2 FB 2013-05-13 26.8 29068800 15838 ## 3 FB 2013-05-14 27.1 24930300 15839 ## 4 FB 2013-05-15 26.6 30299800 15840 ## 5 FB 2013-05-16 26.1 35499100 15841 ## 6 FB 2013-05-17 26.2 29462700 15842 ## 7 FB 2013-05-20 25.8 42402900 15845 ## 8 FB 2013-05-21 25.7 26261300 15846 ## 9 FB 2013-05-22 25.2 45314500 15847 ## 10 FB 2013-05-23 25.1 37663100 15848 ## # ℹ 3,666 more rows"},{"path":"https://business-science.github.io/timetk/articles/TK07_Time_Series_Data_Wrangling.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Data Wrangling","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Anomaly Detection","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"anomaly-visualization","dir":"Articles","previous_headings":"","what":"Anomaly Visualization","title":"Anomaly Detection","text":"Using plot_anomaly_diagnostics() function, can interactively detect anomalies scale.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2)"},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"automatic-anomaly-detection","dir":"Articles","previous_headings":"","what":"Automatic Anomaly Detection","title":"Anomaly Detection","text":"get data anomalies, use tk_anomaly_diagnostics(), preprocessing function.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) ## # A tibble: 1,001 × 13 ## # Groups: Store, Dept [7] ## Store Dept Date observed season trend remainder seasadj remainder_l1 ## ## 1 1 1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. ## 2 1 1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. ## 3 1 1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. ## 4 1 1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. ## 5 1 1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. ## 6 1 1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. ## 7 1 1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. ## 8 1 1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. ## 9 1 1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. ## 10 1 1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. ## # ℹ 991 more rows ## # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , ## # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/articles/TK08_Automatic_Anomaly_Detection.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Anomaly Detection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"libraries","dir":"Articles","previous_headings":"","what":"Libraries","title":"Time Series Clustering","text":"get started, load following libraries.","code":"library(dplyr) library(purrr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"Time Series Clustering","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"ts-features","dir":"Articles","previous_headings":"","what":"TS Features","title":"Time Series Clustering","text":"Using tk_tsfeatures() function, can quickly get “tsfeatures” time series. important points: features parameter come tsfeatures R package. Use one function names tsfeatures R package e.g.(“lumpiness”, “stl_features”). can supply function returns aggregation (e.g. “mean” apply base::mean() function). can supply custom functions creating function providing (e.g. my_mean() defined )","code":"# Custom Function my_mean <- function(x, na.rm=TRUE) { mean(x, na.rm = na.rm) } tsfeature_tbl <- walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"my_mean\"), .scale = TRUE, .prefix = \"ts_\" ) %>% ungroup() tsfeature_tbl ## # A tibble: 7 × 22 ## id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 1_1 52 1 52 0.000670 0.0000280 ## 2 1_3 52 1 52 0.0614 0.00000987 ## 3 1_8 52 1 52 0.756 0.00000195 ## 4 1_13 52 1 52 0.354 0.00000475 ## 5 1_38 52 1 52 0.425 0.0000179 ## 6 1_93 52 1 52 0.791 0.000000754 ## 7 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"clustering-with-k-means","dir":"Articles","previous_headings":"","what":"Clustering with K-Means","title":"Time Series Clustering","text":"can quickly add cluster assignments kmeans() function tidyverse data wrangling.","code":"set.seed(123) cluster_tbl <- tibble( cluster = tsfeature_tbl %>% select(-id) %>% as.matrix() %>% kmeans(centers = 3, nstart = 100) %>% pluck(\"cluster\") ) %>% bind_cols( tsfeature_tbl ) cluster_tbl ## # A tibble: 7 × 23 ## cluster id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 2 1_1 52 1 52 0.000670 0.0000280 ## 2 2 1_3 52 1 52 0.0614 0.00000987 ## 3 2 1_8 52 1 52 0.756 0.00000195 ## 4 1 1_13 52 1 52 0.354 0.00000475 ## 5 3 1_38 52 1 52 0.425 0.0000179 ## 6 3 1_93 52 1 52 0.791 0.000000754 ## 7 1 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"visualize-the-cluster-assignments","dir":"Articles","previous_headings":"","what":"Visualize the Cluster Assignments","title":"Time Series Clustering","text":"Finally, can visualize cluster assignments joining cluster_tbl original walmart_sales_weekly plotting plot_time_series().","code":"cluster_tbl %>% select(cluster, id) %>% right_join(walmart_sales_weekly, by = \"id\") %>% group_by(id) %>% plot_time_series( Date, Weekly_Sales, .color_var = cluster, .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/TK09_Clustering.html","id":"learning-more","dir":"Articles","previous_headings":"","what":"Learning More","title":"Time Series Clustering","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Time Series Class Conversion","text":"time series landscape R vast, deep, complex causing many inconsistencies data attributes formats ultimately making difficult coerce different data structures. zoo xts packages solved number issues dealing various classes (ts, zoo, xts, irts, msts, list goes …). However, packages deal classes data frame, issues conversion tbl time series object classes still present. timetk package provides tools solve issues conversion, maximizing attribute extensibility (required data attributes retained conversion primary time series classes). following tools available coerce retrieve key information: Conversion functions: tk_tbl, tk_ts, tk_xts, tk_zoo, tk_zooreg. functions coerce time-based tibbles tbl main time-series data types xts, zoo, zooreg, ts, maintaining time-based index. Index function: tk_index returns index. argument, timetk_idx = TRUE, time-based index (non-regularized index) forecast objects, models, ts objects returned present. Refer tk_ts() learn non-regularized index persistence conversion process. vignette includes brief case study conversion issues detailed explanation timetk function conversion time-based tbl objects several primary time series classes (xts, zoo, zooreg ts).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Time Series Class Conversion","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Class Conversion","text":"’ll use “Q10” dataset - first ID sample quarterly datasets (see m4_quarterly) M4 Competition. return structure tibble, conducive many popular time series analysis packages including quantmod, TTR, forecast many others.","code":"q10_quarterly <- m4_quarterly %>% filter(id == \"Q10\") q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"case-study-conversion-issues-with-ts","dir":"Articles > Temp_archive","previous_headings":"","what":"Case Study: Conversion issues with ts()","title":"Time Series Class Conversion","text":"ts object class roots stats package many popular packages use time series data structure including popular forecast package. said, ts data structure difficult coerce back forth default contain time-based index. Rather uses regularized index computed using start frequency arguments. Conversion ts done using ts() function stats library, results various problems.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"problems","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Problems","title":"Time Series Class Conversion","text":"First, numeric columns get coerced. user forgets add [,\"pct\"] drop “date” column, ts() returns dates numeric format user wants. correct method call specific column desired. However, presents new issue. date index lost, different “regularized” index built using start frequency attributes. can see structure (using str() function) regularized time series present, date index retained. can get index using index() function zoo package. index retained regular sequence numeric values. many cases, regularized values coerced back original time-base date date time data contains significantly information (.e. year-month-day, hour-minute-second, timezone attributes) data may regularized interval (frequency).","code":"# date column gets coerced to numeric ts(q10_quarterly, start = c(2000, 1), freq = 4) %>% head() ## id date value ## [1,] 1 10957 2329.0 ## [2,] 1 11048 2349.9 ## [3,] 1 11139 2332.9 ## [4,] 1 11231 2381.5 ## [5,] 1 11323 2382.6 ## [6,] 1 11413 2405.0 q10_quarterly_ts <- ts(q10_quarterly$value, start = c(2000, 1), freq = 4) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # No date index attribute str(q10_quarterly_ts) ## Time-Series [1:59] from 2000 to 2014: 2329 2350 2333 2382 2383 ... # Regularized numeric sequence zoo::index(q10_quarterly_ts) ## [1] 2000.00 2000.25 2000.50 2000.75 2001.00 2001.25 2001.50 2001.75 2002.00 ## [10] 2002.25 2002.50 2002.75 2003.00 2003.25 2003.50 2003.75 2004.00 2004.25 ## [19] 2004.50 2004.75 2005.00 2005.25 2005.50 2005.75 2006.00 2006.25 2006.50 ## [28] 2006.75 2007.00 2007.25 2007.50 2007.75 2008.00 2008.25 2008.50 2008.75 ## [37] 2009.00 2009.25 2009.50 2009.75 2010.00 2010.25 2010.50 2010.75 2011.00 ## [46] 2011.25 2011.50 2011.75 2012.00 2012.25 2012.50 2012.75 2013.00 2013.25 ## [55] 2013.50 2013.75 2014.00 2014.25 2014.50"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"solution","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Solution","title":"Time Series Class Conversion","text":"timetk package contains new function, tk_ts(), enables maintaining original date index attribute. repeat tbl ts conversion process using new function, tk_ts(), can see differences. First, numeric columns get coerced, prevents unintended consequences due R conversion rules (e.g. dates getting unintentionally converted characters causing homogeneous data structure converting numeric values character). column dropped, user gets warning. Second, data returned additional attributes. important numeric attribute, “index”, contains original date information number. ts() function preserve index tk_ts() preserve index numeric form along time zone class.","code":"# date automatically dropped and user is warned q10_quarterly_ts_timetk <- tk_ts(q10_quarterly, start = 2000, freq = 4) ## Warning: Non-numeric columns being dropped: id, date q10_quarterly_ts_timetk ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # More attributes including time index, time class, time zone str(q10_quarterly_ts_timetk) ## Time-Series [1:59, 1] from 2000 to 2014: 2329 2350 2333 2382 2383 ... ## - attr(*, \"dimnames\")=List of 2 ## ..$ : NULL ## ..$ : chr \"value\" ## - attr(*, \"index\")= num [1:59] 9.47e+08 9.55e+08 9.62e+08 9.70e+08 9.78e+08 ... ## ..- attr(*, \"tzone\")= chr \"UTC\" ## ..- attr(*, \"tclass\")= chr \"Date\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"advantages-of-conversion-with-tk_tbl","dir":"Articles > Temp_archive","previous_headings":"Case Study: Conversion issues with ts()","what":"Advantages of conversion with tk_tbl()","title":"Time Series Class Conversion","text":"Since used tk_ts() conversion, can extract original index date format using tk_index(timetk_idx = TRUE) (default timetk_idx = FALSE returns default regularized index). Next, tk_tbl() function argument timetk_idx also can used select index return. First, show conversion using default index. Notice index returned “regularized” meaning actually numeric index rather time-based index. can now get original date index using tk_tbl() argument timetk_idx = TRUE. can see case (cases) can get data frame began .","code":"# Can now retrieve the original date index timetk_index <- q10_quarterly_ts_timetk %>% tk_index(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent head(timetk_index) ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" class(timetk_index) ## [1] \"Date\" # Conversion back to tibble using the default index (regularized) q10_quarterly_ts_timetk %>% tk_tbl(index_rename = \"date\", timetk_idx = FALSE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # Conversion back to tibble now using the timetk index (date / date-time) q10_quarterly_timetk <- q10_quarterly_ts_timetk %>% tk_tbl(timetk_idx = TRUE) %>% rename(date = index) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent q10_quarterly_timetk ## # A tibble: 59 × 2 ## date value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows # Comparing the coerced tibble with the original tibble identical(q10_quarterly_timetk, q10_quarterly %>% select(-id)) ## [1] TRUE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"conversion-methods","dir":"Articles > Temp_archive","previous_headings":"","what":"Conversion Methods","title":"Time Series Class Conversion","text":"Using q10_quarterly, ’ll go various conversion methods using tk_tbl, tk_xts, tk_zoo, tk_zooreg, tk_ts.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-tbl","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods","what":"From tbl","title":"Time Series Class Conversion","text":"starting point q10_quarterly. coerce xts, zoo, zooreg ts classes.","code":"# Start: q10_quarterly ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000-01-01 2329 ## 2 Q10 2000-04-01 2350. ## 3 Q10 2000-07-01 2333. ## 4 Q10 2000-10-01 2382. ## 5 Q10 2001-01-01 2383. ## 6 Q10 2001-04-01 2405 ## 7 Q10 2001-07-01 2411 ## 8 Q10 2001-10-01 2428. ## 9 Q10 2002-01-01 2392. ## 10 Q10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-xts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to xts","title":"Time Series Class Conversion","text":"Use tk_xts(). default “date” used date index “date” column dropped output. numeric columns coerced avoid unintentional conversion issues. Use select argument specify columns drop. Use date_var argument specify column use date index. Notice message warning longer present. Also, alternative, can set silent = TRUE bypass warnings since default dropping “date” column desired. Notice warnings messages.","code":"# End q10_quarterly_xts <- tk_xts(q10_quarterly) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `select` and `date_var` args tk_xts(q10_quarterly, select = -(id:date), date_var = date) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End - Using `silent` to silence warnings tk_xts(q10_quarterly, silent = TRUE) %>% head() ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-zoo","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to zoo","title":"Time Series Class Conversion","text":"Use tk_zoo(). coercing xts, non-numeric “date” column automatically dropped index automatically selected date column.","code":"# End q10_quarterly_zoo <- tk_zoo(q10_quarterly, silent = TRUE) head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-zooreg","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to zooreg","title":"Time Series Class Conversion","text":"Use tk_zooreg(). coercing xts, non-numeric “date” column automatically dropped. regularized index built function arguments start freq. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_zooreg <- tk_zooreg(q10_quarterly, start = 2000, freq = 4, silent = TRUE) head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # Retrieve original time-based index tk_index(q10_quarterly_zooreg, timetk_idx = TRUE) %>% str() ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-ts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > From tbl","what":"to ts","title":"Time Series Class Conversion","text":"Use tk_ts(). non-numeric “date” column automatically dropped. regularized index built function arguments. original time-based index retained can accessed using tk_index(timetk_idx = TRUE).","code":"# End q10_quarterly_ts <- tk_ts(q10_quarterly, start = 2000, freq = 4, silent = TRUE) q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # Retrieve original time-based index tk_index(q10_quarterly_ts, timetk_idx = TRUE) %>% str() ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## Date[1:59], format: \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"to-tbl","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods","what":"To tbl","title":"Time Series Class Conversion","text":"Going back tibble just easy using tk_tbl().","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-xts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From xts","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_xts) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_xts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-zoo","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From zoo","title":"Time Series Class Conversion","text":"Notice loss data going back tbl.","code":"# Start head(q10_quarterly_zoo) ## value ## 2000-01-01 2329.0 ## 2000-04-01 2349.9 ## 2000-07-01 2332.9 ## 2000-10-01 2381.5 ## 2001-01-01 2382.6 ## 2001-04-01 2405.0 # End tk_tbl(q10_quarterly_zoo) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-zooreg","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From zooreg","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start head(q10_quarterly_zooreg) ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 # End - with default regularized index tk_tbl(q10_quarterly_zooreg) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index that is the same as original time-based index tk_tbl(q10_quarterly_zooreg, timetk_idx = TRUE) ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"from-ts","dir":"Articles > Temp_archive","previous_headings":"Conversion Methods > To tbl","what":"From ts","title":"Time Series Class Conversion","text":"Notice index regularized numeric sequence default. timetk_idx = TRUE index original date sequence. result original tbl started !","code":"# Start q10_quarterly_ts ## Qtr1 Qtr2 Qtr3 Qtr4 ## 2000 2329.0 2349.9 2332.9 2381.5 ## 2001 2382.6 2405.0 2411.0 2428.5 ## 2002 2391.6 2418.5 2406.5 2418.5 ## 2003 2420.4 2438.6 2448.7 2470.6 ## 2004 2484.5 2495.9 2492.5 2521.6 ## 2005 2538.1 2549.7 2587.2 2585.0 ## 2006 2602.6 2615.3 2654.0 2680.8 ## 2007 2665.4 2645.1 2647.5 2719.2 ## 2008 2677.0 2650.9 2667.8 2660.2 ## 2009 2554.7 2522.7 2510.0 2541.7 ## 2010 2499.1 2527.9 2519.0 2536.3 ## 2011 2493.2 2542.1 2501.6 2516.3 ## 2012 2510.5 2548.4 2548.6 2530.7 ## 2013 2497.1 2520.4 2516.9 2505.5 ## 2014 2513.9 2549.9 2555.3 # End - with default regularized index tk_tbl(q10_quarterly_ts) ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows # End - with timetk index tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"testing-if-an-object-has-a-timetk-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Testing if an object has a timetk index","title":"Time Series Class Conversion","text":"function has_timetk_idx() can used test whether toggling timetk_idx argument tk_index() tk_tbl() functions effect output. several examples using ten year treasury data used case study:","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"tk_ts","dir":"Articles > Temp_archive","previous_headings":"Testing if an object has a timetk index","what":"tk_ts()","title":"Time Series Class Conversion","text":"tk_ts() function returns object “timetk index” attribute. toggle timetk_idx = TRUE retrieving index tk_index(), get index dates rather regularized time series. toggle timetk_idx = TRUE conversion tbl using tk_tbl(), get index dates rather regularized index returned tbl.","code":"# Data coerced with tk_ts() has timetk index has_timetk_idx(q10_quarterly_ts) ## [1] TRUE tk_index(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" tk_tbl(q10_quarterly_ts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000-01-01 2329 ## 2 2000-04-01 2350. ## 3 2000-07-01 2333. ## 4 2000-10-01 2382. ## 5 2001-01-01 2383. ## 6 2001-04-01 2405 ## 7 2001-07-01 2411 ## 8 2001-10-01 2428. ## 9 2002-01-01 2392. ## 10 2002-04-01 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"testing-other-data-types","dir":"Articles > Temp_archive","previous_headings":"Testing if an object has a timetk index","what":"Testing other data types","title":"Time Series Class Conversion","text":"timetk_idx argument effect objects use regularized time series. Therefore, has_timetk_idx() returns FALSE object types (e.g. tbl, xts, zoo) since toggling argument effect classes. Toggling timetk_idx argument effect output. Output timetk_idx = TRUE timetk_idx = FALSE.","code":"has_timetk_idx(q10_quarterly_xts) ## [1] FALSE tk_index(q10_quarterly_xts, timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## [1] \"2000-01-01\" \"2000-04-01\" \"2000-07-01\" \"2000-10-01\" \"2001-01-01\" ## [6] \"2001-04-01\" \"2001-07-01\" \"2001-10-01\" \"2002-01-01\" \"2002-04-01\" ## [11] \"2002-07-01\" \"2002-10-01\" \"2003-01-01\" \"2003-04-01\" \"2003-07-01\" ## [16] \"2003-10-01\" \"2004-01-01\" \"2004-04-01\" \"2004-07-01\" \"2004-10-01\" ## [21] \"2005-01-01\" \"2005-04-01\" \"2005-07-01\" \"2005-10-01\" \"2006-01-01\" ## [26] \"2006-04-01\" \"2006-07-01\" \"2006-10-01\" \"2007-01-01\" \"2007-04-01\" ## [31] \"2007-07-01\" \"2007-10-01\" \"2008-01-01\" \"2008-04-01\" \"2008-07-01\" ## [36] \"2008-10-01\" \"2009-01-01\" \"2009-04-01\" \"2009-07-01\" \"2009-10-01\" ## [41] \"2010-01-01\" \"2010-04-01\" \"2010-07-01\" \"2010-10-01\" \"2011-01-01\" ## [46] \"2011-04-01\" \"2011-07-01\" \"2011-10-01\" \"2012-01-01\" \"2012-04-01\" ## [51] \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" \"2013-04-01\" \"2013-07-01\" ## [56] \"2013-10-01\" \"2014-01-01\" \"2014-04-01\" \"2014-07-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"working-with-zooyearmon-and-zooyearqtr-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Working with zoo::yearmon and zoo::yearqtr index","title":"Time Series Class Conversion","text":"zoo package yearmon yearqtr classes working regularized monthly quarterly data, respectively. “timetk index” tracks format conversion. ’s example yearqtr. can coerce xts yearqtr class intact. can coerce ts , although “timetk index” hidden, yearqtr class intact. Coercing ts tbl using timetk_idx = TRUE shows original index maintained conversion steps.","code":"yearqtr_tbl <- q10_quarterly %>% mutate(date = zoo::as.yearqtr(date)) yearqtr_tbl ## # A tibble: 59 × 3 ## id date value ## ## 1 Q10 2000 Q1 2329 ## 2 Q10 2000 Q2 2350. ## 3 Q10 2000 Q3 2333. ## 4 Q10 2000 Q4 2382. ## 5 Q10 2001 Q1 2383. ## 6 Q10 2001 Q2 2405 ## 7 Q10 2001 Q3 2411 ## 8 Q10 2001 Q4 2428. ## 9 Q10 2002 Q1 2392. ## 10 Q10 2002 Q2 2418. ## # ℹ 49 more rows yearqtr_xts <- tk_xts(yearqtr_tbl) ## Warning: Non-numeric columns being dropped: id, date ## Using column `date` for date_var. yearqtr_xts %>% head() ## value ## 2000 Q1 2329.0 ## 2000 Q2 2349.9 ## 2000 Q3 2332.9 ## 2000 Q4 2381.5 ## 2001 Q1 2382.6 ## 2001 Q2 2405.0 yearqtr_ts <- tk_ts(yearqtr_xts, start = 1997, freq = 4) yearqtr_ts %>% head() ## value ## [1,] 2329.0 ## [2,] 2349.9 ## [3,] 2332.9 ## [4,] 2381.5 ## [5,] 2382.6 ## [6,] 2405.0 yearqtr_ts %>% tk_tbl(timetk_idx = TRUE) ## Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent ## # A tibble: 59 × 2 ## index value ## ## 1 2000 Q1 2329 ## 2 2000 Q2 2350. ## 3 2000 Q3 2333. ## 4 2000 Q4 2382. ## 5 2001 Q1 2383. ## 6 2001 Q2 2405 ## 7 2001 Q3 2411 ## 8 2001 Q4 2428. ## 9 2002 Q1 2392. ## 10 2002 Q2 2418. ## # ℹ 49 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK00_Time_Series_Coercion.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Class Conversion","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Calendar Features","text":"time series index consists collection time-based values define observation occurred, important part time series object. index gives user lot information simple timestamp. Consider datetime “2016-01-01 00:00:00”. timestamp, can decompose date time information get signature, consists year, quarter, month, day, day year, day month, hour, minute, second occurrence single observation. , difference two observations frequency can obtain even information periodicity data whether observations regular interval. information critical provides basis performance time finance, decay rates biology, growth rates economics, . vignette user exposed : Time Series Index Time Series Signature Time Series Summary","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Calendar Features","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Calendar Features","text":"’ll use Facebook stock prices FANG data set. historical stock prices (open, high, low, close, volume, adjusted) “FB” stock 2013 2016. simplify tutorial, select “date” “volume” columns. FB_vol_date data frame, can see “date” column observations daily beginning second day 2013.","code":"data(\"FANG\") FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows FB_vol_date <- FB_tbl %>% select(date, volume) FB_vol_date ## # A tibble: 1,008 × 2 ## date volume ## ## 1 2013-01-02 69846400 ## 2 2013-01-03 63140600 ## 3 2013-01-04 72715400 ## 4 2013-01-07 83781800 ## 5 2013-01-08 45871300 ## 6 2013-01-09 104787700 ## 7 2013-01-10 95316400 ## 8 2013-01-11 89598000 ## 9 2013-01-14 98892800 ## 10 2013-01-15 173242600 ## # ℹ 998 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-index","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Index","title":"Calendar Features","text":"can analyze index, need extract object. function tk_index() extracts index time series object including data frame (tbl), xts, zoo, etc. index always returned native date, datetime, yearmon, yearqtr format. Note index must one time-based classes extraction work: datetimes: Must inherit POSIXt dates: Must inherit Date yearmon: Must inherit yearmon zoo package yearqtr: Must inherit yearqtr zoo package Extract index using tk_index(). structure shown see output format, vector dates.","code":"# idx_date idx_date <- tk_index(FB_vol_date) str(idx_date) ## Date[1:1008], format: \"2013-01-02\" \"2013-01-03\" \"2013-01-04\" \"2013-01-07\" \"2013-01-08\" ..."},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-signature","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Signature","title":"Calendar Features","text":"index can decomposed signature. time series signature unique set properties time series values describe time series.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"get-functions---turning-an-index-into-information","dir":"Articles > Temp_archive","previous_headings":"Time Series Signature","what":"Get Functions - Turning an Index into Information","title":"Calendar Features","text":"function tk_get_timeseries_signature() can used convert index tibble containing following values (columns): index: index value decomposed index.num: numeric value index seconds. base “1970-01-01 00:00:00” (Execute \"1970-01-01 00:00:00\" %>% ymd_hms() %>% .numeric() see value returned zero). Every time series value date can converted numeric value seconds. diff: difference seconds previous numeric index value. year: year component index. year.iso: ISO year number year (Monday start). half: half component index. quarter: quarter component index. month: month component index base 1. month.xts: month component index base 0, xts implements. month.lbl: month label ordered factor begining January ending December. day: day component index. hour: hour component index. minute: minute component index. second: second component index. hour12: hour component 12 hour scale. .pm: Morning () = 1, Afternoon (PM) = 2. wday: day week base 1. Sunday = 1 Saturday = 7. wday.xts: day week base 0, xts implements. Sunday = 0 Saturday = 6. wday.lbl: day week label ordered factor begining Sunday ending Saturday. mday: day month. qday: day quarter. yday: day year. mweek: week month. week: week number year (Sunday start). week.iso: ISO week number year (Monday start). week2: modulus bi-weekly frequency. week3: modulus tri-weekly frequency. week4: modulus quad-weekly frequency. mday7: integer division day month seven, returns first, second, third, … instance day appeared month. Values begin 1. example, first Saturday month mday7 = 1. second mday7 = 2.","code":"# idx_date signature tk_get_timeseries_signature(idx_date) ## # A tibble: 1,008 × 29 ## index index.num diff year year.iso half quarter month month.xts ## ## 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 ## 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 ## 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 ## 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 ## 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 ## 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 ## 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 ## 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 ## 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 ## 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 ## # ℹ 998 more rows ## # ℹ 20 more variables: month.lbl , day , hour , minute , ## # second , hour12 , am.pm , wday , wday.xts , ## # wday.lbl , mday , qday , yday , mweek , ## # week , week.iso , week2 , week3 , week4 , ## # mday7 "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"augment-functions-adding-many-features-to-a-data-frame","dir":"Articles > Temp_archive","previous_headings":"Time Series Signature","what":"Augment Functions (Adding Many Features to a Data Frame)","title":"Calendar Features","text":"’s usually important keep index signature values (e.g. volume example). can use expedited approach tk_augment_timeseries_signature(), adds signature end time series object. Modeling now much easier. example, can use linear regression model using lm() function month year predictor volume.","code":"# Augmenting a data frame FB_vol_date_signature <- FB_vol_date %>% tk_augment_timeseries_signature(.date_var = date) FB_vol_date_signature ## # A tibble: 1,008 × 30 ## date volume index.num diff year year.iso half quarter month ## ## 1 2013-01-02 69846400 1357084800 NA 2013 2013 1 1 1 ## 2 2013-01-03 63140600 1357171200 86400 2013 2013 1 1 1 ## 3 2013-01-04 72715400 1357257600 86400 2013 2013 1 1 1 ## 4 2013-01-07 83781800 1357516800 259200 2013 2013 1 1 1 ## 5 2013-01-08 45871300 1357603200 86400 2013 2013 1 1 1 ## 6 2013-01-09 104787700 1357689600 86400 2013 2013 1 1 1 ## 7 2013-01-10 95316400 1357776000 86400 2013 2013 1 1 1 ## 8 2013-01-11 89598000 1357862400 86400 2013 2013 1 1 1 ## 9 2013-01-14 98892800 1358121600 259200 2013 2013 1 1 1 ## 10 2013-01-15 173242600 1358208000 86400 2013 2013 1 1 1 ## # ℹ 998 more rows ## # ℹ 21 more variables: month.xts , month.lbl , day , hour , ## # minute , second , hour12 , am.pm , wday , ## # wday.xts , wday.lbl , mday , qday , yday , ## # mweek , week , week.iso , week2 , week3 , ## # week4 , mday7 # Example Benefit 2: Modeling is easier fit <- lm(volume ~ year + month.lbl, data = FB_vol_date_signature) summary(fit) ## ## Call: ## lm(formula = volume ~ year + month.lbl, data = FB_vol_date_signature) ## ## Residuals: ## Min 1Q Median 3Q Max ## -51042223 -13528407 -4588594 8296073 304011277 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 2.494e+10 1.414e+09 17.633 < 2e-16 *** ## year -1.236e+07 7.021e+05 -17.604 < 2e-16 *** ## month.lbl.L -9.589e+06 2.740e+06 -3.499 0.000488 *** ## month.lbl.Q 7.348e+06 2.725e+06 2.697 0.007122 ** ## month.lbl.C -9.773e+06 2.711e+06 -3.605 0.000328 *** ## month.lbl^4 -2.885e+06 2.720e+06 -1.060 0.289176 ## month.lbl^5 -2.994e+06 2.749e+06 -1.089 0.276428 ## month.lbl^6 3.169e+06 2.753e+06 1.151 0.249851 ## month.lbl^7 6.000e+05 2.721e+06 0.221 0.825514 ## month.lbl^8 8.281e+03 2.702e+06 0.003 0.997555 ## month.lbl^9 9.504e+06 2.704e+06 3.515 0.000459 *** ## month.lbl^10 -5.911e+06 2.701e+06 -2.188 0.028888 * ## month.lbl^11 -4.738e+06 2.696e+06 -1.757 0.079181 . ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 24910000 on 995 degrees of freedom ## Multiple R-squared: 0.2714, Adjusted R-squared: 0.2626 ## F-statistic: 30.89 on 12 and 995 DF, p-value: < 2.2e-16"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"time-series-summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Series Summary","title":"Calendar Features","text":"next index analysis tool summary metrics, can retrieved using tk_get_timeseries_summary() function. summary reports following attributes single-row tibble. General Summary: first six columns general summary information. n.obs: total number observations start: start appropriate time class end: end appropriate time class units: label describes unit index value independent frequency (.e. date class always “days” whereas datetime class always “seconds”). Values can days, hours, mins, secs. scale: label describes median difference (frequency) observations. Values can quarter, month, day, hour, minute, second. tzone: timezone index. Differences Summary: next group values differences summary (.e. summary frequency). values seconds: diff.minimum: minimum difference index values. diff.q1: first quartile index differences. diff.median: median difference index values (.e. common frequency). diff.mean: average difference index values. diff.q3: third quartile index differences. diff.maximum: maximum difference index values. differences provide information regularity frequency. Generally speaking difference values equal, index regular. However, scales beyond “day” never theoretically regular since differences seconds equivalent. However, conceptually monthly, quarterly yearly data can thought regular index contains consecutive months, quarters, years, respectively. Therefore, difference attributes meaningful daily lower time scales difference summary always indicates level regularity. second group (differences summary), immediately recognize mean different median therefore index irregular (meaning certain days missing). can see maximum difference 345,600 seconds, indicating maximum difference 4 days (345,600 seconds / 86400 seconds/day).","code":"# idx_date: First six columns, general summary tk_get_timeseries_summary(idx_date)[,1:6] ## # A tibble: 1 × 6 ## n.obs start end units scale tzone ## ## 1 1008 2013-01-02 2016-12-30 days day UTC # idx_date: Last six columns, difference summary tk_get_timeseries_summary(idx_date)[,7:12] ## # A tibble: 1 × 6 ## diff.minimum diff.q1 diff.median diff.mean diff.q3 diff.maximum ## ## 1 86400 86400 86400 125096. 86400 345600"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK01_Working_With_Time_Series_Index.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Calendar Features","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Intelligent Date & Time Sequences","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"making-a-time-series-sequence","dir":"Articles > Temp_archive","previous_headings":"","what":"Making a Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"tk_make_timeseries() improves seq.Date() seq.POSIXt() functions simplifying 1 function. Intelligently handles character dates logical assumptions based user inputs. Day Can use = \"day\" leave blank. include_endpoints = FALSE removes last value series 7 observations. 2 Seconds Can use = \"2 sec\" adjust interval width. include_endpoints = TRUE keeps last value series ends 6th second. Length = 1 year 6 months length_out = \"1 year 6 months\" - Can include complex expressions like “1 year 4 months 6 days”. Go Reverse go reverse, just use end_date want series end.","code":"# Selects by day automatically tk_make_timeseries(\"2011\", length_out = \"7 days\", include_endpoints = FALSE) ## [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-05\" ## [6] \"2011-01-06\" \"2011-01-07\" # Guesses by second tk_make_timeseries(\"2016\", by = \"2 sec\", length_out = \"6 seconds\") ## [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:02 UTC\" ## [3] \"2016-01-01 00:00:04 UTC\" \"2016-01-01 00:00:06 UTC\" tk_make_timeseries(\"2012-07\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) ## [1] \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" \"2012-11-01\" ## [6] \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" \"2013-04-01\" ## [11] \"2013-05-01\" \"2013-06-01\" \"2013-07-01\" \"2013-08-01\" \"2013-09-01\" ## [16] \"2013-10-01\" \"2013-11-01\" \"2013-12-01\" tk_make_timeseries(end_date = \"2012-07-01\", by = \"1 month\", length_out = \"1 year 6 months\") ## [1] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" ## [6] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" ## [11] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" ## [16] \"2012-04-01\" \"2012-05-01\" \"2012-06-01\" \"2012-07-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"future-time-series-sequence","dir":"Articles > Temp_archive","previous_headings":"","what":"Future Time Series Sequence","title":"Intelligent Date & Time Sequences","text":"common operation make future time series sequence mimics existing. tk_make_future_timeseries() . Suppose existing time index. Make Future Time Series Existing can create future time sequence existing sequence using tk_make_future_timeseries().","code":"idx <- tk_make_timeseries(\"2012\", by = \"3 months\", length_out = \"2 years\", include_endpoints = FALSE) idx ## [1] \"2012-01-01\" \"2012-04-01\" \"2012-07-01\" \"2012-10-01\" \"2013-01-01\" ## [6] \"2013-04-01\" \"2013-07-01\" \"2013-10-01\" tk_make_future_timeseries(idx, length_out = \"2 years\") ## [1] \"2014-01-01\" \"2014-04-01\" \"2014-07-01\" \"2014-10-01\" \"2015-01-01\" ## [6] \"2015-04-01\" \"2015-07-01\" \"2015-10-01\""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"weekends-holidays","dir":"Articles > Temp_archive","previous_headings":"","what":"Weekends & Holidays","title":"Intelligent Date & Time Sequences","text":"Make weekday sequence removing holidays Result 252 days. holidays removed? NYSE Trading holidays days businesses observe Make future index removing holidays","code":"idx <- tk_make_weekday_sequence(\"2012\", remove_weekends = TRUE, remove_holidays = TRUE, calendar = \"NYSE\") tk_get_timeseries_summary(idx) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 250 2012-01-03 2012-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum tk_make_holiday_sequence(\"2012\", calendar = \"NYSE\") ## [1] \"2012-01-02\" \"2012-01-16\" \"2012-02-20\" \"2012-04-06\" \"2012-05-28\" ## [6] \"2012-07-04\" \"2012-09-03\" \"2012-10-29\" \"2012-10-30\" \"2012-11-22\" ## [11] \"2012-12-25\" holidays <- tk_make_holiday_sequence( start_date = \"2013-01-01\", end_date = \"2013-12-31\", calendar = \"NYSE\") idx_future <- idx %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) tk_get_timeseries_summary(idx_future) ## # A tibble: 1 × 12 ## n.obs start end units scale tzone diff.minimum diff.q1 diff.median ## ## 1 252 2013-01-02 2013-12-31 days day UTC 86400 86400 86400 ## # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK02_Time_Series_Date_Sequences.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Intelligent Date & Time Sequences","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"introduction","dir":"Articles > Temp_archive","previous_headings":"","what":"Introduction","title":"Time Series Machine Learning","text":"time series signature collection useful features describe time series index time-based data set. contains wealth features can used forecast time series contain patterns. vignette, user learn methods implement machine learning predict future outcomes time-based data set. vignette example uses well known time series dataset, Bike Sharing Dataset, UCI Machine Learning Repository. vignette follows example ’ll use timetk build basic Machine Learning model predict future values using time series signature. objective build model predict next six months Bike Sharing daily counts.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Time Series Machine Learning","text":"get started, load following packages.","code":"library(tidymodels) library(modeltime) library(dplyr) library(timetk) # Used to convert plots from interactive to static interactive = TRUE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Machine Learning","text":"’ll using Bike Sharing Dataset UCI Machine Learning Repository. Source: Fanaee-T, Hadi, Gama, Joao, ‘Event labeling combining ensemble detectors background knowledge’, Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg Next, visualize dataset plot_time_series() function. Toggle .interactive = TRUE get plotly interactive plot. FALSE returns ggplot2 static plot.","code":"# Read data bike_transactions_tbl <- bike_sharing_daily %>% select(dteday, cnt) %>% set_names(c(\"date\", \"value\")) bike_transactions_tbl ## # A tibble: 731 × 2 ## date value ## ## 1 2011-01-01 985 ## 2 2011-01-02 801 ## 3 2011-01-03 1349 ## 4 2011-01-04 1562 ## 5 2011-01-05 1600 ## 6 2011-01-06 1606 ## 7 2011-01-07 1510 ## 8 2011-01-08 959 ## 9 2011-01-09 822 ## 10 2011-01-10 1321 ## # ℹ 721 more rows bike_transactions_tbl %>% plot_time_series(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"train-test","dir":"Articles > Temp_archive","previous_headings":"","what":"Train / Test","title":"Time Series Machine Learning","text":"Next, use time_series_split() make train/test set. Setting assess = \"3 months\" tells function use last 3-months data testing set. Setting cumulative = TRUE tells sampling use prior data training set. Next, visualize train/test split. tk_time_series_cv_plan(): Converts splits object data frame plot_time_series_cv_plan(): Plots time series sampling data using “date” “value” columns.","code":"splits <- bike_transactions_tbl %>% time_series_split(assess = \"3 months\", cumulative = TRUE) splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeling","dir":"Articles > Temp_archive","previous_headings":"","what":"Modeling","title":"Time Series Machine Learning","text":"Machine learning models complex univariate models (e.g. ARIMA, Exponential Smoothing). complexity typically requires workflow (sometimes called pipeline languages). general process goes like : Create Preprocessing Recipe Create Model Specifications Use Workflow combine Model Spec Preprocessing, Fit Model","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"recipe-preprocessing-specification","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Recipe Preprocessing Specification","title":"Time Series Machine Learning","text":"first step add time series signature training set, used learn patterns. New timetk 0.1.3 integration recipes R package: recipes package allows us add preprocessing steps applied sequentially part data transformation pipeline. timetk step_timeseries_signature(), used add number features can help machine learning models. can see happens apply prepared recipe prep() using bake() function. Many new columns added timestamp “date” feature. features can use machine learning models. Next, apply various preprocessing steps improve modeling behavior. wish learn , Advanced Time Series course help learn techniques.","code":"# Add time series signature recipe_spec_timeseries <- recipe(value ~ ., data = training(splits)) %>% step_timeseries_signature(date) bake(prep(recipe_spec_timeseries), new_data = training(splits)) ## # A tibble: 641 × 29 ## date value date_index.num date_year date_year.iso date_half ## ## 1 2011-01-01 985 1293840000 2011 2010 1 ## 2 2011-01-02 801 1293926400 2011 2010 1 ## 3 2011-01-03 1349 1294012800 2011 2011 1 ## 4 2011-01-04 1562 1294099200 2011 2011 1 ## 5 2011-01-05 1600 1294185600 2011 2011 1 ## 6 2011-01-06 1606 1294272000 2011 2011 1 ## 7 2011-01-07 1510 1294358400 2011 2011 1 ## 8 2011-01-08 959 1294444800 2011 2011 1 ## 9 2011-01-09 822 1294531200 2011 2011 1 ## 10 2011-01-10 1321 1294617600 2011 2011 1 ## # ℹ 631 more rows ## # ℹ 23 more variables: date_quarter , date_month , ## # date_month.xts , date_month.lbl , date_day , ## # date_hour , date_minute , date_second , date_hour12 , ## # date_am.pm , date_wday , date_wday.xts , ## # date_wday.lbl , date_mday , date_qday , date_yday , ## # date_mweek , date_week , date_week.iso , date_week2 , … recipe_spec_final <- recipe_spec_timeseries %>% step_fourier(date, period = 365, K = 5) %>% step_rm(date) %>% step_rm(contains(\"iso\"), contains(\"minute\"), contains(\"hour\"), contains(\"am.pm\"), contains(\"xts\")) %>% step_normalize(contains(\"index.num\"), date_year) %>% step_dummy(contains(\"lbl\"), one_hot = TRUE) juice(prep(recipe_spec_final)) ## # A tibble: 641 × 47 ## value date_index.num date_year date_half date_quarter date_month date_day ## ## 1 985 -1.73 -0.869 1 1 1 1 ## 2 801 -1.72 -0.869 1 1 1 2 ## 3 1349 -1.72 -0.869 1 1 1 3 ## 4 1562 -1.71 -0.869 1 1 1 4 ## 5 1600 -1.71 -0.869 1 1 1 5 ## 6 1606 -1.70 -0.869 1 1 1 6 ## 7 1510 -1.70 -0.869 1 1 1 7 ## 8 959 -1.69 -0.869 1 1 1 8 ## 9 822 -1.68 -0.869 1 1 1 9 ## 10 1321 -1.68 -0.869 1 1 1 10 ## # ℹ 631 more rows ## # ℹ 40 more variables: date_second , date_wday , date_mday , ## # date_qday , date_yday , date_mweek , date_week , ## # date_week2 , date_week3 , date_week4 , date_mday7 , ## # date_sin365_K1 , date_cos365_K1 , date_sin365_K2 , ## # date_cos365_K2 , date_sin365_K3 , date_cos365_K3 , ## # date_sin365_K4 , date_cos365_K4 , date_sin365_K5 , …"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"model-specification","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Model Specification","title":"Time Series Machine Learning","text":"Next, let’s create model specification. ’ll use lm.","code":"model_spec_lm <- linear_reg(mode = \"regression\") %>% set_engine(\"lm\")"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"workflow","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Workflow","title":"Time Series Machine Learning","text":"can mary preprocessing recipe model using workflow().","code":"workflow_lm <- workflow() %>% add_recipe(recipe_spec_final) %>% add_model(model_spec_lm) workflow_lm ## ══ Workflow ════════════════════════════════════════════════════════════════════ ## Preprocessor: Recipe ## Model: linear_reg() ## ## ── Preprocessor ──────────────────────────────────────────────────────────────── ## 6 Recipe Steps ## ## • step_timeseries_signature() ## • step_fourier() ## • step_rm() ## • step_rm() ## • step_normalize() ## • step_dummy() ## ## ── Model ─────────────────────────────────────────────────────────────────────── ## Linear Regression Model Specification (regression) ## ## Computational engine: lm"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"training","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Training","title":"Time Series Machine Learning","text":"workflow can trained fit() function.","code":"workflow_fit_lm <- workflow_lm %>% fit(data = training(splits))"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"hyperparameter-tuning","dir":"Articles > Temp_archive","previous_headings":"Modeling","what":"Hyperparameter Tuning","title":"Time Series Machine Learning","text":"Linear regression parameters. Therefore, step needed. complex models hyperparameters require tuning. Algorithms include: Elastic Net XGBoost Random Forest Support Vector Machine (SVM) K-Nearest Neighbors Multivariate Adaptive Regression Spines (MARS) like learn tune models time series, join waitlist advanced Time Series Analysis & Forecasting Course.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecasting-with-modeltime","dir":"Articles > Temp_archive","previous_headings":"","what":"Forecasting with Modeltime","title":"Time Series Machine Learning","text":"Modeltime Workflow designed speed model evaluation selection. Now several time series models, let’s analyze forecast future modeltime package.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"modeltime-table","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Modeltime Table","title":"Time Series Machine Learning","text":"Modeltime Table organizes models IDs creates generic descriptions help us keep track models. Let’s add models modeltime_table().","code":"model_table <- modeltime_table( workflow_fit_lm ) model_table ## # Modeltime Table ## # A tibble: 1 × 3 ## .model_id .model .model_desc ## ## 1 1 LM"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"calibration","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Calibration","title":"Time Series Machine Learning","text":"Model Calibration used quantify error estimate confidence intervals. ’ll perform model calibration --sample data (aka. Testing Set) modeltime_calibrate() function. Two new columns generated (“.type” “.calibration_data”), important “.calibration_data”. includes actual values, fitted values, residuals testing set.","code":"calibration_table <- model_table %>% modeltime_calibrate(testing(splits)) calibration_table ## # Modeltime Table ## # A tibble: 1 × 5 ## .model_id .model .model_desc .type .calibration_data ## ## 1 1 LM Test "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"forecast-testing-set","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime > Calibration","what":"Forecast (Testing Set)","title":"Time Series Machine Learning","text":"calibrated data, can visualize testing predictions (forecast). Use modeltime_forecast() generate forecast data testing set tibble. Use plot_modeltime_forecast() visualize results interactive static plot formats.","code":"calibration_table %>% modeltime_forecast(actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"accuracy-testing-set","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime > Calibration","what":"Accuracy (Testing Set)","title":"Time Series Machine Learning","text":"Next, calculate testing accuracy compare models. Use modeltime_accuracy() generate --sample accuracy metrics tibble. Use table_modeltime_accuracy() generate interactive static","code":"calibration_table %>% modeltime_accuracy() %>% table_modeltime_accuracy(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"refit-and-forecast-forward","dir":"Articles > Temp_archive","previous_headings":"Forecasting with Modeltime","what":"Refit and Forecast Forward","title":"Time Series Machine Learning","text":"Refitting best-practice forecasting future. modeltime_refit(): re-train full data (bike_transactions_tbl) modeltime_forecast(): models depend “date” feature, can use h (horizon) forecast forward. Setting h = \"12 months\" forecasts next 12-months data.","code":"calibration_table %>% modeltime_refit(bike_transactions_tbl) %>% modeltime_forecast(h = \"12 months\", actual_data = bike_transactions_tbl) %>% plot_modeltime_forecast(.interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Summary","title":"Time Series Machine Learning","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Feature Engineering Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"take-the-high-performance-forecasting-course","dir":"Articles > Temp_archive","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Time Series Machine Learning","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"time-series-is-changing","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Time Series Machine Learning","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK03_Forecasting_Using_Time_Series_Signature.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Time Series Machine Learning","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Visualizing Time Series","text":"Run following code setup tutorial.","code":"library(dplyr) library(ggplot2) library(lubridate) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- FALSE"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"plotting-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Plotting Time Series","title":"Visualizing Time Series","text":"Let’s start popular time series, taylor_30_min, includes energy demand megawatts sampling interval 30-minutes. single time series. plot_time_series() function generates interactive plotly chart default. Simply provide date variable (time-based column, .date_var) numeric variable (.value) changes time first 2 arguments .interactive = TRUE, .plotly_slider = TRUE adds date slider bottom chart.","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows taylor_30_min %>% plot_time_series(date, value, .interactive = interactive, .plotly_slider = TRUE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"plotting-groups","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Plotting Groups","title":"Visualizing Time Series","text":"Next, let’s move dataset time series groups, m4_daily, sample 4 time series M4 competition sampled daily frequency. Visualizing grouped data simple grouping data set group_by() prior piping plot_time_series() function. Key points: Groups can added 2 ways: group_by() using ... add groups. Groups converted facets. .facet_ncol = 2 returns 2-column faceted plot .facet_scales = \"free\" allows x y-axis plot scale independently plots","code":"m4_daily %>% group_by(id) #> # A tibble: 9,743 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows m4_daily %>% group_by(id) %>% plot_time_series(date, value, .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"visualizing-transformations-sub-groups","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Visualizing Transformations & Sub-Groups","title":"Visualizing Time Series","text":"Let’s switch hourly dataset multiple groups. can showcase: Log transformation .value Use .color_var highlight sub-groups. intent showcase groups faceted plots, highlight weekly windows (sub-groups) within data simultaneously log() transformation value. simple : .value = log(value) Applies Log Transformation .color_var = week(date) date column transformed lubridate::week() number. color applied week numbers.","code":"m4_hourly %>% group_by(id) #> # A tibble: 3,060 × 3 #> # Groups: id [4] #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows m4_hourly %>% group_by(id) %>% plot_time_series(date, log(value), # Apply a Log Transformation .color_var = week(date), # Color applied to Week transformation # Facet formatting .facet_ncol = 2, .facet_scales = \"free\", .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"static-ggplot2-visualizations-customizations","dir":"Articles > Temp_archive","previous_headings":"Plotting Time Series","what":"Static ggplot2 Visualizations & Customizations","title":"Visualizing Time Series","text":"visualizations can converted interactive plotly (great exploring shiny apps) static ggplot2 visualizations (great reports).","code":"taylor_30_min %>% plot_time_series(date, value, .color_var = month(date, label = TRUE), # Returns static ggplot .interactive = FALSE, # Customization .title = \"Taylor's MegaWatt Data\", .x_lab = \"Date (30-min intervals)\", .y_lab = \"Energy Demand (MW)\", .color_lab = \"Month\") + scale_y_continuous(labels = scales::comma_format())"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"box-plots-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Box Plots (Time Series)","title":"Visualizing Time Series","text":"plot_time_series_boxplot() function can used make box plots. Box plots use aggregation, key parameter defined .period argument.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_boxplot( date, value, .period = \"1 year\", .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"regression-plots-time-series","dir":"Articles > Temp_archive","previous_headings":"","what":"Regression Plots (Time Series)","title":"Visualizing Time Series","text":"time series regression plot, plot_time_series_regression(), can useful quickly assess key features correlated time series. Internally function passes formula stats::lm() function. linear regression summary can output toggling show_summary = TRUE.","code":"m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE, .show_summary = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"summary","dir":"Articles > Temp_archive","previous_headings":"","what":"Summary","title":"Visualizing Time Series","text":"Timetk part amazing Modeltime Ecosystem time series forecasting. can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"take-the-high-performance-forecasting-course","dir":"Articles > Temp_archive","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"Visualizing Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"time-series-is-changing","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"Visualizing Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK04_Plotting_Time_Series.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"Articles > Temp_archive","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"Visualizing Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Plotting Seasonality and Correlation","text":"Run following code set tutorial.","code":"library(dplyr) library(timetk) # Setup for the plotly charts (# FALSE returns ggplots) interactive <- TRUE"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-acf-diagnostics","dir":"Articles > Temp_archive","previous_headings":"Correlation Plots","what":"Grouped ACF Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = interactive )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-ccf-plots","dir":"Articles > Temp_archive","previous_headings":"Correlation Plots","what":"Grouped CCF Plots","title":"Plotting Seasonality and Correlation","text":"","code":"walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = interactive )"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"seasonal-visualizations","dir":"Articles > Temp_archive","previous_headings":"Seasonality","what":"Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"grouped-seasonal-visualizations","dir":"Articles > Temp_archive","previous_headings":"Seasonality","what":"Grouped Seasonal Visualizations","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"stl-diagnostics","dir":"Articles > Temp_archive","previous_headings":"","what":"STL Diagnostics","title":"Plotting Seasonality and Correlation","text":"","code":"m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .frequency = \"auto\", .trend = \"auto\", .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .interactive = interactive)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK05_Plotting_Seasonality_and_Correlation.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Plotting Seasonality and Correlation","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"prerequisites","dir":"Articles > Temp_archive","previous_headings":"","what":"Prerequisites","title":"Frequency and Trend Selection","text":"get started, load following packages.","code":"library(dplyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Frequency and Trend Selection","text":"Daily Irregular Data daily stock prices Facebook 2013 2016. Note trading days occur “business days” (non-weekends non-business-holidays). Sub-Daily Data Taylor’s Energy Demand data 30-minute timestamp interval.","code":"data(FANG) FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_tbl ## # A tibble: 1,008 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 998 more rows taylor_30_min ## # A tibble: 4,032 × 2 ## date value ## ## 1 2000-06-05 00:00:00 22262 ## 2 2000-06-05 00:30:00 21756 ## 3 2000-06-05 01:00:00 22247 ## 4 2000-06-05 01:30:00 22759 ## 5 2000-06-05 02:00:00 22549 ## 6 2000-06-05 02:30:00 22313 ## 7 2000-06-05 03:00:00 22128 ## 8 2000-06-05 03:30:00 21860 ## 9 2000-06-05 04:00:00 21751 ## 10 2000-06-05 04:30:00 21336 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"applications","dir":"Articles > Temp_archive","previous_headings":"","what":"Applications","title":"Frequency and Trend Selection","text":"example automatic frequency detection occurs plot_stl_diagnostics() function.","code":"taylor_30_min %>% plot_stl_diagnostics(date, value, .frequency = \"auto\", .trend = \"auto\", .interactive = FALSE) ## frequency = 48 observations per 1 day ## trend = 672 observations per 14 days"},{"path":[]},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"specifying-a-frequency-or-trend","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Specifying a Frequency or Trend","title":"Frequency and Trend Selection","text":"period argument three basic options returning frequency. Options include: “auto”: target frequency determined using pre-defined Time Scale Template (see ). time-based duration: (e.g. “7 days” “2 quarters” per cycle) numeric number observations: (e.g. 5 5 observations per cycle)","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"frequency","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Frequency","title":"Frequency and Trend Selection","text":"frequency loosely defined number observations comprise cycle data set. Using tk_get_frequency(), can pick number observations roughly define frequency series. Daily Irregular Data FB_tbl irregular (weekends holidays present), frequency selected weekly week 5-days typically. 5 selected. Sub-Daily Data works well sub-daily time series. ’ll use taylor_30_min 30-minute timestamp series. frequency selected 48 48 timestamps (observations) 1 day 30-minute cycle.","code":"FB_tbl %>% tk_index() %>% tk_get_frequency(period = \"auto\") ## frequency = 5 observations per 1 week ## [1] 5 taylor_30_min %>% tk_index() %>% tk_get_frequency(\"1 day\") ## frequency = 48 observations per 1 day ## [1] 48"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"trend","dir":"Articles > Temp_archive","previous_headings":"Automatic Frequency & Trend Selection","what":"Trend","title":"Frequency and Trend Selection","text":"trend loosely defined time span can aggregated across visualize central tendency data. Using tk_get_trend(), can pick number observations help describe trend data. Daily Irregular Data FB_tbl irregular (weekends holidays present), trend selected 3 months week 5-days typically. 64 observations selected. Sub-Daily Data 14-day (2 week) interval selected “30-minute” interval data.","code":"FB_tbl %>% tk_index() %>% tk_get_trend(period = \"auto\") ## trend = 64 observations per 3 months ## [1] 64 taylor_30_min %>% tk_index() %>% tk_get_trend(\"auto\") ## trend = 672 observations per 14 days ## [1] 672"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"time-scale-template","dir":"Articles > Temp_archive","previous_headings":"","what":"Time Scale Template","title":"Frequency and Trend Selection","text":"Time-Scale Template used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Accessing Default Template can access current template get_tk_time_scale_template(). Changing Default Template can modify current template set_tk_time_scale_template().","code":"get_tk_time_scale_template() ## # A tibble: 8 × 3 ## time_scale frequency trend ## ## 1 second 1 hour 12 hours ## 2 minute 1 day 14 days ## 3 hour 1 day 1 month ## 4 day 1 week 3 months ## 5 week 1 quarter 1 year ## 6 month 1 year 5 years ## 7 quarter 1 year 10 years ## 8 year 5 years 30 years"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK06_Automatic_Frequency_And_Trend_Selection.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Frequency and Trend Selection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Time Series Data Wrangling","text":"Load following libraries.","code":"library(dplyr) library(tidyr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Data Wrangling","text":"tutorial use FANG dataset: Daily Irregular (missing business holidays weekends) 4 groups (FB, AMZN, NFLX, GOOG). adjusted column contains adjusted closing prices day. volume column contains trade volume (number times stock transacted) day.","code":"FANG ## # A tibble: 4,032 × 8 ## symbol date open high low close volume adjusted ## ## 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 ## 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 ## 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 ## 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 ## 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 ## 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 ## 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 ## 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 ## 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 ## 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 ## # ℹ 4,022 more rows FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) FANG %>% group_by(symbol) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"summarize-by-time","dir":"Articles > Temp_archive","previous_headings":"","what":"Summarize by Time","title":"Time Series Data Wrangling","text":"summarise_by_time() aggregates period. ’s great : Period Aggregation - sum() Period Smoothing - mean(), first(), last()","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"period-summarization","dir":"Articles > Temp_archive","previous_headings":"Summarize by Time","what":"Period Summarization","title":"Time Series Data Wrangling","text":"Objective: Get total trade volume quarter Use sum() Aggregate using .= \"quarter\"","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"quarter\", volume = sum(volume) ) %>% plot_time_series(date, volume, .facet_ncol = 2, .interactive = FALSE, .y_intercept = 0)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"period-smoothing","dir":"Articles > Temp_archive","previous_headings":"Summarize by Time","what":"Period Smoothing","title":"Time Series Data Wrangling","text":"Objective: Get first value month can use first() get first value, effect reducing data (.e. smoothing). use mean() median(). Use summarization time: .= \"month\" aggregate month.","code":"FANG %>% group_by(symbol) %>% summarise_by_time( date, .by = \"month\", adjusted = first(adjusted) ) %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"filter-by-time","dir":"Articles > Temp_archive","previous_headings":"","what":"Filter By Time","title":"Time Series Data Wrangling","text":"Used quickly filter continuous time range.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"time-range-filtering","dir":"Articles > Temp_archive","previous_headings":"Filter By Time","what":"Time Range Filtering","title":"Time Series Data Wrangling","text":"Objective: Get adjusted stock prices 3rd quarter 2013. .start_date = \"2013-09\": Converts “2013-09-01 .end_date = \"2013\": Converts “2013-12-31 advanced example filtering using %+time %-time shown “Padding Data: Low High Frequency”.","code":"FANG %>% group_by(symbol) %>% filter_by_time(date, \"2013-09\", \"2013\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"padding-data","dir":"Articles > Temp_archive","previous_headings":"","what":"Padding Data","title":"Time Series Data Wrangling","text":"Used fill (pad) gaps go low frequency high frequency. function uses awesome padr library filling expanding timestamps.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"fill-in-gaps","dir":"Articles > Temp_archive","previous_headings":"Padding Data","what":"Fill in Gaps","title":"Time Series Data Wrangling","text":"Objective: Make irregular series regular. leave padded values NA. can add value using .pad_value can impute using function like ts_impute_vec() (shown next).","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"auto\") # Guesses .by = \"day\" ## pad applied on the interval: day ## # A tibble: 5,836 × 8 ## # Groups: symbol [4] ## symbol date open high low close volume adjusted ## ## 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. ## 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. ## 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. ## 4 AMZN 2013-01-05 NA NA NA NA NA NA ## 5 AMZN 2013-01-06 NA NA NA NA NA NA ## 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. ## 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. ## 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. ## 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. ## 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. ## # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"low-to-high-frequency","dir":"Articles > Temp_archive","previous_headings":"Padding Data","what":"Low to High Frequency","title":"Time Series Data Wrangling","text":"Objective: Go Daily Hourly timestamp intervals 1 month start date. Impute missing values. .= \"hour\" pads daily hourly Imputation hourly data accomplished ts_impute_vec(), performs linear interpolation period = 1. “start”: special keyword signals start series FIRST(date) %+time% \"1 month\": Selecting first date sequence using special infix operation, %+time%, called “add time”. case add “1 month”.","code":"FANG %>% group_by(symbol) %>% pad_by_time(date, .by = \"hour\") %>% mutate_at(vars(open:adjusted), .funs = ts_impute_vec, period = 1) %>% filter_by_time(date, \"start\", first(date) %+time% \"1 month\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"sliding-rolling-calculations","dir":"Articles > Temp_archive","previous_headings":"","what":"Sliding (Rolling) Calculations","title":"Time Series Data Wrangling","text":"new function, slidify() turns function sliding (rolling) window function. takes concepts tibbletime::rollify() improves R package slider.","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"rolling-mean","dir":"Articles > Temp_archive","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Mean","title":"Time Series Data Wrangling","text":"Objective: Calculate “centered” simple rolling average partial window rolling start end windows. slidify() turns mean() function rolling average. simple rolling calculations (rolling average), can accomplish operation faster slidify_vec() - vectorized rolling function simple summary rolls (e.g. mean(), sd(), sum(), etc)","code":"# Make the rolling function roll_avg_30 <- slidify(.f = mean, .period = 30, .align = \"center\", .partial = TRUE) # Apply the rolling function FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply Sliding Function mutate(rolling_avg_30 = roll_avg_30(adjusted)) %>% pivot_longer(cols = c(adjusted, rolling_avg_30)) %>% plot_time_series(date, value, .color_var = name, .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE) FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% # Apply roll apply Function mutate(rolling_avg_30 = slidify_vec(adjusted, ~ mean(.), .period = 30, .partial = TRUE)) ## # A tibble: 4,032 × 4 ## # Groups: symbol [4] ## symbol date adjusted rolling_avg_30 ## ## 1 FB 2013-01-02 28 30.0 ## 2 FB 2013-01-03 27.8 30.1 ## 3 FB 2013-01-04 28.8 30.2 ## 4 FB 2013-01-07 29.4 30.2 ## 5 FB 2013-01-08 29.1 30.3 ## 6 FB 2013-01-09 30.6 30.3 ## 7 FB 2013-01-10 31.3 30.3 ## 8 FB 2013-01-11 31.7 30.2 ## 9 FB 2013-01-14 31.0 30.1 ## 10 FB 2013-01-15 30.1 30.1 ## # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"rolling-regression","dir":"Articles > Temp_archive","previous_headings":"Sliding (Rolling) Calculations","what":"Rolling Regression","title":"Time Series Data Wrangling","text":"Objective: Calculate rolling regression. complex sliding (rolling) calculation requires multiple columns involved. slidify() built . Use multi-variable purrr ..1, ..2, ..3, etc notation setup function","code":"# Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~ lm(..1 ~ ..2 + ..3), .period = 90, .unlist = FALSE, .align = \"right\") FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% mutate(numeric_date = as.numeric(date)) %>% # Apply rolling regression mutate(rolling_lm = lm_roll(adjusted, volume, numeric_date)) %>% filter(!is.na(rolling_lm)) ## # A tibble: 3,676 × 6 ## # Groups: symbol [4] ## symbol date adjusted volume numeric_date rolling_lm ## ## 1 FB 2013-05-10 26.7 30847100 15835 ## 2 FB 2013-05-13 26.8 29068800 15838 ## 3 FB 2013-05-14 27.1 24930300 15839 ## 4 FB 2013-05-15 26.6 30299800 15840 ## 5 FB 2013-05-16 26.1 35499100 15841 ## 6 FB 2013-05-17 26.2 29462700 15842 ## 7 FB 2013-05-20 25.8 42402900 15845 ## 8 FB 2013-05-21 25.7 26261300 15846 ## 9 FB 2013-05-22 25.2 45314500 15847 ## 10 FB 2013-05-23 25.1 37663100 15848 ## # ℹ 3,666 more rows"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK07_Time_Series_Data_Wrangling.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Data Wrangling","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Anomaly Detection","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"anomaly-visualization","dir":"Articles > Temp_archive","previous_headings":"","what":"Anomaly Visualization","title":"Anomaly Detection","text":"Using plot_anomaly_diagnostics() function, can interactively detect anomalies scale.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .facet_ncol = 2)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"automatic-anomaly-detection","dir":"Articles > Temp_archive","previous_headings":"","what":"Automatic Anomaly Detection","title":"Anomaly Detection","text":"get data anomalies, use tk_anomaly_diagnostics(), preprocessing function.","code":"walmart_sales_weekly %>% group_by(Store, Dept) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) ## # A tibble: 1,001 × 13 ## # Groups: Store, Dept [7] ## Store Dept Date observed season trend remainder seasadj remainder_l1 ## ## 1 1 1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. ## 2 1 1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. ## 3 1 1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. ## 4 1 1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. ## 5 1 1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. ## 6 1 1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. ## 7 1 1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. ## 8 1 1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. ## 9 1 1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. ## 10 1 1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. ## # ℹ 991 more rows ## # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , ## # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK08_Automatic_Anomaly_Detection.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Anomaly Detection","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"libraries","dir":"Articles > Temp_archive","previous_headings":"","what":"Libraries","title":"Time Series Clustering","text":"get started, load following libraries.","code":"library(dplyr) library(purrr) library(timetk)"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"data","dir":"Articles > Temp_archive","previous_headings":"","what":"Data","title":"Time Series Clustering","text":"tutorial use walmart_sales_weekly dataset: Weekly Sales spikes various events","code":"walmart_sales_weekly ## # A tibble: 1,001 × 17 ## id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature ## ## 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 ## 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 ## 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 ## 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 ## 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 ## 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 ## 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 ## 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 ## 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 ## 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 ## # ℹ 991 more rows ## # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , ## # MarkDown3 , MarkDown4 , MarkDown5 , CPI , ## # Unemployment "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"ts-features","dir":"Articles > Temp_archive","previous_headings":"","what":"TS Features","title":"Time Series Clustering","text":"Using tk_tsfeatures() function, can quickly get “tsfeatures” time series. important points: features parameter come tsfeatures R package. Use one function names tsfeatures R package e.g.(“lumpiness”, “stl_features”). can supply function returns aggregation (e.g. “mean” apply base::mean() function). can supply custom functions creating function providing (e.g. my_mean() defined )","code":"# Custom Function my_mean <- function(x, na.rm=TRUE) { mean(x, na.rm = na.rm) } tsfeature_tbl <- walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"my_mean\"), .scale = TRUE, .prefix = \"ts_\" ) %>% ungroup() tsfeature_tbl ## # A tibble: 7 × 22 ## id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 1_1 52 1 52 0.000670 0.0000280 ## 2 1_3 52 1 52 0.0614 0.00000987 ## 3 1_8 52 1 52 0.756 0.00000195 ## 4 1_13 52 1 52 0.354 0.00000475 ## 5 1_38 52 1 52 0.425 0.0000179 ## 6 1_93 52 1 52 0.791 0.000000754 ## 7 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"clustering-with-k-means","dir":"Articles > Temp_archive","previous_headings":"","what":"Clustering with K-Means","title":"Time Series Clustering","text":"can quickly add cluster assignments kmeans() function tidyverse data wrangling.","code":"set.seed(123) cluster_tbl <- tibble( cluster = tsfeature_tbl %>% select(-id) %>% as.matrix() %>% kmeans(centers = 3, nstart = 100) %>% pluck(\"cluster\") ) %>% bind_cols( tsfeature_tbl ) cluster_tbl ## # A tibble: 7 × 23 ## cluster id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike ## ## 1 2 1_1 52 1 52 0.000670 0.0000280 ## 2 2 1_3 52 1 52 0.0614 0.00000987 ## 3 2 1_8 52 1 52 0.756 0.00000195 ## 4 1 1_13 52 1 52 0.354 0.00000475 ## 5 3 1_38 52 1 52 0.425 0.0000179 ## 6 3 1_93 52 1 52 0.791 0.000000754 ## 7 1 1_95 52 1 52 0.639 0.000000567 ## # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , ## # ts_e_acf10 , ts_seasonal_strength , ts_peak , ## # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , ## # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , ## # ts_diff2_acf10 , ts_seas_acf1 , ts_my_mean "},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"visualize-the-cluster-assignments","dir":"Articles > Temp_archive","previous_headings":"","what":"Visualize the Cluster Assignments","title":"Time Series Clustering","text":"Finally, can visualize cluster assignments joining cluster_tbl original walmart_sales_weekly plotting plot_time_series().","code":"cluster_tbl %>% select(cluster, id) %>% right_join(walmart_sales_weekly, by = \"id\") %>% group_by(id) %>% plot_time_series( Date, Weekly_Sales, .color_var = cluster, .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/articles/temp_archive/TK09_Clustering.html","id":"learning-more","dir":"Articles > Temp_archive","previous_headings":"","what":"Learning More","title":"Time Series Clustering","text":"Talk High-Performance Time Series Forecasting Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies MILLIONS dollars. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System). teach build HPTFS System High-Performance Time Series Forecasting Course. interested learning Scalable High-Performance Forecasting Strategies take course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) NEW - Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Unlock High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Matt Dancho. Author, maintainer. Davis Vaughan. Author.","code":""},{"path":"https://business-science.github.io/timetk/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Dancho M, Vaughan D (2023). timetk: Tool Kit Working Time Series. https://github.com/business-science/timetk, https://business-science.github.io/timetk/.","code":"@Manual{, title = {timetk: A Tool Kit for Working with Time Series}, author = {Matt Dancho and Davis Vaughan}, year = {2023}, note = {https://github.com/business-science/timetk, https://business-science.github.io/timetk/}, }"},{"path":"https://business-science.github.io/timetk/index.html","id":"timetk","dir":"","previous_headings":"","what":"A Tool Kit for Working with Time Series","title":"A Tool Kit for Working with Time Series","text":"Time series analysis tidyverse","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"A Tool Kit for Working with Time Series","text":"Download development version latest features: , download CRAN approved version:","code":"remotes::install_github(\"business-science/timetk\") install.packages(\"timetk\")"},{"path":"https://business-science.github.io/timetk/index.html","id":"package-functionality","dir":"","previous_headings":"","what":"Package Functionality","title":"A Tool Kit for Working with Time Series","text":"many R packages working Time Series data. ’s timetk compares “tidy” time series R packages data visualization, wrangling, feature engineeering (leverage data frames tibbles).","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"getting-started","dir":"","previous_headings":"","what":"Getting Started","title":"A Tool Kit for Working with Time Series","text":"Visualizing Time Series Wrangling Time Series Full Time Series Machine Learning Feature Engineering Tutorial API Documentation articles complete list function references.","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"summary","dir":"","previous_headings":"","what":"Summary","title":"A Tool Kit for Working with Time Series","text":"Timetk amazing package part modeltime ecosystem time series analysis forecasting. forecasting system extensive, can take long time learn: Many algorithms Ensembling Resampling Machine Learning Deep Learning Scalable Modeling: 10,000+ time series probably thinking ever going learn time series forecasting. ’s solution save years struggling.","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"take-the-high-performance-forecasting-course","dir":"","previous_headings":"","what":"Take the High-Performance Forecasting Course","title":"A Tool Kit for Working with Time Series","text":"Become forecasting expert organization High-Performance Time Series Course","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"time-series-is-changing","dir":"","previous_headings":"Take the High-Performance Forecasting Course","what":"Time Series is Changing","title":"A Tool Kit for Working with Time Series","text":"Time series changing. Businesses now need 10,000+ time series forecasts every day. call High-Performance Time Series Forecasting System (HPTSF) - Accurate, Robust, Scalable Forecasting. High-Performance Forecasting Systems save companies improving accuracy scalability. Imagine happen career can provide organization “High-Performance Time Series Forecasting System” (HPTSF System).","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"how-to-learn-high-performance-time-series-forecasting","dir":"","previous_headings":"Take the High-Performance Forecasting Course","what":"How to Learn High-Performance Time Series Forecasting","title":"A Tool Kit for Working with Time Series","text":"teach build HPTFS System High-Performance Time Series Forecasting Course. learn: Time Series Machine Learning (cutting-edge) Modeltime - 30+ Models (Prophet, ARIMA, XGBoost, Random Forest, & many ) Deep Learning GluonTS (Competition Winners) Time Series Preprocessing, Noise Reduction, & Anomaly Detection Feature engineering using lagged variables & external regressors Hyperparameter Tuning Time series cross-validation Ensembling Multiple Machine Learning & Univariate Modeling Techniques (Competition Winner) Scalable Forecasting - Forecast 1000+ time series parallel . Become Time Series Expert organization. Take High-Performance Time Series Forecasting Course","code":""},{"path":"https://business-science.github.io/timetk/index.html","id":"acknowledgements","dir":"","previous_headings":"","what":"Acknowledgements","title":"A Tool Kit for Working with Time Series","text":"timetk package wouldn’t possible without amazing time series packages. plot_acf_diagnostics(): Leverages stats::acf(), stats::pacf() & stats::ccf() plot_stl_diagnostics(): Leverages stats::stl() Add Subtract Time (%+time% & %-time%): \"2012-01-01\" %+time% \"1 month 4 days\" uses lubridate intelligently offset day xts: Used calculate periodicity fast lag automation. ts_impute_vec() function low-level vectorized imputation using STL + Linear Interpolation uses na.interp() hood. ts_clean_vec() function low-level vectorized imputation using STL + Linear Interpolation uses tsclean() hood. Box Cox transformation auto_lambda() uses BoxCox.Lambda(). tk_make_timeseries() - Extends seq.Date() seq.POSIXt() using simple phase like “2012-02” populate entire time series start finish February 2012. filter_by_time(), between_time() - Uses innovative endpoint detection phrases like “2012” slidify() basically rollify() using slider (see ). slidify() uses slider::pslide hood. slidify_vec() uses slider::slide_vec() simple vectorized rolls (slides). pad_by_time() function wrapper padr::pad(). See step_ts_pad() apply padding preprocessing recipe! TSstudio: best interactive time series visualization tool . leverages ts system, system forecast R package uses. ton inspiration visuals came using TSstudio.","code":""},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":null,"dir":"Reference","previous_headings":"","what":"Stock prices for the ","title":"Stock prices for the ","text":"dataset containing daily historical stock prices \"FANG\" tech stocks, \"FB\", \"AMZN\", \"NFLX\", \"GOOG\", spanning beginning 2013 end 2016.","code":""},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Stock prices for the ","text":"","code":"FANG"},{"path":"https://business-science.github.io/timetk/reference/FANG.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Stock prices for the ","text":"\"tibble\" (\"tidy\" data frame) 4,032 rows 8 variables: symbol stock ticker symbol date trade date open stock price open trading, USD high stock price highest point trading, USD low stock price lowest point trading, USD close stock price close trading, USD volume number shares traded adjusted stock price close trading adjusted stock splits, USD","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Between (For Time Series): Range detection for date or date-time sequences — between_time","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"easiest way filter time series date date-time vectors. Returns logical vector indicating date date-time values within range. See filter_by_time() data.frame (tibble) implementation.","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"","code":"between_time(index, start_date = \"start\", end_date = \"end\")"},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"index date date-time vector. start_date starting date end_date ending date","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"logical vector length index indicating whether timestamp value within start_date end_date range.","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"Pure Time Series Filtering Flexibilty start_date end_date parameters designed flexibility mind. side time_formula specified character 'YYYY-MM-DD HH:MM:SS', powerful shorthand available. examples : Year: start_date = '2013', end_date = '2015' Month: start_date = '2013-01', end_date = '2016-06' Day: start_date = '2013-01-05', end_date = '2016-06-04' Second: start_date = '2013-01-05 10:22:15', end_date = '2018-06-03 12:14:22' Variations: start_date = '2013', end_date = '2016-06' Key Words: \"start\" \"end\" Use keywords \"start\" \"end\" shorthand, instead specifying actual start end values. examples: Start series end 2015: start_date = 'start', end_date = '2015' Start 2014 end series: start_date = '2014', end_date = 'end' Internal Calculations shorthand dates expanded: start_date expanded first date period end_date side expanded last date period means following examples equivalent (assuming index POSIXct): start_date = '2015' equivalent start_date = '2015-01-01 + 00:00:00' end_date = '2016' equivalent 2016-12-31 + 23:59:59'","code":""},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"function based tibbletime::filter_time() function developed Davis Vaughan.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/between_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Between (For Time Series): Range detection for date or date-time sequences — between_time","text":"","code":"library(dplyr) #> #> Attaching package: ‘dplyr’ #> The following objects are masked from ‘package:stats’: #> #> filter, lag #> The following objects are masked from ‘package:base’: #> #> intersect, setdiff, setequal, union library(timetk) index_daily <- tk_make_timeseries(\"2016-01-01\", \"2017-01-01\", by = \"day\") index_min <- tk_make_timeseries(\"2016-01-01\", \"2017-01-01\", by = \"min\") # How it works # - Returns TRUE/FALSE length of index # - Use sum() to tally the number of TRUE values index_daily %>% between_time(\"start\", \"2016-01\") %>% sum() #> [1] 31 # ---- INDEX SLICING ---- # Daily Series: Month of January 2016 index_daily[index_daily %>% between_time(\"start\", \"2016-01\")] #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" #> [6] \"2016-01-06\" \"2016-01-07\" \"2016-01-08\" \"2016-01-09\" \"2016-01-10\" #> [11] \"2016-01-11\" \"2016-01-12\" \"2016-01-13\" \"2016-01-14\" \"2016-01-15\" #> [16] \"2016-01-16\" \"2016-01-17\" \"2016-01-18\" \"2016-01-19\" \"2016-01-20\" #> [21] \"2016-01-21\" \"2016-01-22\" \"2016-01-23\" \"2016-01-24\" \"2016-01-25\" #> [26] \"2016-01-26\" \"2016-01-27\" \"2016-01-28\" \"2016-01-29\" \"2016-01-30\" #> [31] \"2016-01-31\" # Daily Series: March 1st - June 15th, 2016 index_daily[index_daily %>% between_time(\"2016-03\", \"2016-06-15\")] #> [1] \"2016-03-01\" \"2016-03-02\" \"2016-03-03\" \"2016-03-04\" \"2016-03-05\" #> [6] \"2016-03-06\" \"2016-03-07\" \"2016-03-08\" \"2016-03-09\" \"2016-03-10\" #> [11] \"2016-03-11\" \"2016-03-12\" \"2016-03-13\" \"2016-03-14\" \"2016-03-15\" #> [16] \"2016-03-16\" \"2016-03-17\" \"2016-03-18\" \"2016-03-19\" \"2016-03-20\" #> [21] \"2016-03-21\" \"2016-03-22\" \"2016-03-23\" \"2016-03-24\" \"2016-03-25\" #> [26] \"2016-03-26\" \"2016-03-27\" \"2016-03-28\" \"2016-03-29\" \"2016-03-30\" #> [31] \"2016-03-31\" \"2016-04-01\" \"2016-04-02\" \"2016-04-03\" \"2016-04-04\" #> [36] \"2016-04-05\" \"2016-04-06\" \"2016-04-07\" \"2016-04-08\" \"2016-04-09\" #> [41] \"2016-04-10\" \"2016-04-11\" \"2016-04-12\" \"2016-04-13\" \"2016-04-14\" #> [46] \"2016-04-15\" \"2016-04-16\" \"2016-04-17\" \"2016-04-18\" \"2016-04-19\" #> [51] \"2016-04-20\" \"2016-04-21\" \"2016-04-22\" \"2016-04-23\" \"2016-04-24\" #> [56] \"2016-04-25\" \"2016-04-26\" \"2016-04-27\" \"2016-04-28\" \"2016-04-29\" #> [61] \"2016-04-30\" \"2016-05-01\" \"2016-05-02\" \"2016-05-03\" \"2016-05-04\" #> [66] \"2016-05-05\" \"2016-05-06\" \"2016-05-07\" \"2016-05-08\" \"2016-05-09\" #> [71] \"2016-05-10\" \"2016-05-11\" \"2016-05-12\" \"2016-05-13\" \"2016-05-14\" #> [76] \"2016-05-15\" \"2016-05-16\" \"2016-05-17\" \"2016-05-18\" \"2016-05-19\" #> [81] \"2016-05-20\" \"2016-05-21\" \"2016-05-22\" \"2016-05-23\" \"2016-05-24\" #> [86] \"2016-05-25\" \"2016-05-26\" \"2016-05-27\" \"2016-05-28\" \"2016-05-29\" #> [91] \"2016-05-30\" \"2016-05-31\" \"2016-06-01\" \"2016-06-02\" \"2016-06-03\" #> [96] \"2016-06-04\" \"2016-06-05\" \"2016-06-06\" \"2016-06-07\" \"2016-06-08\" #> [101] \"2016-06-09\" \"2016-06-10\" \"2016-06-11\" \"2016-06-12\" \"2016-06-13\" #> [106] \"2016-06-14\" \"2016-06-15\" # Minute Series: index_min[index_min %>% between_time(\"2016-02-01 12:00\", \"2016-02-01 13:00\")] #> [1] \"2016-02-01 12:00:00 UTC\" \"2016-02-01 12:01:00 UTC\" #> [3] \"2016-02-01 12:02:00 UTC\" \"2016-02-01 12:03:00 UTC\" #> [5] \"2016-02-01 12:04:00 UTC\" \"2016-02-01 12:05:00 UTC\" #> [7] \"2016-02-01 12:06:00 UTC\" \"2016-02-01 12:07:00 UTC\" #> [9] \"2016-02-01 12:08:00 UTC\" \"2016-02-01 12:09:00 UTC\" #> [11] \"2016-02-01 12:10:00 UTC\" \"2016-02-01 12:11:00 UTC\" #> [13] \"2016-02-01 12:12:00 UTC\" \"2016-02-01 12:13:00 UTC\" #> [15] \"2016-02-01 12:14:00 UTC\" \"2016-02-01 12:15:00 UTC\" #> [17] \"2016-02-01 12:16:00 UTC\" \"2016-02-01 12:17:00 UTC\" #> [19] \"2016-02-01 12:18:00 UTC\" \"2016-02-01 12:19:00 UTC\" #> [21] \"2016-02-01 12:20:00 UTC\" \"2016-02-01 12:21:00 UTC\" #> [23] \"2016-02-01 12:22:00 UTC\" \"2016-02-01 12:23:00 UTC\" #> [25] \"2016-02-01 12:24:00 UTC\" \"2016-02-01 12:25:00 UTC\" #> [27] \"2016-02-01 12:26:00 UTC\" \"2016-02-01 12:27:00 UTC\" #> [29] \"2016-02-01 12:28:00 UTC\" \"2016-02-01 12:29:00 UTC\" #> [31] \"2016-02-01 12:30:00 UTC\" \"2016-02-01 12:31:00 UTC\" #> [33] \"2016-02-01 12:32:00 UTC\" \"2016-02-01 12:33:00 UTC\" #> [35] \"2016-02-01 12:34:00 UTC\" \"2016-02-01 12:35:00 UTC\" #> [37] \"2016-02-01 12:36:00 UTC\" \"2016-02-01 12:37:00 UTC\" #> [39] \"2016-02-01 12:38:00 UTC\" \"2016-02-01 12:39:00 UTC\" #> [41] \"2016-02-01 12:40:00 UTC\" \"2016-02-01 12:41:00 UTC\" #> [43] \"2016-02-01 12:42:00 UTC\" \"2016-02-01 12:43:00 UTC\" #> [45] \"2016-02-01 12:44:00 UTC\" \"2016-02-01 12:45:00 UTC\" #> [47] \"2016-02-01 12:46:00 UTC\" \"2016-02-01 12:47:00 UTC\" #> [49] \"2016-02-01 12:48:00 UTC\" \"2016-02-01 12:49:00 UTC\" #> [51] \"2016-02-01 12:50:00 UTC\" \"2016-02-01 12:51:00 UTC\" #> [53] \"2016-02-01 12:52:00 UTC\" \"2016-02-01 12:53:00 UTC\" #> [55] \"2016-02-01 12:54:00 UTC\" \"2016-02-01 12:55:00 UTC\" #> [57] \"2016-02-01 12:56:00 UTC\" \"2016-02-01 12:57:00 UTC\" #> [59] \"2016-02-01 12:58:00 UTC\" \"2016-02-01 12:59:00 UTC\" #> [61] \"2016-02-01 13:00:00 UTC\" # ---- FILTERING WITH DPLYR ---- FANG %>% group_by(symbol) %>% filter(date %>% between_time(\"2016-01\", \"2016-01\")) #> # A tibble: 76 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 FB 2016-01-04 102. 102. 99.8 102. 37912400 102. #> 2 FB 2016-01-05 103. 104. 102. 103. 23258200 103. #> 3 FB 2016-01-06 101. 104. 101. 103. 25096200 103. #> 4 FB 2016-01-07 100. 101. 97.3 97.9 45172900 97.9 #> 5 FB 2016-01-08 99.9 100. 97.0 97.3 35402300 97.3 #> 6 FB 2016-01-11 97.9 98.6 95.4 97.5 29932400 97.5 #> 7 FB 2016-01-12 99 100. 97.6 99.4 28395400 99.4 #> 8 FB 2016-01-13 101. 101. 95.2 95.4 33410600 95.4 #> 9 FB 2016-01-14 95.8 98.9 92.4 98.4 48658600 98.4 #> 10 FB 2016-01-15 94.0 96.4 93.5 95.0 45935600 95.0 #> # ℹ 66 more rows"},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Daily Bike Sharing Data — bike_sharing_daily","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"dataset contains daily count rental bike transactions years 2011 2012 Capital bikeshare system corresponding weather seasonal information.","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"","code":"bike_sharing_daily"},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"tibble: 731 x 16 instant: record index dteday : date season : season (1:winter, 2:spring, 3:summer, 4:fall) yr : year (0: 2011, 1:2012) mnth : month ( 1 12) hr : hour (0 23) holiday : weather day holiday weekday : day week workingday : day neither weekend holiday 1, otherwise 0. weathersit : 1: Clear, clouds, Partly cloudy, Partly cloudy 2: Mist + Cloudy, Mist + Broken clouds, Mist + clouds, Mist 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog temp : Normalized temperature Celsius. values derived via (t-t_min)/(t_max-t_min), t_min=-8, t_max=+39 (hourly scale) atemp: Normalized feeling temperature Celsius. values derived via (t-t_min)/(t_max-t_min), t_min=-16, t_max=+50 (hourly scale) hum: Normalized humidity. values divided 100 (max) windspeed: Normalized wind speed. values divided 67 (max) casual: count casual users registered: count registered users cnt: count total rental bikes including casual registered","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"Fanaee-T, Hadi, Gama, Joao, 'Event labeling combining ensemble detectors background knowledge', Progress Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg.","code":""},{"path":"https://business-science.github.io/timetk/reference/bike_sharing_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Daily Bike Sharing Data — bike_sharing_daily","text":"","code":"bike_sharing_daily #> # A tibble: 731 × 16 #> instant dteday season yr mnth holiday weekday workingday weathersit #> #> 1 1 2011-01-01 1 0 1 0 6 0 2 #> 2 2 2011-01-02 1 0 1 0 0 0 2 #> 3 3 2011-01-03 1 0 1 0 1 1 1 #> 4 4 2011-01-04 1 0 1 0 2 1 1 #> 5 5 2011-01-05 1 0 1 0 3 1 1 #> 6 6 2011-01-06 1 0 1 0 4 1 1 #> 7 7 2011-01-07 1 0 1 0 5 1 2 #> 8 8 2011-01-08 1 0 1 0 6 0 2 #> 9 9 2011-01-09 1 0 1 0 0 0 1 #> 10 10 2011-01-10 1 0 1 0 1 1 1 #> # ℹ 721 more rows #> # ℹ 7 more variables: temp , atemp , hum , windspeed , #> # casual , registered , cnt "},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Box Cox Transformation — box_cox_vec","title":"Box Cox Transformation — box_cox_vec","text":"mainly wrapper BoxCox transformation forecast R package. box_cox_vec() function performs transformation. box_cox_inv_vec() inverts transformation. auto_lambda() helps selecting optimal lambda value.","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Box Cox Transformation — box_cox_vec","text":"","code":"box_cox_vec(x, lambda = \"auto\", silent = FALSE) box_cox_inv_vec(x, lambda) auto_lambda( x, method = c(\"guerrero\", \"loglik\"), lambda_lower = -1, lambda_upper = 2 )"},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Box Cox Transformation — box_cox_vec","text":"x numeric vector. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection using auto_lambda(). silent Whether report automated lambda selection message. method method used automatic lambda selection. Either \"guerrero\" \"loglik\". lambda_lower lower limit automatic lambda selection lambda_upper upper limit automatic lambda selection","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Box Cox Transformation — box_cox_vec","text":"Returns numeric vector transformed.","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Box Cox Transformation — box_cox_vec","text":"Box Cox transformation power transformation commonly used reduce variance time series. Automatic Lambda Selection desired, lambda argument can selected using auto_lambda(), wrapper Forecast R Package's forecast::BoxCox.lambda() function. Use either 2 methods: \"guerrero\" - Minimizes non-seasonal variance \"loglik\" - Maximizes log-likelihood linear model fit x","code":""},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Box Cox Transformation — box_cox_vec","text":"Forecast R Package Forecasting: Principles & Practices: Transformations & Adjustments Guerrero, V.M. (1993) Time-series analysis supported power transformations. Journal Forecasting, 12, 37--48.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/box_cox_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Box Cox Transformation — box_cox_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_bc <- box_cox_vec(d10_daily$value) #> Registered S3 method overwritten by 'quantmod': #> method from #> as.zoo.data.frame zoo #> box_cox_vec(): Using value for lambda: 1.25119350454964 value <- box_cox_inv_vec(value_bc, lambda = 1.25119350454964) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_bc = box_cox_vec(value)) #> box_cox_vec(): Using value for lambda: 1.25119350454964 #> box_cox_vec(): Using value for lambda: 0.0882021886505848 #> box_cox_vec(): Using value for lambda: 1.99992424816297 #> box_cox_vec(): Using value for lambda: 0.401716085353735 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_bc #> #> 1 D10 2014-07-03 2076. 11303. #> 2 D10 2014-07-04 2073. 11284. #> 3 D10 2014-07-05 2049. 11116. #> 4 D10 2014-07-06 2049. 11117. #> 5 D10 2014-07-07 2006. 10829. #> 6 D10 2014-07-08 2018. 10905. #> 7 D10 2014-07-09 2019. 10915. #> 8 D10 2014-07-10 2007. 10836. #> 9 D10 2014-07-11 2010 10854. #> 10 D10 2014-07-12 2002. 10796. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"Convert data.frame object daily monthly, minute data hourly, . allows user easily aggregate data less granular level taking value either beginning end period.","code":""},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"","code":"condense_period(.data, .date_var, .period = \"1 day\", .side = c(\"start\", \"end\"))"},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":".data tbl object data.frame .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period condense time series . Time units condensed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\" .side One \"start\" \"end\". Determines first observation period returned last.","code":""},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/condense_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert the Period to a Lower Periodicity (e.g. Go from Daily to Monthly) — condense_period","text":"","code":"# Libraries library(timetk) library(dplyr) # First value in each month m4_daily %>% group_by(id) %>% condense_period(.period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # Last value in each month m4_daily %>% group_by(id) %>% condense_period(.period = \"1 month\", .side = \"end\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows"},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Differencing Transformation — diff_vec","title":"Differencing Transformation — diff_vec","text":"diff_vec() applies Differencing Transformation. diff_inv_vec() inverts differencing transformation.","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Differencing Transformation — diff_vec","text":"","code":"diff_vec( x, lag = 1, difference = 1, log = FALSE, initial_values = NULL, silent = FALSE ) diff_inv_vec(x, lag = 1, difference = 1, log = FALSE, initial_values = NULL)"},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Differencing Transformation — diff_vec","text":"x numeric vector differenced inverted. lag lag (far back) included differencing calculation. difference number differences perform. 1 Difference equivalent measuring period change. 2 Differences equivalent measuring period acceleration. log log differences calculated. Note difference inversion log-difference approximate. initial_values used diff_vec_inv() operation. numeric vector initial values, used invert differences. vector original values length NA missing differences. silent Whether report initial values used invert difference message.","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Differencing Transformation — diff_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Differencing Transformation — diff_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. Difference Calculation Single differencing, diff_vec(x_t) equivalent : x_t - x_t1, subscript _t1 indicates first lag. transformation can interpereted change. Double Differencing Calculation Double differencing, diff_vec(x_t, difference = 2) equivalent : (x_t - x_t1) - (x_t - x_t1)_t1, subscript _t1 indicates first lag. transformation can interpereted acceleration. Log Difference Calculation Log differencing, diff_vec(x_t, log = TRUE) equivalent : log(x_t) - log(x_t1) = log(x_t / x_t1), x_t series x_t1 first lag. 1st difference diff_vec(difference = 1, log = TRUE) interesting property diff_vec(difference = 1, log = TRUE) %>% exp() approximately 1 + rate change.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/diff_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Differencing Transformation — diff_vec","text":"","code":"library(dplyr) library(timetk) # --- USAGE ---- diff_vec(1:10, lag = 2, difference = 2) %>% diff_inv_vec(lag = 2, difference = 2, initial_values = 1:4) #> diff_vec(): Initial values: 1, 2, 3, 4 #> [1] 1 2 3 4 5 6 7 8 9 10 # --- VECTOR ---- # Get Change 1:10 %>% diff_vec() #> diff_vec(): Initial values: 1 #> [1] NA 1 1 1 1 1 1 1 1 1 # Get Acceleration 1:10 %>% diff_vec(difference = 2) #> diff_vec(): Initial values: 1, 2 #> [1] NA NA 0 0 0 0 0 0 0 0 # Get approximate rate of change 1:10 %>% diff_vec(log = TRUE) %>% exp() - 1 #> diff_vec(): Initial values: 1 #> [1] NA 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667 #> [8] 0.1428571 0.1250000 0.1111111 # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(difference = diff_vec(value, lag = 1)) %>% mutate( difference_inv = diff_inv_vec( difference, lag = 1, # Add initial value to calculate the inverse difference initial_values = value[1] ) ) #> diff_vec(): Initial values: 2076.2 #> diff_vec(): Initial values: 1821.9 #> diff_vec(): Initial values: 9109.38 #> diff_vec(): Initial values: 5647.3 #> # A tibble: 9,743 × 5 #> # Groups: id [4] #> id date value difference difference_inv #> #> 1 D10 2014-07-03 2076. NA 2076. #> 2 D10 2014-07-04 2073. -2.80 2073. #> 3 D10 2014-07-05 2049. -24.7 2049. #> 4 D10 2014-07-06 2049. 0.200 2049. #> 5 D10 2014-07-07 2006. -42.5 2006. #> 6 D10 2014-07-08 2018. 11.2 2018. #> 7 D10 2014-07-09 2019. 1.5 2019. #> 8 D10 2014-07-10 2007. -11.7 2007. #> 9 D10 2014-07-11 2010 2.60 2010 #> 10 D10 2014-07-12 2002. -8.5 2002. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Filter (for Time-Series Data) — filter_by_time","title":"Filter (for Time-Series Data) — filter_by_time","text":"easiest way filter time-based start/end ranges using shorthand timeseries notation. See filter_period() applying filter expression period (windows).","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter (for Time-Series Data) — filter_by_time","text":"","code":"filter_by_time(.data, .date_var, .start_date = \"start\", .end_date = \"end\")"},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter (for Time-Series Data) — filter_by_time","text":".data tibble time-based column. .date_var column containing date date-time values filter. missing, attempts auto-detect date column. .start_date starting date filter sequence .end_date ending date filter sequence","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Filter (for Time-Series Data) — filter_by_time","text":"Returns tibble data.frame filtered.","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter (for Time-Series Data) — filter_by_time","text":"Pure Time Series Filtering Flexibilty .start_date .end_date parameters designed flexibility mind. side time_formula specified character 'YYYY-MM-DD HH:MM:SS', powerful shorthand available. examples : Year: .start_date = '2013', .end_date = '2015' Month: .start_date = '2013-01', .end_date = '2016-06' Day: .start_date = '2013-01-05', .end_date = '2016-06-04' Second: .start_date = '2013-01-05 10:22:15', .end_date = '2018-06-03 12:14:22' Variations: .start_date = '2013', .end_date = '2016-06' Key Words: \"start\" \"end\" Use keywords \"start\" \"end\" shorthand, instead specifying actual start end values. examples: Start series end 2015: .start_date = 'start', .end_date = '2015' Start 2014 end series: .start_date = '2014', .end_date = 'end' Internal Calculations shorthand dates expanded: .start_date expanded first date period .end_date side expanded last date period means following examples equivalent (assuming index POSIXct): .start_date = '2015' equivalent .start_date = '2015-01-01 + 00:00:00' .end_date = '2016' equivalent 2016-12-31 + 23:59:59'","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Filter (for Time-Series Data) — filter_by_time","text":"function based tibbletime::filter_time() function developed Davis Vaughan.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/filter_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Filter (for Time-Series Data) — filter_by_time","text":"","code":"library(dplyr) library(timetk) # Filter values in January 1st through end of February, 2013 FANG %>% group_by(symbol) %>% filter_by_time(.start_date = \"start\", .end_date = \"2013-02\") %>% plot_time_series(date, adjusted, .facet_ncol = 2, .interactive = FALSE) #> .date_var is missing. Using: date"},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Apply filtering expressions inside periods (windows) — filter_period","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"Applies dplyr filtering expression inside time-based period (window). See filter_by_time() filtering continuous ranges defined start/end dates. filter_period() enables filtering expressions like: Filtering maximum value month. Filtering first date month. Filtering rows value greater monthly average","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"","code":"filter_period(.data, ..., .date_var, .period = \"1 day\")"},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Apply filtering expressions inside periods (windows) — filter_period","text":".data tbl object data.frame ... Filtering expression. Expressions return logical value, defined terms variables .data. multiple expressions included, combined & operator. rows conditions evaluate TRUE kept. .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period filter within. Time units grouped using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\"","code":""},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/filter_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Apply filtering expressions inside periods (windows) — filter_period","text":"","code":"# Libraries library(timetk) library(dplyr) # Max value in each month m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", value == max(value)) #> .date_var is missing. Using: date #> # A tibble: 350 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-08 2028. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-12 2155. #> 5 D10 2014-11-13 2245. #> 6 D10 2014-12-30 2345. #> 7 D10 2015-01-09 2369. #> 8 D10 2015-02-09 2341. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-13 2500. #> # ℹ 340 more rows # First date each month m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", date == first(date)) #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # All observations that are greater than a monthly average m4_daily %>% group_by(id) %>% filter_period(.period = \"1 month\", value > mean(value)) #> .date_var is missing. Using: date #> # A tibble: 4,880 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 4,870 more rows"},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Fourier Series — fourier_vec","title":"Fourier Series — fourier_vec","text":"fourier_vec() calculates Fourier Series date date-time index.","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fourier Series — fourier_vec","text":"","code":"fourier_vec(x, period, K = 1, type = c(\"sin\", \"cos\"), scale_factor = NULL)"},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fourier Series — fourier_vec","text":"x date, POSIXct, yearmon, yearqtr, numeric sequence (scaled difference 1 period alignment) converted fourier series. period number observations complete one cycle. K fourier term order. type Either \"sin\" \"cos\" appropriate type fourier term. scale_factor Scale factor calculated value scales date sequences numeric sequences. user can provide different value scale factor override date scaling. Default: NULL (auto-scale).","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fourier Series — fourier_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fourier Series — fourier_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. Fourier Series Calculation internal calculation relatively straightforward: fourier(x) = sin(2 * pi * term * x) cos(2 * pi * term * x), term = K / period. Period Alignment, period period alignment sequence essential part fourier series calculation. Date, Date-Time, Zoo (yearqtr yearmon) Sequences - scaled unit difference 1. happens internally, nothing need worry . Future time series scaled appropriately. Numeric Sequences - scaled, means transform unit difference 1 x sequence increases 1. Otherwise period fourier order incorrectly calculated. solution just take sequence divide median difference values. Fourier Order, K fourier order parameter increases frequency. K = 2 doubles frequency. common time series analysis add multiple fourier orders (e.g. 1 5) account seasonalities occur faster primary seasonality. Type (Sin/Cos) type fourier series can either sin cos. common time series analysis add sin cos series.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/fourier_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fourier Series — fourier_vec","text":"","code":"library(tibble) library(dplyr) library(tidyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) date_sequence <- tk_make_timeseries(\"2016-01-01\", \"2016-01-31\", by = \"hour\") # --- VECTOR --- fourier_vec(date_sequence, period = 7 * 24, K = 1, type = \"sin\") #> [1] 0.7818315 0.8045978 0.8262388 0.8467242 0.8660254 0.8841154 0.9009689 #> [8] 0.9165623 0.9308737 0.9438833 0.9555728 0.9659258 0.9749279 0.9825665 #> [15] 0.9888308 0.9937122 0.9972038 0.9993007 1.0000000 0.9993007 0.9972038 #> [22] 0.9937122 0.9888308 0.9825665 0.9749279 0.9659258 0.9555728 0.9438833 #> [29] 0.9308737 0.9165623 0.9009689 0.8841154 0.8660254 0.8467242 0.8262388 #> [36] 0.8045978 0.7818315 0.7579717 0.7330519 0.7071068 0.6801727 0.6522874 #> [43] 0.6234898 0.5938202 0.5633201 0.5320321 0.5000000 0.4672686 0.4338837 #> [50] 0.3998920 #> [ reached getOption(\"max.print\") -- omitted 671 entries ] # --- MUTATE --- tibble(date = date_sequence) %>% # Add cosine series that oscilates at a 7-day period mutate( C1_7 = fourier_vec(date, period = 7*24, K = 1, type = \"cos\"), C2_7 = fourier_vec(date, period = 7*24, K = 2, type = \"cos\") ) %>% # Visualize pivot_longer(cols = contains(\"_\"), names_to = \"name\", values_to = \"value\") %>% plot_time_series( date, value, .color_var = name, .smooth = FALSE, .interactive = FALSE, .title = \"7-Day Fourier Terms\" ) options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":null,"dir":"Reference","previous_headings":"","what":"Make future time series from existing — future_frame","title":"Make future time series from existing — future_frame","text":"Make future time series existing","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make future time series from existing — future_frame","text":"","code":"future_frame( .data, .date_var, .length_out, .inspect_weekdays = FALSE, .inspect_months = FALSE, .skip_values = NULL, .insert_values = NULL, .bind_data = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make future time series from existing — future_frame","text":".data data.frame tibble .date_var date date-time variable. .length_out Number future observations. Can numeric number phrase like \"1 year\". .inspect_weekdays Uses logistic regression algorithm inspect whether certain weekdays (e.g. weekends) excluded future dates. Default FALSE. .inspect_months Uses logistic regression algorithm inspect whether certain days months (e.g. last two weeks year seasonal days) excluded future dates. Default FALSE. .skip_values vector class idx timeseries values skip. .insert_values vector class idx timeseries values insert. .bind_data Whether perform row-wise bind .data future data. Default: FALSE","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make future time series from existing — future_frame","text":"tibble extended future date, date-time timestamps.","code":""},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make future time series from existing — future_frame","text":"wrapper tk_make_future_timeseries() works data.frames. respects dplyr groups. Specifying Length Future Observations argument .length_out determines many future index observations compute. can specified : numeric value - number future observations return. number observations returned always equal value user inputs. end date can vary based number timestamps chosen. time-based phrase - duration future include (e.g. \"6 months\" \"30 minutes\"). duration defines end date observations. end date change timestamps fall within end date returned (e.g. quarterly time series return 4 quarters .length_out = \"1 year\"). number observations vary fit within end date. Weekday Month Inspection .inspect_weekdays .inspect_months arguments apply \"daily\" (scale = \"day\") data (refer tk_get_timeseries_summary() get index scale). .inspect_weekdays argument useful determining missing days week occur weekly frequency every week, every week, . recommended least 60 days use option. .inspect_months argument useful determining missing days month, quarter year; however, algorithm can inadvertently select incorrect dates pattern erratic. Skipping / Inserting Values .skip_values .insert_values arguments can used remove add values series future times. values must format idx class. .skip_values argument useful passing holidays special index values excluded future time series. .insert_values argument useful adding values back algorithm may excluded. Binding Data Rowwise binding original common added argument .bind_data perform row-wise bind future data incoming data. replaces need : Now can just :","code":"df %>% future_frame(.length_out = \"6 months\") %>% bind_rows(df, .) df %>% future_frame(.length_out = \"6 months\", .bind_data = TRUE)"},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/future_frame.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make future time series from existing — future_frame","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # 30-min interval data taylor_30_min %>% future_frame(date, .length_out = \"1 week\") #> # A tibble: 336 × 1 #> date #> #> 1 2000-08-28 00:00:00 #> 2 2000-08-28 00:30:00 #> 3 2000-08-28 01:00:00 #> 4 2000-08-28 01:30:00 #> 5 2000-08-28 02:00:00 #> 6 2000-08-28 02:30:00 #> 7 2000-08-28 03:00:00 #> 8 2000-08-28 03:30:00 #> 9 2000-08-28 04:00:00 #> 10 2000-08-28 04:30:00 #> # ℹ 326 more rows # Daily Data (Grouped) m4_daily %>% group_by(id) %>% future_frame(date, .length_out = \"6 weeks\") #> # A tibble: 168 × 2 #> # Groups: id [4] #> id date #> #> 1 D10 2016-05-07 #> 2 D10 2016-05-08 #> 3 D10 2016-05-09 #> 4 D10 2016-05-10 #> 5 D10 2016-05-11 #> 6 D10 2016-05-12 #> 7 D10 2016-05-13 #> 8 D10 2016-05-14 #> 9 D10 2016-05-15 #> 10 D10 2016-05-16 #> # ℹ 158 more rows # Specify how many observations to project into the future m4_daily %>% group_by(id) %>% future_frame(date, .length_out = 100) #> # A tibble: 400 × 2 #> # Groups: id [4] #> id date #> #> 1 D10 2016-05-07 #> 2 D10 2016-05-08 #> 3 D10 2016-05-09 #> 4 D10 2016-05-10 #> 5 D10 2016-05-11 #> 6 D10 2016-05-12 #> 7 D10 2016-05-13 #> 8 D10 2016-05-14 #> 9 D10 2016-05-15 #> 10 D10 2016-05-16 #> # ℹ 390 more rows # Bind with Original Data m4_daily %>% group_by(id) %>% future_frame(date, .length_out = 100, .bind_data = TRUE) #> # A tibble: 10,143 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 10,133 more rows holidays <- tk_make_holiday_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\", calendar = \"NYSE\") weekends <- tk_make_weekend_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\" ) FANG %>% group_by(symbol) %>% future_frame( .length_out = \"1 year\", .skip_values = c(holidays, weekends) ) #> .date_var is missing. Using: date #> # A tibble: 1,008 × 2 #> # Groups: symbol [4] #> symbol date #> #> 1 FB 2016-12-31 #> 2 FB 2017-01-03 #> 3 FB 2017-01-04 #> 4 FB 2017-01-05 #> 5 FB 2017-01-06 #> 6 FB 2017-01-09 #> 7 FB 2017-01-10 #> 8 FB 2017-01-11 #> 9 FB 2017-01-12 #> 10 FB 2017-01-13 #> # ℹ 998 more rows # }"},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":null,"dir":"Reference","previous_headings":"","what":"Check if an object is a date class — is_date_class","title":"Check if an object is a date class — is_date_class","text":"Check object date class","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Check if an object is a date class — is_date_class","text":"","code":"is_date_class(x)"},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Check if an object is a date class — is_date_class","text":"x vector check","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Check if an object is a date class — is_date_class","text":"Logical (TRUE/FALSE)","code":""},{"path":"https://business-science.github.io/timetk/reference/is_date_class.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Check if an object is a date class — is_date_class","text":"","code":"library(dplyr) tk_make_timeseries(\"2011\") %>% is_date_class() #> Using by: day #> [1] TRUE letters %>% is_date_class() #> [1] FALSE"},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Lag Transformation — lag_vec","title":"Lag Transformation — lag_vec","text":"lag_vec() applies Lag Transformation.","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lag Transformation — lag_vec","text":"","code":"lag_vec(x, lag = 1) lead_vec(x, lag = -1)"},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lag Transformation — lag_vec","text":"x vector lagged. lag lag (far back) included differencing calculation. Negative lags leads.","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Lag Transformation — lag_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Lag Transformation — lag_vec","text":"Benefits: function NA padded default works well dplyr::mutate() operations. function allows lags leads (negative lags). Lag Calculation lag offset lag periods. NA values returned number lag periods. Lead Calculation negative lag considered lead. difference lead_vec() lag_vec() lead_vec() function contains starting negative value.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/lag_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Lag Transformation — lag_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- # Lag 1:10 %>% lag_vec(lag = 1) #> [1] NA 1 2 3 4 5 6 7 8 9 # Lead 1:10 %>% lag_vec(lag = -1) #> [1] 2 3 4 5 6 7 8 9 10 NA # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(lag_1 = lag_vec(value, lag = 1)) #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value lag_1 #> #> 1 D10 2014-07-03 2076. NA #> 2 D10 2014-07-04 2073. 2076. #> 3 D10 2014-07-05 2049. 2073. #> 4 D10 2014-07-06 2049. 2049. #> 5 D10 2014-07-07 2006. 2049. #> 6 D10 2014-07-08 2018. 2006. #> 7 D10 2014-07-09 2019. 2018. #> 8 D10 2014-07-10 2007. 2019. #> 9 D10 2014-07-11 2010 2007. #> 10 D10 2014-07-12 2002. 2010 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"log_interval_vec() transformation constrains forecast interval specified upper_limit lower_limit. transformation provides similar benefits log() transformation, ensuring inverted transformation stays within upper lower limit.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"","code":"log_interval_vec( x, limit_lower = \"auto\", limit_upper = \"auto\", offset = 0, silent = FALSE ) log_interval_inv_vec(x, limit_lower, limit_upper, offset = 0)"},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"x positive numeric vector. limit_lower lower limit. Must less minimum value. set \"auto\", selects zero. limit_upper upper limit. Must greater maximum value. set \"auto\", selects value 10% greater maximum value. offset offset include log transformation. Useful data contains values less equal zero. silent Whether report parameter selections message.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"numeric vector transformed series.","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"Log Interval Transformation Log Interval Transformation constrains values specified upper lower limits. transformation maps limits function: log(((x + offset) - )/(b - (x + offset))) lower limit b upper limit Inverse Transformation inverse transformation: (b-)*(exp(x)) / (1 + exp(x)) + - offset","code":""},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"Forecasting: Principles & Practices: Forecasts constrained interval","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/log_interval_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log-Interval Transformation for Constrained Interval Forecasting — log_interval_vec","text":"","code":"library(dplyr) library(timetk) values_trans <- log_interval_vec(1:10, limit_lower = 0, limit_upper = 11) #> log_interval_vec(): #> Using limit_lower: 0 #> Using limit_upper: 11 #> Using offset: 0 values_trans #> [1] -2.3025851 -1.5040774 -0.9808293 -0.5596158 -0.1823216 0.1823216 #> [7] 0.5596158 0.9808293 1.5040774 2.3025851 values_trans_forecast <- c(values_trans, 3.4, 4.4, 5.4) values_trans_forecast %>% log_interval_inv_vec(limit_lower = 0, limit_upper = 11) %>% plot()"},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 daily time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"","code":"m4_daily"},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Daily format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"sample 4 daily data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Daily Time Series Datasets from the M4 Competition — m4_daily","text":"","code":"m4_daily #> # A tibble: 9,743 × 3 #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-07-08 2018. #> 7 D10 2014-07-09 2019. #> 8 D10 2014-07-10 2007. #> 9 D10 2014-07-11 2010 #> 10 D10 2014-07-12 2002. #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 hourly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"","code":"m4_hourly"},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"tibble: 3,060 x 3 id Factor. Unique series identifier (4 total) date Date-time. Timestamp information. Hourly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"sample 4 hourly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_hourly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Hourly Time Series Datasets from the M4 Competition — m4_hourly","text":"","code":"m4_hourly #> # A tibble: 3,060 × 3 #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 monthly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"","code":"m4_monthly"},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Monthly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"sample 4 Monthly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_monthly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Monthly Time Series Datasets from the M4 Competition — m4_monthly","text":"","code":"m4_monthly #> # A tibble: 1,574 × 3 #> id date value #> #> 1 M1 1976-06-01 8000 #> 2 M1 1976-07-01 8350 #> 3 M1 1976-08-01 8570 #> 4 M1 1976-09-01 7700 #> 5 M1 1976-10-01 7080 #> 6 M1 1976-11-01 6520 #> 7 M1 1976-12-01 6070 #> 8 M1 1977-01-01 6650 #> 9 M1 1977-02-01 6830 #> 10 M1 1977-03-01 5710 #> # ℹ 1,564 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 quarterly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"","code":"m4_quarterly"},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Quarterly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"sample 4 Quarterly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_quarterly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Quarterly Time Series Datasets from the M4 Competition — m4_quarterly","text":"","code":"m4_quarterly #> # A tibble: 196 × 3 #> id date value #> #> 1 Q10 2000-01-01 2329 #> 2 Q10 2000-04-01 2350. #> 3 Q10 2000-07-01 2333. #> 4 Q10 2000-10-01 2382. #> 5 Q10 2001-01-01 2383. #> 6 Q10 2001-04-01 2405 #> 7 Q10 2001-07-01 2411 #> 8 Q10 2001-10-01 2428. #> 9 Q10 2002-01-01 2392. #> 10 Q10 2002-04-01 2418. #> # ℹ 186 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 weekly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"","code":"m4_weekly"},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Weekly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"sample 4 Weekly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_weekly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Weekly Time Series Datasets from the M4 Competition — m4_weekly","text":"","code":"m4_weekly #> # A tibble: 2,295 × 3 #> id date value #> #> 1 W10 1999-01-01 247. #> 2 W10 1999-01-08 222. #> 3 W10 1999-01-15 450. #> 4 W10 1999-01-22 450. #> 5 W10 1999-01-29 450. #> 6 W10 1999-02-05 450. #> 7 W10 1999-02-12 450. #> 8 W10 1999-02-19 450. #> 9 W10 1999-02-26 450. #> 10 W10 1999-03-05 450. #> # ℹ 2,285 more rows"},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"fourth M Competition. M4, started 1 January 2018 ended 31 May 2018. competition included 100,000 time series datasets. dataset includes sample 4 yearly time series competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"","code":"m4_yearly"},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) date Date. Timestamp information. Yearly format. value Numeric. Value corresponding timestamp.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"M4 Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"sample 4 Yearly data sets M4 competition.","code":""},{"path":"https://business-science.github.io/timetk/reference/m4_yearly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample of 4 Yearly Time Series Datasets from the M4 Competition — m4_yearly","text":"","code":"m4_yearly #> # A tibble: 135 × 3 #> id date value #> #> 1 Y1 1979-01-01 5172. #> 2 Y1 1980-01-01 5134. #> 3 Y1 1981-01-01 5187. #> 4 Y1 1982-01-01 5085. #> 5 Y1 1983-01-01 5182 #> 6 Y1 1984-01-01 5414. #> 7 Y1 1985-01-01 5576. #> 8 Y1 1986-01-01 5753. #> 9 Y1 1987-01-01 5955. #> 10 Y1 1988-01-01 6088. #> # ℹ 125 more rows"},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Mutate (for Time Series Data) — mutate_by_time","title":"Mutate (for Time Series Data) — mutate_by_time","text":"mutate_by_time() time-based variant popular dplyr::mutate() function uses .date_var specify date date-time column .group calculation groups like \"5 seconds\", \"week\", \"3 months\".","code":""},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mutate (for Time Series Data) — mutate_by_time","text":"","code":"mutate_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\") )"},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mutate (for Time Series Data) — mutate_by_time","text":".data tbl object data.frame .date_var column containing date date-time values summarize. missing, attempts auto-detect date column. .time unit summarise . Time units collapsed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed. ... Name-value pairs. name gives name column output. value can : vector length 1, recycled correct length. vector length current group (whole data frame ungrouped). NULL, remove column. data frame tibble, create multiple columns output. .type One \"floor\", \"ceiling\", \"round. Defaults \"floor\". See lubridate::round_date.","code":""},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Mutate (for Time Series Data) — mutate_by_time","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/mutate_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Mutate (for Time Series Data) — mutate_by_time","text":"","code":"# Libraries library(timetk) library(dplyr) library(tidyr) # First value in each month m4_daily_first_by_month_tbl <- m4_daily %>% group_by(id) %>% mutate_by_time( .date_var = date, .by = \"month\", # Setup for monthly aggregation # mutate recycles a single value first_value_by_month = first(value) ) m4_daily_first_by_month_tbl #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value first_value_by_month #> #> 1 D10 2014-07-03 2076. 2076. #> 2 D10 2014-07-04 2073. 2076. #> 3 D10 2014-07-05 2049. 2076. #> 4 D10 2014-07-06 2049. 2076. #> 5 D10 2014-07-07 2006. 2076. #> 6 D10 2014-07-08 2018. 2076. #> 7 D10 2014-07-09 2019. 2076. #> 8 D10 2014-07-10 2007. 2076. #> 9 D10 2014-07-11 2010 2076. #> 10 D10 2014-07-12 2002. 2076. #> # ℹ 9,733 more rows # Visualize Time Series vs 1st Value Each Month m4_daily_first_by_month_tbl %>% pivot_longer(value:first_value_by_month) %>% plot_time_series(date, value, name, .facet_scale = \"free\", .facet_ncol = 2, .smooth = FALSE, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Normalize to Range (0, 1) — normalize_vec","title":"Normalize to Range (0, 1) — normalize_vec","text":"Normalization commonly used center scale numeric features prevent one dominating algorithms require data scale.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Normalize to Range (0, 1) — normalize_vec","text":"","code":"normalize_vec(x, min = NULL, max = NULL, silent = FALSE) normalize_inv_vec(x, min, max)"},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Normalize to Range (0, 1) — normalize_vec","text":"x numeric vector. min population min value normalization process. max population max value normalization process. silent Whether report automated min max parameters message.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Normalize to Range (0, 1) — normalize_vec","text":"numeric vector transformation applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Normalize to Range (0, 1) — normalize_vec","text":"Standardization vs Normalization Standardization refers transformation reduces range mean 0, standard deviation 1 Normalization refers transformation reduces min-max range: (0, 1)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/normalize_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Normalize to Range (0, 1) — normalize_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_norm <- normalize_vec(d10_daily$value) #> Normalization Parameters #> min: 1781.6 #> max: 2649.3 value <- normalize_inv_vec(value_norm, min = 1781.6, max = 2649.3) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_norm = normalize_vec(value)) #> Normalization Parameters #> min: 1781.6 #> max: 2649.3 #> Normalization Parameters #> min: 1734.9 #> max: 19432.5 #> Normalization Parameters #> min: 6309.38 #> max: 9540.62 #> Normalization Parameters #> min: 4172.1 #> max: 14954.1 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_norm #> #> 1 D10 2014-07-03 2076. 0.340 #> 2 D10 2014-07-04 2073. 0.336 #> 3 D10 2014-07-05 2049. 0.308 #> 4 D10 2014-07-06 2049. 0.308 #> 5 D10 2014-07-07 2006. 0.259 #> 6 D10 2014-07-08 2018. 0.272 #> 7 D10 2014-07-09 2019. 0.274 #> 8 D10 2014-07-10 2007. 0.260 #> 9 D10 2014-07-11 2010 0.263 #> 10 D10 2014-07-12 2002. 0.253 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Insert time series rows with regularly spaced timestamps — pad_by_time","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"easiest way fill missing timestamps convert granular period (e.g. quarter month). Wraps padr::pad() function padding tibbles.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"","code":"pad_by_time( .data, .date_var, .by = \"auto\", .pad_value = NA, .fill_na_direction = c(\"none\", \"down\", \"up\", \"downup\", \"updown\"), .start_date = NULL, .end_date = NULL )"},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":".data tibble time-based column. .date_var column containing date date-time values pad .Either \"auto\", time-based frequency like \"year\", \"month\", \"day\", \"hour\", etc, time expression like \"5 min\", \"7 days\". See Details. .pad_value Fills padded values. Default NA. .fill_na_direction Users can provide NA fill strategy using tidyr::fill(). Possible values: 'none', '', '', 'downup', 'updown'. Default: 'none' .start_date Specifies start padded series. NULL use lowest value input variable. .end_date Specifies end padded series. NULL use highest value input variable.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"tibble data.frame rows containing missing timestamps added.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"Padding Missing Observations common use case pad_by_time() add rows timestamps missing. sales data missing values weekends holidays. high frequency data observations irregularly spaced reset regular frequency. Going Low High Frequency second use case going low frequency (e.g. day) high frequency (e.g. hour). possible supplying higher frequency pad_by_time(). Interval, .Padding can applied following ways: .= \"auto\" - pad_by_time() detect time-stamp frequency apply padding. eight intervals : year, quarter, month, week, day, hour, min, sec. Intervals like 5 minutes, 6 hours, 10 days possible. Pad Value, .pad_value pad value can supplied fills missing numeric data. Note applied numeric columns. Fill NA Direction, .fill_na_directions Uses tidyr::fill() fill missing observations using fill strategy.","code":""},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"function wraps padr::pad() function developed Edwin Thoen.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/pad_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Insert time series rows with regularly spaced timestamps — pad_by_time","text":"","code":"library(tibble) library(dplyr) library(timetk) # Create a quarterly series with 1 missing value missing_data_tbl <- tibble( date = tk_make_timeseries(\"2014-01-01\", \"2015-01-01\", by = \"quarter\"), value = 1:5 ) %>% slice(-4) # Lose the 4th quarter on purpose missing_data_tbl #> # A tibble: 4 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2015-01-01 5 # Detects missing quarter, and pads the missing regularly spaced quarter with NA missing_data_tbl %>% pad_by_time(date, .by = \"quarter\") #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 NA #> 5 2015-01-01 5 # Can specify a shorter period. This fills monthly. missing_data_tbl %>% pad_by_time(date, .by = \"month\") #> # A tibble: 13 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-02-01 NA #> 3 2014-03-01 NA #> 4 2014-04-01 2 #> 5 2014-05-01 NA #> 6 2014-06-01 NA #> 7 2014-07-01 3 #> 8 2014-08-01 NA #> 9 2014-09-01 NA #> 10 2014-10-01 NA #> 11 2014-11-01 NA #> 12 2014-12-01 NA #> 13 2015-01-01 5 # Can let pad_by_time() auto-detect date and period missing_data_tbl %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: quarter #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 NA #> 5 2015-01-01 5 # Can specify a .pad_value missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .pad_value = 0) #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 0 #> 5 2015-01-01 5 # Can then impute missing values missing_data_tbl %>% pad_by_time(date, .by = \"quarter\") %>% mutate(value = ts_impute_vec(value, period = 1)) #> # A tibble: 5 × 2 #> date value #> #> 1 2014-01-01 1 #> 2 2014-04-01 2 #> 3 2014-07-01 3 #> 4 2014-10-01 4 #> 5 2015-01-01 5 # Can specify a custom .start_date and .end_date missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .start_date = \"2013\", .end_date = \"2015-07-01\") #> # A tibble: 11 × 2 #> date value #> #> 1 2013-01-01 NA #> 2 2013-04-01 NA #> 3 2013-07-01 NA #> 4 2013-10-01 NA #> 5 2014-01-01 1 #> 6 2014-04-01 2 #> 7 2014-07-01 3 #> 8 2014-10-01 NA #> 9 2015-01-01 5 #> 10 2015-04-01 NA #> 11 2015-07-01 NA # Can specify a tidyr::fill() direction missing_data_tbl %>% pad_by_time(date, .by = \"quarter\", .fill_na_direction = \"downup\", .start_date = \"2013\", .end_date = \"2015-07-01\") #> # A tibble: 11 × 2 #> date value #> #> 1 2013-01-01 1 #> 2 2013-04-01 1 #> 3 2013-07-01 1 #> 4 2013-10-01 1 #> 5 2014-01-01 1 #> 6 2014-04-01 2 #> 7 2014-07-01 3 #> 8 2014-10-01 3 #> 9 2015-01-01 5 #> 10 2015-04-01 5 #> 11 2015-07-01 5 # --- GROUPS ---- # Apply standard NA padding to groups FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\") #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 NA NA NA NA NA NA #> 5 AMZN 2013-01-06 NA NA NA NA NA NA #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows # Apply constant pad value FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\", .pad_value = 0) #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 0 0 0 0 0 0 #> 5 AMZN 2013-01-06 0 0 0 0 0 0 #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows # Apply filled padding to groups FANG %>% group_by(symbol) %>% pad_by_time(.by = \"day\", .fill_na_direction = \"down\") #> .date_var is missing. Using: date #> # A tibble: 5,836 × 8 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. #> 4 AMZN 2013-01-05 258. 260. 257. 259. 1874200 259. #> 5 AMZN 2013-01-06 258. 260. 257. 259. 1874200 259. #> 6 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. #> 7 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. #> 8 AMZN 2013-01-09 268. 270. 265. 266. 2265600 266. #> 9 AMZN 2013-01-10 269. 269. 262. 265. 2863400 265. #> 10 AMZN 2013-01-11 265. 268. 264. 268. 2413300 268. #> # ℹ 5,826 more rows"},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":null,"dir":"Reference","previous_headings":"","what":"Fast, flexible date and datetime parsing — parse_date2","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Significantly faster time series parsing readr::parse_date, readr::parse_datetime, lubridate::as_date(), lubridate::as_datetime(). Uses anytime package, relies Boost.Date_Time C++ library date/datetime parsing.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fast, flexible date and datetime parsing — parse_date2","text":"","code":"parse_date2(x, ..., silent = FALSE) parse_datetime2(x, tz = \"UTC\", tz_shift = FALSE, ..., silent = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fast, flexible date and datetime parsing — parse_date2","text":"x character vector ... Additional parameters passed anytime() anydate() silent TRUE, warns user parsing failures. tz Datetime . timezone (see OlsenNames()). tz_shift Datetime . FALSE, forces datetime time zone. TRUE, offsets datetime UTC new time zone.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Returns date datatime vector transformation applied character timestamp vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fast, flexible date and datetime parsing — parse_date2","text":"Parsing Formats Date Formats: Must follow Year, Month, Day sequence. (e.g. parse_date2(\"2011 June\") OK, parse_date2(\"June 2011\") OK). Date Time Formats: Must follow YMD HMS sequence. Refer lubridate::mdy() Month, Day, Year additional formats. Time zones (Datetime) Time zones handled similar way lubridate::as_datetime() time zones forced rather shifted. key difference anytime::anytime(), shifts datetimes specified timezone default.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fast, flexible date and datetime parsing — parse_date2","text":"function wraps anytime::anytime() anytime::anydate functions developed Dirk Eddelbuettel.","code":""},{"path":"https://business-science.github.io/timetk/reference/parse_date2.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fast, flexible date and datetime parsing — parse_date2","text":"","code":"# Fast date parsing parse_date2(\"2011\") #> [1] \"2011-01-01\" parse_date2(\"2011 June 3rd\") #> [1] \"2011-06-03\" # Fast datetime parsing parse_datetime2(\"2011\") #> [1] \"2011-01-01 UTC\" parse_datetime2(\"2011 Jan 1 12:35:21\") #> [1] \"2011-01-01 12:35:21 UTC\" # Time Zones (datetime only) parse_datetime2(\"2011 Jan 1 12:35:21\", tz = \"Europe/London\") #> [1] \"2011-01-01 12:35:21 GMT\""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"Returns ACF PACF target optionally CCF's one lagged predictors interactive plotly plots. Scales multiple time series group_by().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"","code":"plot_acf_diagnostics( .data, .date_var, .value, .ccf_vars = NULL, .lags = 1000, .show_ccf_vars_only = FALSE, .show_white_noise_bars = TRUE, .facet_ncol = 1, .facet_scales = \"fixed\", .line_color = \"#2c3e50\", .line_size = 0.5, .line_alpha = 1, .point_color = \"#2c3e50\", .point_size = 1, .point_alpha = 1, .x_intercept = NULL, .x_intercept_color = \"#E31A1C\", .hline_color = \"#2c3e50\", .white_noise_line_type = 2, .white_noise_line_color = \"#A6CEE3\", .title = \"Lag Diagnostics\", .x_lab = \"Lag\", .y_lab = \"Correlation\", .interactive = TRUE, .plotly_slider = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":".data data frame tibble numeric features (values) descending chronological order .date_var column containing either date date-time values .value numeric column value ACF PACF calculations performed. .ccf_vars Additional features perform Lag Cross Correlations (CCFs) versus .value. Useful evaluating external lagged regressors. .lags sequence one lags evaluate. .show_ccf_vars_only Hides ACF PACF plots can focus CCFs. .show_white_noise_bars Shows white noise significance bounds. .facet_ncol Facets: Number facet columns. effect using grouped_df. .facet_scales Facets: Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .line_color Line color. Use keyword: \"scale_color\" change color facet. .line_size Line size .line_alpha Line opacity. Adjust transparency line. Range: (0, 1) .point_color Point color. Use keyword: \"scale_color\" change color facet. .point_size Point size .point_alpha Opacity. Adjust transparency points. Range: (0, 1) .x_intercept Numeric lag. Adds vertical line. .x_intercept_color Color x-intercept line. .hline_color Color y-intercept = 0 line. .white_noise_line_type Line type white noise bars. Set 2 \"dashed\" default. .white_noise_line_color Line color white noise bars. Set tidyquant::palette_light() \"steel blue\" default. .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly x-axis range slider.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"Simplified ACF, PACF, & CCF often interested 3 functions. get 3+ ? Now can. ACF - Autocorrelation target variable lagged versions PACF - Partial Autocorrelation removes dependence lags lags highlighting key seasonalities. CCF - Shows lagged predictors can used prediction target variable. Lag Specification Lags (.lags) can either specified : time-based phrase indicating duraction (e.g. 2 months) maximum lag (e.g. .lags = 28) sequence lags (e.g. .lags = 7:28) Scales Multiple Time Series Groups plot_acf_diagnostics() works grouped_df's, meaning can group time series one categorical columns dplyr::group_by() apply plot_acf_diagnostics() return group-wise lag diagnostics. Special Note Groups Unlike plotting utilities, .facet_vars arguments included. Use dplyr::group_by() processing multiple time series groups. Calculating White Noise Significance Bars formula significance bars +2/sqrt(T) -2/sqrt(T) T length time series. white noise time series, 95% data points fall within range. may significant autocorrelations.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_acf_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize the ACF, PACF, and CCFs for One or More Time Series — plot_acf_diagnostics","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Apply Transformations # - Differencing transformation to identify ARIMA & SARIMA Orders m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, value, # ACF & PACF .lags = \"7 days\", # 7-Days of hourly lags .interactive = FALSE ) # Apply Transformations # - Differencing transformation to identify ARIMA & SARIMA Orders m4_hourly %>% group_by(id) %>% plot_acf_diagnostics( date, diff_vec(value, lag = 1), # Difference the value column .lags = 0:(24*7), # 7-Days of hourly lags .interactive = FALSE ) + ggtitle(\"ACF Diagnostics\", subtitle = \"1st Difference\") #> diff_vec(): Initial values: 513 #> diff_vec(): Initial values: 39325 #> diff_vec(): Initial values: 45 #> diff_vec(): Initial values: 153 # CCFs Too! walmart_sales_weekly %>% select(id, Date, Weekly_Sales, Temperature, Fuel_Price) %>% group_by(id) %>% plot_acf_diagnostics( Date, Weekly_Sales, # ACF & PACF .ccf_vars = c(Temperature, Fuel_Price), # CCFs .lags = \"3 months\", # 3 months of weekly lags .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"interactive scalable function visualizing anomalies time series data. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"","code":"plot_anomaly_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .frequency = \"auto\", .trend = \"auto\", .alpha = 0.05, .max_anomalies = 0.2, .message = TRUE, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .anom_color = \"#e31a1c\", .anom_alpha = 1, .anom_size = 1.5, .ribbon_fill = \"grey20\", .ribbon_alpha = 0.2, .legend_show = TRUE, .title = \"Anomaly Diagnostics\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Anomaly\", .interactive = TRUE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity LOESS smoother, used remove remainder. Refer tk_get_trend(). .alpha Controls width \"normal\" range. Lower values conservative higher values less prone incorrectly classifying \"normal\" observations. .max_anomalies maximum percent anomalies permitted identified. .message boolean. TRUE, output information related automatic frequency trend selection (applicable). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .anom_color Color anomaly dots .anom_alpha Opacity anomaly dots. Range: (0, 1). .anom_size Size anomaly dots .ribbon_fill Fill color acceptable range .ribbon_alpha Fill opacity acceptable range. Range: (0, 1). .legend_show Toggles /Legend .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .color_lab Plot label color legend .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"plot_anomaly_diagnostics() visualization wrapper tk_anomaly_diagnostics() group-wise anomaly detection, implements 2-step process detect outliers time series. Step 1: Detrend & Remove Seasonality using STL Decomposition decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\" anomaly detection. user can control two parameters: frequency trend. .frequency: Adjusts \"season\" component removed \"observed\" values. .trend: Adjusts trend window (t.window parameter stats::stl() used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", predetermines frequency /trend based scale time series using tk_time_scale_template(). Step 2: Anomaly Detection \"trend\" \"season\" (seasonality) removed, anomaly detection performed \"remainder\". Anomalies identified, boundaries (recomposed_l1 recomposed_l2) determined. Anomaly Detection Method uses inner quartile range (IQR) +/-25 median. IQR Adjustment, alpha parameter default alpha = 0.05, limits established expanding 25/75 baseline IQR Factor 3 (3X). IQR Factor = 0.15 / alpha (hence 3X alpha = 0.05): increase IQR Factor controlling limits, decrease alpha, makes difficult outlier. Increase alpha make easier outlier. IQR outlier detection method used forecast::tsoutliers(). similar outlier detection method used Twitter's AnomalyDetection package. Twitter Forecast tsoutliers methods implemented Business Science's anomalize package.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"CLEVELAND, R. B., CLEVELAND, W. S., MCRAE, J. E., TERPENNING, . STL: Seasonal-Trend Decomposition Procedure Based Loess. Journal Official Statistics, Vol. 6, . 1 (1990), pp. 3-73. Owen S. Vallis, Jordan Hochenbaum Arun Kejariwal (2014). Novel Technique Long-Term Anomaly Detection Cloud. Twitter Inc.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_anomaly_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize Anomalies for One or More Time Series — plot_anomaly_diagnostics","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% group_by(id) %>% plot_anomaly_diagnostics(Date, Weekly_Sales, .message = FALSE, .facet_ncol = 3, .ribbon_alpha = 0.25, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"interactive scalable function visualizing time series seasonality. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"","code":"plot_seasonal_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .feature_set = \"auto\", .geom = c(\"boxplot\", \"violin\"), .geom_color = \"#2c3e50\", .geom_outlier_color = \"#2c3e50\", .title = \"Seasonal Diagnostics\", .x_lab = \"\", .y_lab = \"\", .interactive = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .feature_set One multiple selections analyze seasonality. Choices include: \"auto\" - Automatically selects features based time stamps length series. \"second\" - Good analyzing seasonality second minute. \"minute\" - Good analyzing seasonality minute hour \"hour\" - Good analyzing seasonality hour day \"wday.lbl\" - Labeled weekdays. Good analyzing seasonality day week. \"week\" - Good analyzing seasonality week year. \"month.lbl\" - Labeled months. Good analyzing seasonality month year. \"quarter\" - Good analyzing seasonality quarter year \"year\" - Good analyzing seasonality multiple years. .geom Either \"boxplot\" \"violin\" .geom_color Geometry color. Line color. Use keyword: \"scale_color\" change color facet. .geom_outlier_color Color used highlight outliers. .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"Automatic Feature Selection Internal calculations performed detect sub-range features include useing following logic: minimum feature selected based median difference consecutive timestamps maximum feature selected based 2 full periods. Example: Hourly timestamp data lasts 2 weeks following features: \"hour\", \"wday.lbl\", \"week\". Scalable Grouped Data Frames function respects grouped data.frame tibbles made dplyr::group_by(). grouped data, automatic feature selection returned collection features within sub-groups. means extra features returned even though may meaningless groups. Transformations .value parameter respects transformations (e.g. .value = log(sales)).","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_seasonal_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize Multiple Seasonality Features for One or More Time Series — plot_seasonal_diagnostics","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # ---- MULTIPLE FREQUENCY ---- # Taylor 30-minute dataset from forecast package taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows # Visualize series taylor_30_min %>% plot_time_series(date, value, .interactive = FALSE) # Visualize seasonality taylor_30_min %>% plot_seasonal_diagnostics(date, value, .interactive = FALSE) # ---- GROUPED EXAMPLES ---- # m4 hourly dataset m4_hourly #> # A tibble: 3,060 × 3 #> id date value #> #> 1 H10 2015-07-01 12:00:00 513 #> 2 H10 2015-07-01 13:00:00 512 #> 3 H10 2015-07-01 14:00:00 506 #> 4 H10 2015-07-01 15:00:00 500 #> 5 H10 2015-07-01 16:00:00 490 #> 6 H10 2015-07-01 17:00:00 484 #> 7 H10 2015-07-01 18:00:00 467 #> 8 H10 2015-07-01 19:00:00 446 #> 9 H10 2015-07-01 20:00:00 434 #> 10 H10 2015-07-01 21:00:00 422 #> # ℹ 3,050 more rows # Visualize series m4_hourly %>% group_by(id) %>% plot_time_series(date, value, .facet_scales = \"free\", .interactive = FALSE) # Visualize seasonality m4_hourly %>% group_by(id) %>% plot_seasonal_diagnostics(date, value, .interactive = FALSE) # }"},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"interactive scalable function visualizing time series STL Decomposition. Plots available interactive plotly (default) static ggplot2 format.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"","code":"plot_stl_diagnostics( .data, .date_var, .value, .facet_vars = NULL, .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\", \"seasadj\"), .frequency = \"auto\", .trend = \"auto\", .message = TRUE, .facet_scales = \"free\", .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .title = \"STL Diagnostics\", .x_lab = \"\", .y_lab = \"\", .interactive = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .feature_set STL decompositions visualize. Select one \"observed\", \"season\", \"trend\", \"remainder\", \"seasadj\". .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity lowess smoother, used remove remainder. .message boolean. TRUE, output information related automatic frequency trend selection (applicable). .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .line_color Line color. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .title Plot title. .x_lab Plot x-axis label .y_lab Plot y-axis label .interactive TRUE, returns plotly interactive plot. FALSE, returns static ggplot2 plot.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"plotly ggplot2 visualization","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"plot_stl_diagnostics() function generates Seasonal-Trend-Loess decomposition. function \"tidy\" sense works data frames designed work dplyr groups. STL method: STL method implements time series decomposition using underlying stats::stl(). decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\". Frequency & Trend Selection user can control two parameters: .frequency .trend. .frequency parameter adjusts \"season\" component removed \"observed\" values. .trend parameter adjusts trend window (t.window parameter stl()) used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", automatically selects frequency /trend based scale time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_stl_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize STL Decomposition Features for One or More Time Series — plot_stl_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- SINGLE TIME SERIES DECOMPOSITION ---- m4_hourly %>% filter(id == \"H10\") %>% plot_stl_diagnostics( date, value, # Set features to return, desired frequency and trend .feature_set = c(\"observed\", \"season\", \"trend\", \"remainder\"), .frequency = \"24 hours\", .trend = \"1 week\", .interactive = FALSE) #> frequency = 24 observations per 24 hours #> trend = 168 observations per 1 week # ---- GROUPS ---- m4_hourly %>% group_by(id) %>% plot_stl_diagnostics( date, value, .feature_set = c(\"observed\", \"season\", \"trend\"), .interactive = FALSE) #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days #> frequency = 24 observations per 1 day #> trend = 336 observations per 14 days"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":null,"dir":"Reference","previous_headings":"","what":"Interactive Plotting for One or More Time Series — plot_time_series","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"workhorse time-series plotting function generates interactive plotly plots, consolidates 20+ lines ggplot2 code, scales well many time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"","code":"plot_time_series( .data, .date_var, .value, .color_var = NULL, .facet_vars = NULL, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free_y\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .y_intercept = NULL, .y_intercept_color = \"#2c3e50\", .x_intercept = NULL, .x_intercept_color = \"#2c3e50\", .smooth = TRUE, .smooth_period = \"auto\", .smooth_message = FALSE, .smooth_span = NULL, .smooth_degree = 2, .smooth_color = \"#3366FF\", .smooth_size = 1, .smooth_alpha = 1, .legend_show = TRUE, .title = \"Time Series Plot\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Legend\", .interactive = TRUE, .plotly_slider = FALSE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .color_var categorical column can used change line color .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. Overrided .color_var specified. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .y_intercept Value y-intercept plot .y_intercept_color Color y-intercept .x_intercept Value x-intercept plot .x_intercept_color Color x-intercept .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .smooth_period Number observations include Loess Smoother. Set \"auto\" default, uses tk_get_trend() determine logical trend cycle. .smooth_message Logical. Whether return trend selected message. Useful want see .smooth_period selected. .smooth_span Percentage observations include Loess Smoother. can use either period span. See smooth_vec(). .smooth_degree Flexibility Loess Polynomial. Either 0, 1, 2 (0 = lest flexible, 2 = flexible). .smooth_color Smoother line color .smooth_size Smoother line size .smooth_alpha Smoother alpha (opacity). Range: (0, 1). .legend_show Toggles /Legend .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .color_lab Legend label color_var used. .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly date range slider. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"plot_time_series() scalable function works ungrouped grouped data.frame objects (tibbles!). Interactive Default plot_time_series() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series(.facet_vars) - can manually supply facets well. Can Transform Values just like ggplot .values argument accepts transformations just like ggplot2. example, want take log sales can use call like plot_time_series(date, log(sales)) log transformation applied. Smoother Period / Span Calculation .smooth = TRUE option returns smoother calculated based either: .smooth_period: Number observations .smooth_span: percentage observations default, .smooth_period automatically calculated using 75% observertions. geom_smooth(method = \"loess\", span = 0.75). user can specify time-based window (e.g. .smooth_period = \"1 year\") numeric value (e.g. smooth_period = 365). Time-based windows return median number observations window using tk_get_trend().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interactive Plotting for One or More Time Series — plot_time_series","text":"","code":"library(dplyr) library(lubridate) #> #> Attaching package: ‘lubridate’ #> The following objects are masked from ‘package:base’: #> #> date, intersect, setdiff, union library(timetk) # Works with individual time series FANG %>% filter(symbol == \"FB\") %>% plot_time_series(date, adjusted, .interactive = FALSE) # Works with groups FANG %>% group_by(symbol) %>% plot_time_series(date, adjusted, .facet_ncol = 2, # 2-column layout .interactive = FALSE) # Can also group inside & use .color_var FANG %>% mutate(year = year(date)) %>% plot_time_series(date, adjusted, .facet_vars = c(symbol, year), # add groups/facets .color_var = year, # color by year .facet_ncol = 4, .facet_scales = \"free\", .facet_collapse = TRUE, # combine group strip text into 1 line .interactive = FALSE) # Can apply transformations to .value or .color_var # - .value = log(adjusted) # - .color_var = year(date) FANG %>% plot_time_series(date, log(adjusted), .color_var = year(date), .facet_vars = contains(\"symbol\"), .facet_ncol = 2, .facet_scales = \"free\", .y_lab = \"Log Scale\", .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Interactive Time Series Box Plots — plot_time_series_boxplot","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"boxplot function generates interactive plotly plots time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"","code":"plot_time_series_boxplot( .data, .date_var, .value, .period, .color_var = NULL, .facet_vars = NULL, .facet_ncol = 1, .facet_nrow = 1, .facet_scales = \"free_y\", .facet_dir = \"h\", .facet_collapse = FALSE, .facet_collapse_sep = \" \", .facet_strip_remove = FALSE, .line_color = \"#2c3e50\", .line_size = 0.5, .line_type = 1, .line_alpha = 1, .y_intercept = NULL, .y_intercept_color = \"#2c3e50\", .smooth = TRUE, .smooth_func = ~mean(.x, na.rm = TRUE), .smooth_period = \"auto\", .smooth_message = FALSE, .smooth_span = NULL, .smooth_degree = 2, .smooth_color = \"#3366FF\", .smooth_size = 1, .smooth_alpha = 1, .legend_show = TRUE, .title = \"Time Series Plot\", .x_lab = \"\", .y_lab = \"\", .color_lab = \"Legend\", .interactive = TRUE, .plotly_slider = FALSE, .trelliscope = FALSE, .trelliscope_params = list() )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .period time series unit aggregation boxplot. Examples include: \"1 week\" \"3 years\" \"30 minutes\" .color_var categorical column can used change line color .facet_vars One grouping columns broken ggplot2 facets. can selected using tidyselect() helpers (e.g contains()). .facet_ncol Number facet columns. .facet_nrow Number facet rows (used .trelliscope = TRUE) .facet_scales Control facet x & y-axis ranges. Options include \"fixed\", \"free\", \"free_y\", \"free_x\" .facet_dir direction faceting (\"h\" horizontal, \"v\" vertical). Default \"h\". .facet_collapse Multiple facets included one facet strip instead multiple facet strips. .facet_collapse_sep separator used collapsing facets. .facet_strip_remove Whether remove strip text label facet. .line_color Line color. Overrided .color_var specified. .line_size Line size. .line_type Line type. .line_alpha Line alpha (opacity). Range: (0, 1). .y_intercept Value y-intercept plot .y_intercept_color Color y-intercept .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .smooth_func Defines aggregate .value show smoothed trendline. default ~ mean(.x, na.rm = TRUE), uses lambda function ensure NA values removed. Possible values : function, e.g. mean. purrr-style lambda, e.g. ~ mean(.x, na.rm = TRUE) .smooth_period Number observations include Loess Smoother. Set \"auto\" default, uses tk_get_trend() determine logical trend cycle. .smooth_message Logical. Whether return trend selected message. Useful want see .smooth_period selected. .smooth_span Percentage observations include Loess Smoother. can use either period span. See smooth_vec(). .smooth_degree Flexibility Loess Polynomial. Either 0, 1, 2 (0 = lest flexible, 2 = flexible). .smooth_color Smoother line color .smooth_size Smoother line size .smooth_alpha Smoother alpha (opacity). Range: (0, 1). .legend_show Toggles /Legend .title Title plot .x_lab X-axis label plot .y_lab Y-axis label plot .color_lab Legend label color_var used. .interactive Returns either static (ggplot2) visualization interactive (plotly) visualization .plotly_slider TRUE, returns plotly date range slider. .trelliscope Returns either normal plot trelliscopejs plot (great many time series) Must trelliscopejs installed. .trelliscope_params Pass parameters trelliscopejs::facet_trelliscope() function list(). parameters passed : ncol: use .facet_ncol nrow: use .facet_nrow scales: use facet_scales as_plotly: use .interactive","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"plot_time_series_boxplot() scalable function works ungrouped grouped data.frame objects (tibbles!). Interactive Default plot_time_series_boxplot() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series_boxplot() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series_boxplot(.facet_vars) - can manually supply facets well. Can Transform Values just like ggplot .values argument accepts transformations just like ggplot2. example, want take log sales can use call like plot_time_series_boxplot(date, log(sales)) log transformation applied. Smoother Period / Span Calculation .smooth = TRUE option returns smoother calculated based either: .smooth_func: method aggregation. Usually aggregation like mean used. purrr-style function syntax can used apply complex functions. .smooth_period: Number observations .smooth_span: percentage observations default, .smooth_period automatically calculated using 75% observertions. geom_smooth(method = \"loess\", span = 0.75). user can specify time-based window (e.g. .smooth_period = \"1 year\") numeric value (e.g. smooth_period = 365). Time-based windows return median number observations window using tk_get_trend().","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_boxplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Interactive Time Series Box Plots — plot_time_series_boxplot","text":"","code":"# \\donttest{ library(dplyr) library(lubridate) library(timetk) # Works with individual time series FANG %>% filter(symbol == \"FB\") %>% plot_time_series_boxplot( date, adjusted, .period = \"3 month\", .interactive = FALSE) # Works with groups FANG %>% group_by(symbol) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .facet_ncol = 2, # 2-column layout .interactive = FALSE) # Can also group inside & use .color_var FANG %>% mutate(year = year(date)) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .facet_vars = c(symbol, year), # add groups/facets .color_var = year, # color by year .facet_ncol = 4, .facet_scales = \"free\", .interactive = FALSE) # Can apply transformations to .value or .color_var # - .value = log(adjusted) # - .color_var = year(date) FANG %>% plot_time_series_boxplot( date, log(adjusted), .period = \"3 months\", .color_var = year(date), .facet_vars = contains(\"symbol\"), .facet_ncol = 2, .facet_scales = \"free\", .y_lab = \"Log Scale\", .interactive = FALSE) # Can adjust the smoother FANG %>% group_by(symbol) %>% plot_time_series_boxplot( date, adjusted, .period = \"3 months\", .smooth = TRUE, .smooth_func = median, # Smoother function .smooth_period = \"5 years\", # Smoother Period .facet_ncol = 2, .interactive = FALSE) # }"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"plot_time_series_cv_plan() function provides visualization time series resample specification (rset) either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"","code":"plot_time_series_cv_plan( .data, .date_var, .value, ..., .smooth = FALSE, .title = \"Time Series Cross Validation Plan\" )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":".data time series resample specification either rolling_origin time_series_cv class data frame (tibble) prepared using tk_time_series_cv_plan(). .date_var column containing either date date-time values .value column containing numeric values ... Additional parameters passed plot_time_series() .smooth Logical - Whether include trendline smoother. Uses See smooth_vec() apply LOESS smoother. .title Title plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"Returns static ggplot interactive plotly object depending whether .interactive FALSE TRUE, respectively.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"Resample Set resample set output timetk::time_series_cv() function rsample::rolling_origin() function.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_cv_plan.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize a Time Series Resample Plan — plot_time_series_cv_plan","text":"","code":"library(dplyr) library(rsample) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) resample_spec <- time_series_cv( FB_tbl, initial = \"1 year\", assess = \"6 weeks\", skip = \"3 months\", lag = \"1 month\", cumulative = FALSE, slice_limit = 6 ) #> Using date_var: date resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 1,812 × 5 #> .id .key symbol date adjusted #> #> 1 Slice1 training FB 2015-11-19 106. #> 2 Slice1 training FB 2015-11-20 107. #> 3 Slice1 training FB 2015-11-23 107. #> 4 Slice1 training FB 2015-11-24 106. #> 5 Slice1 training FB 2015-11-25 105. #> 6 Slice1 training FB 2015-11-27 105. #> 7 Slice1 training FB 2015-11-30 104. #> 8 Slice1 training FB 2015-12-01 107. #> 9 Slice1 training FB 2015-12-02 106. #> 10 Slice1 training FB 2015-12-03 104. #> # ℹ 1,802 more rows resample_spec %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan( date, adjusted, # date variable and value variable # Additional arguments passed to plot_time_series(), .facet_ncol = 2, .line_alpha = 0.5, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"wrapper stats::lm() overlays linear regression fitted model time series, can help show effect feature engineering","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"","code":"plot_time_series_regression( .data, .date_var, .formula, .show_summary = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .formula linear regression formula. left-hand side formula used y-axis value. right-hand side formula used develop linear regression model. See stats::lm() details. .show_summary TRUE, prints summary.lm(). ... Additional arguments passed plot_time_series()","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"static ggplot2 plot interactive plotly plot","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"plot_time_series_regression() scalable function works ungrouped grouped data.frame objects (tibbles!). Time Series Formula .formula uses stats::lm() apply linear regression, used visualize effect feature engineering time series. left-hand side formula used y-axis value. right-hand side formula used develop linear regression model. Interactive Default plot_time_series_regression() built exploration using: Interactive Plots: plotly (default) - Great exploring! Static Plots: ggplot2 (set .interactive = FALSE) - Great PDF Reports default, interactive plotly visualization returned. Scalable Facets & Dplyr Groups plot_time_series_regression() returns multiple time series plots using ggplot2 facets: group_by() - groups detected, multiple facets returned plot_time_series_regression(.facet_vars) - can manually supply facets well.","code":""},{"path":"https://business-science.github.io/timetk/reference/plot_time_series_regression.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Visualize a Time Series Linear Regression Formula — plot_time_series_regression","text":"","code":"library(dplyr) library(lubridate) # ---- SINGLE SERIES ---- m4_monthly %>% filter(id == \"M750\") %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .show_summary = TRUE, .facet_ncol = 2, .interactive = FALSE ) #> #> Call: #> stats::lm(formula = .formula, data = df) #> #> Residuals: #> Min 1Q Median 3Q Max #> -0.12770 -0.05159 -0.01753 0.05142 0.17828 #> #> Coefficients: #> Estimate Std. Error t value Pr(>|t|) #> (Intercept) 8.407e+00 1.651e-02 509.199 < 2e-16 *** #> as.numeric(date) 5.679e-05 1.348e-06 42.118 < 2e-16 *** #> month(date, label = TRUE).L -3.584e-02 1.256e-02 -2.854 0.004625 ** #> month(date, label = TRUE).Q 7.509e-02 1.256e-02 5.979 6.51e-09 *** #> month(date, label = TRUE).C 7.879e-02 1.256e-02 6.273 1.27e-09 *** #> month(date, label = TRUE)^4 -4.931e-02 1.256e-02 -3.926 0.000108 *** #> month(date, label = TRUE)^5 -7.964e-02 1.256e-02 -6.341 8.61e-10 *** #> month(date, label = TRUE)^6 1.215e-02 1.256e-02 0.967 0.334270 #> month(date, label = TRUE)^7 5.196e-02 1.256e-02 4.137 4.60e-05 *** #> month(date, label = TRUE)^8 1.200e-02 1.256e-02 0.955 0.340143 #> month(date, label = TRUE)^9 -3.433e-02 1.256e-02 -2.733 0.006652 ** #> month(date, label = TRUE)^10 -1.566e-02 1.256e-02 -1.247 0.213483 #> month(date, label = TRUE)^11 1.182e-02 1.256e-02 0.941 0.347375 #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #> #> Residual standard error: 0.06341 on 293 degrees of freedom #> Multiple R-squared: 0.8695,\tAdjusted R-squared: 0.8641 #> F-statistic: 162.6 on 12 and 293 DF, p-value: < 2.2e-16 #> # ---- GROUPED SERIES ---- m4_monthly %>% group_by(id) %>% plot_time_series_regression( .date_var = date, .formula = log(value) ~ as.numeric(date) + month(date, label = TRUE), .facet_ncol = 2, .interactive = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"Recipe-adjacent packages always list required package steps can function properly within parallel processing schemes.","code":""},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"","code":"# S3 method for step_box_cox required_pkgs(x, ...) # S3 method for step_diff required_pkgs(x, ...) # S3 method for step_fourier required_pkgs(x, ...) # S3 method for step_holiday_signature required_pkgs(x, ...) # S3 method for step_log_interval required_pkgs(x, ...) # S3 method for step_slidify required_pkgs(x, ...) # S3 method for step_slidify_augment required_pkgs(x, ...) # S3 method for step_smooth required_pkgs(x, ...) # S3 method for step_timeseries_signature required_pkgs(x, ...) # S3 method for step_ts_clean required_pkgs(x, ...) # S3 method for step_ts_impute required_pkgs(x, ...) # S3 method for step_ts_pad required_pkgs(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"x recipe step","code":""},{"path":"https://business-science.github.io/timetk/reference/required_pkgs.timetk.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for tracking which additional packages are needed for steps. — required_pkgs.step_box_cox","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":null,"dir":"Reference","previous_headings":"","what":"Apply slice inside periods (windows) — slice_period","title":"Apply slice inside periods (windows) — slice_period","text":"Applies dplyr slice inside time-based period (window).","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Apply slice inside periods (windows) — slice_period","text":"","code":"slice_period(.data, ..., .date_var, .period = \"1 day\")"},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Apply slice inside periods (windows) — slice_period","text":".data tbl object data.frame ... slice(): Integer row values. Provide either positive values keep, negative values drop. values provided must either positive negative. Indices beyond number rows input silently ignored. slice_*(), arguments passed methods. .date_var column containing date date-time values. missing, attempts auto-detect date column. .period period slice within. Time units grouped using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed: \"1 year\" \"2 months\" \"30 seconds\"","code":""},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Apply slice inside periods (windows) — slice_period","text":"tibble data.frame","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slice_period.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Apply slice inside periods (windows) — slice_period","text":"","code":"# Libraries library(timetk) library(dplyr) # First 5 observations in each month m4_daily %>% group_by(id) %>% slice_period(1:5, .period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 1,612 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-03 2076. #> 2 D10 2014-07-04 2073. #> 3 D10 2014-07-05 2049. #> 4 D10 2014-07-06 2049. #> 5 D10 2014-07-07 2006. #> 6 D10 2014-08-01 1923. #> 7 D10 2014-08-02 1957. #> 8 D10 2014-08-03 1956. #> 9 D10 2014-08-04 1999. #> 10 D10 2014-08-05 2003. #> # ℹ 1,602 more rows # Last observation in each month m4_daily %>% group_by(id) %>% slice_period(n(), .period = \"1 month\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows"},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a rolling (sliding) version of any function — slidify","title":"Create a rolling (sliding) version of any function — slidify","text":"slidify returns rolling (sliding) version input function, rolling (sliding) .period specified user.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a rolling (sliding) version of any function — slidify","text":"","code":"slidify( .f, .period = 1, .align = c(\"center\", \"left\", \"right\"), .partial = FALSE, .unlist = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a rolling (sliding) version of any function — slidify","text":".f function, formula, vector (necessarily atomic). function, used . formula, e.g. ~ .x + 2, converted function. three ways refer arguments: single argument function, use . two argument function, use .x .y arguments, use ..1, ..2, ..3 etc syntax allows create compact anonymous functions. Note formula functions conceptually take dots (can use ..1 etc). silently ignore additional arguments used formula expression. character vector, numeric vector, list, converted extractor function. Character vectors index name numeric vectors index position; use list index position name different levels. component present, value .default returned. .period period size roll .align One \"center\", \"left\" \"right\". .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. .unlist function returns single value time called, use .unlist = TRUE. function returns one value, complicated object (like linear model), use .unlist = FALSE create list-column rolling results.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a rolling (sliding) version of any function — slidify","text":"function rolling/sliding conversion applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create a rolling (sliding) version of any function — slidify","text":"slidify() function almost identical tibbletime::rollify() 3 improvements: Alignment (\"center\", \"left\", \"right\") Partial windows allowed Uses slider hood, improves speed reliability implementing code C++ level Make function Sliding (Rolling) Function slidify() turns function sliding version use inside call dplyr::mutate(), however works equally well called purrr::map(). intended use dplyr::mutate(), slidify creates function always returns output length input Alignment Rolling / Sliding functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: center (default): NA .partial values divided added beginning end series \"Center\" moving average. common Time Series applications (e.g. denoising). left: NA .partial values added end shift series Left. right: NA .partial values added beginning shift series Right. common Financial Applications (e.g moving average cross-overs). Allowing Partial Windows key improvement tibbletime::slidify() timetk::slidify() implements .partial rolling windows. Just set .partial = TRUE.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create a rolling (sliding) version of any function — slidify","text":"Tibbletime R Package Davis Vaughan, includes original rollify() Function","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a rolling (sliding) version of any function — slidify","text":"","code":"library(dplyr) library(tidyr) library(stringr) library(timetk) FB <- FANG %>% filter(symbol == \"FB\") # --- ROLLING MEAN (SINGLE ARG EXAMPLE) --- # Turn the normal mean function into a rolling mean with a 5 row .period mean_roll_5 <- slidify(mean, .period = 5, .align = \"right\") FB %>% mutate(rolling_mean_5 = mean_roll_5(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted rolling_mean_5 #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.6 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # Use `partial = TRUE` to allow partial windows (those with less than the full .period) mean_roll_5_partial <- slidify(mean, .period = 5, .align = \"right\", .partial = TRUE) FB %>% mutate(rolling_mean_5 = mean_roll_5_partial(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted rolling_mean_5 #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 28 #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 27.9 #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 28.2 #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 28.5 #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.6 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # There's nothing stopping you from combining multiple rolling functions with # different .period sizes in the same mutate call mean_roll_10 <- slidify(mean, .period = 10, .align = \"right\") FB %>% select(symbol, date, adjusted) %>% mutate( rolling_mean_5 = mean_roll_5(adjusted), rolling_mean_10 = mean_roll_10(adjusted) ) #> # A tibble: 1,008 × 5 #> symbol date adjusted rolling_mean_5 rolling_mean_10 #> #> 1 FB 2013-01-02 28 NA NA #> 2 FB 2013-01-03 27.8 NA NA #> 3 FB 2013-01-04 28.8 NA NA #> 4 FB 2013-01-07 29.4 NA NA #> 5 FB 2013-01-08 29.1 28.6 NA #> 6 FB 2013-01-09 30.6 29.1 NA #> 7 FB 2013-01-10 31.3 29.8 NA #> 8 FB 2013-01-11 31.7 30.4 NA #> 9 FB 2013-01-14 31.0 30.7 NA #> 10 FB 2013-01-15 30.1 30.9 29.8 #> # ℹ 998 more rows # For summary operations like rolling means, we can accomplish large-scale # multi-rolls with tk_augment_slidify() FB %>% select(symbol, date, adjusted) %>% tk_augment_slidify( adjusted, .period = 5:10, .f = mean, .align = \"right\", .names = str_c(\"MA_\", 5:10) ) #> # A tibble: 1,008 × 9 #> symbol date adjusted MA_5 MA_6 MA_7 MA_8 MA_9 MA_10 #> #> 1 FB 2013-01-02 28 NA NA NA NA NA NA #> 2 FB 2013-01-03 27.8 NA NA NA NA NA NA #> 3 FB 2013-01-04 28.8 NA NA NA NA NA NA #> 4 FB 2013-01-07 29.4 NA NA NA NA NA NA #> 5 FB 2013-01-08 29.1 28.6 NA NA NA NA NA #> 6 FB 2013-01-09 30.6 29.1 28.9 NA NA NA NA #> 7 FB 2013-01-10 31.3 29.8 29.5 29.3 NA NA NA #> 8 FB 2013-01-11 31.7 30.4 30.1 29.8 29.6 NA NA #> 9 FB 2013-01-14 31.0 30.7 30.5 30.3 29.9 29.7 NA #> 10 FB 2013-01-15 30.1 30.9 30.6 30.4 30.2 30.0 29.8 #> # ℹ 998 more rows # --- GROUPS AND ROLLING ---- # One of the most powerful things about this is that it works with # groups since `mutate` is being used data(FANG) mean_roll_3 <- slidify(mean, .period = 3, .align = \"right\") FANG %>% group_by(symbol) %>% mutate(mean_roll = mean_roll_3(adjusted)) %>% slice(1:5) #> # A tibble: 20 × 9 #> # Groups: symbol [4] #> symbol date open high low close volume adjusted mean_roll #> #> 1 AMZN 2013-01-02 256. 258. 253. 257. 3271000 257. NA #> 2 AMZN 2013-01-03 257. 261. 256. 258. 2750900 258. NA #> 3 AMZN 2013-01-04 258. 260. 257. 259. 1874200 259. 258. #> 4 AMZN 2013-01-07 263. 270. 263. 268. 4910000 268. 262. #> 5 AMZN 2013-01-08 267. 269. 264. 266. 3010700 266. 265. #> 6 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 7 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 8 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 28.2 #> 9 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 28.6 #> 10 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 29.1 #> 11 GOOG 2013-01-02 719. 727. 717. 723. 5101500 361. NA #> 12 GOOG 2013-01-03 725. 732. 721. 724. 4653700 361. NA #> 13 GOOG 2013-01-04 729. 741. 728. 738. 5547600 369. 364. #> 14 GOOG 2013-01-07 735. 739. 731. 735. 3323800 367. 366. #> 15 GOOG 2013-01-08 736. 736. 724. 733. 3364700 366. 367. #> 16 NFLX 2013-01-02 95.2 95.8 90.7 92.0 19431300 13.1 NA #> 17 NFLX 2013-01-03 92.0 97.9 91.5 96.6 27912500 13.8 NA #> 18 NFLX 2013-01-04 96.5 97.7 95.5 96.0 17761100 13.7 13.6 #> 19 NFLX 2013-01-07 96.4 102. 96.1 99.2 45550400 14.2 13.9 #> 20 NFLX 2013-01-08 100. 101. 96.8 97.2 24714900 13.9 13.9 # --- ROLLING CORRELATION (MULTIPLE ARG EXAMPLE) --- # With 2 args, use the purrr syntax of ~ and .x, .y # Rolling correlation example cor_roll <- slidify(~cor(.x, .y), .period = 5, .align = \"right\") FB %>% mutate(running_cor = cor_roll(adjusted, open)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted running_cor #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 0.749 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 0.805 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 0.859 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 0.884 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 0.667 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 0.379 #> # ℹ 998 more rows # With >2 args, create an anonymous function with >2 args or use # the purrr convention of ..1, ..2, ..3 to refer to the arguments avg_of_avgs <- slidify( function(x, y, z) (mean(x) + mean(y) + mean(z)) / 3, .period = 10, .align = \"right\" ) # Or avg_of_avgs <- slidify( ~(mean(..1) + mean(..2) + mean(..3)) / 3, .period = 10, .align = \"right\" ) FB %>% mutate(avg_of_avgs = avg_of_avgs(open, high, low)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted avg_of_avgs #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 NA #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 NA #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 NA #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 NA #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 NA #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 29.7 #> # ℹ 998 more rows # Optional arguments MUST be passed at the creation of the rolling function # Only data arguments that are \"rolled over\" are allowed when calling the # rolling version of the function FB$adjusted[1] <- NA roll_mean_na_rm <- slidify(~mean(.x, na.rm = TRUE), .period = 5, .align = \"right\") FB %>% mutate(roll_mean = roll_mean_na_rm(adjusted)) #> # A tibble: 1,008 × 9 #> symbol date open high low close volume adjusted roll_mean #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 NA NA #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 NA #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 NA #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 NA #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 28.8 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 29.1 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 29.8 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 30.4 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 30.7 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 30.9 #> # ℹ 998 more rows # --- ROLLING REGRESSIONS ---- # Rolling regressions are easy to implement using `.unlist = FALSE` lm_roll <- slidify(~lm(.x ~ .y), .period = 90, .unlist = FALSE, .align = \"right\") FB %>% drop_na() %>% mutate(numeric_date = as.numeric(date)) %>% mutate(rolling_lm = lm_roll(adjusted, numeric_date)) %>% filter(!is.na(rolling_lm)) #> # A tibble: 918 × 10 #> symbol date open high low close volume adjusted numeric_date #> #> 1 FB 2013-05-13 26.6 27.3 26.5 26.8 29068800 26.8 15838 #> 2 FB 2013-05-14 26.9 27.3 26.8 27.1 24930300 27.1 15839 #> 3 FB 2013-05-15 26.9 27.0 26.4 26.6 30299800 26.6 15840 #> 4 FB 2013-05-16 26.5 26.5 25.9 26.1 35499100 26.1 15841 #> 5 FB 2013-05-17 26.4 26.6 26.2 26.2 29462700 26.2 15842 #> 6 FB 2013-05-20 26.2 26.2 25.7 25.8 42402900 25.8 15845 #> 7 FB 2013-05-21 25.9 26.1 25.6 25.7 26261300 25.7 15846 #> 8 FB 2013-05-22 25.6 25.8 24.9 25.2 45314500 25.2 15847 #> 9 FB 2013-05-23 24.8 25.5 24.8 25.1 37663100 25.1 15848 #> 10 FB 2013-05-24 25.0 25.0 24.1 24.3 58727900 24.3 15849 #> # ℹ 908 more rows #> # ℹ 1 more variable: rolling_lm "},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Rolling Window Transformation — slidify_vec","title":"Rolling Window Transformation — slidify_vec","text":"slidify_vec() applies summary function rolling sequence windows.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Rolling Window Transformation — slidify_vec","text":"","code":"slidify_vec( .x, .f, ..., .period = 1, .align = c(\"center\", \"left\", \"right\"), .partial = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Rolling Window Transformation — slidify_vec","text":".x vector rolling window transformation applied. .f summary [function / formula] function, e.g. mean, function used additional arguments, .... formula, e.g. ~ mean(., na.rm = TRUE), converted function. syntax allows create compact anonymous functions. ... Additional arguments passed .f function. .period number periods include local rolling window. effectively \"window size\". .align One \"center\", \"left\" \"right\". .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Rolling Window Transformation — slidify_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Rolling Window Transformation — slidify_vec","text":"slidify_vec() function wrapper slider::slide_vec() parameters simplified \"center\", \"left\", \"right\" alignment. Vector Length == Vector Length NA values .partial values always returned ensure length return vector length incoming vector. ensures easier use dplyr::mutate(). Alignment Rolling functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using .partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative smooth_vec(), implements local polynomial regression.","code":""},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Rolling Window Transformation — slidify_vec","text":"Slider R Package Davis Vaughan","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/slidify_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Rolling Window Transformation — slidify_vec","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # ---- FUNCTION FORMAT ---- # - The `.f = mean` function is used. Argument `na.rm = TRUE` is passed as ... FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .period = 30, .f = mean, na.rm = TRUE, .align = \"center\")) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") #> Warning: Removed 29 rows containing missing values (`geom_line()`). # ---- FORMULA FORMAT ---- # - Anonymous function `.f = ~ mean(., na.rm = TRUE)` is used FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .period = 30, .f = ~ mean(., na.rm = TRUE), .align = \"center\")) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") #> Warning: Removed 29 rows containing missing values (`geom_line()`). # ---- PARTIAL VALUES ---- # - set `.partial = TRUE` FB_tbl %>% mutate(adjusted_30_ma = slidify_vec( .x = adjusted, .f = ~ mean(., na.rm = TRUE), .period = 30, .align = \"center\", .partial = TRUE)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30_ma), color = \"blue\") # ---- Loess vs Moving Average ---- # - Loess: Using `.degree = 0` to make less flexible. Comparable to a moving average. FB_tbl %>% mutate( adjusted_loess_30 = smooth_vec(adjusted, period = 30, degree = 0), adjusted_ma_30 = slidify_vec(adjusted, .f = mean, .period = 30, .partial = TRUE) ) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_loess_30), color = \"red\") + geom_line(aes(y = adjusted_ma_30), color = \"blue\") + labs(title = \"Loess vs Moving Average\")"},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Smoothing Transformation using Loess — smooth_vec","title":"Smoothing Transformation using Loess — smooth_vec","text":"smooth_vec() applies LOESS transformation numeric vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Smoothing Transformation using Loess — smooth_vec","text":"","code":"smooth_vec(x, period = 30, span = NULL, degree = 2)"},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Smoothing Transformation using Loess — smooth_vec","text":"x numeric vector smoothing transformation applied. period number periods include local smoothing. Similar window size moving average. See details explanation period vs span specification. span span percentage data included smoothing window. Period preferred shorter windows fix window size. See details explanation period vs span specification. degree degree polynomials used. Accetable values (least flexible): 0, 1, 2. Set 2 default 2nd order polynomial (flexible).","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Smoothing Transformation using Loess — smooth_vec","text":"numeric vector","code":""},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Smoothing Transformation using Loess — smooth_vec","text":"Benefits: using period, effect similar moving average without creating missing values. using span, effect detect trend series using percentage total number observations. Loess Smoother Algorithm function simplified wrapper stats::loess() modification set fixed period rather percentage data points via span. Period vs Span? period fixed whereas span changes number observations change. use Period? effect using period similar Moving Average Window Size Fixed Period. helps trying smooth local trends. want 30-day moving average, specify period = 30. use Span? Span easier specify want Long-Term Trendline window size unknown. can specify span = 0.75 locally regress using window 75% data.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/smooth_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Smoothing Transformation using Loess — smooth_vec","text":"","code":"library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # ---- PERIOD ---- FB_tbl %>% mutate(adjusted_30 = smooth_vec(adjusted, period = 30, degree = 2)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30), color = \"red\") # ---- SPAN ---- FB_tbl %>% mutate(adjusted_30 = smooth_vec(adjusted, span = 0.75, degree = 2)) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_30), color = \"red\") # ---- Loess vs Moving Average ---- # - Loess: Using `degree = 0` to make less flexible. Comperable to a moving average. FB_tbl %>% mutate( adjusted_loess_30 = smooth_vec(adjusted, period = 30, degree = 0), adjusted_ma_30 = slidify_vec(adjusted, .period = 30, .f = mean, .partial = TRUE) ) %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(aes(y = adjusted_loess_30), color = \"red\") + geom_line(aes(y = adjusted_ma_30), color = \"blue\") + labs(title = \"Loess vs Moving Average\")"},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Standardization commonly used center scale numeric features prevent one dominating algorithms require data scale.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"","code":"standardize_vec(x, mean = NULL, sd = NULL, silent = FALSE) standardize_inv_vec(x, mean, sd)"},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"x numeric vector. mean mean used invert standardization sd standard deviation used invert standardization process. silent Whether report automated mean sd parameters message.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Returns numeric vector standardization transformation applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"Standardization vs Normalization Standardization refers transformation reduces range mean 0, standard deviation 1 Normalization refers transformation reduces min-max range: (0, 1)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/standardize_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Standardize to Mean 0, Standard Deviation 1 (Center & Scale) — standardize_vec","text":"","code":"library(dplyr) library(timetk) d10_daily <- m4_daily %>% filter(id == \"D10\") # --- VECTOR ---- value_std <- standardize_vec(d10_daily$value) #> Standardization Parameters #> mean: 2261.60682492582 #> standard deviation: 175.603721730477 value <- standardize_inv_vec(value_std, mean = 2261.60682492582, sd = 175.603721730477) # --- MUTATE ---- m4_daily %>% group_by(id) %>% mutate(value_std = standardize_vec(value)) #> Standardization Parameters #> mean: 2261.60682492582 #> standard deviation: 175.603721730477 #> Standardization Parameters #> mean: 9243.15525375268 #> standard deviation: 4663.16194403596 #> Standardization Parameters #> mean: 8259.78634615385 #> standard deviation: 927.592527167825 #> Standardization Parameters #> mean: 8287.72878932316 #> standard deviation: 2456.05840988041 #> # A tibble: 9,743 × 4 #> # Groups: id [4] #> id date value value_std #> #> 1 D10 2014-07-03 2076. -1.06 #> 2 D10 2014-07-04 2073. -1.07 #> 3 D10 2014-07-05 2049. -1.21 #> 4 D10 2014-07-06 2049. -1.21 #> 5 D10 2014-07-07 2006. -1.45 #> 6 D10 2014-07-08 2018. -1.39 #> 7 D10 2014-07-09 2019. -1.38 #> 8 D10 2014-07-10 2007. -1.45 #> 9 D10 2014-07-11 2010 -1.43 #> 10 D10 2014-07-12 2002. -1.48 #> # ℹ 9,733 more rows"},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":null,"dir":"Reference","previous_headings":"","what":"Box-Cox Transformation using Forecast Methods — step_box_cox","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"step_box_cox creates specification recipe step transform data using Box-Cox transformation. function differs recipes::step_BoxCox adding multiple methods including Guerrero lambda optimization handling negative data used Forecast R Package.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"","code":"step_box_cox( recipe, ..., method = c(\"guerrero\", \"loglik\"), limits = c(-1, 2), role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"box_cox\") ) # S3 method for step_box_cox tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. method One \"guerrero\" \"loglik\" limits length 2 numeric vector defining range compute transformation parameter lambda. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained numeric vector transformation values. NULL computed prep(). skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_box_cox object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"step_box_cox() function designed specifically handle time series using methods implemented Forecast R Package. Negative Data function can applied Negative Data. Lambda Optimization Methods function uses 2 methods optimizing lambda selection Forecast R Package: method = \"guerrero\": Guerrero's (1993) method used, lambda minimizes coefficient variation subseries x. method = loglik: value lambda chosen maximize profile log likelihood linear model fitted x. non-seasonal data, linear time trend fitted seasonal data, linear time trend seasonal dummy variables used.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"Guerrero, V.M. (1993) Time-series analysis supported power transformations. Journal Forecasting, 12, 37–48. Box, G. E. P. Cox, D. R. (1964) analysis transformations. JRSS B 26 211–246.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_box_cox.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Box-Cox Transformation using Forecast Methods — step_box_cox","text":"","code":"library(dplyr) library(tidyr) library(recipes) #> #> Attaching package: ‘recipes’ #> The following object is masked from ‘package:stringr’: #> #> fixed #> The following object is masked from ‘package:stats’: #> #> step library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_box_cox(FB, AMZN, NFLX, GOOG) %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,008 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 12.5 8.28 4.92 5.26 #> 2 2013-01-03 12.4 8.28 5.08 5.27 #> 3 2013-01-04 12.7 8.29 5.06 5.28 #> 4 2013-01-07 12.9 8.37 5.17 5.28 #> 5 2013-01-08 12.8 8.35 5.10 5.28 #> 6 2013-01-09 13.3 8.35 5.06 5.28 #> 7 2013-01-10 13.5 8.34 5.13 5.28 #> 8 2013-01-11 13.7 8.36 5.24 5.28 #> 9 2013-01-14 13.4 8.40 5.32 5.26 #> 10 2013-01-15 13.1 8.39 5.26 5.27 #> # ℹ 998 more rows recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.671 box_cox_LIhbt #> 2 AMZN 0.135 box_cox_LIhbt #> 3 NFLX 0.458 box_cox_LIhbt #> 4 GOOG -0.0388 box_cox_LIhbt"},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a differenced predictor — step_diff","title":"Create a differenced predictor — step_diff","text":"step_diff creates specification recipe step add new columns differenced data. Differenced data include NA values difference induced. can removed step_naomit().","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a differenced predictor — step_diff","text":"","code":"step_diff( recipe, ..., role = \"predictor\", trained = FALSE, lag = 1, difference = 1, log = FALSE, prefix = \"diff_\", columns = NULL, skip = FALSE, id = rand_id(\"diff\") ) # S3 method for step_diff tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a differenced predictor — step_diff","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. role Defaults \"predictor\" trained logical indicate quantities preprocessing estimated. lag vector positive integers identifying lags (far back) included differencing calculation. difference number differences perform. log Calculates log differences instead differences. prefix prefix generated column names, default \"diff_\". columns character string variable names populated (eventually) terms argument. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations id character string unique step identify . x step_diff object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a differenced predictor — step_diff","text":"updated version recipe new step added sequence existing steps ().","code":""},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create a differenced predictor — step_diff","text":"step assumes data already proper sequential order lagging.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_diff.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a differenced predictor — step_diff","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) # Make and apply recipe ---- recipe_diff <- recipe(~ ., data = FANG_wide) %>% step_diff(FB, AMZN, NFLX, GOOG, lag = 1:3, difference = 1) %>% prep() recipe_diff %>% bake(FANG_wide) #> # A tibble: 1,008 × 17 #> date FB AMZN NFLX GOOG diff_1_1_FB diff_1_1_AMZN diff_1_1_NFLX #> #> 1 2013-01-02 28 257. 13.1 361. NA NA NA #> 2 2013-01-03 27.8 258. 13.8 361. -0.230 1.17 0.654 #> 3 2013-01-04 28.8 259. 13.7 369. 0.990 0.670 -0.0871 #> 4 2013-01-07 29.4 268. 14.2 367. 0.66 9.31 0.460 #> 5 2013-01-08 29.1 266. 13.9 366. -0.360 -2.08 -0.291 #> 6 2013-01-09 30.6 266. 13.7 369. 1.53 -0.0300 -0.179 #> 7 2013-01-10 31.3 265. 14 370. 0.710 -1.01 0.299 #> 8 2013-01-11 31.7 268. 14.5 370. 0.420 2.60 0.470 #> 9 2013-01-14 31.0 273. 14.8 361. -0.770 4.79 0.309 #> 10 2013-01-15 30.1 272. 14.5 362. -0.850 -0.830 -0.251 #> # ℹ 998 more rows #> # ℹ 9 more variables: diff_1_1_GOOG , diff_2_1_FB , #> # diff_2_1_AMZN , diff_2_1_NFLX , diff_2_1_GOOG , #> # diff_3_1_FB , diff_3_1_AMZN , diff_3_1_NFLX , #> # diff_3_1_GOOG # Get information with tidy ---- recipe_diff %>% tidy() #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step diff TRUE FALSE diff_Sldy6 recipe_diff %>% tidy(1) #> # A tibble: 12 × 5 #> terms lag diff log id #> #> 1 diff_FB_1_1 1 1 FALSE diff_Sldy6 #> 2 diff_AMZN_1_1 1 1 FALSE diff_Sldy6 #> 3 diff_NFLX_1_1 1 1 FALSE diff_Sldy6 #> 4 diff_GOOG_1_1 1 1 FALSE diff_Sldy6 #> 5 diff_FB_2_1 2 1 FALSE diff_Sldy6 #> 6 diff_AMZN_2_1 2 1 FALSE diff_Sldy6 #> 7 diff_NFLX_2_1 2 1 FALSE diff_Sldy6 #> 8 diff_GOOG_2_1 2 1 FALSE diff_Sldy6 #> 9 diff_FB_3_1 3 1 FALSE diff_Sldy6 #> 10 diff_AMZN_3_1 3 1 FALSE diff_Sldy6 #> 11 diff_NFLX_3_1 3 1 FALSE diff_Sldy6 #> 12 diff_GOOG_3_1 3 1 FALSE diff_Sldy6"},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":null,"dir":"Reference","previous_headings":"","what":"Fourier Features for Modeling Seasonality — step_fourier","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"step_fourier creates specification recipe step convert Date Date-time column Fourier series","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"","code":"step_fourier( recipe, ..., period, K, role = \"predictor\", trained = FALSE, columns = NULL, scale_factor = NULL, skip = FALSE, id = rand_id(\"fourier\") ) # S3 method for step_fourier tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"recipe recipe object. step added sequence operations recipe. ... single column class Date POSIXct. See recipes::selections() details. tidy method, currently used. period numeric period oscillation frequency. See details examples period specification. K number orders include sine/cosine fourier series. orders increase number fourier terms therefore variance fitted model expense bias. See details examples K specification. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. scale_factor factor scaling numeric index extracted date date-time feature. placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_fourier object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"step_fourier, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"Date Variable Unlike steps, step_fourier remove original date variables. recipes::step_rm() can used purpose. Period Specification period argument used generate distance peaks fourier sequence. key line peaks unique seasonalities data. Daily Data, typical period specifications : Yearly frequency 365 Quarterly frequency 365 / 4 = 91.25 Monthly frequency 365 / 12 = 30.42 K Specification K argument specifies maximum number orders Fourier terms. Examples: Specifying period = 365 K = 1 return cos365_K1 sin365_K1 fourier series Specifying period = 365 K = 2 return cos365_K1, cos365_K2, sin365_K1 sin365_K2 sequence, tends increase models ability fit vs K = 1 specification (expense possibly overfitting). Multiple values period K possible specify multiple values period single step step_fourier(period = c(91.25, 365), K = 2. returns 8 Fouriers series: cos91.25_K1, sin91.25_K1, cos91.25_K2, sin91.25_K2 cos365_K1, sin365_K1, cos365_K2, sin365_K2","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_fourier.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fourier Features for Modeling Seasonality — step_fourier","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # Create a recipe object with a timeseries signature step # - 252 Trade days per year # - period = c(252/4, 252): Adds quarterly and yearly fourier series # - K = 2: Adds 1st and 2nd fourier orders rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_fourier(date, period = c(252/4, 252), K = 2) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Operations #> • Fourier series features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Fourier series features from: date | Trained # Bake the recipe object - Adds the Fourier Series bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,008 × 11 #> symbol date adjusted date_sin63_K1 date_cos63_K1 date_sin63_K2 #> #> 1 FB 2013-01-02 28 0.912 -0.411 -0.750 #> 2 FB 2013-01-03 27.8 0.866 -0.500 -0.866 #> 3 FB 2013-01-04 28.8 0.812 -0.584 -0.948 #> 4 FB 2013-01-07 29.4 0.604 -0.797 -0.963 #> 5 FB 2013-01-08 29.1 0.521 -0.853 -0.890 #> 6 FB 2013-01-09 30.6 0.434 -0.901 -0.782 #> 7 FB 2013-01-10 31.3 0.342 -0.940 -0.643 #> 8 FB 2013-01-11 31.7 0.247 -0.969 -0.478 #> 9 FB 2013-01-14 31.0 -0.0498 -0.999 0.0996 #> 10 FB 2013-01-15 30.1 -0.149 -0.989 0.295 #> # ℹ 998 more rows #> # ℹ 5 more variables: date_cos63_K2 , date_sin252_K1 , #> # date_cos252_K1 , date_sin252_K2 , date_cos252_K2 # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(prep(rec_obj)) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step fourier TRUE FALSE fourier_be1T3 tidy(prep(rec_obj), number = 1) #> # A tibble: 8 × 5 #> terms type K period id #> #> 1 date_sin63_K1 sin 1 63 fourier_be1T3 #> 2 date_cos63_K1 cos 1 63 fourier_be1T3 #> 3 date_sin63_K2 sin 2 63 fourier_be1T3 #> 4 date_cos63_K2 cos 2 63 fourier_be1T3 #> 5 date_sin252_K1 sin 1 252 fourier_be1T3 #> 6 date_cos252_K1 cos 1 252 fourier_be1T3 #> 7 date_sin252_K2 sin 2 252 fourier_be1T3 #> 8 date_cos252_K2 cos 2 252 fourier_be1T3"},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":null,"dir":"Reference","previous_headings":"","what":"Holiday Feature (Signature) Generator — step_holiday_signature","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"step_holiday_signature creates specification recipe step convert date date-time data many holiday features can aid machine learning time-series data. default, many features returned different holidays, locales, stock exchanges.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"","code":"step_holiday_signature( recipe, ..., holiday_pattern = \".\", locale_set = \"all\", exchange_set = \"all\", role = \"predictor\", trained = FALSE, columns = NULL, features = NULL, skip = FALSE, id = rand_id(\"holiday_signature\") ) # S3 method for step_holiday_signature tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables used create new variables. selected variables class Date POSIXct. See recipes::selections() details. tidy method, currently used. holiday_pattern regular expression pattern search \"Holiday Set\". locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. features character string features generated. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_holiday_signature object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"step_holiday_signature, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"Use Holiday Pattern Feature Sets Pare Features default, going get LOT Features. good thing many machine learning algorithms regularization built . , many cases still want reduce number unnecessary features. : Holiday Pattern: Regular Expression pattern can used filter. Try holiday_pattern = \"(US_Christ)|(US_Thanks)\" return just Christmas Thanksgiving features. Locale Sets: logical whether locale holiday. locales outside US may want combine multiple locales. example, locale_set = c(\"World\", \"GB\") returns World Holidays Great Britain. Exchange Sets: logical whether Business due holiday. Different Stock Exchanges used proxy business holiday calendars. example, exchange_set = \"NYSE\" returns business holidays New York Stock Exchange. Removing Unnecessary Features default, many features created automatically. Unnecessary features can removed using recipes::step_rm() recipes::selections() details.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_holiday_signature.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Holiday Feature (Signature) Generator — step_holiday_signature","text":"","code":"library(recipes) library(timetk) library(tibble) library(dplyr) # Sample Data dates_in_2017_tbl <- tibble( index = tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\") ) # Add US holidays and Non-Working Days due to Holidays # - Physical Holidays are added with holiday pattern (individual) and locale_set rec_holiday <- recipe(~ ., dates_in_2017_tbl) %>% step_holiday_signature(index, holiday_pattern = \"^US_\", locale_set = \"US\", exchange_set = \"NYSE\") # Not yet prep'ed - just returns parameters selected rec_holiday %>% tidy(1) #> # A tibble: 3 × 4 #> terms param value id #> #> 1 index holiday_pattern ^US_ holiday_signature_NrYDb #> 2 index locale_set US holiday_signature_NrYDb #> 3 index exchange_set NYSE holiday_signature_NrYDb # Prep the recipe rec_holiday_prep <- prep(rec_holiday) # Now prep'ed - returns new features that will be created rec_holiday_prep %>% tidy(1) #> # A tibble: 20 × 3 #> terms value id #> #> 1 index exch_NYSE holiday_signature_NrYDb #> 2 index locale_US holiday_signature_NrYDb #> 3 index US_NewYearsDay holiday_signature_NrYDb #> 4 index US_MLKingsBirthday holiday_signature_NrYDb #> 5 index US_InaugurationDay holiday_signature_NrYDb #> 6 index US_LincolnsBirthday holiday_signature_NrYDb #> 7 index US_PresidentsDay holiday_signature_NrYDb #> 8 index US_WashingtonsBirthday holiday_signature_NrYDb #> 9 index US_CPulaskisBirthday holiday_signature_NrYDb #> 10 index US_GoodFriday holiday_signature_NrYDb #> 11 index US_DecorationMemorialDay holiday_signature_NrYDb #> 12 index US_MemorialDay holiday_signature_NrYDb #> 13 index US_JuneteenthNationalIndependenceDay holiday_signature_NrYDb #> 14 index US_IndependenceDay holiday_signature_NrYDb #> 15 index US_LaborDay holiday_signature_NrYDb #> 16 index US_ColumbusDay holiday_signature_NrYDb #> 17 index US_ElectionDay holiday_signature_NrYDb #> 18 index US_VeteransDay holiday_signature_NrYDb #> 19 index US_ThanksgivingDay holiday_signature_NrYDb #> 20 index US_ChristmasDay holiday_signature_NrYDb # Apply the recipe to add new holiday features! bake(rec_holiday_prep, dates_in_2017_tbl) #> # A tibble: 365 × 21 #> index index_exch_NYSE index_locale_US index_US_NewYearsDay #> #> 1 2017-01-01 0 1 1 #> 2 2017-01-02 1 0 0 #> 3 2017-01-03 0 0 0 #> 4 2017-01-04 0 0 0 #> 5 2017-01-05 0 0 0 #> 6 2017-01-06 0 0 0 #> 7 2017-01-07 0 0 0 #> 8 2017-01-08 0 0 0 #> 9 2017-01-09 0 0 0 #> 10 2017-01-10 0 0 0 #> # ℹ 355 more rows #> # ℹ 17 more variables: index_US_MLKingsBirthday , #> # index_US_InaugurationDay , index_US_LincolnsBirthday , #> # index_US_PresidentsDay , index_US_WashingtonsBirthday , #> # index_US_CPulaskisBirthday , index_US_GoodFriday , #> # index_US_MemorialDay , index_US_DecorationMemorialDay , #> # index_US_JuneteenthNationalIndependenceDay , …"},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":null,"dir":"Reference","previous_headings":"","what":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"step_log_interval creates specification recipe step transform data using Log-Inerval transformation. function provides recipes interface log_interval_vec() transformation function.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"","code":"step_log_interval( recipe, ..., limit_lower = \"auto\", limit_upper = \"auto\", offset = 0, role = NA, trained = FALSE, limit_lower_trained = NULL, limit_upper_trained = NULL, skip = FALSE, id = rand_id(\"log_interval\") ) # S3 method for step_log_interval tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. limit_lower lower limit. Must less minimum value. set \"auto\", selects zero. limit_upper upper limit. Must greater maximum value. set \"auto\", selects value 10% greater maximum value. offset offset include log transformation. Useful data contains values less equal zero. role used step since new variables created. trained logical indicate quantities preprocessing estimated. limit_lower_trained numeric vector transformation values. NULL computed prep(). limit_upper_trained numeric vector transformation values. NULL computed prep(). skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_log_interval object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"step_log_interval() function designed specifically handle time series using methods implemented Forecast R Package. Positive Data data includes values zero, use offset adjust series make values positive. Implementation Refer log_interval_vec() function transformation implementation details.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_log_interval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log Interval Transformation for Constrained Interval Forecasting — step_log_interval","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) recipe_log_interval <- recipe(~ ., data = FANG_wide) %>% step_log_interval(FB, AMZN, NFLX, GOOG, offset = 1) %>% prep() #> $FB #> [1] 0 #> #> $FB #> [1] 145.318 #> #> $AMZN #> [1] 0 #> #> $AMZN #> [1] 904.973 #> #> $NFLX #> [1] 0 #> #> $NFLX #> [1] 143.7086 #> #> $GOOG #> [1] 0 #> #> $GOOG #> [1] 860.3125 #> recipe_log_interval %>% bake(FANG_wide) %>% pivot_longer(-date) %>% plot_time_series(date, value, name, .smooth = FALSE, .interactive = FALSE) #> $FB #> [1] 0 #> #> $FB #> [1] 145.318 #> #> $AMZN #> [1] 0 #> #> $AMZN #> [1] 904.973 #> #> $NFLX #> [1] 0 #> #> $NFLX #> [1] 143.7086 #> #> $GOOG #> [1] 0 #> #> $GOOG #> [1] 860.3125 #> recipe_log_interval %>% tidy(1) #> # A tibble: 4 × 5 #> terms limit_lower limit_upper offset id #> #> 1 FB 0 145. 1 log_interval_rnEPA #> 2 AMZN 0 905. 1 log_interval_rnEPA #> 3 NFLX 0 144. 1 log_interval_rnEPA #> 4 GOOG 0 860. 1 log_interval_rnEPA"},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Slidify Rolling Window Transformation — step_slidify","title":"Slidify Rolling Window Transformation — step_slidify","text":"step_slidify creates specification recipe step apply function one Numeric column(s).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Slidify Rolling Window Transformation — step_slidify","text":"","code":"step_slidify( recipe, ..., period, .f, align = c(\"center\", \"left\", \"right\"), partial = FALSE, names = NULL, role = \"predictor\", trained = FALSE, columns = NULL, f_name = NULL, skip = FALSE, id = rand_id(\"slidify\") ) # S3 method for step_slidify tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Slidify Rolling Window Transformation — step_slidify","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local rolling window. effectively \"window size\". .f summary formula one following formats: mean arguments function(x) mean(x, na.rm = TRUE) ~ mean(.x, na.rm = TRUE), converted function. align Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. names optional character string length number terms selected terms. names new columns created step. NULL, existing columns transformed. NULL, new columns created. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. f_name character string function applied. field placeholder populated tidy() step. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_slidify object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Slidify Rolling Window Transformation — step_slidify","text":"step_slidify, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Slidify Rolling Window Transformation — step_slidify","text":"Alignment Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA partial values added end shift series Left. Right: NA partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative step_smooth(), implements local polynomial regression.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Slidify Rolling Window Transformation — step_slidify","text":"","code":"library(recipes) library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # New Data - Make some fake new data next 90 time stamps new_data <- FB_tbl %>% tail(90) %>% mutate(date = date %>% tk_make_future_timeseries(length_out = 90)) # OVERWRITE EXISTING COLUMNS ----- # Create a recipe object with a step_slidify rec_ma_50 <- recipe(adjusted ~ ., data = FB_tbl) %>% step_slidify(adjusted, period = 50, .f = ~ mean(.x)) # Bake the recipe object - Applies the Moving Average Transformation training_data_baked <- bake(prep(rec_ma_50), FB_tbl) # Apply to New Data new_data_baked <- bake(prep(rec_ma_50), new_data) # Visualize effect training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) #> Warning: Removed 49 rows containing missing values (`geom_line()`). #> Warning: Removed 49 rows containing missing values (`geom_line()`). # ---- NEW COLUMNS ---- # Use the `names` argument to create new columns instead of overwriting existing rec_ma_30_names <- recipe(adjusted ~ ., data = FB_tbl) %>% step_slidify(adjusted, period = 30, .f = mean, names = \"adjusted_ma_30\") bake(prep(rec_ma_30_names), FB_tbl) %>% ggplot(aes(date, adjusted)) + geom_line(alpha = 0.5) + geom_line(aes(y = adjusted_ma_30), color = \"red\", size = 1) #> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. #> ℹ Please use `linewidth` instead. #> Warning: Removed 29 rows containing missing values (`geom_line()`)."},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":null,"dir":"Reference","previous_headings":"","what":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"step_slidify_augment creates specification recipe step \"augment\" (add multiple new columns) sliding function applied.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"","code":"step_slidify_augment( recipe, ..., period, .f, align = c(\"center\", \"left\", \"right\"), partial = FALSE, prefix = \"slidify_\", role = \"predictor\", trained = FALSE, columns = NULL, f_name = NULL, skip = FALSE, id = rand_id(\"slidify_augment\") ) # S3 method for step_slidify_augment tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local rolling window. effectively \"window size\". .f summary formula one following formats: mean arguments function(x) mean(x, na.rm = TRUE) ~ mean(.x, na.rm = TRUE), converted function. align Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA .partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA .partial values added end shift series Left. Right: NA .partial values added beginning shif series Right. common Financial Applications moving average cross-overs. partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. prefix prefix generated column names, default \"slidify_\". role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variable names populated (eventually) terms argument. f_name character string function applied. field placeholder populated tidy() step. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations id character string unique step identify . x step_slidify_augment object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"step_slidify_augment, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"Alignment Rolling functions generate period - 1 fewer values incoming vector. Thus, vector needs aligned. Alignment vector follows 3 types: Center: NA partial values divided added beginning end series \"Center\" moving average. common de-noising operations. See also [smooth_vec()] LOESS without NA values. Left: NA partial values added end shift series Left. Right: NA partial values added beginning shif series Right. common Financial Applications moving average cross-overs. Partial Values advantage using partial values vs NA padding series can filled (good time-series de-noising operations). downside partial values partials can become less stable regions incomplete windows used. instability desirable de-noising operations, suitable alternative step_smooth(), implements local polynomial regression.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_slidify_augment.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Slidify Rolling Window Transformation (Augmented Version) — step_slidify_augment","text":"","code":"library(tidymodels) #> ── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ── #> ✔ broom 1.0.5 ✔ purrr 1.0.2 #> ✔ dials 1.2.0 ✔ tune 1.1.2 #> ✔ infer 1.0.5 ✔ workflows 1.1.3 #> ✔ modeldata 1.2.0 ✔ workflowsets 1.0.1 #> ✔ parsnip 1.1.1 ✔ yardstick 1.2.0 #> ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ── #> ✖ purrr::discard() masks scales::discard() #> ✖ dplyr::filter() masks stats::filter() #> ✖ recipes::fixed() masks stringr::fixed() #> ✖ dplyr::lag() masks stats::lag() #> ✖ recipes::step() masks stats::step() #> • Learn how to get started at https://www.tidymodels.org/start/ library(dplyr) library(timetk) m750 <- m4_monthly %>% filter(id == \"M750\") %>% mutate(value_2 = value / 2) m750_splits <- time_series_split(m750, assess = \"2 years\", cumulative = TRUE) #> Using date_var: date # Make a recipe recipe_spec <- recipe(value ~ date + value_2, training(m750_splits)) %>% step_slidify_augment( value, value_2, period = c(6, 12, 24), .f = ~ mean(.x), align = \"center\", partial = FALSE ) recipe_spec %>% prep() %>% juice() #> # A tibble: 282 × 9 #> date value_2 value slidify_6_value slidify_6_value_2 slidify_12_value #> #> 1 1990-01-01 3185 6370 NA NA NA #> 2 1990-02-01 3215 6430 NA NA NA #> 3 1990-03-01 3260 6520 6535 3268. NA #> 4 1990-04-01 3290 6580 6473. 3237. NA #> 5 1990-05-01 3310 6620 6310 3155 NA #> 6 1990-06-01 3345 6690 6303. 3152. 6481. #> 7 1990-07-01 3000 6000 6343. 3172. 6527. #> 8 1990-08-01 2725 5450 6383. 3192. 6567. #> 9 1990-09-01 3240 6480 6427. 3213. 6603. #> 10 1990-10-01 3410 6820 6580 3290 6638. #> # ℹ 272 more rows #> # ℹ 3 more variables: slidify_12_value_2 , slidify_24_value , #> # slidify_24_value_2 bake(prep(recipe_spec), testing(m750_splits)) #> # A tibble: 24 × 9 #> date value_2 value slidify_6_value slidify_6_value_2 slidify_12_value #> #> 1 2013-07-01 4515 9030 NA NA NA #> 2 2013-08-01 4810 9620 NA NA NA #> 3 2013-09-01 5025 10050 10107. 5053. NA #> 4 2013-10-01 5305 10610 10390 5195 NA #> 5 2013-11-01 5380 10760 10563. 5282. NA #> 6 2013-12-01 5285 10570 10705 5352. 10472. #> 7 2014-01-01 5365 10730 10773. 5387. 10498. #> 8 2014-02-01 5330 10660 10803. 5402. 10521. #> 9 2014-03-01 5450 10900 10837. 5418. 10547. #> 10 2014-04-01 5510 11020 10605 5302. 10575 #> # ℹ 14 more rows #> # ℹ 3 more variables: slidify_12_value_2 , slidify_24_value , #> # slidify_24_value_2 "},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":null,"dir":"Reference","previous_headings":"","what":"Smoothing Transformation using Loess — step_smooth","title":"Smoothing Transformation using Loess — step_smooth","text":"step_smooth creates specification recipe step apply local polynomial regression one Numeric column(s). effect smoothing time series similar moving average without creating missing values using partial smoothing.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Smoothing Transformation using Loess — step_smooth","text":"","code":"step_smooth( recipe, ..., period = 30, span = NULL, degree = 2, names = NULL, role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"smooth\") ) # S3 method for step_smooth tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Smoothing Transformation using Loess — step_smooth","text":"recipe recipe object. step added sequence operations recipe. ... One numeric columns smoothed. See recipes::selections() details. tidy method, currently used. period number periods include local smoothing. Similar window size moving average. See details explanation period vs span specification. span span percentage data included smoothing window. Period preferred shorter windows fix window size. See details explanation period vs span specification. degree degree polynomials used. Set 2 default 2nd order polynomial. names optional character string length number terms selected terms. names new columns created step. NULL, existing columns transformed. NULL, new columns created. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_smooth object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Smoothing Transformation using Loess — step_smooth","text":"step_smooth, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Smoothing Transformation using Loess — step_smooth","text":"Smoother Algorithm function recipe specification wraps stats::loess() modification set fixed period rather percentage data points via span. Period vs Span? period fixed whereas span changes number observations change. use Period? effect using period similar Moving Average Window Size Fixed Period. helps trying smooth local trends. want 30-day moving average, specify period = 30. use Span? Span easier specify want Long-Term Trendline window size unknown. can specify span = 0.75 locally regress using window 75% data. Warning - Using Span New Data using span New Data, number observations likely different trained . means trendline / smoother can vastly different smoother trained . Solution Span New Data use span. Rather, use period fix window size. ensures new data includes number observations local polynomial regression (loess) training data.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_smooth.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Smoothing Transformation using Loess — step_smooth","text":"","code":"library(recipes) library(dplyr) library(ggplot2) library(timetk) # Training Data FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) # New Data - Make some fake new data next 90 time stamps new_data <- FB_tbl %>% tail(90) %>% mutate(date = date %>% tk_make_future_timeseries(length_out = 90)) # ---- PERIOD ---- # Create a recipe object with a step_smooth() rec_smooth_period <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, period = 30) # Bake the recipe object - Applies the Loess Transformation training_data_baked <- bake(prep(rec_smooth_period), FB_tbl) # \"Period\" Effect on New Data new_data_baked <- bake(prep(rec_smooth_period), new_data) # Smoother's fit on new data is very similar because # 30 days are used in the new data regardless of the new data being 90 days training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) # ---- SPAN ---- # Create a recipe object with a step_smooth rec_smooth_span <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, span = 0.03) # Bake the recipe object - Applies the Loess Transformation training_data_baked <- bake(prep(rec_smooth_span), FB_tbl) # \"Period\" Effect on New Data new_data_baked <- bake(prep(rec_smooth_span), new_data) #> Warning: span too small. fewer data values than degrees of freedom. #> Warning: pseudoinverse used at 0.555 #> Warning: neighborhood radius 1.445 #> Warning: reciprocal condition number 0 #> Warning: There are other near singularities as well. 2.088 # Smoother's fit is not the same using span because new data is only 90 days # and 0.03 x 90 = 2.7 days training_data_baked %>% ggplot(aes(date, adjusted)) + geom_line() + geom_line(color = \"red\", data = new_data_baked) # ---- NEW COLUMNS ---- # Use the `names` argument to create new columns instead of overwriting existing rec_smooth_names <- recipe(adjusted ~ ., data = FB_tbl) %>% step_smooth(adjusted, period = 30, names = \"adjusted_smooth_30\") %>% step_smooth(adjusted, period = 180, names = \"adjusted_smooth_180\") %>% step_smooth(adjusted, span = 0.75, names = \"long_term_trend\") bake(prep(rec_smooth_names), FB_tbl) %>% ggplot(aes(date, adjusted)) + geom_line(alpha = 0.5) + geom_line(aes(y = adjusted_smooth_30), color = \"red\", size = 1) + geom_line(aes(y = adjusted_smooth_180), color = \"blue\", size = 1) + geom_line(aes(y = long_term_trend), color = \"orange\", size = 1)"},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Feature (Signature) Generator — step_timeseries_signature","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"step_timeseries_signature creates specification recipe step convert date date-time data many features can aid machine learning time-series data","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"","code":"step_timeseries_signature( recipe, ..., role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"timeseries_signature\") ) # S3 method for step_timeseries_signature tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables used create new variables. selected variables class Date POSIXct. See recipes::selections() details. tidy method, currently used. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_timeseries_signature object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"step_timeseries_signature, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"Date Variable Unlike steps, step_timeseries_signature remove original date variables. recipes::step_rm() can used purpose. Scaling index.num index.num feature created large magnitude (number seconds since 1970-01-01). good idea scale center feature (e.g. use recipes::step_normalize()). Removing Unnecessary Features default, many features created automatically. Unnecessary features can removed using recipes::step_rm().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_timeseries_signature.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Feature (Signature) Generator — step_timeseries_signature","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") # Create a recipe object with a timeseries signature step rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_timeseries_signature(date) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 7 #> #> ── Operations #> • Timeseries signature features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 7 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Timeseries signature features from: date | Trained # Bake the recipe object - Adds the Time Series Signature bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,008 × 35 #> symbol date open high low close volume adjusted date_index.num #> #> 1 FB 2013-01-02 27.4 28.2 27.4 28 69846400 28 1357084800 #> 2 FB 2013-01-03 27.9 28.5 27.6 27.8 63140600 27.8 1357171200 #> 3 FB 2013-01-04 28.0 28.9 27.8 28.8 72715400 28.8 1357257600 #> 4 FB 2013-01-07 28.7 29.8 28.6 29.4 83781800 29.4 1357516800 #> 5 FB 2013-01-08 29.5 29.6 28.9 29.1 45871300 29.1 1357603200 #> 6 FB 2013-01-09 29.7 30.6 29.5 30.6 104787700 30.6 1357689600 #> 7 FB 2013-01-10 30.6 31.5 30.3 31.3 95316400 31.3 1357776000 #> 8 FB 2013-01-11 31.3 32.0 31.1 31.7 89598000 31.7 1357862400 #> 9 FB 2013-01-14 32.1 32.2 30.6 31.0 98892800 31.0 1358121600 #> 10 FB 2013-01-15 30.6 31.7 29.9 30.1 173242600 30.1 1358208000 #> # ℹ 998 more rows #> # ℹ 26 more variables: date_year , date_year.iso , date_half , #> # date_quarter , date_month , date_month.xts , #> # date_month.lbl , date_day , date_hour , date_minute , #> # date_second , date_hour12 , date_am.pm , date_wday , #> # date_wday.xts , date_wday.lbl , date_mday , date_qday , #> # date_yday , date_mweek , date_week , date_week.iso , … # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(rec_obj) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step timeseries_signature FALSE FALSE timeseries_signature_MY12H tidy(rec_obj, number = 1) #> # A tibble: 27 × 3 #> terms value id #> #> 1 date index.num timeseries_signature_MY12H #> 2 date year timeseries_signature_MY12H #> 3 date year.iso timeseries_signature_MY12H #> 4 date half timeseries_signature_MY12H #> 5 date quarter timeseries_signature_MY12H #> 6 date month timeseries_signature_MY12H #> 7 date month.xts timeseries_signature_MY12H #> 8 date month.lbl timeseries_signature_MY12H #> 9 date day timeseries_signature_MY12H #> 10 date hour timeseries_signature_MY12H #> # ℹ 17 more rows"},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":null,"dir":"Reference","previous_headings":"","what":"Clean Outliers and Missing Data for Time Series — step_ts_clean","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"step_ts_clean creates specification recipe step clean outliers impute time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"","code":"step_ts_clean( recipe, ..., period = 1, lambda = \"auto\", role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"ts_clean\") ) # S3 method for step_ts_clean tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained named numeric vector lambdas. NULL computed recipes::prep(). Note , original data integers, mean converted integer maintain data type. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_clean object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"step_ts_clean() function designed specifically handle time series using seasonal outlier detection methods implemented Forecast R Package. Cleaning Outliers #' Outliers replaced missing values using following methods: Non-Seasonal (period = 1): Uses stats::supsmu() Seasonal (period > 1): Uses forecast::mstl() robust = TRUE (robust STL decomposition) seasonal series. Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_clean.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clean Outliers and Missing Data for Time Series — step_ts_clean","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) # Get missing values FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: day FANG_wide #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 NA NA NA NA #> 5 2013-01-06 NA NA NA NA #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Apply Imputation recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_ts_clean(FB, AMZN, NFLX, GOOG, period = 252) %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 28.2 262. 14.1 365. #> 5 2013-01-06 28.4 264. 14.6 366. #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Lambda parameter used during imputation process recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.912 ts_clean_uVtKI #> 2 AMZN 0.557 ts_clean_uVtKI #> 3 NFLX 0.532 ts_clean_uVtKI #> 4 GOOG -1.00 ts_clean_uVtKI"},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":null,"dir":"Reference","previous_headings":"","what":"Missing Data Imputation for Time Series — step_ts_impute","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"step_ts_impute creates specification recipe step impute time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"","code":"step_ts_impute( recipe, ..., period = 1, lambda = NULL, role = NA, trained = FALSE, lambdas_trained = NULL, skip = FALSE, id = rand_id(\"ts_impute\") ) # S3 method for step_ts_impute tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"recipe recipe object. step added sequence operations recipe. ... One selector functions choose variables affected step. See selections() details. tidy method, currently used. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection. role used step since new variables created. trained logical indicate quantities preprocessing estimated. lambdas_trained named numeric vector lambdas. NULL computed recipes::prep(). Note , original data integers, mean converted integer maintain data type. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_impute object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected) value (lambda estimate).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"step_ts_impute() function designed specifically handle time series Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_impute.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Missing Data Imputation for Time Series — step_ts_impute","text":"","code":"library(dplyr) library(tidyr) library(recipes) library(timetk) # Get missing values FANG_wide <- FANG %>% select(symbol, date, adjusted) %>% pivot_wider(names_from = symbol, values_from = adjusted) %>% pad_by_time() #> .date_var is missing. Using: date #> pad applied on the interval: day FANG_wide #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 NA NA NA NA #> 5 2013-01-06 NA NA NA NA #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Apply Imputation recipe_box_cox <- recipe(~ ., data = FANG_wide) %>% step_ts_impute(FB, AMZN, NFLX, GOOG, period = 252, lambda = \"auto\") %>% prep() recipe_box_cox %>% bake(FANG_wide) #> # A tibble: 1,459 × 5 #> date FB AMZN NFLX GOOG #> #> 1 2013-01-02 28 257. 13.1 361. #> 2 2013-01-03 27.8 258. 13.8 361. #> 3 2013-01-04 28.8 259. 13.7 369. #> 4 2013-01-05 28.2 262. 14.1 365. #> 5 2013-01-06 28.4 264. 14.6 366. #> 6 2013-01-07 29.4 268. 14.2 367. #> 7 2013-01-08 29.1 266. 13.9 366. #> 8 2013-01-09 30.6 266. 13.7 369. #> 9 2013-01-10 31.3 265. 14 370. #> 10 2013-01-11 31.7 268. 14.5 370. #> # ℹ 1,449 more rows # Lambda parameter used during imputation process recipe_box_cox %>% tidy(1) #> # A tibble: 4 × 3 #> terms lambda id #> #> 1 FB 0.912 ts_impute_uYJSB #> 2 AMZN 0.557 ts_impute_uYJSB #> 3 NFLX 0.532 ts_impute_uYJSB #> 4 GOOG -1.00 ts_impute_uYJSB"},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":null,"dir":"Reference","previous_headings":"","what":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"step_ts_pad creates specification recipe step analyze Date Date-time column adding rows specified interval.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"","code":"step_ts_pad( recipe, ..., by = \"day\", pad_value = NA, role = \"predictor\", trained = FALSE, columns = NULL, skip = FALSE, id = rand_id(\"ts_padding\") ) # S3 method for step_ts_pad tidy(x, ...)"},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"recipe recipe object. step added sequence operations recipe. ... single column class Date POSIXct. See recipes::selections() details. tidy method, currently used. Either \"auto\", time-based frequency like \"year\", \"month\", \"day\", \"hour\", etc, time expression like \"5 min\", \"7 days\". See Details. pad_value Fills padded values. Default NA. role model terms created step, analysis role assigned?. default, function assumes new variable columns created original variables used predictors model. trained logical indicate quantities preprocessing estimated. columns character string variables used inputs. field placeholder populated recipes::prep() used. skip logical. step skipped recipe baked bake.recipe()? operations baked prep.recipe() run, operations may able conducted new data (e.g. processing outcome variable(s)). Care taken using skip = TRUE may affect computations subsequent operations. id character string unique step identify . x step_ts_pad object.","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"step_ts_pad, updated version recipe new step added sequence existing steps (). tidy method, tibble columns terms (selectors variables selected), value (feature names).","code":""},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"Date Variable one date date-time variable may supplied. step_ts_pad()) remove original date variables. Interval Specification () Padding can applied following ways: eight intervals : year, quarter, month, week, day, hour, min, sec. Intervals like 30 minutes, 1 hours, 14 days possible. Imputing Missing Values generic pad_value defaults NA, typically requires imputation. common strategies include: Numeric data: step_ts_impute() preprocessing step can used impute numeric time series data without seasonality Nominal data: step_mode_impute() preprocessing step can used replace missing values common value.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/step_ts_pad.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Pad: Add rows to fill gaps and go from low to high frequency — step_ts_pad","text":"","code":"library(recipes) library(dplyr) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) rec_obj <- recipe(adjusted ~ ., data = FB_tbl) %>% step_ts_pad(date, by = \"day\", pad_value = NA) # View the recipe object rec_obj #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Operations #> • Padded time series features from: date # Prepare the recipe object prep(rec_obj) #> #> ── Recipe ────────────────────────────────────────────────────────────────────── #> #> ── Inputs #> Number of variables by role #> outcome: 1 #> predictor: 2 #> #> ── Training information #> Training data contained 1008 data points and no incomplete rows. #> #> ── Operations #> • Padded time series features from: date | Trained # Bake the recipe object - Adds the padding bake(prep(rec_obj), FB_tbl) #> # A tibble: 1,459 × 3 #> symbol date adjusted #> #> 1 FB 2013-01-02 28 #> 2 FB 2013-01-03 27.8 #> 3 FB 2013-01-04 28.8 #> 4 NA 2013-01-05 NA #> 5 NA 2013-01-06 NA #> 6 FB 2013-01-07 29.4 #> 7 FB 2013-01-08 29.1 #> 8 FB 2013-01-09 30.6 #> 9 FB 2013-01-10 31.3 #> 10 FB 2013-01-11 31.7 #> # ℹ 1,449 more rows # Tidy shows which features have been added during the 1st step # in this case, step 1 is the step_timeseries_signature step tidy(prep(rec_obj)) #> # A tibble: 1 × 6 #> number operation type trained skip id #> #> 1 1 step ts_pad TRUE FALSE ts_padding_IGMKC tidy(prep(rec_obj), number = 1) #> # A tibble: 1 × 4 #> terms by pad_value id #> #> 1 date day NA ts_padding_IGMKC"},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":null,"dir":"Reference","previous_headings":"","what":"Summarise (for Time Series Data) — summarise_by_time","title":"Summarise (for Time Series Data) — summarise_by_time","text":"summarise_by_time() time-based variant popular dplyr::summarise() function uses .date_var specify date date-time column .group calculation groups like \"5 seconds\", \"week\", \"3 months\". summarise_by_time() summarize_by_time() synonyms.","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarise (for Time Series Data) — summarise_by_time","text":"","code":"summarise_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\"), .week_start = NULL ) summarize_by_time( .data, .date_var, .by = \"day\", ..., .type = c(\"floor\", \"ceiling\", \"round\"), .week_start = NULL )"},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarise (for Time Series Data) — summarise_by_time","text":".data tbl object data.frame .date_var column containing date date-time values summarize. missing, attempts auto-detect date column. .time unit summarise . Time units collapsed using lubridate::floor_date() lubridate::ceiling_date(). value can : second minute hour day week month bimonth quarter season halfyear year Arbitrary unique English abbreviations lubridate::period() constructor allowed. ... Name-value pairs summary functions. name name variable result. value can : vector length 1, e.g. min(x), n(), sum(.na(y)). vector length n, e.g. quantile(). data frame, add multiple columns single expression. .type One \"floor\", \"ceiling\", \"round. Defaults \"floor\". See lubridate::round_date. .week_start unit weeks, specify reference day. 7 represents Sunday 1 represents Monday.","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summarise (for Time Series Data) — summarise_by_time","text":"tibble data.frame","code":""},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"useful-summary-functions","dir":"Reference","previous_headings":"","what":"Useful summary functions","title":"Summarise (for Time Series Data) — summarise_by_time","text":"Sum: sum() Center: mean(), median() Spread: sd(), var() Range: min(), max() Count: dplyr::n(), dplyr::n_distinct() Position: dplyr::first(), dplyr::last(), dplyr::nth() Correlation: cor(), cov()","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/summarise_by_time.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summarise (for Time Series Data) — summarise_by_time","text":"","code":"# Libraries library(timetk) library(dplyr) # First value in each month m4_daily %>% group_by(id) %>% summarise_by_time( .date_var = date, .by = \"month\", # Setup for monthly aggregation # Summarization value = first(value) ) #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-01 2076. #> 2 D10 2014-08-01 1923. #> 3 D10 2014-09-01 1908. #> 4 D10 2014-10-01 2049. #> 5 D10 2014-11-01 2133. #> 6 D10 2014-12-01 2244. #> 7 D10 2015-01-01 2351 #> 8 D10 2015-02-01 2286. #> 9 D10 2015-03-01 2291. #> 10 D10 2015-04-01 2396. #> # ℹ 313 more rows # Last value in each month (day is first day of next month with ceiling option) m4_daily %>% group_by(id) %>% summarise_by_time( .by = \"month\", value = last(value), .type = \"ceiling\" ) %>% # Shift to the last day of the month mutate(date = date %-time% \"1 day\") #> .date_var is missing. Using: date #> # A tibble: 323 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-07-31 1917. #> 2 D10 2014-08-31 1921. #> 3 D10 2014-09-30 2024. #> 4 D10 2014-10-31 2130 #> 5 D10 2014-11-30 2217. #> 6 D10 2014-12-31 2328. #> 7 D10 2015-01-31 2210. #> 8 D10 2015-02-28 2293. #> 9 D10 2015-03-31 2392. #> 10 D10 2015-04-30 2368. #> # ℹ 313 more rows # Total each year (.by is set to \"year\" now) m4_daily %>% group_by(id) %>% summarise_by_time( .by = \"year\", value = sum(value) ) #> .date_var is missing. Using: date #> # A tibble: 30 × 3 #> # Groups: id [4] #> id date value #> #> 1 D10 2014-01-01 377389. #> 2 D10 2015-01-01 839533. #> 3 D10 2016-01-01 307401. #> 4 D160 2000-01-01 767500. #> 5 D160 2001-01-01 871497. #> 6 D160 2002-01-01 1464374. #> 7 D160 2003-01-01 3160291. #> 8 D160 2004-01-01 5424860 #> 9 D160 2005-01-01 6127995. #> 10 D160 2006-01-01 3694712. #> # ℹ 20 more rows"},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":null,"dir":"Reference","previous_headings":"","what":"Half-hourly electricity demand — taylor_30_min","title":"Half-hourly electricity demand — taylor_30_min","text":"Half-hourly electricity demand England Wales Monday 5 June 2000 Sunday 27 August 2000. Discussed Taylor (2003).","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Half-hourly electricity demand — taylor_30_min","text":"","code":"taylor_30_min"},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Half-hourly electricity demand — taylor_30_min","text":"tibble: 4,032 x 2 date: date-time variable 30-minute increments value: Electricity demand Megawatts","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Half-hourly electricity demand — taylor_30_min","text":"James W Taylor","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Half-hourly electricity demand — taylor_30_min","text":"Taylor, J.W. (2003) Short-term electricity demand forecasting using double seasonal exponential smoothing. Journal Operational Research Society, 54, 799-805.","code":""},{"path":"https://business-science.github.io/timetk/reference/taylor_30_min.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Half-hourly electricity demand — taylor_30_min","text":"","code":"taylor_30_min #> # A tibble: 4,032 × 2 #> date value #> #> 1 2000-06-05 00:00:00 22262 #> 2 2000-06-05 00:30:00 21756 #> 3 2000-06-05 01:00:00 22247 #> 4 2000-06-05 01:30:00 22759 #> 5 2000-06-05 02:00:00 22549 #> 6 2000-06-05 02:30:00 22313 #> 7 2000-06-05 03:00:00 22128 #> 8 2000-06-05 03:30:00 21860 #> 9 2000-06-05 04:00:00 21751 #> 10 2000-06-05 04:30:00 21336 #> # ℹ 4,022 more rows"},{"path":"https://business-science.github.io/timetk/reference/tidyeval.html","id":null,"dir":"Reference","previous_headings":"","what":"Tidy eval helpers — tidyeval","title":"Tidy eval helpers — tidyeval","text":"sym creates symbol string syms creates list symbols character vector. enquo enquos delay execution one several function arguments. enquo() returns single quoted expression, like blueprint delayed computation. enquos() returns list quoted expressions. expr quotes new expression locally. mostly useful build new expressions around arguments captured enquo() enquos(): expr(mean(!!enquo(arg), na.rm = TRUE)). as_name transforms quoted variable name string. Supplying something else quoted variable name error. unlike as_label also returns single string supports kind R object input, including quoted function calls vectors. purpose summarise object single label. label often suitable default name. know quoted expression contains (instance expressions captured enquo() variable name, call function, unquoted constant), use as_label(). know quoted simple variable name, like enforce , use as_name(). learn tidy eval use tools, visit Metaprogramming section Advanced R.","code":""},{"path":"https://business-science.github.io/timetk/reference/tidyeval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tidy eval helpers — tidyeval","text":"Nothing returned. document important functions rlang used internal R package.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":null,"dir":"Reference","previous_headings":"","what":"Add / Subtract (For Time Series) — time_arithmetic","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"easiest way add / subtract period time series date date-time vector.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"","code":"add_time(index, period) subtract_time(index, period) index %+time% period index %-time% period"},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"index date date-time vector. Can also accept character representation. period period add. Accepts character strings like \"5 seconds\", \"2 days\", complex strings like \"1 month 4 days 34 minutes\".","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"date datetime (POSIXct) vector length index time values shifted +/- period.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"convenient wrapper lubridate::period(). Adds subtracts period time-based index. Great : Finding timestamp n-periods future past Shifting time-based index. Note NA values may present dates exist. Period Specification period argument accepts complex strings like: \"1 month 4 days 43 minutes\" \"second = 3, minute = 1, hour = 2, day = 13, week = 1\"","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_arithmetic.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add / Subtract (For Time Series) — time_arithmetic","text":"","code":"library(timetk) # ---- LOCATING A DATE N-PERIODS IN FUTURE / PAST ---- # Forward (Plus Time) \"2021\" %+time% \"1 hour 34 seconds\" #> [1] \"2021-01-01 01:00:34 UTC\" \"2021\" %+time% \"3 months\" #> [1] \"2021-04-01\" \"2021\" %+time% \"1 year 3 months 6 days\" #> [1] \"2022-04-07\" # Backward (Minus Time) \"2021\" %-time% \"1 hour 34 seconds\" #> [1] \"2020-12-31 22:59:26 UTC\" \"2021\" %-time% \"3 months\" #> [1] \"2020-10-01\" \"2021\" %-time% \"1 year 3 months 6 days\" #> [1] \"2019-09-25\" # ---- INDEX SHIFTING ---- index_daily <- tk_make_timeseries(\"2016\", \"2016-02-01\") #> Using by: day # ADD TIME # - Note `NA` values created where a daily dates aren't possible # (e.g. Feb 29 & 30, 2016 doesn't exist). index_daily %+time% \"1 month\" #> Warning: Missing values created during time addition. This can happen if dates do not exist. #> [1] \"2016-02-01\" \"2016-02-02\" \"2016-02-03\" \"2016-02-04\" \"2016-02-05\" #> [6] \"2016-02-06\" \"2016-02-07\" \"2016-02-08\" \"2016-02-09\" \"2016-02-10\" #> [11] \"2016-02-11\" \"2016-02-12\" \"2016-02-13\" \"2016-02-14\" \"2016-02-15\" #> [16] \"2016-02-16\" \"2016-02-17\" \"2016-02-18\" \"2016-02-19\" \"2016-02-20\" #> [21] \"2016-02-21\" \"2016-02-22\" \"2016-02-23\" \"2016-02-24\" \"2016-02-25\" #> [26] \"2016-02-26\" \"2016-02-27\" \"2016-02-28\" \"2016-02-29\" NA #> [31] NA \"2016-03-01\" # Subtracting Time index_daily %-time% \"1 month\" #> [1] \"2015-12-01\" \"2015-12-02\" \"2015-12-03\" \"2015-12-04\" \"2015-12-05\" #> [6] \"2015-12-06\" \"2015-12-07\" \"2015-12-08\" \"2015-12-09\" \"2015-12-10\" #> [11] \"2015-12-11\" \"2015-12-12\" \"2015-12-13\" \"2015-12-14\" \"2015-12-15\" #> [16] \"2015-12-16\" \"2015-12-17\" \"2015-12-18\" \"2015-12-19\" \"2015-12-20\" #> [21] \"2015-12-21\" \"2015-12-22\" \"2015-12-23\" \"2015-12-24\" \"2015-12-25\" #> [26] \"2015-12-26\" \"2015-12-27\" \"2015-12-28\" \"2015-12-29\" \"2015-12-30\" #> [31] \"2015-12-31\" \"2016-01-01\""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Cross Validation — time_series_cv","title":"Time Series Cross Validation — time_series_cv","text":"Create rsample cross validation sets time series. function produces sampling plan starting recent time series observations, rolling backwards. sampling procedure similar rsample::rolling_origin(), places focus cross validation recent time series data.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Cross Validation — time_series_cv","text":"","code":"time_series_cv( data, date_var = NULL, initial = 5, assess = 1, skip = 1, lag = 0, cumulative = FALSE, slice_limit = n(), point_forecast = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Cross Validation — time_series_cv","text":"data data frame. date_var date date-time variable. initial number samples used analysis/modeling initial resample. assess number samples used assessment resample. skip integer indicating many () additional resamples skip thin total amount data points analysis resample. See example . lag value include lag assessment analysis set. useful lagged predictors used training testing. cumulative logical. analysis resample grow beyond size specified initial resample?. slice_limit number slices return. Set dplyr::n(), returns maximum number slices. point_forecast Whether testing set single point forecast forecast horizon. default forecast horizon. Default: FALSE ... currently used.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Cross Validation — time_series_cv","text":"tibble classes time_series_cv, rset, tbl_df, tbl, data.frame. results include column data split objects column called id character string resample identifier.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Cross Validation — time_series_cv","text":"Time-Based Specification initial, assess, skip, lag variables can specified : Numeric: initial = 24 Time-Based Phrases: initial = \"2 years\", data contains date_var (date datetime) Initial (Training Set) Assess (Testing Set) main options, initial assess, control number data points original data analysis (training set) assessment (testing set), respectively. Skip skip enables function use every data point resamples. skip = 1, resampling data sets increment one position. Example: Suppose rows data set consecutive days. Using skip = 7 make analysis data set operate weeks instead days. assessment set size affected option. Lag Lag parameter creates overlap Testing set. needed lagged predictors used. Cumulative vs Sliding Window cumulative = TRUE, initial parameter ignored analysis (training) set grow resampling continues assessment (testing) set size always remain static. cumulative = FALSE, initial parameter fixes analysis (training) set resampling occurs fixed window. Slice Limit controls number slices. slice_limit = 5, recent 5 slices returned. Point Forecast point forecast sometimes desired want forecast value \"4-weeks\" future. can setting following parameters: assess = \"4 weeks\" point_forecast = TRUE Panel Data / Time Series Groups / Overlapping Timestamps Overlapping timestamps occur data one time series group. sometimes called Panel Data Time Series Groups. timestamps duplicated (case \"Panel Data\" \"Time Series Groups\"), resample calculation applies sliding window fixed length dataset. See example using walmart_sales_weekly dataset .","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_series_cv.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Cross Validation — time_series_cv","text":"","code":"library(dplyr) library(timetk) # DATA ---- m750 <- m4_monthly %>% filter(id == \"M750\") # RESAMPLE SPEC ---- resample_spec <- time_series_cv(data = m750, initial = \"6 years\", assess = \"24 months\", skip = \"24 months\", cumulative = FALSE, slice_limit = 3) #> Using date_var: date resample_spec #> # Time Series Cross Validation Plan #> # A tibble: 3 × 2 #> splits id #> #> 1 Slice1 #> 2 Slice2 #> 3 Slice3 # VISUALIZE CV PLAN ---- # Select date and value columns from the tscv diagnostic tool resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 288 × 5 #> .id .key id date value #> #> 1 Slice1 training M750 2007-07-01 8710 #> 2 Slice1 training M750 2007-08-01 8300 #> 3 Slice1 training M750 2007-09-01 8910 #> 4 Slice1 training M750 2007-10-01 9710 #> 5 Slice1 training M750 2007-11-01 9870 #> 6 Slice1 training M750 2007-12-01 9980 #> 7 Slice1 training M750 2008-01-01 9970 #> 8 Slice1 training M750 2008-02-01 9970 #> 9 Slice1 training M750 2008-03-01 10120 #> 10 Slice1 training M750 2008-04-01 10150 #> # ℹ 278 more rows # Plot the date and value columns to see the CV Plan resample_spec %>% plot_time_series_cv_plan(date, value, .interactive = FALSE) # PANEL DATA / TIME SERIES GROUPS ---- # - Time Series Groups are processed using an *ungrouped* data set # - The data has sliding windows applied starting with the beginning of the series # - The seven groups of weekly time series are # processed together for dimensions walmart_tscv <- walmart_sales_weekly %>% time_series_cv( date_var = Date, initial = \"12 months\", assess = \"3 months\", skip = \"3 months\", slice_limit = 4 ) #> Data is not ordered by the 'date_var'. Resamples will be arranged by `Date`. #> Overlapping Timestamps Detected. Processing overlapping time series together using sliding windows. walmart_tscv #> # Time Series Cross Validation Plan #> # A tibble: 4 × 2 #> splits id #> #> 1 Slice1 #> 2 Slice2 #> 3 Slice3 #> 4 Slice4 walmart_tscv %>% plot_time_series_cv_plan(Date, Weekly_Sales, .interactive = FALSE)"},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":null,"dir":"Reference","previous_headings":"","what":"Simple Training/Test Set Splitting for Time Series — time_series_split","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"time_series_split creates resample splits using time_series_cv() returns single split. useful creating single train/test split.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"","code":"time_series_split( data, date_var = NULL, initial = 5, assess = 1, skip = 1, lag = 0, cumulative = FALSE, slice = 1, point_forecast = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"data data frame. date_var date date-time variable. initial number samples used analysis/modeling initial resample. assess number samples used assessment resample. skip integer indicating many () additional resamples skip thin total amount data points analysis resample. See example . lag value include lag assessment analysis set. useful lagged predictors used training testing. cumulative logical. analysis resample grow beyond size specified initial resample?. slice Returns single slice time_series_cv point_forecast Whether testing set single point forecast forecast horizon. default forecast horizon. Default: FALSE ... currently used.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"rsplit object can used training testing functions extract data split.","code":""},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"Time-Based Specification initial, assess, skip, lag variables can specified : Numeric: initial = 24 Time-Based Phrases: initial = \"2 years\", data contains date_var (date datetime) Initial (Training Set) Assess (Testing Set) main options, initial assess, control number data points original data analysis (training set) assessment (testing set), respectively. Skip skip enables function use every data point resamples. skip = 1, resampling data sets increment one position. Example: Suppose rows data set consecutive days. Using skip = 7 make analysis data set operate weeks instead days. assessment set size affected option. Lag Lag parameter creates overlap Testing set. needed lagged predictors used. Cumulative vs Sliding Window cumulative = TRUE, initial parameter ignored analysis (training) set grow resampling continues assessment (testing) set size always remain static. cumulative = FALSE, initial parameter fixes analysis (training) set resampling occurs fixed window. Slice controls slice returned. slice = 1, recent slice returned.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/time_series_split.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Simple Training/Test Set Splitting for Time Series — time_series_split","text":"","code":"library(dplyr) library(timetk) # DATA ---- m750 <- m4_monthly %>% filter(id == \"M750\") # Get the most recent 3 years as testing, and previous 10 years as training m750 %>% time_series_split(initial = \"10 years\", assess = \"3 years\") #> Using date_var: date #> #> <120/36/306> # Skip the most recent 3 years m750 %>% time_series_split( initial = \"10 years\", assess = \"3 years\", skip = \"3 years\", slice = 2 # <- Returns 2nd slice, 3-years back ) #> Using date_var: date #> #> <120/36/306> # Add 1 year lag for testing overlap m750 %>% time_series_split( initial = \"10 years\", assess = \"3 years\", skip = \"3 years\", slice = 2, lag = \"1 year\" # <- Overlaps training/testing by 1 year ) #> Using date_var: date #> #> <120/48/306>"},{"path":"https://business-science.github.io/timetk/reference/timetk.html","id":null,"dir":"Reference","previous_headings":"","what":"timetk: Time Series Analysis in the Tidyverse — timetk","title":"timetk: Time Series Analysis in the Tidyverse — timetk","text":"timetk package combines collection coercion tools time series analysis.","code":""},{"path":"https://business-science.github.io/timetk/reference/timetk.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"timetk: Time Series Analysis in the Tidyverse — timetk","text":"timetk package several benefits: Visualizing Time Series Wrangling Time Series. Preprocessing Feature Engineering. learn timetk, start documentation: https://business-science.github.io/timetk/","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"tk_acf_diagnostics() function provides simple interface detect Autocorrelation (ACF), Partial Autocorrelation (PACF), Cross Correlation (CCF) Lagged Predictors one tibble. function powers plot_acf_diagnostics() visualization.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"","code":"tk_acf_diagnostics(.data, .date_var, .value, .ccf_vars = NULL, .lags = 1000)"},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":".data data frame tibble numeric features (values) descending chronological order .date_var column containing either date date-time values .value numeric column value ACF PACF calculations performed. .ccf_vars Additional features perform Lag Cross Correlations (CCFs) versus .value. Useful evaluating external lagged regressors. .lags seqence one lags evaluate.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"tibble data.frame containing autocorrelation, partial autocorrelation cross correlation data.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"Simplified ACF, PACF, & CCF often interested 3 functions. get 3 ? Now can! ACF - Autocorrelation target variable lagged versions PACF - Partial Autocorrelation removes dependence lags lags highlighting key seasonalities. CCF - Shows lagged predictors can used prediction target variable. Lag Specification Lags (.lags) can either specified : time-based phrase indicating duraction (e.g. 2 months) maximum lag (e.g. .lags = 28) sequence lags (e.g. .lags = 7:28) Scales Multiple Time Series Groupes tk_acf_diagnostics() works grouped_df's, meaning can group time series one categorical columns dplyr::group_by() apply tk_acf_diagnostics() return group-wise lag diagnostics. Special Note Dots (...) Unlike plotting utilities, ... arguments used group-wise analysis. Rather, used processing Cross Correlations (CCFs). Use dplyr::group_by() processing multiple time series groups.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_acf_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise ACF, PACF, and CCF Data Preparation — tk_acf_diagnostics","text":"","code":"library(dplyr) library(timetk) # ACF, PACF, & CCF in 1 Data Frame # - Get ACF & PACF for target (adjusted) # - Get CCF between adjusted and volume and close FANG %>% filter(symbol == \"FB\") %>% tk_acf_diagnostics(date, adjusted, # ACF & PACF .ccf_vars = c(volume, close), # CCFs .lags = 500) #> # A tibble: 501 × 7 #> lag ACF PACF CCF_volume CCF_close .white_noise_upper #> #> 1 0 1 1 -0.447 1 0.0630 #> 2 1 0.997 0.997 -0.444 0.997 0.0630 #> 3 2 0.994 -0.0227 -0.442 0.994 0.0630 #> 4 3 0.990 0.0101 -0.438 0.990 0.0630 #> 5 4 0.987 0.0311 -0.437 0.987 0.0630 #> 6 5 0.985 0.0180 -0.438 0.985 0.0630 #> 7 6 0.982 0.00502 -0.437 0.982 0.0630 #> 8 7 0.979 0.0171 -0.437 0.979 0.0630 #> 9 8 0.976 -0.000118 -0.436 0.976 0.0630 #> 10 9 0.974 -0.00243 -0.435 0.974 0.0630 #> # ℹ 491 more rows #> # ℹ 1 more variable: .white_noise_lower # Scale with groups using group_by() FANG %>% group_by(symbol) %>% tk_acf_diagnostics(date, adjusted, .ccf_vars = c(volume, close), .lags = \"3 months\") #> # A tibble: 248 × 8 #> # Groups: symbol [4] #> symbol lag ACF PACF CCF_volume CCF_close .white_noise_upper #> #> 1 FB 0 1 1 -0.447 1 0.0630 #> 2 FB 1 0.997 0.997 -0.444 0.997 0.0630 #> 3 FB 2 0.994 -0.0227 -0.442 0.994 0.0630 #> 4 FB 3 0.990 0.0101 -0.438 0.990 0.0630 #> 5 FB 4 0.987 0.0311 -0.437 0.987 0.0630 #> 6 FB 5 0.985 0.0180 -0.438 0.985 0.0630 #> 7 FB 6 0.982 0.00502 -0.437 0.982 0.0630 #> 8 FB 7 0.979 0.0171 -0.437 0.979 0.0630 #> 9 FB 8 0.976 -0.000118 -0.436 0.976 0.0630 #> 10 FB 9 0.974 -0.00243 -0.435 0.974 0.0630 #> # ℹ 238 more rows #> # ℹ 1 more variable: .white_noise_lower # Apply Transformations FANG %>% group_by(symbol) %>% tk_acf_diagnostics( date, diff_vec(adjusted), # Apply differencing transformation .lags = 0:500 ) #> diff_vec(): Initial values: 257.309998 #> diff_vec(): Initial values: 28 #> diff_vec(): Initial values: 361.264351 #> diff_vec(): Initial values: 13.144286 #> # A tibble: 2,004 × 6 #> # Groups: symbol [4] #> symbol lag ACF PACF .white_noise_upper .white_noise_lower #> #> 1 FB 0 1 1 0.0630 -0.0630 #> 2 FB 1 0.0272 0.0272 0.0630 -0.0630 #> 3 FB 2 -0.0219 -0.0226 0.0630 -0.0630 #> 4 FB 3 -0.0973 -0.0962 0.0630 -0.0630 #> 5 FB 4 -0.0554 -0.0512 0.0630 -0.0630 #> 6 FB 5 0.0104 0.00896 0.0630 -0.0630 #> 7 FB 6 -0.0622 -0.0751 0.0630 -0.0630 #> 8 FB 7 0.00363 -0.00334 0.0630 -0.0630 #> 9 FB 8 -0.0168 -0.0212 0.0630 -0.0630 #> 10 FB 9 0.0300 0.0187 0.0630 -0.0630 #> # ℹ 1,994 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tk_anomaly_diagnostics() preprocessor plot_anomaly_diagnostics(). performs automatic anomaly detection one time series groups.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"","code":"tk_anomaly_diagnostics( .data, .date_var, .value, .frequency = \"auto\", .trend = \"auto\", .alpha = 0.05, .max_anomalies = 0.2, .message = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity LOESS smoother, used remove remainder. Refer tk_get_trend(). .alpha Controls width \"normal\" range. Lower values conservative higher values less prone incorrectly classifying \"normal\" observations. .max_anomalies maximum percent anomalies permitted identified. .message boolean. TRUE, output information related automatic frequency trend selection (applicable).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tibble data.frame STL Decomposition Features (observed, season, trend, remainder, seasadj) Anomaly Features (remainder_l1, remainder_l2, anomaly, recomposed_l1, recomposed_l2)","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"tk_anomaly_diagnostics() method anomaly detection implements 2-step process detect outliers time series. Step 1: Detrend & Remove Seasonality using STL Decomposition decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\" anomaly detection. user can control two parameters: frequency trend. .frequency: Adjusts \"season\" component removed \"observed\" values. .trend: Adjusts trend window (t.window parameter stats::stl() used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", predetermines frequency /trend based scale time series using tk_time_scale_template(). Step 2: Anomaly Detection \"trend\" \"season\" (seasonality) removed, anomaly detection performed \"remainder\". Anomalies identified, boundaries (recomposed_l1 recomposed_l2) determined. Anomaly Detection Method uses inner quartile range (IQR) +/-25 median. IQR Adjustment, alpha parameter default alpha = 0.05, limits established expanding 25/75 baseline IQR Factor 3 (3X). IQR Factor = 0.15 / alpha (hence 3X alpha = 0.05): increase IQR Factor controlling limits, decrease alpha, makes difficult outlier. Increase alpha make easier outlier. IQR outlier detection method used forecast::tsoutliers(). similar outlier detection method used Twitter's AnomalyDetection package. Twitter Forecast tsoutliers methods implemented Business Science's anomalize package.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"CLEVELAND, R. B., CLEVELAND, W. S., MCRAE, J. E., TERPENNING, . STL: Seasonal-Trend Decomposition Procedure Based Loess. Journal Official Statistics, Vol. 6, . 1 (1990), pp. 3-73. Owen S. Vallis, Jordan Hochenbaum Arun Kejariwal (2014). Novel Technique Long-Term Anomaly Detection Cloud. Twitter Inc.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_anomaly_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Automatic group-wise Anomaly Detection by STL Decomposition — tk_anomaly_diagnostics","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% filter(id %in% c(\"1_1\", \"1_3\")) %>% group_by(id) %>% tk_anomaly_diagnostics(Date, Weekly_Sales) #> frequency = 13 observations per 1 quarter #> trend = 52 observations per 1 year #> frequency = 13 observations per 1 quarter #> trend = 52 observations per 1 year #> # A tibble: 286 × 12 #> # Groups: id [2] #> id Date observed season trend remainder seasadj remainder_l1 #> #> 1 1_1 2010-02-05 24924. 874. 19967. 4083. 24050. -15981. #> 2 1_1 2010-02-12 46039. -698. 19835. 26902. 46737. -15981. #> 3 1_1 2010-02-19 41596. -1216. 19703. 23108. 42812. -15981. #> 4 1_1 2010-02-26 19404. -821. 19571. 653. 20224. -15981. #> 5 1_1 2010-03-05 21828. 324. 19439. 2064. 21504. -15981. #> 6 1_1 2010-03-12 21043. 471. 19307. 1265. 20572. -15981. #> 7 1_1 2010-03-19 22137. 920. 19175. 2041. 21217. -15981. #> 8 1_1 2010-03-26 26229. 752. 19069. 6409. 25478. -15981. #> 9 1_1 2010-04-02 57258. 503. 18962. 37794. 56755. -15981. #> 10 1_1 2010-04-09 42961. 1132. 18855. 22974. 41829. -15981. #> # ℹ 276 more rows #> # ℹ 4 more variables: remainder_l2 , anomaly , recomposed_l1 , #> # recomposed_l2 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many differenced columns to the data — tk_augment_differences","title":"Add many differenced columns to the data — tk_augment_differences","text":"handy function adding multiple lagged difference values data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many differenced columns to the data — tk_augment_differences","text":"","code":"tk_augment_differences( .data, .value, .lags = 1, .differences = 1, .log = FALSE, .names = \"auto\" )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many differenced columns to the data — tk_augment_differences","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .lags One lags difference(s) .differences number differences apply. .log TRUE, applies log-differences. .names vector names new columns. Must length number output columns. Use \"auto\" automatically rename columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many differenced columns to the data — tk_augment_differences","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many differenced columns to the data — tk_augment_differences","text":"Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple differences adding sequence differences using .lags argument (e.g. lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_differences.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many differenced columns to the data — tk_augment_differences","text":"","code":"library(dplyr) library(timetk) m4_monthly %>% group_by(id) %>% tk_augment_differences(value, .lags = 1:20) #> # A tibble: 1,574 × 23 #> # Groups: id [4] #> id date value value_lag1_diff1 value_lag2_diff1 value_lag3_diff1 #> #> 1 M1 1976-06-01 8000 NA NA NA #> 2 M1 1976-07-01 8350 350 NA NA #> 3 M1 1976-08-01 8570 220 570 NA #> 4 M1 1976-09-01 7700 -870 -650 -300 #> 5 M1 1976-10-01 7080 -620 -1490 -1270 #> 6 M1 1976-11-01 6520 -560 -1180 -2050 #> 7 M1 1976-12-01 6070 -450 -1010 -1630 #> 8 M1 1977-01-01 6650 580 130 -430 #> 9 M1 1977-02-01 6830 180 760 310 #> 10 M1 1977-03-01 5710 -1120 -940 -360 #> # ℹ 1,564 more rows #> # ℹ 17 more variables: value_lag4_diff1 , value_lag5_diff1 , #> # value_lag6_diff1 , value_lag7_diff1 , value_lag8_diff1 , #> # value_lag9_diff1 , value_lag10_diff1 , value_lag11_diff1 , #> # value_lag12_diff1 , value_lag13_diff1 , value_lag14_diff1 , #> # value_lag15_diff1 , value_lag16_diff1 , value_lag17_diff1 , #> # value_lag18_diff1 , value_lag19_diff1 , value_lag20_diff1 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many fourier series to the data — tk_augment_fourier","title":"Add many fourier series to the data — tk_augment_fourier","text":"handy function adding multiple fourier series data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many fourier series to the data — tk_augment_fourier","text":"","code":"tk_augment_fourier(.data, .date_var, .periods, .K = 1, .names = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many fourier series to the data — tk_augment_fourier","text":".data tibble. .date_var date date-time column used calculate fourier series .periods One periods fourier series .K maximum number fourier orders. .names vector names new columns. Must length number output columns. Use \"auto\" automatically rename columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many fourier series to the data — tk_augment_fourier","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many fourier series to the data — tk_augment_fourier","text":"Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple differences adding sequence differences using .periods argument (e.g. lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_fourier.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many fourier series to the data — tk_augment_fourier","text":"","code":"library(dplyr) library(timetk) m4_monthly %>% group_by(id) %>% tk_augment_fourier(date, .periods = c(6, 12), .K = 2) #> # A tibble: 1,574 × 11 #> # Groups: id [4] #> id date value date_sin6_K1 date_cos6_K1 date_sin6_K2 date_cos6_K2 #> #> 1 M1 1976-06-01 8000 -0.571 -0.821 0.938 0.347 #> 2 M1 1976-07-01 8350 -0.999 0.0506 -0.101 -0.995 #> 3 M1 1976-08-01 8570 -0.455 0.890 -0.811 0.585 #> 4 M1 1976-09-01 7700 0.543 0.840 0.912 0.410 #> 5 M1 1976-10-01 7080 1.00 -0.0169 -0.0338 -0.999 #> 6 M1 1976-11-01 6520 0.485 -0.874 -0.849 0.529 #> 7 M1 1976-12-01 6070 -0.485 -0.874 0.849 0.529 #> 8 M1 1977-01-01 6650 -1.00 -0.0169 0.0338 -0.999 #> 9 M1 1977-02-01 6830 -0.515 0.857 -0.882 0.470 #> 10 M1 1977-03-01 5710 0.394 0.919 0.725 0.689 #> # ℹ 1,564 more rows #> # ℹ 4 more variables: date_sin12_K1 , date_cos12_K1 , #> # date_sin12_K2 , date_cos12_K2 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many holiday features to the data — tk_augment_holiday","title":"Add many holiday features to the data — tk_augment_holiday","text":"Quickly add \"holiday signature\" - sets holiday features correspond calendar dates. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many holiday features to the data — tk_augment_holiday","text":"","code":"tk_augment_holiday_signature( .data, .date_var = NULL, .holiday_pattern = \".\", .locale_set = c(\"all\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"IT\", \"JP\", \"CH\", \"DE\"), .exchange_set = c(\"all\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\") )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many holiday features to the data — tk_augment_holiday","text":".data time-based tibble time-series object. .date_var column containing either date date-time values. NULL, time-based column interpret object (tibble). .holiday_pattern regular expression pattern search \"Holiday Set\". .locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". .exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many holiday features to the data — tk_augment_holiday","text":"Returns tibble object describing holiday timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many holiday features to the data — tk_augment_holiday","text":"tk_augment_holiday_signature adds holiday signature features. See tk_get_holiday_signature() (powers augment function) full description examples use. 1. Individual Holidays single holiday features can filtered using pattern. helps identifying holidays important machine learning model. can useful example e-commerce initiatives (e.g. sales Christmas Thanskgiving). 2. Locale-Based Summary Sets Locale-based holdiay sets useful e-commerce initiatives (e.g. sales Christmas Thanskgiving). Filter locale identify holidays locale. 3. Stock Exchange Calendar Summary Sets Exchange-based holdiay sets useful identifying non-working days. Filter index identify holidays commonly non-working.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_holiday.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many holiday features to the data — tk_augment_holiday","text":"","code":"library(dplyr) library(timetk) dates_in_2017_tbl <- tibble(index = tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\")) # Non-working days in US due to Holidays using NYSE stock exchange calendar dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"^$\", # Returns nothing on purpose .locale_set = \"none\", .exchange_set = \"NYSE\") #> # A tibble: 365 × 2 #> index exch_NYSE #> #> 1 2017-01-01 0 #> 2 2017-01-02 1 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows # All holidays in US dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"US_\", .locale_set = \"US\", .exchange_set = \"none\") #> # A tibble: 365 × 20 #> index locale_US US_NewYearsDay US_MLKingsBirthday US_InaugurationDay #> #> 1 2017-01-01 1 1 0 0 #> 2 2017-01-02 0 0 0 0 #> 3 2017-01-03 0 0 0 0 #> 4 2017-01-04 0 0 0 0 #> 5 2017-01-05 0 0 0 0 #> 6 2017-01-06 0 0 0 0 #> 7 2017-01-07 0 0 0 0 #> 8 2017-01-08 0 0 0 0 #> 9 2017-01-09 0 0 0 0 #> 10 2017-01-10 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 15 more variables: US_LincolnsBirthday , US_PresidentsDay , #> # US_WashingtonsBirthday , US_CPulaskisBirthday , #> # US_GoodFriday , US_MemorialDay , US_DecorationMemorialDay , #> # US_JuneteenthNationalIndependenceDay , US_IndependenceDay , #> # US_LaborDay , US_ColumbusDay , US_ElectionDay , #> # US_VeteransDay , US_ThanksgivingDay , US_ChristmasDay # All holidays for World and Italy-specific Holidays # - Note that Italy celebrates specific holidays in addition to many World Holidays dates_in_2017_tbl %>% tk_augment_holiday_signature( index, .holiday_pattern = \"(World)|(IT_)\", .locale_set = c(\"World\", \"IT\"), .exchange_set = \"none\") #> # A tibble: 365 × 45 #> index locale_World locale_IT World_NewYearsDay World_SolemnityOfMary #> #> 1 2017-01-01 1 0 1 1 #> 2 2017-01-02 0 0 0 0 #> 3 2017-01-03 0 0 0 0 #> 4 2017-01-04 0 0 0 0 #> 5 2017-01-05 0 0 0 0 #> 6 2017-01-06 1 1 0 0 #> 7 2017-01-07 0 0 0 0 #> 8 2017-01-08 0 0 0 0 #> 9 2017-01-09 0 0 0 0 #> 10 2017-01-10 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 40 more variables: World_Epiphany , IT_Epiphany , #> # World_PresentationOfLord , World_Septuagesima , #> # World_Quinquagesima , World_AshWednesday , #> # World_Annunciation , World_PalmSunday , World_GoodFriday , #> # World_Easter , World_EasterSunday , World_EasterMonday , #> # IT_LiberationDay , World_LaborDay , World_RogationSunday , …"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many lags to the data — tk_augment_lags","title":"Add many lags to the data — tk_augment_lags","text":"handy function adding multiple lagged columns data frame. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many lags to the data — tk_augment_lags","text":"","code":"tk_augment_lags(.data, .value, .lags = 1, .names = \"auto\") tk_augment_leads(.data, .value, .lags = -1, .names = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many lags to the data — tk_augment_lags","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .lags One lags difference(s) .names vector names new columns. Must length .lags.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many lags to the data — tk_augment_lags","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many lags to the data — tk_augment_lags","text":"Lags vs Leads negative lag considered lead. tk_augment_leads() function identical tk_augment_lags() exception automatic naming convetion (.names = 'auto') convert column names negative lags leads. Benefits scalable function : Designed work grouped data using dplyr::group_by() Add multiple lags adding sequence lags using .lags argument (e.g. .lags = 1:20)","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_lags.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many lags to the data — tk_augment_lags","text":"","code":"library(dplyr) library(timetk) # Lags m4_monthly %>% group_by(id) %>% tk_augment_lags(contains(\"value\"), .lags = 1:20) #> # A tibble: 1,574 × 23 #> # Groups: id [4] #> id date value value_lag1 value_lag2 value_lag3 value_lag4 value_lag5 #> #> 1 M1 1976-06-01 8000 NA NA NA NA NA #> 2 M1 1976-07-01 8350 8000 NA NA NA NA #> 3 M1 1976-08-01 8570 8350 8000 NA NA NA #> 4 M1 1976-09-01 7700 8570 8350 8000 NA NA #> 5 M1 1976-10-01 7080 7700 8570 8350 8000 NA #> 6 M1 1976-11-01 6520 7080 7700 8570 8350 8000 #> 7 M1 1976-12-01 6070 6520 7080 7700 8570 8350 #> 8 M1 1977-01-01 6650 6070 6520 7080 7700 8570 #> 9 M1 1977-02-01 6830 6650 6070 6520 7080 7700 #> 10 M1 1977-03-01 5710 6830 6650 6070 6520 7080 #> # ℹ 1,564 more rows #> # ℹ 15 more variables: value_lag6 , value_lag7 , value_lag8 , #> # value_lag9 , value_lag10 , value_lag11 , value_lag12 , #> # value_lag13 , value_lag14 , value_lag15 , value_lag16 , #> # value_lag17 , value_lag18 , value_lag19 , value_lag20 # Leads m4_monthly %>% group_by(id) %>% tk_augment_leads(value, .lags = 1:-20) #> # A tibble: 1,574 × 25 #> # Groups: id [4] #> id date value value_lag1 value_lag0 value_lead1 value_lead2 #> #> 1 M1 1976-06-01 8000 NA 8000 8350 8570 #> 2 M1 1976-07-01 8350 8000 8350 8570 7700 #> 3 M1 1976-08-01 8570 8350 8570 7700 7080 #> 4 M1 1976-09-01 7700 8570 7700 7080 6520 #> 5 M1 1976-10-01 7080 7700 7080 6520 6070 #> 6 M1 1976-11-01 6520 7080 6520 6070 6650 #> 7 M1 1976-12-01 6070 6520 6070 6650 6830 #> 8 M1 1977-01-01 6650 6070 6650 6830 5710 #> 9 M1 1977-02-01 6830 6650 6830 5710 5260 #> 10 M1 1977-03-01 5710 6830 5710 5260 5470 #> # ℹ 1,564 more rows #> # ℹ 18 more variables: value_lead3 , value_lead4 , value_lead5 , #> # value_lead6 , value_lead7 , value_lead8 , value_lead9 , #> # value_lead10 , value_lead11 , value_lead12 , #> # value_lead13 , value_lead14 , value_lead15 , #> # value_lead16 , value_lead17 , value_lead18 , #> # value_lead19 , value_lead20 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many rolling window calculations to the data — tk_augment_slidify","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"Quickly use function rolling function apply multiple .periods. Works dplyr groups .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"","code":"tk_augment_slidify( .data, .value, .period, .f, ..., .align = c(\"center\", \"left\", \"right\"), .partial = FALSE, .names = \"auto\" )"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":".data tibble. .value One column(s) transformation applied. Usage tidyselect functions (e.g. contains()) can used select multiple columns. .period One periods rolling window(s) .f summary [function / formula], ... Optional arguments summary function .align Rolling functions generate .period - 1 fewer values incoming vector. Thus, vector needs aligned. Select one \"center\", \"left\", \"right\". .partial .partial moving window allowed return partial (incomplete) windows instead NA values. Set FALSE default, can switched TRUE remove NA's. .names vector names new columns. Must length .period. Default \"auto\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"tk_augment_slidify() scales slidify_vec() function multiple time series .periods. See slidify_vec() examples usage core function arguments.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_slidify.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many rolling window calculations to the data — tk_augment_slidify","text":"","code":"library(dplyr) library(stringr) library(timetk) # Single Column | Multiple Rolling Windows FANG %>% select(symbol, date, adjusted) %>% group_by(symbol) %>% tk_augment_slidify( .value = contains(\"adjust\"), # Multiple rolling windows .period = c(10, 30, 60, 90), .f = mean, .partial = TRUE, .names = str_c(\"MA_\", c(10, 30, 60, 90)) ) %>% ungroup() #> # A tibble: 4,032 × 7 #> symbol date adjusted MA_10 MA_30 MA_60 MA_90 #> #> 1 FB 2013-01-02 28 28.9 30.0 29.7 29.1 #> 2 FB 2013-01-03 27.8 29.3 30.1 29.7 29.1 #> 3 FB 2013-01-04 28.8 29.6 30.2 29.7 29.0 #> 4 FB 2013-01-07 29.4 29.7 30.2 29.6 29.0 #> 5 FB 2013-01-08 29.1 29.8 30.3 29.6 29.0 #> 6 FB 2013-01-09 30.6 30.0 30.3 29.5 28.9 #> 7 FB 2013-01-10 31.3 30.2 30.3 29.4 28.9 #> 8 FB 2013-01-11 31.7 30.3 30.2 29.4 28.8 #> 9 FB 2013-01-14 31.0 30.4 30.1 29.3 28.8 #> 10 FB 2013-01-15 30.1 30.6 30.1 29.3 28.7 #> # ℹ 4,022 more rows # Multiple Columns | Multiple Rolling Windows FANG %>% select(symbol, date, adjusted, volume) %>% group_by(symbol) %>% tk_augment_slidify( .value = c(adjusted, volume), .period = c(10, 30, 60, 90), .f = mean, .partial = TRUE ) %>% ungroup() #> # A tibble: 4,032 × 12 #> symbol date adjusted volume adjusted_roll_10 volume_roll_10 #> #> 1 FB 2013-01-02 28 69846400 28.9 73357200 #> 2 FB 2013-01-03 27.8 63140600 29.3 76494229. #> 3 FB 2013-01-04 28.8 72715400 29.6 78132200 #> 4 FB 2013-01-07 29.4 83781800 29.7 80438933. #> 5 FB 2013-01-08 29.1 45871300 29.8 89719300 #> 6 FB 2013-01-09 30.6 104787700 30.0 90267930 #> 7 FB 2013-01-10 31.3 95316400 30.2 87979540 #> 8 FB 2013-01-11 31.7 89598000 30.3 85671150 #> 9 FB 2013-01-14 31.0 98892800 30.4 82817300 #> 10 FB 2013-01-15 30.1 173242600 30.6 83120150 #> # ℹ 4,022 more rows #> # ℹ 6 more variables: adjusted_roll_30 , volume_roll_30 , #> # adjusted_roll_60 , volume_roll_60 , adjusted_roll_90 , #> # volume_roll_90 "},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Add many time series features to the data — tk_augment_timeseries","title":"Add many time series features to the data — tk_augment_timeseries","text":"Add many time series features data","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add many time series features to the data — tk_augment_timeseries","text":"","code":"tk_augment_timeseries_signature(.data, .date_var = NULL)"},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add many time series features to the data — tk_augment_timeseries","text":".data time-based tibble time-series object. .date_var tibbles, column containing either date date-time values. NULL, time-based column interpret object (tibble, xts, zoo, etc).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add many time series features to the data — tk_augment_timeseries","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add many time series features to the data — tk_augment_timeseries","text":"tk_augment_timeseries_signature() adds 25+ time series features including: Trend Seconds Granularity: index.num Yearly Seasonality: Year, Month, Quarter Weekly Seasonality: Week Month, Day Month, Day Week, Daily Seasonality: Hour, Minute, Second Weekly Cyclic Patterns: 2 weeks, 3 weeks, 4 weeks","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_augment_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add many time series features to the data — tk_augment_timeseries","text":"","code":"library(dplyr) library(timetk) m4_daily %>% group_by(id) %>% tk_augment_timeseries_signature(date) #> # A tibble: 9,743 × 31 #> # Groups: id [4] #> id date value index.num diff year year.iso half quarter month #> #> 1 D10 2014-07-03 2076. 1404345600 NA 2014 2014 2 3 7 #> 2 D10 2014-07-04 2073. 1404432000 86400 2014 2014 2 3 7 #> 3 D10 2014-07-05 2049. 1404518400 86400 2014 2014 2 3 7 #> 4 D10 2014-07-06 2049. 1404604800 86400 2014 2014 2 3 7 #> 5 D10 2014-07-07 2006. 1404691200 86400 2014 2014 2 3 7 #> 6 D10 2014-07-08 2018. 1404777600 86400 2014 2014 2 3 7 #> 7 D10 2014-07-09 2019. 1404864000 86400 2014 2014 2 3 7 #> 8 D10 2014-07-10 2007. 1404950400 86400 2014 2014 2 3 7 #> 9 D10 2014-07-11 2010 1405036800 86400 2014 2014 2 3 7 #> 10 D10 2014-07-12 2002. 1405123200 86400 2014 2014 2 3 7 #> # ℹ 9,733 more rows #> # ℹ 21 more variables: month.xts , month.lbl , day , hour , #> # minute , second , hour12 , am.pm , wday , #> # wday.xts , wday.lbl , mday , qday , yday , #> # mweek , week , week.iso , week2 , week3 , #> # week4 , mday7 "},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":null,"dir":"Reference","previous_headings":"","what":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"Automatic frequency trend calculation time series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"","code":"tk_get_frequency(idx, period = \"auto\", message = TRUE) tk_get_trend(idx, period = \"auto\", message = TRUE)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"idx date datetime index. period Either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). message boolean. message = TRUE, frequency trend output message along units scale data.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"Returns scalar numeric value indicating number observations frequency trend span.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"frequency loosely defined number observations comprise cycle data set. trend loosely defined time span can aggregated across visualize central tendency data. often easiest think frequency trend terms time-based units data already . tk_get_frequency() time_trend() enable: using time-based periods define frequency trend. Frequency: example, weekly cycle often 5-days (working days) 7-days (calendar days). Rather specify frequency 5 7, user can specify period = \"1 week\", tk_get_frequency() detect scale time series return 5 7 based actual data. period argument three basic options returning frequency. Options include: \"auto\": target frequency determined using pre-defined template (see template ). time-based duration: (e.g. \"1 week\" \"2 quarters\" per cycle) numeric number observations: (e.g. 5 5 observations per cycle) period = \"auto\", tk_time_scale_template() used calculate frequency. Trend: example, trend daily data often best aggregated evaluating moving average quarter month span. Rather specify number days quarter month, user can specify \"1 quarter\" \"1 month\", time_trend() function return correct number observations per trend cycle. addition, option, period = \"auto\", auto-detect appropriate trend span depending data. template used define appropriate trend span. Time Scale Template tk_time_scale_template() Look-Table used trend period find appropriate time scale. contains three features: time_scale, frequency, trend. algorithm inspect scale time series select best frequency trend matches scale number observations per target frequency. frequency chosen best match. predefined template stored function tk_time_scale_template(). can modify template set_tk_time_scale_template().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_frequency.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Automatic frequency and trend calculation from a time series index — tk_get_frequency","text":"","code":"library(dplyr) library(timetk) idx_FB <- FANG %>% filter(symbol == \"FB\") %>% pull(date) # Automated Frequency Calculation tk_get_frequency(idx_FB, period = \"auto\") #> frequency = 5 observations per 1 week #> [1] 5 # Automated Trend Calculation tk_get_trend(idx_FB, period = \"auto\") #> trend = 64 observations per 3 months #> [1] 64 # Manually Override Trend tk_get_trend(idx_FB, period = \"1 year\") #> trend = 252 observations per 1 year #> [1] 252"},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":null,"dir":"Reference","previous_headings":"","what":"Get holiday features from a time-series index — tk_get_holiday","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Get holiday features time-series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get holiday features from a time-series index — tk_get_holiday","text":"","code":"tk_get_holiday_signature( idx, holiday_pattern = \".\", locale_set = c(\"all\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"IT\", \"JP\", \"CH\", \"DE\"), exchange_set = c(\"all\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\") ) tk_get_holidays_by_year(years = year(today()))"},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get holiday features from a time-series index — tk_get_holiday","text":"idx time-series index vector dates datetimes. holiday_pattern regular expression pattern search \"Holiday Set\". locale_set Return binary holidays based locale. One : \"\", \"none\", \"World\", \"US\", \"CA\", \"GB\", \"FR\", \"\", \"JP\", \"CH\", \"DE\". exchange_set Return binary holidays based Stock Exchange Calendars. One : \"\", \"none\", \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". years One years collect holidays .","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Returns tibble object describing timeseries holidays.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get holiday features from a time-series index — tk_get_holiday","text":"Feature engineering holidays can help identify critical patterns machine learning algorithms. tk_get_holiday_signature() helps providing feature sets 3 types features: 1. Individual Holidays single holiday features can filtered using pattern. helps identifying holidays important machine learning model. can useful example e-commerce initiatives (e.g. sales Christmas Thanskgiving). 2. Locale-Based Summary Sets Locale-based holdiay sets useful e-commerce initiatives (e.g. sales Christmas Thanskgiving). Filter locale identify holidays locale. 3. Stock Exchange Calendar Summary Sets Exchange-based holdiay sets useful identifying non-working days. Filter index identify holidays commonly non-working.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_holiday.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get holiday features from a time-series index — tk_get_holiday","text":"","code":"library(dplyr) library(stringr) library(timetk) # Works with time-based tibbles idx <- tk_make_timeseries(\"2017-01-01\", \"2017-12-31\", by = \"day\") # --- BASIC USAGE ---- tk_get_holiday_signature(idx) #> # A tibble: 365 × 133 #> index exch_NYSE exch_LONDON exch_NERC exch_TSX exch_ZURICH locale_GB #> #> 1 2017-01-01 0 0 0 0 0 0 #> 2 2017-01-02 1 1 1 1 1 0 #> 3 2017-01-03 0 0 0 0 0 0 #> 4 2017-01-04 0 0 0 0 0 0 #> 5 2017-01-05 0 0 0 0 0 0 #> 6 2017-01-06 0 0 0 0 0 0 #> 7 2017-01-07 0 0 0 0 0 0 #> 8 2017-01-08 0 0 0 0 0 0 #> 9 2017-01-09 0 0 0 0 0 0 #> 10 2017-01-10 0 0 0 0 0 0 #> # ℹ 355 more rows #> # ℹ 126 more variables: locale_JP , locale_US , locale_World , #> # locale_CH , locale_IT , locale_CA , locale_FR , #> # locale_DE , GB_MilleniumDay , JP_Gantan , #> # JP_NewYearsDay , World_NewYearsDay , World_SolemnityOfMary , #> # US_NewYearsDay , CH_BerchtoldsDay , JP_BankHolidayJan2 , #> # JP_BankHolidayJan3 , World_Epiphany , IT_Epiphany , … # ---- FILTERING WITH PATTERNS & SETS ---- # List available holidays - see patterns tk_get_holidays_by_year(2020) %>% filter(holiday_name %>% str_detect(\"US_\")) #> # A tibble: 18 × 3 #> date locale holiday_name #> #> 1 2020-01-01 US US_NewYearsDay #> 2 2020-01-20 US US_InaugurationDay #> 3 2020-01-20 US US_MLKingsBirthday #> 4 2020-02-12 US US_LincolnsBirthday #> 5 2020-02-17 US US_PresidentsDay #> 6 2020-02-22 US US_WashingtonsBirthday #> 7 2020-03-02 US US_CPulaskisBirthday #> 8 2020-04-10 US US_GoodFriday #> 9 2020-05-25 US US_MemorialDay #> 10 2020-05-30 US US_DecorationMemorialDay #> 11 2020-06-19 US US_JuneteenthNationalIndependenceDay #> 12 2020-07-04 US US_IndependenceDay #> 13 2020-09-07 US US_LaborDay #> 14 2020-10-12 US US_ColumbusDay #> 15 2020-11-03 US US_ElectionDay #> 16 2020-11-11 US US_VeteransDay #> 17 2020-11-26 US US_ThanksgivingDay #> 18 2020-12-25 US US_ChristmasDay # Filter using holiday patterns # - Get New Years, Christmas and Thanksgiving Features in US tk_get_holiday_signature( idx, holiday_pattern = \"(US_NewYears)|(US_Christmas)|(US_Thanks)\", locale_set = \"none\", exchange_set = \"none\") #> # A tibble: 365 × 4 #> index US_NewYearsDay US_ThanksgivingDay US_ChristmasDay #> #> 1 2017-01-01 1 0 0 #> 2 2017-01-02 0 0 0 #> 3 2017-01-03 0 0 0 #> 4 2017-01-04 0 0 0 #> 5 2017-01-05 0 0 0 #> 6 2017-01-06 0 0 0 #> 7 2017-01-07 0 0 0 #> 8 2017-01-08 0 0 0 #> 9 2017-01-09 0 0 0 #> 10 2017-01-10 0 0 0 #> # ℹ 355 more rows # ---- APPLYING FILTERS ---- # Filter with locale sets - Signals all holidays in a locale tk_get_holiday_signature( idx, holiday_pattern = \"$^\", # Matches nothing on purpose locale_set = \"US\", exchange_set = \"none\") #> # A tibble: 365 × 2 #> index locale_US #> #> 1 2017-01-01 1 #> 2 2017-01-02 0 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows # Filter with exchange sets - Signals Common Non-Business Days tk_get_holiday_signature( idx, holiday_pattern = \"$^\", # Matches nothing on purpose locale_set = \"none\", exchange_set = \"NYSE\") #> # A tibble: 365 × 2 #> index exch_NYSE #> #> 1 2017-01-01 0 #> 2 2017-01-02 1 #> 3 2017-01-03 0 #> 4 2017-01-04 0 #> 5 2017-01-05 0 #> 6 2017-01-06 0 #> 7 2017-01-07 0 #> 8 2017-01-08 0 #> 9 2017-01-09 0 #> 10 2017-01-10 0 #> # ℹ 355 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Get date features from a time-series index — tk_get_timeseries","title":"Get date features from a time-series index — tk_get_timeseries","text":"Get date features time-series index","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get date features from a time-series index — tk_get_timeseries","text":"","code":"tk_get_timeseries_signature(idx) tk_get_timeseries_summary(idx)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get date features from a time-series index — tk_get_timeseries","text":"idx time-series index vector dates datetimes.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get date features from a time-series index — tk_get_timeseries","text":"Returns tibble object describing timeseries.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get date features from a time-series index — tk_get_timeseries","text":"tk_get_timeseries_signature decomposes timeseries commonly needed features numeric value, differences, year, month, day, day week, day month, day year, hour, minute, second. tk_get_timeseries_summary returns summary returns start, end, units, scale, \"summary\" timeseries differences seconds including minimum, 1st quartile, median, mean, 3rd quartile, maximum frequency. timeseries differences give user better picture index frequency user can understand level regularity irregularity. perfectly regular time series equal values seconds metric. However, often case. Important Note: functions work time-based indexes datetime, date, yearmon, yearqtr values. Regularized dates decomposed.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get date features from a time-series index — tk_get_timeseries","text":"","code":"library(dplyr) library(timetk) library(lubridate) library(zoo) #> #> Attaching package: ‘zoo’ #> The following objects are masked from ‘package:base’: #> #> as.Date, as.Date.numeric # Works with time-based tibbles FB_tbl <- FANG %>% filter(symbol == \"FB\") FB_idx <- tk_index(FB_tbl) tk_get_timeseries_signature(FB_idx) #> # A tibble: 1,008 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 2013-01-02 1357084800 NA 2013 2013 1 1 1 0 #> 2 2013-01-03 1357171200 86400 2013 2013 1 1 1 0 #> 3 2013-01-04 1357257600 86400 2013 2013 1 1 1 0 #> 4 2013-01-07 1357516800 259200 2013 2013 1 1 1 0 #> 5 2013-01-08 1357603200 86400 2013 2013 1 1 1 0 #> 6 2013-01-09 1357689600 86400 2013 2013 1 1 1 0 #> 7 2013-01-10 1357776000 86400 2013 2013 1 1 1 0 #> 8 2013-01-11 1357862400 86400 2013 2013 1 1 1 0 #> 9 2013-01-14 1358121600 259200 2013 2013 1 1 1 0 #> 10 2013-01-15 1358208000 86400 2013 2013 1 1 1 0 #> # ℹ 998 more rows #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(FB_idx) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 1008 2013-01-02 2016-12-30 days day UTC 86400 86400 86400 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # Works with dates in any periodicity idx_weekly <- seq.Date(from = ymd(\"2016-01-01\"), by = 'week', length.out = 6) tk_get_timeseries_signature(idx_weekly) #> # A tibble: 6 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 2016-01-01 1451606400 NA 2016 2015 1 1 1 0 #> 2 2016-01-08 1452211200 604800 2016 2016 1 1 1 0 #> 3 2016-01-15 1452816000 604800 2016 2016 1 1 1 0 #> 4 2016-01-22 1453420800 604800 2016 2016 1 1 1 0 #> 5 2016-01-29 1454025600 604800 2016 2016 1 1 1 0 #> 6 2016-02-05 1454630400 604800 2016 2016 1 1 2 1 #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(idx_weekly) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 6 2016-01-01 2016-02-05 days week UTC 604800 604800 604800 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # Works with zoo yearmon and yearqtr classes idx_yearmon <- seq.Date(from = ymd(\"2016-01-01\"), by = \"month\", length.out = 12) %>% as.yearmon() tk_get_timeseries_signature(idx_yearmon) #> # A tibble: 12 × 29 #> index index.num diff year year.iso half quarter month month.xts #> #> 1 Jan 2016 1451606400 NA 2016 2015 1 1 1 0 #> 2 Feb 2016 1454284800 2678400 2016 2016 1 1 2 1 #> 3 Mar 2016 1456790400 2505600 2016 2016 1 1 3 2 #> 4 Apr 2016 1459468800 2678400 2016 2016 1 2 4 3 #> 5 May 2016 1462060800 2592000 2016 2016 1 2 5 4 #> 6 Jun 2016 1464739200 2678400 2016 2016 1 2 6 5 #> 7 Jul 2016 1467331200 2592000 2016 2016 2 3 7 6 #> 8 Aug 2016 1470009600 2678400 2016 2016 2 3 8 7 #> 9 Sep 2016 1472688000 2678400 2016 2016 2 3 9 8 #> 10 Oct 2016 1475280000 2592000 2016 2016 2 4 10 9 #> 11 Nov 2016 1477958400 2678400 2016 2016 2 4 11 10 #> 12 Dec 2016 1480550400 2592000 2016 2016 2 4 12 11 #> # ℹ 20 more variables: month.lbl , day , hour , minute , #> # second , hour12 , am.pm , wday , wday.xts , #> # wday.lbl , mday , qday , yday , mweek , #> # week , week.iso , week2 , week3 , week4 , #> # mday7 tk_get_timeseries_summary(idx_yearmon) #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median diff.mean #> #> 1 12 Jan … Dec … days month UTC 2505600 2592000 2678400 2631273. #> # ℹ 2 more variables: diff.q3 , diff.maximum "},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"Get timeseries unit frequency primary time scales","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"","code":"tk_get_timeseries_unit_frequency()"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"tk_get_timeseries_unit_frequency returns tibble containing timeseries frequencies seconds primary time scales including \"sec\", \"min\", \"hour\", \"day\", \"week\", \"month\", \"quarter\", \"year\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_unit_frequency.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get the timeseries unit frequency for the primary time scales — tk_get_timeseries_unit_frequency","text":"","code":"tk_get_timeseries_unit_frequency() #> # A tibble: 1 × 8 #> sec min hour day week month quarter year #> #> 1 0 60 3600 86400 604800 2678400 7948800 31795200"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":null,"dir":"Reference","previous_headings":"","what":"Get date or datetime variables (column names) — tk_get_timeseries_variables","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"Get date datetime variables (column names)","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"","code":"tk_get_timeseries_variables(data)"},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"data object class data.frame","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"tk_get_timeseries_variables returns vector containing column names date-like classes.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"tk_get_timeseries_variables returns column names date datetime variables data frame. Classes meet criteria return include inherit POSIXt, Date, zoo::yearmon, zoo::yearqtr. Function adapted padr:::get_date_variables(). See padr helpers.R","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_get_timeseries_variables.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get date or datetime variables (column names) — tk_get_timeseries_variables","text":"","code":"library(timetk) library(dplyr) FANG %>% tk_get_timeseries_variables() #> [1] \"date\""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"Extract index date datetime time series objects, models, forecasts","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"","code":"tk_index(data, timetk_idx = FALSE, silent = FALSE) has_timetk_idx(data)"},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"data time-based tibble, time-series object, time-series model, forecast object. timetk_idx timetk_idx TRUE timetk time-based index attribute attempted returned. FALSE default index returned. See discussion details. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"Returns vector date date times","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"tk_index() used extract date datetime index various time series objects, models forecasts. method can used tbl, xts, zoo, zooreg, ts objects. method can additionally used forecast objects number objects generated modeling functions Arima, ets, HoltWinters classes get index underlying data. boolean timetk_idx argument applicable regularized time series objects ts zooreg classes regularized index potentially \"timetk index\" (time-based attribute). set FALSE regularized index returned. set TRUE time-based timetk index returned present. has_timetk_idx() used determine object \"timetk index\" attribute can thus benefit tk_index(timetk_idx = TRUE). TRUE indicates \"timetk index\" attribute present. FALSE indicates \"timetk index\" attribute present. FALSE, tk_index() function return default index data type. Important Note: gain benefit timetk_idx time series must timetk index. Use has_timetk_idx determine object timetk index. particularly important ts objects, default contain time-based index therefore must coerced time-based objects tbl, xts, zoo using tk_ts() function order get \"timetk index\" attribute. Refer tk_ts() creating persistent date / datetime index coercion ts.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_index.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract an index of date or datetime from time series objects, models, forecasts — tk_index","text":"","code":"library(timetk) # Create time-based tibble data_tbl <- tibble::tibble( date = seq.Date(from = as.Date(\"2000-01-01\"), by = 1, length.out = 5), x = rnorm(5) * 10, y = 5:1 ) tk_index(data_tbl) # Returns time-based index vector #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" \"2000-01-05\" # Coerce to ts using tk_ts(): Preserves time-basis data_ts <- tk_ts(data_tbl) #> Warning: Non-numeric columns being dropped: date tk_index(data_ts, timetk_idx = FALSE) # Returns regularized index #> [1] 1 2 3 4 5 tk_index(data_ts, timetk_idx = TRUE) # Returns original time-based index vector #> Warning: 'tzone' attributes are inconsistent #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" \"2000-01-05\" # Coercing back to tbl tk_tbl(data_ts, timetk_idx = FALSE) # Returns regularized tbl #> Warning: Warning: No index to preserve. Object otherwise converted to tibble successfully. #> # A tibble: 5 × 2 #> x y #> #> 1 3.62 5 #> 2 -18.9 4 #> 3 8.34 3 #> 4 22.4 2 #> 5 3.27 1 tk_tbl(data_ts, timetk_idx = TRUE) # Returns time-based tbl #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 #> index x y #> #> 1 2000-01-01 3.62 5 #> 2 2000-01-02 -18.9 4 #> 3 2000-01-03 8.34 3 #> 4 2000-01-04 22.4 2 #> 5 2000-01-05 3.27 1"},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Make future time series from existing — tk_make_future_timeseries","title":"Make future time series from existing — tk_make_future_timeseries","text":"Make future time series existing","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make future time series from existing — tk_make_future_timeseries","text":"","code":"tk_make_future_timeseries( idx, length_out, inspect_weekdays = FALSE, inspect_months = FALSE, skip_values = NULL, insert_values = NULL, n_future = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make future time series from existing — tk_make_future_timeseries","text":"idx vector dates length_out Number future observations. Can numeric number phrase like \"1 year\". inspect_weekdays Uses logistic regression algorithm inspect whether certain weekdays (e.g. weekends) excluded future dates. Default FALSE. inspect_months Uses logistic regression algorithm inspect whether certain days months (e.g. last two weeks year seasonal days) excluded future dates. Default FALSE. skip_values vector class idx timeseries values skip. insert_values vector class idx timeseries values insert. n_future (DEPRECATED) Number future observations. Can numeric number phrase like \"1 year\".","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make future time series from existing — tk_make_future_timeseries","text":"vector containing future index class incoming index idx","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make future time series from existing — tk_make_future_timeseries","text":"Future Sequences tk_make_future_timeseries returns time series based input index frequency attributes. Specifying Length Future Observations argument length_out determines many future index observations compute. can specified : numeric value - number future observations return. number observations returned always equal value user inputs. end date can vary based number timestamps chosen. time-based phrase - duration future include (e.g. \"6 months\" \"30 minutes\"). duration defines end date observations. end date change timestamps fall within end date returned (e.g. quarterly time series return 4 quarters length_out = \"1 year\"). number observations vary fit within end date. Weekday Month Inspection inspect_weekdays inspect_months arguments apply \"daily\" (scale = \"day\") data (refer tk_get_timeseries_summary() get index scale). inspect_weekdays argument useful determining missing days week occur weekly frequency every week, every week, . recommended least 60 days use option. inspect_months argument useful determining missing days month, quarter year; however, algorithm can inadvertently select incorrect dates pattern erratic. Skipping / Inserting Values skip_values insert_values arguments can used remove add values series future times. values must format idx class. skip_values argument useful passing holidays special index values excluded future time series. insert_values argument useful adding values back algorithm may excluded.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_future_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make future time series from existing — tk_make_future_timeseries","text":"","code":"library(dplyr) library(timetk) # Basic example - By 3 seconds idx <- tk_make_timeseries(\"2016-01-01 00:00:00\", by = \"3 sec\", length_out = 3) idx #> [1] \"2016-01-01 00:00:00 UTC\" \"2016-01-01 00:00:03 UTC\" #> [3] \"2016-01-01 00:00:06 UTC\" # Make next three timestamps in series idx %>% tk_make_future_timeseries(length_out = 3) #> [1] \"2016-01-01 00:00:09 UTC\" \"2016-01-01 00:00:12 UTC\" #> [3] \"2016-01-01 00:00:15 UTC\" # Make next 6 seconds of timestamps from the next timestamp idx %>% tk_make_future_timeseries(length_out = \"6 sec\") #> [1] \"2016-01-01 00:00:09 UTC\" \"2016-01-01 00:00:12 UTC\" # Basic Example - By 1 Month idx <- tk_make_timeseries(\"2016-01-01\", by = \"1 month\", length_out = \"12 months\") idx #> [1] \"2016-01-01\" \"2016-02-01\" \"2016-03-01\" \"2016-04-01\" \"2016-05-01\" #> [6] \"2016-06-01\" \"2016-07-01\" \"2016-08-01\" \"2016-09-01\" \"2016-10-01\" #> [11] \"2016-11-01\" \"2016-12-01\" \"2017-01-01\" # Make 12 months of timestamps from the next timestamp idx %>% tk_make_future_timeseries(length_out = \"12 months\") #> [1] \"2017-02-01\" \"2017-03-01\" \"2017-04-01\" \"2017-05-01\" \"2017-06-01\" #> [6] \"2017-07-01\" \"2017-08-01\" \"2017-09-01\" \"2017-10-01\" \"2017-11-01\" #> [11] \"2017-12-01\" \"2018-01-01\" # --- APPLICATION --- # - Combine holiday sequences with future sequences # Create index of days that FB stock will be traded in 2017 based on 2016 + holidays FB_tbl <- FANG %>% filter(symbol == \"FB\") holidays <- tk_make_holiday_sequence( start_date = \"2017-01-01\", end_date = \"2017-12-31\", calendar = \"NYSE\") # Remove holidays with skip_values, and remove weekends with inspect_weekdays = TRUE FB_tbl %>% tk_index() %>% tk_make_future_timeseries(length_out = \"1 year\", inspect_weekdays = TRUE, skip_values = holidays) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [51] \"2017-03-16\" \"2017-03-17\" \"2017-03-20\" \"2017-03-21\" \"2017-03-22\" #> [56] \"2017-03-23\" \"2017-03-24\" \"2017-03-27\" \"2017-03-28\" \"2017-03-29\" #> [61] \"2017-03-30\" \"2017-03-31\" \"2017-04-03\" \"2017-04-04\" \"2017-04-05\" #> [66] \"2017-04-06\" \"2017-04-07\" \"2017-04-10\" \"2017-04-11\" \"2017-04-12\" #> [71] \"2017-04-13\" \"2017-04-17\" \"2017-04-18\" \"2017-04-19\" \"2017-04-20\" #> [76] \"2017-04-21\" \"2017-04-24\" \"2017-04-25\" \"2017-04-26\" \"2017-04-27\" #> [81] \"2017-04-28\" \"2017-05-01\" \"2017-05-02\" \"2017-05-03\" \"2017-05-04\" #> [86] \"2017-05-05\" \"2017-05-08\" \"2017-05-09\" \"2017-05-10\" \"2017-05-11\" #> [91] \"2017-05-12\" \"2017-05-15\" \"2017-05-16\" \"2017-05-17\" \"2017-05-18\" #> [96] \"2017-05-19\" \"2017-05-22\" \"2017-05-23\" \"2017-05-24\" \"2017-05-25\" #> [101] \"2017-05-26\" \"2017-05-30\" \"2017-05-31\" \"2017-06-01\" \"2017-06-02\" #> [106] \"2017-06-05\" \"2017-06-06\" \"2017-06-07\" \"2017-06-08\" \"2017-06-09\" #> [111] \"2017-06-12\" \"2017-06-13\" \"2017-06-14\" \"2017-06-15\" \"2017-06-16\" #> [116] \"2017-06-19\" \"2017-06-20\" \"2017-06-21\" \"2017-06-22\" \"2017-06-23\" #> [121] \"2017-06-26\" \"2017-06-27\" \"2017-06-28\" \"2017-06-29\" \"2017-06-30\" #> [126] \"2017-07-03\" \"2017-07-05\" \"2017-07-06\" \"2017-07-07\" \"2017-07-10\" #> [131] \"2017-07-11\" \"2017-07-12\" \"2017-07-13\" \"2017-07-14\" \"2017-07-17\" #> [136] \"2017-07-18\" \"2017-07-19\" \"2017-07-20\" \"2017-07-21\" \"2017-07-24\" #> [141] \"2017-07-25\" \"2017-07-26\" \"2017-07-27\" \"2017-07-28\" \"2017-07-31\" #> [146] \"2017-08-01\" \"2017-08-02\" \"2017-08-03\" \"2017-08-04\" \"2017-08-07\" #> [151] \"2017-08-08\" \"2017-08-09\" \"2017-08-10\" \"2017-08-11\" \"2017-08-14\" #> [156] \"2017-08-15\" \"2017-08-16\" \"2017-08-17\" \"2017-08-18\" \"2017-08-21\" #> [161] \"2017-08-22\" \"2017-08-23\" \"2017-08-24\" \"2017-08-25\" \"2017-08-28\" #> [166] \"2017-08-29\" \"2017-08-30\" \"2017-08-31\" \"2017-09-01\" \"2017-09-05\" #> [171] \"2017-09-06\" \"2017-09-07\" \"2017-09-08\" \"2017-09-11\" \"2017-09-12\" #> [176] \"2017-09-13\" \"2017-09-14\" \"2017-09-15\" \"2017-09-18\" \"2017-09-19\" #> [181] \"2017-09-20\" \"2017-09-21\" \"2017-09-22\" \"2017-09-25\" \"2017-09-26\" #> [186] \"2017-09-27\" \"2017-09-28\" \"2017-09-29\" \"2017-10-02\" \"2017-10-03\" #> [191] \"2017-10-04\" \"2017-10-05\" \"2017-10-06\" \"2017-10-09\" \"2017-10-10\" #> [196] \"2017-10-11\" \"2017-10-12\" \"2017-10-13\" \"2017-10-16\" \"2017-10-17\" #> [201] \"2017-10-18\" \"2017-10-19\" \"2017-10-20\" \"2017-10-23\" \"2017-10-24\" #> [206] \"2017-10-25\" \"2017-10-26\" \"2017-10-27\" \"2017-10-30\" \"2017-10-31\" #> [211] \"2017-11-01\" \"2017-11-02\" \"2017-11-03\" \"2017-11-06\" \"2017-11-07\" #> [216] \"2017-11-08\" \"2017-11-09\" \"2017-11-10\" \"2017-11-13\" \"2017-11-14\" #> [221] \"2017-11-15\" \"2017-11-16\" \"2017-11-17\" \"2017-11-20\" \"2017-11-21\" #> [226] \"2017-11-22\" \"2017-11-24\" \"2017-11-27\" \"2017-11-28\" \"2017-11-29\" #> [231] \"2017-11-30\" \"2017-12-01\" \"2017-12-04\" \"2017-12-05\" \"2017-12-06\" #> [236] \"2017-12-07\" \"2017-12-08\" \"2017-12-11\" \"2017-12-12\" \"2017-12-13\" #> [241] \"2017-12-14\" \"2017-12-15\" \"2017-12-18\" \"2017-12-19\" \"2017-12-20\" #> [246] \"2017-12-21\" \"2017-12-22\" \"2017-12-26\" \"2017-12-27\" \"2017-12-28\" #> [251] \"2017-12-29\""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":null,"dir":"Reference","previous_headings":"","what":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"Make daily Holiday Weekend date sequences","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"","code":"tk_make_holiday_sequence( start_date, end_date, calendar = c(\"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\"), skip_values = NULL, insert_values = NULL ) tk_make_weekend_sequence(start_date, end_date) tk_make_weekday_sequence( start_date, end_date, remove_weekends = TRUE, remove_holidays = FALSE, calendar = c(\"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\"), skip_values = NULL, insert_values = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"start_date Used define starting date date sequence generation. Provide \"YYYY-MM-DD\" format. end_date Used define ending date date sequence generation. Provide \"YYYY-MM-DD\" format. calendar calendar used Date Sequence calculations Holidays timeDate package. Acceptable values : \"NYSE\", \"LONDON\", \"NERC\", \"TSX\", \"ZURICH\". skip_values daily date sequence skip insert_values daily date sequence insert remove_weekends logical value indicating whether remove weekends (Saturday Sunday) date sequence remove_holidays logical value indicating whether remove common holidays date sequence","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"vector containing future dates","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"Start End Date Specification Accept shorthand notation (.e. tk_make_timeseries() specifications apply) available Daily Periods. Holiday Sequences tk_make_holiday_sequence() wrapper various holiday calendars timeDate package, making easy generate holiday sequences common business calendars: New York Stock Exchange: calendar = \"NYSE\" Londo Stock Exchange: \"LONDON\" North American Reliability Council: \"NERC\" Toronto Stock Exchange: \"TSX\" Zurich Stock Exchange: \"ZURICH\" Weekend Weekday Sequences simply populate","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_holiday_sequence.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Make daily Holiday and Weekend date sequences — tk_make_holiday_sequence","text":"","code":"library(dplyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) # ---- HOLIDAYS & WEEKENDS ---- # Business Holiday Sequence tk_make_holiday_sequence(\"2017-01-01\", \"2017-12-31\", calendar = \"NYSE\") #> [1] \"2017-01-02\" \"2017-01-16\" \"2017-02-20\" \"2017-04-14\" \"2017-05-29\" #> [6] \"2017-07-04\" \"2017-09-04\" \"2017-11-23\" \"2017-12-25\" tk_make_holiday_sequence(\"2017\", calendar = \"NYSE\") # Same thing as above (just shorter) #> [1] \"2017-01-02\" \"2017-01-16\" \"2017-02-20\" \"2017-04-14\" \"2017-05-29\" #> [6] \"2017-07-04\" \"2017-09-04\" \"2017-11-23\" \"2017-12-25\" # Weekday Sequence tk_make_weekday_sequence(\"2017\", \"2018\", remove_holidays = TRUE) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 453 entries ] # Weekday Sequence + Removing Business Holidays tk_make_weekday_sequence(\"2017\", \"2018\", remove_holidays = TRUE) #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 453 entries ] # ---- COMBINE HOLIDAYS WITH MAKE FUTURE TIMESERIES FROM EXISTING ---- # - A common machine learning application is creating a future time series data set # from an existing # Create index of days that FB stock will be traded in 2017 based on 2016 + holidays FB_tbl <- FANG %>% filter(symbol == \"FB\") holidays <- tk_make_holiday_sequence( start_date = \"2016\", end_date = \"2017\", calendar = \"NYSE\") weekends <- tk_make_weekend_sequence( start_date = \"2016\", end_date = \"2017\") # Remove holidays and weekends with skip_values # We could also remove weekends with inspect_weekdays = TRUE FB_tbl %>% tk_index() %>% tk_make_future_timeseries(length_out = 366, skip_values = c(holidays, weekends)) #> The following `skip_values` were not in the future date sequence: 2016-01-01, 2016-01-18, 2016-02-15, 2016-03-25, 2016-05-30, 2016-07-04, 2016-09-05, 2016-11-24, 2016-12-26, 2016-01-02, 2016-01-03, 2016-01-09, 2016-01-10, 2016-01-16, 2016-01-17, 2016-01-23, 2016-01-24, 2016-01-30, 2016-01-31, 2016-02-06, 2016-02-07, 2016-02-13, 2016-02-14, 2016-02-20, 2016-02-21, 2016-02-27, 2016-02-28, 2016-03-05, 2016-03-06, 2016-03-12, 2016-03-13, 2016-03-19, 2016-03-20, 2016-03-26, 2016-03-27, 2016-04-02, 2016-04-03, 2016-04-09, 2016-04-10, 2016-04-16, 2016-04-17, 2016-04-23, 2016-04-24, 2016-04-30, 2016-05-01, 2016-05-07, 2016-05-08, 2016-05-14, 2016-05-15, 2016-05-21, 2016-05-22, 2016-05-28, 2016-05-29, 2016-06-04, 2016-06-05, 2016-06-11, 2016-06-12, 2016-06-18, 2016-06-19, 2016-06-25, 2016-06-26, 2016-07-02, 2016-07-03, 2016-07-09, 2016-07-10, 2016-07-16, 2016-07-17, 2016-07-23, 2016-07-24, 2016-07-30, 2016-07-31, 2016-08-06, 2016-08-07, 2016-08-13, 2016-08-14, 2016-08-20, 2016-08-21, 2016-08-27, 2016-08-28, 2016-09-03, 2016-09-04, 2016-09-10, 2016-09-11, 2016-09-17, 2016-09-18, 2016-09-24, 2016-09-25, 2016-10-01, 2016-10-02, 2016-10-08, 2016-10-09, 2016-10-15, 2016-10-16, 2016-10-22, 2016-10-23, 2016-10-29, 2016-10-30, 2016-11-05, 2016-11-06, 2016-11-12, 2016-11-13, 2016-11-19, 2016-11-20, 2016-11-26, 2016-11-27, 2016-12-03, 2016-12-04, 2016-12-10, 2016-12-11, 2016-12-17, 2016-12-18, 2016-12-24, 2016-12-25 #> [1] \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" \"2017-01-06\" \"2017-01-09\" #> [6] \"2017-01-10\" \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-17\" #> [11] \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" \"2017-01-23\" \"2017-01-24\" #> [16] \"2017-01-25\" \"2017-01-26\" \"2017-01-27\" \"2017-01-30\" \"2017-01-31\" #> [21] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-06\" \"2017-02-07\" #> [26] \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" \"2017-02-13\" \"2017-02-14\" #> [31] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-21\" \"2017-02-22\" #> [36] \"2017-02-23\" \"2017-02-24\" \"2017-02-27\" \"2017-02-28\" \"2017-03-01\" #> [41] \"2017-03-02\" \"2017-03-03\" \"2017-03-06\" \"2017-03-07\" \"2017-03-08\" #> [46] \"2017-03-09\" \"2017-03-10\" \"2017-03-13\" \"2017-03-14\" \"2017-03-15\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 316 entries ] options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":null,"dir":"Reference","previous_headings":"","what":"Intelligent date and date-time sequence creation — tk_make_timeseries","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"Improves seq.Date() seq.POSIXt() functions simplifying 1 function tk_make_timeseries(). Intelligently handles character dates logical assumptions based user inputs.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"","code":"tk_make_timeseries( start_date, end_date, by, length_out = NULL, include_endpoints = TRUE, skip_values = NULL, insert_values = NULL )"},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"start_date Used define starting date date sequence generation. Provide \"YYYY-MM-DD\" format. end_date Used define ending date date sequence generation. Provide \"YYYY-MM-DD\" format. character string, containing one \"sec\", \"min\", \"hour\", \"day\", \"week\", \"month\", \"quarter\" \"year\". can create regularly spaced sequences using phrases like = \"10 min\". See Details. length_out Optional length sequence. Can used instead one : start_date, end_date, . Can specified number time-based phrase. include_endpoints Logical. Whether keep last value length_out time-based phrase. Default TRUE (keep last value). skip_values sequence skip insert_values sequence insert","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"vector containing date date-times","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"tk_make_timeseries() function handles date date-time sequences automatically. Parses date date times character Intelligently guesses sequence desired based arguments provided Handles spacing intelligently length_out missing, guesses either second day sequences Can skip insert values needed. Start End Date Specification Start end dates can specified reduced time-based phrases: start_date = \"2014\": converted \"2014-01-01\" (start period) end_date = \"2014\": converted \"2014-12-31\" (end period) start_date = \"2014-03\": converted \"2014-03-01\" (start period) end_date = \"2014-03\": converted \"2014-03-31\" (end period) similar process can used date-times. : Daily Sequences Make daily sequence tk_make_timeseries(). Examples: Every Day: = \"day\" Every 2-Weeks: = \"2 weeks\" Every 6-months: = \"6 months\" missing, guess = \"day\" : Sub-Daily Sequences Make sub-daily sequence tk_make_timeseries(). Examples: Every minute: = \"min\" Every 30-seconds: = \"30 sec\" Every 2-hours: = \"2 hours missing, guess = \"sec\" start end date date-time specification. Length length_out can specified number observation complex time-based expressions. following examples possible. length_out = 12 Creates 12 evenly spaced observations. length_out = \"12 months\" Adjusts end date falls 12th month. Include Endpoint Sometimes last date desired. example, user specifies length_out = 12 months, user may want last value 12th month 13th. Just toggle, include_endpoint = FALSE obtain behavior. Skip / Insert Timestamps Skips inserts performed sequence generated. means use length_out parameter, length may differ length_out.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_make_timeseries.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Intelligent date and date-time sequence creation — tk_make_timeseries","text":"","code":"library(dplyr) library(timetk) # Set max.print to 50 options_old <- options()$max.print options(max.print = 50) # ---- DATE ---- # Start + End, Guesses by = \"day\" tk_make_timeseries(\"2017-01-01\", \"2017-12-31\") #> Using by: day #> [1] \"2017-01-01\" \"2017-01-02\" \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" #> [6] \"2017-01-06\" \"2017-01-07\" \"2017-01-08\" \"2017-01-09\" \"2017-01-10\" #> [11] \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-14\" \"2017-01-15\" #> [16] \"2017-01-16\" \"2017-01-17\" \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" #> [21] \"2017-01-21\" \"2017-01-22\" \"2017-01-23\" \"2017-01-24\" \"2017-01-25\" #> [26] \"2017-01-26\" \"2017-01-27\" \"2017-01-28\" \"2017-01-29\" \"2017-01-30\" #> [31] \"2017-01-31\" \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" #> [36] \"2017-02-05\" \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" #> [41] \"2017-02-10\" \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" #> [46] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 315 entries ] # Just Start tk_make_timeseries(\"2017\") # Same result #> Using by: day #> [1] \"2017-01-01\" \"2017-01-02\" \"2017-01-03\" \"2017-01-04\" \"2017-01-05\" #> [6] \"2017-01-06\" \"2017-01-07\" \"2017-01-08\" \"2017-01-09\" \"2017-01-10\" #> [11] \"2017-01-11\" \"2017-01-12\" \"2017-01-13\" \"2017-01-14\" \"2017-01-15\" #> [16] \"2017-01-16\" \"2017-01-17\" \"2017-01-18\" \"2017-01-19\" \"2017-01-20\" #> [21] \"2017-01-21\" \"2017-01-22\" \"2017-01-23\" \"2017-01-24\" \"2017-01-25\" #> [26] \"2017-01-26\" \"2017-01-27\" \"2017-01-28\" \"2017-01-29\" \"2017-01-30\" #> [31] \"2017-01-31\" \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" #> [36] \"2017-02-05\" \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" #> [41] \"2017-02-10\" \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" #> [46] \"2017-02-15\" \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 315 entries ] # Only dates in February, 2017 tk_make_timeseries(\"2017-02\") #> Using by: day #> [1] \"2017-02-01\" \"2017-02-02\" \"2017-02-03\" \"2017-02-04\" \"2017-02-05\" #> [6] \"2017-02-06\" \"2017-02-07\" \"2017-02-08\" \"2017-02-09\" \"2017-02-10\" #> [11] \"2017-02-11\" \"2017-02-12\" \"2017-02-13\" \"2017-02-14\" \"2017-02-15\" #> [16] \"2017-02-16\" \"2017-02-17\" \"2017-02-18\" \"2017-02-19\" \"2017-02-20\" #> [21] \"2017-02-21\" \"2017-02-22\" \"2017-02-23\" \"2017-02-24\" \"2017-02-25\" #> [26] \"2017-02-26\" \"2017-02-27\" \"2017-02-28\" # Start + Length Out, Guesses by = \"day\" tk_make_timeseries(\"2012\", length_out = 6) # Guesses by = \"day\" #> Using by: day #> [1] \"2012-01-01\" \"2012-01-02\" \"2012-01-03\" \"2012-01-04\" \"2012-01-05\" #> [6] \"2012-01-06\" # Start + By + Length Out, Spacing 6 observations by monthly interval tk_make_timeseries(\"2012\", by = \"1 month\", length_out = 6) #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" # Start + By + Length Out, Phrase \"1 year 6 months\" tk_make_timeseries(\"2012\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" #> [11] \"2012-11-01\" \"2012-12-01\" \"2013-01-01\" \"2013-02-01\" \"2013-03-01\" #> [16] \"2013-04-01\" \"2013-05-01\" \"2013-06-01\" # Going in Reverse, End + Length Out tk_make_timeseries(end_date = \"2012-01-01\", by = \"1 month\", length_out = \"1 year 6 months\", include_endpoints = FALSE) #> [1] \"2010-08-01\" \"2010-09-01\" \"2010-10-01\" \"2010-11-01\" \"2010-12-01\" #> [6] \"2011-01-01\" \"2011-02-01\" \"2011-03-01\" \"2011-04-01\" \"2011-05-01\" #> [11] \"2011-06-01\" \"2011-07-01\" \"2011-08-01\" \"2011-09-01\" \"2011-10-01\" #> [16] \"2011-11-01\" \"2011-12-01\" \"2012-01-01\" # ---- DATE-TIME ---- # Start + End, Guesses by second tk_make_timeseries(\"2016-01-01 01:01:02\", \"2016-01-01 01:01:04\") #> Using by: sec #> [1] \"2016-01-01 01:01:02 UTC\" \"2016-01-01 01:01:03 UTC\" #> [3] \"2016-01-01 01:01:04 UTC\" # Date-Time Sequence - By 10 Minutes # - Converts to date-time automatically & applies 10-min interval tk_make_timeseries(\"2017-01-01\", \"2017-01-02\", by = \"10 min\") #> [1] \"2017-01-01 00:00:00 UTC\" \"2017-01-01 00:10:00 UTC\" #> [3] \"2017-01-01 00:20:00 UTC\" \"2017-01-01 00:30:00 UTC\" #> [5] \"2017-01-01 00:40:00 UTC\" \"2017-01-01 00:50:00 UTC\" #> [7] \"2017-01-01 01:00:00 UTC\" \"2017-01-01 01:10:00 UTC\" #> [9] \"2017-01-01 01:20:00 UTC\" \"2017-01-01 01:30:00 UTC\" #> [11] \"2017-01-01 01:40:00 UTC\" \"2017-01-01 01:50:00 UTC\" #> [13] \"2017-01-01 02:00:00 UTC\" \"2017-01-01 02:10:00 UTC\" #> [15] \"2017-01-01 02:20:00 UTC\" \"2017-01-01 02:30:00 UTC\" #> [17] \"2017-01-01 02:40:00 UTC\" \"2017-01-01 02:50:00 UTC\" #> [19] \"2017-01-01 03:00:00 UTC\" \"2017-01-01 03:10:00 UTC\" #> [21] \"2017-01-01 03:20:00 UTC\" \"2017-01-01 03:30:00 UTC\" #> [23] \"2017-01-01 03:40:00 UTC\" \"2017-01-01 03:50:00 UTC\" #> [25] \"2017-01-01 04:00:00 UTC\" \"2017-01-01 04:10:00 UTC\" #> [27] \"2017-01-01 04:20:00 UTC\" \"2017-01-01 04:30:00 UTC\" #> [29] \"2017-01-01 04:40:00 UTC\" \"2017-01-01 04:50:00 UTC\" #> [31] \"2017-01-01 05:00:00 UTC\" \"2017-01-01 05:10:00 UTC\" #> [33] \"2017-01-01 05:20:00 UTC\" \"2017-01-01 05:30:00 UTC\" #> [35] \"2017-01-01 05:40:00 UTC\" \"2017-01-01 05:50:00 UTC\" #> [37] \"2017-01-01 06:00:00 UTC\" \"2017-01-01 06:10:00 UTC\" #> [39] \"2017-01-01 06:20:00 UTC\" \"2017-01-01 06:30:00 UTC\" #> [41] \"2017-01-01 06:40:00 UTC\" \"2017-01-01 06:50:00 UTC\" #> [43] \"2017-01-01 07:00:00 UTC\" \"2017-01-01 07:10:00 UTC\" #> [45] \"2017-01-01 07:20:00 UTC\" \"2017-01-01 07:30:00 UTC\" #> [47] \"2017-01-01 07:40:00 UTC\" \"2017-01-01 07:50:00 UTC\" #> [49] \"2017-01-01 08:00:00 UTC\" \"2017-01-01 08:10:00 UTC\" #> [ reached 'max' / getOption(\"max.print\") -- omitted 95 entries ] # --- REMOVE / INCLUDE ENDPOINTS ---- # Last value in this case is desired tk_make_timeseries(\"2017-01-01\", by = \"30 min\", length_out = \"6 hours\") #> [1] \"2017-01-01 00:00:00 UTC\" \"2017-01-01 00:30:00 UTC\" #> [3] \"2017-01-01 01:00:00 UTC\" \"2017-01-01 01:30:00 UTC\" #> [5] \"2017-01-01 02:00:00 UTC\" \"2017-01-01 02:30:00 UTC\" #> [7] \"2017-01-01 03:00:00 UTC\" \"2017-01-01 03:30:00 UTC\" #> [9] \"2017-01-01 04:00:00 UTC\" \"2017-01-01 04:30:00 UTC\" #> [11] \"2017-01-01 05:00:00 UTC\" \"2017-01-01 05:30:00 UTC\" #> [13] \"2017-01-01 06:00:00 UTC\" # Last value in monthly case is not wanted tk_make_timeseries(\"2012-01-01\", by = \"1 month\", length_out = \"12 months\", include_endpoints = FALSE) # Removes unnecessary last value #> [1] \"2012-01-01\" \"2012-02-01\" \"2012-03-01\" \"2012-04-01\" \"2012-05-01\" #> [6] \"2012-06-01\" \"2012-07-01\" \"2012-08-01\" \"2012-09-01\" \"2012-10-01\" #> [11] \"2012-11-01\" \"2012-12-01\" # ---- SKIP & INSERT VALUES ---- tk_make_timeseries( \"2011-01-01\", length_out = 5, skip_values = \"2011-01-05\", insert_values = \"2011-01-06\" ) #> Using by: day #> [1] \"2011-01-01\" \"2011-01-02\" \"2011-01-03\" \"2011-01-04\" \"2011-01-06\" options(max.print = options_old)"},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"tk_seasonal_diagnostics() preprocessor plot_seasonal_diagnostics(). helps automating feature collection time series seasonality analysis.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"","code":"tk_seasonal_diagnostics(.data, .date_var, .value, .feature_set = \"auto\")"},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .feature_set One multiple selections analyze seasonality. Choices include: \"auto\" - Automatically selects features based time stamps length series. \"second\" - Good analyzing seasonality second minute. \"minute\" - Good analyzing seasonality minute hour \"hour\" - Good analyzing seasonality hour day \"wday.lbl\" - Labeled weekdays. Good analyzing seasonality day week. \"week\" - Good analyzing seasonality week year. \"month.lbl\" - Labeled months. Good analyzing seasonality month year. \"quarter\" - Good analyzing seasonality quarter year \"year\" - Good analyzing seasonality multiple years.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"tibble data.frame seasonal features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"Automatic Feature Selection Internal calculations performed detect sub-range features include useing following logic: minimum feature selected based median difference consecutive timestamps maximum feature selected based 2 full periods. Example: Hourly timestamp data lasts 2 weeks following features: \"hour\", \"wday.lbl\", \"week\". Scalable Grouped Data Frames function respects grouped data.frame tibbles made dplyr::group_by(). grouped data, automatic feature selection returned collection features within sub-groups. means extra features returned even though may meaningless groups. Transformations .value parameter respects transformations (e.g. .value = log(sales)).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_seasonal_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise Seasonality Data Preparation — tk_seasonal_diagnostics","text":"","code":"# \\donttest{ library(dplyr) library(timetk) # ---- GROUPED EXAMPLES ---- # Hourly Data m4_hourly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value) #> # A tibble: 3,060 × 6 #> # Groups: id [4] #> id date .value hour wday.lbl week #> #> 1 H10 2015-07-01 12:00:00 513 12 Wednesday 26 #> 2 H10 2015-07-01 13:00:00 512 13 Wednesday 26 #> 3 H10 2015-07-01 14:00:00 506 14 Wednesday 26 #> 4 H10 2015-07-01 15:00:00 500 15 Wednesday 26 #> 5 H10 2015-07-01 16:00:00 490 16 Wednesday 26 #> 6 H10 2015-07-01 17:00:00 484 17 Wednesday 26 #> 7 H10 2015-07-01 18:00:00 467 18 Wednesday 26 #> 8 H10 2015-07-01 19:00:00 446 19 Wednesday 26 #> 9 H10 2015-07-01 20:00:00 434 20 Wednesday 26 #> 10 H10 2015-07-01 21:00:00 422 21 Wednesday 26 #> # ℹ 3,050 more rows # Monthly Data m4_monthly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value) #> # A tibble: 1,574 × 6 #> # Groups: id [4] #> id date .value month.lbl quarter year #> #> 1 M1 1976-06-01 8000 June 2 1976 #> 2 M1 1976-07-01 8350 July 3 1976 #> 3 M1 1976-08-01 8570 August 3 1976 #> 4 M1 1976-09-01 7700 September 3 1976 #> 5 M1 1976-10-01 7080 October 4 1976 #> 6 M1 1976-11-01 6520 November 4 1976 #> 7 M1 1976-12-01 6070 December 4 1976 #> 8 M1 1977-01-01 6650 January 1 1977 #> 9 M1 1977-02-01 6830 February 1 1977 #> 10 M1 1977-03-01 5710 March 1 1977 #> # ℹ 1,564 more rows # ---- TRANSFORMATION ---- m4_weekly %>% group_by(id) %>% tk_seasonal_diagnostics(date, log(value)) #> # A tibble: 2,295 × 7 #> # Groups: id [4] #> id date .value week month.lbl quarter year #> #> 1 W10 1999-01-01 5.51 1 January 1 1999 #> 2 W10 1999-01-08 5.40 2 January 1 1999 #> 3 W10 1999-01-15 6.11 3 January 1 1999 #> 4 W10 1999-01-22 6.11 4 January 1 1999 #> 5 W10 1999-01-29 6.11 5 January 1 1999 #> 6 W10 1999-02-05 6.11 6 February 1 1999 #> 7 W10 1999-02-12 6.11 7 February 1 1999 #> 8 W10 1999-02-19 6.11 8 February 1 1999 #> 9 W10 1999-02-26 6.11 9 February 1 1999 #> 10 W10 1999-03-05 6.11 10 March 1 1999 #> # ℹ 2,285 more rows # ---- CUSTOM FEATURE SELECTION ---- m4_hourly %>% group_by(id) %>% tk_seasonal_diagnostics(date, value, .feature_set = c(\"hour\", \"week\")) #> # A tibble: 3,060 × 5 #> # Groups: id [4] #> id date .value hour week #> #> 1 H10 2015-07-01 12:00:00 513 12 26 #> 2 H10 2015-07-01 13:00:00 512 13 26 #> 3 H10 2015-07-01 14:00:00 506 14 26 #> 4 H10 2015-07-01 15:00:00 500 15 26 #> 5 H10 2015-07-01 16:00:00 490 16 26 #> 6 H10 2015-07-01 17:00:00 484 17 26 #> 7 H10 2015-07-01 18:00:00 467 18 26 #> 8 H10 2015-07-01 19:00:00 446 19 26 #> 9 H10 2015-07-01 20:00:00 434 20 26 #> 10 H10 2015-07-01 21:00:00 422 21 26 #> # ℹ 3,050 more rows # }"},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tk_stl_diagnostics() preprocessor plot_stl_diagnostics(). helps automating frequency trend selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"","code":"tk_stl_diagnostics( .data, .date_var, .value, .frequency = \"auto\", .trend = \"auto\", .message = TRUE )"},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .frequency Controls seasonal adjustment (removal seasonality). Input can either \"auto\", time-based definition (e.g. \"2 weeks\"), numeric number observations per frequency (e.g. 10). Refer tk_get_frequency(). .trend Controls trend component. STL, trend controls sensitivity lowess smoother, used remove remainder. .message boolean. TRUE, output information related automatic frequency trend selection (applicable).","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tibble data.frame Observed, Season, Trend, Remainder, Seasonally-Adjusted features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"tk_stl_diagnostics() function generates Seasonal-Trend-Loess decomposition. function \"tidy\" sense works data frames designed work dplyr groups. STL method: STL method implements time series decomposition using underlying stats::stl(). decomposition separates \"season\" \"trend\" components \"observed\" values leaving \"remainder\". Frequency & Trend Selection user can control two parameters: .frequency .trend. .frequency parameter adjusts \"season\" component removed \"observed\" values. .trend parameter adjusts trend window (t.window parameter stl()) used. user may supply .frequency .trend time-based durations (e.g. \"6 weeks\") numeric values (e.g. 180) \"auto\", automatically selects frequency /trend based scale time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_stl_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise STL Decomposition (Season, Trend, Remainder) — tk_stl_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- GROUPS & TRANSFORMATION ---- m4_daily %>% group_by(id) %>% tk_stl_diagnostics(date, box_cox_vec(value)) #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 1.25119350454964 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 0.0882021886505848 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 1.99992424816297 #> frequency = 7 observations per 1 week #> trend = 92 observations per 3 months #> box_cox_vec(): Using value for lambda: 0.401716085353735 #> # A tibble: 9,743 × 7 #> # Groups: id [4] #> id date observed season trend remainder seasadj #> #> 1 D10 2014-07-03 11303. -8.25 10796. 516. 11311. #> 2 D10 2014-07-04 11284. -7.93 10790. 502. 11292. #> 3 D10 2014-07-05 11116. -14.8 10784. 347. 11131. #> 4 D10 2014-07-06 11117. -6.28 10778. 346. 11124. #> 5 D10 2014-07-07 10829. 10.7 10772. 47.0 10819. #> 6 D10 2014-07-08 10905. 16.6 10766. 123. 10889. #> 7 D10 2014-07-09 10915. 10.0 10760. 145. 10905. #> 8 D10 2014-07-10 10836. -8.25 10754. 90.5 10844. #> 9 D10 2014-07-11 10854. -7.93 10748. 114. 10862. #> 10 D10 2014-07-12 10796. -14.8 10742. 69.1 10811. #> # ℹ 9,733 more rows # ---- CUSTOM TREND ---- m4_weekly %>% group_by(id) %>% tk_stl_diagnostics(date, box_cox_vec(value), .trend = \"2 quarters\") #> frequency = 13 observations per 1 quarter #> trend = 25 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.374719526760349 #> frequency = 13 observations per 1 quarter #> trend = 25 observations per 2 quarters #> box_cox_vec(): Using value for lambda: 0.0597533426736463 #> frequency = 13 observations per 1 quarter #> trend = 26 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.937375922566063 #> frequency = 13 observations per 1 quarter #> trend = 26 observations per 2 quarters #> box_cox_vec(): Using value for lambda: -0.195493340612351 #> # A tibble: 2,295 × 7 #> # Groups: id [4] #> id date observed season trend remainder seasadj #> #> 1 W10 1999-01-01 2.33 -0.000172 2.40 -0.0678 2.33 #> 2 W10 1999-01-08 2.32 -0.000195 2.40 -0.0814 2.32 #> 3 W10 1999-01-15 2.40 0.0000406 2.40 0.000106 2.40 #> 4 W10 1999-01-22 2.40 0.000252 2.40 -0.000127 2.40 #> 5 W10 1999-01-29 2.40 0.000371 2.40 -0.000261 2.40 #> 6 W10 1999-02-05 2.40 0.000397 2.40 -0.000314 2.40 #> 7 W10 1999-02-12 2.40 0.000162 2.40 -0.0000956 2.40 #> 8 W10 1999-02-19 2.40 -0.0000578 2.40 0.000114 2.40 #> 9 W10 1999-02-26 2.40 -0.000171 2.40 0.000235 2.40 #> 10 W10 1999-03-05 2.40 -0.000163 2.40 0.000216 2.40 #> # ℹ 2,285 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":null,"dir":"Reference","previous_headings":"","what":"Group-wise Time Series Summary — tk_summary_diagnostics","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"tk_summary_diagnostics() returns time series summary one timeseries groups tibble.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"","code":"tk_summary_diagnostics(.data, .date_var)"},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":".data tibble data.frame time-based column .date_var column containing either date date-time values. missing, attempts auto-detect date date-time column.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"tibble data.frame timeseries summary features","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"Applies tk_get_timeseries_summary() group-wise returning summary one time series groups. Respects dplyr groups Returns time series summary time-based feature.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_summary_diagnostics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Group-wise Time Series Summary — tk_summary_diagnostics","text":"","code":"library(dplyr) library(timetk) # ---- NON-GROUPED EXAMPLES ---- # Monthly Data m4_monthly %>% filter(id == \"M750\") %>% tk_summary_diagnostics() #> tk_augment_timeseries_signature(): Using the following .date_var variable: date #> # A tibble: 1 × 12 #> n.obs start end units scale tzone diff.minimum diff.q1 diff.median #> #> 1 306 1990-01-01 2015-06-01 days month UTC 2419200 2592000 2678400 #> # ℹ 3 more variables: diff.mean , diff.q3 , diff.maximum # ---- GROUPED EXAMPLES ---- # Monthly Data m4_monthly %>% group_by(id) %>% tk_summary_diagnostics() #> tk_augment_timeseries_signature(): Using the following .date_var variable: date #> # A tibble: 4 × 13 #> # Groups: id [4] #> id n.obs start end units scale tzone diff.minimum diff.q1 #> #> 1 M1 469 1976-06-01 2015-06-01 days month UTC 2419200 2592000 #> 2 M2 469 1976-06-01 2015-06-01 days month UTC 2419200 2592000 #> 3 M750 306 1990-01-01 2015-06-01 days month UTC 2419200 2592000 #> 4 M1000 330 1988-01-01 2015-06-01 days month UTC 2419200 2592000 #> # ℹ 4 more variables: diff.median , diff.mean , diff.q3 , #> # diff.maximum "},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time-series objects to tibble. — tk_tbl","title":"Coerce time-series objects to tibble. — tk_tbl","text":"Coerce time-series objects tibble.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time-series objects to tibble. — tk_tbl","text":"","code":"tk_tbl( data, preserve_index = TRUE, rename_index = \"index\", timetk_idx = FALSE, silent = FALSE, ... )"},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time-series objects to tibble. — tk_tbl","text":"data time-series object. preserve_index Attempts preserve time series index. Default TRUE. rename_index Enables index column renamed. timetk_idx Used return date / datetime index regularized objects contain timetk \"index\" attribute. Refer tk_index() information returning index information regularized timeseries objects (.e. ts). silent Used toggle printing messages warnings. ... Additional parameters passed tibble::as_tibble() function.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time-series objects to tibble. — tk_tbl","text":"Returns tibble object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time-series objects to tibble. — tk_tbl","text":"tk_tbl designed coerce time series objects (e.g. xts, zoo, ts, timeSeries, etc) tibble objects. main advantage function keeps date / date-time information underlying time-series object. preserve_index = TRUE specified, new column, index, created object coercion, function attempts preserve date date-time information. date / date-time column name can changed using rename_index argument. timetk_idx argument applicable coercing ts objects created using tk_ts() object time base (e.g. tbl, xts, zoo). Setting timetk_idx = TRUE enables returning timetk \"index\" attribute present, original (non-regularized) time-based index.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_tbl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time-series objects to tibble. — tk_tbl","text":"","code":"library(tibble) library(dplyr) library(timetk) data_tbl <- tibble( date = seq.Date(from = as.Date(\"2010-01-01\"), by = 1, length.out = 5), x = seq(100, 120, by = 5) ) ### ts to tibble: Comparison between as.data.frame() and tk_tbl() data_ts <- tk_ts(data_tbl, start = c(2010,1), freq = 365) #> Warning: Non-numeric columns being dropped: date # No index as.data.frame(data_ts) #> x #> 1 100 #> 2 105 #> 3 110 #> 4 115 #> 5 120 # Defualt index returned is regularized numeric index tk_tbl(data_ts) #> # A tibble: 5 × 2 #> index x #> #> 1 2010 100 #> 2 2010. 105 #> 3 2010. 110 #> 4 2010. 115 #> 5 2010. 120 # Original date index returned (Only possible if original data has time-based index) tk_tbl(data_ts, timetk_idx = TRUE) #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 2 #> index x #> #> 1 2010-01-01 100 #> 2 2010-01-02 105 #> 3 2010-01-03 110 #> 4 2010-01-04 115 #> 5 2010-01-05 120 ### xts to tibble: Comparison between as.data.frame() and tk_tbl() data_xts <- tk_xts(data_tbl) #> Warning: Non-numeric columns being dropped: date #> Using column `date` for date_var. # Dates are character class stored in row names as.data.frame(data_xts) #> x #> 2010-01-01 100 #> 2010-01-02 105 #> 2010-01-03 110 #> 2010-01-04 115 #> 2010-01-05 120 # Dates are appropriate date class and within the data frame tk_tbl(data_xts) #> # A tibble: 5 × 2 #> index x #> #> 1 2010-01-01 100 #> 2 2010-01-02 105 #> 3 2010-01-03 110 #> 4 2010-01-04 115 #> 5 2010-01-05 120 ### zooreg to tibble: Comparison between as.data.frame() and tk_tbl() data_zooreg <- tk_zooreg(1:8, start = zoo::yearqtr(2000), frequency = 4) # Dates are character class stored in row names as.data.frame(data_zooreg) #> data_zooreg #> 2000 Q1 1 #> 2000 Q2 2 #> 2000 Q3 3 #> 2000 Q4 4 #> 2001 Q1 5 #> 2001 Q2 6 #> 2001 Q3 7 #> 2001 Q4 8 # Dates are appropriate zoo yearqtr class within the data frame tk_tbl(data_zooreg) #> # A tibble: 8 × 2 #> index value #> #> 1 2000 Q1 1 #> 2 2000 Q2 2 #> 3 2000 Q3 3 #> 4 2000 Q4 4 #> 5 2001 Q1 5 #> 6 2001 Q2 6 #> 7 2001 Q3 7 #> 8 2001 Q4 8 ### zoo to tibble: Comparison between as.data.frame() and tk_tbl() data_zoo <- zoo::zoo(1:12, zoo::yearmon(2016 + seq(0, 11)/12)) # Dates are character class stored in row names as.data.frame(data_zoo) #> data_zoo #> Jan 2016 1 #> Feb 2016 2 #> Mar 2016 3 #> Apr 2016 4 #> May 2016 5 #> Jun 2016 6 #> Jul 2016 7 #> Aug 2016 8 #> Sep 2016 9 #> Oct 2016 10 #> Nov 2016 11 #> Dec 2016 12 # Dates are appropriate zoo yearmon class within the data frame tk_tbl(data_zoo) #> # A tibble: 12 × 2 #> index value #> #> 1 Jan 2016 1 #> 2 Feb 2016 2 #> 3 Mar 2016 3 #> 4 Apr 2016 4 #> 5 May 2016 5 #> 6 Jun 2016 6 #> 7 Jul 2016 7 #> 8 Aug 2016 8 #> 9 Sep 2016 9 #> 10 Oct 2016 10 #> 11 Nov 2016 11 #> 12 Dec 2016 12"},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":null,"dir":"Reference","previous_headings":"","what":"Get and modify the Time Scale Template — set_tk_time_scale_template","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"Get modify Time Scale Template","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"","code":"set_tk_time_scale_template(.data) get_tk_time_scale_template() tk_time_scale_template()"},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":".data tibble \"time_scale\", \"frequency\", \"trend\" columns.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"get_tk_time_scale_template(): Returns tibble containing time scale template information. set_tk_time_scale_template(): Returns nothing.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"Used get set time scale template, used tk_get_frequency() tk_get_trend() period = \"auto\". predefined template stored function tk_time_scale_template(). default used timetk. Changing Default Template can access current template get_tk_time_scale_template(). can modify current template set_tk_time_scale_template().","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_time_scale_template.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get and modify the Time Scale Template — set_tk_time_scale_template","text":"","code":"get_tk_time_scale_template() #> # A tibble: 8 × 3 #> time_scale frequency trend #> #> 1 second 1 hour 12 hours #> 2 minute 1 day 14 days #> 3 hour 1 day 1 month #> 4 day 1 week 3 months #> 5 week 1 quarter 1 year #> 6 month 1 year 5 years #> 7 quarter 1 year 10 years #> 8 year 5 years 30 years set_tk_time_scale_template(tk_time_scale_template())"},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":null,"dir":"Reference","previous_headings":"","what":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"tk_time_series_cv_plan() function provides simple interface prepare time series resample specification (rset) either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"","code":"tk_time_series_cv_plan(.data)"},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":".data time series resample specification either rolling_origin time_series_cv class.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"tibble containing time series crossvalidation plan.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"Resample Set resample set output timetk::time_series_cv() function rsample::rolling_origin() function.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_time_series_cv_plan.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time Series Resample Plan Data Preparation — tk_time_series_cv_plan","text":"","code":"library(dplyr) library(rsample) library(timetk) FB_tbl <- FANG %>% filter(symbol == \"FB\") %>% select(symbol, date, adjusted) resample_spec <- time_series_cv( FB_tbl, initial = 150, assess = 50, skip = 50, cumulative = FALSE, lag = 30, slice_limit = n()) #> Using date_var: date resample_spec %>% tk_time_series_cv_plan() #> # A tibble: 3,910 × 5 #> .id .key symbol date adjusted #> #> 1 Slice01 training FB 2016-03-18 111. #> 2 Slice01 training FB 2016-03-21 112. #> 3 Slice01 training FB 2016-03-22 112. #> 4 Slice01 training FB 2016-03-23 113. #> 5 Slice01 training FB 2016-03-24 113. #> 6 Slice01 training FB 2016-03-28 114. #> 7 Slice01 training FB 2016-03-29 116. #> 8 Slice01 training FB 2016-03-30 115. #> 9 Slice01 training FB 2016-03-31 114. #> 10 Slice01 training FB 2016-04-01 116. #> # ℹ 3,900 more rows"},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"Coerce time series objects tibbles date/date-time columns ts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"","code":"tk_ts( data, select = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), silent = FALSE ) tk_ts_( data, select = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), silent = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. start time first observation. Either single number vector two numbers (second integer), specify natural time unit (1-based) number samples time unit. See examples use second form. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"Returns ts object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"tk_ts() wrapper stats::ts() designed coerce tibble objects \"time-base\" (meaning values vary time) ts class objects. two main advantages: Non-numeric columns get removed instead populated NA's. returned ts object retains \"timetk index\" (various attributes) detected. \"timetk index\" can used coerce tbl, xts, zoo, ts data types. select argument used select subsets columns incoming data.frame. columns containing numeric data coerced. minimum, frequency start specified. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using stats::ts(). tk_ts_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_ts.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_ts","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to ts: Comparison between tk_ts() and stats::ts() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # as.ts: Character columns introduce NA's; Result does not retain index stats::ts(data_tbl[,-1], start = 2016) #> Time Series: #> Start = 2016 #> End = 2020 #> Frequency = 1 #> x y z #> 2016 1 1 -25.32330 #> 2017 1 3 -52.94872 #> 2018 1 6 -82.87625 #> 2019 1 10 -115.10591 #> 2020 1 15 -149.63768 # tk_ts: Only numeric columns get coerced; Result retains index in numeric format data_ts <- tk_ts(data_tbl, start = 2016) #> Warning: Non-numeric columns being dropped: date, x data_ts #> Time Series: #> Start = 2016 #> End = 2020 #> Frequency = 1 #> y z #> 2016 1 -25.32330 #> 2017 3 -52.94872 #> 2018 6 -82.87625 #> 2019 10 -115.10591 #> 2020 15 -149.63768 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date # timetk index tk_index(data_ts, timetk_idx = FALSE) # Regularized index returned #> [1] 2016 2017 2018 2019 2020 tk_index(data_ts, timetk_idx = TRUE) # Original date index returned #> Warning: 'tzone' attributes are inconsistent #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" # Coerce back to tibble data_ts %>% tk_tbl(timetk_idx = TRUE) #> Warning: 'tzone' attributes are inconsistent #> # A tibble: 5 × 3 #> index y z #> #> 1 2016-01-01 1 -25.3 #> 2 2016-01-02 3 -52.9 #> 3 2016-01-03 6 -82.9 #> 4 2016-01-04 10 -115. #> 5 2016-01-05 15 -150. ### Using select tk_ts(data_tbl, select = y) #> Time Series: #> Start = 1 #> End = 5 #> Frequency = 1 #> y #> [1,] 1 #> [2,] 3 #> [3,] 6 #> [4,] 10 #> [5,] 15 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date ### NSE: Enables programming select <- \"y\" tk_ts_(data_tbl, select = select) #> Time Series: #> Start = 1 #> End = 5 #> Frequency = 1 #> y #> [1,] 1 #> [2,] 3 #> [3,] 6 #> [4,] 10 #> [5,] 15 #> attr(,\"index\") #> [1] 1451606400 1451692800 1451779200 1451865600 1451952000 #> attr(,\"index\")attr(,\"tzone\") #> [1] UTC #> attr(,\"index\")attr(,\"tclass\") #> [1] Date"},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for ts method dispatch — tk_ts_dispatch_","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"Method dispatch ts","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"","code":"tk_ts_dispatch_(data, select, start, end, frequency, deltat, ts.eps, silent) tk_ts_.data.frame(data, select, start, end, frequency, deltat, ts.eps, silent) tk_ts_.default(data, select, start, end, frequency, deltat, ts.eps, silent)"},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. start time first observation. Either single number vector two numbers (second integer), specify natural time unit (1-based) number samples time unit. See examples use second form. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_ts_dispatch_.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for ts method dispatch — tk_ts_dispatch_","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":null,"dir":"Reference","previous_headings":"","what":"Time series feature matrix (Tidy) — tk_tsfeatures","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"tk_tsfeatures() tidyverse compliant wrapper tsfeatures::tsfeatures(). function computes matrix time series features describes various time series. designed groupwise analysis using dplyr groups.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"","code":"tk_tsfeatures( .data, .date_var, .value, .period = \"auto\", .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\"), .scale = TRUE, .trim = FALSE, .trim_amount = 0.1, .parallel = FALSE, .na_action = na.pass, .prefix = \"ts_\", .silent = TRUE, ... )"},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":".data tibble data.frame time-based column .date_var column containing either date date-time values .value column containing numeric values .period periodicity (frequency) time series data. Values can provided follows: \"auto\" (default) Calculates using tk_get_frequency(). \"2 weeks\": calculate median number observations 2-week window. 7 (numeric): interpret ts frequency 7 observations per cycle (common weekly data) .features Passed features underlying tsfeatures() function. vector function names represent feature aggregation function. Examples: Use one function names tsfeatures R package e.g.(\"lumpiness\", \"stl_features\"). Use function name (e.g. \"mean\" \"median\") Create function provide function name .scale TRUE, time series scaled mean 0 sd 1 features computed. .trim TRUE, time series trimmed trim_amount features computed. Values larger trim_amount absolute value set NA. .trim_amount Default level trimming trim==TRUE. Default: 0.1. .parallel TRUE, multiple cores (multiple sessions) used. speeds things large number time series. .parallel = TRUE, multiprocess = future::multisession. can adjusted setting multiprocess parameter. See tsfeatures::tsfeatures() function mor details. .na_action function handle missing values. Use na.interp estimate missing values. .prefix prefix prefix feature columns. Default: \"ts_\". .silent Whether show messages warnings. ... arguments get passed feature functions.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"tibble data.frame aggregated features describe time series.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"timetk::tk_tsfeatures() function implements tsfeatures package computing aggregated feature matrix time series useful many types analysis clustering time series. timetk version ports tsfeatures::tsfeatures() function tidyverse-compliant format uses tidy data frame containing grouping columns (optional), date column, value column. columns ignored. becomes easy summarize time series group-wise application .features, simply functions evaluate time series return single aggregated value. (Example: \"mean\" return mean time series (note values scaled mean 1 sd 0 first)) Function Internals: Internally, time series converted ts class using tk_ts(.period) period frequency time series. Values can provided .period, used prior convertion ts class. function leverages tsfeatures::tsfeatures() compute feature matrix summarized feature values.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"Rob Hyndman, Yanfei Kang, Pablo Montero-Manso, Thiyanga Talagala, Earo Wang, Yangzhuoran Yang, Mitchell O'Hara-Wild: tsfeatures R package","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_tsfeatures.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Time series feature matrix (Tidy) — tk_tsfeatures","text":"","code":"library(dplyr) library(timetk) walmart_sales_weekly %>% group_by(id) %>% tk_tsfeatures( .date_var = Date, .value = Weekly_Sales, .period = 52, .features = c(\"frequency\", \"stl_features\", \"entropy\", \"acf_features\", \"mean\"), .scale = TRUE, .prefix = \"ts_\" ) #> # A tibble: 7 × 22 #> # Groups: id [7] #> id ts_frequency ts_nperiods ts_seasonal_period ts_trend ts_spike #> #> 1 1_1 52 1 52 0.000670 0.0000280 #> 2 1_3 52 1 52 0.0614 0.00000987 #> 3 1_8 52 1 52 0.756 0.00000195 #> 4 1_13 52 1 52 0.354 0.00000475 #> 5 1_38 52 1 52 0.425 0.0000179 #> 6 1_93 52 1 52 0.791 0.000000754 #> 7 1_95 52 1 52 0.639 0.000000567 #> # ℹ 16 more variables: ts_linearity , ts_curvature , ts_e_acf1 , #> # ts_e_acf10 , ts_seasonal_strength , ts_peak , #> # ts_trough , ts_entropy , ts_x_acf1 , ts_x_acf10 , #> # ts_diff1_acf1 , ts_diff1_acf10 , ts_diff2_acf1 , #> # ts_diff2_acf10 , ts_seas_acf1 , ts_mean "},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"Coerce time series objects tibbles date/date-time columns xts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"","code":"tk_xts(data, select = NULL, date_var = NULL, silent = FALSE, ...) tk_xts_(data, select = NULL, date_var = NULL, silent = FALSE, ...)"},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. silent Used toggle printing messages warnings. ... Additional parameters passed xts::xts(). Refer xts::xts().","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"Returns xts object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"tk_xts wrapper xts::xts() designed coerce tibble objects \"time-base\" (meaning values vary time) xts class objects. three main advantages: Non-numeric columns removed via select dropped user warned. prevents error coercion issue occurring. date column auto-detected specified date_var. takes effort user assign date vector coercion. ts objects automatically coerced \"timetk index\" present. Refer tk_ts(). select argument can used select subsets columns incoming data.frame. columns containing numeric data coerced. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying xts::xts() function can used. user must pass vector dates date-times order.used. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using xts::xts(). tk_xts_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_xts.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_xts","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to xts: Comparison between tk_xts() and xts::xts() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # xts: Character columns cause coercion issues; order.by must be passed a vector of dates xts::xts(data_tbl[,-1], order.by = data_tbl$date) #> x y z #> 2016-01-01 chr values 1 8.052092 #> 2016-01-02 chr values 3 16.836192 #> 2016-01-03 chr values 6 26.352300 #> 2016-01-04 chr values 10 36.600416 #> 2016-01-05 chr values 15 47.580541 # tk_xts: Non-numeric columns automatically dropped; No need to specify date column tk_xts(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z #> 2016-01-01 1 8.052092 #> 2016-01-02 3 16.836192 #> 2016-01-03 6 26.352300 #> 2016-01-04 10 36.600416 #> 2016-01-05 15 47.580541 # ts can be coerced back to xts data_tbl %>% tk_ts(start = 2016, freq = 365) %>% tk_xts() #> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z #> 2016-01-01 1 8.052092 #> 2016-01-02 3 16.836192 #> 2016-01-03 6 26.352300 #> 2016-01-04 10 36.600416 #> 2016-01-05 15 47.580541 ### Using select and date_var tk_xts(data_tbl, select = y, date_var = date) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15 ### NSE: Enables programming date_var <- \"date\" select <- \"y\" tk_xts_(data_tbl, select = select, date_var = date_var) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"Coerce time series objects tibbles date/date-time columns xts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"","code":"tk_zoo(data, select = NULL, date_var = NULL, silent = FALSE, ...) tk_zoo_(data, select = NULL, date_var = NULL, silent = FALSE, ...)"},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced ts class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. silent Used toggle printing messages warnings. ... Additional parameters passed xts::xts(). Refer xts::xts().","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"Returns zoo object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"tk_zoo wrapper zoo::zoo() designed coerce tibble objects \"time-base\" (meaning values vary time) zoo class objects. three main advantages: Non-numeric columns removed via select dropped user warned. prevents error coercion issue occurring. date column auto-detected specified date_var. takes effort user assign date vector coercion. ts objects automatically coerced \"timetk index\" present. Refer tk_ts(). select argument can used select subsets columns incoming data.frame. columns containing numeric data coerced. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying zoo::zoo() function can used. user must pass vector dates date-times order.used. Important Note: ... arguments passed xts::xts(), enables additional information (e.g. time zone) attribute zoo object. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using zoo::zoo(). tk_zoo_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_zoo.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to xts. — tk_zoo","text":"","code":"library(tibble) library(dplyr) library(timetk) ### tibble to zoo: Comparison between tk_zoo() and zoo::zoo() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # zoo: Characters will cause error; order.by must be passed a vector of dates zoo::zoo(data_tbl[,-c(1,2)], order.by = data_tbl$date) #> y z #> 2016-01-01 1 17.95465 #> 2016-01-02 3 37.54154 #> 2016-01-03 6 58.76067 #> 2016-01-04 10 81.61205 #> 2016-01-05 15 106.09566 # tk_zoo: Character columns dropped with a warning; No need to specify dates (auto detected) tk_zoo(data_tbl) #> Warning: Non-numeric columns being dropped: date, x #> Using column `date` for date_var. #> y z #> 2016-01-01 1 17.95465 #> 2016-01-02 3 37.54154 #> 2016-01-03 6 58.76067 #> 2016-01-04 10 81.61205 #> 2016-01-05 15 106.09566 # ts can be coerced back to zoo data_tbl %>% tk_ts(start = 2016, freq = 365) %>% tk_zoo() #> Warning: Non-numeric columns being dropped: date, x #> Warning: 'tzone' attributes are inconsistent #> y z #> 2016-01-01 1 17.95465 #> 2016-01-02 3 37.54154 #> 2016-01-03 6 58.76067 #> 2016-01-04 10 81.61205 #> 2016-01-05 15 106.09566 ### Using select and date_var tk_zoo(data_tbl, select = y, date_var = date) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15 ### NSE: Enables programming date_var <- \"date\" select <- \"y\" tk_zoo_(data_tbl, select = select, date_var = date_var) #> y #> 2016-01-01 1 #> 2016-01-02 3 #> 2016-01-03 6 #> 2016-01-04 10 #> 2016-01-05 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":null,"dir":"Reference","previous_headings":"","what":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"Coerce time series objects tibbles date/date-time columns ts.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"","code":"tk_zooreg( data, select = NULL, date_var = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), order.by = NULL, silent = FALSE ) tk_zooreg_( data, select = NULL, date_var = NULL, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption(\"ts.eps\"), order.by = NULL, silent = FALSE )"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced zooreg class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. start time first observation. Either single number vector two integers, specify natural time unit (1-based) number samples time unit. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. order.vector observations x ordered. specified arguments start end ignored zoo(data, order., frequency) called. See zoo information. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"Returns zooreg object.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"tk_zooreg() wrapper zoo::zooreg() designed coerce tibble objects \"time-base\" (meaning values vary time) zooreg class objects. two main advantages: Non-numeric columns get removed instead causing coercion issues. index present, returned zooreg object retains index retrievable using tk_index(). select argument used select subsets columns incoming data.frame. date_var can used specify column date index. date_var = NULL, date / date-time column interpreted. Optionally, order.argument underlying xts::xts() function can used. user must pass vector dates date-times order.used. columns containing numeric data coerced. minimum, frequency start specified. non-data.frame object classes (e.g. xts, zoo, timeSeries, etc) objects coerced using zoo::zooreg(). tk_zooreg_ nonstandard evaluation method.","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Coerce time series objects and tibbles with date/date-time columns to ts. — tk_zooreg","text":"","code":"### tibble to zooreg: Comparison between tk_zooreg() and zoo::zooreg() data_tbl <- tibble::tibble( date = seq.Date(as.Date(\"2016-01-01\"), by = 1, length.out = 5), x = rep(\"chr values\", 5), y = cumsum(1:5), z = cumsum(11:15) * rnorm(1)) # zoo::zooreg: Values coerced to character; Result does not retain index data_zooreg <- zoo::zooreg(data_tbl[,-1], start = 2016, freq = 365) data_zooreg # Numeric values coerced to character #> x y z #> 2016(1) chr values 1 3.614062 #> 2016(2) chr values 3 7.556675 #> 2016(3) chr values 6 11.827839 #> 2016(4) chr values 10 16.427554 #> 2016(5) chr values 15 21.355821 rownames(data_zooreg) # NULL, no dates retained #> NULL # tk_zooreg: Only numeric columns get coerced; Result retains index as rownames data_tk_zooreg <- tk_zooreg(data_tbl, start = 2016, freq = 365) #> Warning: Non-numeric columns being dropped: date, x data_tk_zooreg # No inadvertent coercion to character class #> y z #> 2016(1) 1 3.614062 #> 2016(2) 3 7.556675 #> 2016(3) 6 11.827839 #> 2016(4) 10 16.427554 #> 2016(5) 15 21.355821 # timetk index tk_index(data_tk_zooreg, timetk_idx = FALSE) # Regularized index returned #> [1] 2016.000 2016.003 2016.005 2016.008 2016.011 tk_index(data_tk_zooreg, timetk_idx = TRUE) # Original date index returned #> [1] \"2016-01-01\" \"2016-01-02\" \"2016-01-03\" \"2016-01-04\" \"2016-01-05\" ### Using select and date_var tk_zooreg(data_tbl, select = y, date_var = date, start = 2016, freq = 365) #> y #> 2016(1) 1 #> 2016(2) 3 #> 2016(3) 6 #> 2016(4) 10 #> 2016(5) 15 ### NSE: Enables programming select <- \"y\" date_var <- \"date\" tk_zooreg_(data_tbl, select = select, date_var = date_var, start = 2016, freq = 365) #> y #> 2016(1) 1 #> 2016(2) 3 #> 2016(3) 6 #> 2016(4) 10 #> 2016(5) 15"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":null,"dir":"Reference","previous_headings":"","what":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"Method dispatch Zooreg","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"","code":"tk_zooreg_dispatch_( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent ) tk_zooreg_.data.frame( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent ) tk_zooreg_.default( data, select, date_var, start, end, frequency, deltat, ts.eps, order.by, silent )"},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"data time-based tibble time-series object. select Applicable tibbles data frames . column set columns coerced zooreg class. date_var Applicable tibbles data frames . Column name used order.. NULL default. NULL, function find date date-time column. start time first observation. Either single number vector two integers, specify natural time unit (1-based) number samples time unit. end time last observation, specified way start. frequency number observations per unit time. deltat fraction sampling period successive observations; e.g., 1/12 monthly data. one frequency deltat provided. ts.eps time series comparison tolerance. Frequencies considered equal absolute difference less ts.eps. order.vector observations x ordered. specified arguments start end ignored zoo(data, order., frequency) called. See zoo information. silent Used toggle printing messages warnings.","code":""},{"path":"https://business-science.github.io/timetk/reference/tk_zooreg_dispatch_.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"S3 methods for zooreg method dispatch — tk_zooreg_dispatch_","text":"character vector","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"mainly wrapper outlier cleaning function, tsclean(), forecast R package. ts_clean_vec() function includes arguments applying seasonality numeric vector (non-ts) via period argument.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"","code":"ts_clean_vec(x, period = 1, lambda = NULL)"},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"x numeric vector. period seasonal period use transformation. period = 1, seasonality included supsmu() used fit trend. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"numeric vector missing values /anomalies transformed imputed values.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"Cleaning Outliers Non-Seasonal (period = 1): Uses stats::supsmu() Seasonal (period > 1): Uses forecast::mstl() robust = TRUE (robust STL decomposition) seasonal series. estimate missing values outlier replacements, linear interpolation used (possibly seasonally adjusted) series. See forecast::tsoutliers() outlier detection method. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/ts_clean_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Replace Outliers & Missing Values in a Time Series — ts_clean_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- values <- c(1,2,3, 4*2, 5,6,7, NA, 9,10,11, 12*2) values #> [1] 1 2 3 8 5 6 7 NA 9 10 11 24 # Linear interpolation + Outlier Cleansing ts_clean_vec(values, period = 1, lambda = NULL) #> [1] 1 2 3 4 5 6 7 8 9 9 9 9 # Seasonal Interpolation: set period = 4 ts_clean_vec(values, period = 4, lambda = NULL) #> [1] 1.00000 2.00000 3.00000 8.00000 5.00000 6.00000 7.00000 11.25703 #> [9] 9.00000 10.00000 10.00000 14.00000 # Seasonal Interpolation with Box Cox Transformation (internal) ts_clean_vec(values, period = 4, lambda = \"auto\") #> [1] 1.000000 2.000000 3.000000 8.444127 3.832690 6.000000 7.000000 #> [8] 15.895521 9.000000 10.000000 11.000000 24.000000"},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":null,"dir":"Reference","previous_headings":"","what":"Missing Value Imputation for Time Series — ts_impute_vec","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"mainly wrapper Seasonally Adjusted Missing Value using Linear Interpolation function, na.interp(), forecast R package. ts_impute_vec() function includes arguments applying seasonality numeric vector (non-ts) via period argument.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"","code":"ts_impute_vec(x, period = 1, lambda = NULL)"},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"x numeric vector. period seasonal period use transformation. period = 1, linear interpolation performed. period > 1, robust STL decomposition first performed linear interpolation applied seasonally adjusted data. lambda box cox transformation parameter. set \"auto\", performs automated lambda selection.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"numeric vector missing values imputed.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"Imputation using Linear Interpolation Three circumstances cause strictly linear interpolation: Period 1: period = 1, seasonality interpreted therefore linear used. Number Non-Missing Values less 2-Periods: Insufficient values exist detect seasonality. Number Total Values less 3-Periods: Insufficient values exist detect seasonality. Seasonal Imputation using Linear Interpolation seasonal series period > 1, robust Seasonal Trend Loess (STL) decomposition first computed. linear interpolation applied seasonally adjusted data, seasonal component added back. Box Cox Transformation many circumstances, Box Cox transformation can help. Especially series multiplicative meaning variance grows exponentially. Box Cox transformation can automated setting lambda = \"auto\" can specified setting lambda = numeric value.","code":""},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"Forecast R Package Forecasting Principles & Practices: Dealing missing values outliers","code":""},{"path":[]},{"path":"https://business-science.github.io/timetk/reference/ts_impute_vec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Missing Value Imputation for Time Series — ts_impute_vec","text":"","code":"library(dplyr) library(timetk) # --- VECTOR ---- values <- c(1,2,3, 4*2, 5,6,7, NA, 9,10,11, 12*2) values #> [1] 1 2 3 8 5 6 7 NA 9 10 11 24 # Linear interpolation ts_impute_vec(values, period = 1, lambda = NULL) #> [1] 1 2 3 8 5 6 7 8 9 10 11 24 # Seasonal Interpolation: set period = 4 ts_impute_vec(values, period = 4, lambda = NULL) #> [1] 1 2 3 8 5 6 7 8 9 10 11 24 # Seasonal Interpolation with Box Cox Transformation (internal) ts_impute_vec(values, period = 4, lambda = \"auto\") #> [1] 1.000000 2.000000 3.000000 8.000000 5.000000 6.000000 7.000000 #> [8] 7.960572 9.000000 10.000000 11.000000 24.000000"},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"Kaggle \"Walmart Recruiting - Store Sales Forecasting\" Competition used retail data combinations stores departments within store. competition began February 20th, 2014 ended May 5th, 2014. competition included data 45 retail stores located different regions. dataset included various external features including Holiday information, Temperature, Fuel Price, Markdown. dataset includes Sample 7 departments Store ID 1 (7 total time series).","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"","code":"walmart_sales_weekly"},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"tibble: 9,743 x 3 id Factor. Unique series identifier (4 total) Store Numeric. Store ID. Dept Numeric. Department ID. Date Date. Weekly timestamp. Weekly_Sales Numeric. Sales given department given store. IsHoliday Logical. Whether week \"special\" holiday store. Type Character. Type identifier store. Size Numeric. Store square-footage Temperature Numeric. Average temperature region. Fuel_Price Numeric. Cost fuel region. MarkDown1, MarkDown2, MarkDown3, MarkDown4, MarkDown5 Numeric. Anonymized data related promotional markdowns Walmart running. MarkDown data available Nov 2011, available stores time. missing value marked NA. CPI Numeric. consumer price index. Unemployment Numeric. unemployment rate region.","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"Kaggle Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"sample 7 Weekly data sets Kaggle Walmart Recruiting Store Sales Forecasting competition. Holiday Features four holidays fall within following weeks dataset (holidays data): Super Bowl: 12-Feb-10, 11-Feb-11, 10-Feb-12, 8-Feb-13 Labor Day: 10-Sep-10, 9-Sep-11, 7-Sep-12, 6-Sep-13 Thanksgiving: 26-Nov-10, 25-Nov-11, 23-Nov-12, 29-Nov-13 Christmas: 31-Dec-10, 30-Dec-11, 28-Dec-12, 27-Dec-13","code":""},{"path":"https://business-science.github.io/timetk/reference/walmart_sales_weekly.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample Time Series Retail Data from the Walmart Recruiting Store Sales Forecasting Competition — walmart_sales_weekly","text":"","code":"walmart_sales_weekly #> # A tibble: 1,001 × 17 #> id Store Dept Date Weekly_Sales IsHoliday Type Size Temperature #> #> 1 1_1 1 1 2010-02-05 24924. FALSE A 151315 42.3 #> 2 1_1 1 1 2010-02-12 46039. TRUE A 151315 38.5 #> 3 1_1 1 1 2010-02-19 41596. FALSE A 151315 39.9 #> 4 1_1 1 1 2010-02-26 19404. FALSE A 151315 46.6 #> 5 1_1 1 1 2010-03-05 21828. FALSE A 151315 46.5 #> 6 1_1 1 1 2010-03-12 21043. FALSE A 151315 57.8 #> 7 1_1 1 1 2010-03-19 22137. FALSE A 151315 54.6 #> 8 1_1 1 1 2010-03-26 26229. FALSE A 151315 51.4 #> 9 1_1 1 1 2010-04-02 57258. FALSE A 151315 62.3 #> 10 1_1 1 1 2010-04-09 42961. FALSE A 151315 65.9 #> # ℹ 991 more rows #> # ℹ 8 more variables: Fuel_Price , MarkDown1 , MarkDown2 , #> # MarkDown3 , MarkDown4 , MarkDown5 , CPI , #> # Unemployment "},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"Kaggle \"Web Traffic Forecasting\" (Wikipedia) Competition used Google Analytics Web Traffic Data 145,000 websites. time series represent number daily views different Wikipedia articles. competition began July 13th, 2017 ended November 15th, 2017. dataset includes Sample 10 article pages (10 total time series).","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"","code":"wikipedia_traffic_daily"},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"tibble: 9,743 x 3 Page Character. Page information. date Date. Daily timestamp. value Numeric. Daily views wikipedia article.","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"Kaggle Competition Website","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"sample 10 Daily data sets Kaggle Web Traffic Forecasting (Wikipedia) Competition","code":""},{"path":"https://business-science.github.io/timetk/reference/wikipedia_traffic_daily.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample Daily Time Series Data from the Web Traffic Forecasting (Wikipedia) Competition — wikipedia_traffic_daily","text":"","code":"wikipedia_traffic_daily #> # A tibble: 5,500 × 3 #> Page date value #> #> 1 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-01 791 #> 2 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-02 704 #> 3 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-03 903 #> 4 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-04 732 #> 5 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-05 558 #> 6 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-06 504 #> 7 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-07 543 #> 8 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-08 1156 #> 9 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-09 1196 #> 10 Death_of_Freddie_Gray_en.wikipedia.org_mobile-web_all-agents 2015-07-10 701 #> # ℹ 5,490 more rows"},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-284","dir":"Changelog","previous_headings":"","what":"timetk 2.8.4","title":"timetk 2.8.4","text":"Update forecasting vignette: Use glmnet time series forecasting. CRAN Fixes: - tzdata time zone fixes: - GB -> Europe/London - NZ -> Pacific/Auckland - US/Eastern -> America/New_York - US/Pacific -> America/Los_Angeles - Add @aliases timetk-package","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-283","dir":"Changelog","previous_headings":"","what":"timetk 2.8.3","title":"timetk 2.8.3","text":"CRAN release: 2023-03-30 remove support robets remove tidyquant examples remove tidyverse examples add FANG dataset timetk (port tidyquant) cran: fix return, dontrun -> donttest, options(max.print)","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-282","dir":"Changelog","previous_headings":"","what":"timetk 2.8.2","title":"timetk 2.8.2","text":"CRAN release: 2022-11-17 New Features plot_time_series(): Gets new arguments specify .x_intercept .x_intercept_color. #131 Fixes Fix error plot_time_series() .group_names found. #121 Merge variable checking update needed recipes >= 1.0.3 #132","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-281","dir":"Changelog","previous_headings":"","what":"timetk 2.8.1","title":"timetk 2.8.1","text":"CRAN release: 2022-05-31","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"trelliscope-plotting-2-8-1","dir":"Changelog","previous_headings":"","what":"Trelliscope Plotting","title":"timetk 2.8.1","text":"plot_time_series() plot_time_series_boxplot() plot_anomaly_diagnostics()","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-280","dir":"Changelog","previous_headings":"","what":"timetk 2.8.0","title":"timetk 2.8.0","text":"CRAN release: 2022-04-07 New Features Many plotting functions upgraded use trelliscopejs easier visualization many time series. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Gets new argument trelliscope: Used visualizing many time series. Gets new argument .facet_strip_remove remove facet strips since trelliscope automatically labeled. Gets new argument .facet_nrow adjust grid trelliscope. default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip. Updates & Bug Fixes Recipes steps (e.g. step_timeseries_signature()) use new recipes::print_step() function. Requires recipes >= 0.2.0. #110 Offset parameter step_log_interval() working properly. Now works. #103 Potential Breaking Changes default argument .facet_collapse = TRUE changed FALSE better compatibility Trelliscope JS. may cause plots multiple groups take extra space strip.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-270","dir":"Changelog","previous_headings":"","what":"timetk 2.7.0","title":"timetk 2.7.0","text":"CRAN release: 2022-01-19 New Features tk_tsfeatures(): new function makes easy generate time series feature matrix using tsfeatures. main benefit can pipe time series data tibbles dplyr groups. features produced group. #95 #84 plot_time_series_boxplot(): new function makes plotting time series boxplots simple using .period argument time series aggregation. New Vignettes Time Series Clustering: Uses new tk_tsfeatures() function perform time series clustering. #95 #84 Time Series Visualization: Updated include plot_time_series_boxplot() plot_time_series_regression(). Improvements Improvements point forecasting target n-periods future. time_series_cv(), time_series_split(): New parameter point_forecast. useful testing / assessing n-th prediction future. set TRUE, return single point returns last value assess. Fixes Updates rlang > 0.4.11 (dev version) #98 plot_time_series(): Smoother longer fails time series 1 observation #106","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-262","dir":"Changelog","previous_headings":"","what":"timetk 2.6.2","title":"timetk 2.6.2","text":"CRAN release: 2021-11-16 Improvements summarize_by_time(): Added .week_start argument allow specifying .week_start = 1 Monday start. Default 7 Sunday Start. can also changed lubridate setting lubridate.week.start option. Plotting Functions: Several plotting functions gain new .facet_dir argument adjusting direction facet_wrap(dir). #94 Plot ACF Diagnostics (plot_acf_diagnostics()): Change default parameter .show_white_noise_bars = TRUE. #85 plot_timeseries_regression(): Can now show_summary group-wise models visualizing groups Time Series CV (time_series_cv()): Add Label tune_results Improve speed pad_by_time(). #93 Bug Fixes tk_make_timeseries() tk_make_future_timeseries() now able handle end months. #72 tk_tbl.zoo(): Fix issue readr::type_convert() produces warning messages character columns inputs. #89 plot_time_series_regression(): Fixed issue lags added .formula. Pads lags NA. step_fourier() fourier_vec(): Fixed issue step_fourier failing one observation. Added scale_factor argument override date sequences stored scale factor. #77","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-261","dir":"Changelog","previous_headings":"","what":"timetk 2.6.1","title":"timetk 2.6.1","text":"CRAN release: 2021-01-18 Improvements tk_augment_slidify(), tk_augment_lags(), tk_augment_leads(), tk_augment_differences(): Now works multiple columns (passed via .value) tidyselect (e.g. contains()). Fixes Reduce “New names” messages. Remove dependency lazyeval. #24 Fix deprecated functions: select_() used tk_xts_(). #52","code":"#> New names: #> * NA -> ...1"},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-260","dir":"Changelog","previous_headings":"","what":"timetk 2.6.0","title":"timetk 2.6.0","text":"CRAN release: 2020-11-21 New Functions filter_period() (#64): Applies filtering expressions within time-based periods (windows). slice_period() (#64): Applies slices within time-based periods (windows). condense_period() (#64): Converts periodicity higher (e.g. daily) lower (e.g. monthly) frequency. Similar xts::.period() tibbletime::as_period(). tk_augment_leads() lead_vec() (#65): Added make easier / obvious create leads. Fixes time_series_cv(): Fix bug Panel Data. Train/Test Splits returning 1st observation final time stamp. return observations. future_frame() tk_make_future_timeseries(): Now sort incoming index ensure dates returned go future. tk_augment_lags() tk_augment_slidify(): Now overwrite column names match behavior tk_augment_fourier() tk_augment_differences().","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-250","dir":"Changelog","previous_headings":"","what":"timetk 2.5.0","title":"timetk 2.5.0","text":"CRAN release: 2020-10-22 Improvements time_series_cv(): Now works time series groups. great working panel data. future_frame(): Gets new argument called .bind_data. set TRUE, performs data binding operation incoming data future frame. Miscellaneous Tune startup messages (#63)","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-240","dir":"Changelog","previous_headings":"","what":"timetk 2.4.0","title":"timetk 2.4.0","text":"CRAN release: 2020-10-08 step_slidify_augment() - variant step slidify adds multiple rolling columns inside recipe. Bug Fixes Add warning %+time% %-time% return missing values Fix issues tk_make_timeseries() tk_make_future_timeseries() providing odd results regular time series. GitHub Issue 60","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-230","dir":"Changelog","previous_headings":"","what":"timetk 2.3.0","title":"timetk 2.3.0","text":"CRAN release: 2020-09-29 New Functionality tk_time_series_cv_plan() - Now works k-fold cross validation objects vfold_cv() function. pad_by_time() - Added new argument .fill_na_direction specify tidyr::fill() strategy filling missing data. Bug Fixes Augment functions (e.g. tk_augment_lags()) - Fix bug grouped functions exported Vectorized Functions - Compatabiliy ts class","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-221","dir":"Changelog","previous_headings":"","what":"timetk 2.2.1","title":"timetk 2.2.1","text":"CRAN release: 2020-09-01 New Functions step_log_interval_vec() - Extends log_interval_vec() recipes preprocessing. Parallel Processing Parallel backend use tune recipes Bug Fixes log_interval_vec() - Correct messaging complement.ts_cv_split - Helper show time series cross validation splits list explorer.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-220","dir":"Changelog","previous_headings":"","what":"timetk 2.2.0","title":"timetk 2.2.0","text":"CRAN release: 2020-07-18 New Functions mutate_by_time(): applying mutates time windows log_interval_vec() & log_interval_inv_vec(): constrained interval forecasting. Improvements plot_acf_diagnostics(): new argument, .show_white_noise_bars adding white noise bars ACF / PACF Plot. pad_by_time(): New arguments .start_date .end_date expanding/contracting padding windows.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-210","dir":"Changelog","previous_headings":"","what":"timetk 2.1.0","title":"timetk 2.1.0","text":"CRAN release: 2020-07-03 New Functions plot_time_series_regression(): Convenience function visualize & explore features using Linear Regression (stats::lm() formula). time_series_split(): convenient way return single split time_series_cv(). Returns split format rsample::initial_time_split(). Improvements Auto-detect date date-time: Affects summarise_by_time(), filter_by_time(), tk_summary_diagnostics tk_time_series_cv_plan(): Allow single resample rsample::initial_time_split timetk::time_series_split Updated Vignette: vignette, “Forecasting Using Time Series Signature”, updated modeltime tidymodels. Plotting Improvements plotting functions now support Tab Completion (minor breaking change needed , see breaking changes ) Add .legend_show toggle /legends. Permit numeric index (fix issue smoother failing) Breaking Changes plot_time_series() plot_acf_diagnostics() plot_anomaly_diagnostics() plot_seasonal_diagnostics() plot_stl_diagnostics() Bug Fixes fourier_vec() step_fourier_vec(): Add error observations zero difference. Issue #40.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-200","dir":"Changelog","previous_headings":"","what":"timetk 2.0.0","title":"timetk 2.0.0","text":"CRAN release: 2020-05-31 New Interactive Plotting Functions plot_anomaly_diagnostics(): Visualize Anomalies One Time Series New Data Wrangling Functions future_frame(): Make future tibble existing time-based tibble. New Diagnostic / Data Processing Functions tk_anomaly_diagnostics() - Group-wise anomaly detection diagnostics. wrapper anomalize R package functions without importing anomalize. New Vectorized Functions: ts_clean_vec() - Replace Outliers & Missing Values Time Series standardize_vec() - Centers scales time series mean 0, standard deviation 1 normalize_vec() - Normalizes time series Range: (0, 1) New Recipes Preprocessing Steps: step_ts_pad() - Preprocessing padding time series data. Adds rows fill gaps can used step_ts_impute() interpolate going low high frequency! step_ts_clean() - Preprocessing step cleaning outliers imputing missing values time series. New Parsing Functions parse_date2() parse_datetime2(): similar readr::parse_date() lubridate::as_date() parse character vectors date datetimes. key advantage SPEED. parse_date2() uses anytime package process using C++ Boost.Date_Time library. Improvements: plot_acf_diagnostics(): .lags argument now handles time-based phrases (e.g. .lags = \"1 month\"). time_series_cv(): Implements time-based phrases (e.g. initial = \"5 years\" assess = \"1 year\") tk_make_future_timeseries(): n_future argument deprecated new length_out argument accepts numeric input (e.g. length_out = 12) time-based phrases (e.g. length_out = \"12 months\"). major improvement numeric values define number timestamps returned even weekends removed holidays removed. Thus, can always anticipate length. (Issue #19). diff_vec: Now reports initial values used differencing calculation. Bug Fixes: Fix name collision .value = .value. Respect timezones Fix incorrect calculation starts/stops Make skip = 1 default. skip = 0 make sense. Fix issue skip adding 1 stops. Fix printing method Prevent name collisions underlying data column “id” “splits” Fix bug day month doesn’t exist. Lubridate period() returns NA. Fix implemented ceiling_date(). Fix pad_value inserts pad values new row inserted. Fix issue lambda = NULL Breaking Changes: major impact since 1.0.0 version just released. Renamed impute_ts_vec() ts_impute_vec() consistency ts_clean_vec() Renamed step_impute_ts() step_ts_impute() consistency underlying function Renamed roll_apply_vec() slidify_vec() consistency slidify() & relationship slider R package Renamed step_roll_apply step_slidify() consistency slidify() & relationship slider R package Renamed tk_augment_roll_apply tk_augment_slidify() consistency slidify() & relationship slider R package plot_time_series_cv_plan() tk_time_series_cv_plan(): Changed argument .rset .data.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-100","dir":"Changelog","previous_headings":"","what":"timetk 1.0.0","title":"timetk 1.0.0","text":"CRAN release: 2020-04-19 New Interactive Plotting Functions: plot_time_series() - workhorse time-series plotting function generates interactive plotly plots, consolidates 20+ lines ggplot2 code, scales well many time series using dplyr groups. plot_acf_diagnostics() - Visualize ACF, PACF, number CCFs one plot Multiple Time Series. Interactive plotly default. plot_seasonal_diagnostics() - Visualize Multiple Seasonality Features One Time Series. Interactive plotly default. plot_stl_diagnostics() - Visualize STL Decomposition Features One Time Series. plot_time_series_cv_plan() - Visualize Time Series Cross Validation plan made time_series_cv(). New Time Series Data Wrangling: summarise_by_time() - time-based variant dplyr::summarise() flexible summarization using common time-based criteria. filter_by_time() - time-based variant dplyr::filter() flexible filtering time-ranges. pad_by_time() - Insert time series rows regularly spaced timestamps. slidify() - Make function rolling / sliding function. between_time() - time-based variant dplyr::() flexible time-range detection. add_time() - Add time series index. Shifts index period. New Recipe Functions: Feature Generators: step_holiday_signature() - New recipe step adding 130 holiday features based individual holidays, locales, stock exchanges / business holidays. step_fourier() - New recipe step adding fourier transforms adding seasonal features time series data step_roll_apply() - New recipe step adding rolling summary functions. Similar recipes::step_window() flexible enabling application summary function. step_smooth() - New recipe step adding Local Polynomial Regression (LOESS) smoothing noisy time series step_diff() - New recipe adding multiple differenced columns. Similar recipes::step_lag(). step_box_cox() - New recipe transforming predictors. Similar step_BoxCox() improvements forecasting including “guerrero” method lambda selection handling negative data. step_impute_ts() - New recipe imputing time series. New Rsample Functions time_series_cv() - Create rsample cross validation sets time series. function produces sampling plan starting recent time series observations, rolling backwards. New Vector Functions: functions useful inside mutate() power many new plotting recipes functions. roll_apply_vec() - Vectorized rolling apply function - wraps slider::slide_vec() smooth_vec() - Vectorized smoothing function - Applies Local Polynomial Regression (LOESS) diff_vec() diff_inv_vec() - Vectorized differencing function. Pads NA’s default (unlike stats::diff). lag_vec() - Vectorized lag functions. Returns lags leads (negative lags) adjusting .lag argument. box_cox_vec(), box_cox_inv_vec(), & auto_lambda() - Vectorized Box Cox transformation. Leverages forecast::BoxCox.lambda() automatic lambda selection. fourier_vec() - Vectorized Fourier Series calculation. impute_ts_vec() - Vectorized imputation missing values time series. Leverages forecast::na.interp(). New Augment Functions: functions designed scale. respect dplyr::group_by(). tk_augment_holiday_signature() - Add holiday features data.frame using time-series index. tk_augment_roll_apply() - Add multiple columns rolling window calculations data.frame. tk_augment_differences() - Add multiple columns differences data.frame. tk_augment_lags() - Add multiple columns lags data.frame. tk_augment_fourier() - Add multiple columns fourier series data.frame. New Make Functions: Make date date-time sequences start end dates. tk_make_timeseries() - Super flexible function creating daily sub-daily time series. tk_make_weekday_sequence() - Weekday sequence accounts stripping weekends holidays tk_make_holiday_sequence() - Makes sequence dates corresponding business holidays calendars timeDate (common non-working days) tk_make_weekend_sequence() - Weekday sequence dates Saturday Sunday (common non-working days) New Get Functions: tk_get_holiday_signature() - Get 100+ holiday features using time-series index. tk_get_frequency() tk_get_trend() - Automatic frequency trend calculation time series index. New Diagnostic / Data Processing Functions tk_summary_diagnostics() - Group-wise time series summary. tk_acf_diagnostics() - data preparation function plot_acf_diagnostics() tk_seasonal_diagnostics() - data preparation function plot_seasonal_diagnostics() tk_stl_diagnostics() - Group-wise STL Decomposition (Season, Trend, Remainder). Data prep plot_stl_diagnostics(). tk_time_series_cv_plan - data preparation function plot_time_series_cv_plan() New Datasets M4 Competition - Sample “economic” datasets hourly, daily, weekly, monthly, quarterly, yearly. Walmart Recruiting Retail Sales Forecasting Competition - Sample 7 retail time series Web Traffic Forecasting (Wikipedia) Competition - Sample 10 website time series Taylor’s Energy Demand - Single time series 30-minute interval energy demand UCI Bike Sharing Daily - time series consisting Capital Bikesharing Transaction Counts related time-based features. Improvements: * tk_make_future_timeseries() - Now accepts n_future time-based phrase like “12 seconds” “1 year”. Bug Fixes: Don’t set timezone date - Accommodate recent changes lubridate::tz<- now returns POSIXct used Date objects. Fixed PR32 @vspinu. Potential Breaking Changes: tk_augment_timeseries_signature() - Changed data .data prevent name collisions piping.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-013","dir":"Changelog","previous_headings":"","what":"timetk 0.1.3","title":"timetk 0.1.3","text":"CRAN release: 2020-03-18 New Features: step_timeseries_signature() - New step_timeseries_signature() adding date date-time features. New Vignette - “Time Series Machine Learning” (previously forecasting using time series signature) Bug Fixes: xts::indexTZ deprecated. Use tzone instead. Replace arrange_ arrange. Fix failing tests due tidyquant 1.0.0 upagrade (single stocks now return extra symbol column).","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-012","dir":"Changelog","previous_headings":"","what":"timetk 0.1.2","title":"timetk 0.1.2","text":"CRAN release: 2019-09-25 Compatability tidyquant v0.5.7 - Removed dependency tidyverse Dependency cleanup - removed devtools unncessary dependencies.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-011","dir":"Changelog","previous_headings":"","what":"timetk 0.1.1","title":"timetk 0.1.1","text":"CRAN release: 2018-05-14 Added timeSeries Suggests satisfy CRAN issue.","code":""},{"path":"https://business-science.github.io/timetk/news/index.html","id":"timetk-010","dir":"Changelog","previous_headings":"","what":"timetk 0.1.0","title":"timetk 0.1.0","text":"CRAN release: 2017-07-25 Renamed package timetk. formerly timekit. Fixed issue back-ticked date columns Update pkgdown support robets","code":""}]