[med-svn] [r-cran-fitcoach] 02/05: Imported Upstream version 1.0
Dylan Aïssi
bob.dybian-guest at moszumanska.debian.org
Fri Nov 4 22:41:45 UTC 2016
This is an automated email from the git hooks/post-receive script.
bob.dybian-guest pushed a commit to branch master
in repository r-cran-fitcoach.
commit d7113f48b666a006fe62a5687da88a60cd478a08
Author: Dylan Aïssi <bob.dybian at gmail.com>
Date: Thu Oct 27 23:29:07 2016 +0200
Imported Upstream version 1.0
---
DESCRIPTION | 18 +
MD5 | 148 ++++++
NAMESPACE | 43 ++
R/DataLoader.R | 135 ++++++
R/FitAnalyzer.R | 196 ++++++++
R/FitUtil.R | 505 +++++++++++++++++++++
.../daily-time-series/max-activityCalories.json | 1 +
inst/extdata/daily-time-series/max-calories.json | 1 +
.../extdata/daily-time-series/max-caloriesBMR.json | 1 +
inst/extdata/daily-time-series/max-distance.json | 1 +
inst/extdata/daily-time-series/max-elevation.json | 1 +
inst/extdata/daily-time-series/max-floors.json | 1 +
.../daily-time-series/max-minutesFairlyActive.json | 1 +
.../max-minutesLightlyActive.json | 1 +
.../daily-time-series/max-minutesSedentary.json | 1 +
.../daily-time-series/max-minutesVeryActive.json | 1 +
inst/extdata/daily-time-series/max-steps.json | 1 +
inst/extdata/daily-time-series/max-time31.json | 1 +
.../intra-calories-2015-12-10.json | 1 +
.../intra-calories-2015-12-11.json | 1 +
.../intra-calories-2015-12-12.json | 1 +
.../intra-calories-2015-12-13.json | 1 +
.../intra-calories-2015-12-14.json | 1 +
.../intra-calories-2015-12-15.json | 1 +
.../intra-calories-2015-12-16.json | 1 +
.../intra-calories-2015-12-17.json | 1 +
.../intra-calories-2015-12-18.json | 1 +
.../intra-calories-2015-12-19.json | 1 +
.../intra-calories-2015-12-20.json | 1 +
.../intra-calories-2015-12-21.json | 1 +
.../intra-calories-2015-12-22.json | 1 +
.../intra-calories-2015-12-23.json | 1 +
.../intra-calories-2015-12-24.json | 1 +
.../intra-calories-2015-12-25.json | 1 +
.../intra-calories-2015-12-26.json | 1 +
.../intra-calories-2015-12-27.json | 1 +
.../intra-calories-2015-12-28.json | 1 +
.../intra-calories-2015-12-29.json | 1 +
.../intra-calories-2015-12-30.json | 1 +
.../intra-distance-2015-12-10.json | 1 +
.../intra-distance-2015-12-11.json | 1 +
.../intra-distance-2015-12-12.json | 1 +
.../intra-distance-2015-12-13.json | 1 +
.../intra-distance-2015-12-14.json | 1 +
.../intra-distance-2015-12-15.json | 1 +
.../intra-distance-2015-12-16.json | 1 +
.../intra-distance-2015-12-17.json | 1 +
.../intra-distance-2015-12-18.json | 1 +
.../intra-distance-2015-12-19.json | 1 +
.../intra-distance-2015-12-20.json | 1 +
.../intra-distance-2015-12-21.json | 1 +
.../intra-distance-2015-12-22.json | 1 +
.../intra-distance-2015-12-23.json | 1 +
.../intra-distance-2015-12-24.json | 1 +
.../intra-distance-2015-12-25.json | 1 +
.../intra-distance-2015-12-26.json | 1 +
.../intra-distance-2015-12-27.json | 1 +
.../intra-distance-2015-12-28.json | 1 +
.../intra-distance-2015-12-29.json | 1 +
.../intra-distance-2015-12-30.json | 1 +
.../intra-elevation-2015-12-10.json | 1 +
.../intra-elevation-2015-12-11.json | 1 +
.../intra-elevation-2015-12-12.json | 1 +
.../intra-elevation-2015-12-13.json | 1 +
.../intra-elevation-2015-12-14.json | 1 +
.../intra-elevation-2015-12-15.json | 1 +
.../intra-elevation-2015-12-16.json | 1 +
.../intra-elevation-2015-12-17.json | 1 +
.../intra-elevation-2015-12-18.json | 1 +
.../intra-elevation-2015-12-19.json | 1 +
.../intra-elevation-2015-12-20.json | 1 +
.../intra-elevation-2015-12-21.json | 1 +
.../intra-elevation-2015-12-22.json | 1 +
.../intra-elevation-2015-12-23.json | 1 +
.../intra-elevation-2015-12-24.json | 1 +
.../intra-elevation-2015-12-25.json | 1 +
.../intra-elevation-2015-12-26.json | 1 +
.../intra-elevation-2015-12-27.json | 1 +
.../intra-elevation-2015-12-28.json | 1 +
.../intra-elevation-2015-12-29.json | 1 +
.../intra-elevation-2015-12-30.json | 1 +
.../intra-floors-2015-12-10.json | 1 +
.../intra-floors-2015-12-11.json | 1 +
.../intra-floors-2015-12-12.json | 1 +
.../intra-floors-2015-12-13.json | 1 +
.../intra-floors-2015-12-14.json | 1 +
.../intra-floors-2015-12-15.json | 1 +
.../intra-floors-2015-12-16.json | 1 +
.../intra-floors-2015-12-17.json | 1 +
.../intra-floors-2015-12-18.json | 1 +
.../intra-floors-2015-12-19.json | 1 +
.../intra-floors-2015-12-20.json | 1 +
.../intra-floors-2015-12-21.json | 1 +
.../intra-floors-2015-12-22.json | 1 +
.../intra-floors-2015-12-23.json | 1 +
.../intra-floors-2015-12-24.json | 1 +
.../intra-floors-2015-12-25.json | 1 +
.../intra-floors-2015-12-26.json | 1 +
.../intra-floors-2015-12-27.json | 1 +
.../intra-floors-2015-12-28.json | 1 +
.../intra-floors-2015-12-29.json | 1 +
.../intra-floors-2015-12-30.json | 1 +
.../intra-steps-2015-12-10.json | 1 +
.../intra-steps-2015-12-11.json | 1 +
.../intra-steps-2015-12-12.json | 1 +
.../intra-steps-2015-12-13.json | 1 +
.../intra-steps-2015-12-14.json | 1 +
.../intra-steps-2015-12-15.json | 1 +
.../intra-steps-2015-12-16.json | 1 +
.../intra-steps-2015-12-17.json | 1 +
.../intra-steps-2015-12-18.json | 1 +
.../intra-steps-2015-12-19.json | 1 +
.../intra-steps-2015-12-20.json | 1 +
.../intra-steps-2015-12-21.json | 1 +
.../intra-steps-2015-12-22.json | 1 +
.../intra-steps-2015-12-23.json | 1 +
.../intra-steps-2015-12-24.json | 1 +
.../intra-steps-2015-12-25.json | 1 +
.../intra-steps-2015-12-26.json | 1 +
.../intra-steps-2015-12-27.json | 1 +
.../intra-steps-2015-12-28.json | 1 +
.../intra-steps-2015-12-29.json | 1 +
.../intra-steps-2015-12-30.json | 1 +
man/DataLoader.Rd | 47 ++
man/FitAnalyzer.Rd | 33 ++
man/augmentData.Rd | 19 +
man/augmentIntraData.Rd | 19 +
man/buildChartDay.Rd | 20 +
man/buildChartIntra.Rd | 20 +
man/connectToAPI.Rd | 23 +
man/createDependentVariableFrame.Rd | 17 +
man/createGoalVariableVector.Rd | 17 +
man/createIntraFrame.Rd | 15 +
man/createTsMasterFrame.Rd | 20 +
man/fetchIntraResourceData.Rd | 22 +
man/getAPIScope.Rd | 16 +
man/getDailyResourcePathList.Rd | 15 +
man/getIntradayResourcePathList.Rd | 15 +
man/makeAPIRequest.Rd | 26 ++
man/markValidRows.Rd | 18 +
man/properCase.Rd | 18 +
man/writeToJSON.Rd | 23 +
tests/testthat.R | 4 +
tests/testthat/test-fitanalyzer.R | 51 +++
tests/testthat/test-fitutil.R | 45 ++
vignettes/examples/fitcoach-usage.Rmd | 220 +++++++++
vignettes/examples/fitcoach-usage.html | 403 ++++++++++++++++
vignettes/summary.Rmd | 37 ++
vignettes/summary.html | 124 +++++
149 files changed, 2449 insertions(+)
diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..15921e7
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,18 @@
+Package: fitcoach
+Type: Package
+Title: Personalized Coach for Fitbit and R API
+Version: 1.0
+Author: Niraj Juneja [aut, cre], Charles de Lassence [aut, cre]
+Maintainer: Niraj Juneja <njuneja at gmail.com>
+Description: Fitbit R API <https://dev.fitbit.com/> that provides fitbit coach functionality by analyzing your data obtained via fitbit API calls, and by giving personalized recommendations for the rest of the day based on your behavior.
+License: GPL-3
+Depends: R (>= 3.2.3)
+Imports: caret, dplyr, gbm, ggplot2, httr, jsonlite, plyr, R6, stats,
+ graphics, methods, reshape2
+LazyData: TRUE
+Suggests: testthat, knitr
+RoxygenNote: 5.0.1
+NeedsCompilation: no
+Packaged: 2016-04-18 23:05:26 UTC; webscale
+Repository: CRAN
+Date/Publication: 2016-04-19 08:12:01
diff --git a/MD5 b/MD5
new file mode 100644
index 0000000..2c873f3
--- /dev/null
+++ b/MD5
@@ -0,0 +1,148 @@
+6690c2a18b955e4ae07a963d4a3a3dbf *DESCRIPTION
+048c7f9fbd9cd783fd041f7598fbabd4 *NAMESPACE
+e01facbb1a21cd984170b465b185363b *R/DataLoader.R
+fa333565a02759bc3ac930dcd9559774 *R/FitAnalyzer.R
+06bc3ed2125ce057d6a086a75334a704 *R/FitUtil.R
+e05a566b792beddc9c872dfe546365e1 *inst/extdata/daily-time-series/max-activityCalories.json
+2d021c358af01feaae5ce3cce03f7b56 *inst/extdata/daily-time-series/max-calories.json
+08fe798d92e0c8b11eed75eb603e554a *inst/extdata/daily-time-series/max-caloriesBMR.json
+bc039c1ce805ca2de589a46156871883 *inst/extdata/daily-time-series/max-distance.json
+c1f623d1a05970046f08c871d2e9ec8e *inst/extdata/daily-time-series/max-elevation.json
+7c4afc32933b350e1569c6918f7eec40 *inst/extdata/daily-time-series/max-floors.json
+ca65acd11925ba54756651b7c4982874 *inst/extdata/daily-time-series/max-minutesFairlyActive.json
+24de37beda50706bc76ac5ceb998a37d *inst/extdata/daily-time-series/max-minutesLightlyActive.json
+eb6070451a214de22f54194d78150d45 *inst/extdata/daily-time-series/max-minutesSedentary.json
+fd11deb6ee311473cc1304411d55b945 *inst/extdata/daily-time-series/max-minutesVeryActive.json
+297b50c2e51ff910bfd6850eb74c68fe *inst/extdata/daily-time-series/max-steps.json
+c47c9e2ca1b237927153d46fa4dafd2d *inst/extdata/daily-time-series/max-time31.json
+71bc039ebb92d29dd0c465f65163915a *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-10.json
+452a410e4a052501056e693d88852e9c *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-11.json
+b3f583a4dbf1a7d052d8f42a40f13d72 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-12.json
+ef46218f208036a9e6d0f275f2203c12 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-13.json
+cdb2065ebe7da4b6125f65a0b8e94a4c *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-14.json
+52f6b5d8e7959830ce07e18f630d3e90 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-15.json
+e6195675bf25b4d37af671cbbdc429b8 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-16.json
+8492d8e2714d31b8c32594f7359da2a9 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-17.json
+11683529d1833dd1b075fd07bd56462c *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-18.json
+9405a8bdc735f8b3a20c2b1d66735c6a *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-19.json
+d0ea768ffb3cf97c758214bc54f251ad *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-20.json
+29e2902c2640920e757217db09fa5d14 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-21.json
+34cf0416061fbad01545dc2815cd8618 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-22.json
+b3b80c67625be2cd520e98bc672f5d66 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-23.json
+037e4670933c6d83c45a4bf784905cbd *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-24.json
+28987b6d498342dc27d1afe85c31493b *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-25.json
+5a67381641b4b587034a013f5847e856 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-26.json
+6db712a4c707b929dd710d4c70141d13 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-27.json
+fc077b2cf644ab4b802d03541d9572c1 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-28.json
+c390daa35a0a350e2b0b9ca1e87df9ca *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-29.json
+f78803543a331decf77855ce991f9a95 *inst/extdata/intra-daily-timeseries/intra-calories-2015-12-30.json
+c7604af769b5c1ed5d4af9b35d1820e9 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-10.json
+7d4b1aead4180c499b7cfcbc77c7e6bc *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-11.json
+86000fe9abbfa3b2ae827dd361a272ab *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-12.json
+363408c809116e031cd70249dbe4d4d2 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-13.json
+c45e0f7f871f005ee5395e68fd640a2a *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-14.json
+678e9e6c7f8849bb3b50a2e6d620738f *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-15.json
+bcddea66019ea21143ab3bbe2db0e7f7 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-16.json
+6d3c70b235c96cce34be1062645565fb *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-17.json
+2f81385bcd94d8c483860d127d49dc4e *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-18.json
+195eda7b2aa7346578d1013c9a9ac39b *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-19.json
+28952201a7edb2d81a01c5e5f9888e60 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-20.json
+1e78495a34c2dad5dcc66e7bd8b318de *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-21.json
+6d7e775798a2209acf43ddbd52ca1459 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-22.json
+633ff79aa903de0e31ccb00fb0e47ad6 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-23.json
+ec9a6446ea29098bbb89f2756125ef41 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-24.json
+603de5572947484941466abe97bc62be *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-25.json
+84acb4c7b87bb20b5d845fb02e6f0e7f *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-26.json
+7316cefeb0af9254a317c74777987ac7 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-27.json
+b4bfb71c8b1ab13fdeab90deaf0008ff *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-28.json
+d04a4abc7d99b9d78485da531de4bf45 *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-29.json
+ea5a360a1805343374ae7a2c8ea5beab *inst/extdata/intra-daily-timeseries/intra-distance-2015-12-30.json
+35234216b47467b5f1ed46f533b8a7b7 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-10.json
+12380da06ca1113dfdf8225c2567e4d1 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-11.json
+5afbd2e2a7d8c8fb2a8915fd97978649 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-12.json
+4281dd24f698eb380dad60826e11779f *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-13.json
+e57fd9c9c2964b0e40b226a5ead84c58 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-14.json
+c57ac2629215b40658a2e7a44a0f19e7 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-15.json
+54cc8cf5e003804edba07857e568db3a *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-16.json
+63847e05cf28fa6563286665a322727f *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-17.json
+173f829b576ec63bfa748a0db16f5e07 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-18.json
+403e97c296f74c07f550115edc033196 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-19.json
+a659c479908ffb564d9ef237c72d9a46 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-20.json
+3e3de196d38957a0748c867a9b93f98c *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-21.json
+393bc6c7a8b8a80d9031f02e901586f9 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-22.json
+327c0d6d130d846b9cbc0a429e9d9718 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-23.json
+2c6e123606265333009b1ca88da159a1 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-24.json
+e2ed758732e7766393fb99c5d41aae89 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-25.json
+b52d857bb597b66ca758ac6de82ba522 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-26.json
+39c3bd44659de4194475ba4d5e05034b *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-27.json
+74a5d4147f4c915f798007b4ab333d56 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-28.json
+80f4ced1534105b6b61751d2bae531fb *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-29.json
+26bcfc6223aea79390c713aa815cf465 *inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-30.json
+6189c1ac96b5a6ed737846dae1225e89 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-10.json
+7d2b0d5679b882b469100d94ae9e03a3 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-11.json
+ea198235dbd3b3c27a98cb60bf261c64 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-12.json
+df87c15c030fca784ead8cb3661a749e *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-13.json
+0f9536dc4517de00a16f91c47b57c23b *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-14.json
+7870f61863cc7a1c62d2e32533baeecf *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-15.json
+0d071969395202a06fe57bfb015da139 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-16.json
+36e322048c5fa5ca763e848a108b376d *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-17.json
+8bb568e6288c56424a23ca2151c8c6e4 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-18.json
+9b54a6e30753f39e1bc0867fc156ac4a *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-19.json
+543c6832c0757735dc9e8855acb5c056 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-20.json
+3d41b001747f4b187bce70dabbaf32f5 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-21.json
+147e97d8df477bf7dcb25218ac150ef8 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-22.json
+5fffebffee259bee2fddf6cdc1159b2d *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-23.json
+cd99afdaac67f88dc72bfc3d4d737657 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-24.json
+e1eaf3253ea26b33ccf7d8e2d93781e1 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-25.json
+771083b574572f0340b9ed1ef0dc90b7 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-26.json
+91a889fb523bd6590d46d5b12988f147 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-27.json
+e82030a17758bd188301124a4259b873 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-28.json
+c93ece0c6bad9dc105c2419c6f20e1c6 *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-29.json
+3331c7754383627c1c2816eb29a050fb *inst/extdata/intra-daily-timeseries/intra-floors-2015-12-30.json
+60d0f50ba58a338cb08eb9228d869e24 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-10.json
+a3ffb12e49ffcf835c58c2bc91cebc5b *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-11.json
+0df3e7947b0fe09321d93be44ef5902c *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-12.json
+228e9b271607489b3542438eb7f88714 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-13.json
+1c09171e9b9e4944df6793ce3a8b5c09 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-14.json
+72a0e651a6f707e870bc0be859932ef3 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-15.json
+71e87f1b193e2f84230aeaaa334d85ae *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-16.json
+ada735cc18e3551f28ca95419ec75806 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-17.json
+b5302935c940db20b1512dc9249ae45f *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-18.json
+d55a44ffb290b56ed6bf091290878715 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-19.json
+4ca906aa86ca517a41a542b4e0058cab *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-20.json
+357ebe066f0d13f528bc4519b2ba8cf4 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-21.json
+14a130bed29c878699cc2344ecf044ff *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-22.json
+eeede207ceff9b3ce0e7d4499b83c3ba *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-23.json
+dc103cc8e087d5083ed307e239c1cddc *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-24.json
+471d87f364ade6e326a834003aab6428 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-25.json
+6b300f56d5bb949b191e0f56af56bc74 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-26.json
+9ba8b4d566b7118cf3a1f095cce2ef99 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-27.json
+55645114369af31c00e545525c51f7d7 *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-28.json
+dd26d538493d9088814fe44fc32b91af *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-29.json
+304c14d85f57e14cb19da3f7025a473a *inst/extdata/intra-daily-timeseries/intra-steps-2015-12-30.json
+627db3733ce6284cca539a4a09c67c23 *man/DataLoader.Rd
+906afe1e4513e92a3f4fd5804713ef70 *man/FitAnalyzer.Rd
+52d498b3eb7fc04ab53abfddff379f02 *man/augmentData.Rd
+a0b71e872d2bfa8a90c3baa2ea510de9 *man/augmentIntraData.Rd
+e4912eeaafcecf750d536e6e7029d773 *man/buildChartDay.Rd
+7b2a7eb611194b9b07ce7d2b87cec4e0 *man/buildChartIntra.Rd
+bed483eba44b6b5195bb387641740c64 *man/connectToAPI.Rd
+f349739d25bf3a76f6084597cf79a3a1 *man/createDependentVariableFrame.Rd
+ff2d0c86d2bdb00977f5c1aa01affab8 *man/createGoalVariableVector.Rd
+c3f63163899a51c47ebf9f4f105af527 *man/createIntraFrame.Rd
+1559e5a3973ce3692d76022ecca555fc *man/createTsMasterFrame.Rd
+571d96d742f6015a23ca898d6f5e6494 *man/fetchIntraResourceData.Rd
+c8b36481c8663ff57424136d183b8343 *man/getAPIScope.Rd
+ffee9e4bdd1ec0085c07933d21c1af25 *man/getDailyResourcePathList.Rd
+3ab8b2748a190643e8b4e29736a35eec *man/getIntradayResourcePathList.Rd
+3ba990fcc9eb0d4e7950ece9c1e22848 *man/makeAPIRequest.Rd
+bf02d87be879808d42ca97e0f7b4c3fa *man/markValidRows.Rd
+d171720f1c6a25e7a07a4fbde48db1e8 *man/properCase.Rd
+5637de11777c7b081174315514573224 *man/writeToJSON.Rd
+fc5f9c6721737dfd5b7f791115c7ee62 *tests/testthat.R
+fc10e2920928c22cd3afcab1ac820a0b *tests/testthat/test-fitanalyzer.R
+ad62b2a092ca44d9d5102469f5ad9b2f *tests/testthat/test-fitutil.R
+371254a9831de0f9425845dc752ba345 *vignettes/examples/fitcoach-usage.Rmd
+edcaff11c6250efedb5ef67acdae600f *vignettes/examples/fitcoach-usage.html
+f9b1179642da0f8e41b86f0b7e8e7271 *vignettes/summary.Rmd
+293bc21b9d599cf880bf28f2dcf8ebf2 *vignettes/summary.html
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..fa298c1
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,43 @@
+# Generated by roxygen2: do not edit by hand
+
+export(DataLoader)
+export(FitAnalyzer)
+export(augmentData)
+export(augmentIntraData)
+export(buildChartDay)
+export(buildChartIntra)
+export(connectToAPI)
+export(createDependentVariableFrame)
+export(createGoalVariableVector)
+export(createIntraFrame)
+export(createTsMasterFrame)
+export(fetchIntraResourceData)
+export(makeAPIRequest)
+export(markValidRows)
+export(properCase)
+export(writeToJSON)
+import(ggplot2)
+importFrom(R6,R6Class)
+importFrom(caret,varImp)
+importFrom(dplyr,arrange)
+importFrom(dplyr,funs)
+importFrom(dplyr,group_by)
+importFrom(dplyr,inner_join)
+importFrom(dplyr,summarise_each)
+importFrom(gbm,gbm)
+importFrom(gbm,gbm.perf)
+importFrom(gbm,predict.gbm)
+importFrom(gbm,relative.influence)
+importFrom(graphics,plot)
+importFrom(httr,GET)
+importFrom(httr,config)
+importFrom(httr,content)
+importFrom(httr,oauth2.0_token)
+importFrom(httr,oauth_app)
+importFrom(httr,oauth_endpoint)
+importFrom(httr,warn_for_status)
+importFrom(jsonlite,fromJSON)
+importFrom(methods,slot)
+importFrom(plyr,ldply)
+importFrom(reshape2,melt)
+importFrom(stats,ave)
diff --git a/R/DataLoader.R b/R/DataLoader.R
new file mode 100644
index 0000000..2a644c3
--- /dev/null
+++ b/R/DataLoader.R
@@ -0,0 +1,135 @@
+#' R6 class for Loading Fitbit data
+#'
+#' DataLoader is an R6 Class that connects to the Fitbit API with the credentials, requests the data, and writes the response to JSON files,
+#'
+#' @docType class
+#' @format A \code{\link{R6Class}} generator object
+#' @keywords data
+#'
+#' @importFrom R6 R6Class
+#' @importFrom httr content
+#' @export DataLoader
+#'
+#' @section Methods:
+#' \describe{
+#' \item{\code{connect(appname, key, secret, cache.file)}}{This method connects to the Fitbit API and to your application.
+#' \cr \code{appname}: Name of the Fitbit App
+#' \cr \code{key}: Fitbit API Client key
+#' \cr \code{secret}: Fibit API Client secret
+#' \cr \code{cache.file}: Path to a cached token file, instead of providing credentials in the function call}
+#' \item{\code{request(type = "day", activities = "", start.date = Sys.Date(), end.date = "", path = "./json/"))}}{This method builds the request URLs, sends the requests and writes response to JSON files, in the specified folder.
+#' \cr \code{type}: Type of time series. Must be 'day' or 'intraday'.
+#' \cr \code{activities}: A list of the Fitibit activities to be retrieved.
+#' \cr \code{start.date}: Start date in format YYYY-mm-dd.
+#' \cr \code{end.date}: End date in format YYYY-mm-dd.
+#' \cr \code{path}: Folder where the JSON files will be written.}
+#' }
+#'
+#' @examples \dontrun{
+#' testObject <- DataLoader$new()
+#'
+#' testObject$connect(appname = "abcd",
+#' key = "123ABC",
+#' secret = "3089e3h1ac9dde0aa67b54ajc8691j44")
+#'
+#' testObject$request(
+#' type = 'day',
+#' activities = list("calories", "steps", "distance", "minutesVeryActive"),
+#' start.date = "2016-01-01",
+#' end.date = "2016-02-01",
+#' path = "~/fitbit-daily/")
+#' }
+
+
+##
+## Begin lassence@ code
+##
+
+DataLoader <- R6::R6Class (
+ "DataLoader",
+
+ public = list (
+
+ ### Public variables
+
+ # API Token
+ api.token = NA,
+ # Request response
+ response = NA,
+
+ ### METHOD initialize
+ ### Standard R6 Initialize function
+
+ initialize = function () {
+ message("Object DataLoader initialized")
+ },
+
+ ### METHOD connect
+ ### Connects to the API with credentials
+
+ connect = function (appname, key, secret, cache.file) {
+
+ # If cache file provided, use it
+ if(!missing(cache.file)) {
+ self$api.token <- readRDS(cache.file)[[1]]
+
+ # Else, check if cache file exists
+ } else {
+ if (file.exists('.httr-oauth')) {
+ if (difftime(Sys.time(), file.info('.httr-oauth')$mtime, units = "mins") < 60) {
+ self$api.token <- readRDS('.httr-oauth')[[1]]
+ } else {
+ # Known bug: autorefresh does not work in basic mode
+ # https://github.com/hadley/httr/pull/320
+ file.remove('.httr-oauth')
+ self$api.token <- connectToAPI(appname, key, secret)
+ }
+ } else {
+ self$api.token <- connectToAPI(appname, key, secret)
+ }
+ }
+ },
+
+ ### METHOD request
+ ### Build URL, send request and write response to JSON file
+
+ request = function (type = "day",
+ activities = "",
+ start.date = Sys.Date(),
+ end.date = "",
+ path = "./json/") {
+
+ # Check 'type' argument
+ if (!(type %in% c("day", "intraday")))
+ stop("Invalid 'type'. Must be 'day' or 'intraday'")
+
+ # Check 'start.date' argument
+ if (!(grepl("^[0-9]{4}-[0-9]{2}-[0-9]{2}$", start.date)))
+ stop("Invalid 'start.date'. Must be in the following format: 'YYYY-MM-dd'")
+
+ # Call request function for each activity
+ for (acty in activities) {
+
+ self$response <- makeAPIRequest(
+ type = type,
+ activity = acty,
+ start.date = start.date,
+ end.date = end.date,
+ api.token = self$api.token
+ )
+
+ writeToJSON(content = httr::content(self$response, as = "text"),
+ path = path,
+ type = type,
+ activity = acty,
+ start.date = start.date)
+
+ }
+ }
+ )
+)
+
+##
+## End lassence@ code
+##
+
diff --git a/R/FitAnalyzer.R b/R/FitAnalyzer.R
new file mode 100644
index 0000000..dbbc6d5
--- /dev/null
+++ b/R/FitAnalyzer.R
@@ -0,0 +1,196 @@
+#' R6 class for Analyzing Fitbit Data
+#'
+#' FitAnalyzer is an R6 class for analyzing Fitbit data. It is an opinionated implementation of a particular workflow for analysis.
+#' For people attempting to conduct their own analysis in a different fashion you should use the more generic functions implemented in FitUtil. \cr \cr
+#' The workflow implemented for FitAnalyzer is the following: \cr
+#' 1. Create the FitAnalyzer with the goal variable for analysis. Eg: Calories or steps or distance. The goal variable is your personal goal that you are trying to analyze better. \cr
+#' 2. Call \code{findImportantVariables} to understand the most important variables unique to you that enable meeting your goal. \cr
+#' 3. Call \code{showMostImportantCharts} to get relevant charts that are unique to your data \cr
+#' 4. Call \code{predictGoal} to get a prediction on performance of the goal \cr \cr
+#' You can conduct two types of analysis based on the type of dataset in consideration. \code{analysis.type} can be 'intra.day' or 'daily' analysis.
+#'
+#' @docType class
+#' @format A \code{\link{R6Class}} generator object
+#' @keywords data
+#'
+#' @importFrom R6 R6Class
+#' @importFrom dplyr arrange
+#' @importFrom caret varImp
+#' @importFrom gbm gbm predict.gbm gbm.perf relative.influence
+#' @export FitAnalyzer
+#'
+#' @section Methods:
+#' \describe{
+#' \item{\code{getAnalysisFrame(folder, analysis.type)}}{This method uses \code{analysis.type} as an argument to return a data.frame that is clean and augmented with additional features like weekend.}
+#' \item{\code{findImportantVariables(tsDataFrame, seed = 12345)}}{Finds the most important variables that are enabling meeting the goals for the person, by creating a `glm` model and ranking the variables based on the coefficients of the model.}
+#' \item{\code{getFit()}}{Returns the `glm` fit object.}
+#' \item{\code{showMostImportantCharts(tsDataFrame)}}{Plots charts for the most relevant goals, with actual data and moving average using \code{geom_smooth()}.
+#' \cr \code{tsDataFrame}: a data.frame containing the fitibit activities.}
+#' \item{\code{predictGoal(x)}}{Gives a prediction on the goal performance, based on `glm` (daily) or `gbm` (intraday).}
+#' }
+#'
+
+##
+## Begin niraj9@ code
+##
+
+FitAnalyzer <- R6::R6Class (
+ "FitAnalyzer",
+
+ public = list (
+
+ initialize = function (goal = "calories") {
+ private$goal <- goal
+ },
+
+ # Get Analysis frame
+ getAnalysisFrame = function (folder = NA, analysis.type) {
+ private$folder <- folder
+ private$analysis.type <- analysis.type
+ master <- NULL
+
+ if (analysis.type == "intra.day") {
+ master <-
+ createIntraFrame(folder)
+ master <-
+ augmentIntraData(master)
+ } else {
+ master <-
+ createTsMasterFrame(folder)
+ master <-
+ markValidRows(master)
+ master <-
+ master[master$valid == TRUE, ]
+ master <- augmentData(master)
+ }
+ return (master)
+ },
+
+ # Find important variables
+
+ findImportantVariables = function (tsDataFrame, seed = 12345) {
+ set.seed(seed)
+ if (!is.null(private$fit)){
+ return (private$imp.vars)
+ }
+
+ ifelse(private$analysis.type == "intra.day",
+ private$createIntraFit(tsDataFrame),
+ private$createDailyFrameFit(tsDataFrame)
+ )
+
+ return (private$imp.vars)
+ },
+
+ # Get fit
+ getFit = function () {
+ return (private$fit)
+ },
+
+##
+## End niraj9@ code
+##
+
+
+##
+## Begin lassence@ code
+##
+
+ # Plot most important charts
+ showMostImportantCharts = function (tsDataFrame) {
+
+ # Intraday plot
+ if (private$analysis.type == "intra.day") {
+ # Get important variables
+ intra.vars <- names(sort(private$imp.vars, decreasing = TRUE))
+ intra.vars <- intra.vars[grep('intra.', intra.vars)]
+ # Plot chart for 4 most important variables
+ buildChartIntra(data = tsDataFrame,
+ y.axes = intra.vars[1:4])
+
+ # Day time series plot
+ } else {
+ buildChartDay(
+ data = tsDataFrame,
+ y.axes = unlist(private$imp.vars$name)[1:4])
+ }
+ },
+
+##
+## End lassence@ code
+##
+
+
+##
+## Begin niraj9@ code
+##
+
+ # Predict goals
+ predictGoal = function (x) {
+ response <- NULL
+ response <-
+ ifelse (private$analysis.type == "intra.day",
+ gbm::predict.gbm(private$fit, newdata = x,
+ n.trees = private$gbm.best.iter),
+ predict.glm(private$fit,
+ newdata = as.data.frame(x),
+ type = "response"))
+
+ return (response)
+ }
+
+ ),
+
+ # Private variables
+ private = list (
+
+ folder = NULL,
+ goal = NULL,
+ imp.vars = NULL,
+ analysis.type = NULL,
+ fit = NULL,
+ gbm.best.iter = NULL,
+
+ createDailyFrameFit = function (master) {
+ y <-
+ createGoalVariableVector(master, goal = private$goal)
+ x <-
+ createDependentVariableFrame(master, goal = private$goal)
+ glm.fit <-
+ glm(y ~ ., data = x, family = "gaussian")
+ imp <- caret::varImp(glm.fit, scale = TRUE)
+ imp$name <- rownames(imp)
+ imp <- dplyr::arrange(imp, -Overall)
+ private$fit <- glm.fit
+ private$imp.vars <- imp
+ },
+
+ createIntraFit = function (master, cv.folds) {
+ master$date <- NULL
+
+ gbm.txt <- paste("gbm::gbm(formula = " ,
+ private$goal ,
+ "~ .,data = master,
+ distribution = 'gaussian',
+ n.trees = 500,
+ shrinkage = .05,
+ interaction.depth = 5,
+ bag.fraction = .5,
+ train.fraction = .8,
+ verbose = FALSE)", sep = "")
+ gbm.fit <- eval(parse(text = gbm.txt))
+ private$fit <- gbm.fit
+ private$gbm.best.iter <-
+ gbm::gbm.perf(gbm.fit, method = "test", plot.it = FALSE)
+ private$imp.vars <-
+ gbm::relative.influence(gbm.fit, n.trees = 500, scale = TRUE)
+ private$imp.vars <- sort(private$imp.vars, decreasing = TRUE)
+ }
+ )
+)
+
+##
+## End niraj9@ code
+##
+
+
diff --git a/R/FitUtil.R b/R/FitUtil.R
new file mode 100644
index 0000000..9d03486
--- /dev/null
+++ b/R/FitUtil.R
@@ -0,0 +1,505 @@
+# ------------------------------------------------------------------------------
+# Utility for 'fitcoach' package. Contains the various functions
+# that are used by R6 Classes in the package.
+# ------------------------------------------------------------------------------
+
+
+#' Returns a list of Fitbit Daily activities
+#'
+#' @return A list
+
+getDailyResourcePathList <- function() {
+ resourcePath <- list ("calories",
+ "caloriesBMR",
+ "steps",
+ "distance",
+ "floors",
+ "elevation",
+ "minutesSedentary",
+ "minutesLightlyActive",
+ "minutesFairlyActive",
+ "minutesVeryActive",
+ "activityCalories")
+ return (resourcePath)
+}
+
+#' Returns a list of Fitbit Intraday activities
+#'
+#' @return A list
+
+getIntradayResourcePathList <- function() {
+ resourcePath <- list ("calories",
+ "steps",
+ "floors",
+ "elevation",
+ "distance")
+ return (resourcePath)
+}
+
+
+#' Creates the Master data.frame from Timeseries JSON files.
+#'
+#' @param tsFileFolder Folder containing all time-series files. Naming convention for files is max-[resource].json
+#' @param resourcePath the resource paths to look. Default will get getDailyResourcePathList()
+#' @return The Master data.frame
+#'
+#' @importFrom jsonlite fromJSON
+#' @export
+
+createTsMasterFrame <-
+ function(tsFileFolder, resourcePath = getDailyResourcePathList()) {
+ dflist <- lapply(resourcePath, function(x) {
+ json.file <- paste(
+ tsFileFolder,
+ .Platform$file.sep,
+ "max-", x, ".json",
+ sep = ""
+ )
+ df <- as.data.frame(jsonlite::fromJSON(json.file, simplifyDataFrame = TRUE))
+ colnames (df)[1] <- "date"
+ colnames (df)[2] <- x
+ return (df)
+ })
+ masterdf <- as.data.frame(dflist[1])
+
+ # Using For instead of lapply because masterdf is being updated at each increment
+ for (i in 2:length(dflist)) {
+ masterdf <-
+ merge(masterdf, as.data.frame(dflist[i]), by = "date")
+ }
+
+ masterdf$date <- as.Date(masterdf$date)
+ lapply(2:ncol(masterdf), function(x) {
+ masterdf[, x] <<- as.numeric(masterdf[, x])
+ })
+ return (masterdf)
+ }
+
+
+#' Creates a vector of goal variables
+#'
+#' @param master Master data.frame
+#' @param goal Goal variable
+#' @export
+
+createGoalVariableVector <- function(master, goal) {
+ y <- eval(parse(text = paste("master$", goal, sep = "")))
+}
+
+
+#' Creates a data.frame with only goal variables
+#'
+#' @param master Master data.frame
+#' @param goal Goal variable
+#' @export
+
+createDependentVariableFrame <- function(master, goal) {
+ master$date <- NULL
+ # remove variables out of individuals direct control : eg calories
+ master$calories <- NULL
+ master$caloriesBMR <- NULL
+ master$activityCalories <- NULL
+ master$valid <- NULL
+ master$holiday <- ifelse(master$weekend, 1, 0)
+ master$weekday <- NULL
+ master$weekend <- NULL
+ eval(parse(text = paste("master$", goal, " <- NULL", sep = "")))
+ return (master)
+}
+
+
+#' Augments the Master data.frame with additional information
+#'
+#' @param masterTsDataFrame The Master Time Series data.frame
+#' @return The Master data.frame with additinal data elements
+#' weekday, weekend
+#' @export
+
+augmentData <- function(masterTsDataFrame) {
+ # Augment weekday information
+ masterTsDataFrame$weekday <-
+ weekdays(as.Date(masterTsDataFrame$date))
+ masterTsDataFrame$weekday <-
+ as.factor(masterTsDataFrame$weekday)
+ masterTsDataFrame$weekend <-
+ ifelse(masterTsDataFrame$weekday == "Saturday" |
+ masterTsDataFrame$weekday == "Sunday",
+ TRUE,
+ FALSE
+ )
+ return (masterTsDataFrame)
+}
+
+
+#' Incorporates rules for marking if the data entry in MasterTSFrame are valid or not
+#'
+#' @param masterTsDataFrame The Master Time Series data.frame
+#' @return The marked Master data.frame. i.e column valid is added at the end of the data.frame
+#'
+#' @importFrom dplyr inner_join
+#' @importFrom plyr ldply
+#' @export
+
+markValidRows <- function(masterTsDataFrame) {
+ masterTsDataFrame$valid <-
+ (as.numeric(masterTsDataFrame$distance) != 0)
+ return (masterTsDataFrame)
+}
+
+
+#' Creates the intraday Frame
+#'
+#' @param folder The folder in which JSON files will be read.
+#'
+#' @importFrom jsonlite fromJSON
+#' @importFrom plyr ldply
+#' @importFrom dplyr inner_join
+#' @export
+
+createIntraFrame <- function(folder) {
+ files <- list.files(folder)
+ indexes <- grep("intra-+", files)
+ files <- files[indexes]
+
+ # Calories
+ indexes <- grep(paste('-calories-', sep = ""), files)
+
+ res.files <- files[indexes]
+ res.files <- paste(folder, "/", res.files, sep = "")
+
+ dfList <- lapply(res.files,
+ function(x) {
+ d <- jsonlite::fromJSON(x, simplifyDataFrame = TRUE, flatten = TRUE)
+ d <- suppressWarnings(as.data.frame(d))
+ d$sequence <- seq(1:nrow(d))
+ return (d)
+ })
+ calorie.df <- plyr::ldply(dfList, data.frame)
+ calorie.df <- calorie.df[-c(7, 8)]
+ intraColNames <- c(
+ "date",
+ "calories",
+ "intra.level",
+ "intra.mets",
+ "time",
+ "intra.calorie",
+ "timeseq"
+ )
+ colnames(calorie.df) <- intraColNames
+
+ # Other resource types
+ resources <- getIntradayResourcePathList()
+ resources <- resources[-c(1)]
+ for (i in 1:length(resources)) {
+ resource.df <- fetchIntraResourceData(folder, resources[i], files)
+ calorie.df <- suppressMessages(dplyr::inner_join(calorie.df, resource.df))
+ }
+ return (calorie.df)
+}
+
+
+#' Loads the JSON files for intraday data and returns a data.frame
+#'
+#' @param folder the folder to source the files from
+#' @param resource the type of resource(Eg: calories, steps, distance etc)
+#' @param files the list of files to look into for fetch
+#' @return Resource data.frame
+#'
+#' @importFrom jsonlite fromJSON
+#' @importFrom plyr ldply
+#' @export
+
+fetchIntraResourceData <- function (folder, resource, files) {
+ indexes <- grep(paste('-', resource, '-', sep = ""), files)
+ res.files <- files[indexes]
+ res.files <- paste(folder, "/", res.files, sep = "")
+ dfList <- lapply(res.files,
+ function(x) {
+ suppressWarnings(as.data.frame(
+ jsonlite::fromJSON (x, simplifyDataFrame = TRUE))
+ )
+ })
+ resource.df <- plyr::ldply(dfList, data.frame)
+ resource.df <- resource.df[(-c(5, 6))]
+ intraColNames <- c("date", resource, "time",
+ paste('intra.', resource, sep = ""))
+ colnames(resource.df) <- intraColNames
+ return (resource.df)
+}
+
+
+#' Augments the intra day data.frame with additional information
+#' @param inFrame The Master Time Series data.frame
+#' @return The Master data.frame with additinal data elements
+#' weekday, weekend, cum.sums of various variables
+#'
+#' @importFrom stats ave
+#' @export
+
+augmentIntraData <- function(inFrame) {
+ inFrame$date <- as.Date(inFrame$date)
+ inFrame$dataset.type <- NULL
+ inFrame$time.interval <- NULL
+ inFrame$weekday <- weekdays(inFrame$date)
+ inFrame$weekday <- as.factor(inFrame$weekday)
+ inFrame$weekend <- ifelse(inFrame$weekday == "Saturday" |
+ inFrame$weekday == "Sunday",
+ 1, 0)
+ inFrame$calories <- as.numeric(inFrame$calories)
+ inFrame$time <- NULL
+ inFrame[, 2:15] <-
+ lapply(2:15, function(x)
+ as.numeric(inFrame[, x]))
+
+ a <-
+ cut(
+ inFrame$timeseq,
+ breaks = c(0, 23, 41, 77, 90, 96),
+ labels = c("night", "morning", "day", "eve", "latenight")
+ )
+ inFrame$slot <- a
+
+ mod <- transform(inFrame, cumsum.calorie = stats::ave(inFrame$intra.calorie, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.steps = stats::ave(inFrame$intra.steps, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.level = stats::ave(inFrame$intra.level, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.mets = stats::ave(inFrame$intra.mets, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.distance = stats::ave(inFrame$intra.distance, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.floors = stats::ave(inFrame$intra.floors, date, FUN = cumsum))
+ mod <- transform(mod, cumsum.elevation = stats::ave(inFrame$intra.elevation, date, FUN = cumsum))
+ inFrame <- mod
+ return (inFrame)
+}
+
+
+#' Get API scope
+#'
+#' Gets the scopes that will be retrieved by the API request to fitbit.
+#' See https://dev.fitbit.com/docs/oauth2/#scope
+#'
+#' @return A vector of scope
+
+getAPIScope <- function() {
+ APIScope <- c(
+ "activity",
+ "heartrate",
+ "location",
+ "nutrition",
+ "profile",
+ "settings",
+ "sleep",
+ "social",
+ "weight"
+ )
+ return (APIScope)
+}
+
+
+#' Connects to Fibit API
+#'
+#' Connects to the Fitbit API with OAuth 2.
+#' See https://dev.fitbit.com/docs/oauth2/
+#'
+#' @param appname Name of the Fitbit App
+#' @param key Fitbit API Client key
+#' @param secret Fibit API Client secret
+#' @return A Fitbit API token, that will be cached
+#'
+#' @importFrom httr oauth_endpoint oauth_app oauth2.0_token
+#' @export
+
+connectToAPI <- function(appname, key, secret) {
+ fitbit.api <- httr::oauth_endpoint(
+ request = "https://api.fitbit.com/oauth2/token",
+ authorize = "https://www.fitbit.com/oauth2/authorize",
+ access = "https://api.fitbit.com/oauth2/token")
+
+ api.token <-
+ httr::oauth2.0_token(
+ endpoint = fitbit.api,
+ app = httr::oauth_app(appname, key, secret),
+ scope = getAPIScope(),
+ use_basic_auth = TRUE,
+ use_oob = FALSE,
+ cache = TRUE
+ )
+
+ return (api.token)
+}
+
+
+#' Make API Request
+#'
+#' Makes request to Fitbit API, and stores the response into a variable.
+#'
+#' @param type Type of time series. Must be 'day' or 'intraday'
+#' @param activity Type of activity. See below for details.
+#' @param start.date Start date in format YYYY-mm-dd
+#' @param end.date End date in format YYYY-mm-dd
+#' @param api.token API token for connection to Fitbit API
+#' @return The request response
+#'
+#' @importFrom httr GET warn_for_status config
+#' @export
+
+makeAPIRequest <-
+ function(type, activity,
+ start.date, end.date,
+ api.token) {
+
+ # Build URL for request
+ req.url <- paste("activities",
+ activity,
+ "date",
+ start.date,
+ sep = "/")
+
+ if (end.date != "") {
+ req.url <- paste(req.url, end.date, sep = .Platform$file.sep)
+ }
+
+ if (type == "intraday") {
+ if (end.date == "") req.url <- paste(req.url, "1d", sep = "/")
+ req.url <- paste(req.url, "15min", sep = .Platform$file.sep)
+ }
+
+ req.url <- paste("https://api.fitbit.com/1/user/-/",
+ req.url,
+ ".json",
+ sep = "")
+
+ # Send the request
+ response <- httr::GET(url = req.url, httr::config(token = api.token))
+ httr::warn_for_status(response)
+ return (response)
+
+ }
+
+
+#' Write to JSON
+#'
+#' Writes API response content to JSON files, in a specific folder
+#'
+#' @param content JSON content to be written to file
+#' @param path Path to folder where files will be created
+#' @param type Type of time series. Must be 'day' or 'intraday'
+#' @param activity Type of activity. See below for details.
+#' @param start.date Start date
+#' @export
+
+writeToJSON <- function(content, path, type, activity, start.date) {
+
+ # Create folder if necessary
+ if (!dir.exists(path)) {
+ dir.create(path)
+ }
+
+ # Define files names
+ if (type == 'day') {
+ json.file <- paste("max", activity, sep = "-")
+ } else if (type == 'intraday') {
+ json.file <- paste("intra", activity, start.date, sep = "-")
+ }
+
+ # Write files
+ json.file <- paste(path, json.file, ".json", sep = "")
+ write(content, json.file)
+
+}
+
+
+#' Build Day timeseries Chart
+#'
+#' Plots charts that have been selected as most relevant.
+#'
+#' @param data data.frame
+#' @param y.axes Names of the Y-axes data, as a vector of characters
+#' @return A plot
+#'
+#' @import ggplot2
+#' @importFrom reshape2 melt
+#' @importFrom graphics plot
+#' @export
+
+buildChartDay <- function(data, y.axes) {
+
+ # Keep only relevant columns and melt data
+ data <- subset(data, select = c("date", y.axes))
+ data <- reshape2::melt(data, id.vars = "date")
+
+ # Build and plot graph
+ graph <-
+ ggplot(data, aes(x = data$date, y = data$value, color = data$variable)) +
+ geom_line(na.rm = TRUE, alpha = 0.3) +
+ geom_smooth(span = 0.1, se = FALSE) +
+ facet_grid(variable ~ ., scales = "free_y") +
+ scale_color_discrete(labels = properCase(gsub("([A-Z])", " \\1", y.axes))) +
+ labs(title = "Evolution of most relevant activities, by day",
+ x = "Date",
+ y = "",
+ color = "Activity")
+ plot(graph)
+
+}
+
+
+#' Build Intraday Chart
+#'
+#' Plots intraday charts for the most relevant activities
+#'
+#' @param data data.frame
+#' @param y.axes Names of the Y-axes data, as a vector of characters
+#' @return A plot
+#'
+#' @import ggplot2
+#' @importFrom dplyr group_by summarise_each funs
+#' @importFrom reshape2 melt
+#' @importFrom graphics plot
+#' @importFrom methods slot
+#' @export
+
+buildChartIntra <- function(data, y.axes) {
+
+ # Select only y-axes variables, 'timeseq' and 'slot'
+ data <- subset(data, select = c("timeseq", "slot", y.axes))
+ timeseq <- data$timeseq # Fix to avoid note when checking package
+ slot <- data$slot # Fix to avoid note when checking package
+ data <- dplyr::group_by(data, timeseq, slot)
+ data <- dplyr::summarise_each(data, funs(mean))
+
+ # Melt data
+ data <- reshape2::melt(data, id.vars = c("timeseq", "slot"))
+
+ # Build and plot graph
+ graph <-
+ ggplot(data, aes(x = data$timeseq, y = data$value, color = data$variable)) +
+ geom_line(na.rm = TRUE, alpha = 0.4) +
+ geom_smooth(span = 0.1, se = FALSE) +
+ geom_area(aes(fill = data$slot, color = NULL), alpha = 0.1) +
+ facet_grid(variable ~ ., scales = "free_y") +
+ scale_x_discrete(breaks = seq(1, 96, by = 8),
+ labels = paste(seq(0, 22, by = 2), ":00", sep = "")) +
+ scale_color_discrete(labels = properCase(substr(y.axes, 7, 100))) +
+ scale_fill_discrete(labels = properCase(unique(data$slot))) +
+ labs(title = "Average level of most relevant activities, in a day",
+ x = "Time of day",
+ y = "",
+ color = "Activity",
+ fill = "Period of day")
+ plot(graph)
+
+}
+
+#' Proper Case
+#'
+#' Sets a string to proper case, i.e. upper case for the first letter of each word
+#'
+#' @param x A string
+#' @return A string with proper case
+#' @export
+
+# Code inspired from http://stackoverflow.com/a/6365349
+properCase <- function(x) {
+ gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", x, perl=TRUE)
+}
+
+
diff --git a/inst/extdata/daily-time-series/max-activityCalories.json b/inst/extdata/daily-time-series/max-activityCalories.json
new file mode 100644
index 0000000..9a63b37
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-activityCalories.json
@@ -0,0 +1 @@
+{"activities-activityCalories":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{"da [...]
diff --git a/inst/extdata/daily-time-series/max-calories.json b/inst/extdata/daily-time-series/max-calories.json
new file mode 100644
index 0000000..54e74fa
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-calories.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2013-02-14","value":"1773"},{"dateTime":"2013-02-15","value":"1773"},{"dateTime":"2013-02-16","value":"1773"},{"dateTime":"2013-02-17","value":"1773"},{"dateTime":"2013-02-18","value":"1773"},{"dateTime":"2013-02-19","value":"1773"},{"dateTime":"2013-02-20","value":"1773"},{"dateTime":"2013-02-21","value":"1773"},{"dateTime":"2013-02-22","value":"1773"},{"dateTime":"2013-02-23","value":"1773"},{"dateTime":"2013-02-24","value":"1773"},{"dateTime":"2013 [...]
diff --git a/inst/extdata/daily-time-series/max-caloriesBMR.json b/inst/extdata/daily-time-series/max-caloriesBMR.json
new file mode 100644
index 0000000..27f839b
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-caloriesBMR.json
@@ -0,0 +1 @@
+{"activities-caloriesBMR":[{"dateTime":"2013-02-14","value":"1773"},{"dateTime":"2013-02-15","value":"1773"},{"dateTime":"2013-02-16","value":"1773"},{"dateTime":"2013-02-17","value":"1773"},{"dateTime":"2013-02-18","value":"1773"},{"dateTime":"2013-02-19","value":"1773"},{"dateTime":"2013-02-20","value":"1773"},{"dateTime":"2013-02-21","value":"1773"},{"dateTime":"2013-02-22","value":"1773"},{"dateTime":"2013-02-23","value":"1773"},{"dateTime":"2013-02-24","value":"1773"},{"dateTime":"2 [...]
diff --git a/inst/extdata/daily-time-series/max-distance.json b/inst/extdata/daily-time-series/max-distance.json
new file mode 100644
index 0000000..b985fed
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-distance.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2013-02-14","value":"0.0"},{"dateTime":"2013-02-15","value":"0.0"},{"dateTime":"2013-02-16","value":"0.0"},{"dateTime":"2013-02-17","value":"0.0"},{"dateTime":"2013-02-18","value":"0.0"},{"dateTime":"2013-02-19","value":"0.0"},{"dateTime":"2013-02-20","value":"0.0"},{"dateTime":"2013-02-21","value":"0.0"},{"dateTime":"2013-02-22","value":"0.0"},{"dateTime":"2013-02-23","value":"0.0"},{"dateTime":"2013-02-24","value":"0.0"},{"dateTime":"2013-02-25","va [...]
diff --git a/inst/extdata/daily-time-series/max-elevation.json b/inst/extdata/daily-time-series/max-elevation.json
new file mode 100644
index 0000000..4595139
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-elevation.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{"dateTime" [...]
diff --git a/inst/extdata/daily-time-series/max-floors.json b/inst/extdata/daily-time-series/max-floors.json
new file mode 100644
index 0000000..7d31e80
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-floors.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{"dateTime":"2 [...]
diff --git a/inst/extdata/daily-time-series/max-minutesFairlyActive.json b/inst/extdata/daily-time-series/max-minutesFairlyActive.json
new file mode 100644
index 0000000..00a3732
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-minutesFairlyActive.json
@@ -0,0 +1 @@
+{"activities-minutesFairlyActive":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{ [...]
diff --git a/inst/extdata/daily-time-series/max-minutesLightlyActive.json b/inst/extdata/daily-time-series/max-minutesLightlyActive.json
new file mode 100644
index 0000000..5966407
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-minutesLightlyActive.json
@@ -0,0 +1 @@
+{"activities-minutesLightlyActive":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"}, [...]
diff --git a/inst/extdata/daily-time-series/max-minutesSedentary.json b/inst/extdata/daily-time-series/max-minutesSedentary.json
new file mode 100644
index 0000000..dcdca54
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-minutesSedentary.json
@@ -0,0 +1 @@
+{"activities-minutesSedentary":[{"dateTime":"2013-02-14","value":"1440"},{"dateTime":"2013-02-15","value":"1440"},{"dateTime":"2013-02-16","value":"1440"},{"dateTime":"2013-02-17","value":"1440"},{"dateTime":"2013-02-18","value":"1440"},{"dateTime":"2013-02-19","value":"1440"},{"dateTime":"2013-02-20","value":"1440"},{"dateTime":"2013-02-21","value":"1440"},{"dateTime":"2013-02-22","value":"1440"},{"dateTime":"2013-02-23","value":"1440"},{"dateTime":"2013-02-24","value":"1440"},{"dateTim [...]
diff --git a/inst/extdata/daily-time-series/max-minutesVeryActive.json b/inst/extdata/daily-time-series/max-minutesVeryActive.json
new file mode 100644
index 0000000..5982834
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-minutesVeryActive.json
@@ -0,0 +1 @@
+{"activities-minutesVeryActive":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{"d [...]
diff --git a/inst/extdata/daily-time-series/max-steps.json b/inst/extdata/daily-time-series/max-steps.json
new file mode 100644
index 0000000..1ad6105
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-steps.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2013-02-14","value":"0"},{"dateTime":"2013-02-15","value":"0"},{"dateTime":"2013-02-16","value":"0"},{"dateTime":"2013-02-17","value":"0"},{"dateTime":"2013-02-18","value":"0"},{"dateTime":"2013-02-19","value":"0"},{"dateTime":"2013-02-20","value":"0"},{"dateTime":"2013-02-21","value":"0"},{"dateTime":"2013-02-22","value":"0"},{"dateTime":"2013-02-23","value":"0"},{"dateTime":"2013-02-24","value":"0"},{"dateTime":"2013-02-25","value":"0"},{"dateTime":"20 [...]
diff --git a/inst/extdata/daily-time-series/max-time31.json b/inst/extdata/daily-time-series/max-time31.json
new file mode 100644
index 0000000..556e250
--- /dev/null
+++ b/inst/extdata/daily-time-series/max-time31.json
@@ -0,0 +1 @@
+{"activities-tracker-calories":[{"dateTime":"2013-02-10","value":"1773"},{"dateTime":"2013-02-11","value":"1773"},{"dateTime":"2013-02-12","value":"1773"},{"dateTime":"2013-02-13","value":"1773"},{"dateTime":"2013-02-14","value":"1773"},{"dateTime":"2013-02-15","value":"1773"},{"dateTime":"2013-02-16","value":"1773"},{"dateTime":"2013-02-17","value":"1773"},{"dateTime":"2013-02-18","value":"1773"},{"dateTime":"2013-02-19","value":"1773"},{"dateTime":"2013-02-20","value":"1773"},{"dateTim [...]
\ No newline at end of file
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-10.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-10.json
new file mode 100644
index 0000000..11e3d21
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-10.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-10","value":"2491"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:15:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:30:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:45:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:00:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-11.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-11.json
new file mode 100644
index 0000000..2c4827a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-11.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-11","value":"2229"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":151,"time":"00:00:00","value":18.67719078063965},{"level":0,"mets":151,"time":"00:15:00","value":18.67719078063965},{"level":0,"mets":150,"time":"00:30:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:45:00","value":18.553499221801758},{"level":0,"mets":150,"time":"01:00:00","value":18.553499221801758},{"level":0,"mets":152,"time":"01:15:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-12.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-12.json
new file mode 100644
index 0000000..5e1a4f5
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-12.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-12","value":"3190"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":154,"time":"00:00:00","value":19.051340103149414},{"level":0,"mets":150,"time":"00:15:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:30:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:45:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:00:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-13.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-13.json
new file mode 100644
index 0000000..17080cf
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-13.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-13","value":"2366"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":186,"time":"00:00:00","value":23.00634002685547},{"level":0,"mets":164,"time":"00:15:00","value":20.285160064697266},{"level":0,"mets":158,"time":"00:30:00","value":19.543020248413086},{"level":0,"mets":151,"time":"00:45:00","value":18.67719078063965},{"level":0,"mets":157,"time":"01:00:00","value":19.419330596923828},{"level":0,"mets":167,"time":"01:15:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-14.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-14.json
new file mode 100644
index 0000000..d528d35
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-14.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-14","value":"2656"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:15:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:30:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:45:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:00:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-15.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-15.json
new file mode 100644
index 0000000..aff95e9
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-15.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-15","value":"2502"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":165,"time":"00:00:00","value":20.410499572753906},{"level":0,"mets":152,"time":"00:15:00","value":18.802400588989258},{"level":0,"mets":150,"time":"00:30:00","value":18.55500030517578},{"level":0,"mets":151,"time":"00:45:00","value":18.678699493408203},{"level":0,"mets":151,"time":"01:00:00","value":18.678699493408203},{"level":0,"mets":151,"time":"01:15:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-16.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-16.json
new file mode 100644
index 0000000..fd146d5
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-16.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-16","value":"2669"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.550500869750977},{"level":0,"mets":151,"time":"00:15:00","value":18.674169540405273},{"level":0,"mets":167,"time":"00:30:00","value":20.652889251708984},{"level":0,"mets":150,"time":"00:45:00","value":18.550500869750977},{"level":0,"mets":150,"time":"01:00:00","value":18.550500869750977},{"level":0,"mets":152,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-17.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-17.json
new file mode 100644
index 0000000..a7838ad
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-17.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-17","value":"2919"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":165,"time":"00:00:00","value":20.410499572753906},{"level":0,"mets":151,"time":"00:15:00","value":18.678699493408203},{"level":0,"mets":152,"time":"00:30:00","value":18.802400588989258},{"level":0,"mets":150,"time":"00:45:00","value":18.55500030517578},{"level":0,"mets":150,"time":"01:00:00","value":18.55500030517578},{"level":0,"mets":209,"time":"01:15:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-18.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-18.json
new file mode 100644
index 0000000..78d04d3
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-18.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-18","value":"2057"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:15:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:30:00","value":18.558000564575195},{"level":0,"mets":150,"time":"00:45:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:00:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-19.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-19.json
new file mode 100644
index 0000000..a97b0ee
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-19.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-19","value":"2373"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:15:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:30:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:45:00","value":18.553499221801758},{"level":0,"mets":150,"time":"01:00:00","value":18.553499221801758},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-20.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-20.json
new file mode 100644
index 0000000..8f16dcf
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-20.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-20","value":"2916"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":151,"time":"00:00:00","value":18.681720733642578},{"level":0,"mets":152,"time":"00:15:00","value":18.80544090270996},{"level":0,"mets":176,"time":"00:30:00","value":21.77471923828125},{"level":0,"mets":150,"time":"00:45:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:00:00","value":18.558000564575195},{"level":0,"mets":150,"time":"01:15:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-21.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-21.json
new file mode 100644
index 0000000..0339311
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-21.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-21","value":"2517"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":160,"time":"00:00:00","value":19.7903995513916},{"level":0,"mets":165,"time":"00:15:00","value":20.408849716186523},{"level":0,"mets":158,"time":"00:30:00","value":19.543020248413086},{"level":0,"mets":150,"time":"00:45:00","value":18.553499221801758},{"level":0,"mets":152,"time":"01:00:00","value":18.800880432128906},{"level":0,"mets":150,"time":"01:15:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-22.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-22.json
new file mode 100644
index 0000000..d27e5c7
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-22.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-22","value":"2754"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":153,"time":"00:00:00","value":18.927629470825195},{"level":0,"mets":223,"time":"00:15:00","value":27.587329864501953},{"level":1,"mets":239,"time":"00:30:00","value":29.56669044494629},{"level":1,"mets":248,"time":"00:45:00","value":30.68008041381836},{"level":0,"mets":201,"time":"01:00:00","value":24.86570930480957},{"level":0,"mets":172,"time":"01:15:00","value [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-23.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-23.json
new file mode 100644
index 0000000..f48927d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-23.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-23","value":"2793"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":199,"time":"00:00:00","value":24.612319946289062},{"level":0,"mets":180,"time":"00:15:00","value":22.262399673461914},{"level":0,"mets":180,"time":"00:30:00","value":22.262399673461914},{"level":0,"mets":168,"time":"00:45:00","value":20.778240203857422},{"level":0,"mets":150,"time":"01:00:00","value":18.552000045776367},{"level":0,"mets":152,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-24.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-24.json
new file mode 100644
index 0000000..cb673b8
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-24.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-24","value":"2487"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.55500030517578},{"level":0,"mets":150,"time":"00:15:00","value":18.55500030517578},{"level":0,"mets":150,"time":"00:30:00","value":18.55500030517578},{"level":0,"mets":150,"time":"00:45:00","value":18.55500030517578},{"level":0,"mets":150,"time":"01:00:00","value":18.55500030517578},{"level":0,"mets":150,"time":"01:15:00","value": [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-25.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-25.json
new file mode 100644
index 0000000..54c2ae2
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-25.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-25","value":"2524"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":181,"time":"00:00:00","value":22.393320083618164},{"level":0,"mets":183,"time":"00:15:00","value":22.64076042175293},{"level":0,"mets":179,"time":"00:30:00","value":22.1458797454834},{"level":0,"mets":184,"time":"00:45:00","value":22.764480590820312},{"level":0,"mets":180,"time":"01:00:00","value":22.26959991455078},{"level":0,"mets":197,"time":"01:15:00","value" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-26.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-26.json
new file mode 100644
index 0000000..f77306b
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-26.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-26","value":"2612"}],"activities-calories-intraday":{"dataset":[{"level":1,"mets":226,"time":"00:00:00","value":27.95393943786621},{"level":0,"mets":181,"time":"00:15:00","value":22.387889862060547},{"level":0,"mets":176,"time":"00:30:00","value":21.769439697265625},{"level":0,"mets":174,"time":"00:45:00","value":21.52206039428711},{"level":0,"mets":185,"time":"01:00:00","value":22.88265037536621},{"level":1,"mets":255,"time":"01:15:00","value [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-27.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-27.json
new file mode 100644
index 0000000..202b824
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-27.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-27","value":"2526"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":152,"time":"00:00:00","value":18.80392074584961},{"level":0,"mets":150,"time":"00:15:00","value":18.556499481201172},{"level":0,"mets":164,"time":"00:30:00","value":20.288440704345703},{"level":0,"mets":150,"time":"00:45:00","value":18.556499481201172},{"level":0,"mets":164,"time":"01:00:00","value":20.288440704345703},{"level":0,"mets":150,"time":"01:15:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-28.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-28.json
new file mode 100644
index 0000000..2d4bfa9
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-28.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-28","value":"2487"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":207,"time":"00:00:00","value":25.599689483642578},{"level":0,"mets":156,"time":"00:15:00","value":19.29252052307129},{"level":0,"mets":150,"time":"00:30:00","value":18.550500869750977},{"level":0,"mets":150,"time":"00:45:00","value":18.550500869750977},{"level":0,"mets":150,"time":"01:00:00","value":18.550500869750977},{"level":0,"mets":150,"time":"01:15:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-29.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-29.json
new file mode 100644
index 0000000..b76bbae
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-29.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-29","value":"2366"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":152,"time":"00:00:00","value":18.800880432128906},{"level":0,"mets":150,"time":"00:15:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:30:00","value":18.553499221801758},{"level":0,"mets":150,"time":"00:45:00","value":18.553499221801758},{"level":0,"mets":153,"time":"01:00:00","value":18.924570083618164},{"level":0,"mets":151,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-30.json b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-30.json
new file mode 100644
index 0000000..12f18ce
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-calories-2015-12-30.json
@@ -0,0 +1 @@
+{"activities-calories":[{"dateTime":"2015-12-30","value":"2423"}],"activities-calories-intraday":{"dataset":[{"level":0,"mets":150,"time":"00:00:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:15:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:30:00","value":18.556499481201172},{"level":0,"mets":150,"time":"00:45:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:00:00","value":18.556499481201172},{"level":0,"mets":150,"time":"01:15:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-10.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-10.json
new file mode 100644
index 0000000..68f620e
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-10.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-10","value":"3.89512"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-11.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-11.json
new file mode 100644
index 0000000..c76feff
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-11.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-11","value":"2.00149"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0.005090000107884407},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{ [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-12.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-12.json
new file mode 100644
index 0000000..56bef33
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-12.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-12","value":"8.95491"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-13.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-13.json
new file mode 100644
index 0000000..ccdddf6
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-13.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-13","value":"2.94223"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0.023259999230504036},{"time":"02:00:00","value":0.042169999331235886},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02: [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-14.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-14.json
new file mode 100644
index 0000000..0d6058d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-14.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-14","value":"5.53064"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-15.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-15.json
new file mode 100644
index 0000000..9205ebe
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-15.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-15","value":"3.23168"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0.0058200000785291195},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-16.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-16.json
new file mode 100644
index 0000000..d8a51f3
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-16.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-16","value":"4.82016"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0.0029100000392645597},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0.016720000654459},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-17.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-17.json
new file mode 100644
index 0000000..5dd7022
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-17.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-17","value":"7.1470899999999995"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0.005090000107884407},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-18.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-18.json
new file mode 100644
index 0000000..deac045
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-18.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-18","value":"0.8208099999999999"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-19.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-19.json
new file mode 100644
index 0000000..94ba940
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-19.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-19","value":"3.18951"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-20.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-20.json
new file mode 100644
index 0000000..de526b9
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-20.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-20","value":"4.2771"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0.006539999973028898},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-21.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-21.json
new file mode 100644
index 0000000..e1ff83b
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-21.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-21","value":"2.6448899999999997"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-22.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-22.json
new file mode 100644
index 0000000..19ceb2a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-22.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-22","value":"5.50727"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0.024720000103116035},{"time":"00:30:00","value":0.03198999911546707},{"time":"00:45:00","value":0.03053000010550022},{"time":"01:00:00","value":0.0058200000785291195},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0.005090000107884407},{"time":"02:15:0 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-23.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-23.json
new file mode 100644
index 0000000..707792c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-23.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-23","value":"5.97912"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0.009449999779462814},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0.0029100000392645597},{"time":"02:30:00","value":0},{"time":"02 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-24.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-24.json
new file mode 100644
index 0000000..9ac6540
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-24.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-24","value":"3.12907"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-25.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-25.json
new file mode 100644
index 0000000..3a2ebab
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-25.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-25","value":"2.82234"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0.005090000107884407},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0.0058200000785291195},{"time":"02:30:00","value":0.015270000323 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-26.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-26.json
new file mode 100644
index 0000000..d599e9d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-26.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-26","value":"3.68443"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0.021810000762343407},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0.06396999955177307},{"time":"01:30:00","value":0.033440001308918},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value": [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-27.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-27.json
new file mode 100644
index 0000000..187d8f6
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-27.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-27","value":"2.51991"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0.007269999943673611},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0.0058200000785291195},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0.003640000009909272},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","va [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-28.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-28.json
new file mode 100644
index 0000000..5142588
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-28.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-28","value":"3.26652"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0.005090000107884407},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{ [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-29.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-29.json
new file mode 100644
index 0000000..a1d6a03
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-29.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-29","value":"2.7822999999999998"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-30.json b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-30.json
new file mode 100644
index 0000000..b0546a0
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-distance-2015-12-30.json
@@ -0,0 +1 @@
+{"activities-distance":[{"dateTime":"2015-12-30","value":"3.21054"}],"activities-distance-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00"," [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-10.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-10.json
new file mode 100644
index 0000000..ae5d51d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-10.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-10","value":"18"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-11.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-11.json
new file mode 100644
index 0000000..6d8e1d5
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-11.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-11","value":"3"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-12.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-12.json
new file mode 100644
index 0000000..15f96a4
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-12.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-12","value":"18"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-13.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-13.json
new file mode 100644
index 0000000..d2e143a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-13.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-13","value":"15"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":3.0480000972747803},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-14.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-14.json
new file mode 100644
index 0000000..9ee5ea8
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-14.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-14","value":"3"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-15.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-15.json
new file mode 100644
index 0000000..be89512
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-15.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-15","value":"12"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-16.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-16.json
new file mode 100644
index 0000000..293c0ea
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-16.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-16","value":"24"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-17.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-17.json
new file mode 100644
index 0000000..42cdaf5
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-17.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-17","value":"6"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-18.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-18.json
new file mode 100644
index 0000000..06ede4a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-18.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-18","value":"0"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-19.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-19.json
new file mode 100644
index 0000000..a2ecf70
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-19.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-19","value":"15"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-20.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-20.json
new file mode 100644
index 0000000..b2031d4
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-20.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-20","value":"24"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-21.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-21.json
new file mode 100644
index 0000000..aefec18
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-21.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-21","value":"12"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-22.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-22.json
new file mode 100644
index 0000000..af10d9c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-22.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-22","value":"6"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-23.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-23.json
new file mode 100644
index 0000000..08ecd72
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-23.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-23","value":"39"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-24.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-24.json
new file mode 100644
index 0000000..fd50f70
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-24.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-24","value":"6"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","valu [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-25.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-25.json
new file mode 100644
index 0000000..0d11a4b
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-25.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-25","value":"15"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-26.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-26.json
new file mode 100644
index 0000000..b1d6d19
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-26.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-26","value":"36"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":3.0480000972747803},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-27.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-27.json
new file mode 100644
index 0000000..640e26c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-27.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-27","value":"15"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-28.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-28.json
new file mode 100644
index 0000000..797032c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-28.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-28","value":"39"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-29.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-29.json
new file mode 100644
index 0000000..2a58366
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-29.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-29","value":"12"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-30.json b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-30.json
new file mode 100644
index 0000000..e1531b0
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-elevation-2015-12-30.json
@@ -0,0 +1 @@
+{"activities-elevation":[{"dateTime":"2015-12-30","value":"15"}],"activities-elevation-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","val [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-10.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-10.json
new file mode 100644
index 0000000..bd386ee
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-10.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-10","value":"6"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-11.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-11.json
new file mode 100644
index 0000000..d4027f8
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-11.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-11","value":"1"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-12.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-12.json
new file mode 100644
index 0000000..f0517cb
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-12.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-12","value":"6"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-13.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-13.json
new file mode 100644
index 0000000..52736a0
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-13.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-13","value":"5"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":1},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-14.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-14.json
new file mode 100644
index 0000000..71e2164
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-14.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-14","value":"1"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-15.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-15.json
new file mode 100644
index 0000000..6bc75ab
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-15.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-15","value":"4"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-16.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-16.json
new file mode 100644
index 0000000..a88bf41
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-16.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-16","value":"8"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-17.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-17.json
new file mode 100644
index 0000000..e47674d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-17.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-17","value":"2"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-18.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-18.json
new file mode 100644
index 0000000..d0ba5b7
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-18.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-18","value":"0"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-19.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-19.json
new file mode 100644
index 0000000..1b2c7b7
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-19.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-19","value":"5"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-20.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-20.json
new file mode 100644
index 0000000..39f402b
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-20.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-20","value":"8"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-21.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-21.json
new file mode 100644
index 0000000..2b8035f
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-21.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-21","value":"4"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-22.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-22.json
new file mode 100644
index 0000000..bebfbb2
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-22.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-22","value":"2"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-23.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-23.json
new file mode 100644
index 0000000..544af3b
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-23.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-23","value":"13"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-24.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-24.json
new file mode 100644
index 0000000..a2d8f5a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-24.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-24","value":"2"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-25.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-25.json
new file mode 100644
index 0000000..8cca747
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-25.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-25","value":"5"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-26.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-26.json
new file mode 100644
index 0000000..e2a971d
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-26.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-26","value":"12"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":1},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-27.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-27.json
new file mode 100644
index 0000000..cb2a45a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-27.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-27","value":"5"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-28.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-28.json
new file mode 100644
index 0000000..92bf182
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-28.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-28","value":"13"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-29.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-29.json
new file mode 100644
index 0000000..6ea0c44
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-29.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-29","value":"4"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-30.json b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-30.json
new file mode 100644
index 0000000..5db7fed
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-floors-2015-12-30.json
@@ -0,0 +1 @@
+{"activities-floors":[{"dateTime":"2015-12-30","value":"5"}],"activities-floors-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0}, [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-10.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-10.json
new file mode 100644
index 0000000..85c05bd
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-10.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-10","value":"5319"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-11.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-11.json
new file mode 100644
index 0000000..e5c4048
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-11.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-11","value":"2753"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":7},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-12.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-12.json
new file mode 100644
index 0000000..3ce6b21
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-12.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-12","value":"12208"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-13.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-13.json
new file mode 100644
index 0000000..992db69
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-13.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-13","value":"4047"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":32},{"time":"02:00:00","value":58},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value": [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-14.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-14.json
new file mode 100644
index 0000000..a1f8e2c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-14.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-14","value":"7501"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-15.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-15.json
new file mode 100644
index 0000000..8ce51dc
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-15.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-15","value":"4445"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":8},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-16.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-16.json
new file mode 100644
index 0000000..a43ce15
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-16.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-16","value":"6561"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":4},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":23},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-17.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-17.json
new file mode 100644
index 0000000..d6e6f3c
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-17.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-17","value":"9733"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":7},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-18.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-18.json
new file mode 100644
index 0000000..5ecc672
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-18.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-18","value":"1129"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-19.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-19.json
new file mode 100644
index 0000000..4992b38
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-19.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-19","value":"4387"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-20.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-20.json
new file mode 100644
index 0000000..5a39335
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-20.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-20","value":"5883"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":9},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-21.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-21.json
new file mode 100644
index 0000000..54dd6fc
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-21.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-21","value":"3638"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-22.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-22.json
new file mode 100644
index 0000000..e19b15a
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-22.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-22","value":"7536"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":34},{"time":"00:30:00","value":44},{"time":"00:45:00","value":42},{"time":"01:00:00","value":8},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":7},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-23.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-23.json
new file mode 100644
index 0000000..f59c288
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-23.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-23","value":"8187"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":13},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":4},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-24.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-24.json
new file mode 100644
index 0000000..b8823b6
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-24.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-24","value":"4304"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-25.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-25.json
new file mode 100644
index 0000000..65a43b8
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-25.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-25","value":"3882"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":7},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":8},{"time":"02:30:00","value":21},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-26.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-26.json
new file mode 100644
index 0000000..985a587
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-26.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-26","value":"5068"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":30},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":88},{"time":"01:30:00","value":46},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value" [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-27.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-27.json
new file mode 100644
index 0000000..9bf53ff
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-27.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-27","value":"3466"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":10},{"time":"00:45:00","value":0},{"time":"01:00:00","value":8},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":5},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":4},{"time":"02:45:00","value":0},{"time":"03:00:00","value":7 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-28.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-28.json
new file mode 100644
index 0000000..d8f52f6
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-28.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-28","value":"4493"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":7},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-29.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-29.json
new file mode 100644
index 0000000..69f3167
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-29.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-29","value":"3827"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":15 [...]
diff --git a/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-30.json b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-30.json
new file mode 100644
index 0000000..760d3fc
--- /dev/null
+++ b/inst/extdata/intra-daily-timeseries/intra-steps-2015-12-30.json
@@ -0,0 +1 @@
+{"activities-steps":[{"dateTime":"2015-12-30","value":"4416"}],"activities-steps-intraday":{"dataset":[{"time":"00:00:00","value":0},{"time":"00:15:00","value":0},{"time":"00:30:00","value":0},{"time":"00:45:00","value":0},{"time":"01:00:00","value":0},{"time":"01:15:00","value":0},{"time":"01:30:00","value":0},{"time":"01:45:00","value":0},{"time":"02:00:00","value":0},{"time":"02:15:00","value":0},{"time":"02:30:00","value":0},{"time":"02:45:00","value":0},{"time":"03:00:00","value":0} [...]
diff --git a/man/DataLoader.Rd b/man/DataLoader.Rd
new file mode 100644
index 0000000..b2ef9dc
--- /dev/null
+++ b/man/DataLoader.Rd
@@ -0,0 +1,47 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/DataLoader.R
+\docType{class}
+\name{DataLoader}
+\alias{DataLoader}
+\title{R6 class for Loading Fitbit data}
+\format{A \code{\link{R6Class}} generator object}
+\usage{
+DataLoader
+}
+\description{
+DataLoader is an R6 Class that connects to the Fitbit API with the credentials, requests the data, and writes the response to JSON files,
+}
+\section{Methods}{
+
+\describe{
+ \item{\code{connect(appname, key, secret, cache.file)}}{This method connects to the Fitbit API and to your application.
+ \cr \code{appname}: Name of the Fitbit App
+ \cr \code{key}: Fitbit API Client key
+ \cr \code{secret}: Fibit API Client secret
+ \cr \code{cache.file}: Path to a cached token file, instead of providing credentials in the function call}
+ \item{\code{request(type = "day", activities = "", start.date = Sys.Date(), end.date = "", path = "./json/"))}}{This method builds the request URLs, sends the requests and writes response to JSON files, in the specified folder.
+ \cr \code{type}: Type of time series. Must be 'day' or 'intraday'.
+ \cr \code{activities}: A list of the Fitibit activities to be retrieved.
+ \cr \code{start.date}: Start date in format YYYY-mm-dd.
+ \cr \code{end.date}: End date in format YYYY-mm-dd.
+ \cr \code{path}: Folder where the JSON files will be written.}
+}
+}
+\examples{
+\dontrun{
+testObject <- DataLoader$new()
+
+testObject$connect(appname = "abcd",
+ key = "123ABC",
+ secret = "3089e3h1ac9dde0aa67b54ajc8691j44")
+
+testObject$request(
+ type = 'day',
+ activities = list("calories", "steps", "distance", "minutesVeryActive"),
+ start.date = "2016-01-01",
+ end.date = "2016-02-01",
+ path = "~/fitbit-daily/")
+}
+}
+\keyword{data}
+
diff --git a/man/FitAnalyzer.Rd b/man/FitAnalyzer.Rd
new file mode 100644
index 0000000..a78f815
--- /dev/null
+++ b/man/FitAnalyzer.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitAnalyzer.R
+\docType{class}
+\name{FitAnalyzer}
+\alias{FitAnalyzer}
+\title{R6 class for Analyzing Fitbit Data}
+\format{A \code{\link{R6Class}} generator object}
+\usage{
+FitAnalyzer
+}
+\description{
+FitAnalyzer is an R6 class for analyzing Fitbit data. It is an opinionated implementation of a particular workflow for analysis.
+For people attempting to conduct their own analysis in a different fashion you should use the more generic functions implemented in FitUtil. \cr \cr
+The workflow implemented for FitAnalyzer is the following: \cr
+1. Create the FitAnalyzer with the goal variable for analysis. Eg: Calories or steps or distance. The goal variable is your personal goal that you are trying to analyze better. \cr
+2. Call \code{findImportantVariables} to understand the most important variables unique to you that enable meeting your goal. \cr
+3. Call \code{showMostImportantCharts} to get relevant charts that are unique to your data \cr
+4. Call \code{predictGoal} to get a prediction on performance of the goal \cr \cr
+You can conduct two types of analysis based on the type of dataset in consideration. \code{analysis.type} can be 'intra.day' or 'daily' analysis.
+}
+\section{Methods}{
+
+\describe{
+ \item{\code{getAnalysisFrame(folder, analysis.type)}}{This method uses \code{analysis.type} as an argument to return a data.frame that is clean and augmented with additional features like weekend.}
+ \item{\code{findImportantVariables(tsDataFrame, seed = 12345)}}{Finds the most important variables that are enabling meeting the goals for the person, by creating a `glm` model and ranking the variables based on the coefficients of the model.}
+ \item{\code{getFit()}}{Returns the `glm` fit object.}
+ \item{\code{showMostImportantCharts(tsDataFrame)}}{Plots charts for the most relevant goals, with actual data and moving average using \code{geom_smooth()}.
+ \cr \code{tsDataFrame}: a data.frame containing the fitibit activities.}
+ \item{\code{predictGoal(x)}}{Gives a prediction on the goal performance, based on `glm` (daily) or `gbm` (intraday).}
+}
+}
+\keyword{data}
+
diff --git a/man/augmentData.Rd b/man/augmentData.Rd
new file mode 100644
index 0000000..0becdfd
--- /dev/null
+++ b/man/augmentData.Rd
@@ -0,0 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{augmentData}
+\alias{augmentData}
+\title{Augments the Master data.frame with additional information}
+\usage{
+augmentData(masterTsDataFrame)
+}
+\arguments{
+\item{masterTsDataFrame}{The Master Time Series data.frame}
+}
+\value{
+The Master data.frame with additinal data elements
+ weekday, weekend
+}
+\description{
+Augments the Master data.frame with additional information
+}
+
diff --git a/man/augmentIntraData.Rd b/man/augmentIntraData.Rd
new file mode 100644
index 0000000..2109af5
--- /dev/null
+++ b/man/augmentIntraData.Rd
@@ -0,0 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{augmentIntraData}
+\alias{augmentIntraData}
+\title{Augments the intra day data.frame with additional information}
+\usage{
+augmentIntraData(inFrame)
+}
+\arguments{
+\item{inFrame}{The Master Time Series data.frame}
+}
+\value{
+The Master data.frame with additinal data elements
+ weekday, weekend, cum.sums of various variables
+}
+\description{
+Augments the intra day data.frame with additional information
+}
+
diff --git a/man/buildChartDay.Rd b/man/buildChartDay.Rd
new file mode 100644
index 0000000..1271f6f
--- /dev/null
+++ b/man/buildChartDay.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{buildChartDay}
+\alias{buildChartDay}
+\title{Build Day timeseries Chart}
+\usage{
+buildChartDay(data, y.axes)
+}
+\arguments{
+\item{data}{data.frame}
+
+\item{y.axes}{Names of the Y-axes data, as a vector of characters}
+}
+\value{
+A plot
+}
+\description{
+Plots charts that have been selected as most relevant.
+}
+
diff --git a/man/buildChartIntra.Rd b/man/buildChartIntra.Rd
new file mode 100644
index 0000000..f183109
--- /dev/null
+++ b/man/buildChartIntra.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{buildChartIntra}
+\alias{buildChartIntra}
+\title{Build Intraday Chart}
+\usage{
+buildChartIntra(data, y.axes)
+}
+\arguments{
+\item{data}{data.frame}
+
+\item{y.axes}{Names of the Y-axes data, as a vector of characters}
+}
+\value{
+A plot
+}
+\description{
+Plots intraday charts for the most relevant activities
+}
+
diff --git a/man/connectToAPI.Rd b/man/connectToAPI.Rd
new file mode 100644
index 0000000..d829758
--- /dev/null
+++ b/man/connectToAPI.Rd
@@ -0,0 +1,23 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{connectToAPI}
+\alias{connectToAPI}
+\title{Connects to Fibit API}
+\usage{
+connectToAPI(appname, key, secret)
+}
+\arguments{
+\item{appname}{Name of the Fitbit App}
+
+\item{key}{Fitbit API Client key}
+
+\item{secret}{Fibit API Client secret}
+}
+\value{
+A Fitbit API token, that will be cached
+}
+\description{
+Connects to the Fitbit API with OAuth 2.
+See https://dev.fitbit.com/docs/oauth2/
+}
+
diff --git a/man/createDependentVariableFrame.Rd b/man/createDependentVariableFrame.Rd
new file mode 100644
index 0000000..1e3cc0e
--- /dev/null
+++ b/man/createDependentVariableFrame.Rd
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{createDependentVariableFrame}
+\alias{createDependentVariableFrame}
+\title{Creates a data.frame with only goal variables}
+\usage{
+createDependentVariableFrame(master, goal)
+}
+\arguments{
+\item{master}{Master data.frame}
+
+\item{goal}{Goal variable}
+}
+\description{
+Creates a data.frame with only goal variables
+}
+
diff --git a/man/createGoalVariableVector.Rd b/man/createGoalVariableVector.Rd
new file mode 100644
index 0000000..e24dc4e
--- /dev/null
+++ b/man/createGoalVariableVector.Rd
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{createGoalVariableVector}
+\alias{createGoalVariableVector}
+\title{Creates a vector of goal variables}
+\usage{
+createGoalVariableVector(master, goal)
+}
+\arguments{
+\item{master}{Master data.frame}
+
+\item{goal}{Goal variable}
+}
+\description{
+Creates a vector of goal variables
+}
+
diff --git a/man/createIntraFrame.Rd b/man/createIntraFrame.Rd
new file mode 100644
index 0000000..1198d89
--- /dev/null
+++ b/man/createIntraFrame.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{createIntraFrame}
+\alias{createIntraFrame}
+\title{Creates the intraday Frame}
+\usage{
+createIntraFrame(folder)
+}
+\arguments{
+\item{folder}{The folder in which JSON files will be read.}
+}
+\description{
+Creates the intraday Frame
+}
+
diff --git a/man/createTsMasterFrame.Rd b/man/createTsMasterFrame.Rd
new file mode 100644
index 0000000..8bce8ee
--- /dev/null
+++ b/man/createTsMasterFrame.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{createTsMasterFrame}
+\alias{createTsMasterFrame}
+\title{Creates the Master data.frame from Timeseries JSON files.}
+\usage{
+createTsMasterFrame(tsFileFolder, resourcePath = getDailyResourcePathList())
+}
+\arguments{
+\item{tsFileFolder}{Folder containing all time-series files. Naming convention for files is max-[resource].json}
+
+\item{resourcePath}{the resource paths to look. Default will get getDailyResourcePathList()}
+}
+\value{
+The Master data.frame
+}
+\description{
+Creates the Master data.frame from Timeseries JSON files.
+}
+
diff --git a/man/fetchIntraResourceData.Rd b/man/fetchIntraResourceData.Rd
new file mode 100644
index 0000000..eb5f5f0
--- /dev/null
+++ b/man/fetchIntraResourceData.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{fetchIntraResourceData}
+\alias{fetchIntraResourceData}
+\title{Loads the JSON files for intraday data and returns a data.frame}
+\usage{
+fetchIntraResourceData(folder, resource, files)
+}
+\arguments{
+\item{folder}{the folder to source the files from}
+
+\item{resource}{the type of resource(Eg: calories, steps, distance etc)}
+
+\item{files}{the list of files to look into for fetch}
+}
+\value{
+Resource data.frame
+}
+\description{
+Loads the JSON files for intraday data and returns a data.frame
+}
+
diff --git a/man/getAPIScope.Rd b/man/getAPIScope.Rd
new file mode 100644
index 0000000..41e844a
--- /dev/null
+++ b/man/getAPIScope.Rd
@@ -0,0 +1,16 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{getAPIScope}
+\alias{getAPIScope}
+\title{Get API scope}
+\usage{
+getAPIScope()
+}
+\value{
+A vector of scope
+}
+\description{
+Gets the scopes that will be retrieved by the API request to fitbit.
+See https://dev.fitbit.com/docs/oauth2/#scope
+}
+
diff --git a/man/getDailyResourcePathList.Rd b/man/getDailyResourcePathList.Rd
new file mode 100644
index 0000000..9e20444
--- /dev/null
+++ b/man/getDailyResourcePathList.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{getDailyResourcePathList}
+\alias{getDailyResourcePathList}
+\title{Returns a list of Fitbit Daily activities}
+\usage{
+getDailyResourcePathList()
+}
+\value{
+A list
+}
+\description{
+Returns a list of Fitbit Daily activities
+}
+
diff --git a/man/getIntradayResourcePathList.Rd b/man/getIntradayResourcePathList.Rd
new file mode 100644
index 0000000..57aa923
--- /dev/null
+++ b/man/getIntradayResourcePathList.Rd
@@ -0,0 +1,15 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{getIntradayResourcePathList}
+\alias{getIntradayResourcePathList}
+\title{Returns a list of Fitbit Intraday activities}
+\usage{
+getIntradayResourcePathList()
+}
+\value{
+A list
+}
+\description{
+Returns a list of Fitbit Intraday activities
+}
+
diff --git a/man/makeAPIRequest.Rd b/man/makeAPIRequest.Rd
new file mode 100644
index 0000000..2d55bda
--- /dev/null
+++ b/man/makeAPIRequest.Rd
@@ -0,0 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{makeAPIRequest}
+\alias{makeAPIRequest}
+\title{Make API Request}
+\usage{
+makeAPIRequest(type, activity, start.date, end.date, api.token)
+}
+\arguments{
+\item{type}{Type of time series. Must be 'day' or 'intraday'}
+
+\item{activity}{Type of activity. See below for details.}
+
+\item{start.date}{Start date in format YYYY-mm-dd}
+
+\item{end.date}{End date in format YYYY-mm-dd}
+
+\item{api.token}{API token for connection to Fitbit API}
+}
+\value{
+The request response
+}
+\description{
+Makes request to Fitbit API, and stores the response into a variable.
+}
+
diff --git a/man/markValidRows.Rd b/man/markValidRows.Rd
new file mode 100644
index 0000000..e6eeafe
--- /dev/null
+++ b/man/markValidRows.Rd
@@ -0,0 +1,18 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{markValidRows}
+\alias{markValidRows}
+\title{Incorporates rules for marking if the data entry in MasterTSFrame are valid or not}
+\usage{
+markValidRows(masterTsDataFrame)
+}
+\arguments{
+\item{masterTsDataFrame}{The Master Time Series data.frame}
+}
+\value{
+The marked Master data.frame. i.e column valid is added at the end of the data.frame
+}
+\description{
+Incorporates rules for marking if the data entry in MasterTSFrame are valid or not
+}
+
diff --git a/man/properCase.Rd b/man/properCase.Rd
new file mode 100644
index 0000000..fd0d5cd
--- /dev/null
+++ b/man/properCase.Rd
@@ -0,0 +1,18 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{properCase}
+\alias{properCase}
+\title{Proper Case}
+\usage{
+properCase(x)
+}
+\arguments{
+\item{x}{A string}
+}
+\value{
+A string with proper case
+}
+\description{
+Sets a string to proper case, i.e. upper case for the first letter of each word
+}
+
diff --git a/man/writeToJSON.Rd b/man/writeToJSON.Rd
new file mode 100644
index 0000000..922f050
--- /dev/null
+++ b/man/writeToJSON.Rd
@@ -0,0 +1,23 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/FitUtil.R
+\name{writeToJSON}
+\alias{writeToJSON}
+\title{Write to JSON}
+\usage{
+writeToJSON(content, path, type, activity, start.date)
+}
+\arguments{
+\item{content}{JSON content to be written to file}
+
+\item{path}{Path to folder where files will be created}
+
+\item{type}{Type of time series. Must be 'day' or 'intraday'}
+
+\item{activity}{Type of activity. See below for details.}
+
+\item{start.date}{Start date}
+}
+\description{
+Writes API response content to JSON files, in a specific folder
+}
+
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..d1f0f42
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,4 @@
+library(testthat)
+library(fitcoach)
+
+test_check("fitcoach")
diff --git a/tests/testthat/test-fitanalyzer.R b/tests/testthat/test-fitanalyzer.R
new file mode 100644
index 0000000..4755928
--- /dev/null
+++ b/tests/testthat/test-fitanalyzer.R
@@ -0,0 +1,51 @@
+context("FitAnalyzer tests")
+
+test_that("FitAnalyzer test cases", {
+
+ masterPath <-
+ system.file("extdata", "daily-time-series", package = "fitcoach")
+
+ ### Tests for daily analysis
+
+ # Test 1 - Initializing and dataframe creation
+ ana <- FitAnalyzer$new("calories")
+ ts <-
+ ana$getAnalysisFrame(folder = masterPath, analysis.type = "daily")
+ expect_equal(nrow(ts), 191)
+
+ # Test 2 - Find important variables
+ vars <- ana$findImportantVariables(tsDataFrame = ts, seed = 12345)
+ expect_equal(vars$name[1], "minutesLightlyActive")
+
+ # Test 3 - Find important variables, without arguments
+ vars <- ana$findImportantVariables()
+ expect_equal(names(vars[1]), "Overall")
+
+ # Test 4 - Goal prediction
+ rows.test <- ts[c(3,7,10), ]
+ rows.test <- createDependentVariableFrame(master = rows.test, goal = "calories")
+ res <- ana$predictGoal(rows.test)
+ expect_less_than(res[1], 2820)
+ expect_gte(res[1], 2819)
+
+ ### Tests for intra-day analysis
+
+ # Test 5 - Initializing and dataframe creation
+ masterPath <-
+ system.file("extdata", "intra-daily-timeseries", package = "fitcoach")
+ ana <- FitAnalyzer$new("calories")
+ intra <-
+ ana$getAnalysisFrame(folder = masterPath, analysis.type = "intra.day")
+ expect_equal(nrow(intra), 2016)
+
+ # Test 6 - Find important variables
+ vars <- ana$findImportantVariables(intra)
+ vars <- sort(vars, decreasing = TRUE)
+ expect_equal(names(vars[1]), "steps")
+
+ # Test 7 - Predict goal for the day
+ rows.test <- intra[c(3), ]
+ res <- ana$predictGoal(rows.test)
+ expect_less_than(res , 2518)
+
+})
diff --git a/tests/testthat/test-fitutil.R b/tests/testthat/test-fitutil.R
new file mode 100644
index 0000000..c580e5d
--- /dev/null
+++ b/tests/testthat/test-fitutil.R
@@ -0,0 +1,45 @@
+context("Fit util tests")
+
+test_that("Fitutil test cases", {
+
+ ### Tests for daily analysis
+
+ # Test 1 - Create master dataframe
+ masterPath <-
+ system.file("extdata", "daily-time-series", package = "fitcoach")
+ master <- createTsMasterFrame(masterPath)
+ master <- markValidRows(master)
+ master <- master[master$valid == TRUE, ]
+ master <- augmentData(master)
+ expect_equal(nrow(master), 191)
+
+ # Test 2 - createGoalVariableVector()
+ y <- createGoalVariableVector(master, goal = "calories")
+ expect_gte(mean(y), 2632)
+
+ # Test 3 - createDependentVariableFrame()
+ x <- createDependentVariableFrame(master, goal = "calories")
+ expect_equal(ncol(x), 9)
+
+ # Test 4 - Distance Goal
+ y <- createGoalVariableVector(master, goal = "distance")
+ expect_lte(mean(y), 4.9)
+
+ # Test 5 - Distance X
+ x <- createDependentVariableFrame(master, goal = "distance")
+ expect_equal(ncol(x), 8)
+
+
+ ### Tests for intra-day analysis
+
+ # Test 6 - createIntraFrame()
+ folder <-
+ system.file("extdata", "intra-daily-timeseries", package = "fitcoach")
+ intraMaster <- createIntraFrame(folder)
+ expect_equal(nrow(intraMaster), 2016)
+
+ # Test 7 - augmentIntraData()
+ intraMaster <- augmentIntraData(intraMaster)
+ expect_equal(ncol(intraMaster),24)
+
+})
diff --git a/vignettes/examples/fitcoach-usage.Rmd b/vignettes/examples/fitcoach-usage.Rmd
new file mode 100644
index 0000000..88ebb05
--- /dev/null
+++ b/vignettes/examples/fitcoach-usage.Rmd
@@ -0,0 +1,220 @@
+---
+title: "Fitcoach package workflow example"
+author: "Niraj Juneja, Charles de Lassence"
+output: rmarkdown::pdf_document
+vignette: >
+ %\VignetteIndexEntry{Vignette Title}
+ %\VignetteEngine{knitr::rmarkdown}
+ \usepackage[utf8]{inputenc}
+---
+
+```{r setup, include = FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+library(fitcoach)
+library(ggplot2)
+```
+
+## Example 1: Data Loader - Getting data from Fitbit API
+
+This part explains how to connect to the Fitbit API and get your data, using `DataLoader`.
+
+
+**Step 1:** You first need to make sure that you have [registered an app](https://dev.fitbit.com/) and set it as *Personal* in order to retrieve intraday data. You will need the following credentials in order to connect the API: App name (or *OAuth 2.0 Client ID*), Client Key and Client Secret.
+
+
+**Step 2:** We initialize a new `DataLoader` object, and connect to the API with OAuth2, using the credentials described above. Note that instead of providing the credentials directly as parameters, you could point to a cache file (usually named `.httr-oauth`) using the `cache.file` parameter.
+
+```{r eval = FALSE}
+mydata <- DataLoader$new()
+mydata$connect(appname = "cdlr",
+ key = "227FWR",
+ secret = "3089e3d1ac5dde1aa00b54a0c8661f42"
+)
+```
+
+
+**Step 3:** We request the data and write it to JSON files using the `request` method. You need to specify the type of timeseries ('day' or 'intraday'), the list of activities ([full list here](https://dev.fitbit.com/docs/activity/)), the start and end dates, and the folder in which the JSON files will be written.
+
+```{r eval = FALSE}
+masterPath <- system.file("extdata",
+ "daily-time-series",
+ package = "fitcoach")
+
+mydata$request(
+ type = 'day',
+ activities = list("calories", "steps", "distance", "minutesVeryActive"),
+ start.date = "2016-01-01",
+ end.date = "2016-02-01",
+ path = masterPath
+)
+```
+
+Once the JSON files have been created, they can be used for further analysis.
+
+
+## Example 2: Fit Analyzer - Daily File Analysis
+
+Examples below demonstrate usage scenarios for `FitAnalyzer`.
+
+
+**Step 1:** We first need to point to a folder that contains the JSON files for "daily" file analysis. These files are created by `DataLoader.R`.
+
+We then create a new instance of `FitAnalyzer`, passing in the folder and the goal that we want to optimize on. Goals can be the following: a) calories b) steps c) distance d) floors.
+
+The example below uses `steps` as the goal.
+
+```{r}
+masterPath <- system.file("extdata",
+ "daily-time-series",
+ package = "fitcoach")
+
+ana <- FitAnalyzer$new("steps")
+```
+
+
+**Step 2:** Next we get the data.frame ready for analysis. Note this data.frame is cleaned and augmented with additional data elements not present in the JSON file. E.g.: we augment `weekday`, `weekend` and mark rows that are valid.
+
+```{r}
+timeseries.frame <-
+ ana$getAnalysisFrame(folder = masterPath,
+ analysis.type = "daily")
+head(timeseries.frame)
+```
+
+
+**Step 3:** next we find the most important variables that are enabling meeting the goals for the person. Note this call creates a `glm` model behind the scenes and ranks the variables based on the coefficients of the glm model. You can also get the `glm` fit object to do further analysis.
+
+```{r}
+vars <- ana$findImportantVariables(tsDataFrame = timeseries.frame,
+ seed = 12345)
+vars
+```
+
+
+Getting the `fit` object.
+
+```{r}
+fit <- ana$getFit()
+summary(fit)
+```
+
+
+```{r}
+par(mfrow=c(2,2))
+plot(fit)
+```
+
+
+**Step 4:** Next, we can then plot the performance of the individual, relative to the most important variables that are making a difference.
+
+```{r fig.width= 7}
+ana$showMostImportantCharts(tsDataFrame = timeseries.frame)
+```
+
+
+**Step 5:** We can also get the prediction on goal performance using the call below.
+
+```{r}
+rows.test <- timeseries.frame[sample(1:191, 1), ]
+x <- createDependentVariableFrame(master = rows.test, goal = "steps")
+res <- ana$predictGoal(x)
+cat(paste("Prediction for the day", ": expected steps = ", round(res)))
+```
+
+
+***
+
+## Example 3: FitAnalyzer - Intraday File Analysis
+
+Examples below demonstrate usage scenarios for `FitAnalyzer` for **Intraday analysis**.
+
+
+**Step 1**: We first need to point to a folder that contains the JSON files for *intraday* file analysis. These files are created by `DataLoader.R`.
+
+We then create a new instance of `FitAnalyzer` passing in the folder and the goal that we want to optimize on. Goals can be the following: a) calories b) steps c) distance d) floors .
+
+The example below uses *calories* as the goal
+
+```{r }
+masterPath <-
+ system.file("extdata", "intra-daily-timeseries", package = "fitcoach")
+ana <- FitAnalyzer$new("calories")
+```
+
+
+**Step 2:** Next we get the data.frame ready for analysis. Note that this data.frame is cleaned and augmented with additional data elements not present in the JSON file. E.g.: we augment cumulative sum during the day, weekday, weekend, etc.
+
+```{r}
+intra <- ana$getAnalysisFrame(folder = masterPath, analysis.type = "intra.day")
+head(intra)
+```
+
+
+**Step 3:** Next we find the most important variables that are enabling meeting the goals for the person. Note: this call creates a **gbm** model behind the scenes and ranks the variables based on *relative.influence* call to `gbm` model. You can also get the `gbm` fit object to do further analysis.
+
+```{r}
+vars <- ana$findImportantVariables(intra)
+vars <- sort(vars, decreasing = TRUE)
+vars
+```
+
+
+Plot of important variables below.
+
+```{r}
+vars.frame <- data.frame(variables = names(vars), values = vars)
+vars.frame$lnvalue <- log(vars.frame$values)
+vars.frame <- vars.frame[1:7, ]
+barplot(vars.frame$value, xlab = "variables", ylab = "relative importance",
+ names.arg = vars.frame$variables,
+ cex.names = 0.65, cex.lab = 0.65, ylim = c(0.0, 0.1))
+```
+
+
+Summary of GBM model fit below.
+
+```{r}
+fit <- ana$getFit()
+summary(fit)
+```
+
+
+**Step 4:** Next we can then plot the performance of the individual relative to the most important variables that are making a difference.
+For the 4 most important variables, the average value for every 15 min of a day is plotted, along with the moving average (using `geom_smooth` from `ggplot2`).
+
+```{r fig.width= 7}
+ana$showMostImportantCharts(tsDataFrame = intra)
+```
+
+
+**Step 5:** We can also get the prediction on goal performance using the call below.
+
+```{r}
+rows.test <- intra[sample(1:191, 1), ] # Take any random input for test
+res <- ana$predictGoal(rows.test)
+cat(paste("Prediction for the day", ": expected calories =", round(res)))
+```
+
+
+## Example 4: FitUtil - Illustration for usage of FitUtil functions
+
+Approach to get a clean data.frame from JSON files.
+
+```{r}
+# masterPath is the folder containing JSON files
+masterPath <- system.file("extdata", "daily-time-series", package = "fitcoach")
+
+# Create the data.frame. This is not cleaned
+master <- createTsMasterFrame(masterPath)
+
+# Identify and Mark rows that are valid. i.e distance for the day >0
+master <- markValidRows(master)
+
+# Filter Valid rows only
+master <- master[master$valid == TRUE, ]
+
+# Augment data with additional information. Eg: weekday information
+master <- augmentData(master)
+head(master)
+```
+
diff --git a/vignettes/examples/fitcoach-usage.html b/vignettes/examples/fitcoach-usage.html
new file mode 100644
index 0000000..c04a934
--- /dev/null
+++ b/vignettes/examples/fitcoach-usage.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+
+<meta charset="utf-8">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="pandoc" />
+<meta name="viewport" content="width=device-width, initial-scale=1">
+
+<meta name="author" content="Niraj Juneja, Charles de Lassence" />
+
+
+<title>Fitcoach package workflow example</title>
+
+<script src="data:application/x-javascript,%2F%2A%21%20jQuery%20v1%2E11%2E3%20%7C%20%28c%29%202005%2C%202015%20jQuery%20Foundation%2C%20Inc%2E%20%7C%20jquery%2Eorg%2Flicense%20%2A%2F%0A%21function%28a%2Cb%29%7B%22object%22%3D%3Dtypeof%20module%26%26%22object%22%3D%3Dtypeof%20module%2Eexports%3Fmodule%2Eexports%3Da%2Edocument%3Fb%28a%2C%210%29%3Afunction%28a%29%7Bif%28%21a%2Edocument%29throw%20new%20Error%28%22jQuery%20requires%20a%20window%20with%20a%20document%22%29%3Breturn%20b%28a%29% [...]
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<link href="data:text/css,%2F%2A%21%0A%20%2A%20Bootstrap%20v3%2E3%2E5%20%28http%3A%2F%2Fgetbootstrap%2Ecom%29%0A%20%2A%20Copyright%202011%2D2015%20Twitter%2C%20Inc%2E%0A%20%2A%20Licensed%20under%20MIT%20%28https%3A%2F%2Fgithub%2Ecom%2Ftwbs%2Fbootstrap%2Fblob%2Fmaster%2FLICENSE%29%0A%20%2A%2F%2F%2A%21%20normalize%2Ecss%20v3%2E0%2E3%20%7C%20MIT%20License%20%7C%20github%2Ecom%2Fnecolas%2Fnormalize%2Ecss%20%2A%2Fhtml%7Bfont%2Dfamily%3Asans%2Dserif%3B%2Dwebkit%2Dtext%2Dsize%2Dadjust%3A100%25% [...]
+<script src="data:application/x-javascript,%2F%2A%21%0A%20%2A%20Bootstrap%20v3%2E3%2E5%20%28http%3A%2F%2Fgetbootstrap%2Ecom%29%0A%20%2A%20Copyright%202011%2D2015%20Twitter%2C%20Inc%2E%0A%20%2A%20Licensed%20under%20the%20MIT%20license%0A%20%2A%2F%0Aif%28%22undefined%22%3D%3Dtypeof%20jQuery%29throw%20new%20Error%28%22Bootstrap%27s%20JavaScript%20requires%20jQuery%22%29%3B%2Bfunction%28a%29%7B%22use%20strict%22%3Bvar%20b%3Da%2Efn%2Ejquery%2Esplit%28%22%20%22%29%5B0%5D%2Esplit%28%22%2E%22%29 [...]
+<script src="data:application/x-javascript,%2F%2A%2A%0A%2A%20%40preserve%20HTML5%20Shiv%203%2E7%2E2%20%7C%20%40afarkas%20%40jdalton%20%40jon%5Fneal%20%40rem%20%7C%20MIT%2FGPL2%20Licensed%0A%2A%2F%0A%2F%2F%20Only%20run%20this%20code%20in%20IE%208%0Aif%20%28%21%21window%2Enavigator%2EuserAgent%2Ematch%28%22MSIE%208%22%29%29%20%7B%0A%21function%28a%2Cb%29%7Bfunction%20c%28a%2Cb%29%7Bvar%20c%3Da%2EcreateElement%28%22p%22%29%2Cd%3Da%2EgetElementsByTagName%28%22head%22%29%5B0%5D%7C%7Ca%2Edocum [...]
+<script src="data:application/x-javascript,%2F%2A%21%20Respond%2Ejs%20v1%2E4%2E2%3A%20min%2Fmax%2Dwidth%20media%20query%20polyfill%20%2A%20Copyright%202013%20Scott%20Jehl%0A%20%2A%20Licensed%20under%20https%3A%2F%2Fgithub%2Ecom%2Fscottjehl%2FRespond%2Fblob%2Fmaster%2FLICENSE%2DMIT%0A%20%2A%20%20%2A%2F%0A%0A%2F%2F%20Only%20run%20this%20code%20in%20IE%208%0Aif%20%28%21%21window%2Enavigator%2EuserAgent%2Ematch%28%22MSIE%208%22%29%29%20%7B%0A%21function%28a%29%7B%22use%20strict%22%3Ba%2Ematc [...]
+
+<style type="text/css">code{white-space: pre;}</style>
+<link href="data:text/css,pre%20%2Eoperator%2C%0Apre%20%2Eparen%20%7B%0A%20color%3A%20rgb%28104%2C%20118%2C%20135%29%0A%7D%0A%0Apre%20%2Eliteral%20%7B%0A%20color%3A%20%23990073%0A%7D%0A%0Apre%20%2Enumber%20%7B%0A%20color%3A%20%23099%3B%0A%7D%0A%0Apre%20%2Ecomment%20%7B%0A%20color%3A%20%23998%3B%0A%20font%2Dstyle%3A%20italic%0A%7D%0A%0Apre%20%2Ekeyword%20%7B%0A%20color%3A%20%23900%3B%0A%20font%2Dweight%3A%20bold%0A%7D%0A%0Apre%20%2Eidentifier%20%7B%0A%20color%3A%20rgb%280%2C%200%2C%200%29 [...]
+<script src="data:application/x-javascript,%0Avar%20hljs%3Dnew%20function%28%29%7Bfunction%20m%28p%29%7Breturn%20p%2Ereplace%28%2F%26%2Fgm%2C%22%26amp%3B%22%29%2Ereplace%28%2F%3C%2Fgm%2C%22%26lt%3B%22%29%7Dfunction%20f%28r%2Cq%2Cp%29%7Breturn%20RegExp%28q%2C%22m%22%2B%28r%2EcI%3F%22i%22%3A%22%22%29%2B%28p%3F%22g%22%3A%22%22%29%29%7Dfunction%20b%28r%29%7Bfor%28var%20p%3D0%3Bp%3Cr%2EchildNodes%2Elength%3Bp%2B%2B%29%7Bvar%20q%3Dr%2EchildNodes%5Bp%5D%3Bif%28q%2EnodeName%3D%3D%22CODE%22%29%7B [...]
+<style type="text/css">
+ pre:not([class]) {
+ background-color: white;
+ }
+</style>
+<script type="text/javascript">
+if (window.hljs && document.readyState && document.readyState === "complete") {
+ window.setTimeout(function() {
+ hljs.initHighlighting();
+ }, 0);
+}
+</script>
+
+
+
+
+</head>
+
+<body>
+
+<style type="text/css">
+.main-container {
+ max-width: 940px;
+ margin-left: auto;
+ margin-right: auto;
+}
+code {
+ color: inherit;
+ background-color: rgba(0, 0, 0, 0.04);
+}
+img {
+ max-width:100%;
+ height: auto;
+}
+h1 {
+ font-size: 34px;
+}
+h1.title {
+ font-size: 38px;
+}
+h2 {
+ font-size: 30px;
+}
+h3 {
+ font-size: 24px;
+}
+h4 {
+ font-size: 18px;
+}
+h5 {
+ font-size: 16px;
+}
+h6 {
+ font-size: 12px;
+}
+.tabbed-pane {
+ padding-top: 12px;
+}
+button.code-folding-btn:focus {
+ outline: none;
+}
+</style>
+
+
+<div class="container-fluid main-container">
+
+<!-- tabsets -->
+<script src="data:application/x-javascript,%0A%0Awindow%2EbuildTabsets%20%3D%20function%28tocID%29%20%7B%0A%0A%20%20%2F%2F%20build%20a%20tabset%20from%20a%20section%20div%20with%20the%20%2Etabset%20class%0A%20%20function%20buildTabset%28tabset%29%20%7B%0A%0A%20%20%20%20%2F%2F%20check%20for%20fade%20and%20pills%20options%0A%20%20%20%20var%20fade%20%3D%20tabset%2EhasClass%28%22tabset%2Dfade%22%29%3B%0A%20%20%20%20var%20pills%20%3D%20tabset%2EhasClass%28%22tabset%2Dpills%22%29%3B%0A%20%20%2 [...]
+<script>
+$(document).ready(function () {
+ window.buildTabsets("TOC");
+});
+</script>
+
+<!-- code folding -->
+
+
+
+
+
+
+<div class="fluid-row" id="header">
+
+
+<h1 class="title">Fitcoach package workflow example</h1>
+<h4 class="author"><em>Niraj Juneja, Charles de Lassence</em></h4>
+
+</div>
+
+
+<div id="example-1-data-loader---getting-data-from-fitbit-api" class="section level2">
+<h2>Example 1: Data Loader - Getting data from Fitbit API</h2>
+<p>This part explains how to connect to the Fitbit API and get your data, using <code>DataLoader</code>.</p>
+<p><strong>Step 1:</strong> You first need to make sure that you have <a href="https://dev.fitbit.com/">registered an app</a> and set it as <em>Personal</em> in order to retrieve intraday data. You will need the following credentials in order to connect the API: App name (or <em>OAuth 2.0 Client ID</em>), Client Key and Client Secret.</p>
+<p><strong>Step 2:</strong> We initialize a new <code>DataLoader</code> object, and connect to the API with OAuth2, using the credentials described above. Note that instead of providing the credentials directly as parameters, you could point to a cache file (usually named <code>.httr-oauth</code>) using the <code>cache.file</code> parameter.</p>
+<pre class="r"><code>mydata <- DataLoader$new()
+mydata$connect(appname = "cdlr",
+ key = "227FWR",
+ secret = "3089e3d1ac5dde1aa00b54a0c8661f42"
+)</code></pre>
+<p><strong>Step 3:</strong> We request the data and write it to JSON files using the <code>request</code> method. You need to specify the type of timeseries (‘day’ or ‘intraday’), the list of activities (<a href="https://dev.fitbit.com/docs/activity/">full list here</a>), the start and end dates, and the folder in which the JSON files will be written.</p>
+<pre class="r"><code>masterPath <- system.file("extdata",
+ "daily-time-series",
+ package = "fitcoach")
+
+mydata$request(
+ type = 'day',
+ activities = list("calories", "steps", "distance", "minutesVeryActive"),
+ start.date = "2016-01-01",
+ end.date = "2016-02-01",
+ path = masterPath
+)</code></pre>
+<p>Once the JSON files have been created, they can be used for further analysis.</p>
+</div>
+<div id="example-2-fit-analyzer---daily-file-analysis" class="section level2">
+<h2>Example 2: Fit Analyzer - Daily File Analysis</h2>
+<p>Examples below demonstrate usage scenarios for <code>FitAnalyzer</code>.</p>
+<p><strong>Step 1:</strong> We first need to point to a folder that contains the JSON files for “daily” file analysis. These files are created by <code>DataLoader.R</code>.</p>
+<p>We then create a new instance of <code>FitAnalyzer</code>, passing in the folder and the goal that we want to optimize on. Goals can be the following: a) calories b) steps c) distance d) floors.</p>
+<p>The example below uses <code>steps</code> as the goal.</p>
+<pre class="r"><code>masterPath <- system.file("extdata",
+ "daily-time-series",
+ package = "fitcoach")
+
+ana <- FitAnalyzer$new("steps")</code></pre>
+<p><strong>Step 2:</strong> Next we get the data.frame ready for analysis. Note this data.frame is cleaned and augmented with additional data elements not present in the JSON file. E.g.: we augment <code>weekday</code>, <code>weekend</code> and mark rows that are valid.</p>
+<pre class="r"><code>timeseries.frame <-
+ ana$getAnalysisFrame(folder = masterPath,
+ analysis.type = "daily")
+head(timeseries.frame)</code></pre>
+<pre><code>## date calories caloriesBMR steps distance floors elevation
+## 898 2015-07-31 1867 1759 195 0.14062 0 0
+## 899 2015-08-01 3245 1758 12866 10.44119 13 39
+## 900 2015-08-02 2867 1758 5023 3.65184 11 33
+## 901 2015-08-03 2982 1758 10112 7.35157 6 18
+## 902 2015-08-04 2734 1758 5725 4.16213 7 21
+## 903 2015-08-05 3012 1758 9155 6.72913 5 15
+## minutesSedentary minutesLightlyActive minutesFairlyActive
+## 898 205 10 0
+## 899 672 269 5
+## 900 691 168 25
+## 901 1161 143 5
+## 902 836 150 18
+## 903 640 267 16
+## minutesVeryActive activityCalories valid weekday weekend
+## 898 0 51 TRUE Friday FALSE
+## 899 37 1600 TRUE Saturday TRUE
+## 900 35 1196 TRUE Sunday TRUE
+## 901 66 1253 TRUE Monday FALSE
+## 902 23 961 TRUE Tuesday FALSE
+## 903 16 1372 TRUE Wednesday FALSE</code></pre>
+<p><strong>Step 3:</strong> next we find the most important variables that are enabling meeting the goals for the person. Note this call creates a <code>glm</code> model behind the scenes and ranks the variables based on the coefficients of the glm model. You can also get the <code>glm</code> fit object to do further analysis.</p>
+<pre class="r"><code>vars <- ana$findImportantVariables(tsDataFrame = timeseries.frame,
+ seed = 12345)
+vars</code></pre>
+<pre><code>## Overall name
+## 1 83.7286565 distance
+## 2 3.4383872 minutesLightlyActive
+## 3 1.8757480 floors
+## 4 1.8523923 elevation
+## 5 1.2891208 minutesFairlyActive
+## 6 1.1386025 minutesSedentary
+## 7 1.1244243 minutesVeryActive
+## 8 0.2122723 holiday</code></pre>
+<p>Getting the <code>fit</code> object.</p>
+<pre class="r"><code>fit <- ana$getFit()
+summary(fit)</code></pre>
+<pre><code>##
+## Call:
+## glm(formula = y ~ ., family = "gaussian", data = x)
+##
+## Deviance Residuals:
+## Min 1Q Median 3Q Max
+## -1192.03 -17.96 12.12 54.98 264.72
+##
+## Coefficients:
+## Estimate Std. Error t value Pr(>|t|)
+## (Intercept) -83.72528 62.25542 -1.345 0.180342
+## distance 1323.59328 15.80813 83.729 < 2e-16 ***
+## floors -472.34421 251.81645 -1.876 0.062291 .
+## elevation 153.87808 83.06992 1.852 0.065589 .
+## minutesSedentary 0.05395 0.04738 1.139 0.256365
+## minutesLightlyActive 1.30032 0.37818 3.438 0.000725 ***
+## minutesFairlyActive 1.70467 1.32235 1.289 0.198992
+## minutesVeryActive 1.66153 1.47767 1.124 0.262314
+## holiday 5.05059 23.79298 0.212 0.832132
+## ---
+## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+##
+## (Dispersion parameter for gaussian family taken to be 18358.87)
+##
+## Null deviance: 1752078977 on 190 degrees of freedom
+## Residual deviance: 3341314 on 182 degrees of freedom
+## AIC: 2428
+##
+## Number of Fisher Scoring iterations: 2</code></pre>
+<pre class="r"><code>par(mfrow=c(2,2))
+plot(fit)</code></pre>
+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAABGlBMVEUAAAAAABcAACEAACgAADoAAFgAAGYAMZAAOioAOjoAOmYAOpAAZmYAZrYgAAA6AAA6KAA6Ojo6ZmY6kJA6kLY6kNs6nf9YZjpmAABmAGZmFwBmOgBmZgBmZmZmkJBmnZBmtrZmtv9m2/982/9/f3+B//+QAACQOgCQWACQZgCQkDqQkGaQkNuQtpCQ29uQ2/+c//+2AAC2ZgC2Zma2tma2tra225C2/7a2/9u2//++vr7bAADbZhfbkCrbkDrbtmbb/7bb/9vb////AAD/ADr/AGb/DQD/OgD/Ojr/OpD/Sbb/ZgD/Zrb/Ztv/kDr/kNv/nJD/nZD/tmb/trb/ttv/tv//25D/29v/2////5z//7b//7z//9v///+Ye1x4AAAACXBIWXMAAB2HAAAdh [...]
+<p><strong>Step 4:</strong> Next, we can then plot the performance of the individual, relative to the most important variables that are making a difference.</p>
+<pre class="r"><code>ana$showMostImportantCharts(tsDataFrame = timeseries.frame)</code></pre>
+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAABblBMVEUAAAAAADoAAGYAOmYAOpAAZpAAZrYAv8QZGT8ZGWIZP4EZYp8ZcboaGhozMzM6AAA6ADo6OgA6Ojo6ZmY6kJA6kNs/GRk/gb1Il91NTU1NTW5NTY5Nbm5NbqtNjshiGRliP4Fin9lmAABmOgBmZgBmZjpmZmZmkJBmtrZmtttmtv9uTU1ubk1ubm5uq+RxGRl8rgCBPxmBvdmOTU2Ojk2Ojm6Ojo6Oq6uOyMiOyP+QOgCQkGaQtpCQ29uQ2/+fYhmfn9mf2dmk3t+rbk2rjk2rq46r5Mir5P+y7O22ZgC2kDq2/7a2/9u2//+6cRm9gT+92dnHfP/Ijk3Iq27I5KvI/8jI///J2aTX57LZn2LZvYHZ2Z/Z2b3Z2dnbkDrbtmbb25Db/7bb/9vb///gy [...]
+<p><strong>Step 5:</strong> We can also get the prediction on goal performance using the call below.</p>
+<pre class="r"><code>rows.test <- timeseries.frame[sample(1:191, 1), ]
+x <- createDependentVariableFrame(master = rows.test, goal = "steps")
+res <- ana$predictGoal(x)
+cat(paste("Prediction for the day", ": expected steps = ", round(res)))</code></pre>
+<pre><code>## Prediction for the day : expected steps = 7481</code></pre>
+<hr />
+</div>
+<div id="example-3-fitanalyzer---intraday-file-analysis" class="section level2">
+<h2>Example 3: FitAnalyzer - Intraday File Analysis</h2>
+<p>Examples below demonstrate usage scenarios for <code>FitAnalyzer</code> for <strong>Intraday analysis</strong>.</p>
+<p><strong>Step 1</strong>: We first need to point to a folder that contains the JSON files for <em>intraday</em> file analysis. These files are created by <code>DataLoader.R</code>.</p>
+<p>We then create a new instance of <code>FitAnalyzer</code> passing in the folder and the goal that we want to optimize on. Goals can be the following: a) calories b) steps c) distance d) floors .</p>
+<p>The example below uses <em>calories</em> as the goal</p>
+<pre class="r"><code>masterPath <-
+ system.file("extdata", "intra-daily-timeseries", package = "fitcoach")
+ana <- FitAnalyzer$new("calories")</code></pre>
+<p><strong>Step 2:</strong> Next we get the data.frame ready for analysis. Note that this data.frame is cleaned and augmented with additional data elements not present in the JSON file. E.g.: we augment cumulative sum during the day, weekday, weekend, etc.</p>
+<pre class="r"><code>intra <- ana$getAnalysisFrame(folder = masterPath, analysis.type = "intra.day")
+head(intra)</code></pre>
+<pre><code>## date calories intra.level intra.mets intra.calorie timeseq steps
+## 1 2015-12-10 2491 0 150 18.5565 1 5319
+## 2 2015-12-10 2491 0 150 18.5565 2 5319
+## 3 2015-12-10 2491 0 150 18.5565 3 5319
+## 4 2015-12-10 2491 0 150 18.5565 4 5319
+## 5 2015-12-10 2491 0 150 18.5565 5 5319
+## 6 2015-12-10 2491 0 150 18.5565 6 5319
+## intra.steps floors intra.floors elevation intra.elevation distance
+## 1 0 6 0 18 0 3.89512
+## 2 0 6 0 18 0 3.89512
+## 3 0 6 0 18 0 3.89512
+## 4 0 6 0 18 0 3.89512
+## 5 0 6 0 18 0 3.89512
+## 6 0 6 0 18 0 3.89512
+## intra.distance weekday weekend slot cumsum.calorie cumsum.steps
+## 1 0 5 0 night 18.5565 0
+## 2 0 5 0 night 37.1130 0
+## 3 0 5 0 night 55.6695 0
+## 4 0 5 0 night 74.2260 0
+## 5 0 5 0 night 92.7825 0
+## 6 0 5 0 night 111.3390 0
+## cumsum.level cumsum.mets cumsum.distance cumsum.floors cumsum.elevation
+## 1 0 150 0 0 0
+## 2 0 300 0 0 0
+## 3 0 450 0 0 0
+## 4 0 600 0 0 0
+## 5 0 750 0 0 0
+## 6 0 900 0 0 0</code></pre>
+<p><strong>Step 3:</strong> Next we find the most important variables that are enabling meeting the goals for the person. Note: this call creates a <strong>gbm</strong> model behind the scenes and ranks the variables based on <em>relative.influence</em> call to <code>gbm</code> model. You can also get the <code>gbm</code> fit object to do further analysis.</p>
+<pre class="r"><code>vars <- ana$findImportantVariables(intra)
+vars <- sort(vars, decreasing = TRUE)
+vars</code></pre>
+<pre><code>## steps weekend distance floors
+## 1.000000e+00 4.850034e-02 4.112410e-02 2.081519e-02
+## weekday cumsum.level cumsum.floors timeseq
+## 9.944454e-03 2.865114e-05 8.797090e-08 8.763791e-08
+## cumsum.steps cumsum.distance cumsum.calorie cumsum.elevation
+## 4.113028e-08 1.453128e-08 1.427501e-08 7.307049e-09
+## intra.calorie intra.steps intra.floors intra.mets
+## 6.349336e-09 9.373329e-10 3.419370e-10 2.913440e-10
+## intra.distance slot intra.level elevation
+## 8.783386e-11 6.107080e-11 0.000000e+00 0.000000e+00
+## intra.elevation cumsum.mets
+## 0.000000e+00 0.000000e+00</code></pre>
+<p>Plot of important variables below.</p>
+<pre class="r"><code>vars.frame <- data.frame(variables = names(vars), values = vars)
+vars.frame$lnvalue <- log(vars.frame$values)
+vars.frame <- vars.frame[1:7, ]
+barplot(vars.frame$value, xlab = "variables", ylab = "relative importance",
+ names.arg = vars.frame$variables,
+ cex.names = 0.65, cex.lab = 0.65, ylim = c(0.0, 0.1))</code></pre>
+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAAAgVBMVEUAAAAAADoAAGYAOmYAOpAAZpAAZrY6AAA6OgA6ZmY6kNtmAABmADpmOgBmZgBmZmZmkJBmtrZmtttmtv+QOgCQkDqQkGaQkLaQtpCQ27aQ29uQ2/+2ZgC2Zma225C2/7a2/9u2//++vr7bkDrbtmbb////tmb/25D//7b//9v///8iS1UuAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nO3dDXviWLYeUFyp2BOczE1i3+RmiptJhxR2+f//wCAJjDAfRscctLW91vPMtNvtwm+js9+WkBCztwxms/87ntls7H99YBw5hl+BAiPIMfwKFBhBjuFXoMAIcgy/AgVGkGP4FSgwghzDr0CBEeQYfgUKjCDH8CtQYAQ5hl+BAiPIMfwKFBhBjuFXo [...]
+<p>Summary of GBM model fit below.</p>
+<pre class="r"><code>fit <- ana$getFit()
+summary(fit)</code></pre>
+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAAAZlBMVEUAAAAAADoAAGYAAP8ADP8AGP8AJP8AMf8AOpAAZrY6AAA6kLY6kNtmAABmAGZmZjpmtrZmtv+QOgCQkDqQkNuQtpCQ2/+2ZgC225C2///bkDrb/9vb////tmb/25D//7b//9v///95O1D5AAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nO3dbWPbRpuYUSTdtrFW7lZuN9yHDSXr///J4o0kSMmJeQMD3wOc80V24sAcJb4CYAaD5h2AkOZXfwCAWgkoQJCAAgQJKECQgAIECShAkIACBAkoQJCAAgQJKECQgAIECShAkIACBAkoQJCAAgQJKECQgAIECShAkIACBAkoQJCAAgQJKECQgAIECShAkIACBAkoQJCAAgQJKECQgAIECShAkIACB [...]
+<pre><code>## var rel.inf
+## steps steps 8.925280e+01
+## weekend weekend 4.328791e+00
+## distance distance 3.670441e+00
+## floors floors 1.857814e+00
+## weekday weekday 8.875704e-01
+## cumsum.level cumsum.level 2.557195e-03
+## cumsum.floors cumsum.floors 7.851649e-06
+## timeseq timeseq 7.821929e-06
+## cumsum.steps cumsum.steps 3.670992e-06
+## cumsum.distance cumsum.distance 1.296958e-06
+## cumsum.calorie cumsum.calorie 1.274084e-06
+## cumsum.elevation cumsum.elevation 6.521746e-07
+## intra.calorie intra.calorie 5.666960e-07
+## intra.steps intra.steps 8.365959e-08
+## intra.floors intra.floors 3.051884e-08
+## intra.mets intra.mets 2.600326e-08
+## intra.distance intra.distance 7.839418e-09
+## slot slot 5.450740e-09
+## intra.level intra.level 0.000000e+00
+## elevation elevation 0.000000e+00
+## intra.elevation intra.elevation 0.000000e+00
+## cumsum.mets cumsum.mets 0.000000e+00</code></pre>
+<p><strong>Step 4:</strong> Next we can then plot the performance of the individual relative to the most important variables that are making a difference. For the 4 most important variables, the average value for every 15 min of a day is plotted, along with the moving average (using <code>geom_smooth</code> from <code>ggplot2</code>).</p>
+<pre class="r"><code>ana$showMostImportantCharts(tsDataFrame = intra)</code></pre>
+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAAB/lBMVEUAAAAAADoAAGYAOjoAOmYAOpAAZpAAZrYAvckAv70Av8QFsbURvLAZGT8ZGWIZP4EZYp8ZuLsaGhozMzM6AAA6ADo6OgA6Ojo6ZmY6kJA6kNs/GRk/gb1NTU1NTW5NTY5NbqtNjshiGRliP4Fin9lmAABmOgBmZgBmZjpmZmZmkJBmtrZmtttmtv9uTU1uq+RvrhlvsA11oQV8rgB/1d5/1tGArQCBPxmBvdmHpxmJqAuJ4OmJ4dyN2duOTU2Oq6uOyP+P1MWQOgCQZgCQkDqQkGaQkLaQtpCQ27aQ29uQ2/+Yz9CZ5eea3s+fYhmf2dmj2turbk2r5P+sz5is0Yuzgf6zg/K2ZgC2kDq22qK225C23Ja2/7a2/9u2//+4deq8zn+9gT+92dm/043Dg [...]
+<p><strong>Step 5:</strong> We can also get the prediction on goal performance using the call below.</p>
+<pre class="r"><code>rows.test <- intra[sample(1:191, 1), ] # Take any random input for test
+res <- ana$predictGoal(rows.test)
+cat(paste("Prediction for the day", ": expected calories =", round(res)))</code></pre>
+<pre><code>## Prediction for the day : expected calories = 2517</code></pre>
+</div>
+<div id="example-4-fitutil---illustration-for-usage-of-fitutil-functions" class="section level2">
+<h2>Example 4: FitUtil - Illustration for usage of FitUtil functions</h2>
+<p>Approach to get a clean data.frame from JSON files.</p>
+<pre class="r"><code># masterPath is the folder containing JSON files
+masterPath <- system.file("extdata", "daily-time-series", package = "fitcoach")
+
+# Create the data.frame. This is not cleaned
+master <- createTsMasterFrame(masterPath)
+
+# Identify and Mark rows that are valid. i.e distance for the day >0
+master <- markValidRows(master)
+
+# Filter Valid rows only
+master <- master[master$valid == TRUE, ]
+
+# Augment data with additional information. Eg: weekday information
+master <- augmentData(master)
+head(master)</code></pre>
+<pre><code>## date calories caloriesBMR steps distance floors elevation
+## 898 2015-07-31 1867 1759 195 0.14062 0 0
+## 899 2015-08-01 3245 1758 12866 10.44119 13 39
+## 900 2015-08-02 2867 1758 5023 3.65184 11 33
+## 901 2015-08-03 2982 1758 10112 7.35157 6 18
+## 902 2015-08-04 2734 1758 5725 4.16213 7 21
+## 903 2015-08-05 3012 1758 9155 6.72913 5 15
+## minutesSedentary minutesLightlyActive minutesFairlyActive
+## 898 205 10 0
+## 899 672 269 5
+## 900 691 168 25
+## 901 1161 143 5
+## 902 836 150 18
+## 903 640 267 16
+## minutesVeryActive activityCalories valid weekday weekend
+## 898 0 51 TRUE Friday FALSE
+## 899 37 1600 TRUE Saturday TRUE
+## 900 35 1196 TRUE Sunday TRUE
+## 901 66 1253 TRUE Monday FALSE
+## 902 23 961 TRUE Tuesday FALSE
+## 903 16 1372 TRUE Wednesday FALSE</code></pre>
+</div>
+
+
+
+
+</div>
+
+<script>
+
+// add bootstrap table styles to pandoc tables
+$(document).ready(function () {
+ $('tr.header').parent('thead').parent('table').addClass('table table-condensed');
+});
+
+</script>
+
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+ (function () {
+ var script = document.createElement("script");
+ script.type = "text/javascript";
+ script.src = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ })();
+</script>
+
+</body>
+</html>
diff --git a/vignettes/summary.Rmd b/vignettes/summary.Rmd
new file mode 100644
index 0000000..8cc17d3
--- /dev/null
+++ b/vignettes/summary.Rmd
@@ -0,0 +1,37 @@
+---
+title: "Project Summary"
+author: "Niraj Juneja, Charles de Lassence"
+output: rmarkdown::html_document
+vignette: >
+ %\VignetteIndexEntry{Vignette Title}
+ %\VignetteEngine{knitr::rmarkdown}
+ \usepackage[utf8]{inputenc}
+---
+
+```{r setup, include=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## Fitcoach project summary
+
+We are glad to submit the fitcoach package. As part of the project we have been able to accomplish the following:
+
+1. Connect R to Fitbit API and expose an individual’s Fitbit data as a Dataframe for further analysis.
+ + DataLoader.R does this. __[Example 1 shows how to do this](examples\fitcoach-usage.html)__
+ + DataLoader enables getting both the *Daily time-series* data and *Intra-day time-series* data at 15 min breaks for the individual.
+ + Note : intra-day data will require the user to create a new app on Fitbit website and is only available for app owner. i.e User A cannot access Intra-day data from User B. This is a Fitbit restriction
+
+2. Created [FitAnalyzer R6](..\R\FitAnalyzer.R) class that provides an __opinionated__ but focussed implementation for analyzing Fitbit Data. It is likely that this workflow might not work for all. In this situation, the user can directly use Fitbit functions provided in [FitUtil.R](..\R\FitUtil.R) and create a customized analysis flow.
+
+3. In line with the project proposal, we were able to build the following.
+ + Ability to set goals and find the most significant variables that are enabling meeting the goals. The [Example 2 and Example 3 here](examples\fitcoach-usage.html) demonstrates this flow.
+ + Ability to call a function and provide recommendations for the rest of the day. The [Example 2 and 3](examples\fitcoach-usage.html) demonstrate this flow. This is implemented for both daily and intra-day scenarios.
+ + Provide advanced charts in ggplot2. The [Example 2 and Example 3 here](examples\fitcoach-usage.html) demonstrate the graphs.
+
+4. Package Design Philosophy
+ + DataLoader.R is an R6 class because it encapsulates a unique OAuth2.0 based flow for accessing Fitbit API. The goal of this class is to orchestrate the Fitbit connection flow and download __daily__ or __intraday__ json files into a folder so that the json files can be analyzed further.
+ + FitAnalyzer.R is an R6 class with a opinioned workflow for analysis. The class maintains state related to goal, analysis type among other things. It does not store the data.frame used for analysis to avoid memory issues. The user is expected to hold on to the data.frame
+ + FitUtil.R is a utility file that has functions for Fitbit analysis.
+ + We are using [GLM](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/glm.html) for daily file and [GBM](https://cran.r-project.org/web/packages/gbm/gbm.pdf) for intraday file analysis. intra-day file analysis has a lot more data points and hence GBM works well here.For daily file, we have 1 datapoint per day. Hence, we decided to use GLM because we do not expect a lot of data in this file.
+
+__Please refer to the detailed [Example ](examples\fitcoach-usage.html) to understand the usage of the package__
diff --git a/vignettes/summary.html b/vignettes/summary.html
new file mode 100644
index 0000000..21228bf
--- /dev/null
+++ b/vignettes/summary.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+
+<meta charset="utf-8">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="pandoc" />
+
+<meta name="author" content="Niraj Juneja, Charles de Lassence" />
+
+<meta name="date" content="2016-03-12" />
+
+<title>Project Summary</title>
+
+<script src="data:application/x-javascript,%2F%2A%21%20jQuery%20v1%2E11%2E0%20%7C%20%28c%29%202005%2C%202014%20jQuery%20Foundation%2C%20Inc%2E%20%7C%20jquery%2Eorg%2Flicense%20%2A%2F%0A%21function%28a%2Cb%29%7B%22object%22%3D%3Dtypeof%20module%26%26%22object%22%3D%3Dtypeof%20module%2Eexports%3Fmodule%2Eexports%3Da%2Edocument%3Fb%28a%2C%210%29%3Afunction%28a%29%7Bif%28%21a%2Edocument%29throw%20new%20Error%28%22jQuery%20requires%20a%20window%20with%20a%20document%22%29%3Breturn%20b%28a%29% [...]
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<link href="data:text/css,%2F%2A%21%0A%20%2A%20Bootstrap%20v3%2E3%2E1%20%28http%3A%2F%2Fgetbootstrap%2Ecom%29%0A%20%2A%20Copyright%202011%2D2014%20Twitter%2C%20Inc%2E%0A%20%2A%20Licensed%20under%20MIT%20%28https%3A%2F%2Fgithub%2Ecom%2Ftwbs%2Fbootstrap%2Fblob%2Fmaster%2FLICENSE%29%0A%20%2A%2F%2F%2A%21%20normalize%2Ecss%20v3%2E0%2E2%20%7C%20MIT%20License%20%7C%20git%2Eio%2Fnormalize%20%2A%2Fhtml%7Bfont%2Dfamily%3Asans%2Dserif%3B%2Dwebkit%2Dtext%2Dsize%2Dadjust%3A100%25%3B%2Dms%2Dtext%2Dsiz [...]
+<script src="data:application/x-javascript,%2F%2A%21%0A%20%2A%20Bootstrap%20v3%2E3%2E1%20%28http%3A%2F%2Fgetbootstrap%2Ecom%29%0A%20%2A%20Copyright%202011%2D2014%20Twitter%2C%20Inc%2E%0A%20%2A%20Licensed%20under%20MIT%20%28https%3A%2F%2Fgithub%2Ecom%2Ftwbs%2Fbootstrap%2Fblob%2Fmaster%2FLICENSE%29%0A%20%2A%2F%0Aif%28%22undefined%22%3D%3Dtypeof%20jQuery%29throw%20new%20Error%28%22Bootstrap%27s%20JavaScript%20requires%20jQuery%22%29%3B%2Bfunction%28a%29%7Bvar%20b%3Da%2Efn%2Ejquery%2Esplit%2 [...]
+<script src="data:application/x-javascript,%2F%2A%2A%0A%2A%20%40preserve%20HTML5%20Shiv%203%2E7%2E2%20%7C%20%40afarkas%20%40jdalton%20%40jon%5Fneal%20%40rem%20%7C%20MIT%2FGPL2%20Licensed%0A%2A%2F%0A%2F%2F%20Only%20run%20this%20code%20in%20IE%208%0Aif%20%28%21%21window%2Enavigator%2EuserAgent%2Ematch%28%22MSIE%208%22%29%29%20%7B%0A%21function%28a%2Cb%29%7Bfunction%20c%28a%2Cb%29%7Bvar%20c%3Da%2EcreateElement%28%22p%22%29%2Cd%3Da%2EgetElementsByTagName%28%22head%22%29%5B0%5D%7C%7Ca%2Edocum [...]
+<script src="data:application/x-javascript,%2F%2A%21%20Respond%2Ejs%20v1%2E4%2E2%3A%20min%2Fmax%2Dwidth%20media%20query%20polyfill%20%2A%20Copyright%202013%20Scott%20Jehl%0A%20%2A%20Licensed%20under%20https%3A%2F%2Fgithub%2Ecom%2Fscottjehl%2FRespond%2Fblob%2Fmaster%2FLICENSE%2DMIT%0A%20%2A%20%20%2A%2F%0A%0Aif%20%28%21%21window%2Enavigator%2EuserAgent%2Ematch%28%22MSIE%208%22%29%29%20%7B%0A%21function%28a%29%7B%22use%20strict%22%3Ba%2EmatchMedia%3Da%2EmatchMedia%7C%7Cfunction%28a%29%7Bvar [...]
+
+<style type="text/css">code{white-space: pre;}</style>
+<link href="data:text/css,pre%20%2Eoperator%2C%0Apre%20%2Eparen%20%7B%0A%20color%3A%20rgb%28104%2C%20118%2C%20135%29%0A%7D%0A%0Apre%20%2Eliteral%20%7B%0A%20color%3A%20%23990073%0A%7D%0A%0Apre%20%2Enumber%20%7B%0A%20color%3A%20%23099%3B%0A%7D%0A%0Apre%20%2Ecomment%20%7B%0A%20color%3A%20%23998%3B%0A%20font%2Dstyle%3A%20italic%0A%7D%0A%0Apre%20%2Ekeyword%20%7B%0A%20color%3A%20%23900%3B%0A%20font%2Dweight%3A%20bold%0A%7D%0A%0Apre%20%2Eidentifier%20%7B%0A%20color%3A%20rgb%280%2C%200%2C%200%29 [...]
+<script src="data:application/x-javascript,%0Avar%20hljs%3Dnew%20function%28%29%7Bfunction%20m%28p%29%7Breturn%20p%2Ereplace%28%2F%26%2Fgm%2C%22%26amp%3B%22%29%2Ereplace%28%2F%3C%2Fgm%2C%22%26lt%3B%22%29%7Dfunction%20f%28r%2Cq%2Cp%29%7Breturn%20RegExp%28q%2C%22m%22%2B%28r%2EcI%3F%22i%22%3A%22%22%29%2B%28p%3F%22g%22%3A%22%22%29%29%7Dfunction%20b%28r%29%7Bfor%28var%20p%3D0%3Bp%3Cr%2EchildNodes%2Elength%3Bp%2B%2B%29%7Bvar%20q%3Dr%2EchildNodes%5Bp%5D%3Bif%28q%2EnodeName%3D%3D%22CODE%22%29%7B [...]
+<style type="text/css">
+ pre:not([class]) {
+ background-color: white;
+ }
+</style>
+<script type="text/javascript">
+if (window.hljs && document.readyState && document.readyState === "complete") {
+ window.setTimeout(function() {
+ hljs.initHighlighting();
+ }, 0);
+}
+</script>
+
+
+
+</head>
+
+<body>
+
+<style type="text/css">
+.main-container {
+ max-width: 940px;
+ margin-left: auto;
+ margin-right: auto;
+}
+code {
+ color: inherit;
+ background-color: rgba(0, 0, 0, 0.04);
+}
+img {
+ max-width:100%;
+ height: auto;
+}
+</style>
+<div class="container-fluid main-container">
+
+
+<div id="header">
+<h1 class="title">Project Summary</h1>
+<h4 class="author"><em>Niraj Juneja, Charles de Lassence</em></h4>
+<h4 class="date"><em>March 12, 2016</em></h4>
+</div>
+
+
+<div id="fitcoach-project-summary" class="section level2">
+<h2>Fitcoach project summary</h2>
+<p>We are glad to submit the fitcoach package. As part of the project we have been able to accompalish the following</p>
+<ol style="list-style-type: decimal">
+<li>Connect R to fitbit API and expose an individual’s fitbit data as a Dataframe for further analysis.
+<ul>
+<li>DataLoader.R does this. <strong><a href="examples\fitcoach-usage.html">Example 1 shows how to do this</a></strong></li>
+<li>DataLoader enables getting both the <em>Daily time-series</em> data and <em>Intra-day time-series</em> data at 15 min breaks for the individual.</li>
+<li>Note : intra-day data will require the user to create a new app on fitbit website and is only available for app owner. i.e User A cannot access Intra-day data from User B. This is a fitbit restriction</li>
+</ul></li>
+<li><p>Created <a href="..\R\FitAnalyzer.R">FitAnalyzer R6</a> class that provides an <strong>opinionated</strong> but focussed implementation for analyzing Fitbit Data. It is likely that this workflow might not work for all. In this situation, the user can directly use fitbit functions provided in <a href="..\R\FitUtil.R">FitUtil.R</a> and create a customized analysis flow.</p></li>
+<li>In line with the project proposal we were able to build the following.</li>
+</ol>
+<ul>
+<li>Ability to set goals and find the most significant variables that are enabling meeting the goals. The <a href="examples\fitcoach-usage.html">Example 2 and Example 3 here</a> demonstrates this flow.</li>
+<li>Ability to call a function and provide recommendations for the rest of the day. The <a href="examples\fitcoach-usage.html">Example 2 and 3</a> demonstrates this flow. This is implemented for both daily and intra-day scenarios.</li>
+<li>Provide advanced charts in ggplot2. The <a href="examples\fitcoach-usage.html">Example 2 and Example 3 here</a> demonstrates the graphs.</li>
+</ul>
+<ol start="4" style="list-style-type: decimal">
+<li>Package Design Philosophy</li>
+</ol>
+<ul>
+<li>DataLoader.R is an R6 class because it encaptulates a unique oauth2.0 based flow for accessing fitbit api. The goal of this class is to orchestrate the fitbit connection flow and download <strong>daily</strong> or <strong>intraday</strong> json files into a folder so that the json files can be analyzed further.</li>
+<li>FitAnalyzer.R is an R6 class with a opinioned workflow for analysis. The class maintains state related to goal, analysis type among other things. It does not store the data.frame used for analysis to avoid memory issues. The user is expected to hold on to the data.frame</li>
+<li>FitUtil.R is a utility file that has functions for fitbit analysis.</li>
+<li>We are using <a href="https://stat.ethz.ch/R-manual/R-devel/library/stats/html/glm.html">GLM</a> for daily file and <a href="https://cran.r-project.org/web/packages/gbm/gbm.pdf">GBM</a> for intraday file analysis. intra-day file analysis has a lot more data points and hence GBM works well here.For daily file, we have 1 datapoint per day. Hence, we decided to use GLM because we do not expect a lot of data in this file.</li>
+</ul>
+<p><strong>Please refer to the detailed <a href="examples\fitcoach-usage.html">Example</a> to understand the usage of the package</strong></p>
+</div>
+
+
+</div>
+
+<script>
+
+// add bootstrap table styles to pandoc tables
+$(document).ready(function () {
+ $('tr.header').parent('thead').parent('table').addClass('table table-condensed');
+});
+
+</script>
+
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+ (function () {
+ var script = document.createElement("script");
+ script.type = "text/javascript";
+ script.src = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
+ document.getElementsByTagName("head")[0].appendChild(script);
+ })();
+</script>
+
+</body>
+</html>
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-fitcoach.git
More information about the debian-med-commit
mailing list