From 6f8aa510af23fff8469d1f00a13d7aa0bbc6be66 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 29 Jun 2021 15:53:00 +0000 Subject: [PATCH] Deployed 0d7b7f3d to dev with MkDocs 1.2.1 and mike 1.0.1 --- ...data-yield-participants-absolute-time.html | 20 +-- ...-data-yield-participants-absolute-time.png | Bin 184589 -> 129699 bytes ...data-yield-participants-relative-time.html | 20 +-- ...-data-yield-participants-relative-time.png | Bin 194497 -> 136067 bytes dev/img/hm-feature-correlations.html | 102 +----------- dev/img/hm-feature-correlations.png | Bin 295093 -> 619587 bytes dev/img/hm-sensor-rows.html | 22 +-- dev/img/hm-sensor-rows.png | Bin 188334 -> 102313 bytes dev/search/search_index.json | 2 +- dev/sitemap.xml | 152 +++++++++--------- dev/sitemap.xml.gz | Bin 900 -> 899 bytes .../data-quality-visualizations/index.html | 4 +- dev/workflow-examples/analysis/index.html | 2 +- 13 files changed, 117 insertions(+), 207 deletions(-) diff --git a/dev/img/hm-data-yield-participants-absolute-time.html b/dev/img/hm-data-yield-participants-absolute-time.html index e902c07c..527b5e69 100644 --- a/dev/img/hm-data-yield-participants-absolute-time.html +++ b/dev/img/hm-data-yield-participants-absolute-time.html @@ -1,11 +1,11 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file +
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/dev/img/hm-data-yield-participants-absolute-time.png b/dev/img/hm-data-yield-participants-absolute-time.png index 4129a8ee2f72f4693a90ffd29428638be44941c2..fc122a5dc9f6a6dbc23fc8c2456dad9f45bb66b4 100644 GIT binary patch literal 129699 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

e@%;h&`MbW3hx0wBaud?OVV;}9-?n6lr`j~ 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 literal 184589 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 diff --git a/dev/img/hm-data-yield-participants-relative-time.html b/dev/img/hm-data-yield-participants-relative-time.html index 7c7366f3..712cbee2 100644 --- a/dev/img/hm-data-yield-participants-relative-time.html +++ b/dev/img/hm-data-yield-participants-relative-time.html @@ -1,11 +1,11 @@

-
-
-
-
-
-
-
-
-
-
\ No newline at end of file +
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/dev/img/hm-data-yield-participants-relative-time.png b/dev/img/hm-data-yield-participants-relative-time.png index 20f8caa392fff5eb54fadf92edb075e83b29eca1..640653b8b599d01ea6b882be5f14115bdc851e18 100644 GIT binary patch literal 136067 zcmeFZ`6FBVx<9U^THDa>YAK3Nv}!6b&#j`RXsLOsBIZyr)DYTgX{$wP&0}kxf|!#~ z)z+AprG$hUf`}l*kc3aV@7?#Fd-ndG^9Ov-4~ZpN$;x`apY?v8*YK=YcTEhqe-r$T zg@uLt_N|*{EG+D6EG%p+$Jm*#C~JyfnSTy}%?xg^RH4r3&XXY-z~`dKEV92-18$WEIKT=Z(hIu z_|VD}2f}z1`+5DSfV@Gve8PFK+f}oqD+Sk2UKP9oHM{?EUr;gs-fdRF+wUZ9%D=dy z*R9b{(Fn)DR;N0f2|3QW;bgNz7q~bQbV9f(_BWDdu1Tu&hNh+K6dU2%fEQ~ z`dnu(&Ev>h9hO6EC;ruwqz+3${J;FFb5C@*I8Jv0UIa zkAF9`Y-@|G|K_KEO=LNQIHPt(;mE%k{KJno|IHq34{tqTapV%_%6Rs#rkgoXhcx#7 z%^rv4F6pqy#_+HkU;o!p@q|SL@~`(`d3xsLxhMR(N281W%^WeqOY1-3b>cta^}hl2 zpYZzQg80ws^$+XSe^#$wiQqrU@gLIR{|}O5;>;2A2Ri2}f6LN>=zl-hfZw@x0PJ@X zcSq-Zc=&=++_j2!XtMuqoG$q-?o^_W4XmpfOqg4H=Mu2cC(xa?{xQ!tZJlP8zSFBA zVORUowL42Am|Qmbt+sLDJ&(k-*Mhe!Dr8Fl_z`)cm5kVQV@t?Gjy@z~iHTDiy&`J~9z z{_oqiGf3$i1Mx&Ybp0P^e2F195Oh9^+}0KU_-8$9{q5Av5H0blry+l>C!ca&WY$+N zCQUOdBvFVBtIhA5HVpS?KHV1RELBM-#x;vg{pqN}K8Kw~sXgz)$@|b4`oikKFAtAa5be##l>(3FUedOA^1m6cFh8Zv14&-L+s_~G`> zbs9Oey7N4n!jCi=hn5pYg_E7_6R^l(C2S%#b0qoj?#2&7GZ<*v{C(F)0$=x7E?0!`^Dd+y1+FBQ+=ulJ`&32CiHs!D%Y|(x1*~xQ?qY*5D3yY-dVKsZF}08V zRp--pOmk{){{4^`=6R^^$Zo^ zdfmR3bk{!I(uco2y6SnMQK3n{Rao62GEK#N-vN1hg8;uN0s?1F4%X!u_|4=>&PVr0 zy+>h#yH_DcFU{)l-}W@O!m0~(qcBb+o7GIYVb`8F+H-@!C?80h>|SRbx#T|dzNO>i z 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%0A8h7fX?T8%UnqG}dy>tgW!1 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
alr3aTQxCl#f`m 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 diff --git a/dev/img/hm-feature-correlations.html b/dev/img/hm-feature-correlations.html index 99e596fb..1d7302f5 100644 --- a/dev/img/hm-feature-correlations.html +++ b/dev/img/hm-feature-correlations.html @@ -1,96 +1,6 @@ -
- - - -
- -
- - - -
- -
- - - -
- -
- - - -
- -
- - - -
- -
\ No newline at end of file +
+
+
+
+
+
\ No newline at end of file diff --git a/dev/img/hm-feature-correlations.png b/dev/img/hm-feature-correlations.png index f6e60e46e973ceb2af07eada8d836297f0c2af31..befa34c3c2624bf3179cf533e8839a55b32d80a5 100644 GIT binary patch literal 619587 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 z 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
mApV=;cGIlP`=Gr-D9ZX9LnVxau4|{6U7Km~ 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 ~M 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�|grj{87FXEG;B9w(*0(ZZ%xKF5WCZ`WeU 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%0DD;Xq=nMWrw1^R?+*&-kc&qyF5 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%0DvpX0O@-uRgwb!DrJANR47o41CgK7 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�KLo^qnL*u0omfLmn$EE{9GmT!|kI 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

Y)H8Ch=vlpe5K;-jZdjH2iVWlofk(DQ= zD~&h`!YLgN_J>>!rAy=*F~~YY@<6@9dHBzd5#mg`7<{mCXtKQLx^0=(T)0o0(s9t3;&S4GbHoq}6l+|AT>nsc z$EZoVO;?9}m7wBNs@#9<@E=nnV%vX*G-@W5+(DV2WZTA?2+Xx*+ygD8W+hVXR2+}%!DT4#)4RAU%>S!Z z7k`k-eE7IpSJy9vfiq3Dt?O@3hDM!sNa`#`JdP2Yq@X;ADso%^@i*PNGMMoLd0zVq zDJLaljaC;#Z}SGiR&I$_)b^`#C@rgDbjNP?3)k%>*xC$?pC)F#|v>y7$7azu3VL8nEFPWo_;b#)=h1u##+KW__o|k_ z7Zcs2VKnc}o`1T@m zZSWI4h)<0&`q){JN4?v-)_Nrhvm9J}-35ur zrS{~+UgFY=wOFsXw*aJ?#-ja1cWOjT{m|D;@|h98%K>`z-fxLfTqrWIpb8xu%|OII zP|CF;z-oR^8{k?kGg4K}ja|Efi3#8|E*?=?0d1(e}(mpHIs~+T4Tybr6C1#AE6T z>IbCLngKhHlJSG&XbGg{?vU_S*9ibAddB6LYVsxvf;(=+HU!t>!qR_q5lrbVi$Wb< z=5K@Idoj;cH-WooRsVlf5mlUMIgP*ovw4DZ(wUlG(mN%La&$Ew0w~A^I+*ScDq0LJcvYOcJuoXb~6!~l<&NhBo73@u3 zFdQ5DQ|Qw;FN;>+)GYcck{7lhQq8&A>XMP7j{Qoqik0l@d<69unKwDV+WMqc!S4PXJaG}x3QPk*9wJ>)S5>~oEXgl!~9GPbA*y63Ql37(kZp6mcz9P%RC~Y0ap1uN^fS z%KkirUa=u<>c7#Wd!^<4XZ7RlFMP@AH^29Lw8wy53||<$KF?sB;aL)`8Yb0c>+!NM zH!-UZ8c%q%ockVzK9Ntu?RFGD?%ZSq% zoXu;tsKvt|gyeXSk^P2l_KBDFzPY#>p;RRVL;Qyw$PD`$v{T%Grtw51 z-?O{76~^3>Dagg$5J0z6oH;h`d#Ty3|J1=}N))2GlLJ7Rj$-DX_51^F^{K~3NPq+Rk zxPpyfP#RN?I0z}W$)sD80E5m-CU>q8C#B|GXc&~ODD>@hxrYQd8K2dM@& zV3+ANL(5cV?}{373zsxU@u)hFdCu?n4!L7UG?*chmzLPcNvR4YyZw#tlrv^~bb=hX ztt&gWHp#E`54Bk#E?!h)7~EO%nc-Jk$$Q5R!*UH$-h5=82$BXjZebD$U|dlZKUUp_ z=u@r}De8r>48cNXYb%l>Yx{Layi~?4bsNS{yT}A&G||h*ZrRK#m+lK^5;bw*%mk~~ zB=VA%Rt0VYSLemolzKzgT3|cs5H`%KtN1Gi=>yN?SNe;kMMDy!xjd|z42i(DPi>Cx zXxQ#04LXs!wSSXS*1Q7iKH3$KRI$)vNmbU^r5X-z#_|vk+fXST2?+?qMp#4V_7UX> zHem_=Y=hb-3Ud*2|0c6OE|sOW`VSPr5QD=A`~K*CchJz54Aw+~IwUupSN3q3-pbuS zeCH8M#XnshW@zycA+_bR-sKM7#hhzL*3G_|PA0rgVJz4x)94eT1-B3KmR(+6+*0lH zY%ODReBu`y^g9{7)J&N!lDd|>y3O+}Tkn1mou>JQ;xxt_XMHF~!BvojsARTOfV&q; zP(6d*C^1%-&*qW}hMyqM*2KS`wjnp?+Q$s0P^J$=x^J@b9KAoJ8uT>LEt}eQEV})( zEPt8TlD5DujzGk#cT2>|l!>K7xxLK0^!g&2XF$Qv%os7t6%0KcW-DKm zHAR)5;zy%-#dzu=7<#=8q>zEn8P7d2`c4-HKkLqlx7s4QNnv{W{B`kV4)8n7gGZ_~ zPbOk$_-_|V3kvyHi6;aIa%nr0zrQc>&!$HImC+A8wlQ7x{X; zMyWX34#lnanXlj2C@jPbIim;70>a>EixnM?qETML;}#^T`g@Onpx{lC3IRw}RwlDD zq#>&9QELH2KIZOB95Tql4eb*#m6b+4wA1KeMx_9tR-^OQxI>ozWJ#NNAjH_*w-qZ6 z3uJI<52E~}DKyYP(KP)BdQDKv{ zc}4o6ELT@ECb2mI|9xWH?LqNV^&`2MzbxKy9k zcw0on>AaIea4a@IjadWkh|H}EQ}>YFo#o>MEiCN|^M#9Z3J?ErX?@XOcqD%(cOHuC zspeYs*CPa@!36L=x4t(H1e;3fo0Wg2*T-59e|N#q#6tAFC~@&o>!*t0yy?N*fuY6o z4M>?cc#W-l@78c+Rq7k}tfBk z7E%9+@Fyw$>bpuZY4?nG*eUsaRVbKCB{C%WX-YR(5F8tv(G{U;nC_6^@|n+1y}aaY zEbw=h8ZBje73TE>z0e+;TmdNg=Q zexdK%R7*ps`=c1t?vbR8bU;Z#hq8oSGqEoTo?Q@sQw2y4wY~gQoN-9UeZ9mq` zy4~LUt=LCzdcwa@)a{!1e^~$vRqKuUx12&MfE0_Loot?EdVKxR*nUX$C?~$x`4KK5 z)!8+mMicYD5(b1#$RJVg+szBEZ2vwGfx+?fa;=iR{LwBNRS1U zk1f7e0oBhdN|>#M2$~*EOzq2>j_?tD^f##5PSz{QL!q)nlhfeIw5RaAf$)PgFf^;e&|q5FZC2rVYd@?M8iFTwN%(F9XI^k$TdCA1(bJ$; zpw@B2Rj<{o1KJ-{N_`*3B);5iF(vL;19TxBX{b!oB#mtU2uf0x5QLzn$Cyy_nXH>%RCU6sEZR;#ap&2~ zT!IlD>2gaenzkP+j?Tw(+fB%4)AI>NG)OQ^#Nn(=|D4$@WKgIzZt0O8uJOYEiPf?{ zg@EIzZ5f^aHs^dwNE}+Uw&{N?z>}7KO{fNI4zrgT+9{wcosmRy(?UKA-lAJ+qK-#Suk zxnznM1FJE}WTuwE2oo^cg$aq=&iXzBw_T=m3X5SN_S++(1!n#rpb8k{|iyfl-qRQ40P4DWgZx&BF;l1KYc^c>EV*lrfD|jzXzI zK){4@Z%7OA`l+2>wW>(^_lzXPVVFr8h?;pvW-6oPGk$G^{A zp;e{ahw8Cr3%L*FejLF zf3AXz8T1e8c6>gZh&k!FmEZxGW#F5 zi)x1CKP+!DfG%%;%g@ncQ`EiHz7Iw^W znlcl|1gV;G(GV|k{(Ha1ZR&zF`s4BOmZZMPUk7O4LC|s3FVE=oeJ(Q(m20w39lV9X zZJaBstnj&WZUmUd-$^3Z^cQjZbO6bd5EC#TdeH_RTK#;BueQpC7NceBcf1Dj`VMbIaevwviqReL<;ffKd>yF%O2JNpOt?$D}>l57gxS$2AdfzmEf}F(c~4L zY6)F^mCooD zx1r-SZb|vHG9)1>a5eymMkIQfW-p#i7!PeV;90J|<97qBS$n#PHpO>1dO|~EHtHA~ z7$X5PX0?`#0y31bxUR=_04s+)5~PT_6HIeUHdf>B5|89r&MNL!s37^RyDGX;Q@3T! zM6i8&)fSS@tg!qiC)3VBH%Dihv91^`xau}|)jNYNMA2+$W?Jozo&8|W`D{Srq-DSv z?9m4OAVq`F=xd2KKM#zBmbrg5x+~yTxhsmR^U*TibyuNmw*7gnwx<4nhMYiV+FIL1 z>_cIT@Zowy%U^txg`fWX7EtCjhqVT|(TsyZaTdbO7?u7=dc$i9T`6g=R|^{ILdY#{ zHNL(QvJkezw;-Y_vO~R>xy|TiRWS=Ut)lb$hB2+hP@N?1iHvwTe29tt3)8P%vJ3-x zt)1gE%3rTf|SnlU}`F7oYK>UXh`HycyldU-$Sjb*byH`XUtOp;j2!_ z)D3_DcQBp1h#tR?-XS{{xZx?iE5fS^7pmmd0KSF;&H3+T=0i>sP9gr9jOLJaM(!~S zgpY6Rym2wqySB|ak*-w|TLRXx)E}e>q#C;Sb4s#bJJO$q)yC(4n58WhQA(o1KmsSj zL`!|NfRYj|p|7~#i*ZkvQ#jyqptm2Bz+UN;c?`V5_vHdOt^(7p>{Urz@@p8^x_K=H zmCj0|7jZ-GIiD^XzE34<$?+a_UjOiR*;$G#`*b&(KGL{^I&(E)eUA-q5X-8&`#v zUH(nxF+Ka>OMjjh7EFr$KRo9ZGHAh3fPsvg^(g%< zzc4jF#!4RN%}?EjE#NK_e0mu`5mw;2iV;O25laREeZm4aTAQ_+^&0{ERXERmo;&m{ zH~yv_tINcyc_1QX&7?!KGRXV=(&)1R`DnDqoopZu%2>_D{80+ zWpK`cj{P_3RXs0Tq%0*ZfH(wBEoyehK0Ry&%A;j14YdBP4~~7lmn1z2QZ7x^F~X*M zxD~k9;nvfYZ?gY6ziX@&VHXIiR}C!5whvd@PO5v)$u>8~kWx>(z9#HmckJbhtO7HT zX6C1(uYX*Blj%{mMlpIYxDV0eIInlTP*pfInwQ<3fkk`lXpgpn=?VJ;W7y*I+gP~c zG|x}>p5=OvH&1zTv9Rp*Ix1x}R{HN}pxm+jnogYa@i60WOJ(u%7__=#X}36y&Gwnd z+w`-dcHtGcOAOAGfOQZ@J!@~V8^!Ici~)qd&ZmS2BPF|OJsT$3zlAjQm<;gFR+}(o zzHdxEXy77Hk&WD#Rmuz5G)VlUQ{?~wd}PfY3Eu#+xbVB7P(0=*;{j**D>-YD;AC+h zmU_Eck;MHwA!E_~*gH#GB;6Brn@-vT@rJ2NZLiE^qcs$Z)IzzrTkkocfN$p3EMNbQ zHGhG!?@GcD?~WH_Dze5^pOEcNL>IAG1QT)tKZQBKVagUmH!&E{`5wVOx+KLi7Rw1N zt19`1sITyQ-K&lYe2e}MnhBx`gR3~HNMp8Hu(tRe{>x;B@cbzP)BZNM3KM_;-T+2J zr1)IgDGql@ORBPE6@iPx8=*s(H#}?3oU}$6u`mYWJ`hz_Xmt$!_;lI@PAj;tHaxp% zT^gk-BNPL-j8}LF1w}CvrIVQqcKDkk@lfNPlv4~JyrC&S z)t4AU8^lqKi8V7l*scFyw7qV<3Wn;_7dSijQWAYGzgi6_4rFrSlgQ3bH+A9wN0YY{ z`=7HsNf{YF(@3K@s>n*qqT*6RFNnWSQyH78elpi}QSm?FI7kpZtRSiq} zYqNgID#lg&kxyhuAcT?EdXeeh84r*2ihoE{R>0l^b2R0Y%@r1UVHRzTbRA-WeixQ( zU7cb3o_x=bW+jD3gXBA?NVMH(&^#B)vMQGL9glR$%H)< z_2!u0HcJf(dH8XaD86gdKSdnNh4@WkRClQa^bb$%p@EG@2ec$ooclQh@(f*?9 zt#)U?!{i(u&bMjjnE2?OsnWqFdW+!GV8G?LX8+Z<`v25vBwMoCA~~z1+++tM z^w@&<>nRXJQYM!fOf&04EtD_n85!x*CwFqNkSm?SQg?yU6e|>`l3CbR#$^vG6vI+F zrl{=Eg1Y%7#%885e~($QDrI{uBD^w3qmoIJA=oOd&ZJRN1lt>#ocEDJ_mCIh{8}nP zeuyj>KUNvdUa2ha_H8;$saBn=(F=H6=0J_U^i@t@q+BN;4?~vgRP*$$6+a86R`om4 z>A=Xt!4EV#RXo5`eh1??(?I}ZIDgt1X#@BIUWhEWYHFEd7^ z_ElQd3Dc!>|28=wO&E;NSq!a{+-X|RJGcJ%U|A)s&bHBdRaAlS5K>Cyt6#s%HQ%od zFTu2cXZXG?-$C8Z?=21NtGRz^Tjf~-#iniu9LUJkOd9t(JM7A;^id$@11b4TBGn9d z(4`Cv=Ldg{&|sw?>ps}7ezJgYfTfO{#+oMdB}W!^WMzjzwY83<_r5Tp6jvtqJ+(jn zk;1n}L(#A=mQC1X3yHK+Slb-?oy0ujn4ICF8v>9QPj42tpqqug4zYE6bW1)6|EpQS5YS2nK$w@mQP$u!u6n zoUSOBc+a$;tzy!tDXhl6PI~_=3yo$Uii*Wac{-y}84eAGL?F%4^s2Rt%-*OaN5-ym z0RPCOjB$en6W>yiPo=0`tafP^88nj)4g|FNA)ds9(T6Iveb8S3sw3TTz?j(E97+7q z<-?DSwr(-)G-@~pzInZC!ucBCw1Pdh?xR84a+3QiCJxqw0QL_T>`Z}oxP6+6%s?~! zpB9nM?8s;Uq_xq<%(DA<9|LOLykYVh<*irNII9K_Z$&^`2~6 z>yqx`6FH}Eql_8+$q_0kGi(7cj{L3Yj-lYG=QiTSDC+*_Y)7LCd_WDR2^pODN=vq{ zJVJc9Cy>$Yc!qqq)?FP$FwPfLgc;ZChna_RX!!}XtDQKS5354v`{mPyO)Bek)Tx^g zppx~qP>o#cw`YQUmeKk;RWE$=7qDP#z*qR$X)w^(6eq;E#pC*@OtZ>=j@`h>sRh3e z31*iroxA=uPr8G3wT(l+X_pFs3z5#M!2Q_g-u_%M*$J)1z%+^_VCM7O6;b4b&=nTf z=tT#jRzU`lixH9CaaLmL3He}Bio_6~6g&&{q$StlzQ^REqN*+XIw0M9fjYa2NcfO! zD~J6fWSzbY2jLet+n}rmEUwv-_MwS>JQIHG{O;kjUpk6#DCd^)PAaE?mc{Icix}ZJ zw&U{ZU;|-Irrq)-nfN)`4WFx`*pt)G)VShd?BsM<*teEYE$0?3o&%Jc4zDAT)ZJnw z>*YIl?yt!hBZ8k3M9$B=_bNq%wp$ZQZB|=3tA2sZRjfq(FQV4#6}}uB=x^KsIGZX5 zMKpgfr_c6ezk+|3mIizq*u=wZzSN~r1Ja<9BQNZIQ1-$*aTuKa1l}kV&!9b^ zg2Lq6MMf0T8;@w(&iMDTVzaZPdCqX?a#?(SfK?b|>jD(B&YH)fH}63&@rB+FyMxhCB!w=BQ zBtj)07*TMPUBq+YY*=*2zkoBN-u=y^|IOo&YabASt+gt((fDe1tsw*JO8Ta z9nz?+immva=HP{YT2s7AP=p`*tvX8B%t zE+^!&mt?!u$iNVFP1N!O<}1({Aile}!sumPRoA>tNFE>M*|%&mHdzjoBC?tF?-Z_d z!o|~iemLVJ5i)Pn)$X|v1ighEv61#N>n^oHSQ>Dr{Y8I$-%2Kw1d=!W`J6udwwR>R zNW1~+F!i|Ss3IJTs&XWddR%U90J?V{di?UIHGZO#d$52JQuxsnoDQV(riBLJk8m zzJ;VBv5h+y9HBTWYv2@(E|p0>ea7l^f03mLg7i=}dL_cF=14A|)UQeF+a=+c|~-H_aBxB5G54wOa*iJqg$j&r7FLb=!LA2R0qz3hx)i9-tYpOmT| zo3Oz;6^}Ksxq^QG8B-ZRWM4!FlKzfZpD5j5-cZg``7HMJl*?tp&-8VK3{7!`?UH}% z`erzyXjktM+MrONZ!%%0$-tBv`6(xtark$OmF5^hlHk;=fgyZ5u07&jONg7Zd%bnNc~Fbc*-SA-8Hhva+Q=B564oA#XOHi>z-HGtyLbsnu@+6-L%_ z)*L5PEE&~fO{>tG{&~6+#5ae_QLh2BQbVq2T?C8gGTb`MXhQOJM0cIU#Y^$z#J3}D zV!idoBL;QSsju%9Xv3nqB~L?z+oKDEa0OlF1Ol8f}u z1J?t6>WWTNJetZHGeu}(Tj}dQVv?Q{x%ZXUq_p7;DJn>E+McAHdG%hy#((>eLH~9F z`36{==oZv|wr&fdf(L)`=-M}8yyYFPkIdOVNmad73tx1@Hr9K`8U}Rd1(^IJ$(HL%w#e1YhB=h-c0`zrpYI z8;;W&3+VFs8*bF;%Uq@mB;)PlYppVZ$U=H`ro6gINZvaI!J;m1!agvsv!mm4X0fu$ z{RWH8;`-V^1wq2;pLug_{UGsRJ-&%FAn3}x^qu;v_vi^!=SJMd1Ph^05<<86SdC*~ z41-Ru?DnRLK9XiPNDIx+g~Vh+o4L7?;EJ1?9~VE)&{vvtv`VpD@IhE6MlB~)teL;4 z%Z%3SJPIbF!_})6LL{(iWUFSB4wwd0npV;3eH~Odn=7@~54|D&Zy0c1cI{l=M_V}7 z`l&A)!dpK4;{kxQk8;Z=6q?>tYDG0{s93G)%TMkZ;`djyp_t--Gm~mx$^<};>^4&q z`rVT4zU#vmF-{?&v5fB8>Zs3#G>Pm|jl*Kia3sm6j`pOEQVtP;lzI5z^}h4*z-NP5 zLCYW3)=w>0y|N1t`TZVwB?4_b)c#un8Px6q1>A8liU0@jZcIq3sV+PKiM-X z(we9tnmjN$7Qj(7Kc#zOC&onkg<8pUize^`{$I0aR%Y{prlR$bxBtZQ?`ysZGXHms zfCPYFMqFxd3zv}J<=U_#E_GAD{DO9;3Z`Yz=4`+|4*O_&9-Y4KFe(d+7wya<5Q}^ z4B9N1vk$+g`6L&0Ka?3g^x-jwUu=?-1WJL7d_%kpn|7ZBP~TVlOP+y|0BJPwtth2t z+affiT0QGMJMSxlBGT8f&_e0u0Se>h+y5AjH|ao7T$H^;={-a>VSp&(7v2OR%FFjI z!x)#Bfnbz?EgdxT&0EZ>>feG$=qsW9=-jf#ZDQ}CzBOt78u_0w;6K+Am{~5&56E+= z7_NwWNB$DMmBD%M#p(Tv*k<;2pkOlUiA_i z;ta(MlX&N5X>tiYKg8$ToVWf>q1IGuxPjat;Oy7qIa?LR4}FA+Vf5vzQdET;+WtMf z16=erVC^o#;Zz76zZRomLcMFC-9nP0+N<~Pl?&v%QkcbOOJx+&tJh8aTccCL(;>zu z3jG3Jj+*K=gf!<`fkX6AbEieWPMBJ1BI5p1Wd)b=z?6B-ufq;09=XUL#jadhUn)Ax zUe~J~w4c(Hh4$!Le!%h>LC)9Al%qsAnTOrfYXOZ74L66>J%NNYb*8iLw-h011tx z&~ln3Hj!h6sK1#vMz)>Wn$_sBy9neixzz-gXgX}4N&MOu7sPt2Gl2$jZgbB0{*~@+ zq^3oJs&3~iVoT4irqtn-e17{9@Z9EeK;%IuJrHS;%8ykX?7e{X;JGj|)BhwmT*l>z z59(#VxNH*Oxd0q*uT!naqe1n($L_7Qre!Qgy}B!rT(oqFC~IDCvpfO7&XSnSTffIRSS`y;S^7Ja^Cd|JZu#uqeCzdzchyMM7GX zPU&s|=^VP09;CZN1w~3)x?_fr7&=9|V?Y{d265<)_vU$yp7VXL-+x>K%*?&x6Kk!# zHni4(eE6Zx$S}`nXmVXje25E!9~{v0TTdckYiYw`6S3psO>-r zJDwxdj8-YJb-xv`#*^)`_auSGl*BXf%qGnKCX)f^;J}-f&IS6N8ZOk4UWF zY1X|{@1qy6GPmU72Hi0PXeCnXJboYG``#e%ZGQDxsfN1I#;XoV?VvWQ>oj%6PvV4z z(J@=|$r|Yi+xnh%SZo6hn6*+PZf|*erH`M^aamrp!jEws7FthJ$`6p`xm_5#J5B$X zt_0Gc758J7r7mi0-!*O5tepd+f^&_RkHrIS;@HCT4yx(HvtxPZ+iwMb^}vIug=g{< zH-8qId_EfcmJ69XDlq)lSeP>uC6qw@OYIf%aQgnRl}0pK@qFeuy}HWiYd8K+L#K!| zuXH`~t(RgC@&|_1&Ts1x1SFRC^JQo`>oJhQB$nt;-{B6hQ=h87p;fqTeTn5A4Jxnq z4>bj=H_mQ0vc&*+J-rL*D7qEEajq0k->y4C|&BuNw!t zOP|Ft2fnF3z6nSHY+N4TPCJo>phxsZB$eT$cZpqPQ^AeSoL}8<^sjof1SoVL4Qo5S z`eI*BjO$`#osFogtZjaMO+)cL;U(a2(&n5wh~X8&^0VwTQG1HJ z_y5sN?6;5t0ZdPDHaEaZTZI2o5M&|mANjd$90*QGyJSg$O2zLjB*|xlxfXan)&w;L zUcPb(qLTbdz2wEC$o~<~KC6T#oqaEs#;t%q-MEjai&v9LiN8?bPLc;WN`F8(qTW>9 zV(6ZDB@<51HKjSwEzK}fS&`Qi**-{>HB@MQYY~05$+b9oK^Z;i|Du2#D!V$>vFI6;;9l zT|CRh$-R4j1puxAB`j+D1!q+0HQ_7xM@n4vuIf$zG+N?2d4j3iuHw|o!xvWxS;879 zPVwtDDD{17O3kQN6$X*A{Eom+^>;pFyQ7&x1<+KRBA<-jcsgk-&u`wYOwFr*#VcUt9G|8Jb_AiC3&;9Nhm zXYzV|$Om4RNVSecbSLWFxDDn-bQ&`B#A4%O1K2VrFL-RGBRIJLKdmNZmamlgMH@%k z;SO&)iMPS*mfe8<%jW!?<@{PM_uNuDxtxB&S?6p99&oYR_kr=kVKXMi^lTI!aBqIs zz__(*m-%OZ1O2%b^?{13E2_`XNBdQLTMRN>nC^b^_=(ZLJFb94nYA0+UT)*-Kh2Y1 z!w9{Hmc1?h&5$=ERgYiz$FeQkYLb!8y(ea%?uH+^JPZU+V?_+emRdLrJQ!t8P$*xacE3(F4sCUypYHnk?o0e;xmGLHw(5xI zwLr9~Jkd5_CHF=ExA2j{6oJm_dFcYn*N&U7)R$@zF4$YwyNb>=Gm4aEX!c*ze(*#l zLy|ab?c>c(MCbJY%YYuZ8#_tIKx}HP)#|xbhc*+9`JHC3{Q>0O|MXSP7-*drHTgL$ zz~w(UaK}qs_2+}!F-mnl19julnQxxDY4L6q?MnJ4eLMW_yj^oM3r<58yQhsfNH0lO z2#436P+g?SgcHa?tqE#o!cG_%Pu+yi+?Th6eZxC$Z}A(^M;&F3=Me_z_@L8(v$KyI zoC{BfH}UJBGY*Bwjy1fQ+)qrWFp8S-TKHm42o^XmKw&rqbU&BX6;u233e{$`M;(R# z|Cm?;vY{(AlAM| z>2A&rFspSGTnIW!z~N?~DSmgjKKOuH`oX~Ai#;3*mB{I@csL@F{1pqnQg>Ppk;DbO zC@hXSkFJsXC^?}l;I;eK3zy*|qDu6K9@dl?A%tGucrh-5zktIIuW1U@r#k1+J49zt zOaV##x!1)Y8QM$84q$^_{93HGPgLUvPbT2(D5CJ(Q>vBDFo9MvImM5D^}96i51SkC z66tWdgd%^+&+H$v2?33(?F+?gH!~^4aw!z`rf74Q^MhmPDBe_R2&c=IMvi`bYp~8r zd~J|(U{4FlY;O^lF&TD^xo1eGZ_ft27{Hr5&L`mw4fpSg=BH#b9V@Q>#b^*?I>y*8rE5V*{opPUR-eHCV zM@mb}q%AfNF^ZnZ)oM9x=t%;xhAY$_#!5<(z&qwDce&T)ID`ZmdO37brI$pZsfTnkt$eu3y;R|I!>b&0? z-;in5M~Zz*c`n565ZoWQO2CTAo2v7SR>CE-kVBt|QU3GHd5GD4Jh=b4n^iWk;tHi_ zM7te8J1c!gjp_$ZNa-9}4W($=UUz-fqCUU=fCvIIPJ80Rt&YhrcRc}r>A<00ZoPZd zBX;vc16-x4Qjnrxv2JK1;X$Ee8Mt4dsP@iQ4_G!~?H&Y?(i4x_@jfvgCr(+rx+{>C z{*ZrsS)R)Op&jx3ZI9EJi5rHkO#r8RsXV=#Yc+B2vC?-}_a&-@O!-Q@h?b+0_=t_7 zL8E6xJ%A>EYpW9z>{m>0Ea~(?$a)NsVQ1NlBs!b~l80#$EQ@xoopko&lP2*A&Y(!-(H1U-Rp}~^oc~H zcIw5&sHKZ7&3NYCq0OLdu1g-lJt=dOmZ<8F^Xt&Ldp}m=BKVr<<*e#(UuKqMPyxRY z;b=DZ;df*5i$1`pQt}ZXK)L*~1*s+Zm(aXBRU9ji0@AxA$a+{K**hLJ(CEm4NQwtz z&A525HhjSj%L@q+>y-yAh98kS(0S`+QP=xY_FpKif7*PgcK_PfXuzhvtiSZ_SnM{> zv4Cf{E2}mi8N&xk<+j-ko>|tOp1Q${v|49z60U>{t%Ll*;-6H?Bz=mi`Z`8V#ji1T ztr$IPAHya#E8;1!5UGZ?0qjO?X*jN)j)3_?q=1|)?#${CN4X@U%DHe_^Ap^!l>F%y zriBY{3@VyuIE_xJY$Ed9bwatd|2a{tis3A&FBw#v-6mu0cTVKf74Xun_})>e1~-0y z`l!iF9xuh{D)jo_hkuCi`~*F%YaG^8qRXb zG$jHr;$*^}dofs0MYUJ@&CO~RZD*CI!`@Mpp#Ny#hUjr*9p8VgmQk0~&i52b60X!l zv5q@8la^IY$%->kr1W}9Xt;7ZcKZl8;lsjmuUbBIJ6w4h`JvJ(;&!AWrziTwPZqc7 zQ8=ZSBIaJ`_It0K37)o{MvWdFz5hupXRrtDmaj1NnnLdF0;gTRor`4fBVDc4I5Mz5 zWXJFu64jy2V6>#-Rbl?%ep41##*9^R1P_p(9UKrLa7HmQ%n|!iz^mfsdcs&N!+{_D z#(vYWA>+pFM5W~Zkx)`taI(tRN0&B3v2mQnEmkuL_vg1uZ2cX~t>hSoe_wYK&?pal zX5sIOB<*sA4ULfh_;P?4B2-d$u(%(aXQ=rP`v<6l5AzpqsXI}H;{on!eAh2VRW(>( z8%NYe!^L5Hl-D7j^xp@)zUSm=pMNZ zxKtnYdb$duHV2U94?+ zYTYEp!p=QioF#FkSIIhN0GJgUF}kE8#tC76@=%CN@Ksb26AcX?0U`5sySu>2^iSXq~?J-NMu?)Qn=h zbTWD^!$W&$4ew8}lVa7$RLb@ix7_Z1ME~kk=13FI)G-yBqbsTKcC-ho-Aqg^l_~5V9KJQyM*XU55>6I-w649NJ3UY8XwpKg_!c!L$i# za>x81o&xsQ(nsG)9REl7LAQ6>V9z&a^T=Kq5T`)9jRUoTeZyURL1>*)H2J!KysWR zgHi)51f_kgvlcDzr(ICb(QKE)GJZK;1+V1XQR5DHN-tHNb$qyIT<$196+D+lcBDrA zUXs_eHAI&$)4q@K5F^{?BJ-!{|WjM;7TEwFJi7*6!3@)t5I!08T5`0K`mkJypqJbi(+YRVI@ zj6}-X%7y|jyzcuWh5b_>)GKzR+RW&4iM~l0mAtMG@j;mgS^+n zCit5KwVuql4+OB#6l;q*VCTq)20|6TLP3ni7z-}_72itDd1j!cq_^N6ZK#* z>jWi_YG*j^vnrA6iO^AGxRT%&&$h!#Y2wkBYNnR?G)2&Ij(YLd#GL!oxL^M?n#?gz zG|lKxOJ%Ws`UoFiwyR87?jQzj{3c-4xzp4|J}+uuwnpJYxWf(_I{nD&Z&uwY?F1Fv z-Tb&?_fS8fKo(w?mvomyre)hf>A~gUk%-TCS_b2X_0H=8fD2PEVmqfFpF}SEe)nV6 z=lG4UgifY|{3m)9qKQLteCi;yNjogqerx;xy zKcJJbMxbA{ja2$I-8UVUwmkQ{&7$1QJj^_8-t^nK{dtgn>XYe~B$k0joGo?n&>V&9 z+CQoJ5spUi-3yIGv7x6%o;2Tnbx}TdT=NS<)7qDQGv`K(F0a-;B`2BcHr+F=KGM2? z^>);6RR5R$L3Iv_slNp+w#ZvfWI%|?03!uXLYLsww%aRPcmQ)P*OzQe%+;MdFS8V- zj}zIeC~s0F2}X=wn4(p}jatIt)vbQNpDq#E;@O@Mkg8weV2Zo#v}AZ+Dr!_{P29ek z`u++Gx4H4YbY{Y2jupV9=hquS&2w=cavHh5J-5>it}aBuG!;Nq{22JMz~fT|iAEc5 zUq6cvii+-|O3f$SXl6Ih(Rnv3#=r%MNBiFeIJzX zo9$eE@mo(7zI+4TGYacg>K}H3EK$?HJa><;Lc`Tbia#0+i@YGAtfl_o#-^3#diag@ z%x^-QN2}Acs-aX5bpty6^ffj0b>EyJ#kjucc^H}^dv;s4B9U22r{>+rqF^#hq1vNW zQIuIHj?WGlO1AVES6PNmRyXC{IDby5Nl%(~aTzYXMtuR^6-R1!8o- zS`EdK6P-1CuTw-2584Aah|U>g@Rs-z#?XZ{Z{jb1tn;U9c4oP1Kyp{d=jpO(bo(x% zWR^C@r~1dygrkae-bU2(PhC)o1v_yE??5ZBt>l&p^{qlS-f0LD8@y$0{ zS#)dPtX@jo@<1dyH!vmXS-qJo9A*MAHg%#<$e}f64;_Hp?2!2rW zf~Z9Chud%I+iOkA*u@HT7Zpvy;#%LsDytgkIZ4K%1A3ef1~EB`*O7;o>||t{Lbbl0 zza$>KdsHO*DtU}FunX6Y?cBJ^dddx)F5yR*(Y~)u2ZrV0U%~ZvHX=hX*d9&fPrWw( z>I>1mR$ZEIdZIgcC4Z^%h?jIE2L)3rygjE~yPi0(Q;ZyY& zuaVC9@60@D!PVj1JRLlGMDE})nqx)1<~fk_Njmd^!;-y_S_b~xG<$*hdLOJ9`0c&6 zTMCh4v(_lSbE1ix-G@Rhh~^U==XZu4OwjrK81J%rmvUj_nxeb{ z&R#4hSSKYlB_)M&sMmtz8AaT%cIyje>ZZ$6+LfRM!`#!IGQ22;3_tuU0wYiAshd$Z zb$I3@*)Q5{rn~qt@Xh#r{c0bss**-VE#!-F{+8KBny@3Ep*?-tKmko zwD)HPpdTNiH&W8=ZA;tl#w`z{feS(c0}36koDsTa6eP(4&aj0`-VpVL2qoz0GVZ!eRf^ZGwA2!|dj z73>?KZJMO23*8lYP&}^lBU>+dBPqPpQ8`v#E0{g&od00cLm>g@<#mHIN9)Ba#?;9Y zOM+#6>b0e}xJgb^!)77@2`4>-*l!d~S}TGs9;qU9WjxWL3rXb*AEB(Ejg=C!+^-i; zoz29%8g08s{ZFp>_&^p7o8x5J2_-k#HM&zS7t;2fX`wkfw zE!+iY-XjO>*?|hl4V4AdsOPO;!JUpOS#^d1l8qHKYLU{B7vslWJ>nC?s`Sq%oEWd7 z+;V`c#n(_3&z+#I!b|RtnvH5)?MrV@XvF-B1A5|+MI%PJ?Rd%20{v%XUFs0))dYiq zA+|8py6Iw1xn5bEH^knb(eRdAUYbO!{^uJ8JECGwQEQpuFhu2H^yT*<_|D}T6p9#U zxw^IDrPSk@Was!waxjtkZFza(jkONhf%~S}W&La>GC>dQy24BhTm2@I$rW>+sz1Cv zxq!&t4rJK188hWDTEL;EYJL|+7qhdo zU=O_O2$FFvJqqmQK7B2${WiBZuvyLmkjUhdV=UTdz=t4W@In2TxiT!;hUs{-o&{B{ zv(1m&mAB&8UH+|5fB;$DE>5DcKe%H}u=r&IVIoBP6jT_N0FL|kYH>VjV?deoqrIS` zoyWwz)``C6EXooy^Zfo`I_Rj1>NuEG7YfTKF!i;g0bAviMFIEJkI^$Y071s+m*QNS zUd6(9ACUF8$v2={%Jbjz*}Cubj~7&W%uccn78=bZyatU9mTqIdsL&^}qkA*r-}r0Z z%?q-z&nbCqnLvEYFoV7#L zF6Y%xAxc;51BR)Wk1i#xD@Jw6QYCr@^qiiY9r=_IxEfi{=1)6WX`!je|52tGP{RPN>uGGw-`Sa{#6E7vXry&b*g}Uq%3C3 zt;&eZ5F>-3DHVO1Lv|n~!X$becPUHS*!Xzd2}HG@uwe2OGnwgxvIzWH2+XlnXii6$ zhDHqxuyGYt-IYY(>bH}M8@NV4kz(?X{h()`72#~mJIJU{dgaeFFavx&9CF|o+))*q zn_pr-8H$VhiHat$ZR2ChQ;P%{a$Ep)@_Qsr0)NX|$aD2%5VS5!Tt)dVA zzayfHnNRa&(jZC4d))EG{1lI|4(lq^D*q+)w9BW6AVk_sP3HSmv8rbO*EbU zPU|^ap4dM-Ytj2Gs;5@pV9kr%yoVWQ7>wGSPrB~?H`6F(k1(ymf;II%C4#h`l{e!o z?;7#XXnd7tblyMU=inbX|H@`K)Wo`eHL4LHt*FvO6=*`aW4vX>As3c!@}^Wv&ARu2 zXiG$9CBtL>ovdRazZ)VRVPPpPXMr-KE{)hhck1(8e)}e<})^rnk0D-Z{Bhd*S-*P$Wlp!D=w&;Y}BAj>AN1n4~PZ z`Z#A_vn6{2mtxmUt%2$xtLg;*@l`_6s14g?`|^Y18B_^Y@99>9GWUHs`XHT`Vt|Bg4t-%KY?wz&hth|F3ATIwGxvjTfx|KL2 z+pc{`lPZ=zf=R9_y@xzisNi~+!>1Qmd0!PUS$08o_iAr3*68MAKzoKXN{Oj4`~2sA z?^!NY{CgT=&_Fk+1ZnIAar<-==~S%6m|%rIzpWdI6|A$5800&8EkxmY@qE!<*|0GL=^lCd z*h}jP1BL|kb(62qLGJmumQ8ahq>Y16kyOKDbX?XR=n6$@A#bBOcFZSZf*@Fm4x{Q; zNi5oJOuAS6B3(CaPhqn+dvjvHM2RD%kzP|Y?fgU4opaCjc8ieh+VJ26SNxAY_0xQ$ zL0avpD6)ttckjsmG*}^ItWVT=U&_S+*Ar$!C0YdbV&iKy8rDggh=&qTx13TbL1E$wRUWYXxL#_haliI!&tS#?L&VnbgeHlZ?!=rSn)EbAl&>-g_z|4^UQ2@2of#&*@0@#9%>Sxhdv)N<5 z+m-ip+i%f87unjZ3s%*>ph18Hr6?T_Fb&U8;x8#u91`ej;VR)I#LArdrLsw_dwir8 zUhJNVh!OBLbV=0RPJ&pt2pq+oxYy>#^TDK!v9jBjtDUtxFpl}0NK)cc*>aMyBqj#cu(8zEiCKt|aa{&*&gL*!+G$5s%GH-cvdRD?H%DTLoxi>0C*naU zTqZ$k9T4V@w#ZtzogR`^m|ss_yP)-M5X}GE@81oV-3zJlZspyk^qFcfORwrg($Z;p zF~u;;Oy-S=saCGCIbhjAT^Tr{+$Vf6i;X*I)Hp_U=A-L$Zam>CC5z}(><>5}o~nAq zkCAYyy_EbE)?VOOPBqfF%Lg;-msUxyy`RY%%LH2;futgzwPoRuk=fK&CmE%WXz8-b zcgKr(N>!XR(zHkMKJn6M&kk;FBPORxSYY`#YZGS&)1Yn+etGV?Oqn7a#GmR#S(>o| z8bx z+Gps{TGv$b+$&k^Y^Vue3-;hB>ezFdX)~IN7X-zAm0E~l_T3upF zEbt8REC03Om*loSU^S$7@dR;$E-ouQPO2Dh$Wp~R=4z_7lqmUcAX8KxET*QmKA zztKVM*s1)@Z5R-UFG4V?OGgTlmi?bPLKm~j%A*@Iv3z{;b*{x%`=D%6`pX(K!HM5G zhuSnk)usGNV8-r`V%p}jgzBvo;?=SuLVHpDid4$`%t zt?X%^lss7M*w+U>mj0fYtErq6PEyqhRN7O}3P|Dt4Iae89mth+^9*WLz@Sv2UPLpP zASEVO>bvc!pjSA$- zXz#+|V0ob4^bHT)cH=8>|NLlupwNwx$)R+dA>#4l9lGIS_{W2WF9??Yky1o;LSiJS z|9qR~6ZPN4CIx=PylwPYlaR*zxKJDn*TA0Fv_o7%!)Ga`ASjCVDYLUq7WWEkSzIKD z+eH#HRtKcTHH*LoSIAZFAI*ocCrcv?$4|1?Pe0VC@UL|Kw)4427sWIcL7n>vX>s=& zq6EOef9laEaO`>@-!{Vga|1rj#`=0rY?gQDlYgQ!OM>XJS~1h!29Ok|iMf?{MibLW zmV|0cLiy-^vPR`jicX}FYQ@q>M0Rt5X|xEXLKTXJ#mSY&O;3I=Dv?x8C6j7(Ymp1@ z57Y!rvbOic`ea}?G1}qOI07KMi?uPy-F_(_>1cl_dE}>lqXrc?)Oqz!E*EU7rtJjG{WqQ3j)SOlQ2w*u3D(b zCR_R*E$KPEFdtsQ*N3?f`g(%Fw(Kp_mXd#xKXa@x+QFrHvcNG6t77exQBigYS$0xv z(Deg3*2iyV8je9;3ULW@{HDi>^Lzs?tqHN>y26^K2e$uOLftG>8}|CkUhCN8)I zdL`pF7iFUyMwp@@e|Z=IYc{xs!>CSMxzBYSq57k^y~wFD)Vn}2>O~aHdcxFSIFOMu z+-$o0fW;6cYDYH$G@ypO5`eTXk*!+WN{eCll4^Tge($g1%v`Me5%UM${bzJvnxQR~ zAZ0~Qs5^t}L|I_Rz)Fra#H?Y$2Q4!x)UwY)pqpQceAvnOlk%<)@i2V?l`?}9K(6w- z=-pnLCY&c@l|nfr;$0!byE4n0sNuwFbDBKfn-Oe5PD{518OeMN6f>q&zm zsgI1Mvx|$d^mDbKS0!4)Y7`5!0HQ}EzFmAt_|>>fH@+s;BJ5PxjNo{>%rGu@#v)Lv9!XR27z?W<70Ri@v)xy{+Qq`dGE ze~!TR5HZ!7qf`d==P%fPeZb&(IQ({Y^GCS>$0Ss9*!_d#-=Oqw$jDa?8Ab+1>rqTg z0ZC)Q7ZL&y zWM1tJED4|f>WN9*pQSLOG3x_oy+}jKj{6RSPMJsg zg;=-cH#rvahjxJW8uI(KFfmuE*@(t3*}qWPUBJz^K=p~$L?lWs_W2=nX02k2%PD6;)LIbYeU3l~+ zJ9*KQ1RHCX4$hfORyDo6Pef&(6Y8A|pNInPIg|N`MguMtnKkCMah<$ofd#ldR?EVj z0M{)<*5{SIJRIB!BLJ69u}ay|o2=U-14Euk+l=O$TFp0knZc>%aS6Tj_;nq2OH`h1 zvo29Rr)VO;$kE)5`0z1$Om|Q5c|{8(he;ZwXaT7^rV-QS1s5aGW{Y)_*`|^5!&C-i ztv(JlAZd6yLb-ZTzJA>^^;VO^T*Je8&V&)rta-{T~8`8PaKn_TdgLnzGzof%w11f zvFIv>h}YkWTkX~bgw%1G`R-sUK3aaKgnwgI>Mg3)rIv8MtX#L60C6WxO>jQTJ9ZF3u(do=k!b>WFL|Tx!rt_Wz zk53!XLk?!h#2{gKeqy)eSZq=j`IAYyAaHSNL1D647aBbCs@}4%)CaD&P4D2~fIo;( zoCZ`L;M01|f`-BT(6}uBQ4)N6P;f@Zem-Fn=()xQ%yA%)V^8GldV2Il8E1|9cm0F& zzWy#aD~D}&Bsuq4%dp{tsgA|rJ@EsKKjG%z)E|J84s`u~U-!40s`ZvAaf*>iegxFh zRet%$$cHvEoL~>+aC%#DfK9p9Fku{OSMS>bb;^Bl04aZs@wnZOyPPWVPdiCWD&)IT zN?K#k>WL*b`6#YxwhXk2*hol`FJxkoqfe=EA0ps5n^G*>ig!;p0JRU;#;+_BsTel< zQW{q`*|JU22PoE-4$A}4c0aYj9RJ3k0c7OE#5OrwLIRGP>axXca5jK)2$~h759aGa z`fy;LL-urfYO8FMGF%Yi9Ng(wi&d&$2W+8H@K!mFq2aA&dbuq#)`cyx#Axl%42RUI z7g#U|7r+zb$=X4m*pyUm6j#zq&B>SH{Tj_3c7xOKiD75{Pk8_DkM8%M2N$7#H2G)H z0EY5q6Pi|#!|ynJ$i}?yd?WS8;b3`5Rua6N zg*zn^>RTN|9{t)hvvH*E*JF}nDO{cYW`GpxjLZtl&W}m9B3qa{r4^e*D<*o0FF_r# z)JppSryycSVyS8s9pt5fka+ooUjx%O=%z92z~t)uo|g7t1Ca3#0*a%+PcLO;1U z8X^*7$QMP21ApH&WP7=ozyyzdqssa-!8&wL*vh9IXTm8Gl{>~dZW=a-Ias(s;GSTd zKrk%z=E7s&L`Unj<9r~>x{@ywST1Wlr7$5yLJs#axGrGZaEuTRB;@vg#D^Ka>uC(RjJQMER$<|0jR!9pC_+o}yp_J{6>tgEZQmjA#%AYJ`v2 zi;5IIc5b>WHA)8Cas1T~6Fs6K1c=)hSN-=^KRhi(#O8hNQ;ttKRG0~;vIAjoyyH9&N3|@;pjl zKTE`qK`mW`(C;#mIj?oEb+*wo7yPpiX4RaAIOK(42eHdkUx0Kd1|P2t#VdQ6G|zzx za{Z%2IyRpqVkuwv<|wD#GmH|S_;IE9e-cP@I-1t(@^+G74BJf#Y-M}FUmf`U69bHT zG%kY_pTENpr@h?6f?Lz*48UgQQ<6K}U%i+}Ua*GBR}g&fK3}bY8~JX!og?sTwgeuZ z>tw%-@Ey2J6GUd)we+6>4P8s8?R7cyiGdq`(q!Vm#!Bh9iD_4vs29*=koya7smfZY zrdB@QsiSE(lMD*wXd+n6h-sS!Hz>w}*Rz%$8oa{{ps|ovMFCi*#3ho%%9#KL?GQ%2; zR__>t-w8EeDw?@}hA%E|zAUp@Dek*T3-WKSLO+hM8XzGN~cRU$WiezDsaMJT$VL zf&CsR14ArHfcD#GSeOckHFS%C4{+vHng!82SYK1D zo7-DhWct#L%sXp`G{ue%grRxcOzL|;p_S~qe(NqHAFo)8y#SoQL%f9}$W(B?nWUtQ zJ|6ChJhjcsV3p=Q&$Y{cZ;GSvj0A-b6S-z=0N>bM|LDf5VM`zEC5KmPUN|Lm`PGt`n0uNC*=^LqtUQt!38#-zom`tSHo0IQ9>#$;o#?zR83dZbX_ zqTNWCJ{IuBIe@l*&Tq!U$L&!tyF#NhqU6xGwyalSeL@<@@y);ABC+2Ez`SNzd9jtq z?bM=A>V0<$&xy(H=Q8sQbB?NRq8|J|l z`L}td7$Y@@#9W{7*;wvQol!O~&TBTjb${%azeTCu2ovZ2mK+WBlJ5Z<7sdI`!lX(o z*Hn?yMtLtgnq5we=IBoAox4as_=E-N9mpvtuvL7rUCf5Sv;m>?|Lz@cY>dFOtLx-t zPM=Qzv~5UqhSWT$;jJCTx z6}x}T)o*oVqA9s>9xsF@q{_D4;3GYq9Q@haa`j<$guf-di=+5$_U|3ha-%wVIbd%N zs?AEY+%lKzk}6$`8jK0-?*#Vd=*EkC@7>P}JCV6*zR)}9JGMMFv1U@>=*r)|016d_ zsD1{`{)!KF$>mwc_6gIv-5KIRee*%LpUrjHwW&yy$OMrS)pQ z?XC^I6AN z+DhM5nljG}jJjVsPn_FtMRE_>jt5r}3tKZmeDqrzshx7lgsd!lO)#f-00S~9`mVtY z*=m0;zAPBy!@O}^Y<$bes=6td)$E`KwfjBz|DL>1w9=5|(6eT~KjXk9Z@y9! z^xSJ(9{N_WOpkmCFJKN#D||MQfO%&Bv(fv~Aw^JEdH*r8!`o9WvjIcfnj>cO{@0Ze zr{xmx$+p9sC+*ny+Z&0EX9=2YXwQ&~osz6pTho#^*otH<+f2s-25?URmvjIb0rHI} zu%7~NBtM*n-vn`KY~F`DTb<@XY1D60{~e?(NEQW&GCECL3Rw9wtl& zU;4jb(*G`AL!fF`=E%a>l>Se|lZwN}yUxbF*D^hW@UE@BP(lsbvlcxy$Az<& zdl;QOv++#UzkK9-*yhLqht!5uHgXs>p?}hI3J>=izWYVB^ExSsF|JfWm4u<5Uo!jF zY&l)wh*6XU>th@G;5zWCBVQ>9m8dzMkqvc6mkkPkDCQzEse$4I4--esyKcByzR%5X zJ38hpE+_|rcYLZ(yfu3VAIR%#BSiaj@8`4iRzm3xI_6tVZijN;TRIpPG~tvV>jCJV zszZ~Off+^y&MOpkF8a&=iUr@QL#;>IT};({2u>Cv;?G{{4V&*z?oA^u95%FuUgAipidBfCJwZc2l6HbQG>$Z690K z7w^ala%g7<^N+Ir9vj@V}DkHOYCIQasO;yVsF!syq=L|fBky+D@!W_MOrRsz}oU- z*oA#ZmFh+yA+4M&qC%0iw?q;zH2=fo+>K#9sq)ktL9d|v?l_QRxv_xSg^QKW=pxOQZc^SwM^^VY8t>;CAcMnTB$_Dg@f{*?KWRjG>MNO z4&Z{P2mLJrM0Ad;Ph?>jCzeL)cg+Ik&5cn9*^+SF(@EPW>fPy0me0`Mj?lgB&)MEF zK><3^Nd%(H3;*~3g)jcIKv@_7Xi%x|u<=iJ$;S@Kj;Axs9(1i@0}Tl&V2Sz*d<|d! zjZx=SLgE@e*)O22ZS`Y$)#L$*63N@egv>%Wjvyu0m)NtyKjsX6t5whKE>aXC&N8Y+ zZn5(&a;?|3bT9Xw{2j&r@^8d1p#b<%09TJb{L2n>VF2O?`6yka#ZWr8v)9ng{NWF` zJs~AxuKdu@Zr$NNaMga>NDqAH;a5$zex(baSM?A=y&4S(SvSMhKqhMrV_Kwe*3m9b zMJUZa%_pbL#-89wOL4=H=*IL1QP$Tv9TXDs}BM%?O6(=DJ>;@Wy%mc zhkf4cUv5aMnk>1I>b4e}tx{KF9-7SyzHMVln3`YYc}=N)=l>^b{ZC{2L=HnAolEYA zkLI61FkTg$pHfo^>u5Mk#>3j94_F1@7J!&-yYSHlIS43nf8kfQZeGfZf*dp2AC}eu zyz29-CdtuC5cOoS4$idWi{&iP+}`hH7yY9ivarw)pLy5ZDu|cOjAg;{$BE6K=`&-l zUZHbDqyE0^4V!O!)JiS~5|+=$>D&sLrtw;c3DgM%hq~Nf`@jsxIP^T3u3=l)64L)e1`&8U=KRD2^wx?$9k zBskMloQ4@fhp5z)_5!#uaCH)gIjV8@!j6A2Up{M5*AU(mpKKKma^^SN&O?jRbRMzt`F>GrRw)w;ygcg$ zn>&&FzWeg!u1E`qS2h*N<<`Xe5lKW&nZPHH_Wrcqrc;ga9yVRVFVH3&UvhlME{e4! z!73cJ&;%f~Qz+$-FX_io@YNaed;K~yI4emF@-@nvC82{p+VT2TQBa>i5p)@i(K)tA z1A`(gMrCb5Qb@Kd5^Iu}pPAS_o$~9I` zt7h;^dd;k(dW@C5Mc%hi?25)}F?F<8+MA`{n-+|oS;!mhj=oAfIr!G)OniD!^DA}v z1P}+*=)@I9b8~YG`3R^`4iwpd|C@&(4t z&BeL);Ej#=+9DP8?!F6BPgAbo60lv=pB;EqG;A@`n6WX?-~5f!tTR)#XAElZb{OdR zhdue98Ucv3PwpfPXT(BSe|C>nS^F_%-Sd;_h98CCauA0ZTGk2j-b|gv5;tE3t-0-@ z>_v0oadJZJrVLlfg{vBK3YVY&7nPGO)%JXiDT$? z#_e6PD$OMO`dEV26SIs$Pxf=DkHxO~))4SvtC1c*$3c9$(Cx_5R$dc@P;Zkte!dpf zBXz~4^CNN7R$p|`WIrH>s=weI`zrSNZ|3{^NFiiT?=l9Lr6qyV-~Mhqq&-HP)VvR| zYdhUcYCUWeRoBR;kO8p*sn!vGMIfC%3)Vq%ny9W1mr?}$7+&98lduDb;s4j(TmD5A zbz#Fwh=7=sA|a`Ch;*rdfP&JEfPl1sbfbVYN=YN#-QC?SE!{&8FvPRxzMauqec$IF zc=&XFGs8K1uf11Y>stFbupho)5KjE;>Yst9^W~VOS{@|MnUnd~^6jz#+`ero_AWM4 z61=$Wdg$|0EY_AK{U0MH@ok2rnw#^V^ZGwiKTIC{Q9)p-A+d1uUIUX`JVJ`5<=g<1 zf0E`Kv_y`WFU=LYR)RV^xFNBuO7c6i2)V_WqyccDp2*mOw9H-D>jHN(v!1T?rFmiD zf7foAN?0Dv_s5qlkC%UU8*?V>dm%vqepU;VVyY>`kb?}gD!+SDqbZ=-6q``w60Dv( z3CKxL&~fJslTN*7a?lO?s&zJ=Vr=os_A-{Fr<6!_<*is;+5+7T9w)Ywd9c@k01NTn zuONeR8MLaHne48`o;}`h>3=I-VjiV!XZ^;kJJBubXvm;l@Y2>^d>$!6kr9pzEKM6Z z*jxF`yX1(^66G#}GC8O75AR2(@$S2tKXw>CdD;5Hu94KMCuKhDFW%&e&zcX4u-gqa zaVx+gtAdFb(koWq1}NFfYFU=ahN|IY{`vjPNA~?&dc@uZ0uSj`hbk*xPmwaPZ^?FX zmqBI!DQ6iRh123u{@m=ZSc^n0+UTL6j2Q|X->O77t`;m$pO#>{`TXg#2^p;ygY*85^;B`<)e4$a*qBIVmlK0i(Kf&XVmQ(I)Em9t@ z0j4*GRT;iJLKYN+O2TjVQR$W^l})t{24-;8(T|e*%J)enJwNK}bDdUV$E$muDFROX zH`$QTx#VPHrKH15+=w*&nBU?$gb0C4e`atoyH>*BmH*F@7rgCiIbHs38{GrtIqs0c z_g`+5kbmZjWXrGMOpq+ff2)|`_TvY5t&x}RK0xj6RWa)~YtgG0;aLtTN(V8`*Dt)k zQQI*WirVCDbEo(R=09bS1-IqH0z%zL@SA}49sfEOqq{}`^p1|~s(6~Af@)F|piz*R zl6FK-rF%?4DeMd@R%IEmZK;a6^sMTuQek5&7Z)U6e-o#Az+f2qT-lL-!>`*JPSE#} zHxe#6z`;rBbU3~VS}vNSnuvMZdY+t;dcA3>hH0PSdkWn~pZvY*Eb&r}hEnfT zAC~GxR4_??{o7Ss#99Wprc@5@uN2aifNZNL-T3Pcl$HMQ)Z$6Pw7hFWib7}En>Js- zf5h?A&ML?x%v9|r07dys%K^*hZef5R+t9_X;&!S6Jw#I*dnouogQ;+x9}Ui#v}14A zr^6{pm-EQq*&2cHKMgT=!t}?}@T`EwU$^BD$Hr>5j)MKeu*3<9V>7$!iaVoJB73>g zlxKkL1$~EWS>1W+`{svs&p_rAW0{-j{OZavE3QJ0C?Qs`&MWq<`4HR}^2KmZ0I%#e zX7McEE6EsgtDZt9bFBkm6J}UucvnkIQJ!(nD|*G^2i-rqXwh{6SX9|x%AKyjh>2le z!Rh#%Cq5zJa~Bnx$)wlEgb#eH^3Kw9FXaj4GnNAYpJ}EsZMPi7#$4(Zlr+xCZ)da| z#_V)%$aO%%?dlmoqF>io2dPOWW>bs&lS%L&%OhxT9e~R04p>phxHnBc4ls>VmA`!) zI^yfWV#j>Lo+)?ZW!(b`Yu$Q*oD=j^A@_y zlHsWa?InU3v96~g?#M=V5Osb)Y00!bb0PI*Iwz>>zI5$xOO+iaxK*>_d1ckPV+7LZ z@>xK8Du?1#;%oKY!{2y}zwP@64Df93e;2PdBMxIeM3&(tdIBX*;$Syh(Y^}wUZnCQ zwQCO4zR=b0MSWeRxQ@dhExX>p_3g9Ha5at9jtzq$Rl_1ylee*qdClJo=g7EA(gOOO zgtazG4n*8^cI?WDv3T8Mq9fDsoIW4gu99b5th6pKdJH^%yim(Uo2{*Tb_b+c4rdi3 zf!JY|DOe$Ec&$tRGXvjB)8q--`6A?R$^+1};u@Offd7*#GkmA6@JjFRq2YhRs0XxQ zM&3KSvxr$%K1cbIoIm|3R@S(Lymfy5b@l%8GGP=qL2{ChgKvw0bNxkLQzofax(5+q z%G*|qd*)H!uM~4C1xO!e*$1k1H35;kg%TP4T6dSeK@^mpaj1=7N3E(*y61xLB>EV-(Qs0=Wk{UZx>K}mZ|)}TEk-SnIj z6XDG62X>=ha%R7s%~kMiT4h6PQeV(#>MOe$A+Ke!yRYRAwjIUADo}5SXUVN|F)~m& z(0TNcrKYnPL_RN{qZ8KLJ}#Drn5>KuzkON23rtQwpS<+@;D_N)L{2>btoOR5TDvvJ zS3)WCeiXModb8s}wRqkUWo;Pl$UGrJWWRgd8C&#BfwPm!gk1;ZAO$ZL2rfRC{N(Td zsD{J%nImUfTj&>tld%`;69lQ~8rudu4F#NN&})Pz>5pb{O%9Z z@rD^_#SBc$LUyZP82j=n@k{v`2BoS=1L!)f-!d?fcDk|6MRecZIbEYyt-c*&J8}Ki zE+On1MkFk3Z(IDGa9kN1$KNXtiUF*cz%xGYt-ONV7=-;x>~aGeH^8aBuCu~B84n}; z@3b$v&&l8}<+vMeAC0akN0-5^pXFhD$esuYKd$tw)%FFYD(9h<7n!1IK->toCrOoG z2$<$LT&}Sj=(TzE>e{;vk&oXjX4mNHE(+K|hYqir{VSTpeHH?by4nNWgOEuv9~RoB z*aj6+C!aMAQ^PdMrRR6DS1b6M0UPag=hjqf)QXrOQyHX6wM`57)jPwclL5C<9={^f zFfms53ikv_E+7*5Ss8qOYRb3?s}nd)j809j2-cGE2dR`I4I;=ckkr_ zWF`T{cO!D7-{2bc5IZL_dHsE*pJBmCmsCxHcYgtNFKf$dKc@M-4r8H64j^@#Vf%LZ zmF41{q3lmR&5}=WEUjf1fQR3X8rEq-w(I_hf^*DdiQygE>gvzH$|cpx_c%B_PM_+*skbR_&v4nmJA&{TRm-s|oE661H7dN~f|h19 zGMND!fYY-k(r9d)Gy&=cnx?Tgbi{F+GP2gfTSjW8UF2FfgAWdkDZ~eB~1E*C`)3hkUf?$3p;)IEd#TFW5R;lHdH<#^zi#j{AC3L95 zUXJM|F4D?wT6-evS7x7@F24(C0{sT7A@Z)J)73<&=#2YUsnZw)PK?N%j(1RH>E}Ky zFTXV!GrN51ah|w(`RXu=nO(~lSWsSQ&bYq1J59zBcVVg@C@c-|T=^B{{Td`FZNtxZ z_?GuEsnr1$da^k$s>-41^Y|EQ<0x46hqWnbr$i67Z1 zkt{y?wH1-+KJGI-l;_{VY56Zny8R4T;T`Q=$yKBIuy>UuW1xJ%ur&mN9@+b9yi@#4 z1}T|OE9~avqka_Vb);uq0W}uf@A=&DfHaC<3R3!xlH zARCzCW+(8oL!sEk6YhZ8S~#P&srp@eV`NuEeiH9Nu#|oHaRWSP8nOANa+!>BxceD+_piDL=zev-AoDiaJHRyvp;j&^4`{CA?O(8l2siOu1hKE# zgA>pqz$H|C%K#uYT8UVPV%{BY=h?yIpyIknKjo6+x#t!geYVuH$TaRNRejX8O0{b{ zU*9eusp`ypW4_$<4j;qsUT?#kh{UFM711FLjb6u;k_%o zlE0ZEwkKo~d#HwHY~sPezJyX7?7ZBDEdi zL&5$I?1u+qdo;Cc2$JEJH1=JY2Y0F5b)I+5;ab4srzIv;FN;$^A-q>15y}b6+6a6f zzLRehKq5>5`0;ku0aeGn`BDz!wi6b!kXV5xrU3%&j!g;!ytohPa!a1TfV(RQ1sqD| zmG@8?>Q+LV=|Ez01JFr6(bJ~>b|?W-V!#X}TtKx++m`teh4}DU7|NV;WKPxvw#g{8 zVv_W*J~@-*-Jn%H00b9(GZCF?h~}~GYPbXfNziqht3WqBA&bMMLPWHir)O+qzt8}% zwL-G+z0X6AMPm*ZuE|a3WY$0nB<&Z^08+XQ4m60h<^6{Gg<7WH#Cv-aRp?Or0E@vg zc|B+_?!y$sH-h$M+pqHz5TgPr2F@e6BzI1+KmwI~aq~Ao%%%Z=(Qe|;BKKl#H$Zu=u z$%Ntu3GXZC+f{^0n{UqFcxTo9CdL$6ov`)eoV$LcBKTn<)`bf!+hR|JWXa4ITMed6 zjT_qfE`}EE!OK0$))_6s#*+bfL{>jOaEw1*JOqs_hvvPJ%4(IWTxx~N_VO4nF-$?d z60prKbKeH+Y;xwz^R>lVjeYT?T*x!#M@(vayb7y#BaW}yv>%XSk4JT5F7!#r|Y{bHXBh|?tC|#7|82(lRkX)P^GW$CqrP-b$%IZoHW2i#!D0$s$A6+yU z(j9)TvY@w#+vA~_HEku>G(pk;u!`(duI5HwkHJ+7*^%CXh`}u1&)Uh4`#&yr1z|s_ zIU-(=6@MWUbjOxhWr)3MLF%8jffgRm;*p}#Aebk$9b_+y+yv%zzJu-|(F6sI*;nri z7dGEaGAiGX#TUGLc=YtHfGr7Vt-G(0PYAFYe|r1}?EBBfrRC(aW-u_L!j%)oLf{yk z0eciSZRj=&sHLWW7D-M5J4{l?ZEQFOB!a$kd=+*BLw2kKfL)(KJ@%XMhYRyPYaZYg zUSy&N^q)#CF}_3$40_|X`}h_=N-p{Tj3j^wnbn@5L@29`68eP2f=g9ZG**;5S=?hU zT+Kjkv*@YYUgYSz^*J{8KyAi1%ijO>h%4C%yXJi(V`Iyn4(cbD*12rR<xcXZgHd5C?r1cl_#pEaWb`%fvs@q$RDTR>dtH4Bnr3%%$3M$5i zbaO^VtY4RA;^fiAnI+_xZtFKy@@}tLqq3Zp91-&9Ge$*6zf6iEg@^m|yRABJ?yFWh z;D8{Y$W9WtXf>hgE?VZJA9}a4{1+k`(214;3dTG!{uvpV!{eH}?Ula@IWJMb0Zqf| zp@i_0xdP4-w&j;}-*vCQvAzGjSS_D>Zm^7bcYjluuNHtn*Fg@Ol>4yQK=RT9g?=Ju zU)U(Gx)#U5U2gwZbLWM2b^yu(Xec<`rMKTqnW&T1ML&x);Gc?207Nw9gTHu)6kDyg z3qT;o`Y31v6#z3hB!+48Wm7-@S5`xGMvba(YH!vy8!m$**&L@0QVhDe?o@BJ6%cH} zneG>uK_NMK?}6`6R`R#Jh>>e9m0#l9c%#_3f0!RyqNUk=xXn5Waz&^4_Hc7L(xBOD z&R;V46(g_6z+togrL662#CDGpT)hbtO9|UITzCII_a#xc?$@(}!it;=KDZe*)HPS9 z${h*9*|=t7(p#)I?9c$d_vpnyuT;{{})zhx?eYTA| z9+#fich{U2U72%=&hR75THj#RZG`cS&-nTK1#QvZ_5K%B&szh!p!jO;iT)aJIT}9w zw6DH}LO4wKCDoEQ-a+FGe@>F(mL#*@OM~kx3h0#Id9i{NZWU76k~pu74QCD zb44LzB4%*Vr;^B>d*fJZJcc4wBcXCZ=Zi7yqc{d_T?G^WrWe46nP)4~Y)b46_m1W< zWa-uJQh5u2_64I`v+hU%{TAT6-~pya=FHZ0gihi<6L-BfWrS^;R9p<`a1H`1ZS4;S zCf+nfeVo>nButlnZ5M7ubGYlE$O%8S?&?$EnS}86|^A+Uid*JXP*rk zxkAI94I3+=FV8PuUy4wuH?3v&l!!W=K-l%)wQm_Nm0Iy8ak?{GY7h~ zo@4}Cw@2#3Z{6Y1?*oDciLsY@KBN^W2=b%q6ELbb!TZs2J4SkQ<=fHmgO2%s^@$@@ z%mroT2^iJhHrEa#LN?D(Q7rIHYeAJf&*=ER(WE1q=pa_f*hQVKsa~_O)k1I}L2|3w zT|P5>d(h1$64HNvK3pa8!-uM9e47fZx#DjZVxlH;6zq+Kr&j`*N5AWSRQOie`o*n| zCtN0E$4U9LYGA3pP*6+hJl?=PPGD7z3B#V}Oq^ciUp3f7l8a|WSBFq)UwGll|K0db1|FJ3i9Q7F4?S^SaK8|DEe%LS3w}i4J|H6_1kYMZA-*2QeU&$W;&tCv34IX&C<41@t zQRQNqGff>sht=t#u_|C-sH5*FZ%PhtNM^0ZfunttUsNZSg4bDA*ViSayp+wV^eI2T zE-fV`U+zbI#K;N?-?(ASyv@QPv=-ApULV>K2;K{k4D$Pzk|*kd-7CGD(olvloPpVB zmDu)LO~=tTIW2T!j#=L;349ccpMa2EE2~{%Gcxp!<&L;_F*u(B9KUp9ZPDQx2T1Dz z0l}nqvrBWdNZ@iv`!Qvc&Xs^XP!7N3#D4=oGPM_CH2MD3^z}ENhbhY?(>!R*yu?H_ z{_T%Sn<6>2!8Cb%;H6{+DQQG)@dbAIZ*@MAho#*96&$q$Nhx09Y@<7kVdwmsBK*pI{O7kfcoFfqEto>3nHkEhl+zF35HBz2d=1Uj4}cJC6Hv7rjp2VO!Aem7J*1b=9ouH6WqQdl zjT)Q+;?wbit_0>kSk+&_u;(o}9?DBw$FP{P1%NCV{eUu{lhdBE~=CkLqyv9 zTTU$Kst5+xG&@6tG|XGGXq9qUqP9xKE;~-CV>@aSpGvh;hocq{HuwcNiQ&cU zyTruTzZvY|oEfl6rbSp%Ibso!sJmGK>N_DnL^viFaIb>tl&+vouY787P3Z%NG>$Et z$Qf5lTvE7Q-D+!YgnZy{!yyBM*`7v4eii735*~GTW`4#cNRKg55vyx!?MCX$a!wSv zEN=Y;3A_f-l1_LoOj^3suK7%FsCn|xa#1>C3B+ISEDiQ58$p8@RL{x`8iM3JntbM4 z@Z=I8bq%66xWpfPi|MhW2dD1-Z^Qq8wzcchEs(z)o!I=sJ$o5)ZI|wWgF)YHo^QQ+ zc$Jt3od{2mR-=8qQlN|j9I1$AOC?Mf$ixvbloOBMlDHU~$sFtwr(@9;akBE*CoLpk zsUiDyXCl{DXOIN?h7pU^j;hgjTSC+KMn+tGe>6S*cXPYq62P%)+*ov)UjkA`aRn!} zYJ-B>`J}$bm92e7mrLw)pu?&9{D5XxessYQoD0V?m2nKSyCzg4=4>Lt8h39m=S-QvdV5er46X+y3ot6Vt(G*{#-w<_tcQI%FfwlFK% z-qHgg$qUP1e{$s3S$*ke$Twx-bF>~EB!>^->i%n4TrTpSsr;Jvmsf%)+Teh;AChl^ zkJ3*?Pd)}rZ}XfksVC4c|!r??E0<4EmCuR)Bg40h5{^w4bC*?MKunIgjnD&C&mq0VbTY zi+P<34dL`~dnw3VD>yJ5d;l!`+7vpSqX|EaH*8L?RwS!-Jns#Pk(^_3unArVub6Gw zt{|C#JY$kQH)s`Dp89rU%6<-SmkV&MYqj@lh&W6mp;XZ3MPiI?kRr@gt$+Pd1)w{3 zn*cLp=Jflho?*J4pP2{WR9Iq1n&esu%G|e2!{;T|OJ>Rn`?IwI1s58s+14}2E7l|9 zX1t{%7DEN9LX<|FY{ykiCRw|(R19>L$FxEhABU?XC*8yH#`X@p3~(wpGFbI;=fsk& zx0mQ5IveUPFIxjlWp@_Fx8%^X6a_tM8F5&2kn$zsW6p*Rqw9;6_t7|0QBOJvzc-jp z9(!9E3*J0hW@rq3s%?7->NO`KJST#4@Ye3QG2!5T#~Y!YsJc8-iKo;(E3mPJlEz%u zDpoGsyvx_g1YIs%L_tGbz;FX=$7w!a`uTw?Dn;&Y!?gtM@nQY83e8tuu9#Bsf9{m5}zR2 z*?_XgU8P9(3GZ>q(j4h7ev@_$OsMefRN@4x>X&E1T~6AX;TtViAf#E!4;cy=gWN0l z1wRJ`1-0dB{Uxz>hM6ms<}&)ver}x9Xq2`d2@;k}4ON?|wxnBkd9(!YIv$VAB`NLB zHf~dhcR($7k1LzZ#?=B6*~d%u4cAAHG*1?rJMtrHBTpteZ5(!dwr4XeWad_;E9_NI zV)aC7)F=C!*IfUar7@VLQI5+YLa6lEd)$c<^lHVl#<+e&!vT!M<02-K;CQxb5=nli z_ms|7HTX3Jyxp*zwRj89M->EmdroKd)^kJ(6L)Bc`BHI^E|3u9*6^mH4KrcX3^ z9hQo`*kH=K?|I$+n)v}WnQI9Lu_fZ^9|UJ|Nup=VW6$_aN{yu-8uv4^&&AKqeuWP6 zY&S5cKgk;t$)Xo9ub#x6*(f3P!jX!*$n@5TBh2S> zB&6{80_oEa$NSop7 zhMuiG9ds|IsOCm8RA??8tlS{Q!_%?joc(+Lv|#=UBq50Tk1;WCkAD7q!gYN_TS_v( z(4^WvAlrj@itfwOs?OT#c!43kqqE$EdCP~sJjbr!_Z`V7NxmJ_SHs>GMb^JMxjyjIf7pA#N99z0a%PsAd zH3}9PeMwLDVr=G1MyRcR;3W>}to{gJDVTLOt+LMfq5RPBF7)hVr>gjs*q={p{pfTWM@>a6a;oU@x3#ry*WUgW8@9!a2en^ariHYfp zK!rxE80DTn|0z+P?xe@t$^7q|a`siuTig0(4I9v~;s>;}{tRAH239MIgtr2?n3vW= ztkhj2+XmGAByy^&Iysyi78GVbnl-d%${-XQ`RrB?Af!iwO_T`JW#M}1oEy6NVQ7su zxR!`NRYBG9J3+thNRjsVa$k|7vQjc>GbzjcGpp%+eNED%@m&_j<|t0{d6z=-Yd<#+ zVlQ8CHNxgZWg4d=$`59?Xm(%UkZ9o1&F=KLA4H~%Ubd!HM4xZT0cKh5eSQPcd)P`FRi~SeYO{W38#5k)X67Eyw#-dSH{iA%{ z>m7Tgjfkfp_U>f|RY4TU9C-|4^J0Vxjz}8MO?gtcgl3H=Xnt@TTqmG+V#25SVjVqJ zk{u|bu5My9R>{5*9UmV*TI?wL&_Gcji#O<+&y+gJwUdSKheJ4F&0DTj(%&>BDRG%9 z*PA)dQZ-qu8eN`W6{Y`UIb3Sh(J8kM+7rI~^eZo6=-u454kz1rdRlvJ8eV5rh{mwCnSKJ-MDio9E^qY#4OdQI(c zV|G1T&3he(TwTX2#P1XhYT0yq0%9h4n)n1@Ci}52H~zFm7$GibQ$j@()Dl09>Zr_2 zUW)psX@SGR7(A~p8B9C^PCFSGS|`gwX2&%Cv;|$8?xqa3OuCfap>%89y6b`WjfTM4 zw!XnsJ%<&LA8jm8)C@7tn|Ra znsu|FPWJ0UMHmT0yb;HZHR`HBtkCoo5ug@5n*q*zE)zS)Th!U!xX|P~Jsq35ugqv&M5DOlg!AzxRMgvv67Ix$ODJ2)d@4&u=Y{Uou z9KgHY%e=t3FHdLKPi$2&g>@fg%J}=w^;A=;M{#lZ^J~4+KdLr4JKpOs>*}(G^cf8X zRlQ74~CKVX?9MskylzWOF;oLf|%tNW12l8_EB4x9c*3D5kMb z?;xy;L5bkfRb%op3lnHYuG}tXrhN*C4q7&wV3h*9^JZqNUfKg=T@e+`)sB-)+OY0x z36jz4CreA-*M^(R2-I#(Rul&O_+STW$>Ve3E9WOh%O7g0xg#Fwe|@C;52uCoW{Kne z_o%#|nF^4AK1$o9S;^GVOWvK4rJG)vB5CFEjVVmis+A8PnNEg^zh~E9yhOlm3K0bjqPPNfm@1|7)y92K(Ue9@fm3VpT+X~8rn1N!sUAkNein+WPd|z8 zv)H|@ITRunI%*6KiIrkmZ*&BRY2*44P4(3Kl{F}#e`W=&an=KJOO8tsBBkv^f# zekD@g3c5Anu5TYBGy$02U)iOtPzBXN)HW2$ryPd z^UGg2F-)5ccdZS>zmE%>GWo#6;7WdHGhI|4k-x_LQP7EMY8&gv&RYDvmzm{ z!gxP03Yd|o7iS0g-@e^ON`U;;&x<(f%fPzcl5ZnKY%BJsaoVuq?SL{LanTB+ru5Ri z)p70pF&wkbuXRZaLkqgQp~jz|bC)A$hPW6K1G4AN^2kHX-JrDgun#psDM%#m&5Ae3 zGB{R;+XAfI8RqORVCk51MPT9WF&oOhdv)j9} z!%g*dA+`y5wR;t@n1W?s#iwy^b(cLPIUIr}Sa{Z(*C^oO=yfR(LU|8mdAasOmdEmp z9To?*rDI1jHD2b>)~^Kp>8f5na0L~<1*%`7TEKnVmuW_82HnX#Qj(g%S+{;h>CC87 zz)#J`P33ep?wMda&}>#;s<{y5r;D8H&kNUdg237gJM9~Y4T9lU8(~Q_2Yk20671Eh zSM;it^!SWQ_-fp`*3ijpA*!ARLtrIT_l{)d1bR;27)|F{D1OnQ zgxqMJwLv|dpFqybW6Y|?Q{=}KWg&fqr&2-LHknkH((1z0J6NJ(?puA@_c>3>8=DAX zZa=vuKtJ&0M!=sk$W^$gH?t8UN`;iIFq*iyIQjN@Asq(?%?20Iweb>&?_4*i%tIl! zMg8u4CDaysZm(~}3*CvbIpi35+H#Opz(UXR*RXZ4=0laze+3AFRA}br=H%hIn=UkiL?n}`NdpnSBt8bfZ(tKr&K;USIbZ#|r)7vZ|D7M$v=D=Mk&!}nj zaPT8b_#F?DdBklg6LV{F(Bu2o84q$hTbv& z?+G%h&PQQ$q5?Hco6hqqvZDvU(3G31UB@B9ePcj4i`Xnk(X~^-(Z=>6Y2-sLqQI_y z<+BDGGoRkFd1CVg#Bmt{Phge@tGhOvl*%+}%q-?9&qfNx8ZsLR5TO>rdywTafmrW1 z*Dn}1fnu!u$R~F4=-rj&0lupn!z^c8%fUAL`{-uv+oG~Q^OFbu4R6P( zdA#ypM3yw`Yn1ZJXR8yuAmZ?yn3#}0f@tj6f^-PyAL$TK*sB?@uOL=jnLO8_DdK7U zW^QX+n^y}>4WXz%H?K+6fuY%^@JKUV!L+Z`T@G40Hph9>9#JPJCtm0lLm%bmT8qCu zb3tv*`Cch^K>sLm1q?pcew*ZO#K;&C-TAsepx5p9!)wyIjV`>Gj+VB4?5??m#m$QK z2#F~jV{|lXq?rGEK}$~Ns&IqB7^!Cmw9LAVE?cH29a(9#7E^E`xG9aAQ?S0S2vNPmpDJtr9omsgEHBNrLp%15Mm5PbZ4qug(M zDJ8jOOQ^zS=EU#pres zH%8=`*ISd}5YB!Raz?G-)!aoyT6OVBI?bygqqj%nZG%|XaQ|{E`S$?egk$;3w4}S& z7BF>sZ>o)nrW_cjH`!cqLyq|8MIdf#%dZj4yuNPZ)V#)`bDa5Xvw7UIiW}CoJevIi zw^*NK`lSDMU)hr%*|g_>Kbbl(vZxgW0j6EP-Wn*lvm35)28q;aXlCe3)+qq_Bk#UU zie&WLu|&;Peu3%fVx6~KAODOV5AMyB;KD9QBjx^b7d^RVN8~R1>Q?F54)y?b!Scoe zJVTfRd3S$1-(Py0|KK&oAL0{CxoR9Q^udi!tBB6%hTok{rE1Y9=zkfND_HZvl-XCB zZ+Ro7Bq)#W?d{z^yR^6{0x%claExEx@4x>q_z2zMF}uL{%iV`gg?P9m)eUr4xzCmq=B37 ze}xZm$C$o%#%LC+_N{)u$2 zarmRUU4BQ0J;)?qR_C9y6(oy9xoPu#kRTE3YTQ4>UH3?68r=qQ`txhN%0=h)5 z>^~BUKi3W}l|*ciwQv6LLfkqIAB$ckk6X7hqGlu%R9;?V2GbXIA=^a)!e#ZLu)PlO55pr(yo?NedT2PavZa6)nH{e=WJd_fl_y1neunwq$2S0W%0xq_^>_s(2SWHEtdq z*~*bf%$2owYnuIkBYY)ep2_b2?W$frV++<6WQ z5zF?9C8bNlkf+hy)$|%4LI++VcgKIGCzu5f^!6o;+>m#xKvNGt)ioGVtFp7ynh&h* z%aR#alRHCXsK}LEqn)Jw9%aH>b zDmshSOUU88Spo$I4b3)Y*Cz_mtDh)5paHiFmK4OENB?D9Y3YC`Q{sXkedZvcD|n%U zD1aX9eW4%Z*5Kf}eJ~x;fgmp40N91;56fh~WW}=P=bi^jtJTc8!W|GE`UEVVacc2k6*j}A0jsvasU7T literal 295093 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

  • 4Z?{^i~aUOh#L=aHP&pCZ(A5 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 L6c0V7eDD7NS81K= diff --git a/dev/img/hm-sensor-rows.html b/dev/img/hm-sensor-rows.html index 5e90eaf4..b8d26fd8 100644 --- a/dev/img/hm-sensor-rows.html +++ b/dev/img/hm-sensor-rows.html @@ -377,7 +377,7 @@ summary {

    Sensor Row Count per Time Segment For All Participants

    RAPIDS

    -

    23 March, 2021

    +

    28 June, 2021

    @@ -386,17 +386,17 @@ summary { .main-container {min-width:800px; max-width:100%;}
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/dev/img/hm-sensor-rows.png b/dev/img/hm-sensor-rows.png index c8c6cbcd5625fc6d927da4cecead97eff72a343a..68e802432fc78a321b5d24d31be78f69a7621dd2 100644 GIT binary patch literal 102313 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
      6|{TG{#ls5?&2u1C8L zq9nHr|E@<|%LL_4Vko+KS}6oUbfCUd23{J+NXB}uUIrngb@5COb=bT0Z})7t035+` z&17Q@nySc$>83RFakgkUfA+VDZu8t7F=i?SVHS{a&TCJ{xJoVvQFAMLH@LNm#XCsb zxjh##vGoS?8y1C}*w&HhT>#3{)r}7~5!4d}B!iBGz{cDWU}xx7hY*wCTK)^7kOXA> zMSWBs=W0LTEzYb%J7<5LJTY4DZjciV3$?#DH0iSQA+-(7I3ZjfCPaT9hwtQn-+B(} zMC9lydye+{O0Esk&6FQ)eub@|Mug3$vsYa}CK@QMU2NEBPOO4`MPsAS$O$FQg5R&| zHjb^*xk^l9!+cFN^H@$GN`ATjWf@OwcmR(js^-hk!KI}2%tGs0XqjiZDgT7Xw}xE5 z(!qi*-M*L^lbIM(Ah~&VK>Q(_H)Ptq*DBH7Z-L~ zG=U1(O;+`i!el`igX)#~C#A=ho}~*I4$VC2n@-r=Ilw-?(|SLrghcP>xYZ^tzmY( zvA?&ANs+x)mL2(OC+M0tpO>zC=ZwElM-ManYdYuC$c%Dc6=k*l7h?K}; zw$}nvLs(g2{L;olhiA>9!~i z{q9+`)F+e1#Cw(%8Hxx1Du?bi63M0A7-8Cz09vHVjN@M#2^9kXsp@{QT-fRjOcAo- z9w8e`GVmTSVPZf&hWf50%gPbpUv>`GO(|FtsIN`mJa3j4SbLX$ZCG%RuF~n2W;Llp z7fn9D70s%U>1n+D@l5E_c8RoXl2xgeLg2WncL)tYvWl`c_DjvDbW;_IA;{32O8C{? z)b%B0(MJ?|YdxZg*m5!L-Iak^I{ZzNxTE)C+8C*{!hi1v{s=uvPWDk;Q*p(lv;u1K z^|2l&feL*VkPEA_G)AdmsC%x{&g%rrH)Ⓢ*;aj`i=4;6`n|vcBZ6$Pi05$G2U9^ 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 XO2>rFh7_#>{|t3a&y}3H`rH2k;dDbJ diff --git a/dev/search/search_index.json b/dev/search/search_index.json index 100cbcda..f0a2b4f7 100644 --- a/dev/search/search_index.json +++ b/dev/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data, and structure your analysis into reproducible workflows. RAPIDS is open source, documented, multi-platform, modular, tested, and reproducible. At the moment, we support data streams logged by smartphones, Fitbit wearables, and Empatica wearables in collaboration with the DBDP . Where do I start? New to RAPIDS? Check our Overview + FAQ and minimal example Install , configure , and execute RAPIDS to extract and plot behavioral features Bugs should be reported on Github issues Questions, discussions, feature requests, and feedback can be posted on our Github discussions Keep up to date with our Twitter feed or Slack channel Do you want to modify or add new functionality to RAPIDS? Check our contributing guide Are you upgrading from RAPIDS 0.4.x or older? Follow this guide What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes, only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own data streams or behavioral features in R or Python, share them with the community, and keep authorship and citations. Time zone aware . Your data is adjusted to one or more time zones per participant. Flexible time segments . You can extract behavioral features on time windows of any length (e.g., 5 minutes, 3 hours, 2 days), on every day or particular days (e.g., weekends, Mondays, the 1 st of each month, etc.), or around events of interest (e.g., surveys or clinical relapses). Tested code . We are continually adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended, thanks to R and Python virtual environments. You can share your analysis code along with your publications without any overhead. Private . All your data is processed locally. Users and Contributors \u00b6 Community Contributors Many thanks to our community contributions and the whole team : Agam Kumar (CMU) Yasaman S. Sefidgar (University of Washington) Joe Kim (Duke University) Brinnae Bent (Duke University) Stephen Price (CMU) Neil Singh (University of Virginia) Many thanks to the researchers that made their work open source: Panda et al. paper Stachl et al. paper Doryab et al. paper Barnett et al. paper Canzian et al. paper Publications using RAPIDS Predicting Symptoms of Depression and Anxiety Using Smartphone and Wearable Data link Predicting Depression from Smartphone Behavioral Markers Using Machine Learning Methods, Hyper-parameter Optimization, and Feature Importance Analysis: An Exploratory Study link Digital Biomarkers of Symptom Burden Self-Reported by Perioperative Patients Undergoing Pancreatic Surgery: Prospective Longitudinal Study link An Automated Machine Learning Pipeline for Monitoring and Forecasting Mobile Health Data link","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data, and structure your analysis into reproducible workflows. RAPIDS is open source, documented, multi-platform, modular, tested, and reproducible. At the moment, we support data streams logged by smartphones, Fitbit wearables, and Empatica wearables in collaboration with the DBDP . Where do I start? New to RAPIDS? Check our Overview + FAQ and minimal example Install , configure , and execute RAPIDS to extract and plot behavioral features Bugs should be reported on Github issues Questions, discussions, feature requests, and feedback can be posted on our Github discussions Keep up to date with our Twitter feed or Slack channel Do you want to modify or add new functionality to RAPIDS? Check our contributing guide Are you upgrading from RAPIDS 0.4.x or older? Follow this guide","title":"Welcome to RAPIDS documentation"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes, only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own data streams or behavioral features in R or Python, share them with the community, and keep authorship and citations. Time zone aware . Your data is adjusted to one or more time zones per participant. Flexible time segments . You can extract behavioral features on time windows of any length (e.g., 5 minutes, 3 hours, 2 days), on every day or particular days (e.g., weekends, Mondays, the 1 st of each month, etc.), or around events of interest (e.g., surveys or clinical relapses). Tested code . We are continually adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended, thanks to R and Python virtual environments. You can share your analysis code along with your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#users-and-contributors","text":"Community Contributors Many thanks to our community contributions and the whole team : Agam Kumar (CMU) Yasaman S. Sefidgar (University of Washington) Joe Kim (Duke University) Brinnae Bent (Duke University) Stephen Price (CMU) Neil Singh (University of Virginia) Many thanks to the researchers that made their work open source: Panda et al. paper Stachl et al. paper Doryab et al. paper Barnett et al. paper Canzian et al. paper Publications using RAPIDS Predicting Symptoms of Depression and Anxiety Using Smartphone and Wearable Data link Predicting Depression from Smartphone Behavioral Markers Using Machine Learning Methods, Hyper-parameter Optimization, and Feature Importance Analysis: An Exploratory Study link Digital Biomarkers of Symptom Burden Self-Reported by Perioperative Patients Undergoing Pancreatic Surgery: Prospective Longitudinal Study link An Automated Machine Learning Pipeline for Monitoring and Forecasting Mobile Health Data link","title":"Users and Contributors"},{"location":"change-log/","text":"Change Log \u00b6 v1.3.0 \u00b6 Refactor PHONE_LOCATIONS DORYAB provider. Fix bugs and faster execution up to 30x New PHONE_KEYBOARD features Add a new strategy to infer home location that can handle multiple homes for the same participant Add module to exclude sleep episodes from steps intraday features Fix PID matching when joining data from multiple participants. Now, we can handle PIDS with an arbitrary format. Fix bug that did not correctly parse participants with more than 2 phones or more than 1 wearable Fix crash when no phone data yield is needed to process location data (ALL & GPS location providers) Remove location rows with the same timestamp based on their accuracy Fix PHONE_CONVERSATION bug that produced inaccurate ratio features when time segments were not daily. Other minor bug fixes v1.2.0 \u00b6 Sleep summary and intraday features are more consistent. Add wake and bedtime features for sleep summary data. Fix bugs with sleep PRICE features. Update home page Add contributing guide v1.1.1 \u00b6 Fix length of periodic segments on days with DLS Fix crash when scraping data for an app that does not exist Add tests for phone screen data v1.1.0 \u00b6 Add Fitbit calories intraday features v1.0.1 \u00b6 Fix crash in chunk_episodes of utils.py for multi time zone data Fix crash in BT Doryab provider when the number of clusters is 2 Fix Fitbit multi time zone inference from phone data (simplify) Fix missing columns when the input for phone data yield is empty Fix wrong date time labels for event segments for multi time zone data (all labels are computed based on a single tz) Fix periodic segment crash when there are no segments to assign (only affects wday, mday, qday, or yday) Fix crash in Analysis Workflow with new suffix in segments\u2019 labels v1.0.0 \u00b6 Add a new Overview page. You can extend RAPIDS with your own data streams . Data streams are data collected with other sensing apps besides AWARE (like Beiwe, mindLAMP), and stored in other data containers (databases, files) besides MySQL. Support to analyze Empatica wearable data (thanks to Joe Kim and Brinnae Bent from the DBDP ) Support to analyze AWARE data stored in CSV files and InfluxDB databases Support to analyze data collected over multiple time zones Support for sleep intraday features from the core team and also from the community (thanks to Stephen Price) Users can comment on the documentation (powered by utterances). SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT . Add RAPIDS new logo Move Citation and Minimal Example page to the Setup section Add config.yaml validation schema and documentation. Now it\u2019s more difficult to modify the config.yaml file with invalid values. Add new time at home Doryab location feature Add and home coordinates to the location data file so location providers can build features based on it. If you are migrating from RAPIDS 0.4.3 or older, check this guide v0.4.3 \u00b6 Fix bug when any of the rows from any sensor do not belong a time segment v0.4.2 \u00b6 Update battery testing Fix location processing bug when certain columns don\u2019t exist Fix HR intraday bug when minutesonZONE features were 0 Update FAQs Fix HR summary bug when restinghr=0 (ignore those rows) Fix ROG, location entropy and normalized entropy in Doryab location provider Remove sampling frequency dependance in Doryab location provider Update documentation of Doryab location provider Add new FITBIT_DATA_YIELD RAPIDS provider Deprecate Doryab circadian movement feature until it is fixed v0.4.1 \u00b6 Fix bug when no error message was displayed for an empty [PHONE_DATA_YIELD][SENSORS] when resampling location data v0.4.0 \u00b6 Add four new phone sensors that can be used for PHONE_DATA_YIELD Add code so new feature providers can be added for the new four sensors Add new clustering algorithm (OPTICS) for Doryab features Update default EPS parameter for Doryab location clustering Add clearer error message for invalid phone data yield sensors Add ALL_RESAMPLED flag and accuracy limit for location features Add FAQ about null characters in phone tables Reactivate light and wifi tests and update testing docs Fix bug when parsing Fitbit steps data Fix bugs when merging features from empty time segments Fix minor issues in the documentation v0.3.2 \u00b6 Update docker and linux instructions to use RSPM binary repo for for faster installation Update CI to create a release on a tagged push that passes the tests Clarify in DB credential configuration that we only support MySQL Add Windows installation instructions Fix bugs in the create_participants_file script Fix bugs in Fitbit data parsing. Fixed Doryab location features context of clustering. Fixed the wrong shifting while calculating distance in Doryab location features. Refactored the haversine function v0.3.1 \u00b6 Update installation docs for RAPIDS\u2019 docker container Fix example analysis use of accelerometer data in a plot Update FAQ Update minimal example documentation Minor doc updates v0.3.0 \u00b6 Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README v0.2.6 \u00b6 Fix old versions banner on nested pages v0.2.5 \u00b6 Fix docs deploy typo v0.2.4 \u00b6 Fix broken links in landing page and docs deploy v0.2.3 \u00b6 Fix participant IDS in the example analysis workflow v0.2.2 \u00b6 Fix readme link to docs v0.2.1 \u00b6 FIx link to the most recent version in the old version banner v0.2.0 \u00b6 Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item v0.1.0 \u00b6 New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"Change Log"},{"location":"change-log/#change-log","text":"","title":"Change Log"},{"location":"change-log/#v130","text":"Refactor PHONE_LOCATIONS DORYAB provider. Fix bugs and faster execution up to 30x New PHONE_KEYBOARD features Add a new strategy to infer home location that can handle multiple homes for the same participant Add module to exclude sleep episodes from steps intraday features Fix PID matching when joining data from multiple participants. Now, we can handle PIDS with an arbitrary format. Fix bug that did not correctly parse participants with more than 2 phones or more than 1 wearable Fix crash when no phone data yield is needed to process location data (ALL & GPS location providers) Remove location rows with the same timestamp based on their accuracy Fix PHONE_CONVERSATION bug that produced inaccurate ratio features when time segments were not daily. Other minor bug fixes","title":"v1.3.0"},{"location":"change-log/#v120","text":"Sleep summary and intraday features are more consistent. Add wake and bedtime features for sleep summary data. Fix bugs with sleep PRICE features. Update home page Add contributing guide","title":"v1.2.0"},{"location":"change-log/#v111","text":"Fix length of periodic segments on days with DLS Fix crash when scraping data for an app that does not exist Add tests for phone screen data","title":"v1.1.1"},{"location":"change-log/#v110","text":"Add Fitbit calories intraday features","title":"v1.1.0"},{"location":"change-log/#v101","text":"Fix crash in chunk_episodes of utils.py for multi time zone data Fix crash in BT Doryab provider when the number of clusters is 2 Fix Fitbit multi time zone inference from phone data (simplify) Fix missing columns when the input for phone data yield is empty Fix wrong date time labels for event segments for multi time zone data (all labels are computed based on a single tz) Fix periodic segment crash when there are no segments to assign (only affects wday, mday, qday, or yday) Fix crash in Analysis Workflow with new suffix in segments\u2019 labels","title":"v1.0.1"},{"location":"change-log/#v100","text":"Add a new Overview page. You can extend RAPIDS with your own data streams . Data streams are data collected with other sensing apps besides AWARE (like Beiwe, mindLAMP), and stored in other data containers (databases, files) besides MySQL. Support to analyze Empatica wearable data (thanks to Joe Kim and Brinnae Bent from the DBDP ) Support to analyze AWARE data stored in CSV files and InfluxDB databases Support to analyze data collected over multiple time zones Support for sleep intraday features from the core team and also from the community (thanks to Stephen Price) Users can comment on the documentation (powered by utterances). SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT . Add RAPIDS new logo Move Citation and Minimal Example page to the Setup section Add config.yaml validation schema and documentation. Now it\u2019s more difficult to modify the config.yaml file with invalid values. Add new time at home Doryab location feature Add and home coordinates to the location data file so location providers can build features based on it. If you are migrating from RAPIDS 0.4.3 or older, check this guide","title":"v1.0.0"},{"location":"change-log/#v043","text":"Fix bug when any of the rows from any sensor do not belong a time segment","title":"v0.4.3"},{"location":"change-log/#v042","text":"Update battery testing Fix location processing bug when certain columns don\u2019t exist Fix HR intraday bug when minutesonZONE features were 0 Update FAQs Fix HR summary bug when restinghr=0 (ignore those rows) Fix ROG, location entropy and normalized entropy in Doryab location provider Remove sampling frequency dependance in Doryab location provider Update documentation of Doryab location provider Add new FITBIT_DATA_YIELD RAPIDS provider Deprecate Doryab circadian movement feature until it is fixed","title":"v0.4.2"},{"location":"change-log/#v041","text":"Fix bug when no error message was displayed for an empty [PHONE_DATA_YIELD][SENSORS] when resampling location data","title":"v0.4.1"},{"location":"change-log/#v040","text":"Add four new phone sensors that can be used for PHONE_DATA_YIELD Add code so new feature providers can be added for the new four sensors Add new clustering algorithm (OPTICS) for Doryab features Update default EPS parameter for Doryab location clustering Add clearer error message for invalid phone data yield sensors Add ALL_RESAMPLED flag and accuracy limit for location features Add FAQ about null characters in phone tables Reactivate light and wifi tests and update testing docs Fix bug when parsing Fitbit steps data Fix bugs when merging features from empty time segments Fix minor issues in the documentation","title":"v0.4.0"},{"location":"change-log/#v032","text":"Update docker and linux instructions to use RSPM binary repo for for faster installation Update CI to create a release on a tagged push that passes the tests Clarify in DB credential configuration that we only support MySQL Add Windows installation instructions Fix bugs in the create_participants_file script Fix bugs in Fitbit data parsing. Fixed Doryab location features context of clustering. Fixed the wrong shifting while calculating distance in Doryab location features. Refactored the haversine function","title":"v0.3.2"},{"location":"change-log/#v031","text":"Update installation docs for RAPIDS\u2019 docker container Fix example analysis use of accelerometer data in a plot Update FAQ Update minimal example documentation Minor doc updates","title":"v0.3.1"},{"location":"change-log/#v030","text":"Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README","title":"v0.3.0"},{"location":"change-log/#v026","text":"Fix old versions banner on nested pages","title":"v0.2.6"},{"location":"change-log/#v025","text":"Fix docs deploy typo","title":"v0.2.5"},{"location":"change-log/#v024","text":"Fix broken links in landing page and docs deploy","title":"v0.2.4"},{"location":"change-log/#v023","text":"Fix participant IDS in the example analysis workflow","title":"v0.2.3"},{"location":"change-log/#v022","text":"Fix readme link to docs","title":"v0.2.2"},{"location":"change-log/#v021","text":"FIx link to the most recent version in the old version banner","title":"v0.2.1"},{"location":"change-log/#v020","text":"Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item","title":"v0.2.0"},{"location":"change-log/#v010","text":"New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"v0.1.0"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 DBDP (all Empatica sensors) \u00b6 If you computed features using the provider [DBDP] of any of the Empatica sensors (accelerometer, heart rate, temperature, EDA, BVP, IBI, tags) cite this paper in addition to RAPIDS. Bent et al. citation Bent, B., Wang, K., Grzesiak, E., Jiang, C., Qi, Y., Jiang, Y., Cho, P., Zingler, K., Ogbeide, F.I., Zhao, A., Runge, R., Sim, I., Dunn, J. (2020). The Digital Biomarker Discovery Pipeline: An open source software platform for the development of digital biomarkers using mHealth and wearables data. Journal of Clinical and Translational Science, 1-28. doi:10.1017/cts.2020.511 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Doryab (bluetooth) \u00b6 If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. In addition, if you used the SUN_LI_VEGA_STRATEGY strategy, cite this paper as well. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Sun et al. citation Sun S, Folarin AA, Ranjan Y, Rashid Z, Conde P, Stewart C, Cummins N, Matcham F, Dalla Costa G, Simblett S, Leocani L, Lamers F, S\u00f8rensen PS, Buron M, Zabalza A, Guerrero P\u00e9rez AI, Penninx BW, Siddi S, Haro JM, Myin-Germeys I, Rintala A, Wykes T, Narayan VA, Comi G, Hotopf M, Dobson RJ, RADAR-CNS Consortium. Using Smartphones and Wearable Devices to Monitor Behavioral Changes During COVID-19. J Med Internet Res 2020;22(9):e19992","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#dbdp-all-empatica-sensors","text":"If you computed features using the provider [DBDP] of any of the Empatica sensors (accelerometer, heart rate, temperature, EDA, BVP, IBI, tags) cite this paper in addition to RAPIDS. Bent et al. citation Bent, B., Wang, K., Grzesiak, E., Jiang, C., Qi, Y., Jiang, Y., Cho, P., Zingler, K., Ogbeide, F.I., Zhao, A., Runge, R., Sim, I., Dunn, J. (2020). The Digital Biomarker Discovery Pipeline: An open source software platform for the development of digital biomarkers using mHealth and wearables data. Journal of Clinical and Translational Science, 1-28. doi:10.1017/cts.2020.511","title":"DBDP (all Empatica sensors)"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#doryab-bluetooth","text":"If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394","title":"Doryab (bluetooth)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. In addition, if you used the SUN_LI_VEGA_STRATEGY strategy, cite this paper as well. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Sun et al. citation Sun S, Folarin AA, Ranjan Y, Rashid Z, Conde P, Stewart C, Cummins N, Matcham F, Dalla Costa G, Simblett S, Leocani L, Lamers F, S\u00f8rensen PS, Buron M, Zabalza A, Guerrero P\u00e9rez AI, Penninx BW, Siddi S, Haro JM, Myin-Germeys I, Rintala A, Wykes T, Narayan VA, Comi G, Hotopf M, Dobson RJ, RADAR-CNS Consortium. Using Smartphones and Wearable Devices to Monitor Behavioral Changes During COVID-19. J Med Internet Res 2020;22(9):e19992","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"common-errors/","text":"Common Errors \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R pull_phone_data or ./rapids -j1 -R pull_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [CONTAINER] of each sensor you activated in config.yaml match your database tables or files. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda Embedded nul in string \u00b6 Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: Remove the the null character from the conflictive table cell(s). You can adapt the following query on a MySQL server 8.0 or older update YOUR_TABLE set YOUR_COLUMN = regexp_replace ( YOUR_COLUMN , '\\0' , '' ); If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Linux: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/streams/pull_phone_data.R or src/data/streams/pull_fitbit_data.R and replace library(RMariaDB) with library(RMySQL) In the same file(s) replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group) There is no package called RMariaDB \u00b6 Problem You get the following error when executing RAPIDS: Error in library ( RMariaDB ) : there is no package called 'RMariaDB' Execution halted Solution In RAPIDS v0.1.0 we replaced RMySQL R package with RMariaDB , this error means your R virtual environment is out of date, to update it run snakemake -j1 renv_restore Unrecognized output timezone \u201cAmerica/New_York\u201d \u00b6 Problem When running RAPIDS with R 4.0.3 on MacOS on M1, lubridate may throw an error associated with the timezone. Error in C_force_tz ( time, tz = tzone, roll ) : CCTZ: Unrecognized output timezone: \"America/New_York\" Calls: get_timestamp_filter ... .parse_date_time -> .strptime -> force_tz -> C_force_tz Solution This is because R timezone library is not set. Please add Sys.setenv(\u201cTZDIR\u201d = file.path(R.home(), \u201cshare\u201d, \u201czoneinfo\u201d)) to the file active.R in renv folder to set the timezone library. For further details on how to test if TZDIR is properly set, please refer to https://github.com/tidyverse/lubridate/issues/928#issuecomment-720059233 . Unimplemented MAX_NO_FIELD_TYPES \u00b6 Problem You get the following error when downloading Fitbit data: Error: Unimplemented MAX_NO_FIELD_TYPES Execution halted Solution At the moment RMariaDB cannot handle MySQL columns of JSON type. Change the type of your Fitbit data column to longtext (note that the content will not change and will still be a JSON object just interpreted as a string). Running RAPIDS on Apple Silicon M1 Mac \u00b6 Problem You get the following error when installing pandoc or running rapids: MoSHI/rapids/renv/staging/1/00LOCK-KernSmooth/00new/KernSmooth/libs/KernSmooth.so: mach-0, but wrong architecture Solution As of Feb 2020 in M1 macs, R needs to be installed via brew under Rosetta (x86 arch) due to some incompatibility with selected R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. x86 homebrew should be installed in /usr/local/bin/brew , you can check which brew you are using by typing which brew . Then use x86 homebrew to install R and restore RAPIDS packages ( renv_restore ).","title":"Common Errors"},{"location":"common-errors/#common-errors","text":"","title":"Common Errors"},{"location":"common-errors/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"common-errors/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"common-errors/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R pull_phone_data or ./rapids -j1 -R pull_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"common-errors/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [CONTAINER] of each sensor you activated in config.yaml match your database tables or files.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"common-errors/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"common-errors/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"common-errors/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"common-errors/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"common-errors/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"common-errors/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"common-errors/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"common-errors/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"common-errors/#embedded-nul-in-string","text":"Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: Remove the the null character from the conflictive table cell(s). You can adapt the following query on a MySQL server 8.0 or older update YOUR_TABLE set YOUR_COLUMN = regexp_replace ( YOUR_COLUMN , '\\0' , '' ); If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Linux: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/streams/pull_phone_data.R or src/data/streams/pull_fitbit_data.R and replace library(RMariaDB) with library(RMySQL) In the same file(s) replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"Embedded nul in string"},{"location":"common-errors/#there-is-no-package-called-rmariadb","text":"Problem You get the following error when executing RAPIDS: Error in library ( RMariaDB ) : there is no package called 'RMariaDB' Execution halted Solution In RAPIDS v0.1.0 we replaced RMySQL R package with RMariaDB , this error means your R virtual environment is out of date, to update it run snakemake -j1 renv_restore","title":"There is no package called RMariaDB"},{"location":"common-errors/#unrecognized-output-timezone-americanew_york","text":"Problem When running RAPIDS with R 4.0.3 on MacOS on M1, lubridate may throw an error associated with the timezone. Error in C_force_tz ( time, tz = tzone, roll ) : CCTZ: Unrecognized output timezone: \"America/New_York\" Calls: get_timestamp_filter ... .parse_date_time -> .strptime -> force_tz -> C_force_tz Solution This is because R timezone library is not set. Please add Sys.setenv(\u201cTZDIR\u201d = file.path(R.home(), \u201cshare\u201d, \u201czoneinfo\u201d)) to the file active.R in renv folder to set the timezone library. For further details on how to test if TZDIR is properly set, please refer to https://github.com/tidyverse/lubridate/issues/928#issuecomment-720059233 .","title":"Unrecognized output timezone \"America/New_York\""},{"location":"common-errors/#unimplemented-max_no_field_types","text":"Problem You get the following error when downloading Fitbit data: Error: Unimplemented MAX_NO_FIELD_TYPES Execution halted Solution At the moment RMariaDB cannot handle MySQL columns of JSON type. Change the type of your Fitbit data column to longtext (note that the content will not change and will still be a JSON object just interpreted as a string).","title":"Unimplemented MAX_NO_FIELD_TYPES"},{"location":"common-errors/#running-rapids-on-apple-silicon-m1-mac","text":"Problem You get the following error when installing pandoc or running rapids: MoSHI/rapids/renv/staging/1/00LOCK-KernSmooth/00new/KernSmooth/libs/KernSmooth.so: mach-0, but wrong architecture Solution As of Feb 2020 in M1 macs, R needs to be installed via brew under Rosetta (x86 arch) due to some incompatibility with selected R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. x86 homebrew should be installed in /usr/local/bin/brew , you can check which brew you are using by typing which brew . Then use x86 homebrew to install R and restore RAPIDS packages ( renv_restore ).","title":"Running RAPIDS on Apple Silicon M1 Mac"},{"location":"contributing/","text":"Contributing \u00b6 Thank you for taking the time to contribute! All changes, small or big, are welcome, and regardless of who you are, we are always happy to work together to make your contribution as strong as possible. We follow the Covenant Code of Conduct , so we ask you to uphold it. Be kind to everyone in the community, and please report unacceptable behavior to moshiresearch@gmail.com . Questions, Feature Requests, and Discussions \u00b6 Post any questions, feature requests, or discussions in our GitHub Discussions tab . Bug Reports \u00b6 Report any bugs in our GithHub issue tracker keeping in mind to: Debug and simplify the problem to create a minimal example. For example, reduce the problem to a single participant, sensor, and a few rows of data. Provide a clear and succinct description of the problem (expected behavior vs. actual behavior). Attach your config.yaml , time segments file, and time zones file if appropriate. Attach test data if possible and any screenshots or extra resources that will help us debug the problem. Share the commit you are running: git rev-parse --short HEAD Share your OS version (e.g., Windows 10) Share the device/sensor you are processing (e.g., phone accelerometer) Documentation Contributions \u00b6 If you want to fix a typo or any other minor changes, you can edit the file online by clicking on the pencil icon at the top right of any page and opening a pull request using Github\u2019s website If your changes are more complex, clone RAPIDS\u2019 repository, setup the dev environment for our documentation with this tutorial , and submit any changes on a new feature branch following our git flow . Code Contributions \u00b6 Hints for any code changes To submit any new code, use a new feature branch following our git flow . If you neeed a new Python or R package in RAPIDS\u2019 virtual environments, follow this tutorial If you need to change the config.yaml you will need to update its validation schema with this tutorial New Data Streams \u00b6 New data containers. If you want to process data from a device RAPIDS supports ( see this table ) but it\u2019s stored in a database engine or file type we don\u2019t support yet, implement a new data stream container and format . You can copy and paste the format.yaml of one of the other streams of the device you are targeting. New sensing apps. If you want to add support for new smartphone sensing apps like Beiwe, implement a new data stream container and format . New wearable devices. If you want to add support for a new wearable, open a Github discussion , so we can add the necessary initial configuration files and code. New Behavioral Features \u00b6 If you want to add new behavioral features for mobile sensors RAPIDS already supports, follow this tutorial . A sensor is supported if it has a configuration section in config.yaml . If you want to add new behavioral features for mobile sensors RAPIDS does not support yet, open a Github discussion , so we can add the necessary initial configuration files and code. New Tests \u00b6 If you want to add new tests for existent behavioral features, follow this tutorial . New Visualizations \u00b6 Open a Github discussion , so we can add the necessary initial configuration files and code.","title":"Contributing"},{"location":"contributing/#contributing","text":"Thank you for taking the time to contribute! All changes, small or big, are welcome, and regardless of who you are, we are always happy to work together to make your contribution as strong as possible. We follow the Covenant Code of Conduct , so we ask you to uphold it. Be kind to everyone in the community, and please report unacceptable behavior to moshiresearch@gmail.com .","title":"Contributing"},{"location":"contributing/#questions-feature-requests-and-discussions","text":"Post any questions, feature requests, or discussions in our GitHub Discussions tab .","title":"Questions, Feature Requests, and Discussions"},{"location":"contributing/#bug-reports","text":"Report any bugs in our GithHub issue tracker keeping in mind to: Debug and simplify the problem to create a minimal example. For example, reduce the problem to a single participant, sensor, and a few rows of data. Provide a clear and succinct description of the problem (expected behavior vs. actual behavior). Attach your config.yaml , time segments file, and time zones file if appropriate. Attach test data if possible and any screenshots or extra resources that will help us debug the problem. Share the commit you are running: git rev-parse --short HEAD Share your OS version (e.g., Windows 10) Share the device/sensor you are processing (e.g., phone accelerometer)","title":"Bug Reports"},{"location":"contributing/#documentation-contributions","text":"If you want to fix a typo or any other minor changes, you can edit the file online by clicking on the pencil icon at the top right of any page and opening a pull request using Github\u2019s website If your changes are more complex, clone RAPIDS\u2019 repository, setup the dev environment for our documentation with this tutorial , and submit any changes on a new feature branch following our git flow .","title":"Documentation Contributions"},{"location":"contributing/#code-contributions","text":"Hints for any code changes To submit any new code, use a new feature branch following our git flow . If you neeed a new Python or R package in RAPIDS\u2019 virtual environments, follow this tutorial If you need to change the config.yaml you will need to update its validation schema with this tutorial","title":"Code Contributions"},{"location":"contributing/#new-data-streams","text":"New data containers. If you want to process data from a device RAPIDS supports ( see this table ) but it\u2019s stored in a database engine or file type we don\u2019t support yet, implement a new data stream container and format . You can copy and paste the format.yaml of one of the other streams of the device you are targeting. New sensing apps. If you want to add support for new smartphone sensing apps like Beiwe, implement a new data stream container and format . New wearable devices. If you want to add support for a new wearable, open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Data Streams"},{"location":"contributing/#new-behavioral-features","text":"If you want to add new behavioral features for mobile sensors RAPIDS already supports, follow this tutorial . A sensor is supported if it has a configuration section in config.yaml . If you want to add new behavioral features for mobile sensors RAPIDS does not support yet, open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Behavioral Features"},{"location":"contributing/#new-tests","text":"If you want to add new tests for existent behavioral features, follow this tutorial .","title":"New Tests"},{"location":"contributing/#new-visualizations","text":"Open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Visualizations"},{"location":"migrating-from-old-versions/","text":"Migration guides \u00b6 Migrating from RAPIDS 0.4.x or older \u00b6 There are four actions that you need to take if you were using RAPIDS 0.4.3 or older ( before Feb 9 th , 2021 ): Check the new Overview page Check the new Overview page. Hopefully, it is a better overview of RAPIDS and provides answers to Frequently Asked Questions. Deploy RAPIDS in a new folder Clone RAPIDS 1.x in a new folder (do not pull the updates in your current folder) Activate your conda environment Install renv again snakemake -j1 renv_install (for Ubuntu take advantage of the platform specific R renv instructions ) Restore renv packages snakemake -j1 renv_restore (for Ubuntu take advantage of the platform specific R renv instructions ) Move your participant files pxx.yaml to the new folder Move your time segment files to the new folder Move your .env file to the new folder Migrate your .env file to the new credentials.yaml format The .env file is not used anymore, the same credential groups are stored in credentials.yaml , migrate your .env file by running: python tools/update_format_env.py Reconfigure your config.yaml Reconfigure your config.yaml file by hand (don\u2019t copy and paste the old one). Some keys and values changed but the defaults should be compatible with the things you know from RAPIDS 0.x (see below). The most relevant changes to RAPIDS that you need to know about are: We introduced the concept of data streams RAPIDS abstracts sensor data logged by different devices, platforms and stored in different data containers as data streams . The default data stream for PHONE is aware_mysql , and the default for FITBIT is fitbitjson_mysql . This is compatible with the old functionality (AWARE and JSON Fitbit data stored in MySQL). These values are set in [PHONE_DATA_STREAMS][USE] and [FITBIT_DATA_STREAMS][USE] . You can add new data stream formats (sensing apps) and containers (database engines, file types, etc.). If you were processing your Fitbit data either in JSON or plain text (parsed) format, and it was stored in MySQL or CSV files, the changes that you made to your raw data will be compatible. Just choose fitbitjson_mysql , fitbitparsed_mysql , fitbitjson_csv , fitbitparsed_csv accordingly and set it in [FITBIT_DATA_STREAMS][USE] . In the future, you will not have to change your raw data; you will be able to just change column mappings/values in the data stream\u2019s format.yaml file. We introduced multiple time zones You can now process data from participants that visited multiple time zones. The default is still a single time zone (America/New_York). See how to handle multiple time zones The keyword multiple is now infer When processing data from smartphones, RAPIDS allows you to infer the OS of a smartphone by using the keyword multiple in the [PLATFORM] key of participant files. Now RAPIDS uses infer instead of multiple Nonetheless, multiple still works for backward compatibility. A global DATABASE_GROUP does not exist anymore There is no global DATABASE_GROUP anymore. Each data stream that needs credentials to connect to a database has its own DATABASE_GROUP config key . The groups are defined in credentials.yaml instead of the .env . [DEVICE_SENSOR][TABLE] is now [DEVICE_SENSOR][CONTAINER] We renamed the keys [DEVICE_SENSOR][TABLE] to [DEVICE_SENSOR][CONTAINER] to reflect that, with the introduction of data streams, they can point to a database table, file, or any other data container. Creating participant files from the AWARE_DEVICE_TABLE is deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions to create participant files from CSV files : SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT The attributes SCR_SCRIPT and SRC_LANGUAGE of every sensor PROVIDER are replaced by SRC_SCRIPT . SRC_SCRIPT is a relative path from the RAPIDS root folder to that provider\u2019s feature script. We did this to simplify and clarify where the features scripts are stored. There are no actions to take unless you created your own feature provider; update it with your feature script path. Migrating from RAPIDS beta \u00b6 If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the RAPIDS 0.1.0 right away, just take into account the following: Deploy RAPIDS in a new folder Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Move your old .env file Move your participant files Migrate your participant files You can migrate your old participant files to the new YAML format: python tools/update_format_participant_files.py Follow the new Configuration guide Follow the new Configuration guide Learn more about the new way to run RAPIDS Get familiar with the new way of Executing RAPIDS","title":"Migrating from an old version"},{"location":"migrating-from-old-versions/#migration-guides","text":"","title":"Migration guides"},{"location":"migrating-from-old-versions/#migrating-from-rapids-04x-or-older","text":"There are four actions that you need to take if you were using RAPIDS 0.4.3 or older ( before Feb 9 th , 2021 ): Check the new Overview page Check the new Overview page. Hopefully, it is a better overview of RAPIDS and provides answers to Frequently Asked Questions. Deploy RAPIDS in a new folder Clone RAPIDS 1.x in a new folder (do not pull the updates in your current folder) Activate your conda environment Install renv again snakemake -j1 renv_install (for Ubuntu take advantage of the platform specific R renv instructions ) Restore renv packages snakemake -j1 renv_restore (for Ubuntu take advantage of the platform specific R renv instructions ) Move your participant files pxx.yaml to the new folder Move your time segment files to the new folder Move your .env file to the new folder Migrate your .env file to the new credentials.yaml format The .env file is not used anymore, the same credential groups are stored in credentials.yaml , migrate your .env file by running: python tools/update_format_env.py Reconfigure your config.yaml Reconfigure your config.yaml file by hand (don\u2019t copy and paste the old one). Some keys and values changed but the defaults should be compatible with the things you know from RAPIDS 0.x (see below). The most relevant changes to RAPIDS that you need to know about are: We introduced the concept of data streams RAPIDS abstracts sensor data logged by different devices, platforms and stored in different data containers as data streams . The default data stream for PHONE is aware_mysql , and the default for FITBIT is fitbitjson_mysql . This is compatible with the old functionality (AWARE and JSON Fitbit data stored in MySQL). These values are set in [PHONE_DATA_STREAMS][USE] and [FITBIT_DATA_STREAMS][USE] . You can add new data stream formats (sensing apps) and containers (database engines, file types, etc.). If you were processing your Fitbit data either in JSON or plain text (parsed) format, and it was stored in MySQL or CSV files, the changes that you made to your raw data will be compatible. Just choose fitbitjson_mysql , fitbitparsed_mysql , fitbitjson_csv , fitbitparsed_csv accordingly and set it in [FITBIT_DATA_STREAMS][USE] . In the future, you will not have to change your raw data; you will be able to just change column mappings/values in the data stream\u2019s format.yaml file. We introduced multiple time zones You can now process data from participants that visited multiple time zones. The default is still a single time zone (America/New_York). See how to handle multiple time zones The keyword multiple is now infer When processing data from smartphones, RAPIDS allows you to infer the OS of a smartphone by using the keyword multiple in the [PLATFORM] key of participant files. Now RAPIDS uses infer instead of multiple Nonetheless, multiple still works for backward compatibility. A global DATABASE_GROUP does not exist anymore There is no global DATABASE_GROUP anymore. Each data stream that needs credentials to connect to a database has its own DATABASE_GROUP config key . The groups are defined in credentials.yaml instead of the .env . [DEVICE_SENSOR][TABLE] is now [DEVICE_SENSOR][CONTAINER] We renamed the keys [DEVICE_SENSOR][TABLE] to [DEVICE_SENSOR][CONTAINER] to reflect that, with the introduction of data streams, they can point to a database table, file, or any other data container. Creating participant files from the AWARE_DEVICE_TABLE is deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions to create participant files from CSV files : SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT The attributes SCR_SCRIPT and SRC_LANGUAGE of every sensor PROVIDER are replaced by SRC_SCRIPT . SRC_SCRIPT is a relative path from the RAPIDS root folder to that provider\u2019s feature script. We did this to simplify and clarify where the features scripts are stored. There are no actions to take unless you created your own feature provider; update it with your feature script path.","title":"Migrating from RAPIDS 0.4.x or older"},{"location":"migrating-from-old-versions/#migrating-from-rapids-beta","text":"If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the RAPIDS 0.1.0 right away, just take into account the following: Deploy RAPIDS in a new folder Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Move your old .env file Move your participant files Migrate your participant files You can migrate your old participant files to the new YAML format: python tools/update_format_participant_files.py Follow the new Configuration guide Follow the new Configuration guide Learn more about the new way to run RAPIDS Get familiar with the new way of Executing RAPIDS","title":"Migrating from RAPIDS beta"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Joe Kim \u00b6 About Personal Website Brinnae Bent \u00b6 About Personal Website Stephen Price \u00b6 About Carnegie Mellon University Neil Singh \u00b6 About University of Virginia Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#joe-kim","text":"About Personal Website","title":"Joe Kim"},{"location":"team/#brinnae-bent","text":"About Personal Website","title":"Brinnae Bent"},{"location":"team/#stephen-price","text":"About Carnegie Mellon University","title":"Stephen Price"},{"location":"team/#neil-singh","text":"About University of Virginia","title":"Neil Singh"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"datastreams/add-new-data-streams/","text":"Add New Data Streams \u00b6 A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . RAPIDS is agnostic to data streams\u2019 formats and container; see the Data Streams Introduction for a list of supported streams. A container is queried with an R or Python script that connects to the database, API or file where your stream\u2019s raw data is stored. A format is described using a format.yaml file that specifies how to map and mutate your stream\u2019s raw data to match the data and format RAPIDS needs. The most common cases when you would want to implement a new data stream are: You collected data with a mobile sensing app RAPIDS does not support yet. For example, Beiwe data stored in MySQL. You will need to define a new format file and a new container script. You collected data with a mobile sensing app RAPIDS supports, but this data is stored in a container that RAPIDS can\u2019t connect to yet. For example, AWARE data stored in PostgreSQL. In this case, you can reuse the format file of the aware_mysql stream, but you will need to implement a new container script. Hint Both the container.[R|py] and the format.yaml are stored in ./src/data/streams/[stream_name] where [stream_name] can be aware_mysql for example. Implement a Container \u00b6 The container script of a data stream can be implemented in R (strongly recommended) or python. This script must have two functions if you are implementing a stream for phone data or one function otherwise. The script can contain other auxiliary functions. First of all, add any parameters your script might need in config.yaml under (device)_DATA_STREAMS . These parameters will be available in the stream_parameters argument of the one or two functions you implement. For example, if you are adding support for Beiwe data stored in PostgreSQL and your container needs a set of credentials to connect to a database, your new data stream configuration would be: PHONE_DATA_STREAMS : USE : aware_python # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP beiwe_postgresql : DATABASE_GROUP : MY_GROUP # users define this group (user, password, host, etc.) in credentials.yaml Then implement one or both of the following functions: pull_data This function returns the data columns for a specific sensor and participant. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] sensor_container The value set by the user in any [DEVICE_SENSOR][CONTAINER] key of config.yaml . It can be a table, file path, or whatever data source you want to support that contains the data from a single sensor for all participants . For example, [PHONE_ACCELEROMETER][CONTAINER] device The device id that you need to get the data for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid columns A list of the columns that you need to get from sensor_container . You specify these columns in your stream\u2019s format.yaml Example This is the pull_data function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. pull_data <- function ( stream_parameters , device , sensor_container , columns ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP ) query <- paste0 ( \"SELECT \" , paste ( columns , collapse = \",\" ), \" FROM \" , sensor_container , \" WHERE device_id = '\" , device , \"'\" ) # Letting the user know what we are doing message ( paste0 ( \"Executing the following query to download data: \" , query )) sensor_data <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( sensor_data ) == 0 ) warning ( paste ( \"The device '\" , device , \"' did not have data in \" , sensor_container )) return ( sensor_data ) } infer_device_os Warning This function is only necessary for phone data streams. RAPIDS allows users to use the keyword infer (previously multiple ) to automatically infer the mobile Operative System a phone was running. If you have a way to infer the OS of a device id, implement this function. For example, for AWARE data we use the aware_device table. If you don\u2019t have a way to infer the OS, call stop(\"Error Message\") so other users know they can\u2019t use infer or the inference failed, and they have to assign the OS manually in the participant file. This function returns the operative system ( android or ios ) for a specific phone device id. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] device The device id that you need to infer the OS for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid Example This is the infer_device_os function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. infer_device_os <- function ( stream_parameters , device ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R group <- stream_parameters $ DATABASE_GROUP dbEngine <- dbConnect ( MariaDB (), default.file = \"./.env\" , group = group ) query <- paste0 ( \"SELECT device_id,brand FROM aware_device WHERE device_id = '\" , device , \"'\" ) message ( paste0 ( \"Executing the following query to infer phone OS: \" , query )) os <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( os ) > 0 ) return ( os %>% mutate ( os = ifelse ( brand == \"iPhone\" , \"ios\" , \"android\" )) %>% pull ( os )) else stop ( paste ( \"We cannot infer the OS of the following device id because it does not exist in the aware_device table:\" , device )) return ( os ) } Implement a Format \u00b6 A format file format.yaml describes the mapping between your stream\u2019s raw data and the data that RAPIDS needs. This file has a section per sensor (e.g. PHONE_ACCELEROMETER ), and each section has two attributes (keys): RAPIDS_COLUMN_MAPPINGS are mappings between the columns RAPIDS needs and the columns your raw data already has. The reserved keyword FLAG_TO_MUTATE flags columns that RAPIDS requires but that are not initially present in your container (database, CSV file). These columns have to be created by your mutation scripts. MUTATION . Sometimes your raw data needs to be transformed to match the format RAPIDS can handle (including creating columns marked as FLAG_TO_MUTATE ) COLUMN_MAPPINGS are mappings between the columns a mutation SCRIPT needs and the columns your raw data has. SCRIPTS are a collection of R or Python scripts that transform one or more raw data columns into the format RAPIDS needs. Hint [RAPIDS_COLUMN_MAPPINGS] and [MUTATE][COLUMN_MAPPINGS] have a key (left-hand side string) and a value (right-hand side string). The values are the names used to pulled columns from a container (e.g., columns in a database table). All values are renamed to their keys in lower case. The renamed columns are sent to every mutation script within the data argument, and the final output is the input RAPIDS process further. For example, let\u2019s assume we are implementing beiwe_mysql and defining the following format for PHONE_FAKESENSOR : PHONE_FAKESENSOR : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID MAGNITUDE_SQUARED : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : MAGNITUDE : beiwe_value SCRIPTS : - src/data/streams/mutations/phone/square_magnitude.py RAPIDS will: Download beiwe_timestamp , beiwe_deviceID , and beiwe_value from the container of beiwe_mysql (MySQL DB) Rename these columns to timestamp , device_id , and magnitude , respectively. Execute square_magnitude.py with a data frame as an argument containing the renamed columns. This script will square magnitude and rename it to magnitude_squared Verify the data frame returned by square_magnitude.py has the columns RAPIDS needs timestamp , device_id , and magnitude_squared . Use this data frame as the input to be processed in the pipeline. Note that although RAPIDS_COLUMN_MAPPINGS and [MUTATE][COLUMN_MAPPINGS] keys are in capital letters for readability (e.g. MAGNITUDE_SQUARED ), the names of the final columns you mutate in your scripts should be lower case. Let\u2019s explain in more depth this column mapping with examples. Name mapping \u00b6 The mapping for some sensors is straightforward. For example, accelerometer data most of the time has a timestamp, three axes (x,y,z), and a device id that produced it. AWARE and a different sensing app like Beiwe likely logged accelerometer data in the same way but with different column names. In this case, we only need to match Beiwe data columns to RAPIDS columns one-to-one: PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : beiwe_x DOUBLE_VALUES_1 : beiwe_y DOUBLE_VALUES_2 : beiwe_z MUTATE : COLUMN_MAPPINGS : SCRIPTS : # it's ok if this is empty Value mapping \u00b6 For some sensors, we need to map column names and values. For example, screen data has ON and OFF events; let\u2019s suppose Beiwe represents an ON event with the number 1, but RAPIDS identifies ON events with the number 2 . In this case, we need to mutate the raw data coming from Beiwe and replace all 1 s with 2 s. We do this by listing one or more R or Python scripts in MUTATION_SCRIPTS that will be executed in order. We usually store all mutation scripts under src/data/streams/mutations/[device]/[platform]/ and they can be reused across data streams. PHONE_SCREEN : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID EVENT : beiwe_event MUTATE : COLUMN_MAPPINGS : SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_screen_map.py Hint A MUTATION_SCRIPT can also be used to clean/preprocess your data before extracting behavioral features. A mutation script has to have a main function that receives two arguments, data and stream_parameters . The stream_parameters argument contains the config.yaml key/values of your data stream (this is the same argument that your container.[py|R] script receives, see Implement a Container ). python Example of a python mutation script import pandas as pd def main ( data , stream_parameters ): # mutate data return ( data ) R Example of a R mutation script source ( \"renv/activate.R\" ) # needed to use RAPIDS renv environment library ( dplyr ) main <- function ( data , stream_parameters ){ # mutate data return ( data ) } Complex mapping \u00b6 Sometimes, your raw data doesn\u2019t even have the same columns RAPIDS expects for a sensor. For example, let\u2019s pretend Beiwe stores PHONE_ACCELEROMETER axis data in a single column called acc_col instead of three. You have to create a MUTATION_SCRIPT to split acc_col into three columns x , y , and z . For this, you mark the three axes columns RAPIDS needs in [RAPIDS_COLUMN_MAPPINGS] with the word FLAG_TO_MUTATE , map acc_col in [MUTATION][COLUMN_MAPPINGS] , and list a Python script under [MUTATION][SCRIPTS] with the code to split acc_col . See an example below. RAPIDS expects that every column mapped as FLAG_TO_MUTATE will be generated by your mutation script, so it won\u2019t try to retrieve them from your container (database, CSV file, etc.). In our example, acc_col will be fetched from the stream\u2019s container and renamed to JOINED_AXES because beiwe_split_acc.py will split it into double_values_0 , double_values_1 , and double_values_2 . PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : FLAG_TO_MUTATE DOUBLE_VALUES_1 : FLAG_TO_MUTATE DOUBLE_VALUES_2 : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : JOINED_AXES : acc_col SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_split_acc.py This is a draft of beiwe_split_acc.py MUTATION_SCRIPT : import pandas as pd def main ( data , stream_parameters ): # data has the acc_col # split acc_col into three columns: double_values_0, double_values_1, double_values_2 to match RAPIDS format # remove acc_col since we don't need it anymore return ( data ) OS complex mapping \u00b6 There is a special case for a complex mapping scenario for smartphone data streams. The Android and iOS sensor APIs return data in different formats for certain sensors (like screen, activity recognition, battery, among others). In case you didn\u2019t notice, the examples we have used so far are grouped under an ANDROID key, which means they will be applied to data collected by Android phones. Additionally, each sensor has an IOS key for a similar purpose. We use the complex mapping described above to transform iOS data into an Android format (it\u2019s always iOS to Android and any new phone data stream must do the same). For example, this is the format.yaml key for PHONE_ACTVITY_RECOGNITION . Note that the ANDROID mapping is simple (one-to-one) but the IOS mapping is complex with three FLAG_TO_MUTATE columns, two [MUTATE][COLUMN_MAPPINGS] mappings, and one [MUTATION][SCRIPT] . PHONE_ACTIVITY_RECOGNITION : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : activity_type ACTIVITY_NAME : activity_name CONFIDENCE : confidence MUTATION : COLUMN_MAPPINGS : SCRIPTS : IOS : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : FLAG_TO_MUTATE ACTIVITY_NAME : FLAG_TO_MUTATE CONFIDENCE : FLAG_TO_MUTATE MUTATION : COLUMN_MAPPINGS : ACTIVITIES : activities CONFIDENCE : confidence SCRIPTS : - \"src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R\" Example activity_recogniton_ios_unification.R In this MUTATION_SCRIPT we create ACTIVITY_NAME and ACTIVITY_TYPE based on activities , and map confidence iOS values to Android values. source ( \"renv/activate.R\" ) library ( \"dplyr\" , warn.conflicts = F ) library ( stringr ) clean_ios_activity_column <- function ( ios_gar ){ ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = '(\"|\\\\[|\\\\])' , replacement = \"\" )) existent_multiple_activities <- ios_gar %>% filter ( str_detect ( activities , \",\" )) %>% group_by ( activities ) %>% summarise ( mutiple_activities = unique ( activities ), .groups = \"drop_last\" ) %>% pull ( mutiple_activities ) known_multiple_activities <- c ( \"stationary,automotive\" ) unkown_multiple_actvities <- setdiff ( existent_multiple_activities , known_multiple_activities ) if ( length ( unkown_multiple_actvities ) > 0 ){ stop ( paste0 ( \"There are unkwown combinations of ios activities, you need to implement the decision of the ones to keep: \" , unkown_multiple_actvities )) } ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = \"stationary,automotive\" , replacement = \"automotive\" )) return ( ios_gar ) } unify_ios_activity_recognition <- function ( ios_gar ){ # We only need to unify Google Activity Recognition data for iOS # discard rows where activities column is blank ios_gar <- ios_gar [ - which ( ios_gar $ activities == \"\" ), ] # clean \"activities\" column of ios_gar ios_gar <- clean_ios_activity_column ( ios_gar ) # make it compatible with android version: generate \"activity_name\" and \"activity_type\" columns ios_gar <- ios_gar %>% mutate ( activity_name = case_when ( activities == \"automotive\" ~ \"in_vehicle\" , activities == \"cycling\" ~ \"on_bicycle\" , activities == \"walking\" ~ \"walking\" , activities == \"running\" ~ \"running\" , activities == \"stationary\" ~ \"still\" ), activity_type = case_when ( activities == \"automotive\" ~ 0 , activities == \"cycling\" ~ 1 , activities == \"walking\" ~ 7 , activities == \"running\" ~ 8 , activities == \"stationary\" ~ 3 , activities == \"unknown\" ~ 4 ), confidence = case_when ( confidence == 0 ~ 0 , confidence == 1 ~ 50 , confidence == 2 ~ 100 ) ) %>% select ( - activities ) return ( ios_gar ) } main <- function ( data , stream_parameters ){ return ( unify_ios_activity_recognition ( data , stream_parameters )) }","title":"Add New Data Streams"},{"location":"datastreams/add-new-data-streams/#add-new-data-streams","text":"A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . RAPIDS is agnostic to data streams\u2019 formats and container; see the Data Streams Introduction for a list of supported streams. A container is queried with an R or Python script that connects to the database, API or file where your stream\u2019s raw data is stored. A format is described using a format.yaml file that specifies how to map and mutate your stream\u2019s raw data to match the data and format RAPIDS needs. The most common cases when you would want to implement a new data stream are: You collected data with a mobile sensing app RAPIDS does not support yet. For example, Beiwe data stored in MySQL. You will need to define a new format file and a new container script. You collected data with a mobile sensing app RAPIDS supports, but this data is stored in a container that RAPIDS can\u2019t connect to yet. For example, AWARE data stored in PostgreSQL. In this case, you can reuse the format file of the aware_mysql stream, but you will need to implement a new container script. Hint Both the container.[R|py] and the format.yaml are stored in ./src/data/streams/[stream_name] where [stream_name] can be aware_mysql for example.","title":"Add New Data Streams"},{"location":"datastreams/add-new-data-streams/#implement-a-container","text":"The container script of a data stream can be implemented in R (strongly recommended) or python. This script must have two functions if you are implementing a stream for phone data or one function otherwise. The script can contain other auxiliary functions. First of all, add any parameters your script might need in config.yaml under (device)_DATA_STREAMS . These parameters will be available in the stream_parameters argument of the one or two functions you implement. For example, if you are adding support for Beiwe data stored in PostgreSQL and your container needs a set of credentials to connect to a database, your new data stream configuration would be: PHONE_DATA_STREAMS : USE : aware_python # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP beiwe_postgresql : DATABASE_GROUP : MY_GROUP # users define this group (user, password, host, etc.) in credentials.yaml Then implement one or both of the following functions: pull_data This function returns the data columns for a specific sensor and participant. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] sensor_container The value set by the user in any [DEVICE_SENSOR][CONTAINER] key of config.yaml . It can be a table, file path, or whatever data source you want to support that contains the data from a single sensor for all participants . For example, [PHONE_ACCELEROMETER][CONTAINER] device The device id that you need to get the data for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid columns A list of the columns that you need to get from sensor_container . You specify these columns in your stream\u2019s format.yaml Example This is the pull_data function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. pull_data <- function ( stream_parameters , device , sensor_container , columns ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP ) query <- paste0 ( \"SELECT \" , paste ( columns , collapse = \",\" ), \" FROM \" , sensor_container , \" WHERE device_id = '\" , device , \"'\" ) # Letting the user know what we are doing message ( paste0 ( \"Executing the following query to download data: \" , query )) sensor_data <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( sensor_data ) == 0 ) warning ( paste ( \"The device '\" , device , \"' did not have data in \" , sensor_container )) return ( sensor_data ) } infer_device_os Warning This function is only necessary for phone data streams. RAPIDS allows users to use the keyword infer (previously multiple ) to automatically infer the mobile Operative System a phone was running. If you have a way to infer the OS of a device id, implement this function. For example, for AWARE data we use the aware_device table. If you don\u2019t have a way to infer the OS, call stop(\"Error Message\") so other users know they can\u2019t use infer or the inference failed, and they have to assign the OS manually in the participant file. This function returns the operative system ( android or ios ) for a specific phone device id. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] device The device id that you need to infer the OS for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid Example This is the infer_device_os function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. infer_device_os <- function ( stream_parameters , device ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R group <- stream_parameters $ DATABASE_GROUP dbEngine <- dbConnect ( MariaDB (), default.file = \"./.env\" , group = group ) query <- paste0 ( \"SELECT device_id,brand FROM aware_device WHERE device_id = '\" , device , \"'\" ) message ( paste0 ( \"Executing the following query to infer phone OS: \" , query )) os <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( os ) > 0 ) return ( os %>% mutate ( os = ifelse ( brand == \"iPhone\" , \"ios\" , \"android\" )) %>% pull ( os )) else stop ( paste ( \"We cannot infer the OS of the following device id because it does not exist in the aware_device table:\" , device )) return ( os ) }","title":"Implement a Container"},{"location":"datastreams/add-new-data-streams/#implement-a-format","text":"A format file format.yaml describes the mapping between your stream\u2019s raw data and the data that RAPIDS needs. This file has a section per sensor (e.g. PHONE_ACCELEROMETER ), and each section has two attributes (keys): RAPIDS_COLUMN_MAPPINGS are mappings between the columns RAPIDS needs and the columns your raw data already has. The reserved keyword FLAG_TO_MUTATE flags columns that RAPIDS requires but that are not initially present in your container (database, CSV file). These columns have to be created by your mutation scripts. MUTATION . Sometimes your raw data needs to be transformed to match the format RAPIDS can handle (including creating columns marked as FLAG_TO_MUTATE ) COLUMN_MAPPINGS are mappings between the columns a mutation SCRIPT needs and the columns your raw data has. SCRIPTS are a collection of R or Python scripts that transform one or more raw data columns into the format RAPIDS needs. Hint [RAPIDS_COLUMN_MAPPINGS] and [MUTATE][COLUMN_MAPPINGS] have a key (left-hand side string) and a value (right-hand side string). The values are the names used to pulled columns from a container (e.g., columns in a database table). All values are renamed to their keys in lower case. The renamed columns are sent to every mutation script within the data argument, and the final output is the input RAPIDS process further. For example, let\u2019s assume we are implementing beiwe_mysql and defining the following format for PHONE_FAKESENSOR : PHONE_FAKESENSOR : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID MAGNITUDE_SQUARED : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : MAGNITUDE : beiwe_value SCRIPTS : - src/data/streams/mutations/phone/square_magnitude.py RAPIDS will: Download beiwe_timestamp , beiwe_deviceID , and beiwe_value from the container of beiwe_mysql (MySQL DB) Rename these columns to timestamp , device_id , and magnitude , respectively. Execute square_magnitude.py with a data frame as an argument containing the renamed columns. This script will square magnitude and rename it to magnitude_squared Verify the data frame returned by square_magnitude.py has the columns RAPIDS needs timestamp , device_id , and magnitude_squared . Use this data frame as the input to be processed in the pipeline. Note that although RAPIDS_COLUMN_MAPPINGS and [MUTATE][COLUMN_MAPPINGS] keys are in capital letters for readability (e.g. MAGNITUDE_SQUARED ), the names of the final columns you mutate in your scripts should be lower case. Let\u2019s explain in more depth this column mapping with examples.","title":"Implement a Format"},{"location":"datastreams/add-new-data-streams/#name-mapping","text":"The mapping for some sensors is straightforward. For example, accelerometer data most of the time has a timestamp, three axes (x,y,z), and a device id that produced it. AWARE and a different sensing app like Beiwe likely logged accelerometer data in the same way but with different column names. In this case, we only need to match Beiwe data columns to RAPIDS columns one-to-one: PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : beiwe_x DOUBLE_VALUES_1 : beiwe_y DOUBLE_VALUES_2 : beiwe_z MUTATE : COLUMN_MAPPINGS : SCRIPTS : # it's ok if this is empty","title":"Name mapping"},{"location":"datastreams/add-new-data-streams/#value-mapping","text":"For some sensors, we need to map column names and values. For example, screen data has ON and OFF events; let\u2019s suppose Beiwe represents an ON event with the number 1, but RAPIDS identifies ON events with the number 2 . In this case, we need to mutate the raw data coming from Beiwe and replace all 1 s with 2 s. We do this by listing one or more R or Python scripts in MUTATION_SCRIPTS that will be executed in order. We usually store all mutation scripts under src/data/streams/mutations/[device]/[platform]/ and they can be reused across data streams. PHONE_SCREEN : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID EVENT : beiwe_event MUTATE : COLUMN_MAPPINGS : SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_screen_map.py Hint A MUTATION_SCRIPT can also be used to clean/preprocess your data before extracting behavioral features. A mutation script has to have a main function that receives two arguments, data and stream_parameters . The stream_parameters argument contains the config.yaml key/values of your data stream (this is the same argument that your container.[py|R] script receives, see Implement a Container ). python Example of a python mutation script import pandas as pd def main ( data , stream_parameters ): # mutate data return ( data ) R Example of a R mutation script source ( \"renv/activate.R\" ) # needed to use RAPIDS renv environment library ( dplyr ) main <- function ( data , stream_parameters ){ # mutate data return ( data ) }","title":"Value mapping"},{"location":"datastreams/add-new-data-streams/#complex-mapping","text":"Sometimes, your raw data doesn\u2019t even have the same columns RAPIDS expects for a sensor. For example, let\u2019s pretend Beiwe stores PHONE_ACCELEROMETER axis data in a single column called acc_col instead of three. You have to create a MUTATION_SCRIPT to split acc_col into three columns x , y , and z . For this, you mark the three axes columns RAPIDS needs in [RAPIDS_COLUMN_MAPPINGS] with the word FLAG_TO_MUTATE , map acc_col in [MUTATION][COLUMN_MAPPINGS] , and list a Python script under [MUTATION][SCRIPTS] with the code to split acc_col . See an example below. RAPIDS expects that every column mapped as FLAG_TO_MUTATE will be generated by your mutation script, so it won\u2019t try to retrieve them from your container (database, CSV file, etc.). In our example, acc_col will be fetched from the stream\u2019s container and renamed to JOINED_AXES because beiwe_split_acc.py will split it into double_values_0 , double_values_1 , and double_values_2 . PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : FLAG_TO_MUTATE DOUBLE_VALUES_1 : FLAG_TO_MUTATE DOUBLE_VALUES_2 : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : JOINED_AXES : acc_col SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_split_acc.py This is a draft of beiwe_split_acc.py MUTATION_SCRIPT : import pandas as pd def main ( data , stream_parameters ): # data has the acc_col # split acc_col into three columns: double_values_0, double_values_1, double_values_2 to match RAPIDS format # remove acc_col since we don't need it anymore return ( data )","title":"Complex mapping"},{"location":"datastreams/add-new-data-streams/#os-complex-mapping","text":"There is a special case for a complex mapping scenario for smartphone data streams. The Android and iOS sensor APIs return data in different formats for certain sensors (like screen, activity recognition, battery, among others). In case you didn\u2019t notice, the examples we have used so far are grouped under an ANDROID key, which means they will be applied to data collected by Android phones. Additionally, each sensor has an IOS key for a similar purpose. We use the complex mapping described above to transform iOS data into an Android format (it\u2019s always iOS to Android and any new phone data stream must do the same). For example, this is the format.yaml key for PHONE_ACTVITY_RECOGNITION . Note that the ANDROID mapping is simple (one-to-one) but the IOS mapping is complex with three FLAG_TO_MUTATE columns, two [MUTATE][COLUMN_MAPPINGS] mappings, and one [MUTATION][SCRIPT] . PHONE_ACTIVITY_RECOGNITION : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : activity_type ACTIVITY_NAME : activity_name CONFIDENCE : confidence MUTATION : COLUMN_MAPPINGS : SCRIPTS : IOS : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : FLAG_TO_MUTATE ACTIVITY_NAME : FLAG_TO_MUTATE CONFIDENCE : FLAG_TO_MUTATE MUTATION : COLUMN_MAPPINGS : ACTIVITIES : activities CONFIDENCE : confidence SCRIPTS : - \"src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R\" Example activity_recogniton_ios_unification.R In this MUTATION_SCRIPT we create ACTIVITY_NAME and ACTIVITY_TYPE based on activities , and map confidence iOS values to Android values. source ( \"renv/activate.R\" ) library ( \"dplyr\" , warn.conflicts = F ) library ( stringr ) clean_ios_activity_column <- function ( ios_gar ){ ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = '(\"|\\\\[|\\\\])' , replacement = \"\" )) existent_multiple_activities <- ios_gar %>% filter ( str_detect ( activities , \",\" )) %>% group_by ( activities ) %>% summarise ( mutiple_activities = unique ( activities ), .groups = \"drop_last\" ) %>% pull ( mutiple_activities ) known_multiple_activities <- c ( \"stationary,automotive\" ) unkown_multiple_actvities <- setdiff ( existent_multiple_activities , known_multiple_activities ) if ( length ( unkown_multiple_actvities ) > 0 ){ stop ( paste0 ( \"There are unkwown combinations of ios activities, you need to implement the decision of the ones to keep: \" , unkown_multiple_actvities )) } ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = \"stationary,automotive\" , replacement = \"automotive\" )) return ( ios_gar ) } unify_ios_activity_recognition <- function ( ios_gar ){ # We only need to unify Google Activity Recognition data for iOS # discard rows where activities column is blank ios_gar <- ios_gar [ - which ( ios_gar $ activities == \"\" ), ] # clean \"activities\" column of ios_gar ios_gar <- clean_ios_activity_column ( ios_gar ) # make it compatible with android version: generate \"activity_name\" and \"activity_type\" columns ios_gar <- ios_gar %>% mutate ( activity_name = case_when ( activities == \"automotive\" ~ \"in_vehicle\" , activities == \"cycling\" ~ \"on_bicycle\" , activities == \"walking\" ~ \"walking\" , activities == \"running\" ~ \"running\" , activities == \"stationary\" ~ \"still\" ), activity_type = case_when ( activities == \"automotive\" ~ 0 , activities == \"cycling\" ~ 1 , activities == \"walking\" ~ 7 , activities == \"running\" ~ 8 , activities == \"stationary\" ~ 3 , activities == \"unknown\" ~ 4 ), confidence = case_when ( confidence == 0 ~ 0 , confidence == 1 ~ 50 , confidence == 2 ~ 100 ) ) %>% select ( - activities ) return ( ios_gar ) } main <- function ( data , stream_parameters ){ return ( unify_ios_activity_recognition ( data , stream_parameters )) }","title":"OS complex mapping"},{"location":"datastreams/aware-csv/","text":"aware_csv \u00b6 This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in CSV files. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . See examples in the CSV files inside rapids_example_csv.zip Example of a valid CSV file \"_id\",\"timestamp\",\"device_id\",\"activities\",\"confidence\",\"stationary\",\"walking\",\"running\",\"automotive\",\"cycling\",\"unknown\",\"label\" 1,1587528000000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"\" 2,1587528060000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 3,1587528120000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 4,1587528180000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 5,1587528240000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 6,1587528300000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 7,1587528360000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" Container \u00b6 A CSV file per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_csv/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_csv"},{"location":"datastreams/aware-csv/#aware_csv","text":"This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in CSV files. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . See examples in the CSV files inside rapids_example_csv.zip Example of a valid CSV file \"_id\",\"timestamp\",\"device_id\",\"activities\",\"confidence\",\"stationary\",\"walking\",\"running\",\"automotive\",\"cycling\",\"unknown\",\"label\" 1,1587528000000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"\" 2,1587528060000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 3,1587528120000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 4,1587528180000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 5,1587528240000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 6,1587528300000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 7,1587528360000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\"","title":"aware_csv"},{"location":"datastreams/aware-csv/#container","text":"A CSV file per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_csv/container.R","title":"Container"},{"location":"datastreams/aware-csv/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/aware-influxdb/","text":"aware_influxdb (beta) \u00b6 Warning This data stream is being released in beta while we test it thoroughly. This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in an InfluxDB database. Container \u00b6 An InfluxDB database with a table per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_influxdb/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_influxdb (beta)"},{"location":"datastreams/aware-influxdb/#aware_influxdb-beta","text":"Warning This data stream is being released in beta while we test it thoroughly. This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in an InfluxDB database.","title":"aware_influxdb (beta)"},{"location":"datastreams/aware-influxdb/#container","text":"An InfluxDB database with a table per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_influxdb/container.R","title":"Container"},{"location":"datastreams/aware-influxdb/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/aware-mysql/","text":"aware_mysql \u00b6 This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in a MySQL database. Container \u00b6 A MySQL database with a table per sensor, each containing the data for all participants. This is the default database created by the old PHP AWARE server (as opposed to the new JavaScript Micro server). The script to connect and download data from this container is at: src/data/streams/aware_mysql/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_mysql"},{"location":"datastreams/aware-mysql/#aware_mysql","text":"This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in a MySQL database.","title":"aware_mysql"},{"location":"datastreams/aware-mysql/#container","text":"A MySQL database with a table per sensor, each containing the data for all participants. This is the default database created by the old PHP AWARE server (as opposed to the new JavaScript Micro server). The script to connect and download data from this container is at: src/data/streams/aware_mysql/container.R","title":"Container"},{"location":"datastreams/aware-mysql/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/data-streams-introduction/","text":"Data Streams Introduction \u00b6 A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Similarly, smartphone data collected with Beiwe will have a different format and could be stored in a container like a PostgreSQL database or a CSV file. If you want to process a data stream using RAPIDS, make sure that your data is stored in a supported format and container (see table below). If RAPIDS doesn\u2019t support your data stream yet (e.g. Beiwe data stored in PostgreSQL, or AWARE data stored in SQLite), you can always implement a new data stream . If it\u2019s something you think other people might be interested on, we will be happy to include your new data stream in RAPIDS, so get in touch!. Hint Currently, you can add new data streams for smartphones, Fitbit, and Empatica devices. If you need RAPIDS to process data from other devices , like Oura Rings or Actigraph wearables, get in touch. It is a more complicated process that could take a couple of days to implement for someone familiar with R or Python, but we would be happy to work on it together. For reference, these are the data streams we currently support: Data Stream Device Format Container Docs aware_mysql Phone AWARE app MySQL link aware_csv Phone AWARE app CSV files link aware_influxdb (beta) Phone AWARE app InfluxDB link fitbitjson_mysql Fitbit JSON (per Fitbit\u2019s API ) MySQL link fitbitjson_csv Fitbit JSON (per Fitbit\u2019s API ) CSV files link fitbitparsed_mysql Fitbit Parsed (parsed API data) MySQL link fitbitparsed_csv Fitbit Parsed (parsed API data) CSV files link empatica_zip Empatica E4 Connect ZIP files link","title":"Introduction"},{"location":"datastreams/data-streams-introduction/#data-streams-introduction","text":"A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Similarly, smartphone data collected with Beiwe will have a different format and could be stored in a container like a PostgreSQL database or a CSV file. If you want to process a data stream using RAPIDS, make sure that your data is stored in a supported format and container (see table below). If RAPIDS doesn\u2019t support your data stream yet (e.g. Beiwe data stored in PostgreSQL, or AWARE data stored in SQLite), you can always implement a new data stream . If it\u2019s something you think other people might be interested on, we will be happy to include your new data stream in RAPIDS, so get in touch!. Hint Currently, you can add new data streams for smartphones, Fitbit, and Empatica devices. If you need RAPIDS to process data from other devices , like Oura Rings or Actigraph wearables, get in touch. It is a more complicated process that could take a couple of days to implement for someone familiar with R or Python, but we would be happy to work on it together. For reference, these are the data streams we currently support: Data Stream Device Format Container Docs aware_mysql Phone AWARE app MySQL link aware_csv Phone AWARE app CSV files link aware_influxdb (beta) Phone AWARE app InfluxDB link fitbitjson_mysql Fitbit JSON (per Fitbit\u2019s API ) MySQL link fitbitjson_csv Fitbit JSON (per Fitbit\u2019s API ) CSV files link fitbitparsed_mysql Fitbit Parsed (parsed API data) MySQL link fitbitparsed_csv Fitbit Parsed (parsed API data) CSV files link empatica_zip Empatica E4 Connect ZIP files link","title":"Data Streams Introduction"},{"location":"datastreams/empatica-zip/","text":"empatica_zip \u00b6 This data stream handles Empatica sensor data downloaded as zip files using the E4 Connect . Container \u00b6 You need to create a subfolder for every participant named after their device id inside the folder specified by [EMPATICA_DATA_STREAMS][empatica_zipfiles][FOLDER] . You can add one or more Empatica zip files to any subfolder. The script to connect and download data from this container is at: src/data/streams/empatica_zip/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Empatica sensors . This file is at: src/data/streams/empatica_zip/format.yaml All columns are mutated from the raw data in the zip files so you don\u2019t need to modify any column mappings. EMPATICA_ACCELEROMETER RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_HEARTRATE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id HEARTRATE heartrate MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_TEMPERATURE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TEMPERATURE temperature MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ELECTRODERMAL_ACTIVITY electrodermal_activity MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_BLOOD_VOLUME_PULSE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BLOOD_VOLUME_PULSE blood_volume_pulse MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_INTER_BEAT_INTERVAL RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id INTER_BEAT_INTERVAL inter_beat_interval MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_EMPATICA_TAGS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TAGS tags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None)","title":"empatica_zip"},{"location":"datastreams/empatica-zip/#empatica_zip","text":"This data stream handles Empatica sensor data downloaded as zip files using the E4 Connect .","title":"empatica_zip"},{"location":"datastreams/empatica-zip/#container","text":"You need to create a subfolder for every participant named after their device id inside the folder specified by [EMPATICA_DATA_STREAMS][empatica_zipfiles][FOLDER] . You can add one or more Empatica zip files to any subfolder. The script to connect and download data from this container is at: src/data/streams/empatica_zip/container.R","title":"Container"},{"location":"datastreams/empatica-zip/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Empatica sensors . This file is at: src/data/streams/empatica_zip/format.yaml All columns are mutated from the raw data in the zip files so you don\u2019t need to modify any column mappings. EMPATICA_ACCELEROMETER RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_HEARTRATE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id HEARTRATE heartrate MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_TEMPERATURE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TEMPERATURE temperature MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ELECTRODERMAL_ACTIVITY electrodermal_activity MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_BLOOD_VOLUME_PULSE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BLOOD_VOLUME_PULSE blood_volume_pulse MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_INTER_BEAT_INTERVAL RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id INTER_BEAT_INTERVAL inter_beat_interval MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_EMPATICA_TAGS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TAGS tags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None)","title":"Format"},{"location":"datastreams/fitbitjson-csv/","text":"fitbitjson_csv \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a CSV file, RAPIDS can process it. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"timestamp\",\"device_id\",\"label\",\"fitbit_id\",\"fitbit_data_type\",\"fitbit_data\" 1587614400000,\"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",\"5S\",\"5ZKN9B\",\"steps\",\"{\\\"activities-steps\\\":[{\\\"dateTime\\\":\\\"2020-04-23\\\",\\\"value\\\":\\\"7881\\\"}]\" Container \u00b6 The container should be a CSV file per Fitbit sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_csv/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"fitbitjson_csv"},{"location":"datastreams/fitbitjson-csv/#fitbitjson_csv","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a CSV file, RAPIDS can process it. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"timestamp\",\"device_id\",\"label\",\"fitbit_id\",\"fitbit_data_type\",\"fitbit_data\" 1587614400000,\"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",\"5S\",\"5ZKN9B\",\"steps\",\"{\\\"activities-steps\\\":[{\\\"dateTime\\\":\\\"2020-04-23\\\",\\\"value\\\":\\\"7881\\\"}]\"","title":"fitbitjson_csv"},{"location":"datastreams/fitbitjson-csv/#container","text":"The container should be a CSV file per Fitbit sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_csv/container.R","title":"Container"},{"location":"datastreams/fitbitjson-csv/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Format"},{"location":"datastreams/fitbitjson-mysql/","text":"fitbitjson_mysql \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a MySQL database, RAPIDS can process it. Container \u00b6 The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_mysql/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"fitbitjson_mysql"},{"location":"datastreams/fitbitjson-mysql/#fitbitjson_mysql","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a MySQL database, RAPIDS can process it.","title":"fitbitjson_mysql"},{"location":"datastreams/fitbitjson-mysql/#container","text":"The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_mysql/container.R","title":"Container"},{"location":"datastreams/fitbitjson-mysql/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Format"},{"location":"datastreams/fitbitparsed-csv/","text":"fitbitparsed_csv \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a CSV file, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"device_id\",\"heartrate\",\"heartrate_zone\",\"local_date_time\",\"timestamp\" \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:00:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:01:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",67,\"outofrange\",\"2020-04-23 00:02:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:03:00\",0 Container \u00b6 The container should be a CSV file per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_csv/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"fitbitparsed_csv"},{"location":"datastreams/fitbitparsed-csv/#fitbitparsed_csv","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a CSV file, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"device_id\",\"heartrate\",\"heartrate_zone\",\"local_date_time\",\"timestamp\" \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:00:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:01:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",67,\"outofrange\",\"2020-04-23 00:02:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:03:00\",0","title":"fitbitparsed_csv"},{"location":"datastreams/fitbitparsed-csv/#container","text":"The container should be a CSV file per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_csv/container.R","title":"Container"},{"location":"datastreams/fitbitparsed-csv/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Format"},{"location":"datastreams/fitbitparsed-mysql/","text":"fitbitparsed_mysql \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a MySQL database, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Container \u00b6 The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_mysql/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"fitbitparsed_mysql"},{"location":"datastreams/fitbitparsed-mysql/#fitbitparsed_mysql","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a MySQL database, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream.","title":"fitbitparsed_mysql"},{"location":"datastreams/fitbitparsed-mysql/#container","text":"The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_mysql/container.R","title":"Container"},{"location":"datastreams/fitbitparsed-mysql/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Format"},{"location":"datastreams/mandatory-empatica-format/","text":"Mandatory Empatica Format \u00b6 This is a description of the format RAPIDS needs to process data for the following Empatica sensors. EMPATICA_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration EMPATICA_HEARTRATE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate EMPATICA_TEMPERATURE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TEMPERATURE temperature EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device ELECTRODERMAL_ACTIVITY electrical conductance EMPATICA_BLOOD_VOLUME_PULSE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device BLOOD_VOLUME_PULSE blood volume pulse EMPATICA_INTER_BEAT_INTERVAL RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device INTER_BEAT_INTERVAL inter beat interval EMPATICA_TAGS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TAGS tags","title":"Mandatory Empatica Format"},{"location":"datastreams/mandatory-empatica-format/#mandatory-empatica-format","text":"This is a description of the format RAPIDS needs to process data for the following Empatica sensors. EMPATICA_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration EMPATICA_HEARTRATE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate EMPATICA_TEMPERATURE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TEMPERATURE temperature EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device ELECTRODERMAL_ACTIVITY electrical conductance EMPATICA_BLOOD_VOLUME_PULSE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device BLOOD_VOLUME_PULSE blood volume pulse EMPATICA_INTER_BEAT_INTERVAL RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device INTER_BEAT_INTERVAL inter beat interval EMPATICA_TAGS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TAGS tags","title":"Mandatory Empatica Format"},{"location":"datastreams/mandatory-fitbit-format/","text":"Mandatory Fitbit Format \u00b6 This is a description of the format RAPIDS needs to process data for the following Fitbit sensors. FITBIT_HEARTRATE_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE_DAILY_RESTINGHR Daily resting heartrate HEARTRATE_DAILY_CALORIESOUTOFRANGE Calories spent while heartrate was oustide a heartrate zone HEARTRATE_DAILY_CALORIESFATBURN Calories spent while heartrate was inside the fat burn zone HEARTRATE_DAILY_CALORIESCARDIO Calories spent while heartrate was inside the cardio zone HEARTRATE_DAILY_CALORIESPEAK Calories spent while heartrate was inside the peak zone FITBIT_HEARTRATE_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate HEARTRATE_ZONE Heartrate zone that HEARTRATE belongs to. It is based on the heartrate zone ranges of each device FITBIT_SLEEP_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd 00:00:00 , the date is the same as the start date of a daily sleep episode if its time is after SLEEP_SUMMARY_LAST_NIGHT_END, otherwise it is the day before the start date of that sleep episode LOCAL_START_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the start of a daily sleep episode LOCAL_END_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the end of a daily sleep episode DEVICE_ID A string that uniquely identifies a device EFFICIENCY Sleep efficiency computed by fitbit as time asleep / (total time in bed - time to fall asleep) MINUTES_AFTER_WAKEUP Minutes the participant spent in bed after waking up MINUTES_ASLEEP Minutes the participant was asleep MINUTES_AWAKE Minutes the participant was awake MINUTES_TO_FALL_ASLEEP Minutes the participant spent in bed before falling asleep MINUTES_IN_BED Minutes the participant spent in bed across the sleep episode IS_MAIN_SLEEP 0 if this episode is a nap, or 1 if it is a main sleep episode TYPE stages or classic sleep data FITBIT_SLEEP_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss , this either is a copy of LOCAL_START_DATE_TIME or LOCAL_END_DATE_TIME depending on which column is used to assign an episode to a specific day DEVICE_ID A string that uniquely identifies a device TYPE_EPISODE_ID An id for each unique main or nap episode. Main and nap episodes have different levels, each row in this table is one of such levels, so multiple rows can have the same TYPE_EPISODE_ID DURATION Duration of the episode level in minutes IS_MAIN_SLEEP 0 if this episode level belongs to a nap, or 1 if it belongs to a main sleep episode TYPE type of level: stages or classic sleep data LEVEL For stages levels one of wake , deep , light , or rem . For classic levels one of awake , restless , and asleep FITBIT_STEPS_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Daily step count FITBIT_STEPS_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Intraday step count (usually every minute)","title":"Mandatory Fitbit Format"},{"location":"datastreams/mandatory-fitbit-format/#mandatory-fitbit-format","text":"This is a description of the format RAPIDS needs to process data for the following Fitbit sensors. FITBIT_HEARTRATE_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE_DAILY_RESTINGHR Daily resting heartrate HEARTRATE_DAILY_CALORIESOUTOFRANGE Calories spent while heartrate was oustide a heartrate zone HEARTRATE_DAILY_CALORIESFATBURN Calories spent while heartrate was inside the fat burn zone HEARTRATE_DAILY_CALORIESCARDIO Calories spent while heartrate was inside the cardio zone HEARTRATE_DAILY_CALORIESPEAK Calories spent while heartrate was inside the peak zone FITBIT_HEARTRATE_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate HEARTRATE_ZONE Heartrate zone that HEARTRATE belongs to. It is based on the heartrate zone ranges of each device FITBIT_SLEEP_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd 00:00:00 , the date is the same as the start date of a daily sleep episode if its time is after SLEEP_SUMMARY_LAST_NIGHT_END, otherwise it is the day before the start date of that sleep episode LOCAL_START_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the start of a daily sleep episode LOCAL_END_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the end of a daily sleep episode DEVICE_ID A string that uniquely identifies a device EFFICIENCY Sleep efficiency computed by fitbit as time asleep / (total time in bed - time to fall asleep) MINUTES_AFTER_WAKEUP Minutes the participant spent in bed after waking up MINUTES_ASLEEP Minutes the participant was asleep MINUTES_AWAKE Minutes the participant was awake MINUTES_TO_FALL_ASLEEP Minutes the participant spent in bed before falling asleep MINUTES_IN_BED Minutes the participant spent in bed across the sleep episode IS_MAIN_SLEEP 0 if this episode is a nap, or 1 if it is a main sleep episode TYPE stages or classic sleep data FITBIT_SLEEP_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss , this either is a copy of LOCAL_START_DATE_TIME or LOCAL_END_DATE_TIME depending on which column is used to assign an episode to a specific day DEVICE_ID A string that uniquely identifies a device TYPE_EPISODE_ID An id for each unique main or nap episode. Main and nap episodes have different levels, each row in this table is one of such levels, so multiple rows can have the same TYPE_EPISODE_ID DURATION Duration of the episode level in minutes IS_MAIN_SLEEP 0 if this episode level belongs to a nap, or 1 if it belongs to a main sleep episode TYPE type of level: stages or classic sleep data LEVEL For stages levels one of wake , deep , light , or rem . For classic levels one of awake , restless , and asleep FITBIT_STEPS_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Daily step count FITBIT_STEPS_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Intraday step count (usually every minute)","title":"Mandatory Fitbit Format"},{"location":"datastreams/mandatory-phone-format/","text":"Mandatory Phone Format \u00b6 This is a description of the format RAPIDS needs to process data for the following PHONE sensors. See examples in the CSV files inside rapids_example_csv.zip PHONE_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration PHONE_ACTIVITY_RECOGNITION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device ACTIVITY_NAME An string that denotes current activity name: in_vehicle , on_bicycle , on_foot , still , unknown , tilting , walking or running ACTIVITY_TYPE An integer (ranged from 0 to 8) that denotes current activity type CONFIDENCE An integer (ranged from 0 to 100) that denotes the prediction accuracy PHONE_APPLICATIONS_CRASHES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name APPLICATION_VERSION Application\u2019s version code ERROR_SHORT Short description of the error ERROR_LONG More verbose version of the error description ERROR_CONDITION 1 = code error; 2 = non-responsive (ANR error) IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_FOREGROUND RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_NOTIFICATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name TEXT Notification\u2019s header text, not the content SOUND Notification\u2019s sound source (if applicable) VIBRATE Notification\u2019s vibration pattern (if applicable) DEFAULTS If notification was delivered according to device\u2019s default settings FLAGS An integer that denotes Android notification flag PHONE_BATTERY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BATTERY_STATUS An integer that denotes battery status: 0 or 1 = unknown, 2 = charging, 3 = discharging, 4 = not charging, 5 = full BATTERY_LEVEL An integer that denotes battery level, between 0 and BATTERY_SCALE BATTERY_SCALE An integer that denotes the maximum battery level PHONE_BLUETOOTH RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BT_ADDRESS MAC address of the device\u2019s Bluetooth sensor BT_NAME User assigned name of the device\u2019s Bluetooth sensor BT_RSSI The RSSI dB to the scanned device PHONE_CALLS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device CALL_TYPE An integer that denotes call type: 1 = incoming, 2 = outgoing, 3 = missed CALL_DURATION Length of the call session TRACE SHA-1 one-way source/target of the call PHONE_CONVERSATION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_ENERGY A number that denotes the amplitude of an audio sample (L2-norm of the audio frame) INFERENCE An integer (ranged from 0 to 3) that denotes the type of an audio sample: 0 = silence, 1 = noise, 2 = voice, 3 = unknown DOUBLE_CONVO_START UNIX timestamp (13 digits) of the beginning of a conversation DOUBLE_CONVO_END UNIX timestamp (13 digits) of the end of a conversation PHONE_KEYBOARD RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME The application\u2019s package name of keyboard interaction BEFORE_TEXT The previous keyboard input (empty if password) CURRENT_TEXT The current keyboard input (empty if password) IS_PASSWORD An integer: 0 = not password; 1 = password PHONE_LIGHT RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LIGHT_LUX The ambient luminance in lux units ACCURACY An integer that denotes the sensor\u2019s accuracy level: 3 = maximum accuracy, 2 = medium accuracy, 1 = low accuracy PHONE_LOCATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LATITUDE The location\u2019s latitude, in degrees DOUBLE_LONGITUDE The location\u2019s longitude, in degrees DOUBLE_BEARING The location\u2019s bearing, in degrees DOUBLE_SPEED The speed if available, in meters/second over ground DOUBLE_ALTITUDE The altitude if available, in meters above sea level PROVIDER A string that denotes the provider: gps , fused or network ACCURACY The estimated location accuracy PHONE_LOG RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device LOG_MESSAGE A string that denotes log message PHONE_MESSAGES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MESSAGE_TYPE An integer that denotes message type: 1 = received, 2 = sent TRACE SHA-1 one-way source/target of the message PHONE_SCREEN RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SCREEN_STATUS An integer that denotes screen status: 0 = off, 1 = on, 2 = locked, 3 = unlocked PHONE_WIFI_CONNECTED RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MAC_ADDRESS Device\u2019s MAC address SSID Currently connected access point network name BSSID Currently connected access point MAC address PHONE_WIFI_VISIBLE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SSID Detected access point network name BSSID Detected access point MAC address SECURITY Active security protocols FREQUENCY Wi-Fi band frequency (e.g., 2427, 5180), in Hz RSSI RSSI dB to the scanned device","title":"Mandatory Phone Format"},{"location":"datastreams/mandatory-phone-format/#mandatory-phone-format","text":"This is a description of the format RAPIDS needs to process data for the following PHONE sensors. See examples in the CSV files inside rapids_example_csv.zip PHONE_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration PHONE_ACTIVITY_RECOGNITION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device ACTIVITY_NAME An string that denotes current activity name: in_vehicle , on_bicycle , on_foot , still , unknown , tilting , walking or running ACTIVITY_TYPE An integer (ranged from 0 to 8) that denotes current activity type CONFIDENCE An integer (ranged from 0 to 100) that denotes the prediction accuracy PHONE_APPLICATIONS_CRASHES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name APPLICATION_VERSION Application\u2019s version code ERROR_SHORT Short description of the error ERROR_LONG More verbose version of the error description ERROR_CONDITION 1 = code error; 2 = non-responsive (ANR error) IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_FOREGROUND RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_NOTIFICATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name TEXT Notification\u2019s header text, not the content SOUND Notification\u2019s sound source (if applicable) VIBRATE Notification\u2019s vibration pattern (if applicable) DEFAULTS If notification was delivered according to device\u2019s default settings FLAGS An integer that denotes Android notification flag PHONE_BATTERY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BATTERY_STATUS An integer that denotes battery status: 0 or 1 = unknown, 2 = charging, 3 = discharging, 4 = not charging, 5 = full BATTERY_LEVEL An integer that denotes battery level, between 0 and BATTERY_SCALE BATTERY_SCALE An integer that denotes the maximum battery level PHONE_BLUETOOTH RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BT_ADDRESS MAC address of the device\u2019s Bluetooth sensor BT_NAME User assigned name of the device\u2019s Bluetooth sensor BT_RSSI The RSSI dB to the scanned device PHONE_CALLS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device CALL_TYPE An integer that denotes call type: 1 = incoming, 2 = outgoing, 3 = missed CALL_DURATION Length of the call session TRACE SHA-1 one-way source/target of the call PHONE_CONVERSATION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_ENERGY A number that denotes the amplitude of an audio sample (L2-norm of the audio frame) INFERENCE An integer (ranged from 0 to 3) that denotes the type of an audio sample: 0 = silence, 1 = noise, 2 = voice, 3 = unknown DOUBLE_CONVO_START UNIX timestamp (13 digits) of the beginning of a conversation DOUBLE_CONVO_END UNIX timestamp (13 digits) of the end of a conversation PHONE_KEYBOARD RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME The application\u2019s package name of keyboard interaction BEFORE_TEXT The previous keyboard input (empty if password) CURRENT_TEXT The current keyboard input (empty if password) IS_PASSWORD An integer: 0 = not password; 1 = password PHONE_LIGHT RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LIGHT_LUX The ambient luminance in lux units ACCURACY An integer that denotes the sensor\u2019s accuracy level: 3 = maximum accuracy, 2 = medium accuracy, 1 = low accuracy PHONE_LOCATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LATITUDE The location\u2019s latitude, in degrees DOUBLE_LONGITUDE The location\u2019s longitude, in degrees DOUBLE_BEARING The location\u2019s bearing, in degrees DOUBLE_SPEED The speed if available, in meters/second over ground DOUBLE_ALTITUDE The altitude if available, in meters above sea level PROVIDER A string that denotes the provider: gps , fused or network ACCURACY The estimated location accuracy PHONE_LOG RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device LOG_MESSAGE A string that denotes log message PHONE_MESSAGES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MESSAGE_TYPE An integer that denotes message type: 1 = received, 2 = sent TRACE SHA-1 one-way source/target of the message PHONE_SCREEN RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SCREEN_STATUS An integer that denotes screen status: 0 = off, 1 = on, 2 = locked, 3 = unlocked PHONE_WIFI_CONNECTED RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MAC_ADDRESS Device\u2019s MAC address SSID Currently connected access point network name BSSID Currently connected access point MAC address PHONE_WIFI_VISIBLE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SSID Detected access point network name BSSID Detected access point MAC address SECURITY Active security protocols FREQUENCY Wi-Fi band frequency (e.g., 2427, 5180), in Hz RSSI RSSI dB to the scanned device","title":"Mandatory Phone Format"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/git-flow/","text":"Git Flow \u00b6 We use the develop/master variation of the OneFlow git flow Add New Features \u00b6 We use feature (topic) branches to implement new features Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. Starting your feature branch Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Fetch the latest changes to develop git fetch origin develop Rebase your feature branch git checkout feature/feature1 git rebase -i develop Integrate your new feature to develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Starting your feature branch Fork and clone our repository on Github Switch to the latest develop git checkout develop Create your feature branch git checkout -b feature/external-test Add, modify or delete the necessary files to add your new feature Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented, it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Add our repo as another remote git remote add upstream https://github.com/carissalow/rapids/ Fetch the latest changes to develop git fetch upstream develop Rebase your feature branch git checkout feature/external-test git rebase -i develop Push your feature branch online git push --set-upstream origin feature/external-test Open a pull request to the develop branch using Github\u2019s GUI Release a New Version \u00b6 Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log) Release a Hotfix \u00b6 Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Git Flow"},{"location":"developers/git-flow/#git-flow","text":"We use the develop/master variation of the OneFlow git flow","title":"Git Flow"},{"location":"developers/git-flow/#add-new-features","text":"We use feature (topic) branches to implement new features Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. Starting your feature branch Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Fetch the latest changes to develop git fetch origin develop Rebase your feature branch git checkout feature/feature1 git rebase -i develop Integrate your new feature to develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Starting your feature branch Fork and clone our repository on Github Switch to the latest develop git checkout develop Create your feature branch git checkout -b feature/external-test Add, modify or delete the necessary files to add your new feature Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented, it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Add our repo as another remote git remote add upstream https://github.com/carissalow/rapids/ Fetch the latest changes to develop git fetch upstream develop Rebase your feature branch git checkout feature/external-test git rebase -i develop Push your feature branch online git push --set-upstream origin feature/external-test Open a pull request to the develop branch using Github\u2019s GUI","title":"Add New Features"},{"location":"developers/git-flow/#release-a-new-version","text":"Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)","title":"Release a New Version"},{"location":"developers/git-flow/#release-a-hotfix","text":"Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Release a Hotfix"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open your RAPIDS root folder in a new VSCode window Open a new terminal in Visual Studio Code Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open your RAPIDS root folder in a new VSCode window Open a new terminal in Visual Studio Code Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Sensor Provider Periodic Frequency Event Phone Accelerometer Panda N N N Phone Accelerometer RAPIDS N N N Phone Activity Recognition RAPIDS Y Y Y Phone Applications Foreground RAPIDS N N N Phone Battery RAPIDS Y Y N Phone Bluetooth Doryab Y Y Y Phone Bluetooth RAPIDS Y Y Y Phone Calls RAPIDS Y Y Y Phone Conversation RAPIDS Y Y Y Phone Data Yield RAPIDS N N N Phone Light RAPIDS Y Y N Phone Locations Doryab N N N Phone Locations Barnett N N N Phone Messages RAPIDS Y Y N Phone Screen RAPIDS Y Y Y Phone WiFi Connected RAPIDS Y Y Y Phone WiFi Visible RAPIDS Y Y Y Fitbit Calories Intraday RAPIDS Y Y Y Fitbit Data Yield RAPIDS N N N Fitbit Heart Rate Summary RAPIDS N N N Fitbit Heart Rate Intraday RAPIDS N N N Fitbit Sleep Summary RAPIDS N N N Fitbit Sleep Intraday RAPIDS Y Y Y Fitbit Sleep Intraday PRICE Y Y Y Fitbit Steps Summary RAPIDS N N N Fitbit Steps Intraday RAPIDS N N N Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw data for iOS and Android the following is the expected results the phone_calls.csv . Description One missed episode, one outgoing episode and one incoming episode on Friday night, morning, afternoon and evening There is at least one episode of each type of phone calls on each day One incoming episode crossing two 30-mins segments One outgoing episode crossing two 30-mins segments One missed episode before, during and after the event There is one incoming episode before, during or after the event There is one outcoming episode before, during or after the event There is one missed episode before, during or after the event Data format Device Missed Outgoing Incoming iOS 3 2 1 Android 1,4 or 3,4 3,2,4 1,2,4 Note When generating test data, all traces for iOS device need to be unique otherwise the episode with duplicate trace will be dropped Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the phone_screen.csv . Description The screen data file contains data for 4 days. The screen data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night One episode that crossing two 30-min segments Data format Device unlock Android 3, 0 iOS 3, 2 Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 Description The 4-day raw data is contained in phone_bluetooth_raw.csv One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same 30-min segment ( Fri 23:38:45.789 and Fri 23:59:59.465 ) Two episodes locate in the same daily segment ( Fri 00:00:00.798 and Fri 00:49:04.132 ) One episode before the time switch ( Sun 00:24:00.000 ) and one episode after the time switch ( Sun 17:32:00.000 ) Checklist time segment single tz multi tz platform 30min OK OK Android morning OK OK Android daily OK OK Android threeday OK OK Android weekend OK OK Android beforeMarchEvent OK OK Android beforeNovemberEvent OK OK Android WIFI \u00b6 There are two wifi features ( phone wifi connected and phone wifi visible ). The raw test data are seperatly stored in the phone_wifi_connected_raw.csv and phone_wifi_visible_raw.csv . Description One episode for each epoch ( night , morining , afternoon and evening ) Two two episodes in the same time segment ( daily and 30-min ) Two episodes around the transition of epochs (e.g. one at the end of night and one at the beginning of morning ) One episode before and after the time switch on Sunday phone wifi connected Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS phone wifi visible Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Locations \u00b6 Description The participant\u2019s home location is (latitude=1, longitude=1). From Sat 10:56:00 to Sat 11:04:00, the center of the cluster is (latitude=-100, longitude=-100). From Sun 03:30:00 to Sun 03:47:00, the center of the cluster is (latitude=1, longitude=1). Home location is extracted from this period. From Sun 11:30:00 to Sun 11:38:00, the center of the cluster is (latitude=100, longitude=100). Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 Description The 4-day raw conversation data is contained in plugin_google_activity_recognition_raw.csv and plugin_ios_activity_recognition_raw.csv . Two episodes locate in the same 30-min segment ( Fri 04:01:54 and Fri 04:13:52 ) One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same daily segment ( Fri 05:03:09 and Fri 05:50:36 ) Two episodes with the time difference less than 5 mins threshold ( Fri 07:14:21 and Fri 07:18:50 ) One episode before the time switch ( Sun 00:46:00 ) and one episode after the time switch ( Sun 03:42:00 ) Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS Conversation \u00b6 The 4-day raw conversation data is contained in phone_conversation_raw.csv . The different inference records are randomly distributed throughout the epoch . Description One episode for each daily segment ( night , morning , afternoon and evening ) on each day Two episodes near the transition of the daily segment, one starts at the end of the afternoon, Fri 17:10:00 and another one starts at the beginning of the evening, Fri 18:01:00 One episode across two segments, daily and 30-mins , (from Fri 05:55:00 to Fri 06:00:41 ) Two episodes locate in the same daily segment ( Sat 12:45:36 and Sat 16:48:22 ) One episode before the time switch, Sun 00:15:06 , and one episode after the time switch, Sun 06:01:00 Data format inference type 0 silence 1 noise 2 voice 3 unknown Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android Keyboard \u00b6 The raw keyboard data file contains data for 4 days. The raw keyboard data contains records with difference in timestamp ranging from milliseconds to seconds. With difference in timestamps between consecutive records more than 5 seconds helps us to create separate sessions within the usage of the same app. This helps to verify the case where sessions have to be different. The raw keyboard data contains records where the difference in text is less than 5 seconds which makes it into 1 session but because of difference of app new session starts. This edge case determines the behaviour within particular app and also within 5 seconds. The raw keyboard data also contains the records where length of current_text varies between consecutive rows. This helps us to tests on the cases where input text is entered by auto-suggested or auto-correct operations. One three-minute episode with a 1-minute row on Sun 08:59:54.65 and 09:00:00,another on Sun 12:01:02 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Keyboard from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. Application Episodes \u00b6 The feature requires raw application foreground data file and raw phone screen data file The raw data files contains data for 4 day. The raw conversation data contains records with difference in timestamp ranging from milliseconds to minutes. An app episode starts when an app is launched and ends when another app is launched, marking the episode end of the first one, or when the screen locks. Thus, we are taking into account the screen unlock episodes. There are multiple apps usage within each screen unlock episode to verify creation of different app episodes in each screen unlock session. In the screen unlock episode starting from Fri 05:56:51, Fri 10:00:24, Sat 17:48:01, Sun 22:02:00, and Mon 21:05:00 we have multiple apps, both system and non-system apps, to check this. The 22 minute chunk starting from Fri 10:03:56 checks app episodes for system apps only. The screen unlock episode starting from Mon 21:05:00 and Sat 17:48:01 checks if the screen lock marks the end of episode for that particular app which was launched a few milliseconds to 8 mins before the screen lock. Finally, since application foreground is only for Android devices, this feature is also for Android devices only. All other files are empty data files Fitbit Calories Intraday \u00b6 Description A five-minute sedentary episode on Fri 11:00:00 A one-minute sedentary episode on Sun 02:00:00. It exists in November but not in February in STZ A five-minute sedentary episode on Fri 11:58:00. It is split within two 30-min segments and the morning A three-minute lightly active episode on Fri 11:10:00, a one-minute at 11:18:00 and a one-minute 11:24:00. These check for start and end times of first/last/longest episode A three-minute fairly active episode on Fri 11:40:00, a one-minute at 11:48:00 and a one-minute 11:54:00. These check for start and end times of first/last/longest episode A three-minute very active episode on Fri 12:10:00, a one-minute at 12:18:00 and a one-minute 12:24:00. These check for start and end times of first/last/longest episode A eight-minute MVPA episode with intertwined fairly and very active rows on Fri 12:30:00 The above episodes contain six higmet (>= 3 MET) episodes and nine lowmet episodes. One two-minute sedentary episode with a 1-minute row on Sun 09:00:00 and another on Sun 12:01:01 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Fitbit from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. A three-minute sedentary episode on Sat 08:59 that will be ignored for multi-timezone event segments. A three-minute sedentary episode on Sat 12:59 of which the first minute will be ignored for multi-timezone event segments since the test segment starts at 13:00 A three-minute sedentary episode on Sat 16:00 A four-minute sedentary episode on Sun 10:01 that will be ignored for Novembers\u2019s multi-timezone event segments since the test segment ends at 10am on that weekend. A three-minute very active episode on Sat 16:03. This episode and the one at 16:00 are counted as one for lowmet episodes Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit Fitbit Sleep Summary \u00b6 Description A main sleep episode that starts on Fri 20:00:00 and ends on Sat 02:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Fri) data. A nap that starts on Sat 04:00:00 and ends on Sat 06:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Fri) data. A nap that starts on Sat 13:00:00 and ends on Sat 15:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sat) data. A main sleep that starts on Sun 01:00:00 and ends on Sun 12:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Sat) data. A main sleep that starts on Sun 23:00:00 and ends on Mon 07:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sun) data. Any segment shorter than one day will be ignored for sleep RAPIDS features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit Fitbit Sleep Intraday \u00b6 Description A five-minute main sleep episode with asleep-classic level on Fri 11:00:00. An eight-hour main sleep episode on Fri 17:00:00. It is split into 2 parts for daily segment: a seven-hour sleep episode on Fri 17:00:00 and an one-hour sleep episode on Sat 00:00:00. A two-hour nap on Sat 01:00:00 that will be ignored for main sleep features. An one-hour nap on Sat 13:00:00 that will be ignored for main sleep features. An eight-hour main sleep episode on Sat 22:00:00. This episode ends on Sun 08:00:00 (NY) for March and Sun 06:00:00 (NY) for Novembers due to daylight savings. It will be considered for beforeMarchEvent segment and ignored for beforeNovemberEvent segment. A nine-hour main sleep episode on Sun 11:00:00. Start time will be assigned as NY time zone and converted to 14:00:00. A seven-hour main sleep episode on Mon 06:00:00. This episode will be split into two parts: a five-hour sleep episode on Mon 06:00:00 and a two-hour sleep episode on Mon 11:00:00. The first part will be discarded as it is before 11am (Last Night End) Any segment shorter than one day will be ignored for sleep PRICE features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Sensor Provider Periodic Frequency Event Phone Accelerometer Panda N N N Phone Accelerometer RAPIDS N N N Phone Activity Recognition RAPIDS Y Y Y Phone Applications Foreground RAPIDS N N N Phone Battery RAPIDS Y Y N Phone Bluetooth Doryab Y Y Y Phone Bluetooth RAPIDS Y Y Y Phone Calls RAPIDS Y Y Y Phone Conversation RAPIDS Y Y Y Phone Data Yield RAPIDS N N N Phone Light RAPIDS Y Y N Phone Locations Doryab N N N Phone Locations Barnett N N N Phone Messages RAPIDS Y Y N Phone Screen RAPIDS Y Y Y Phone WiFi Connected RAPIDS Y Y Y Phone WiFi Visible RAPIDS Y Y Y Fitbit Calories Intraday RAPIDS Y Y Y Fitbit Data Yield RAPIDS N N N Fitbit Heart Rate Summary RAPIDS N N N Fitbit Heart Rate Intraday RAPIDS N N N Fitbit Sleep Summary RAPIDS N N N Fitbit Sleep Intraday RAPIDS Y Y Y Fitbit Sleep Intraday PRICE Y Y Y Fitbit Steps Summary RAPIDS N N N Fitbit Steps Intraday RAPIDS N N N","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw data for iOS and Android the following is the expected results the phone_calls.csv . Description One missed episode, one outgoing episode and one incoming episode on Friday night, morning, afternoon and evening There is at least one episode of each type of phone calls on each day One incoming episode crossing two 30-mins segments One outgoing episode crossing two 30-mins segments One missed episode before, during and after the event There is one incoming episode before, during or after the event There is one outcoming episode before, during or after the event There is one missed episode before, during or after the event Data format Device Missed Outgoing Incoming iOS 3 2 1 Android 1,4 or 3,4 3,2,4 1,2,4 Note When generating test data, all traces for iOS device need to be unique otherwise the episode with duplicate trace will be dropped Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the phone_screen.csv . Description The screen data file contains data for 4 days. The screen data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night One episode that crossing two 30-min segments Data format Device unlock Android 3, 0 iOS 3, 2 Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"Description The 4-day raw data is contained in phone_bluetooth_raw.csv One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same 30-min segment ( Fri 23:38:45.789 and Fri 23:59:59.465 ) Two episodes locate in the same daily segment ( Fri 00:00:00.798 and Fri 00:49:04.132 ) One episode before the time switch ( Sun 00:24:00.000 ) and one episode after the time switch ( Sun 17:32:00.000 ) Checklist time segment single tz multi tz platform 30min OK OK Android morning OK OK Android daily OK OK Android threeday OK OK Android weekend OK OK Android beforeMarchEvent OK OK Android beforeNovemberEvent OK OK Android","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are two wifi features ( phone wifi connected and phone wifi visible ). The raw test data are seperatly stored in the phone_wifi_connected_raw.csv and phone_wifi_visible_raw.csv . Description One episode for each epoch ( night , morining , afternoon and evening ) Two two episodes in the same time segment ( daily and 30-min ) Two episodes around the transition of epochs (e.g. one at the end of night and one at the beginning of morning ) One episode before and after the time switch on Sunday phone wifi connected Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS phone wifi visible Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#locations","text":"Description The participant\u2019s home location is (latitude=1, longitude=1). From Sat 10:56:00 to Sat 11:04:00, the center of the cluster is (latitude=-100, longitude=-100). From Sun 03:30:00 to Sun 03:47:00, the center of the cluster is (latitude=1, longitude=1). Home location is extracted from this period. From Sun 11:30:00 to Sun 11:38:00, the center of the cluster is (latitude=100, longitude=100).","title":"Locations"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"Description The 4-day raw conversation data is contained in plugin_google_activity_recognition_raw.csv and plugin_ios_activity_recognition_raw.csv . Two episodes locate in the same 30-min segment ( Fri 04:01:54 and Fri 04:13:52 ) One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same daily segment ( Fri 05:03:09 and Fri 05:50:36 ) Two episodes with the time difference less than 5 mins threshold ( Fri 07:14:21 and Fri 07:18:50 ) One episode before the time switch ( Sun 00:46:00 ) and one episode after the time switch ( Sun 03:42:00 ) Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The 4-day raw conversation data is contained in phone_conversation_raw.csv . The different inference records are randomly distributed throughout the epoch . Description One episode for each daily segment ( night , morning , afternoon and evening ) on each day Two episodes near the transition of the daily segment, one starts at the end of the afternoon, Fri 17:10:00 and another one starts at the beginning of the evening, Fri 18:01:00 One episode across two segments, daily and 30-mins , (from Fri 05:55:00 to Fri 06:00:41 ) Two episodes locate in the same daily segment ( Sat 12:45:36 and Sat 16:48:22 ) One episode before the time switch, Sun 00:15:06 , and one episode after the time switch, Sun 06:01:00 Data format inference type 0 silence 1 noise 2 voice 3 unknown Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android","title":"Conversation"},{"location":"developers/test-cases/#keyboard","text":"The raw keyboard data file contains data for 4 days. The raw keyboard data contains records with difference in timestamp ranging from milliseconds to seconds. With difference in timestamps between consecutive records more than 5 seconds helps us to create separate sessions within the usage of the same app. This helps to verify the case where sessions have to be different. The raw keyboard data contains records where the difference in text is less than 5 seconds which makes it into 1 session but because of difference of app new session starts. This edge case determines the behaviour within particular app and also within 5 seconds. The raw keyboard data also contains the records where length of current_text varies between consecutive rows. This helps us to tests on the cases where input text is entered by auto-suggested or auto-correct operations. One three-minute episode with a 1-minute row on Sun 08:59:54.65 and 09:00:00,another on Sun 12:01:02 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Keyboard from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes.","title":"Keyboard"},{"location":"developers/test-cases/#application-episodes","text":"The feature requires raw application foreground data file and raw phone screen data file The raw data files contains data for 4 day. The raw conversation data contains records with difference in timestamp ranging from milliseconds to minutes. An app episode starts when an app is launched and ends when another app is launched, marking the episode end of the first one, or when the screen locks. Thus, we are taking into account the screen unlock episodes. There are multiple apps usage within each screen unlock episode to verify creation of different app episodes in each screen unlock session. In the screen unlock episode starting from Fri 05:56:51, Fri 10:00:24, Sat 17:48:01, Sun 22:02:00, and Mon 21:05:00 we have multiple apps, both system and non-system apps, to check this. The 22 minute chunk starting from Fri 10:03:56 checks app episodes for system apps only. The screen unlock episode starting from Mon 21:05:00 and Sat 17:48:01 checks if the screen lock marks the end of episode for that particular app which was launched a few milliseconds to 8 mins before the screen lock. Finally, since application foreground is only for Android devices, this feature is also for Android devices only. All other files are empty data files","title":"Application Episodes"},{"location":"developers/test-cases/#fitbit-calories-intraday","text":"Description A five-minute sedentary episode on Fri 11:00:00 A one-minute sedentary episode on Sun 02:00:00. It exists in November but not in February in STZ A five-minute sedentary episode on Fri 11:58:00. It is split within two 30-min segments and the morning A three-minute lightly active episode on Fri 11:10:00, a one-minute at 11:18:00 and a one-minute 11:24:00. These check for start and end times of first/last/longest episode A three-minute fairly active episode on Fri 11:40:00, a one-minute at 11:48:00 and a one-minute 11:54:00. These check for start and end times of first/last/longest episode A three-minute very active episode on Fri 12:10:00, a one-minute at 12:18:00 and a one-minute 12:24:00. These check for start and end times of first/last/longest episode A eight-minute MVPA episode with intertwined fairly and very active rows on Fri 12:30:00 The above episodes contain six higmet (>= 3 MET) episodes and nine lowmet episodes. One two-minute sedentary episode with a 1-minute row on Sun 09:00:00 and another on Sun 12:01:01 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Fitbit from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. A three-minute sedentary episode on Sat 08:59 that will be ignored for multi-timezone event segments. A three-minute sedentary episode on Sat 12:59 of which the first minute will be ignored for multi-timezone event segments since the test segment starts at 13:00 A three-minute sedentary episode on Sat 16:00 A four-minute sedentary episode on Sun 10:01 that will be ignored for Novembers\u2019s multi-timezone event segments since the test segment ends at 10am on that weekend. A three-minute very active episode on Sat 16:03. This episode and the one at 16:00 are counted as one for lowmet episodes Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Calories Intraday"},{"location":"developers/test-cases/#fitbit-sleep-summary","text":"Description A main sleep episode that starts on Fri 20:00:00 and ends on Sat 02:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Fri) data. A nap that starts on Sat 04:00:00 and ends on Sat 06:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Fri) data. A nap that starts on Sat 13:00:00 and ends on Sat 15:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sat) data. A main sleep that starts on Sun 01:00:00 and ends on Sun 12:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Sat) data. A main sleep that starts on Sun 23:00:00 and ends on Mon 07:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sun) data. Any segment shorter than one day will be ignored for sleep RAPIDS features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Sleep Summary"},{"location":"developers/test-cases/#fitbit-sleep-intraday","text":"Description A five-minute main sleep episode with asleep-classic level on Fri 11:00:00. An eight-hour main sleep episode on Fri 17:00:00. It is split into 2 parts for daily segment: a seven-hour sleep episode on Fri 17:00:00 and an one-hour sleep episode on Sat 00:00:00. A two-hour nap on Sat 01:00:00 that will be ignored for main sleep features. An one-hour nap on Sat 13:00:00 that will be ignored for main sleep features. An eight-hour main sleep episode on Sat 22:00:00. This episode ends on Sun 08:00:00 (NY) for March and Sun 06:00:00 (NY) for Novembers due to daylight savings. It will be considered for beforeMarchEvent segment and ignored for beforeNovemberEvent segment. A nine-hour main sleep episode on Sun 11:00:00. Start time will be assigned as NY time zone and converted to 14:00:00. A seven-hour main sleep episode on Mon 06:00:00. This episode will be split into two parts: a five-hour sleep episode on Mon 06:00:00 and a two-hour sleep episode on Mon 11:00:00. The first part will be discarded as it is before 11am (Last Night End) Any segment shorter than one day will be ignored for sleep PRICE features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Sleep Intraday"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to run RAPIDS\u2019 tests. All files necessary for testing are stored in the ./tests/ directory Steps for Testing \u00b6 Testing Overview You have to create a single four day test dataset for the sensor you are working on. You will adjust your dataset with tests/script/assign_test_timestamps.py to fit Fri March 6th 2020 - Mon March 9th 2020 and Fri Oct 30th 2020 - Mon Nov 2nd 2020 . We test daylight saving times with these dates. We have one test participant per platform ( pids : android , ios , fitbit , empatica , empty ). The data device_id should be equal to the pid . We will run this test dataset against six test pipelines, three for frequency , periodic , and event time segments in a single time zone, and the same three in multiple time zones. You will have to create your test data to cover as many corner cases as possible. These cases depend on the sensor you are working on. The time segments and time zones to be tested are: Frequency 30 minutes ( 30min,30 ) Periodic morning ( morning,06:00:00,5H 59M 59S,every_day,0 ) daily ( daily,00:00:00,23H 59M 59S,every_day,0 ) three-day segments that repeat every day ( threeday,00:00:00,71H 59M 59S,every_day,0 ) three-day segments that repeat every Friday ( weekend,00:00:00,71H 59M 59S,wday,5 ) Event A segment that starts 3 hour before an event (Sat Mar 07 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves forward and the period 2am-3am does not exist. In this case, the segment would start on Sat Mar 07 2020 16:00:00 EST (timestamp: 1583614800000) and end on Sun Mar 08 2020 15:00:00 EST (timestamp: 1583694000000). ( beforeMarchEvent,1583625600000,22H,3H,-1,android ) A segment that starts 3 hour before an event (Sat Oct 31 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves back and the period 1am-2am exists twice. In this case, the segment would start on Sat Oct 31 2020 16:00:00 EST (timestamp: 1604174400000) and end on Sun Nov 01 2020 13:00:00 EST (timestamp: 1604253600000). ( beforeNovemberEvent,1604185200000,22H,3H,-1,android ) Single time zone to test America/New_York Multi time zones to test America/New_York starting at 0 America/Los_Angeles starting at 1583600400000 (Sat Mar 07 2020 12:00:00 EST) America/New_York starting at 1583683200000 (Sun Mar 08 2020 12:00:00 EST) America/Los_Angeles starting at 1604160000000 (Sat Oct 31 2020 12:00:00 EST) America/New_York starting at 1604250000000 (Sun Nov 01 2020 12:00:00 EST) Understanding event segments with multi timezones Document your tests Before you start implementing any test data you need to document your tests. The documentation of your tests should be added to docs/developers/test-cases.md under the corresponding sensor. You will need to add two subsections Description and the Checklist The amount of data you need depends on each sensor but you can be efficient by creating data that covers corner cases in more than one time segment. For example, a battery episode from 11am to 1pm, covers the case when an episode has to be split for 30min frequency segments and for morning segments. As a rule of thumb think about corner cases for 30min segments as they will give you the most flexibility. Only add tests for iOS if the raw data format is different than Android\u2019s (for example for screen) Create specific tests for Sunday before and after 02:00. These will test daylight saving switches, in March 02:00 to 02:59 do not exist, and in November 01:00 to 01:59 exist twice (read below how tests/script/assign_test_timestamps.py handles this) Example of Description Description is a list and every item describes the different scenarios your test data is covering. For example, if we are testing PHONE_BATTERY: - We test 24 discharge episodes, 24 charge episodes and 2 episodes with a 0 discharge rate - One episode is shorter than 30 minutes (`start timestamp` to `end timestamp`) - One episode is 120 minutes long from 11:00 to 13:00 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for morning segments - One episode is 60 minutes long from 23:30 to 00:30 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for daly segments (overnight) - One 0 discharge rate episode 10 minutes long that happens within a 30-minute segment (10:00 to 10:29) (`start timestamp` to `end timestamp`) - Three discharge episodes that happen between during beforeMarchEvent (start/end timestamps of those discharge episodes) - Three charge episodes that happen between during beforeMarchEvent (start/end timestamps of those charge episodes) - One discharge episode that happen between 00:30 and 04:00 to test for daylight saving times in March and Novemeber 2020. - ... any other test corner cases you can think of Describe your test cases in as much detail as possible so in the future if we find a bug in RAPIDS, we know what test case we did not include and should add. Example of Checklist Checklist is a table where you confirm you have verified the output of your dataset for the different time segments and time zones time segment single tz multi tz platform 30min OK OK android and iOS morning OK OK android and iOS daily OK OK android and iOS threeday OK OK android and iOS weekend OK OK android and iOS beforeMarchEvent OK OK android and iOS beforeNovemberEvent OK OK android and iOS Add raw input data. Add the raw test data to the corresponding sensor CSV file in tests/data/manual/aware_csv/SENSOR_raw.csv . Create the CSV if it does not exist. The test data you create will have the same columns as normal raw data except test_time replaces timestamp . To make your life easier, you can place a test data row in time using the test_time column with the following format: Day HH:MM:SS.XXX , for example Fri 22:54:30.597 . You can convert your manual test data to actual raw test data with the following commands: For the selected files: (It could be a single file name or multiple file names separated by whitespace(s)) python tests/scripts/assign_test_timestamps.py -f file_name_1 file_name_2 For all files under the tests/data/manual/aware_csv folder: python tests/scripts/assign_test_timestamps.py -a The script assign_test_timestamps.py converts you test_time column into a timestamp . For example, Fri 22:54:30.597 is converted to 1583553270597 ( Fri Mar 06 2020 22:54:30 GMT-0500 ) and to 1604112870597 ( Fri Oct 30 2020 22:54:30 GMT-0400 ). Note you can include milliseconds. The device_id should be the same as pid . Example of test data you need to create The test_time column will be automatically converted to a timestamp that fits our testing periods in March and November by tests/script/assign_test_timestamps.py test_time,device_id,battery_level,battery_scale,battery_status Fri 01:00:00.000,ios,90,100,4 Fri 01:00:30.500,ios,89,100,4 Fri 01:01:00.000,ios,80,100,4 Fri 01:01:45.500,ios,79,100,4 ... Sat 08:00:00.000,ios,78,100,4 Sat 08:01:00.000,ios,50,100,4 Sat 08:02:00.000,ios,49,100,4 Add expected output data. Add or update the expected output feature file of the participant and sensor you are testing: tests/data/processed/features/ { type_of_time_segment } / { pid } /device_sensor.csv # this example is expected output data for battery tests for periodic segments in a single timezone tests/data/processed/features/stz_periodic/android/phone_sensor.csv # this example is expected output data for battery tests for periodic segments in multi timezones tests/data/processed/features/mtz_periodic/android/phone_sensor.csv Edit the config file(s). Activate the sensor provider you are testing if it isn\u2019t already. Set [SENSOR][PROVIDER][COMPUTE] to TRUE in the config.yaml of the time segments and time zones you are testing: - tests/settings/stz_frequency_config.yaml # For single-timezone frequency time segments - tests/settings/stz_periodic_config.yaml # For single-timezone periodic time segments - tests/settings/stz_event_config.yaml # For single-timezone event time segments - tests/settings/mtz_frequency_config.yaml # For multi-timezone frequency time segments - tests/settings/mtz_periodic_config.yaml # For multi-timezone periodic time segments - tests/settings/mtz_event_config.yaml # For multi-timezone event time segments Run the pipeline and tests. You can run all six segment pipelines and their tests bash tests/scripts/run_tests.sh -t all You can run only the pipeline of a specific time segment and its tests bash tests/scripts/run_tests.sh -t stz_frequency -a both # swap stz_frequency for mtz_frequency, stz_event, mtz_event, etc Or, if you are working on your tests and you want to run a pipeline and its tests independently bash tests/scripts/run_tests.sh -t stz_frequency -a run bash tests/scripts/run_tests.sh -t stz_frequency -a test How does the test execution work? This bash script tests/scripts/run_tests.sh executes one or all test pipelines for different time segment types ( frequency , periodic , and events ) and single or multiple timezones. The python script tests/scripts/run_tests.py runs the tests. It parses the involved participants and active sensor providers in the config.yaml file of the time segment type and time zone being tested. We test that the output file we expect exists and that its content matches the expected values. Output Example The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_frequency ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_frequency FAIL The results above show that the for stz_periodic, both test_sensors_files_exist and test_sensors_features_calculations passed. While for stz_frequency, the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. Additionally, you should get the traceback of the failure (not shown here).","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to run RAPIDS\u2019 tests. All files necessary for testing are stored in the ./tests/ directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"Testing Overview You have to create a single four day test dataset for the sensor you are working on. You will adjust your dataset with tests/script/assign_test_timestamps.py to fit Fri March 6th 2020 - Mon March 9th 2020 and Fri Oct 30th 2020 - Mon Nov 2nd 2020 . We test daylight saving times with these dates. We have one test participant per platform ( pids : android , ios , fitbit , empatica , empty ). The data device_id should be equal to the pid . We will run this test dataset against six test pipelines, three for frequency , periodic , and event time segments in a single time zone, and the same three in multiple time zones. You will have to create your test data to cover as many corner cases as possible. These cases depend on the sensor you are working on. The time segments and time zones to be tested are: Frequency 30 minutes ( 30min,30 ) Periodic morning ( morning,06:00:00,5H 59M 59S,every_day,0 ) daily ( daily,00:00:00,23H 59M 59S,every_day,0 ) three-day segments that repeat every day ( threeday,00:00:00,71H 59M 59S,every_day,0 ) three-day segments that repeat every Friday ( weekend,00:00:00,71H 59M 59S,wday,5 ) Event A segment that starts 3 hour before an event (Sat Mar 07 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves forward and the period 2am-3am does not exist. In this case, the segment would start on Sat Mar 07 2020 16:00:00 EST (timestamp: 1583614800000) and end on Sun Mar 08 2020 15:00:00 EST (timestamp: 1583694000000). ( beforeMarchEvent,1583625600000,22H,3H,-1,android ) A segment that starts 3 hour before an event (Sat Oct 31 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves back and the period 1am-2am exists twice. In this case, the segment would start on Sat Oct 31 2020 16:00:00 EST (timestamp: 1604174400000) and end on Sun Nov 01 2020 13:00:00 EST (timestamp: 1604253600000). ( beforeNovemberEvent,1604185200000,22H,3H,-1,android ) Single time zone to test America/New_York Multi time zones to test America/New_York starting at 0 America/Los_Angeles starting at 1583600400000 (Sat Mar 07 2020 12:00:00 EST) America/New_York starting at 1583683200000 (Sun Mar 08 2020 12:00:00 EST) America/Los_Angeles starting at 1604160000000 (Sat Oct 31 2020 12:00:00 EST) America/New_York starting at 1604250000000 (Sun Nov 01 2020 12:00:00 EST) Understanding event segments with multi timezones Document your tests Before you start implementing any test data you need to document your tests. The documentation of your tests should be added to docs/developers/test-cases.md under the corresponding sensor. You will need to add two subsections Description and the Checklist The amount of data you need depends on each sensor but you can be efficient by creating data that covers corner cases in more than one time segment. For example, a battery episode from 11am to 1pm, covers the case when an episode has to be split for 30min frequency segments and for morning segments. As a rule of thumb think about corner cases for 30min segments as they will give you the most flexibility. Only add tests for iOS if the raw data format is different than Android\u2019s (for example for screen) Create specific tests for Sunday before and after 02:00. These will test daylight saving switches, in March 02:00 to 02:59 do not exist, and in November 01:00 to 01:59 exist twice (read below how tests/script/assign_test_timestamps.py handles this) Example of Description Description is a list and every item describes the different scenarios your test data is covering. For example, if we are testing PHONE_BATTERY: - We test 24 discharge episodes, 24 charge episodes and 2 episodes with a 0 discharge rate - One episode is shorter than 30 minutes (`start timestamp` to `end timestamp`) - One episode is 120 minutes long from 11:00 to 13:00 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for morning segments - One episode is 60 minutes long from 23:30 to 00:30 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for daly segments (overnight) - One 0 discharge rate episode 10 minutes long that happens within a 30-minute segment (10:00 to 10:29) (`start timestamp` to `end timestamp`) - Three discharge episodes that happen between during beforeMarchEvent (start/end timestamps of those discharge episodes) - Three charge episodes that happen between during beforeMarchEvent (start/end timestamps of those charge episodes) - One discharge episode that happen between 00:30 and 04:00 to test for daylight saving times in March and Novemeber 2020. - ... any other test corner cases you can think of Describe your test cases in as much detail as possible so in the future if we find a bug in RAPIDS, we know what test case we did not include and should add. Example of Checklist Checklist is a table where you confirm you have verified the output of your dataset for the different time segments and time zones time segment single tz multi tz platform 30min OK OK android and iOS morning OK OK android and iOS daily OK OK android and iOS threeday OK OK android and iOS weekend OK OK android and iOS beforeMarchEvent OK OK android and iOS beforeNovemberEvent OK OK android and iOS Add raw input data. Add the raw test data to the corresponding sensor CSV file in tests/data/manual/aware_csv/SENSOR_raw.csv . Create the CSV if it does not exist. The test data you create will have the same columns as normal raw data except test_time replaces timestamp . To make your life easier, you can place a test data row in time using the test_time column with the following format: Day HH:MM:SS.XXX , for example Fri 22:54:30.597 . You can convert your manual test data to actual raw test data with the following commands: For the selected files: (It could be a single file name or multiple file names separated by whitespace(s)) python tests/scripts/assign_test_timestamps.py -f file_name_1 file_name_2 For all files under the tests/data/manual/aware_csv folder: python tests/scripts/assign_test_timestamps.py -a The script assign_test_timestamps.py converts you test_time column into a timestamp . For example, Fri 22:54:30.597 is converted to 1583553270597 ( Fri Mar 06 2020 22:54:30 GMT-0500 ) and to 1604112870597 ( Fri Oct 30 2020 22:54:30 GMT-0400 ). Note you can include milliseconds. The device_id should be the same as pid . Example of test data you need to create The test_time column will be automatically converted to a timestamp that fits our testing periods in March and November by tests/script/assign_test_timestamps.py test_time,device_id,battery_level,battery_scale,battery_status Fri 01:00:00.000,ios,90,100,4 Fri 01:00:30.500,ios,89,100,4 Fri 01:01:00.000,ios,80,100,4 Fri 01:01:45.500,ios,79,100,4 ... Sat 08:00:00.000,ios,78,100,4 Sat 08:01:00.000,ios,50,100,4 Sat 08:02:00.000,ios,49,100,4 Add expected output data. Add or update the expected output feature file of the participant and sensor you are testing: tests/data/processed/features/ { type_of_time_segment } / { pid } /device_sensor.csv # this example is expected output data for battery tests for periodic segments in a single timezone tests/data/processed/features/stz_periodic/android/phone_sensor.csv # this example is expected output data for battery tests for periodic segments in multi timezones tests/data/processed/features/mtz_periodic/android/phone_sensor.csv Edit the config file(s). Activate the sensor provider you are testing if it isn\u2019t already. Set [SENSOR][PROVIDER][COMPUTE] to TRUE in the config.yaml of the time segments and time zones you are testing: - tests/settings/stz_frequency_config.yaml # For single-timezone frequency time segments - tests/settings/stz_periodic_config.yaml # For single-timezone periodic time segments - tests/settings/stz_event_config.yaml # For single-timezone event time segments - tests/settings/mtz_frequency_config.yaml # For multi-timezone frequency time segments - tests/settings/mtz_periodic_config.yaml # For multi-timezone periodic time segments - tests/settings/mtz_event_config.yaml # For multi-timezone event time segments Run the pipeline and tests. You can run all six segment pipelines and their tests bash tests/scripts/run_tests.sh -t all You can run only the pipeline of a specific time segment and its tests bash tests/scripts/run_tests.sh -t stz_frequency -a both # swap stz_frequency for mtz_frequency, stz_event, mtz_event, etc Or, if you are working on your tests and you want to run a pipeline and its tests independently bash tests/scripts/run_tests.sh -t stz_frequency -a run bash tests/scripts/run_tests.sh -t stz_frequency -a test How does the test execution work? This bash script tests/scripts/run_tests.sh executes one or all test pipelines for different time segment types ( frequency , periodic , and events ) and single or multiple timezones. The python script tests/scripts/run_tests.py runs the tests. It parses the involved participants and active sensor providers in the config.yaml file of the time segment type and time zone being tested. We test that the output file we expect exists and that its content matches the expected values. Output Example The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_frequency ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_frequency FAIL The results above show that the for stz_periodic, both test_sensors_files_exist and test_sensors_features_calculations passed. While for stz_frequency, the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. Additionally, you should get the traceback of the failure (not shown here).","title":"Steps for Testing"},{"location":"developers/validation-schema-config/","text":"Validation schema of config.yaml \u00b6 Why do we need to validate the config.yaml ? Most of the key/values in the config.yaml are constrained to a set of possible values or types. For example [TIME_SEGMENTS][TYPE] can only be one of [\"FREQUENCY\", \"PERIODIC\", \"EVENT\"] , and [TIMEZONE] has to be a string. We should show the user an error if that\u2019s not the case. We could validate this in Python or R but since we reuse scripts and keys in multiple places, tracking these validations can be time consuming and get out of control. Thus, we do these validations through a schema and check that schema before RAPIDS starts processing any data so the user can see the error right away. Keep in mind these validations can only cover certain base cases. Some validations that require more complex logic should still be done in the respective script. For example, we can check that a CSV file path actually ends in .csv but we can only check that the file actually exists in a Python script. The structure and values of the config.yaml file are validated using a YAML schema stored in tools/config.schema.yaml . Each key in config.yaml , for example PIDS , has a corresponding entry in the schema where we can validate its type, possible values, required properties, min and max values, among other things. The config.yaml is validated against the schema every time RAPIDS runs (see the top of the Snakefile ): validate ( config , \"tools/config.schema.yaml\" ) Structure of the schema \u00b6 The schema has three main sections required , definitions , and properties . All of them are just nested key/value YAML pairs, where the value can be a primitive type ( integer , string , boolean , number ) or can be another key/value pair ( object ). required \u00b6 required lists properties that should be present in the config.yaml . We will almost always add every config.yaml key to this list (meaning that the user cannot delete any of those keys like TIMEZONE or PIDS ). definitions \u00b6 definitions lists key/values that are common to different properties so we can reuse them. You can define a key/value under definitions and use $ref to refer to it in any property . For example, every sensor like [PHONE_ACCELEROMETER] has one or more providers like RAPIDS and PANDA , these providers have some common properties like the COMPUTE flag or the SRC_SCRIPT string. Therefore we define a shared provider \u201ctemplate\u201d that is used by every provider and extended with properties exclusive to each one of them. For example: provider definition (template) The PROVIDER definition will be used later on different properties . PROVIDER : type : object required : [ COMPUTE , SRC_SCRIPT , FEATURES ] properties : COMPUTE : type : boolean FEATURES : type : [ array , object ] SRC_SCRIPT : type : string pattern : \"^.*\\\\.(py|R)$\" provider reusing and extending the template Notice that RAPIDS (a provider) uses and extends the PROVIDER template in this example. The FEATURES key is overriding the FEATURES key from the #/definitions/PROVIDER template but is keeping the validation for COMPUTE , and SRC_SCRIPT . For more details about reusing properties, go to this link PHONE_ACCELEROMETER : type : object # .. other properties PROVIDERS : type : [ \"null\" , object ] properties : RAPIDS : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : FEATURES : type : array uniqueItems : True items : type : string enum : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] properties \u00b6 properties are nested key/values that describe the different components of our config.yaml file. Values can be of one or more primitive types like string , number , array , boolean and null . Values can also be another key/value pair (of type object ) that are similar to a dictionary in Python. For example, the following property validates the PIDS of our config.yaml . It checks that PIDS is an array with unique items of type string . PIDS : type : array uniqueItems : True items : type : string Modifying the schema \u00b6 Validating the config.yaml during development If you updated the schema and want to check the config.yaml is compliant, you can run the command snakemake --list-params-changes . You will see Building DAG of jobs... if there are no problems or an error message otherwise (try setting any COMPUTE flag to a string like test instead of False/True ). You can use this command without having to configure RAPIDS to process any participants or sensors. You can validate different aspects of each key/value in our config.yaml file: number/integer Including min and max values MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS : type : number minimum : 0 maximum : 1 FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD : type : integer exclusiveMinimum : 0 string Including valid values ( enum ) items : type : string enum : [ \"count\" , \"maxlux\" , \"minlux\" , \"avglux\" , \"medianlux\" , \"stdlux\" ] boolean MINUTES_DATA_USED : type : boolean array Including whether or not it should have unique values, the type of the array\u2019s elements ( strings , numbers ) and valid values ( enum ). MESSAGES_TYPES : type : array uniqueItems : True items : type : string enum : [ \"received\" , \"sent\" ] object PARENT is an object that has two properties. KID1 is one of those properties that are, in turn, another object that will reuse the \"#/definitions/PROVIDER\" definition AND also include (extend) two extra properties GRAND_KID1 of type array and GRAND_KID2 of type number . KID2 is another property of PARENT of type boolean . The schema validation looks like this PARENT : type : object properties : KID1 : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : GRAND_KID1 : type : array uniqueItems : True GRAND_KID2 : type : number KID2 : type : boolean The config.yaml key that the previous schema validates looks like this: PARENT : KID1 : # These four come from the `PROVIDER` definition (template) COMPUTE : False FEATURES : [ x , y ] # an array SRC_SCRIPT : \"a path to a py or R script\" # This two come from the extension GRAND_KID1 : [ a , b ] # an array GRAND_KID2 : 5.1 # an number KID2 : True # a boolean Verifying the schema is correct \u00b6 We recommend that before you start modifying the schema you modify the config.yaml key that you want to validate with an invalid value. For example, if you want to validate that COMPUTE is boolean, you set COMPUTE: 123 . Then create your validation, run snakemake --list-params-changes and make sure your validation fails (123 is not boolean ), and then set the key to the correct value. In other words, make sure it\u2019s broken first so that you know that your validation works. Warning Be careful . You can check that the schema config.schema.yaml has a valid format by running python tools/check_schema.py . You will see this message if its structure is correct: Schema is OK . However, we don\u2019t have a way to detect typos, for example allOf will work but allOF won\u2019t (capital F ) and it won\u2019t show any error. That\u2019s why we recommend to start with an invalid key/value in your config.yaml so that you can be sure the schema validation finds the problem. Useful resources \u00b6 Read the following links to learn more about what we can validate with schemas. They are based on JSON instead of YAML schemas but the same concepts apply. Understanding JSON Schemas Specification of the JSON schema we use","title":"Validation schema of config.yaml"},{"location":"developers/validation-schema-config/#validation-schema-of-configyaml","text":"Why do we need to validate the config.yaml ? Most of the key/values in the config.yaml are constrained to a set of possible values or types. For example [TIME_SEGMENTS][TYPE] can only be one of [\"FREQUENCY\", \"PERIODIC\", \"EVENT\"] , and [TIMEZONE] has to be a string. We should show the user an error if that\u2019s not the case. We could validate this in Python or R but since we reuse scripts and keys in multiple places, tracking these validations can be time consuming and get out of control. Thus, we do these validations through a schema and check that schema before RAPIDS starts processing any data so the user can see the error right away. Keep in mind these validations can only cover certain base cases. Some validations that require more complex logic should still be done in the respective script. For example, we can check that a CSV file path actually ends in .csv but we can only check that the file actually exists in a Python script. The structure and values of the config.yaml file are validated using a YAML schema stored in tools/config.schema.yaml . Each key in config.yaml , for example PIDS , has a corresponding entry in the schema where we can validate its type, possible values, required properties, min and max values, among other things. The config.yaml is validated against the schema every time RAPIDS runs (see the top of the Snakefile ): validate ( config , \"tools/config.schema.yaml\" )","title":"Validation schema of config.yaml"},{"location":"developers/validation-schema-config/#structure-of-the-schema","text":"The schema has three main sections required , definitions , and properties . All of them are just nested key/value YAML pairs, where the value can be a primitive type ( integer , string , boolean , number ) or can be another key/value pair ( object ).","title":"Structure of the schema"},{"location":"developers/validation-schema-config/#required","text":"required lists properties that should be present in the config.yaml . We will almost always add every config.yaml key to this list (meaning that the user cannot delete any of those keys like TIMEZONE or PIDS ).","title":"required"},{"location":"developers/validation-schema-config/#definitions","text":"definitions lists key/values that are common to different properties so we can reuse them. You can define a key/value under definitions and use $ref to refer to it in any property . For example, every sensor like [PHONE_ACCELEROMETER] has one or more providers like RAPIDS and PANDA , these providers have some common properties like the COMPUTE flag or the SRC_SCRIPT string. Therefore we define a shared provider \u201ctemplate\u201d that is used by every provider and extended with properties exclusive to each one of them. For example: provider definition (template) The PROVIDER definition will be used later on different properties . PROVIDER : type : object required : [ COMPUTE , SRC_SCRIPT , FEATURES ] properties : COMPUTE : type : boolean FEATURES : type : [ array , object ] SRC_SCRIPT : type : string pattern : \"^.*\\\\.(py|R)$\" provider reusing and extending the template Notice that RAPIDS (a provider) uses and extends the PROVIDER template in this example. The FEATURES key is overriding the FEATURES key from the #/definitions/PROVIDER template but is keeping the validation for COMPUTE , and SRC_SCRIPT . For more details about reusing properties, go to this link PHONE_ACCELEROMETER : type : object # .. other properties PROVIDERS : type : [ \"null\" , object ] properties : RAPIDS : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : FEATURES : type : array uniqueItems : True items : type : string enum : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ]","title":"definitions"},{"location":"developers/validation-schema-config/#properties","text":"properties are nested key/values that describe the different components of our config.yaml file. Values can be of one or more primitive types like string , number , array , boolean and null . Values can also be another key/value pair (of type object ) that are similar to a dictionary in Python. For example, the following property validates the PIDS of our config.yaml . It checks that PIDS is an array with unique items of type string . PIDS : type : array uniqueItems : True items : type : string","title":"properties"},{"location":"developers/validation-schema-config/#modifying-the-schema","text":"Validating the config.yaml during development If you updated the schema and want to check the config.yaml is compliant, you can run the command snakemake --list-params-changes . You will see Building DAG of jobs... if there are no problems or an error message otherwise (try setting any COMPUTE flag to a string like test instead of False/True ). You can use this command without having to configure RAPIDS to process any participants or sensors. You can validate different aspects of each key/value in our config.yaml file: number/integer Including min and max values MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS : type : number minimum : 0 maximum : 1 FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD : type : integer exclusiveMinimum : 0 string Including valid values ( enum ) items : type : string enum : [ \"count\" , \"maxlux\" , \"minlux\" , \"avglux\" , \"medianlux\" , \"stdlux\" ] boolean MINUTES_DATA_USED : type : boolean array Including whether or not it should have unique values, the type of the array\u2019s elements ( strings , numbers ) and valid values ( enum ). MESSAGES_TYPES : type : array uniqueItems : True items : type : string enum : [ \"received\" , \"sent\" ] object PARENT is an object that has two properties. KID1 is one of those properties that are, in turn, another object that will reuse the \"#/definitions/PROVIDER\" definition AND also include (extend) two extra properties GRAND_KID1 of type array and GRAND_KID2 of type number . KID2 is another property of PARENT of type boolean . The schema validation looks like this PARENT : type : object properties : KID1 : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : GRAND_KID1 : type : array uniqueItems : True GRAND_KID2 : type : number KID2 : type : boolean The config.yaml key that the previous schema validates looks like this: PARENT : KID1 : # These four come from the `PROVIDER` definition (template) COMPUTE : False FEATURES : [ x , y ] # an array SRC_SCRIPT : \"a path to a py or R script\" # This two come from the extension GRAND_KID1 : [ a , b ] # an array GRAND_KID2 : 5.1 # an number KID2 : True # a boolean","title":"Modifying the schema"},{"location":"developers/validation-schema-config/#verifying-the-schema-is-correct","text":"We recommend that before you start modifying the schema you modify the config.yaml key that you want to validate with an invalid value. For example, if you want to validate that COMPUTE is boolean, you set COMPUTE: 123 . Then create your validation, run snakemake --list-params-changes and make sure your validation fails (123 is not boolean ), and then set the key to the correct value. In other words, make sure it\u2019s broken first so that you know that your validation works. Warning Be careful . You can check that the schema config.schema.yaml has a valid format by running python tools/check_schema.py . You will see this message if its structure is correct: Schema is OK . However, we don\u2019t have a way to detect typos, for example allOf will work but allOF won\u2019t (capital F ) and it won\u2019t show any error. That\u2019s why we recommend to start with an invalid key/value in your config.yaml so that you can be sure the schema validation finds the problem.","title":"Verifying the schema is correct"},{"location":"developers/validation-schema-config/#useful-resources","text":"Read the following links to learn more about what we can validate with schemas. They are based on JSON instead of YAML schemas but the same concepts apply. Understanding JSON Schemas Specification of the JSON schema we use","title":"Useful resources"},{"location":"developers/virtual-environments/","text":"Python Virtual Environment \u00b6 Add new packages \u00b6 Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ). Remove packages \u00b6 Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME Updating all packages \u00b6 Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all Update your conda environment.yaml \u00b6 After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml R Virtual Environment \u00b6 Add new packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\") Remove packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\") Updating all packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update() Update your R renv.lock \u00b6 After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Virtual Environments"},{"location":"developers/virtual-environments/#python-virtual-environment","text":"","title":"Python Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ).","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages","text":"Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages","text":"Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#r-virtual-environment","text":"","title":"R Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\")","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\")","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update()","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-r-renvlock","text":"After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Update your R renv.lock"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page. You can implement new features in Python or R scripts. You won\u2019t have to deal with time zones, dates, times, data cleaning, or preprocessing. The data that RAPIDS pipes to your feature extraction code are ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create your feature provider script Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 with a Python script that requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor of any device with a configuration entry in config.yaml : Smartphone (AWARE) Phone Accelerometer Phone Activity Recognition Phone Applications Crashes Phone Applications Foreground Phone Applications Notifications Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Keyboard Phone Light Phone Locations Phone Log Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Fitbit Data Yield Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Sleep Intraday Fitbit Steps Summary Fitbit Steps Intraday Empatica Empatica Accelerometer Empatica Heart Rate Empatica Temperature Empatica Electrodermal Activity Empatica Blood Volume Pulse Empatica Inter Beat Interval Empatica Tags Modify the config.yaml file \u00b6 In this step, you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : CONTAINER : accelerometer PROVIDERS : RAPIDS : # this is a feature provider COMPUTE : False ... PANDA : # this is another feature provider COMPUTE : False ... VEGA : # this is our new feature provider COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_SCRIPT : src/features/phone_accelerometer/vega/main.py Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string, or an array of any of such types. [SRC_SCRIPT] The relative path from RAPIDS\u2019 root folder to a script that computes the features for this provider. It can be implemented in R or Python. Create a feature provider script \u00b6 Create your feature Python or R script called main.py or main.R in the correct folder, src/feature/[sensorname]/[providername]/ . RAPIDS automatically loads and executes it based on the config key [SRC_SCRIPT] you added in the last step. For our example, this script is: src/feature/phone_accelerometer/vega/main.py Implement your feature extraction code \u00b6 Every feature script ( main.[py|R] ) needs a [providername]_features function with specific parameters. RAPIDS calls this function with the sensor data ready to process and with other functions and arguments you will need. Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): # empty for now return ( your_features_df ) R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ){ # empty for now return ( your_features_df ) } Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example, this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R, this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The next step is to implement the code that computes your behavioral features in your provider script\u2019s function. As with any other script, this function can call other auxiliary methods, but in general terms, it should have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that the phone\u2019s battery, screen, and activity recognition data are given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but keep reading to understand why we need it. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and weekend basis for p01 . The labels are arbitrary, and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks , and once where time_segment is my_weekends . In this example, not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from that number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g., 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. The name of your features should only contain letters or numbers ( feature1 ) by convention. RAPIDS automatically adds the correct sensor and provider prefix; in our example, this prefix is phone_accelerometr_vega_ . PHONE_ACCELEROMETER Provider Example For your reference, this our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features import pandas as pd import numpy as np def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), open a new discussion in Github and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page. You can implement new features in Python or R scripts. You won\u2019t have to deal with time zones, dates, times, data cleaning, or preprocessing. The data that RAPIDS pipes to your feature extraction code are ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create your feature provider script Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 with a Python script that requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor of any device with a configuration entry in config.yaml : Smartphone (AWARE) Phone Accelerometer Phone Activity Recognition Phone Applications Crashes Phone Applications Foreground Phone Applications Notifications Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Keyboard Phone Light Phone Locations Phone Log Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Fitbit Data Yield Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Sleep Intraday Fitbit Steps Summary Fitbit Steps Intraday Empatica Empatica Accelerometer Empatica Heart Rate Empatica Temperature Empatica Electrodermal Activity Empatica Blood Volume Pulse Empatica Inter Beat Interval Empatica Tags","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step, you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : CONTAINER : accelerometer PROVIDERS : RAPIDS : # this is a feature provider COMPUTE : False ... PANDA : # this is another feature provider COMPUTE : False ... VEGA : # this is our new feature provider COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_SCRIPT : src/features/phone_accelerometer/vega/main.py Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string, or an array of any of such types. [SRC_SCRIPT] The relative path from RAPIDS\u2019 root folder to a script that computes the features for this provider. It can be implemented in R or Python.","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-feature-provider-script","text":"Create your feature Python or R script called main.py or main.R in the correct folder, src/feature/[sensorname]/[providername]/ . RAPIDS automatically loads and executes it based on the config key [SRC_SCRIPT] you added in the last step. For our example, this script is: src/feature/phone_accelerometer/vega/main.py","title":"Create a feature provider script"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"Every feature script ( main.[py|R] ) needs a [providername]_features function with specific parameters. RAPIDS calls this function with the sensor data ready to process and with other functions and arguments you will need. Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): # empty for now return ( your_features_df ) R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ){ # empty for now return ( your_features_df ) } Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example, this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R, this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The next step is to implement the code that computes your behavioral features in your provider script\u2019s function. As with any other script, this function can call other auxiliary methods, but in general terms, it should have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that the phone\u2019s battery, screen, and activity recognition data are given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but keep reading to understand why we need it. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and weekend basis for p01 . The labels are arbitrary, and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks , and once where time_segment is my_weekends . In this example, not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from that number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g., 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. The name of your features should only contain letters or numbers ( feature1 ) by convention. RAPIDS automatically adds the correct sensor and provider prefix; in our example, this prefix is phone_accelerometr_vega_ . PHONE_ACCELEROMETER Provider Example For your reference, this our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features import pandas as pd import numpy as np def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), open a new discussion in Github and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/empatica-accelerometer/","text":"Empatica Accelerometer \u00b6 Sensor parameters description for [EMPATICA_ACCELEROMETER] : Key Description [CONTAINER] Name of the CSV file containing accelerometer data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_accelerometer_raw.csv - data/raw/ { pid } /empatica_accelerometer_with_datetime.csv - data/interim/ { pid } /empatica_accelerometer_features/empatica_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_accelerometer.csv Parameters description for [EMPATICA_ACCELEROMETER][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ACCELEROMETER features from the DBDP provider [FEATURES] Features to be computed, see table below Features description for [EMPATICA_ACCELEROMETER][PROVIDERS][RAPDBDPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is too big to fit in memory. We are considering different alternatives to overcome this problem, if this is something you need, get in touch and we can discuss how to implement it.","title":"Empatica Accelerometer"},{"location":"features/empatica-accelerometer/#empatica-accelerometer","text":"Sensor parameters description for [EMPATICA_ACCELEROMETER] : Key Description [CONTAINER] Name of the CSV file containing accelerometer data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Accelerometer"},{"location":"features/empatica-accelerometer/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_accelerometer_raw.csv - data/raw/ { pid } /empatica_accelerometer_with_datetime.csv - data/interim/ { pid } /empatica_accelerometer_features/empatica_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_accelerometer.csv Parameters description for [EMPATICA_ACCELEROMETER][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ACCELEROMETER features from the DBDP provider [FEATURES] Features to be computed, see table below Features description for [EMPATICA_ACCELEROMETER][PROVIDERS][RAPDBDPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is too big to fit in memory. We are considering different alternatives to overcome this problem, if this is something you need, get in touch and we can discuss how to implement it.","title":"DBDP provider"},{"location":"features/empatica-blood-volume-pulse/","text":"Empatica Blood Volume Pulse \u00b6 Sensor parameters description for [EMPATICA_BLOOD_VOLUME_PULSE] : Key Description [CONTAINER] Name of the CSV file containing blood volume pulse data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_blood_volume_pulse_raw.csv - data/raw/ { pid } /empatica_blood_volume_pulse_with_datetime.csv - data/interim/ { pid } /empatica_blood_volume_pulse_features/empatica_blood_volume_pulse_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_blood_volume_pulse.csv Parameters description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_BLOOD_VOLUME_PULSE features from the DBDP provider [FEATURES] Features to be computed from blood volume pulse intraday data, see table below Features description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Feature Units Description maxbvp - The maximum blood volume pulse during a time segment. minbvp - The minimum blood volume pulse during a time segment. avgbvp - The average blood volume pulse during a time segment. medianbvp - The median of blood volume pulse during a time segment. modebvp - The mode of blood volume pulse during a time segment. stdbvp - The standard deviation of blood volume pulse during a time segment. diffmaxmodebvp - The difference between the maximum and mode blood volume pulse during a time segment. diffminmodebvp - The difference between the mode and minimum blood volume pulse during a time segment. entropybvp nats Shannon\u2019s entropy measurement based on blood volume pulse during a time segment. Assumptions/Observations For more information about BVP read this .","title":"Empatica Blood Volume Pulse"},{"location":"features/empatica-blood-volume-pulse/#empatica-blood-volume-pulse","text":"Sensor parameters description for [EMPATICA_BLOOD_VOLUME_PULSE] : Key Description [CONTAINER] Name of the CSV file containing blood volume pulse data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Blood Volume Pulse"},{"location":"features/empatica-blood-volume-pulse/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_blood_volume_pulse_raw.csv - data/raw/ { pid } /empatica_blood_volume_pulse_with_datetime.csv - data/interim/ { pid } /empatica_blood_volume_pulse_features/empatica_blood_volume_pulse_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_blood_volume_pulse.csv Parameters description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_BLOOD_VOLUME_PULSE features from the DBDP provider [FEATURES] Features to be computed from blood volume pulse intraday data, see table below Features description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Feature Units Description maxbvp - The maximum blood volume pulse during a time segment. minbvp - The minimum blood volume pulse during a time segment. avgbvp - The average blood volume pulse during a time segment. medianbvp - The median of blood volume pulse during a time segment. modebvp - The mode of blood volume pulse during a time segment. stdbvp - The standard deviation of blood volume pulse during a time segment. diffmaxmodebvp - The difference between the maximum and mode blood volume pulse during a time segment. diffminmodebvp - The difference between the mode and minimum blood volume pulse during a time segment. entropybvp nats Shannon\u2019s entropy measurement based on blood volume pulse during a time segment. Assumptions/Observations For more information about BVP read this .","title":"DBDP provider"},{"location":"features/empatica-electrodermal-activity/","text":"Empatica Electrodermal Activity \u00b6 Sensor parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY] : Key Description [CONTAINER] Name of the CSV file containing electrodermal activity data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_electrodermal_activity_raw.csv - data/raw/ { pid } /empatica_electrodermal_activity_with_datetime.csv - data/interim/ { pid } /empatica_electrodermal_activity_features/empatica_electrodermal activity_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_electrodermal_activity.csv Parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ELECTRODERMAL_ACTIVITY features from the DBDP provider [FEATURES] Features to be computed from electrodermal activity intraday data, see table below Features description for [EMPATICA_ELECTRODERMAL ACTIVITY][PROVIDERS][DBDP] : Feature Units Description maxeda microsiemens The maximum electrical conductance during a time segment. mineda microsiemens The minimum electrical conductance during a time segment. avgeda microsiemens The average electrical conductance during a time segment. medianeda microsiemens The median of electrical conductance during a time segment. modeeda microsiemens The mode of electrical conductance during a time segment. stdeda microsiemens The standard deviation of electrical conductance during a time segment. diffmaxmodeeda microsiemens The difference between the maximum and mode electrical conductance during a time segment. diffminmodeeda microsiemens The difference between the mode and minimum electrical conductance during a time segment. entropyeda nats Shannon\u2019s entropy measurement based on electrical conductance during a time segment. Assumptions/Observations None","title":"Empatica Electrodermal Activity"},{"location":"features/empatica-electrodermal-activity/#empatica-electrodermal-activity","text":"Sensor parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY] : Key Description [CONTAINER] Name of the CSV file containing electrodermal activity data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Electrodermal Activity"},{"location":"features/empatica-electrodermal-activity/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_electrodermal_activity_raw.csv - data/raw/ { pid } /empatica_electrodermal_activity_with_datetime.csv - data/interim/ { pid } /empatica_electrodermal_activity_features/empatica_electrodermal activity_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_electrodermal_activity.csv Parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ELECTRODERMAL_ACTIVITY features from the DBDP provider [FEATURES] Features to be computed from electrodermal activity intraday data, see table below Features description for [EMPATICA_ELECTRODERMAL ACTIVITY][PROVIDERS][DBDP] : Feature Units Description maxeda microsiemens The maximum electrical conductance during a time segment. mineda microsiemens The minimum electrical conductance during a time segment. avgeda microsiemens The average electrical conductance during a time segment. medianeda microsiemens The median of electrical conductance during a time segment. modeeda microsiemens The mode of electrical conductance during a time segment. stdeda microsiemens The standard deviation of electrical conductance during a time segment. diffmaxmodeeda microsiemens The difference between the maximum and mode electrical conductance during a time segment. diffminmodeeda microsiemens The difference between the mode and minimum electrical conductance during a time segment. entropyeda nats Shannon\u2019s entropy measurement based on electrical conductance during a time segment. Assumptions/Observations None","title":"DBDP provider"},{"location":"features/empatica-heartrate/","text":"Empatica Heart Rate \u00b6 Sensor parameters description for [EMPATICA_HEARTRATE] : Key Description [CONTAINER] Name of the CSV file containing heart rate data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_heartrate_raw.csv - data/raw/ { pid } /empatica_heartrate_with_datetime.csv - data/interim/ { pid } /empatica_heartrate_features/empatica_heartrate_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_heartrate.csv Parameters description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_HEARTRATE features from the DBDP provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Feature Units Description maxhr beats The maximum heart rate during a time segment. minhr beats The minimum heart rate during a time segment. avghr beats The average heart rate during a time segment. medianhr beats The median of heart rate during a time segment. modehr beats The mode of heart rate during a time segment. stdhr beats The standard deviation of heart rate during a time segment. diffmaxmodehr beats The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. Assumptions/Observations We extract the previous features based on the average heart rate values computed in 10-second windows .","title":"Empatica Heart Rate"},{"location":"features/empatica-heartrate/#empatica-heart-rate","text":"Sensor parameters description for [EMPATICA_HEARTRATE] : Key Description [CONTAINER] Name of the CSV file containing heart rate data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Heart Rate"},{"location":"features/empatica-heartrate/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_heartrate_raw.csv - data/raw/ { pid } /empatica_heartrate_with_datetime.csv - data/interim/ { pid } /empatica_heartrate_features/empatica_heartrate_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_heartrate.csv Parameters description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_HEARTRATE features from the DBDP provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Feature Units Description maxhr beats The maximum heart rate during a time segment. minhr beats The minimum heart rate during a time segment. avghr beats The average heart rate during a time segment. medianhr beats The median of heart rate during a time segment. modehr beats The mode of heart rate during a time segment. stdhr beats The standard deviation of heart rate during a time segment. diffmaxmodehr beats The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. Assumptions/Observations We extract the previous features based on the average heart rate values computed in 10-second windows .","title":"DBDP provider"},{"location":"features/empatica-inter-beat-interval/","text":"Empatica Inter Beat Interval \u00b6 Sensor parameters description for [EMPATICA_INTER_BEAT_INTERVAL] : Key Description [CONTAINER] Name of the CSV file containing inter beat interval data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_inter_beat_interval_raw.csv - data/raw/ { pid } /empatica_inter_beat_interval_with_datetime.csv - data/interim/ { pid } /empatica_inter_beat_interval_features/empatica_inter_beat_interval_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_inter_beat_interval.csv Parameters description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_INTER_BEAT_INTERVAL features from the DBDP provider [FEATURES] Features to be computed from inter beat interval intraday data, see table below Features description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Feature Units Description maxibi seconds The maximum inter beat interval during a time segment. minibi seconds The minimum inter beat interval during a time segment. avgibi seconds The average inter beat interval during a time segment. medianibi seconds The median of inter beat interval during a time segment. modeibi seconds The mode of inter beat interval during a time segment. stdibi seconds The standard deviation of inter beat interval during a time segment. diffmaxmodeibi seconds The difference between the maximum and mode inter beat interval during a time segment. diffminmodeibi seconds The difference between the mode and minimum inter beat interval during a time segment. entropyibi nats Shannon\u2019s entropy measurement based on inter beat interval during a time segment. Assumptions/Observations For more information about IBI read this .","title":"Empatica Inter Beat Interval"},{"location":"features/empatica-inter-beat-interval/#empatica-inter-beat-interval","text":"Sensor parameters description for [EMPATICA_INTER_BEAT_INTERVAL] : Key Description [CONTAINER] Name of the CSV file containing inter beat interval data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Inter Beat Interval"},{"location":"features/empatica-inter-beat-interval/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_inter_beat_interval_raw.csv - data/raw/ { pid } /empatica_inter_beat_interval_with_datetime.csv - data/interim/ { pid } /empatica_inter_beat_interval_features/empatica_inter_beat_interval_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_inter_beat_interval.csv Parameters description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_INTER_BEAT_INTERVAL features from the DBDP provider [FEATURES] Features to be computed from inter beat interval intraday data, see table below Features description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Feature Units Description maxibi seconds The maximum inter beat interval during a time segment. minibi seconds The minimum inter beat interval during a time segment. avgibi seconds The average inter beat interval during a time segment. medianibi seconds The median of inter beat interval during a time segment. modeibi seconds The mode of inter beat interval during a time segment. stdibi seconds The standard deviation of inter beat interval during a time segment. diffmaxmodeibi seconds The difference between the maximum and mode inter beat interval during a time segment. diffminmodeibi seconds The difference between the mode and minimum inter beat interval during a time segment. entropyibi nats Shannon\u2019s entropy measurement based on inter beat interval during a time segment. Assumptions/Observations For more information about IBI read this .","title":"DBDP provider"},{"location":"features/empatica-tags/","text":"Empatica Tags \u00b6 Sensor parameters description for [EMPATICA_TAGS] : Key Description [CONTAINER] Name of the CSV file containing tags data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. Note No feature providers have been implemented for this sensor yet, however you can implement your own features . To know more about tags read this .","title":"Empatica Tags"},{"location":"features/empatica-tags/#empatica-tags","text":"Sensor parameters description for [EMPATICA_TAGS] : Key Description [CONTAINER] Name of the CSV file containing tags data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. Note No feature providers have been implemented for this sensor yet, however you can implement your own features . To know more about tags read this .","title":"Empatica Tags"},{"location":"features/empatica-temperature/","text":"Empatica Temperature \u00b6 Sensor parameters description for [EMPATICA_TEMPERATURE] : Key Description [CONTAINER] Name of the CSV file containing temperature data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_temperature_raw.csv - data/raw/ { pid } /empatica_temperature_with_datetime.csv - data/interim/ { pid } /empatica_temperature_features/empatica_temperature_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_temperature.csv Parameters description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_TEMPERATURE features from the DBDP provider [FEATURES] Features to be computed from temperature intraday data, see table below Features description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Feature Units Description maxtemp degrees C The maximum temperature during a time segment. mintemp degrees C The minimum temperature during a time segment. avgtemp degrees C The average temperature during a time segment. mediantemp degrees C The median of temperature during a time segment. modetemp degrees C The mode of temperature during a time segment. stdtemp degrees C The standard deviation of temperature during a time segment. diffmaxmodetemp degrees C The difference between the maximum and mode temperature during a time segment. diffminmodetemp degrees C The difference between the mode and minimum temperature during a time segment. entropytemp nats Shannon\u2019s entropy measurement based on temperature during a time segment. Assumptions/Observations None","title":"Empatica Temperature"},{"location":"features/empatica-temperature/#empatica-temperature","text":"Sensor parameters description for [EMPATICA_TEMPERATURE] : Key Description [CONTAINER] Name of the CSV file containing temperature data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Temperature"},{"location":"features/empatica-temperature/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_temperature_raw.csv - data/raw/ { pid } /empatica_temperature_with_datetime.csv - data/interim/ { pid } /empatica_temperature_features/empatica_temperature_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_temperature.csv Parameters description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_TEMPERATURE features from the DBDP provider [FEATURES] Features to be computed from temperature intraday data, see table below Features description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Feature Units Description maxtemp degrees C The maximum temperature during a time segment. mintemp degrees C The minimum temperature during a time segment. avgtemp degrees C The average temperature during a time segment. mediantemp degrees C The median of temperature during a time segment. modetemp degrees C The mode of temperature during a time segment. stdtemp degrees C The standard deviation of temperature during a time segment. diffmaxmodetemp degrees C The difference between the maximum and mode temperature during a time segment. diffminmodetemp degrees C The difference between the mode and minimum temperature during a time segment. entropytemp nats Shannon\u2019s entropy measurement based on temperature during a time segment. Assumptions/Observations None","title":"DBDP provider"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 A behavioral feature is a metric computed from raw sensor data quantifying the behavior of a participant. For example, the time spent at home computed based on location data. These are also known as digital biomarkers. RAPIDS\u2019 config.yaml has a section for each supported device/sensor (e.g., PHONE_ACCELEROMETER , FITBIT_STEPS , EMPATICA_HEARTRATE ). These sections follow a similar structure, and they can have one or more feature PROVIDERS , that compute one or more behavioral features. You will modify the parameters of these PROVIDERS to obtain features from different mobile sensors. We\u2019ll use PHONE_ACCELEROMETER as an example to explain this further. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. In short, to extract features offered by a provider, you need to set its [COMPUTE] flag to TRUE , configure any of its parameters, and execute RAPIDS. Explaining the config.yaml sensor sections with an example \u00b6 Each sensor section follows the same structure. Click on the numbered markers to know more. PHONE_ACCELEROMETER : # (1) CONTAINER : accelerometer # (2) PROVIDERS : # (3) RAPIDS : COMPUTE : False # (4) FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_SCRIPT : src/features/phone_accelerometer/rapids/main.py PANDA : COMPUTE : False VALID_SENSED_MINUTES : False FEATURES : # (5) exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] # (6) SRC_SCRIPT : src/features/phone_accelerometer/panda/main.py Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda . These are the descriptions of each marker for accessibility: Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"A behavioral feature is a metric computed from raw sensor data quantifying the behavior of a participant. For example, the time spent at home computed based on location data. These are also known as digital biomarkers. RAPIDS\u2019 config.yaml has a section for each supported device/sensor (e.g., PHONE_ACCELEROMETER , FITBIT_STEPS , EMPATICA_HEARTRATE ). These sections follow a similar structure, and they can have one or more feature PROVIDERS , that compute one or more behavioral features. You will modify the parameters of these PROVIDERS to obtain features from different mobile sensors. We\u2019ll use PHONE_ACCELEROMETER as an example to explain this further. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. In short, to extract features offered by a provider, you need to set its [COMPUTE] flag to TRUE , configure any of its parameters, and execute RAPIDS.","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#explaining-the-configyaml-sensor-sections-with-an-example","text":"Each sensor section follows the same structure. Click on the numbered markers to know more. PHONE_ACCELEROMETER : # (1) CONTAINER : accelerometer # (2) PROVIDERS : # (3) RAPIDS : COMPUTE : False # (4) FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_SCRIPT : src/features/phone_accelerometer/rapids/main.py PANDA : COMPUTE : False VALID_SENSED_MINUTES : False FEATURES : # (5) exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] # (6) SRC_SCRIPT : src/features/phone_accelerometer/panda/main.py Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda . These are the descriptions of each marker for accessibility: Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Explaining the config.yaml sensor sections with an example"},{"location":"features/fitbit-calories-intraday/","text":"Fitbit Calories Intraday \u00b6 Sensor parameters description for [FITBIT_CALORIES_INTRADAY] : Key Description [CONTAINER] Container where your calories intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_calories_intraday_raw.csv - data/raw/ { pid } /fitbit_calories_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_calories_intraday_features/fitbit_calories_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_calories_intraday.csv Parameters description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_CALORIES_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from calories intraday data, see table below [EPISODE_TYPE] RAPIDS will compute features for any episodes in this list. There are seven types of episodes defined as consecutive appearances of a label. Four are based on the activity level labels provided by Fitbit: sedentary , lightly active , fairly active , and very active . One is defined by RAPIDS as moderate to vigorous physical activity MVPA episodes that are based on all fairly active , and very active labels. Two are defined by the user based on a threshold that divides low or high MET (metabolic equivalent) episodes. EPISODE_TIME_THRESHOLD Any consecutive rows of the same [EPISODE_TYPE] will be considered a single episode if the time difference between them is less or equal than this threshold in minutes [EPISODE_MET_THRESHOLD] Any 1-minute calorie data chunk with a MET value equal or higher than this threshold will be considered a high MET episode and low MET otherwise. The default value is 3 [EPISODE_MVPA_CATEGORIES] The Fitbit level labels that are considered part of a moderate to vigorous physical activity episode. One or more of sedentary , lightly active , fairly active , and very active . The default are fairly active and very active [EPISODE_REFERENCE_TIME] Reference time for the start/end time features. MIDNIGHT sets the reference time to 00:00 of each day, START_OF_THE_SEGMENT sets the reference time to the start of the time segment (useful when a segment is shorter than a day or spans multiple days) Features description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description starttimefirstepisode EPISODE_TYPE minutes Start time of the first episode of type [EPISODE_TYPE] endtimefirstepisode EPISODE_TYPE minutes End time of the first episode of type [EPISODE_TYPE] starttimelastepisode EPISODE_TYPE minutes Start time of the last episode of type [EPISODE_TYPE] endtimelastepisode EPISODE_TYPE minutes End time of the last episode of type [EPISODE_TYPE] starttimelongestepisode EPISODE_TYPE minutes Start time of the longest episode of type [EPISODE_TYPE] endtimelongestepisode EPISODE_TYPE minutes End time of the longest episode of type [EPISODE_TYPE] countepisode EPISODE_TYPE episodes The number of episodes of type [EPISODE_TYPE] sumdurationepisode EPISODE_TYPE minutes The sum of the duration of episodes of type [EPISODE_TYPE] avgdurationepisode EPISODE_TYPE minutes The average of the duration of episodes of type [EPISODE_TYPE] maxdurationepisode EPISODE_TYPE minutes The maximum of the duration of episodes of type [EPISODE_TYPE] mindurationepisode EPISODE_TYPE minutes The minimum of the duration of episodes of type [EPISODE_TYPE] stddurationepisode EPISODE_TYPE minutes The standard deviation of the duration of episodes of type [EPISODE_TYPE] summet EPISODE_TYPE METs The sum of all METs during episodes of type [EPISODE_TYPE] avgmet EPISODE_TYPE METs The average of all METs during episodes of type [EPISODE_TYPE] maxmet EPISODE_TYPE METs The maximum of all METs during episodes of type [EPISODE_TYPE] minmet EPISODE_TYPE METs The minimum of all METs during episodes of type [EPISODE_TYPE] stdmet EPISODE_TYPE METs The standard deviation of all METs during episodes of type [EPISODE_TYPE] sumcalories EPISODE_TYPE calories The sum of all calories during episodes of type [EPISODE_TYPE] avgcalories EPISODE_TYPE calories The average of all calories during episodes of type [EPISODE_TYPE] maxcalories EPISODE_TYPE calories The maximum of all calories during episodes of type [EPISODE_TYPE] mincalories EPISODE_TYPE calories The minimum of all calories during episodes of type [EPISODE_TYPE] stdcalories EPISODE_TYPE calories The standard deviation of all calories during episodes of type [EPISODE_TYPE] Assumptions/Observations These features are based on intraday calories data that is usually obtained in 1-minute chunks from Fitbit\u2019s API. The MET value returned by Fitbit is divided by 10 Take into account that the intraday data returned by Fitbit can contain time series for calories burned inclusive of BMR, tracked activity, and manually logged activities.","title":"Fitbit Calories Intraday"},{"location":"features/fitbit-calories-intraday/#fitbit-calories-intraday","text":"Sensor parameters description for [FITBIT_CALORIES_INTRADAY] : Key Description [CONTAINER] Container where your calories intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Calories Intraday"},{"location":"features/fitbit-calories-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_calories_intraday_raw.csv - data/raw/ { pid } /fitbit_calories_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_calories_intraday_features/fitbit_calories_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_calories_intraday.csv Parameters description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_CALORIES_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from calories intraday data, see table below [EPISODE_TYPE] RAPIDS will compute features for any episodes in this list. There are seven types of episodes defined as consecutive appearances of a label. Four are based on the activity level labels provided by Fitbit: sedentary , lightly active , fairly active , and very active . One is defined by RAPIDS as moderate to vigorous physical activity MVPA episodes that are based on all fairly active , and very active labels. Two are defined by the user based on a threshold that divides low or high MET (metabolic equivalent) episodes. EPISODE_TIME_THRESHOLD Any consecutive rows of the same [EPISODE_TYPE] will be considered a single episode if the time difference between them is less or equal than this threshold in minutes [EPISODE_MET_THRESHOLD] Any 1-minute calorie data chunk with a MET value equal or higher than this threshold will be considered a high MET episode and low MET otherwise. The default value is 3 [EPISODE_MVPA_CATEGORIES] The Fitbit level labels that are considered part of a moderate to vigorous physical activity episode. One or more of sedentary , lightly active , fairly active , and very active . The default are fairly active and very active [EPISODE_REFERENCE_TIME] Reference time for the start/end time features. MIDNIGHT sets the reference time to 00:00 of each day, START_OF_THE_SEGMENT sets the reference time to the start of the time segment (useful when a segment is shorter than a day or spans multiple days) Features description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description starttimefirstepisode EPISODE_TYPE minutes Start time of the first episode of type [EPISODE_TYPE] endtimefirstepisode EPISODE_TYPE minutes End time of the first episode of type [EPISODE_TYPE] starttimelastepisode EPISODE_TYPE minutes Start time of the last episode of type [EPISODE_TYPE] endtimelastepisode EPISODE_TYPE minutes End time of the last episode of type [EPISODE_TYPE] starttimelongestepisode EPISODE_TYPE minutes Start time of the longest episode of type [EPISODE_TYPE] endtimelongestepisode EPISODE_TYPE minutes End time of the longest episode of type [EPISODE_TYPE] countepisode EPISODE_TYPE episodes The number of episodes of type [EPISODE_TYPE] sumdurationepisode EPISODE_TYPE minutes The sum of the duration of episodes of type [EPISODE_TYPE] avgdurationepisode EPISODE_TYPE minutes The average of the duration of episodes of type [EPISODE_TYPE] maxdurationepisode EPISODE_TYPE minutes The maximum of the duration of episodes of type [EPISODE_TYPE] mindurationepisode EPISODE_TYPE minutes The minimum of the duration of episodes of type [EPISODE_TYPE] stddurationepisode EPISODE_TYPE minutes The standard deviation of the duration of episodes of type [EPISODE_TYPE] summet EPISODE_TYPE METs The sum of all METs during episodes of type [EPISODE_TYPE] avgmet EPISODE_TYPE METs The average of all METs during episodes of type [EPISODE_TYPE] maxmet EPISODE_TYPE METs The maximum of all METs during episodes of type [EPISODE_TYPE] minmet EPISODE_TYPE METs The minimum of all METs during episodes of type [EPISODE_TYPE] stdmet EPISODE_TYPE METs The standard deviation of all METs during episodes of type [EPISODE_TYPE] sumcalories EPISODE_TYPE calories The sum of all calories during episodes of type [EPISODE_TYPE] avgcalories EPISODE_TYPE calories The average of all calories during episodes of type [EPISODE_TYPE] maxcalories EPISODE_TYPE calories The maximum of all calories during episodes of type [EPISODE_TYPE] mincalories EPISODE_TYPE calories The minimum of all calories during episodes of type [EPISODE_TYPE] stdcalories EPISODE_TYPE calories The standard deviation of all calories during episodes of type [EPISODE_TYPE] Assumptions/Observations These features are based on intraday calories data that is usually obtained in 1-minute chunks from Fitbit\u2019s API. The MET value returned by Fitbit is divided by 10 Take into account that the intraday data returned by Fitbit can contain time series for calories burned inclusive of BMR, tracked activity, and manually logged activities.","title":"RAPIDS provider"},{"location":"features/fitbit-data-yield/","text":"Fitbit Data Yield \u00b6 We use Fitbit heart rate intraday data to extract data yield features. Fitbit data yield features can be used to remove rows ( time segments ) that do not contain enough Fitbit data. You should decide what is your \u201cenough\u201d threshold depending on the time a participant was supposed to be wearing their Fitbit, the length of your study, and the rates of missing data that your analysis could handle. Why is Fitbit data yield important? Imagine that you want to extract FITBIT_STEPS_SUMMARY features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the Fitbit logged 6k as the total step count and the heart rate sensor logged 24 hours of data and on day 2 the Fitbit logged 101 as the total step count and the heart rate sensor logged 2 hours of data. It\u2019s very likely that on day 2 you walked during the other 22 hours so including this day in your analysis could bias your results. Sensor parameters description for [FITBIT_DATA_YIELD] : Key Description [SENSORS] The Fitbit sensor we considered for calculating the Fitbit data yield features. We only support FITBIT_HEARTRATE_INTRADAY since sleep data is commonly collected only overnight, and step counts are 0 even when not wearing the Fitbit device. RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when Fitbit heart rate intraday sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_data_yield_features/fitbit_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_data_yield.csv Parameters description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a . We assume your Fitbit intraday data was sampled (requested form the Fitbit API) at 1 minute intervals, if the interval is longer, for example 15 minutes, you need to take into account that valid minutes and valid hours ratios are going to be small (for example you would have at most 4 \u201cminutes\u201d of data per hour because you would have four 15-minute windows) and so you should adjust your thresholds to include and exclude rows accordingly. If you are in this situation, get in touch with us, we could implement this use case but we are not sure there is enough demand for it at the moment since you can control the sampling rate of the data you request from Fitbit API.","title":"Fitbit Data Yield"},{"location":"features/fitbit-data-yield/#fitbit-data-yield","text":"We use Fitbit heart rate intraday data to extract data yield features. Fitbit data yield features can be used to remove rows ( time segments ) that do not contain enough Fitbit data. You should decide what is your \u201cenough\u201d threshold depending on the time a participant was supposed to be wearing their Fitbit, the length of your study, and the rates of missing data that your analysis could handle. Why is Fitbit data yield important? Imagine that you want to extract FITBIT_STEPS_SUMMARY features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the Fitbit logged 6k as the total step count and the heart rate sensor logged 24 hours of data and on day 2 the Fitbit logged 101 as the total step count and the heart rate sensor logged 2 hours of data. It\u2019s very likely that on day 2 you walked during the other 22 hours so including this day in your analysis could bias your results. Sensor parameters description for [FITBIT_DATA_YIELD] : Key Description [SENSORS] The Fitbit sensor we considered for calculating the Fitbit data yield features. We only support FITBIT_HEARTRATE_INTRADAY since sleep data is commonly collected only overnight, and step counts are 0 even when not wearing the Fitbit device.","title":"Fitbit Data Yield"},{"location":"features/fitbit-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when Fitbit heart rate intraday sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_data_yield_features/fitbit_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_data_yield.csv Parameters description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a . We assume your Fitbit intraday data was sampled (requested form the Fitbit API) at 1 minute intervals, if the interval is longer, for example 15 minutes, you need to take into account that valid minutes and valid hours ratios are going to be small (for example you would have at most 4 \u201cminutes\u201d of data per hour because you would have four 15-minute windows) and so you should adjust your thresholds to include and exclude rows accordingly. If you are in this situation, get in touch with us, we could implement this use case but we are not sure there is enough demand for it at the moment since you can control the sampling rate of the data you request from Fitbit API.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [CONTAINER] Container where your heart rate intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [CONTAINER] Container where your heart rate intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [CONTAINER] Container where your heart rate summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [CONTAINER] Container where your heart rate summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-intraday/","text":"Fitbit Sleep Intraday \u00b6 Sensor parameters description for [FITBIT_SLEEP_INTRADAY] : Key Description [CONTAINER] Container where your sleep intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes LEVELS_AND_TYPES features grouping all levels together in a single all category. [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS][LEVELS_AND_TYPES] : Feature Units Description countepisode [LEVEL][TYPE] episodes Number of [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. sumduration [LEVEL][TYPE] minutes Total duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. maxduration [LEVEL][TYPE] minutes Longest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. minduration [LEVEL][TYPE] minutes Shortest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. avgduration [LEVEL][TYPE] minutes Average duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. medianduration [LEVEL][TYPE] minutes Median duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. stdduration [LEVEL][TYPE] minutes Standard deviation duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_LEVELS] : Feature Units Description ratiocount [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem ? (e.g., \\(countepisode[remstages][all] / countepisode[all][all]\\) ) ratioduration [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem ? (e.g., \\(sumduration[remstages][all] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_TYPES] : Feature Units Description ratiocountmain - Ratio between the count of all main episodes (independently of the levels inside) divided by the count of all main and nap episodes. This answers the question: what percentage of all sleep episodes ( main and nap ) were main ? We do not provide the ratio for nap because is complementary. ( \\(countepisode[all][main] / countepisode[all][all]\\) ) ratiodurationmain - Ratio between the duration of all main episodes (independently of the levels inside) divided by the duration of all main and nap episodes. This answers the question: what percentage of all sleep time ( main and nap ) was main ? We do not provide the ratio for nap because is complementary. ( \\(sumduration[all][main] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_LEVELS] : Feature Units Description ratiocountmainwithin [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] during main sleep divided by the count of episodes of a single sleep [LEVEL] during main and nap . This answers the question: are rem episodes more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) ratiodurationmainwithin [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] during main sleep divided by the duration of episodes of a single sleep [LEVEL] during main and nap . This answers the question: is rem time more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_TYPES] : Feature Units Description ratiocount [LEVEL] within [TYPE] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem during main / nap sleep time? (e.g., \\(countepisode[remstages][main] / countepisode[all][main]\\) ) ratioduration [LEVEL] within [TYPE] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem during main / nap sleep time? (e.g., \\(sumduration[remstages][main] / sumduration[all][main]\\) ) Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Features listed in [LEVELS_AND_TYPES] are computed for any levels and types listed in [SLEEP_LEVELS] or [SLEEP_TYPES] . For example if STAGES only contains [rem, light] you will not get countepisode[wake|deep][TYPE] or sum, max, min, avg, median, or std duration . Levels or types in these lists do not influence RATIOS or ROUTINE features. Any [LEVEL] grouping is done within the elements of each class CLASSIC , STAGES , and UNIFIED . That is, we never combine CLASSIC or STAGES types to compute features. The categories for all levels (when INCLUDE_ALL_GROUPS is True ) and all SLEEP_TYPES are not considered for RATIOS features as they are always 1. These features can be computed in time segments of any length, but only the 1-minute sleep chunks within each segment instance will be used. PRICE provider \u00b6 Understanding PRICE features This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. Available time segments Available for any time segments larger or equal to one day File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_parsed.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the PRICE provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes avgdurationallmain [DAY_TYPE] features grouping all levels together in a single all category. [DAY_TYPE] The features of this provider can be computed using daily averages/standard deviations that were extracted on WEEKEND days only, WEEK days only, or ALL days [LAST_NIGHT_END] Only main sleep episodes that start within the LNE-LNE interval [ LAST_NIGHT_END , LAST_NIGHT_END + 23H 59M 59S] are taken into account to compute the features described below. [LAST_NIGHT_END] is a number ranging from 0 (midnight) to 1439 (23:59). Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Feature Units Description avgduration [LEVEL] main [DAY_TYPE] minutes Average duration of daily sleep chunks of a LEVEL . Use the DAY_TYPE flag to include daily durations from weekend days only, weekdays, or both. Use [LEVEL] to group all levels in a single all category. avgratioduration [LEVEL] withinmain [DAY_TYPE] - Average of the daily ratio between the duration of sleep chunks of a LEVEL and total duration of all main sleep episodes in a day. When INCLUDE_ALL_GROUPS is True the all LEVEL is ignored since this feature is always 1. Use the DAY_TYPE flag to include start times from weekend days only, weekdays, or both. avgstarttimeofepisodemain [DAY_TYPE] minutes Average of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgendtimeofepisodemain [DAY_TYPE] minutes Average of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgmidpointofepisodemain [DAY_TYPE] minutes Average of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdstarttimeofepisodemain [DAY_TYPE] minutes Standard deviation of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdendtimeofepisodemain [DAY_TYPE] minutes Standard deviation of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdmidpointofepisodemain [DAY_TYPE] minutes Standard deviation of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. socialjetlag minutes Difference in minutes between the avgmidpointofepisodemain of weekends and weekdays that belong to each time segment instance. If your time segment does not contain at least one week day and one weekend day this feature will be NA. rmssdmeanstarttimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmeanendtimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmeanmidpointofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s midpointofepisodemain (mid time between bedtime and wake time) changed from night to night. rmssdmedianstarttimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmedianendtimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmedianmidpointofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s midpointofepisodemain (average mid time between bedtime and wake time) changed from night to night. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. We recommend you use periodic segments that start in the morning so RAPIDS can chunk and group sleep episodes overnight. Shifted segments (as any other segments) are labelled based on their start and end date times. avgstarttime... and avgendtime... are roughly equivalent to an average bed and awake time only if you are using shifted segments. The features of this provider are only available on time segments that are longer than 24 hours because they are based on descriptive statistics computed across daily values. Even though Fitbit provides 2 types of sleep episodes ( main and nap ), only main sleep episodes are considered. The reference point for all times is 00:00 of the first day in the LNE-LNE interval. Sleep episodes are formed by 1-minute chunks that we group overnight starting from today\u2019s LNE and ending on tomorrow\u2019s LNE or the end of that segment (whatever is first). The features avgstarttime... and avgendtime... are the average of the first and last sleep episode across every LNE-LNE interval within a segment ( avgmidtime... is the mid point between start and end). Therefore, only segments longer than 24hrs will be averaged across more than one LNE-LNE interval. socialjetlag is only available on segment instances equal or longer than 48hrs that contain at least one weekday day and one weekend day, for example seven-day (weekly) segments.","title":"Fitbit Sleep Intraday"},{"location":"features/fitbit-sleep-intraday/#fitbit-sleep-intraday","text":"Sensor parameters description for [FITBIT_SLEEP_INTRADAY] : Key Description [CONTAINER] Container where your sleep intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Sleep Intraday"},{"location":"features/fitbit-sleep-intraday/#rapids-provider","text":"Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes LEVELS_AND_TYPES features grouping all levels together in a single all category. [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS][LEVELS_AND_TYPES] : Feature Units Description countepisode [LEVEL][TYPE] episodes Number of [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. sumduration [LEVEL][TYPE] minutes Total duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. maxduration [LEVEL][TYPE] minutes Longest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. minduration [LEVEL][TYPE] minutes Shortest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. avgduration [LEVEL][TYPE] minutes Average duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. medianduration [LEVEL][TYPE] minutes Median duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. stdduration [LEVEL][TYPE] minutes Standard deviation duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_LEVELS] : Feature Units Description ratiocount [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem ? (e.g., \\(countepisode[remstages][all] / countepisode[all][all]\\) ) ratioduration [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem ? (e.g., \\(sumduration[remstages][all] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_TYPES] : Feature Units Description ratiocountmain - Ratio between the count of all main episodes (independently of the levels inside) divided by the count of all main and nap episodes. This answers the question: what percentage of all sleep episodes ( main and nap ) were main ? We do not provide the ratio for nap because is complementary. ( \\(countepisode[all][main] / countepisode[all][all]\\) ) ratiodurationmain - Ratio between the duration of all main episodes (independently of the levels inside) divided by the duration of all main and nap episodes. This answers the question: what percentage of all sleep time ( main and nap ) was main ? We do not provide the ratio for nap because is complementary. ( \\(sumduration[all][main] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_LEVELS] : Feature Units Description ratiocountmainwithin [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] during main sleep divided by the count of episodes of a single sleep [LEVEL] during main and nap . This answers the question: are rem episodes more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) ratiodurationmainwithin [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] during main sleep divided by the duration of episodes of a single sleep [LEVEL] during main and nap . This answers the question: is rem time more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_TYPES] : Feature Units Description ratiocount [LEVEL] within [TYPE] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem during main / nap sleep time? (e.g., \\(countepisode[remstages][main] / countepisode[all][main]\\) ) ratioduration [LEVEL] within [TYPE] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem during main / nap sleep time? (e.g., \\(sumduration[remstages][main] / sumduration[all][main]\\) ) Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Features listed in [LEVELS_AND_TYPES] are computed for any levels and types listed in [SLEEP_LEVELS] or [SLEEP_TYPES] . For example if STAGES only contains [rem, light] you will not get countepisode[wake|deep][TYPE] or sum, max, min, avg, median, or std duration . Levels or types in these lists do not influence RATIOS or ROUTINE features. Any [LEVEL] grouping is done within the elements of each class CLASSIC , STAGES , and UNIFIED . That is, we never combine CLASSIC or STAGES types to compute features. The categories for all levels (when INCLUDE_ALL_GROUPS is True ) and all SLEEP_TYPES are not considered for RATIOS features as they are always 1. These features can be computed in time segments of any length, but only the 1-minute sleep chunks within each segment instance will be used.","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-intraday/#price-provider","text":"Understanding PRICE features This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. Available time segments Available for any time segments larger or equal to one day File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_parsed.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the PRICE provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes avgdurationallmain [DAY_TYPE] features grouping all levels together in a single all category. [DAY_TYPE] The features of this provider can be computed using daily averages/standard deviations that were extracted on WEEKEND days only, WEEK days only, or ALL days [LAST_NIGHT_END] Only main sleep episodes that start within the LNE-LNE interval [ LAST_NIGHT_END , LAST_NIGHT_END + 23H 59M 59S] are taken into account to compute the features described below. [LAST_NIGHT_END] is a number ranging from 0 (midnight) to 1439 (23:59). Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Feature Units Description avgduration [LEVEL] main [DAY_TYPE] minutes Average duration of daily sleep chunks of a LEVEL . Use the DAY_TYPE flag to include daily durations from weekend days only, weekdays, or both. Use [LEVEL] to group all levels in a single all category. avgratioduration [LEVEL] withinmain [DAY_TYPE] - Average of the daily ratio between the duration of sleep chunks of a LEVEL and total duration of all main sleep episodes in a day. When INCLUDE_ALL_GROUPS is True the all LEVEL is ignored since this feature is always 1. Use the DAY_TYPE flag to include start times from weekend days only, weekdays, or both. avgstarttimeofepisodemain [DAY_TYPE] minutes Average of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgendtimeofepisodemain [DAY_TYPE] minutes Average of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgmidpointofepisodemain [DAY_TYPE] minutes Average of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdstarttimeofepisodemain [DAY_TYPE] minutes Standard deviation of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdendtimeofepisodemain [DAY_TYPE] minutes Standard deviation of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdmidpointofepisodemain [DAY_TYPE] minutes Standard deviation of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. socialjetlag minutes Difference in minutes between the avgmidpointofepisodemain of weekends and weekdays that belong to each time segment instance. If your time segment does not contain at least one week day and one weekend day this feature will be NA. rmssdmeanstarttimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmeanendtimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmeanmidpointofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s midpointofepisodemain (mid time between bedtime and wake time) changed from night to night. rmssdmedianstarttimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmedianendtimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmedianmidpointofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s midpointofepisodemain (average mid time between bedtime and wake time) changed from night to night. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. We recommend you use periodic segments that start in the morning so RAPIDS can chunk and group sleep episodes overnight. Shifted segments (as any other segments) are labelled based on their start and end date times. avgstarttime... and avgendtime... are roughly equivalent to an average bed and awake time only if you are using shifted segments. The features of this provider are only available on time segments that are longer than 24 hours because they are based on descriptive statistics computed across daily values. Even though Fitbit provides 2 types of sleep episodes ( main and nap ), only main sleep episodes are considered. The reference point for all times is 00:00 of the first day in the LNE-LNE interval. Sleep episodes are formed by 1-minute chunks that we group overnight starting from today\u2019s LNE and ending on tomorrow\u2019s LNE or the end of that segment (whatever is first). The features avgstarttime... and avgendtime... are the average of the first and last sleep episode across every LNE-LNE interval within a segment ( avgmidtime... is the mid point between start and end). Therefore, only segments longer than 24hrs will be averaged across more than one LNE-LNE interval. socialjetlag is only available on segment instances equal or longer than 48hrs that contain at least one weekday day and one weekend day, for example seven-day (weekly) segments.","title":"PRICE provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [CONTAINER] Container where your sleep summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments using SLEEP_SUMMARY_LAST_NIGHT_END for the RAPIDS provider. Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. [FEATURES] Features to be computed from sleep summary data, see table below [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END] As an exception, the LAST_NIGHT_END parameter for this provider is in the data stream configuration section. This parameter controls how sleep episodes are assigned to different days and affects wake and bedtimes. Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description firstwaketimeTYPE minutes First wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. lastwaketimeTYPE minutes Last wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. firstbedtimeTYPE minutes First bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. lastbedtimeTYPE minutes Last bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments using LNE for the RAPIDS provider. There are three sleep types (TYPE): main , nap , all . The all type groups both main sleep and naps . All types are based on Fitbit\u2019s labels. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Most features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type . Bed time and sleep duration are based on episodes that started between today\u2019s LNE and tomorrow\u2019s LNE while awake time is based on the episodes that started between yesterday\u2019s LNE and today\u2019s LNE The reference point for bed/awake times is today\u2019s 00:00. You can have bedtimes larger than 24 and awake times smaller than 0 These features are only available for time segments that span midnight to midnight of the same or different day. We include first and last wake and bedtimes because, when LAST_NIGHT_END is 10 am, the first bedtime could match a nap at 2 pm, and the last bedtime could match a main overnight sleep episode that starts at 10pm. Set the value for SLEEP_SUMMARY_LAST_NIGHT_END int the config parameter [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END].","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [CONTAINER] Container where your sleep summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments using SLEEP_SUMMARY_LAST_NIGHT_END for the RAPIDS provider. Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. [FEATURES] Features to be computed from sleep summary data, see table below [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END] As an exception, the LAST_NIGHT_END parameter for this provider is in the data stream configuration section. This parameter controls how sleep episodes are assigned to different days and affects wake and bedtimes. Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description firstwaketimeTYPE minutes First wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. lastwaketimeTYPE minutes Last wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. firstbedtimeTYPE minutes First bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. lastbedtimeTYPE minutes Last bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments using LNE for the RAPIDS provider. There are three sleep types (TYPE): main , nap , all . The all type groups both main sleep and naps . All types are based on Fitbit\u2019s labels. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Most features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type . Bed time and sleep duration are based on episodes that started between today\u2019s LNE and tomorrow\u2019s LNE while awake time is based on the episodes that started between yesterday\u2019s LNE and today\u2019s LNE The reference point for bed/awake times is today\u2019s 00:00. You can have bedtimes larger than 24 and awake times smaller than 0 These features are only available for time segments that span midnight to midnight of the same or different day. We include first and last wake and bedtimes because, when LAST_NIGHT_END is 10 am, the first bedtime could match a nap at 2 pm, and the last bedtime could match a main overnight sleep episode that starts at 10pm. Set the value for SLEEP_SUMMARY_LAST_NIGHT_END int the config parameter [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END].","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [CONTAINER] Container where your steps intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. [EXCLUDE_SLEEP] Step data will be excluded if it was logged during sleep periods when at least one [EXCLUDE] flag is set to True . Sleep can be delimited by (1) a fixed period that repeats on every day if [TIME_BASED][EXCLUDE] is True or (2) by Fitbit summary sleep episodes if [FITBIT_BASED][EXCLUDE] is True. If both are True (3), we use all Fitbit sleep episodes as well as the time-based episodes that do not overlap with any Fitbit episodes. If [TIME_BASED][EXCLUDE] is True, make sure Fitbit sleep summary container points to a valid table or file. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_with_datetime.csv - data/raw/ { pid } /fitbit_sleep_summary_raw.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True and [ EXCLUDE_SLEEP ][ TYPE ]= FITBIT_BASED ) - data/interim/ { pid } /fitbit_steps_intraday_with_datetime_exclude_sleep.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True ) - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [CONTAINER] Container where your steps intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. [EXCLUDE_SLEEP] Step data will be excluded if it was logged during sleep periods when at least one [EXCLUDE] flag is set to True . Sleep can be delimited by (1) a fixed period that repeats on every day if [TIME_BASED][EXCLUDE] is True or (2) by Fitbit summary sleep episodes if [FITBIT_BASED][EXCLUDE] is True. If both are True (3), we use all Fitbit sleep episodes as well as the time-based episodes that do not overlap with any Fitbit episodes. If [TIME_BASED][EXCLUDE] is True, make sure Fitbit sleep summary container points to a valid table or file.","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_with_datetime.csv - data/raw/ { pid } /fitbit_sleep_summary_raw.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True and [ EXCLUDE_SLEEP ][ TYPE ]= FITBIT_BASED ) - data/interim/ { pid } /fitbit_steps_intraday_with_datetime_exclude_sleep.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True ) - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [CONTAINER] Container where your steps summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [CONTAINER] Container where your steps summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes of still and tilting activities durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes of still and tilting activities durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-crashes/","text":"Phone Applications Crashes \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_CRASHES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications crashes data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_CRASHES ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Crashes"},{"location":"features/phone-applications-crashes/#phone-applications-crashes","text":"Sensor parameters description for [PHONE_APPLICATIONS_CRASHES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications crashes data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_CRASHES ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Crashes"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [INCLUDE_EPISODE_FEATURES] Set to True to extract application episode features as well from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app minduration minutes For a time_segment , the minimum duration an application was used in minutes maxduration minutes For a time_segment , the maximum duration an application was used in minutes meanduration minutes For a time_segment , the mean duration of all the applications used in minutes sumduration minutes For a time_segment , the sum duration of all the applications used in minutes Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above). The application episodes are calculated using the application foreground and screen unlock episode data. An application episode starts when the application is launched and ends when either, a new application is launched or the screen is locked.","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [INCLUDE_EPISODE_FEATURES] Set to True to extract application episode features as well from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app minduration minutes For a time_segment , the minimum duration an application was used in minutes maxduration minutes For a time_segment , the maximum duration an application was used in minutes meanduration minutes For a time_segment , the mean duration of all the applications used in minutes sumduration minutes For a time_segment , the sum duration of all the applications used in minutes Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above). The application episodes are calculated using the application foreground and screen unlock episode data. An application episode starts when the application is launched and ends when either, a new application is launched or the screen is locked.","title":"RAPIDS provider"},{"location":"features/phone-applications-notifications/","text":"Phone Applications Notifications \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_NOTIFICATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications notifications data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_NOTIFICATIONS ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Notifications"},{"location":"features/phone-applications-notifications/#phone-applications-notifications","text":"Sensor parameters description for [PHONE_APPLICATIONS_NOTIFICATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications notifications data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_NOTIFICATIONS ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Notifications"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the bluetooth data is stored RAPIDS provider \u00b6 Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider DORYAB provider \u00b6 This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. When searching for the most frequent device across 30-minute segments, the search range is equivalent to the sum of all segments of the same time period. For instance, the countscansmostfrequentdeviceacrosssegments for the time segment ( Fri 00:00:00, Fri 00:29:59 ) will get the count in that segment of the most frequent device found within all ( 00:00:00, 00:29:59 ) time segments. To find countscansmostfrequentdeviceacrosssegments for other devices, the search range needs to filter out all own devices. But no need to do so for countscansmostfrequentdeviceacrosssedataset . The most frequent device across the dataset stays the same for countscansmostfrequentdeviceacrossdatasetall , countscansmostfrequentdeviceacrossdatasetown and countscansmostfrequentdeviceacrossdatasetother . Same rule applies to the least frequent device across the dataset. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/#doryab-provider","text":"This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. When searching for the most frequent device across 30-minute segments, the search range is equivalent to the sum of all segments of the same time period. For instance, the countscansmostfrequentdeviceacrosssegments for the time segment ( Fri 00:00:00, Fri 00:29:59 ) will get the count in that segment of the most frequent device found within all ( 00:00:00, 00:29:59 ) time segments. To find countscansmostfrequentdeviceacrosssegments for other devices, the search range needs to filter out all own devices. But no need to do so for countscansmostfrequentdeviceacrosssedataset . The most frequent device across the dataset stays the same for countscansmostfrequentdeviceacrossdatasetall , countscansmostfrequentdeviceacrossdatasetown and countscansmostfrequentdeviceacrossdatasetother . Same rule applies to the least frequent device across the dataset. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"DORYAB provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors, ONLY include phone sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_CRASHES PHONE_APPLICATIONS_FOREGROUND PHONE_APPLICATIONS_NOTIFICATIONS PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_KEYBOARD PHONE_LIGHT PHONE_LOCATIONS PHONE_LOG PHONE_MESSAGES PHONE_SCREEN PHONE_WIFI_CONNECTED PHONE_WIFI_VISIBLE RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors, ONLY include phone sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_CRASHES PHONE_APPLICATIONS_FOREGROUND PHONE_APPLICATIONS_NOTIFICATIONS PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_KEYBOARD PHONE_LIGHT PHONE_LOCATIONS PHONE_LOG PHONE_MESSAGES PHONE_SCREEN PHONE_WIFI_CONNECTED PHONE_WIFI_VISIBLE","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-keyboard/","text":"Phone Keyboard \u00b6 Sensor parameters description for [PHONE_KEYBOARD] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the keyboard data is stored File Sequence - data/raw/ { pid } /phone_keyboard_raw.csv - data/raw/ { pid } /phone_keyboard_with_datetime.csv - data/interim/ { pid } /phone_keyboard_features/phone_keyboard_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_keyboard.csv Features description for [PHONE_KEYBOARD] : Feature Units Description sessioncount - Number of typing sessions in a time segment. A session begins with any keypress and finishes until 5 seconds have elapsed since the last key was pressed or the application that the user was typing on changes. averagesessionlength milliseconds Average length of all sessions in a time segment instance averageinterkeydelay milliseconds The average time between keystrokes measured in milliseconds. changeintextlengthlessthanminusone Number of times a keyboard typing or swiping event changed the length of the current text to less than one fewer character. changeintextlengthequaltominusone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one fewer character. changeintextlengthequaltoone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one more character. changeintextlengthmorethanone Number of times a keyboard typing or swiping event changed the length of the current text to more than one character. maxtextlength Length in characters of the longest sentence(s) contained in the typing text box of any app during the time segment. lastmessagelength Length of the last text in characters of the sentence(s) contained in the typing text box of any app during the time segment. totalkeyboardtouches Average number of typing events across all sessions in a time segment instance. Note We did not find a reliable way to distinguish between AutoCorrect or AutoComplete changes, since both can be applied with a single touch or swipe event and can decrease or increase the length of the text by an arbitrary number of characters.","title":"Phone Keyboard"},{"location":"features/phone-keyboard/#phone-keyboard","text":"Sensor parameters description for [PHONE_KEYBOARD] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the keyboard data is stored File Sequence - data/raw/ { pid } /phone_keyboard_raw.csv - data/raw/ { pid } /phone_keyboard_with_datetime.csv - data/interim/ { pid } /phone_keyboard_features/phone_keyboard_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_keyboard.csv Features description for [PHONE_KEYBOARD] : Feature Units Description sessioncount - Number of typing sessions in a time segment. A session begins with any keypress and finishes until 5 seconds have elapsed since the last key was pressed or the application that the user was typing on changes. averagesessionlength milliseconds Average length of all sessions in a time segment instance averageinterkeydelay milliseconds The average time between keystrokes measured in milliseconds. changeintextlengthlessthanminusone Number of times a keyboard typing or swiping event changed the length of the current text to less than one fewer character. changeintextlengthequaltominusone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one fewer character. changeintextlengthequaltoone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one more character. changeintextlengthmorethanone Number of times a keyboard typing or swiping event changed the length of the current text to more than one character. maxtextlength Length in characters of the longest sentence(s) contained in the typing text box of any app during the time segment. lastmessagelength Length of the last text in characters of the sentence(s) contained in the typing text box of any app during the time segment. totalkeyboardtouches Average number of typing events across all sessions in a time segment instance. Note We did not find a reliable way to distinguish between AutoCorrect or AutoComplete changes, since both can be applied with a single touch or swipe event and can decrease or increase the length of the text by an arbitrary number of characters.","title":"Phone Keyboard"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS , ALL_RESAMPLED or FUSED_RESAMPLED . This filter is based on the provider column of the locations table, ALL includes every row, GPS only includes rows where the provider is gps, ALL_RESAMPLED includes all rows after being resampled, and FUSED_RESAMPLED only includes rows where the provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use Android and iOS clients can collect location coordinates through the phone\u2019s GPS, the network cellular towers around the phone, or Google\u2019s fused location API. If you want to use only the GPS provider, set [LOCATIONS_TO_USE] to GPS If you want to use all providers, set [LOCATIONS_TO_USE] to ALL If you collected location data from different providers, including the fused API, use ALL_RESAMPLED If your mobile client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . ALL_RESAMPLED and RESAMPLE_FUSED take the original location coordinates and replicate each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] . This is done because Google\u2019s API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one and because GPS and network providers can log data at variable rates. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair. For example, participant A\u2019s phone did not collect data between 10.30 am and 10:50 am and between 11:05am and 11:40am, the last known coordinate pair is replicated during the first period but not the second. In other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes. FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer than this threshold even if the phone was sensing data continuously. For example, participant A went home at 9 pm, and their phone was sensing data without gaps until 11 am the next morning, the last known location is replicated until 9 am. If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same or a different day (daily, weekly, weekend, etc.) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this is dropped. This number means there\u2019s a 68% probability the actual location is within this radius [IF_MULTIPLE_TIMEZONES] Currently, USE_MOST_COMMON is the only value supported. If the location data for a participant belongs to multiple time zones, we select the most common because Barnett\u2019s algorithm can only handle one time zone [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am, including any pauses within a 200-meter radius. disttravelled meters Total distance traveled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day, and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement is based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Multi day segment features Barnett\u2019s features are only available on time segments that span entire days (00:00:00 to 23:59:59). Such segments can be one-day long (daily) or multi-day (weekly, for example). Multi-day segment features are computed based on daily features summarized the following way: sum for hometime , disttravelled , siglocsvisited , and minutes_data_used max for maxdiam , and maxhomedist mean for rog , avgflightlen , stdflightlen , avgflightdur , stdflightdur , probpause , siglocentropy , circdnrtn , wkenddayrtn , and minsmissing Computation speed The process to extract these features can be slow compared to other sensors and providers due to the required simulation. How are these features computed? These features are based on a Pause-Flight model. A pause is defined as a mobility trace (location pings) within a certain duration and distance (by default, 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS, we only expose one parameter for these features (accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_processed_with_datetime_with_doryab_columns.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_ROW_GAP] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the phone was not sensing. This value must be larger than your GPS sampling interval when [LOCATIONS_TO_USE] is ALL or GPS , otherwise all the stationary-related features will be NA. If [LOCATIONS_TO_USE] is ALL_RESAMPLED or FUSED_RESAMPLED , you can use the default value as every row will be resampled at 1-minute intervals. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [CLUSTER_ON] Set this flag to PARTICIPANT_DATASET to create clusters based on the entire participant\u2019s dataset or to TIME_SEGMENT to create clusters based on all the instances of the corresponding time segment (e.g. all mornings) or to TIME_SEGMENT_INSTANCE to create clusters based on a single instance (e.g. 2020-05-20\u2019s morning). [INFER_HOME_LOCATION_STRATEGY] The strategy applied to infer home locations. Set to DORYAB_STRATEGY to infer one home location for the entire dataset of each participant or to SUN_LI_VEGA_STRATEGY to infer one home location per day per participant. See Observations below to know more. [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] The minimum number of consecutive days a new home location candidate has to repeat before it is considered the participant\u2019s new home. This parameter will be used only when [INFER_HOME_LOCATION_STRATEGY] is set to SUN_LI_VEGA_STRATEGY . [CLUSTERING_ALGORITHM] The original Doryab et al. implementation uses DBSCAN , OPTICS is also available with similar (but not identical) clustering results and lower memory consumption. [RADIUS_FOR_HOME] All location coordinates within this distance (meters) from the home location coordinates are considered a homestay (see timeathome feature). Features description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance traveled in a time segment using the haversine formula. avgspeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - Deprecated, see Observations below. \u201cIt encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN/OPTICS clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between stationary time and total location sensed time. A lat/long coordinate pair is labeled as stationary if its speed (distance/time) to the next coordinate pair is less than 1km/hr. A higher value represents a more stationary routine. outlierstimepercent - Ratio between the time spent in non-significant clusters divided by the time spent in all clusters (stationary time. Only stationary samples are clustered). A higher value represents more time spent in non-significant clusters. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). avglengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters; it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). timeathome minutes Time spent at home (see Observations below for a description on how we compute home). homelabel - An integer that represents a different home location. It will be a constant number (1) for all participants when [INFER_HOME_LOCATION_STRATEGY] is set to DORYAB_STRATEGY or an incremental index if the strategy is set to SUN_LI_VEGA_STRATEGY . Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. Circadian Movement Calculation Note Feb 3 2021. It seems the implementation of this feature is not correct; we suggest not to use this feature until a fix is in place. For a detailed description of how this should be calculated, see Saeb et al . Fine-Tuning Clustering Parameters Based on an experiment where we collected fused location data for 7 days with a mean accuracy of 86 & SD of 350.874635, we determined that EPS/MAX_EPS =100 produced closer clustering results to reality. Higher values (>100) missed out on some significant places, like a short grocery visit, while lower values (<100) picked up traffic lights and stop signs while driving as significant locations. We recommend you set EPS based on your location data\u2019s accuracy (the more accurate your data is, the lower you should be able to set EPS). Duration Calculation To calculate the time duration component for our features, we compute the difference between consecutive rows\u2019 timestamps to take into account sampling rate variability. If this time difference is larger than a threshold (300 seconds by default), we replace it with NA and label that row as Moving. Home location DORYAB_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ) and considering the center of the biggest cluster home for that participant. SUN_LI_VEGA_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ). The following steps are used to infer the home location per day for that participant: if there are records within [03:30:00, 04:30:00] for that night: we choose the most common cluster during that period as a home candidate for that day. elif there are records within [midnight, 03:30:00) for that night: we choose the last valid cluster during that period as a home candidate for that day. elif there are records within (04:30:00, 06:00:00] for that night: we choose the first valid cluster during that period as a home candidate for that day. else: the home location is NA (missing) for that day. If the count of consecutive days with the same candidate home location cluster label is larger or equal to [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] , the candidate will be regarded as the home cluster; otherwise, the home cluster will be the last valid day\u2019s cluster. If there are no valid clusters before that day, the first home location in the days after is used.","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS , ALL_RESAMPLED or FUSED_RESAMPLED . This filter is based on the provider column of the locations table, ALL includes every row, GPS only includes rows where the provider is gps, ALL_RESAMPLED includes all rows after being resampled, and FUSED_RESAMPLED only includes rows where the provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use Android and iOS clients can collect location coordinates through the phone\u2019s GPS, the network cellular towers around the phone, or Google\u2019s fused location API. If you want to use only the GPS provider, set [LOCATIONS_TO_USE] to GPS If you want to use all providers, set [LOCATIONS_TO_USE] to ALL If you collected location data from different providers, including the fused API, use ALL_RESAMPLED If your mobile client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . ALL_RESAMPLED and RESAMPLE_FUSED take the original location coordinates and replicate each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] . This is done because Google\u2019s API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one and because GPS and network providers can log data at variable rates. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair. For example, participant A\u2019s phone did not collect data between 10.30 am and 10:50 am and between 11:05am and 11:40am, the last known coordinate pair is replicated during the first period but not the second. In other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes. FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer than this threshold even if the phone was sensing data continuously. For example, participant A went home at 9 pm, and their phone was sensing data without gaps until 11 am the next morning, the last known location is replicated until 9 am. If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same or a different day (daily, weekly, weekend, etc.) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this is dropped. This number means there\u2019s a 68% probability the actual location is within this radius [IF_MULTIPLE_TIMEZONES] Currently, USE_MOST_COMMON is the only value supported. If the location data for a participant belongs to multiple time zones, we select the most common because Barnett\u2019s algorithm can only handle one time zone [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am, including any pauses within a 200-meter radius. disttravelled meters Total distance traveled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day, and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement is based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Multi day segment features Barnett\u2019s features are only available on time segments that span entire days (00:00:00 to 23:59:59). Such segments can be one-day long (daily) or multi-day (weekly, for example). Multi-day segment features are computed based on daily features summarized the following way: sum for hometime , disttravelled , siglocsvisited , and minutes_data_used max for maxdiam , and maxhomedist mean for rog , avgflightlen , stdflightlen , avgflightdur , stdflightdur , probpause , siglocentropy , circdnrtn , wkenddayrtn , and minsmissing Computation speed The process to extract these features can be slow compared to other sensors and providers due to the required simulation. How are these features computed? These features are based on a Pause-Flight model. A pause is defined as a mobility trace (location pings) within a certain duration and distance (by default, 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS, we only expose one parameter for these features (accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_processed_with_datetime_with_doryab_columns.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_ROW_GAP] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the phone was not sensing. This value must be larger than your GPS sampling interval when [LOCATIONS_TO_USE] is ALL or GPS , otherwise all the stationary-related features will be NA. If [LOCATIONS_TO_USE] is ALL_RESAMPLED or FUSED_RESAMPLED , you can use the default value as every row will be resampled at 1-minute intervals. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [CLUSTER_ON] Set this flag to PARTICIPANT_DATASET to create clusters based on the entire participant\u2019s dataset or to TIME_SEGMENT to create clusters based on all the instances of the corresponding time segment (e.g. all mornings) or to TIME_SEGMENT_INSTANCE to create clusters based on a single instance (e.g. 2020-05-20\u2019s morning). [INFER_HOME_LOCATION_STRATEGY] The strategy applied to infer home locations. Set to DORYAB_STRATEGY to infer one home location for the entire dataset of each participant or to SUN_LI_VEGA_STRATEGY to infer one home location per day per participant. See Observations below to know more. [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] The minimum number of consecutive days a new home location candidate has to repeat before it is considered the participant\u2019s new home. This parameter will be used only when [INFER_HOME_LOCATION_STRATEGY] is set to SUN_LI_VEGA_STRATEGY . [CLUSTERING_ALGORITHM] The original Doryab et al. implementation uses DBSCAN , OPTICS is also available with similar (but not identical) clustering results and lower memory consumption. [RADIUS_FOR_HOME] All location coordinates within this distance (meters) from the home location coordinates are considered a homestay (see timeathome feature). Features description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance traveled in a time segment using the haversine formula. avgspeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - Deprecated, see Observations below. \u201cIt encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN/OPTICS clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between stationary time and total location sensed time. A lat/long coordinate pair is labeled as stationary if its speed (distance/time) to the next coordinate pair is less than 1km/hr. A higher value represents a more stationary routine. outlierstimepercent - Ratio between the time spent in non-significant clusters divided by the time spent in all clusters (stationary time. Only stationary samples are clustered). A higher value represents more time spent in non-significant clusters. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). avglengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters; it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). timeathome minutes Time spent at home (see Observations below for a description on how we compute home). homelabel - An integer that represents a different home location. It will be a constant number (1) for all participants when [INFER_HOME_LOCATION_STRATEGY] is set to DORYAB_STRATEGY or an incremental index if the strategy is set to SUN_LI_VEGA_STRATEGY . Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. Circadian Movement Calculation Note Feb 3 2021. It seems the implementation of this feature is not correct; we suggest not to use this feature until a fix is in place. For a detailed description of how this should be calculated, see Saeb et al . Fine-Tuning Clustering Parameters Based on an experiment where we collected fused location data for 7 days with a mean accuracy of 86 & SD of 350.874635, we determined that EPS/MAX_EPS =100 produced closer clustering results to reality. Higher values (>100) missed out on some significant places, like a short grocery visit, while lower values (<100) picked up traffic lights and stop signs while driving as significant locations. We recommend you set EPS based on your location data\u2019s accuracy (the more accurate your data is, the lower you should be able to set EPS). Duration Calculation To calculate the time duration component for our features, we compute the difference between consecutive rows\u2019 timestamps to take into account sampling rate variability. If this time difference is larger than a threshold (300 seconds by default), we replace it with NA and label that row as Moving. Home location DORYAB_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ) and considering the center of the biggest cluster home for that participant. SUN_LI_VEGA_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ). The following steps are used to infer the home location per day for that participant: if there are records within [03:30:00, 04:30:00] for that night: we choose the most common cluster during that period as a home candidate for that day. elif there are records within [midnight, 03:30:00) for that night: we choose the last valid cluster during that period as a home candidate for that day. elif there are records within (04:30:00, 06:00:00] for that night: we choose the first valid cluster during that period as a home candidate for that day. else: the home location is NA (missing) for that day. If the count of consecutive days with the same candidate home location cluster label is larger or equal to [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] , the candidate will be regarded as the home cluster; otherwise, the home cluster will be the last valid day\u2019s cluster. If there are no valid clusters before that day, the first home location in the days after is used.","title":"DORYAB provider"},{"location":"features/phone-log/","text":"Phone Log \u00b6 Sensor parameters description for [PHONE_LOG] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where a data log is stored for Android devices [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where a data log is stored for iOS devices Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_LOG ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Log"},{"location":"features/phone-log/#phone-log","text":"Sensor parameters description for [PHONE_LOG] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where a data log is stored for Android devices [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where a data log is stored for iOS devices Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_LOG ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Log"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes firstuseafter minutes Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes firstuseafter minutes Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features. Verify RAPIDS can process your data streams Create your participants files Select what time segments you want to extract features on Select the timezone of your study Configure your data streams Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs, we are referring to the corresponding key in the config.yaml file. Supported data streams \u00b6 A data stream refers to sensor data collected using a specific device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Check the table in introduction to data streams to know what data streams we support. If your data stream is supported, continue to the next configuration section, you will use its label later in this guide (e.g. aware_mysql ). If your steam is not supported, but you want to implement it, follow the tutorial to add support for new data streams and open a new discussion in Github with any questions. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Remember to modify the config.yaml file with your PIDS The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you could run the following command, and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, a Fitbit device, and an Empatica device throughout the study between April 23 rd , 2020, and October 28 th , 2020 If your participants didn\u2019t use a [PHONE] , [FITBIT] or [EMPATICA] device, it is not necessary to include that section in their participant file. In other words, you can analyze data from 1 or more devices per participant. PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 EMPATICA : DEVICE_IDS : [ empatica1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). You can set [PLATFORMS]: [infer] , and RAPIDS will infer them automatically (each phone data stream infer this differently, e.g., aware_mysql uses the aware_device table). [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [EMPATICA] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Empatica device used by this participant. Since the most common use case involves having multiple zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Automatic creation of participant files \u00b6 You can use a CSV file with a row per participant to automatically create participant files. AWARE_DEVICE_TABLE was deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option, but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions below: SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; In your config.yaml : Set CSV_FILE_PATH to a CSV file path that complies with the specs described below Set the devices ( PHONE , FITBIT , EMPATICA ) [ADD] flag to TRUE depending on what devices you used in your study. CREATE_PARTICIPANT_FILES : CSV_FILE_PATH : \"your_path/to_your.csv\" PHONE_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] EMPATICA_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] Your CSV file ( [CSV_FILE_PATH] ) should have the following columns (headers), but the values within each column can be empty: Column Description device_id Phone device id. Separate multiple ids with ; fitbit_id Fitbit device id. Separate multiple ids with ; empatica_id Empatica device id. Since the most common use case involves having various zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) pid Unique identifiers with the format pXXX (your participant files will be named with this string) platform Use android , ios or infer as explained above, separate values with ; label A human-readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . end_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Example We added white spaces to this example to make it easy to read, but you don\u2019t have to. device_id ,fitbit_id, empatica_id ,pid ,label ,platform ,start_date ,end_date a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ,fitbit1 , p01 ,p01 ,julio ,android;ios ,2020-01-01 ,2021-01-01 4c4cf7a1-0340-44bc-be0f-d5053bf7390c ,fitbit2 , p02 ,p02 ,meng ,ios ,2021-01-01 ,2022-01-01 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed every day, and all have the same duration (for example, 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute, but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday, March 7 th , 2020, and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would begin on Sunday, March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday, March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment. It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S repeats_on One of the following options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month, and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day , set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segment instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and last 23:59:59 ; the other four segments will begin at 6am, 12pm, 6pm, and 12am, respectively, and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute, but they can be as long as you want. The start of each segment can be shifted backward or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be calculated across all these segments). There cannot be two overlapping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or Fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyze. If you have participants with multiple device ids, you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes, and stress2 and stress4 are shifted backward by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day, and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some information for such computation will be extracted from all three segments, for example, the phone contact that called a participant the most, or the location clusters visited by a participant. Date time labels of event segments In the final feature file, you will find a row per event segment. The local_segment column of each row has a label , a start date-time string, and an end date-time string. weeklysurvey2060#2020-09-12 01 :00:00,2020-09-18 23 :59:59 All sensor data is always segmented based on timestamps, and the date-time strings are attached for informative purposes. For example, you can plot your features based on these strings. When you configure RAPIDS to work with a single time zone, such time zone code will be used to convert start/end timestamps (the ones you typed in the event segments file) into start/end date-time strings. However, when you configure RAPIDS to work with multiple time zones, RAPIDS will use the most common time zone across all devices of every participant to do the conversion. The most common time zone is the one in which a participant spent the most time. In practical terms, this means that the date-time strings of event segments that happened in uncommon time zones will have shifted start/end date-time labels. However, the data within each segment was correctly filtered based on timestamps. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone or you want to ignore short trips of your participants to different time zones, select the appropriate code from this list and change the following config key. Double-check your timezone code pick; for example, US Eastern Time is America/New_York , not EST . TIMEZONE : TYPE : SINGLE TZCODE : America/New_York Multiple timezones \u00b6 If your participants lived in different time zones or they traveled across time zones, and you know when participants\u2019 devices were in a specific time zone, RAPIDS can use this data to process your data streams with the correct date-time. You need to provide RAPIDS with the time zone data in a CSV file ( [TZCODES_FILE] ) in the format described below. TIMEZONE : TYPE : MULTIPLE SINGLE : TZCODE : America/New_York MULTIPLE : TZCODES_FILE : path_to/time_zones_csv.file IF_MISSING_TZCODE : STOP DEFAULT_TZCODE : America/New_York FITBIT : ALLOW_MULTIPLE_TZ_PER_DEVICE : False INFER_FROM_SMARTPHONE_TZ : False Parameters for [TIMEZONE] Parameter Description [TYPE] Either SINGLE or MULTIPLE as explained above [SINGLE][TZCODE] The time zone code from this list to be used across all devices [MULTIPLE][TZCODES_FILE] A CSV file containing the time zones in which participants\u2019 devices sensed data (see the required format below). Multiple devices can be linked to the same person. Read more in Participants Files [MULTIPLE][IF_MISSING_TZCODE] When a device is missing from [TZCODES_FILE] Set this flag to STOP to stop RAPIDS execution and show an error, or to USE_DEFAULT to assign the time zone specified in [DEFAULT_TZCODE] to any such devices [MULTIPLE][FITBIT][ALLOW_MULTIPLE_TZ_PER_DEVICE] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. [MULTIPLE][FITBIT][INFER_FROM_SMARTPHONE_TZ] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. Format of TZCODES_FILE TZCODES_FILE has three columns and a row for each time zone a device visited (a device can be a smartphone or wearable (Fitbit/Empatica)): Column Description device_id A string that uniquely identifies a smartphone or wearable tzcode A string with the appropriate code from this list that represents the time zone where the device sensed data timestamp A UNIX timestamp indicating when was the first time this device_id sensed data in tzcode device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/New_York, 1587500000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Mexico_City, 1587600000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 1587700000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587100000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Berlin, 1587200000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587300000000 Using this file, RAPDIS will create time zone intervals per device, for example for 13dbc8a3-dae3-4834-823a-4bc96a7d459d : Interval 1 [1587500000000, 1587599999999] for America/New_York Interval 2 [1587600000000, 1587699999999] for America/Mexico_City Interval 3 [1587700000000, now] for America/Los_Angeles Any sensor data row from a device will be assigned a timezone if it falls within that interval, for example: A screen row sensed at 1587533333333 will be assigned to America/New_York because it falls within Interval 1 A screen row sensed at 1587400000000 will be discarded because it was logged outside any interval. Can I get the TZCODES_FILE from the time zone table collected automatically by the AWARE app? Sure. You can put your timezone table ( timezone.csv ) collected by the AWARE app under data/external folder and run: python tools/create_multi_timezones_file.py The TZCODES_FILE will be saved as data/external/multiple_timezones.csv . What happens if participant X lives in Los Angeles but participant Y lives in Amsterdam and they both stayed there during my study? Add a row per participant and set timestamp to 0 : device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 0 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 0 What happens if I forget to add a timezone for one or more devices? It depends on [IF_MISSING_TZCODE] . If [IF_MISSING_TZCODE] is set to STOP , RAPIDS will stop its execution and show you an error message. If [IF_MISSING_TZCODE] is set to USE_DEFAULT , it will assign the time zone specified in [DEFAULT_TZCODE] to any devices with missing time zone information in [TZCODES_FILE] . This is helpful if only a few of your participants had multiple timezones, and you don\u2019t want to specify the same time zone for the rest. How does RAPIDS handle Fitbit devices? Fitbit devices are not time zone aware, and they always log data with a local date-time string. When none of the Fitbit devices in your study changed time zones (e.g., p01 was always in New York and p02 was always in Amsterdam), you can set a single time zone per Fitbit device id along with a timestamp of 0 (you can still assign multiple time zones to smartphone device ids) device_id, tzcode, timestamp fitbit123, America/New_York, 0 fitbit999, Europe/Amsterdam, 0 On the other hand, when at least one of your Fitbit devices changed time zones AND you want RAPIDS to take into account these changes, you need to set [ALLOW_MULTIPLE_TZ_PER_DEVICE] to True . You have to manually allow this option because you need to be aware it can produce inaccurate features around the times when time zones changed . This is because we cannot know precisely when the Fitbit device detected and processed the time zone change. If you want to ALLOW_MULTIPLE_TZ_PER_DEVICE , you will need to add any time zone changes per device in the TZCODES_FILE as explained above. You could obtain this data by hand, but if your participants also used a smartphone during your study, you can use their time zone logs. Recall that in RAPIDS, every participant is represented with a participant file pXX.yaml , this file links together multiple devices, and we will use it to know what smartphone time zone data should be applied to Fitbit devices. Thus set INFER_FROM_SMARTPHONE_TZ to TRUE , if you have included smartphone time zone data in your TZCODE_FILE and want to make a participant\u2019s Fitbit data time zone aware with their respective smartphone data. Data Stream Configuration \u00b6 Modify the following keys in your config.yaml depending on the data stream you want to process. Phone Set [PHONE_DATA_STREAMS][TYPE] to the smartphone data stream you want to process (e.g. aware_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of streams you are not using (e.g. [FOLDER] of aware_csv ). PHONE_DATA_STREAMS : USE : aware_mysql # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP aware_csv : FOLDER : data/external/aware_csv aware_mysql Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. aware_csv Key Description [FOLDER] Folder where you have to place a CSV file per phone sensor. Each file has to contain all the data from every participant you want to process. Fitbit Set [FITBIT_DATA_STREAMS][TYPE] to the Fitbit data stream you want to process (e.g. fitbitjson_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of the other streams you are not using (e.g. [FOLDER] of aware_csv ). Warning You will probably have to tell RAPIDS the name of the columns where you stored your Fitbit data. To do this, modify your chosen stream\u2019s format.yaml column mappings to match your raw data column names. FITBIT_DATA_STREAMS : USE : fitbitjson_mysql # AVAILABLE: fitbitjson_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_mysql This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitjson_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitjson_csv This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitjson_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. fitbitparsed_mysql This data stream process Fitbit data stored in multiple columns after being parsed from the JSON column returned by Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitparsed_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitparsed_csv This data stream process Fitbit data stored in multiple columns (plain text) after being parsed from the JSON column returned by Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitparsed_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Empatica Set [USE] to the Empatica data stream you want to use; see the table in introduction to data streams . Configure any parameters as indicated below. EMPATICA_DATA_STREAMS : USE : empatica_zip # AVAILABLE: empatica_zip : FOLDER : data/external/empatica empatica_zip Key Description [FOLDER] The relative path to a folder containing one subfolder per participant. The name of a participant folder should match their device_id assigned in their participant file. Each participant folder can have one or more zip files with any name; in other words, the sensor data in those zip files belong to a single participant. The zip files are automatically generated by Empatica and have a CSV file per sensor ( ACC , HR , TEMP , EDA , BVP , TAGS ). All CSV files of the same type contained in one or more zip files are uncompressed, parsed, sorted by timestamp, and joined together. Example of an EMPATICA FOLDER In the file tree below, we want to process three participants\u2019 data: p01 , p02 , and p03 . p01 has two zip files, p02 has only one zip file, and p03 has three zip files. Each zip has a CSV file per sensor that is joined together and processed by RAPIDS. data/ # this folder exists in the root RAPIDS folder external/ empatica/ p01/ file1.zip file2.zip p02/ aaaa.zip p03/ t1.zip t2.zip t3.zip Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features. Verify RAPIDS can process your data streams Create your participants files Select what time segments you want to extract features on Select the timezone of your study Configure your data streams Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs, we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#supported-data-streams","text":"A data stream refers to sensor data collected using a specific device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Check the table in introduction to data streams to know what data streams we support. If your data stream is supported, continue to the next configuration section, you will use its label later in this guide (e.g. aware_mysql ). If your steam is not supported, but you want to implement it, follow the tutorial to add support for new data streams and open a new discussion in Github with any questions.","title":"Supported data streams"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Remember to modify the config.yaml file with your PIDS The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you could run the following command, and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, a Fitbit device, and an Empatica device throughout the study between April 23 rd , 2020, and October 28 th , 2020 If your participants didn\u2019t use a [PHONE] , [FITBIT] or [EMPATICA] device, it is not necessary to include that section in their participant file. In other words, you can analyze data from 1 or more devices per participant. PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 EMPATICA : DEVICE_IDS : [ empatica1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). You can set [PLATFORMS]: [infer] , and RAPIDS will infer them automatically (each phone data stream infer this differently, e.g., aware_mysql uses the aware_device table). [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [EMPATICA] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Empatica device used by this participant. Since the most common use case involves having multiple zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 .","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You can use a CSV file with a row per participant to automatically create participant files. AWARE_DEVICE_TABLE was deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option, but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions below: SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; In your config.yaml : Set CSV_FILE_PATH to a CSV file path that complies with the specs described below Set the devices ( PHONE , FITBIT , EMPATICA ) [ADD] flag to TRUE depending on what devices you used in your study. CREATE_PARTICIPANT_FILES : CSV_FILE_PATH : \"your_path/to_your.csv\" PHONE_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] EMPATICA_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] Your CSV file ( [CSV_FILE_PATH] ) should have the following columns (headers), but the values within each column can be empty: Column Description device_id Phone device id. Separate multiple ids with ; fitbit_id Fitbit device id. Separate multiple ids with ; empatica_id Empatica device id. Since the most common use case involves having various zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) pid Unique identifiers with the format pXXX (your participant files will be named with this string) platform Use android , ios or infer as explained above, separate values with ; label A human-readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . end_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Example We added white spaces to this example to make it easy to read, but you don\u2019t have to. device_id ,fitbit_id, empatica_id ,pid ,label ,platform ,start_date ,end_date a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ,fitbit1 , p01 ,p01 ,julio ,android;ios ,2020-01-01 ,2021-01-01 4c4cf7a1-0340-44bc-be0f-d5053bf7390c ,fitbit2 , p02 ,p02 ,meng ,ios ,2021-01-01 ,2022-01-01 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed every day, and all have the same duration (for example, 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute, but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday, March 7 th , 2020, and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would begin on Sunday, March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday, March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment. It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S repeats_on One of the following options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month, and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day , set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segment instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and last 23:59:59 ; the other four segments will begin at 6am, 12pm, 6pm, and 12am, respectively, and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute, but they can be as long as you want. The start of each segment can be shifted backward or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be calculated across all these segments). There cannot be two overlapping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or Fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyze. If you have participants with multiple device ids, you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes, and stress2 and stress4 are shifted backward by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day, and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some information for such computation will be extracted from all three segments, for example, the phone contact that called a participant the most, or the location clusters visited by a participant. Date time labels of event segments In the final feature file, you will find a row per event segment. The local_segment column of each row has a label , a start date-time string, and an end date-time string. weeklysurvey2060#2020-09-12 01 :00:00,2020-09-18 23 :59:59 All sensor data is always segmented based on timestamps, and the date-time strings are attached for informative purposes. For example, you can plot your features based on these strings. When you configure RAPIDS to work with a single time zone, such time zone code will be used to convert start/end timestamps (the ones you typed in the event segments file) into start/end date-time strings. However, when you configure RAPIDS to work with multiple time zones, RAPIDS will use the most common time zone across all devices of every participant to do the conversion. The most common time zone is the one in which a participant spent the most time. In practical terms, this means that the date-time strings of event segments that happened in uncommon time zones will have shifted start/end date-time labels. However, the data within each segment was correctly filtered based on timestamps.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone or you want to ignore short trips of your participants to different time zones, select the appropriate code from this list and change the following config key. Double-check your timezone code pick; for example, US Eastern Time is America/New_York , not EST . TIMEZONE : TYPE : SINGLE TZCODE : America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"If your participants lived in different time zones or they traveled across time zones, and you know when participants\u2019 devices were in a specific time zone, RAPIDS can use this data to process your data streams with the correct date-time. You need to provide RAPIDS with the time zone data in a CSV file ( [TZCODES_FILE] ) in the format described below. TIMEZONE : TYPE : MULTIPLE SINGLE : TZCODE : America/New_York MULTIPLE : TZCODES_FILE : path_to/time_zones_csv.file IF_MISSING_TZCODE : STOP DEFAULT_TZCODE : America/New_York FITBIT : ALLOW_MULTIPLE_TZ_PER_DEVICE : False INFER_FROM_SMARTPHONE_TZ : False Parameters for [TIMEZONE] Parameter Description [TYPE] Either SINGLE or MULTIPLE as explained above [SINGLE][TZCODE] The time zone code from this list to be used across all devices [MULTIPLE][TZCODES_FILE] A CSV file containing the time zones in which participants\u2019 devices sensed data (see the required format below). Multiple devices can be linked to the same person. Read more in Participants Files [MULTIPLE][IF_MISSING_TZCODE] When a device is missing from [TZCODES_FILE] Set this flag to STOP to stop RAPIDS execution and show an error, or to USE_DEFAULT to assign the time zone specified in [DEFAULT_TZCODE] to any such devices [MULTIPLE][FITBIT][ALLOW_MULTIPLE_TZ_PER_DEVICE] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. [MULTIPLE][FITBIT][INFER_FROM_SMARTPHONE_TZ] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. Format of TZCODES_FILE TZCODES_FILE has three columns and a row for each time zone a device visited (a device can be a smartphone or wearable (Fitbit/Empatica)): Column Description device_id A string that uniquely identifies a smartphone or wearable tzcode A string with the appropriate code from this list that represents the time zone where the device sensed data timestamp A UNIX timestamp indicating when was the first time this device_id sensed data in tzcode device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/New_York, 1587500000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Mexico_City, 1587600000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 1587700000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587100000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Berlin, 1587200000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587300000000 Using this file, RAPDIS will create time zone intervals per device, for example for 13dbc8a3-dae3-4834-823a-4bc96a7d459d : Interval 1 [1587500000000, 1587599999999] for America/New_York Interval 2 [1587600000000, 1587699999999] for America/Mexico_City Interval 3 [1587700000000, now] for America/Los_Angeles Any sensor data row from a device will be assigned a timezone if it falls within that interval, for example: A screen row sensed at 1587533333333 will be assigned to America/New_York because it falls within Interval 1 A screen row sensed at 1587400000000 will be discarded because it was logged outside any interval. Can I get the TZCODES_FILE from the time zone table collected automatically by the AWARE app? Sure. You can put your timezone table ( timezone.csv ) collected by the AWARE app under data/external folder and run: python tools/create_multi_timezones_file.py The TZCODES_FILE will be saved as data/external/multiple_timezones.csv . What happens if participant X lives in Los Angeles but participant Y lives in Amsterdam and they both stayed there during my study? Add a row per participant and set timestamp to 0 : device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 0 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 0 What happens if I forget to add a timezone for one or more devices? It depends on [IF_MISSING_TZCODE] . If [IF_MISSING_TZCODE] is set to STOP , RAPIDS will stop its execution and show you an error message. If [IF_MISSING_TZCODE] is set to USE_DEFAULT , it will assign the time zone specified in [DEFAULT_TZCODE] to any devices with missing time zone information in [TZCODES_FILE] . This is helpful if only a few of your participants had multiple timezones, and you don\u2019t want to specify the same time zone for the rest. How does RAPIDS handle Fitbit devices? Fitbit devices are not time zone aware, and they always log data with a local date-time string. When none of the Fitbit devices in your study changed time zones (e.g., p01 was always in New York and p02 was always in Amsterdam), you can set a single time zone per Fitbit device id along with a timestamp of 0 (you can still assign multiple time zones to smartphone device ids) device_id, tzcode, timestamp fitbit123, America/New_York, 0 fitbit999, Europe/Amsterdam, 0 On the other hand, when at least one of your Fitbit devices changed time zones AND you want RAPIDS to take into account these changes, you need to set [ALLOW_MULTIPLE_TZ_PER_DEVICE] to True . You have to manually allow this option because you need to be aware it can produce inaccurate features around the times when time zones changed . This is because we cannot know precisely when the Fitbit device detected and processed the time zone change. If you want to ALLOW_MULTIPLE_TZ_PER_DEVICE , you will need to add any time zone changes per device in the TZCODES_FILE as explained above. You could obtain this data by hand, but if your participants also used a smartphone during your study, you can use their time zone logs. Recall that in RAPIDS, every participant is represented with a participant file pXX.yaml , this file links together multiple devices, and we will use it to know what smartphone time zone data should be applied to Fitbit devices. Thus set INFER_FROM_SMARTPHONE_TZ to TRUE , if you have included smartphone time zone data in your TZCODE_FILE and want to make a participant\u2019s Fitbit data time zone aware with their respective smartphone data.","title":"Multiple timezones"},{"location":"setup/configuration/#data-stream-configuration","text":"Modify the following keys in your config.yaml depending on the data stream you want to process. Phone Set [PHONE_DATA_STREAMS][TYPE] to the smartphone data stream you want to process (e.g. aware_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of streams you are not using (e.g. [FOLDER] of aware_csv ). PHONE_DATA_STREAMS : USE : aware_mysql # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP aware_csv : FOLDER : data/external/aware_csv aware_mysql Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. aware_csv Key Description [FOLDER] Folder where you have to place a CSV file per phone sensor. Each file has to contain all the data from every participant you want to process. Fitbit Set [FITBIT_DATA_STREAMS][TYPE] to the Fitbit data stream you want to process (e.g. fitbitjson_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of the other streams you are not using (e.g. [FOLDER] of aware_csv ). Warning You will probably have to tell RAPIDS the name of the columns where you stored your Fitbit data. To do this, modify your chosen stream\u2019s format.yaml column mappings to match your raw data column names. FITBIT_DATA_STREAMS : USE : fitbitjson_mysql # AVAILABLE: fitbitjson_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_mysql This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitjson_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitjson_csv This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitjson_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. fitbitparsed_mysql This data stream process Fitbit data stored in multiple columns after being parsed from the JSON column returned by Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitparsed_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitparsed_csv This data stream process Fitbit data stored in multiple columns (plain text) after being parsed from the JSON column returned by Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitparsed_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Empatica Set [USE] to the Empatica data stream you want to use; see the table in introduction to data streams . Configure any parameters as indicated below. EMPATICA_DATA_STREAMS : USE : empatica_zip # AVAILABLE: empatica_zip : FOLDER : data/external/empatica empatica_zip Key Description [FOLDER] The relative path to a folder containing one subfolder per participant. The name of a participant folder should match their device_id assigned in their participant file. Each participant folder can have one or more zip files with any name; in other words, the sensor data in those zip files belong to a single participant. The zip files are automatically generated by Empatica and have a CSV file per sensor ( ACC , HR , TEMP , EDA , BVP , TAGS ). All CSV files of the same type contained in one or more zip files are uncompressed, parsed, sorted by timestamp, and joined together. Example of an EMPATICA FOLDER In the file tree below, we want to process three participants\u2019 data: p01 , p02 , and p03 . p01 has two zip files, p02 has only one zip file, and p03 has three zip files. Each zip has a CSV file per sensor that is joined together and processed by RAPIDS. data/ # this folder exists in the root RAPIDS folder external/ empatica/ p01/ file1.zip file2.zip p02/ aaaa.zip p03/ t1.zip t2.zip t3.zip","title":"Data Stream Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction We wrap Snakemake The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will execute the script that computes MESSAGES features and update its output file. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be loaded in memory at the same time. If RAPIDS crashes because it ran out of memory, reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Deleting RAPIDS output If you want to delete all the output files RAPIDS produces, you can execute the following command: ./rapids -j1 --delete-all-output Forcing a complete rerun or updating your raw data in RAPIDS If you want to update your raw data or rerun the whole pipeline from scratch, run the following commands: ./rapids -j1 --delete-all-output ./rapids -j1","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction We wrap Snakemake The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will execute the script that computes MESSAGES features and update its output file. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be loaded in memory at the same time. If RAPIDS crashes because it ran out of memory, reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Deleting RAPIDS output If you want to delete all the output files RAPIDS produces, you can execute the following command: ./rapids -j1 --delete-all-output Forcing a complete rerun or updating your raw data in RAPIDS If you want to update your raw data or rerun the whole pipeline from scratch, run the following commands: ./rapids -j1 --delete-all-output ./rapids -j1","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Linux (Ubuntu). Windows is supported through Docker or WSL. Docker Install Docker Pull our RAPIDS container docker pull moshiresearch/rapids:latest Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it moshiresearch/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure the Remote Containers extension Make sure RAPIDS Docker container is running Install VS Code and its Remote - Containers extension Click the Remote Explorer icon on the left-hand sidebar (the icon is a computer monitor) On the top right dropdown menu, choose Containers Right-click on the moshiresearch/rapids container in the CONTAINERS tree and select Attach to Container . A new VS Code window should open In the new window, open the /rapids/ folder via the File/Open... menu Run RAPIDS inside a terminal in VS Code. Open one with the Terminal/New Terminal menu Warning If you installed RAPIDS using Docker for Windows on Windows 10, the container will have limits on the amount of RAM it can use. If you find that RAPIDS crashes due to running out of memory, increase this limit. MacOS We tested these instructions in Catalina and Big Sur M1 Macs RAPIDS can run on M1 Macs, the only changes as of Feb 21, 2021 are: R needs to be installed via brew under Rosetta (x86 arch) due to incompatibility issues with some R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. Use x86 brew to install R and restore RAPIDS\u2019 packages ( snakemake -j1 renv_install & snakemake -j1 renv_restore ). There is a bug related to timezone codes. We set the correct TZ_DIR in renv/activate.R (line #19) Sys.setenv(\"TZDIR\" = file.path(R.home(), \"share\", \"zoneinfo\")) (RAPIDS does this automatically). Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested RAPIDS on Ubuntu 18.04 & 20.04. Note that the necessary Python and R packages are available in other Linux distributions, so if you decide to give it a try, let us know and we can update these docs. Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev sudo apt install libglpk40 Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository Ubuntu 18.04 Bionic sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' Ubuntu 20.04 Focal sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install the R virtual environment management package (renv) snakemake -j1 renv_install Restore the R virtual environment Ubuntu 18.04 Bionic (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/bionic/latest\"))' Ubuntu 20.04 Focal (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/focal/latest\"))' Ubuntu (slow) If the fast installation command failed for some reason, you can restore the R virtual environment from source: R -e 'renv::restore()' Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Windows There are several options varying in complexity: You can use our Docker instructions (tested) You can use our Ubuntu 20.04 instructions on WSL2 (not tested but it will likely work) Native installation (experimental). If you would like to contribute to RAPIDS you could try to install MySQL, miniconda, Python, and R 4.0+ in Windows and restore the Python and R virtual environments using steps 6 and 7 of the instructions for Mac. You can get in touch if you would like to discuss this with the team.","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Linux (Ubuntu). Windows is supported through Docker or WSL. Docker Install Docker Pull our RAPIDS container docker pull moshiresearch/rapids:latest Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it moshiresearch/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure the Remote Containers extension Make sure RAPIDS Docker container is running Install VS Code and its Remote - Containers extension Click the Remote Explorer icon on the left-hand sidebar (the icon is a computer monitor) On the top right dropdown menu, choose Containers Right-click on the moshiresearch/rapids container in the CONTAINERS tree and select Attach to Container . A new VS Code window should open In the new window, open the /rapids/ folder via the File/Open... menu Run RAPIDS inside a terminal in VS Code. Open one with the Terminal/New Terminal menu Warning If you installed RAPIDS using Docker for Windows on Windows 10, the container will have limits on the amount of RAM it can use. If you find that RAPIDS crashes due to running out of memory, increase this limit. MacOS We tested these instructions in Catalina and Big Sur M1 Macs RAPIDS can run on M1 Macs, the only changes as of Feb 21, 2021 are: R needs to be installed via brew under Rosetta (x86 arch) due to incompatibility issues with some R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. Use x86 brew to install R and restore RAPIDS\u2019 packages ( snakemake -j1 renv_install & snakemake -j1 renv_restore ). There is a bug related to timezone codes. We set the correct TZ_DIR in renv/activate.R (line #19) Sys.setenv(\"TZDIR\" = file.path(R.home(), \"share\", \"zoneinfo\")) (RAPIDS does this automatically). Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested RAPIDS on Ubuntu 18.04 & 20.04. Note that the necessary Python and R packages are available in other Linux distributions, so if you decide to give it a try, let us know and we can update these docs. Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev sudo apt install libglpk40 Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository Ubuntu 18.04 Bionic sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' Ubuntu 20.04 Focal sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install the R virtual environment management package (renv) snakemake -j1 renv_install Restore the R virtual environment Ubuntu 18.04 Bionic (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/bionic/latest\"))' Ubuntu 20.04 Focal (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/focal/latest\"))' Ubuntu (slow) If the fast installation command failed for some reason, you can restore the R virtual environment from source: R -e 'renv::restore()' Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Windows There are several options varying in complexity: You can use our Docker instructions (tested) You can use our Ubuntu 20.04 instructions on WSL2 (not tested but it will likely work) Native installation (experimental). If you would like to contribute to RAPIDS you could try to install MySQL, miniconda, Python, and R 4.0+ in Windows and restore the Python and R virtual environments using steps 6 and 7 of the instructions for Mac. You can get in touch if you would like to discuss this with the team.","title":"Installation"},{"location":"setup/overview/","text":"Overview \u00b6 Let\u2019s review some key concepts we use throughout these docs: Definition Description Device A mobile or wearable device, like smartphones, Fitbit wrist bands, Oura Rings, etc. Sensor A physical or digital module builtin in a device that produces a data stream. For example, a smartphone\u2019s accelerometer or screen. Data Stream Set of sensor data collected using a specific device with a particular ** format** and stored in a specific container . For example, smartphone (device) data collected with the AWARE Framework (format) and stored in a MySQL database (container). Data Stream Format Sensor data produced by a data stream have columns with specific names and types. RAPIDS can process a data stream using a format.yaml file that describes the raw data columns and any necessary transformations. Data Stream Container Sensor data produced by a data stream can be stored in a database, electronic files, or arbitrary electronic containers. RAPIDS can pull (download) the data from a stream using a container script implemented in R or Python. Participant A person that took part in a monitoring study Behavioral feature A metric computed from raw sensor data quantifying the behavior of a participant. For example, time spent at home calculated from location data. These are also known as digital biomarkers Time segment Time segments (or epochs) are the time windows on which RAPIDS extracts behavioral features. For example, you might want to compute participants\u2019 time at home every morning or only during weekends. You define time segments in a CSV file that RAPIDS processes. Time zone A string like America/New_York that represents a time zone where a device logged data. You can process data collected in single or multiple time zones for every participant. Feature Provider A script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . config.yaml A YAML file where you can modify parameters to process data streams and behavioral features. This is the heart of RAPIDS and the file that you will change the most. credentials.yaml A YAML file where you can define credential groups (user, password, host, etc.) if your data stream needs to connect to a database or Web API Participant file(s) A YAML file that links one or more smartphone or wearable devices used by a single participant. RAPIDS needs one file per participant. What can I do with RAPIDS? Extract behavioral features from smartphone, Fitbit, and Empatica\u2019s supported data streams Add your own behavioral features (we can include them in RAPIDS if you want to share them with the community) Add support for new data streams if yours cannot be processed by RAPIDS yet Create visualizations for data quality control and feature inspection Extending RAPIDS to organize your analysis and publish a code repository along with your code Hint We recommend you follow the Minimal Example tutorial to get familiar with RAPIDS In order to follow any of the previous tutorials, you will have to Install , Configure , and learn how to Execute RAPIDS. Open a new discussion in Github if you have any questions and open an issue to report any bugs. Frequently Asked Questions \u00b6 General \u00b6 What exactly is RAPIDS? RAPIDS is a group of configuration files and R and Python scripts executed by Snakemake . You can get a copy of RAPIDS by cloning our Github repository. RAPIDS is not a web application or server; all the processing is done in your laptop, server, or computer cluster. How does RAPIDS work? You will most of the time only have to modify configuration files in YAML format ( config.yaml , credentials.yaml , and participant files pxx.yaml ), and in CSV format (time zones and time segments). RAPIDS pulls data from different data containers and processes it in steps. The input/output of each stage is saved as a CSV file for inspection; you can check the files created for each sensor on its documentation page. All data is stored in data/ , and all processing Python and R scripts are stored in src/ . User and File interactions in RAPIDS In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS Data flow in RAPIDS In the figure below, we represent the flow of data in RAPIDS. In broad terms, smartphone and wearable devices log data streams with a certain format to a data container (database, file, etc.). RAPIDS can connect to these containers if it has a format.yaml and a container.[R|py] script used to pull the correct data and mutate it to comply with RAPIDS\u2019 internal data representation. Once the data stream is in RAPIDS, it goes through some basic transformations (scripts), one that assigns a time segment and a time zone to each data row, and another one that creates \u201cepisodes\u201d of data for some sensors that need it (like screen, battery, activity recognition, and sleep intraday data). After this, RAPIDS executes the requested PROVIDER script that computes behavioral features per time segment instance. After every feature is computed, they are joined per sensor, per participant, and study. Visualizations are built based on raw data or based on calculated features. Data stream flow in RAPIDS Is my data private? Absolutely, you are processing your data with your own copy of RAPIDS in your laptop, server, or computer cluster, so neither we nor anyone else can access your datasets. Do I need to have coding skills to use RAPIDS? If you want to extract the behavioral features or visualizations that RAPIDS offers out of the box, the answer is no. However, you need to be comfortable running commands in your terminal and familiar with editing YAML files and CSV files. If you want to add support for new data streams or behavioral features, you need to be familiar with R or Python. Is RAPIDS open-source or free? Yes, RAPIDS is both open-source and free. How do I cite RAPIDS? Please refer to our Citation guide ; depending on what parts of RAPIDS you used, we also ask you to cite the work of other authors that shared their work. I have a lot of data, can RAPIDS handle it/ is RAPIDS fast enough? Yes, we use Snakemake under the hood, so you can automatically distribute RAPIDS execution over multiple cores or clusters . RAPIDS processes data per sensor and participant, so it can take advantage of this parallel processing. What are the advantages of using RAPIDS over implementing my own analysis code? We believe RAPIDS can benefit your analysis in several ways: RAPIDS has more than 250 behavioral features available, many of them tested and used by other researchers. RAPIDS can extract features in dynamic time segments (for example, every x minutes, x hours, x days, x weeks, x months, etc.). This is handy because you don\u2019t have to deal with time zones, daylight saving changes, or date arithmetic. Your analysis is less prone to errors. Every participant sensor dataset is analyzed in the same way and isolated from each other. If you have lots of data, out-of-the-box parallel execution will speed up your analysis, and if your computer crashes, RAPIDS will start from where it left off. You can publish your analysis code along with your papers and be sure it will run exactly as it does on your computer. You can still add your own behavioral features and data streams if you need to, and the community will be able to reuse your work. Data Streams \u00b6 Can I process smartphone data collected with Beiwe, PurpleRobot, or app X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. Can I process data from Oura Rings, Actigraphs, or wearable X? The only wearables we support at the moment are Empatica and Fitbit. However, get in touch if you need to process data from a different wearable. We have limited resources, so we add support for additional devices on an as-needed basis, but we would be happy to collaborate. Open a new discussion in Github if you have any questions. Can I process smartphone or wearable data stored in PostgreSQL, Oracle, SQLite, CSV files, or data container X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . If you are processing data streams we already support like AWARE, Fitbit, or Empatica and are just connecting to a different container, you can reuse their format.yaml and only implement a new container script. Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. I have participants that live in different time zones and some that travel; can RAPIDS handle this? Yes, RAPIDS can handle single or multiple timezones per participant. You can use time zone data collected by smartphones or collected by hand. Some of my participants used more than one device during my study; can RAPIDS handle this? Yes, you can link more than one smartphone or wearable device to a single participant. RAPIDS will merge them and sort them automatically. Some of my participants switched from Android to iOS or vice-versa during my study; can RAPIDS handle this? Yes, data from multiple smartphones can be linked to a single participant. All iOS data is converted to Android data before merging it. Extending RAPIDS \u00b6 Can I add my own behavioral features/digital biomarkers? Yes, you can implement your own features in R or Python following this tutorial Can I extract behavioral features based on two or more sensors? Yes, we do this for PHONE_DATA_YIELD (combines all phone sensors), PHONE_LOCATIONS (combines location and data yield data), PHONE_APPLICATIONS_BACKGROUND (combines screen and app usage data), and FITBIT_INTRADAY_STEPS (combines Fitbit and sleep and step data). However, we haven\u2019t come up with a user-friendly way to configure this, and currently, we join sensors on a case-by-case basis. This is mainly because not enough users have needed this functionality so far. Get in touch, and we can set it up together; the more use cases we are aware of, the easier it will be to integrate this into RAPIDS. I know how to program in Python or R but not both. Can I still use or extend RAPIDS? Yes, you don\u2019t need to write any code to use RAPIDS out of the box. If you need to add support for new data streams or behavioral features you can use scripts in either language. I have scripts that clean raw data from X sensor, can I use them with RAPIDS? Yes, you can add them as a [MUTATION][SCRIPT] in the format.yaml of the data stream you are using. You will add a main function that will receive a data frame with the raw data for that sensor that, in turn, will be used to compute behavioral features.","title":"Overview"},{"location":"setup/overview/#overview","text":"Let\u2019s review some key concepts we use throughout these docs: Definition Description Device A mobile or wearable device, like smartphones, Fitbit wrist bands, Oura Rings, etc. Sensor A physical or digital module builtin in a device that produces a data stream. For example, a smartphone\u2019s accelerometer or screen. Data Stream Set of sensor data collected using a specific device with a particular ** format** and stored in a specific container . For example, smartphone (device) data collected with the AWARE Framework (format) and stored in a MySQL database (container). Data Stream Format Sensor data produced by a data stream have columns with specific names and types. RAPIDS can process a data stream using a format.yaml file that describes the raw data columns and any necessary transformations. Data Stream Container Sensor data produced by a data stream can be stored in a database, electronic files, or arbitrary electronic containers. RAPIDS can pull (download) the data from a stream using a container script implemented in R or Python. Participant A person that took part in a monitoring study Behavioral feature A metric computed from raw sensor data quantifying the behavior of a participant. For example, time spent at home calculated from location data. These are also known as digital biomarkers Time segment Time segments (or epochs) are the time windows on which RAPIDS extracts behavioral features. For example, you might want to compute participants\u2019 time at home every morning or only during weekends. You define time segments in a CSV file that RAPIDS processes. Time zone A string like America/New_York that represents a time zone where a device logged data. You can process data collected in single or multiple time zones for every participant. Feature Provider A script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . config.yaml A YAML file where you can modify parameters to process data streams and behavioral features. This is the heart of RAPIDS and the file that you will change the most. credentials.yaml A YAML file where you can define credential groups (user, password, host, etc.) if your data stream needs to connect to a database or Web API Participant file(s) A YAML file that links one or more smartphone or wearable devices used by a single participant. RAPIDS needs one file per participant. What can I do with RAPIDS? Extract behavioral features from smartphone, Fitbit, and Empatica\u2019s supported data streams Add your own behavioral features (we can include them in RAPIDS if you want to share them with the community) Add support for new data streams if yours cannot be processed by RAPIDS yet Create visualizations for data quality control and feature inspection Extending RAPIDS to organize your analysis and publish a code repository along with your code Hint We recommend you follow the Minimal Example tutorial to get familiar with RAPIDS In order to follow any of the previous tutorials, you will have to Install , Configure , and learn how to Execute RAPIDS. Open a new discussion in Github if you have any questions and open an issue to report any bugs.","title":"Overview"},{"location":"setup/overview/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"setup/overview/#general","text":"What exactly is RAPIDS? RAPIDS is a group of configuration files and R and Python scripts executed by Snakemake . You can get a copy of RAPIDS by cloning our Github repository. RAPIDS is not a web application or server; all the processing is done in your laptop, server, or computer cluster. How does RAPIDS work? You will most of the time only have to modify configuration files in YAML format ( config.yaml , credentials.yaml , and participant files pxx.yaml ), and in CSV format (time zones and time segments). RAPIDS pulls data from different data containers and processes it in steps. The input/output of each stage is saved as a CSV file for inspection; you can check the files created for each sensor on its documentation page. All data is stored in data/ , and all processing Python and R scripts are stored in src/ . User and File interactions in RAPIDS In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS Data flow in RAPIDS In the figure below, we represent the flow of data in RAPIDS. In broad terms, smartphone and wearable devices log data streams with a certain format to a data container (database, file, etc.). RAPIDS can connect to these containers if it has a format.yaml and a container.[R|py] script used to pull the correct data and mutate it to comply with RAPIDS\u2019 internal data representation. Once the data stream is in RAPIDS, it goes through some basic transformations (scripts), one that assigns a time segment and a time zone to each data row, and another one that creates \u201cepisodes\u201d of data for some sensors that need it (like screen, battery, activity recognition, and sleep intraday data). After this, RAPIDS executes the requested PROVIDER script that computes behavioral features per time segment instance. After every feature is computed, they are joined per sensor, per participant, and study. Visualizations are built based on raw data or based on calculated features. Data stream flow in RAPIDS Is my data private? Absolutely, you are processing your data with your own copy of RAPIDS in your laptop, server, or computer cluster, so neither we nor anyone else can access your datasets. Do I need to have coding skills to use RAPIDS? If you want to extract the behavioral features or visualizations that RAPIDS offers out of the box, the answer is no. However, you need to be comfortable running commands in your terminal and familiar with editing YAML files and CSV files. If you want to add support for new data streams or behavioral features, you need to be familiar with R or Python. Is RAPIDS open-source or free? Yes, RAPIDS is both open-source and free. How do I cite RAPIDS? Please refer to our Citation guide ; depending on what parts of RAPIDS you used, we also ask you to cite the work of other authors that shared their work. I have a lot of data, can RAPIDS handle it/ is RAPIDS fast enough? Yes, we use Snakemake under the hood, so you can automatically distribute RAPIDS execution over multiple cores or clusters . RAPIDS processes data per sensor and participant, so it can take advantage of this parallel processing. What are the advantages of using RAPIDS over implementing my own analysis code? We believe RAPIDS can benefit your analysis in several ways: RAPIDS has more than 250 behavioral features available, many of them tested and used by other researchers. RAPIDS can extract features in dynamic time segments (for example, every x minutes, x hours, x days, x weeks, x months, etc.). This is handy because you don\u2019t have to deal with time zones, daylight saving changes, or date arithmetic. Your analysis is less prone to errors. Every participant sensor dataset is analyzed in the same way and isolated from each other. If you have lots of data, out-of-the-box parallel execution will speed up your analysis, and if your computer crashes, RAPIDS will start from where it left off. You can publish your analysis code along with your papers and be sure it will run exactly as it does on your computer. You can still add your own behavioral features and data streams if you need to, and the community will be able to reuse your work.","title":"General"},{"location":"setup/overview/#data-streams","text":"Can I process smartphone data collected with Beiwe, PurpleRobot, or app X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. Can I process data from Oura Rings, Actigraphs, or wearable X? The only wearables we support at the moment are Empatica and Fitbit. However, get in touch if you need to process data from a different wearable. We have limited resources, so we add support for additional devices on an as-needed basis, but we would be happy to collaborate. Open a new discussion in Github if you have any questions. Can I process smartphone or wearable data stored in PostgreSQL, Oracle, SQLite, CSV files, or data container X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . If you are processing data streams we already support like AWARE, Fitbit, or Empatica and are just connecting to a different container, you can reuse their format.yaml and only implement a new container script. Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. I have participants that live in different time zones and some that travel; can RAPIDS handle this? Yes, RAPIDS can handle single or multiple timezones per participant. You can use time zone data collected by smartphones or collected by hand. Some of my participants used more than one device during my study; can RAPIDS handle this? Yes, you can link more than one smartphone or wearable device to a single participant. RAPIDS will merge them and sort them automatically. Some of my participants switched from Android to iOS or vice-versa during my study; can RAPIDS handle this? Yes, data from multiple smartphones can be linked to a single participant. All iOS data is converted to Android data before merging it.","title":"Data Streams"},{"location":"setup/overview/#extending-rapids","text":"Can I add my own behavioral features/digital biomarkers? Yes, you can implement your own features in R or Python following this tutorial Can I extract behavioral features based on two or more sensors? Yes, we do this for PHONE_DATA_YIELD (combines all phone sensors), PHONE_LOCATIONS (combines location and data yield data), PHONE_APPLICATIONS_BACKGROUND (combines screen and app usage data), and FITBIT_INTRADAY_STEPS (combines Fitbit and sleep and step data). However, we haven\u2019t come up with a user-friendly way to configure this, and currently, we join sensors on a case-by-case basis. This is mainly because not enough users have needed this functionality so far. Get in touch, and we can set it up together; the more use cases we are aware of, the easier it will be to integrate this into RAPIDS. I know how to program in Python or R but not both. Can I still use or extend RAPIDS? Yes, you don\u2019t need to write any code to use RAPIDS out of the box. If you need to add support for new data streams or behavioral features you can use scripts in either language. I have scripts that clean raw data from X sensor, can I use them with RAPIDS? Yes, you can add them as a [MUTATION][SCRIPT] in the format.yaml of the data stream you are using. You will add a main function that will receive a data frame with the raw data for that sensor that, in turn, will be used to compute behavioral features.","title":"Extending RAPIDS"},{"location":"snippets/aware_format/","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Aware format"},{"location":"snippets/database/","text":"Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine.","title":"Database"},{"location":"snippets/feature_introduction_example/","text":"Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Feature introduction example"},{"location":"snippets/jsonfitbit_format/","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Jsonfitbit format"},{"location":"snippets/parsedfitbit_format/","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Parsedfitbit format"},{"location":"visualizations/data-quality-visualizations/","text":"Data Quality Visualizations \u00b6 We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (example01 and example02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.) 1. Histograms of phone data yield \u00b6 RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, morning, afternoon, evening, and night) 2. Heatmaps of overall data yield \u00b6 These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of the start of each time segment instance or the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants example01 and example02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). [ABSOLUTE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants [RELATIVE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants 3. Heatmap of recorded phone sensors \u00b6 In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant example01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 7 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant 4. Heatmap of sensor row count \u00b6 These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 14 phone sensors (including data yield) of example01\u2019s daily segments. From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"Data Quality"},{"location":"visualizations/data-quality-visualizations/#data-quality-visualizations","text":"We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (example01 and example02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)","title":"Data Quality Visualizations"},{"location":"visualizations/data-quality-visualizations/#1-histograms-of-phone-data-yield","text":"RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, morning, afternoon, evening, and night)","title":"1. Histograms of phone data yield"},{"location":"visualizations/data-quality-visualizations/#2-heatmaps-of-overall-data-yield","text":"These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of the start of each time segment instance or the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants example01 and example02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). [ABSOLUTE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants [RELATIVE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants","title":"2. Heatmaps of overall data yield"},{"location":"visualizations/data-quality-visualizations/#3-heatmap-of-recorded-phone-sensors","text":"In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant example01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 7 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant","title":"3. Heatmap of recorded phone sensors"},{"location":"visualizations/data-quality-visualizations/#4-heatmap-of-sensor-row-count","text":"These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 14 phone sensors (including data yield) of example01\u2019s daily segments. From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"4. Heatmap of sensor row count"},{"location":"visualizations/feature-visualizations/","text":"Feature Visualizations \u00b6 1. Heatmap Correlation Matrix \u00b6 Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"Features"},{"location":"visualizations/feature-visualizations/#feature-visualizations","text":"","title":"Feature Visualizations"},{"location":"visualizations/feature-visualizations/#1-heatmap-correlation-matrix","text":"Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"1. Heatmap Correlation Matrix"},{"location":"workflow-examples/analysis/","text":"Analysis Workflow Example \u00b6 TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers Why should I integrate my analysis in RAPIDS? \u00b6 Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS. Analysis workflow structure \u00b6 To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules . Description of the study modeled in our analysis workflow example \u00b6 Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share files with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation Configure and run the analysis workflow example \u00b6 Install RAPIDS Unzip the CSV files inside rapids_example_csv.zip in data/external/example_workflow/*.csv . Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Note you will see a lot of warning messages, you can ignore them since they happen because we ran ML algorithms with a small fake dataset. Modules of our analysis workflow example \u00b6 1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the data/external/example_workflow/participant_info.csv file. As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the data/external/example_workflow/participant_target.csv file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_sensor_features_for_all_participants rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 158 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 106 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Complete Example"},{"location":"workflow-examples/analysis/#analysis-workflow-example","text":"TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers","title":"Analysis Workflow Example"},{"location":"workflow-examples/analysis/#why-should-i-integrate-my-analysis-in-rapids","text":"Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS.","title":"Why should I integrate my analysis in RAPIDS?"},{"location":"workflow-examples/analysis/#analysis-workflow-structure","text":"To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules .","title":"Analysis workflow structure"},{"location":"workflow-examples/analysis/#description-of-the-study-modeled-in-our-analysis-workflow-example","text":"Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share files with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation","title":"Description of the study modeled in our analysis workflow example"},{"location":"workflow-examples/analysis/#configure-and-run-the-analysis-workflow-example","text":"Install RAPIDS Unzip the CSV files inside rapids_example_csv.zip in data/external/example_workflow/*.csv . Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Note you will see a lot of warning messages, you can ignore them since they happen because we ran ML algorithms with a small fake dataset.","title":"Configure and run the analysis workflow example"},{"location":"workflow-examples/analysis/#modules-of-our-analysis-workflow-example","text":"1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the data/external/example_workflow/participant_info.csv file. As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the data/external/example_workflow/participant_target.csv file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_sensor_features_for_all_participants rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 158 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 106 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Modules of our analysis workflow example"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for 24 hr ( 00:00:00 to 23:59:59 ) and night ( 00:00:00 to 05:59:59 ) time segments of every day of data of one participant that was monitored on the US East coast with an Android smartphone. Install RAPIDS and make sure your conda environment is active (see Installation ) Download this CSV file and save it as data/external/aware_csv/calls.csv Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Required configuration changes ( click to expand ) Supported data streams . Based on the docs, we decided to use the aware_csv data stream because we are processing aware data saved in a CSV file. We will use this label in a later step; there\u2019s no need to type it or save it anywhere yet. Create your participants file . Since we are processing data from a single participant, you only need to create a single participant file called p01.yaml in data/external/participant_files . This participant file only has a PHONE section because this hypothetical participant was only monitored with a smartphone. Note that for a real analysis, you can do this automatically with a CSV file Add p01 to [PIDS] in config.yaml Create a file in data/external/participant_files/p01.yaml with the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty Select what time segments you want to extract features on. Set [TIME_SEGMENTS][FILE] to data/external/timesegments_periodic.csv Create a file in data/external/timesegments_periodic.csv with the following content label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 Choose the timezone of your study . We will use the default time zone settings since this example is processing data collected on the US East Coast ( America/New_York ) TIMEZONE : TYPE : SINGLE SINGLE : TZCODE : America/New_York Modify your device data stream configuration Set [PHONE_DATA_STREAMS][USE] to aware_csv . We will use the default value for [PHONE_DATA_STREAMS][aware_csv][FOLDER] since we already stored the test calls CSV file there. Select what sensors and features you want to process. Set [PHONE_CALLS][CONTAINER] to calls.csv in the config.yaml file. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True in the config.yaml file. Example of the config.yaml sections after the changes outlined above This will be your config.yaml after following the instructions above. Click on the numbered markers to know more. PIDS : [ p01 ] # (1) TIMEZONE : TYPE : SINGLE # (2) SINGLE : TZCODE : America/New_York # ... other irrelevant sections TIME_SEGMENTS : &time_segments TYPE : PERIODIC # (3) FILE : \"data/external/timesegments_periodic.csv\" # (4) INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE PHONE_DATA_STREAMS : USE : aware_csv # (5) aware_csv : FOLDER : data/external/aware_csv # (6) # ... other irrelevant sections ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS : CONTAINER : calls.csv # (7) PROVIDERS : RAPIDS : COMPUTE : True # (8) CALL_TYPES : ... We added p01 to PIDS after creating the participant file: data/external/participant_files/p01.yaml With the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty We use the default SINGLE time zone. We use the default PERIODIC time segment [TYPE] We created this time segments file with these lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,001:00:00,5H 59M 59S,every_day,0 We set [USE] to aware_device to tell RAPIDS to process sensor data collected with the AWARE Framework stored in CSV files. We used the default [FOLDER] for awre_csv since we already stored our test calls.csv file there We changed [CONTAINER] to calls.csv to process our test call data. We flipped [COMPUTE] to True to extract call behavioral features using the RAPIDS feature provider. Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in data/processed/features/all_participants/all_sensor_features.csv","title":"Minimal Example"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for 24 hr ( 00:00:00 to 23:59:59 ) and night ( 00:00:00 to 05:59:59 ) time segments of every day of data of one participant that was monitored on the US East coast with an Android smartphone. Install RAPIDS and make sure your conda environment is active (see Installation ) Download this CSV file and save it as data/external/aware_csv/calls.csv Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Required configuration changes ( click to expand ) Supported data streams . Based on the docs, we decided to use the aware_csv data stream because we are processing aware data saved in a CSV file. We will use this label in a later step; there\u2019s no need to type it or save it anywhere yet. Create your participants file . Since we are processing data from a single participant, you only need to create a single participant file called p01.yaml in data/external/participant_files . This participant file only has a PHONE section because this hypothetical participant was only monitored with a smartphone. Note that for a real analysis, you can do this automatically with a CSV file Add p01 to [PIDS] in config.yaml Create a file in data/external/participant_files/p01.yaml with the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty Select what time segments you want to extract features on. Set [TIME_SEGMENTS][FILE] to data/external/timesegments_periodic.csv Create a file in data/external/timesegments_periodic.csv with the following content label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 Choose the timezone of your study . We will use the default time zone settings since this example is processing data collected on the US East Coast ( America/New_York ) TIMEZONE : TYPE : SINGLE SINGLE : TZCODE : America/New_York Modify your device data stream configuration Set [PHONE_DATA_STREAMS][USE] to aware_csv . We will use the default value for [PHONE_DATA_STREAMS][aware_csv][FOLDER] since we already stored the test calls CSV file there. Select what sensors and features you want to process. Set [PHONE_CALLS][CONTAINER] to calls.csv in the config.yaml file. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True in the config.yaml file. Example of the config.yaml sections after the changes outlined above This will be your config.yaml after following the instructions above. Click on the numbered markers to know more. PIDS : [ p01 ] # (1) TIMEZONE : TYPE : SINGLE # (2) SINGLE : TZCODE : America/New_York # ... other irrelevant sections TIME_SEGMENTS : &time_segments TYPE : PERIODIC # (3) FILE : \"data/external/timesegments_periodic.csv\" # (4) INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE PHONE_DATA_STREAMS : USE : aware_csv # (5) aware_csv : FOLDER : data/external/aware_csv # (6) # ... other irrelevant sections ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS : CONTAINER : calls.csv # (7) PROVIDERS : RAPIDS : COMPUTE : True # (8) CALL_TYPES : ... We added p01 to PIDS after creating the participant file: data/external/participant_files/p01.yaml With the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty We use the default SINGLE time zone. We use the default PERIODIC time segment [TYPE] We created this time segments file with these lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,001:00:00,5H 59M 59S,every_day,0 We set [USE] to aware_device to tell RAPIDS to process sensor data collected with the AWARE Framework stored in CSV files. We used the default [FOLDER] for awre_csv since we already stored our test calls.csv file there We changed [CONTAINER] to calls.csv to process our test call data. We flipped [COMPUTE] to True to extract call behavioral features using the RAPIDS feature provider. Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in data/processed/features/all_participants/all_sensor_features.csv","title":"Minimal Working Example"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data, and structure your analysis into reproducible workflows. RAPIDS is open source, documented, multi-platform, modular, tested, and reproducible. At the moment, we support data streams logged by smartphones, Fitbit wearables, and Empatica wearables in collaboration with the DBDP . Where do I start? New to RAPIDS? Check our Overview + FAQ and minimal example Install , configure , and execute RAPIDS to extract and plot behavioral features Bugs should be reported on Github issues Questions, discussions, feature requests, and feedback can be posted on our Github discussions Keep up to date with our Twitter feed or Slack channel Do you want to modify or add new functionality to RAPIDS? Check our contributing guide Are you upgrading from RAPIDS 0.4.x or older? Follow this guide What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes, only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own data streams or behavioral features in R or Python, share them with the community, and keep authorship and citations. Time zone aware . Your data is adjusted to one or more time zones per participant. Flexible time segments . You can extract behavioral features on time windows of any length (e.g., 5 minutes, 3 hours, 2 days), on every day or particular days (e.g., weekends, Mondays, the 1 st of each month, etc.), or around events of interest (e.g., surveys or clinical relapses). Tested code . We are continually adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended, thanks to R and Python virtual environments. You can share your analysis code along with your publications without any overhead. Private . All your data is processed locally. Users and Contributors \u00b6 Community Contributors Many thanks to our community contributions and the whole team : Agam Kumar (CMU) Yasaman S. Sefidgar (University of Washington) Joe Kim (Duke University) Brinnae Bent (Duke University) Stephen Price (CMU) Neil Singh (University of Virginia) Many thanks to the researchers that made their work open source: Panda et al. paper Stachl et al. paper Doryab et al. paper Barnett et al. paper Canzian et al. paper Publications using RAPIDS Predicting Symptoms of Depression and Anxiety Using Smartphone and Wearable Data link Predicting Depression from Smartphone Behavioral Markers Using Machine Learning Methods, Hyper-parameter Optimization, and Feature Importance Analysis: An Exploratory Study link Digital Biomarkers of Symptom Burden Self-Reported by Perioperative Patients Undergoing Pancreatic Surgery: Prospective Longitudinal Study link An Automated Machine Learning Pipeline for Monitoring and Forecasting Mobile Health Data link","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data, and structure your analysis into reproducible workflows. RAPIDS is open source, documented, multi-platform, modular, tested, and reproducible. At the moment, we support data streams logged by smartphones, Fitbit wearables, and Empatica wearables in collaboration with the DBDP . Where do I start? New to RAPIDS? Check our Overview + FAQ and minimal example Install , configure , and execute RAPIDS to extract and plot behavioral features Bugs should be reported on Github issues Questions, discussions, feature requests, and feedback can be posted on our Github discussions Keep up to date with our Twitter feed or Slack channel Do you want to modify or add new functionality to RAPIDS? Check our contributing guide Are you upgrading from RAPIDS 0.4.x or older? Follow this guide","title":"Welcome to RAPIDS documentation"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes, only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own data streams or behavioral features in R or Python, share them with the community, and keep authorship and citations. Time zone aware . Your data is adjusted to one or more time zones per participant. Flexible time segments . You can extract behavioral features on time windows of any length (e.g., 5 minutes, 3 hours, 2 days), on every day or particular days (e.g., weekends, Mondays, the 1 st of each month, etc.), or around events of interest (e.g., surveys or clinical relapses). Tested code . We are continually adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended, thanks to R and Python virtual environments. You can share your analysis code along with your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#users-and-contributors","text":"Community Contributors Many thanks to our community contributions and the whole team : Agam Kumar (CMU) Yasaman S. Sefidgar (University of Washington) Joe Kim (Duke University) Brinnae Bent (Duke University) Stephen Price (CMU) Neil Singh (University of Virginia) Many thanks to the researchers that made their work open source: Panda et al. paper Stachl et al. paper Doryab et al. paper Barnett et al. paper Canzian et al. paper Publications using RAPIDS Predicting Symptoms of Depression and Anxiety Using Smartphone and Wearable Data link Predicting Depression from Smartphone Behavioral Markers Using Machine Learning Methods, Hyper-parameter Optimization, and Feature Importance Analysis: An Exploratory Study link Digital Biomarkers of Symptom Burden Self-Reported by Perioperative Patients Undergoing Pancreatic Surgery: Prospective Longitudinal Study link An Automated Machine Learning Pipeline for Monitoring and Forecasting Mobile Health Data link","title":"Users and Contributors"},{"location":"change-log/","text":"Change Log \u00b6 v1.3.0 \u00b6 Refactor PHONE_LOCATIONS DORYAB provider. Fix bugs and faster execution up to 30x New PHONE_KEYBOARD features Add a new strategy to infer home location that can handle multiple homes for the same participant Add module to exclude sleep episodes from steps intraday features Fix PID matching when joining data from multiple participants. Now, we can handle PIDS with an arbitrary format. Fix bug that did not correctly parse participants with more than 2 phones or more than 1 wearable Fix crash when no phone data yield is needed to process location data (ALL & GPS location providers) Remove location rows with the same timestamp based on their accuracy Fix PHONE_CONVERSATION bug that produced inaccurate ratio features when time segments were not daily. Other minor bug fixes v1.2.0 \u00b6 Sleep summary and intraday features are more consistent. Add wake and bedtime features for sleep summary data. Fix bugs with sleep PRICE features. Update home page Add contributing guide v1.1.1 \u00b6 Fix length of periodic segments on days with DLS Fix crash when scraping data for an app that does not exist Add tests for phone screen data v1.1.0 \u00b6 Add Fitbit calories intraday features v1.0.1 \u00b6 Fix crash in chunk_episodes of utils.py for multi time zone data Fix crash in BT Doryab provider when the number of clusters is 2 Fix Fitbit multi time zone inference from phone data (simplify) Fix missing columns when the input for phone data yield is empty Fix wrong date time labels for event segments for multi time zone data (all labels are computed based on a single tz) Fix periodic segment crash when there are no segments to assign (only affects wday, mday, qday, or yday) Fix crash in Analysis Workflow with new suffix in segments\u2019 labels v1.0.0 \u00b6 Add a new Overview page. You can extend RAPIDS with your own data streams . Data streams are data collected with other sensing apps besides AWARE (like Beiwe, mindLAMP), and stored in other data containers (databases, files) besides MySQL. Support to analyze Empatica wearable data (thanks to Joe Kim and Brinnae Bent from the DBDP ) Support to analyze AWARE data stored in CSV files and InfluxDB databases Support to analyze data collected over multiple time zones Support for sleep intraday features from the core team and also from the community (thanks to Stephen Price) Users can comment on the documentation (powered by utterances). SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT . Add RAPIDS new logo Move Citation and Minimal Example page to the Setup section Add config.yaml validation schema and documentation. Now it\u2019s more difficult to modify the config.yaml file with invalid values. Add new time at home Doryab location feature Add and home coordinates to the location data file so location providers can build features based on it. If you are migrating from RAPIDS 0.4.3 or older, check this guide v0.4.3 \u00b6 Fix bug when any of the rows from any sensor do not belong a time segment v0.4.2 \u00b6 Update battery testing Fix location processing bug when certain columns don\u2019t exist Fix HR intraday bug when minutesonZONE features were 0 Update FAQs Fix HR summary bug when restinghr=0 (ignore those rows) Fix ROG, location entropy and normalized entropy in Doryab location provider Remove sampling frequency dependance in Doryab location provider Update documentation of Doryab location provider Add new FITBIT_DATA_YIELD RAPIDS provider Deprecate Doryab circadian movement feature until it is fixed v0.4.1 \u00b6 Fix bug when no error message was displayed for an empty [PHONE_DATA_YIELD][SENSORS] when resampling location data v0.4.0 \u00b6 Add four new phone sensors that can be used for PHONE_DATA_YIELD Add code so new feature providers can be added for the new four sensors Add new clustering algorithm (OPTICS) for Doryab features Update default EPS parameter for Doryab location clustering Add clearer error message for invalid phone data yield sensors Add ALL_RESAMPLED flag and accuracy limit for location features Add FAQ about null characters in phone tables Reactivate light and wifi tests and update testing docs Fix bug when parsing Fitbit steps data Fix bugs when merging features from empty time segments Fix minor issues in the documentation v0.3.2 \u00b6 Update docker and linux instructions to use RSPM binary repo for for faster installation Update CI to create a release on a tagged push that passes the tests Clarify in DB credential configuration that we only support MySQL Add Windows installation instructions Fix bugs in the create_participants_file script Fix bugs in Fitbit data parsing. Fixed Doryab location features context of clustering. Fixed the wrong shifting while calculating distance in Doryab location features. Refactored the haversine function v0.3.1 \u00b6 Update installation docs for RAPIDS\u2019 docker container Fix example analysis use of accelerometer data in a plot Update FAQ Update minimal example documentation Minor doc updates v0.3.0 \u00b6 Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README v0.2.6 \u00b6 Fix old versions banner on nested pages v0.2.5 \u00b6 Fix docs deploy typo v0.2.4 \u00b6 Fix broken links in landing page and docs deploy v0.2.3 \u00b6 Fix participant IDS in the example analysis workflow v0.2.2 \u00b6 Fix readme link to docs v0.2.1 \u00b6 FIx link to the most recent version in the old version banner v0.2.0 \u00b6 Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item v0.1.0 \u00b6 New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"Change Log"},{"location":"change-log/#change-log","text":"","title":"Change Log"},{"location":"change-log/#v130","text":"Refactor PHONE_LOCATIONS DORYAB provider. Fix bugs and faster execution up to 30x New PHONE_KEYBOARD features Add a new strategy to infer home location that can handle multiple homes for the same participant Add module to exclude sleep episodes from steps intraday features Fix PID matching when joining data from multiple participants. Now, we can handle PIDS with an arbitrary format. Fix bug that did not correctly parse participants with more than 2 phones or more than 1 wearable Fix crash when no phone data yield is needed to process location data (ALL & GPS location providers) Remove location rows with the same timestamp based on their accuracy Fix PHONE_CONVERSATION bug that produced inaccurate ratio features when time segments were not daily. Other minor bug fixes","title":"v1.3.0"},{"location":"change-log/#v120","text":"Sleep summary and intraday features are more consistent. Add wake and bedtime features for sleep summary data. Fix bugs with sleep PRICE features. Update home page Add contributing guide","title":"v1.2.0"},{"location":"change-log/#v111","text":"Fix length of periodic segments on days with DLS Fix crash when scraping data for an app that does not exist Add tests for phone screen data","title":"v1.1.1"},{"location":"change-log/#v110","text":"Add Fitbit calories intraday features","title":"v1.1.0"},{"location":"change-log/#v101","text":"Fix crash in chunk_episodes of utils.py for multi time zone data Fix crash in BT Doryab provider when the number of clusters is 2 Fix Fitbit multi time zone inference from phone data (simplify) Fix missing columns when the input for phone data yield is empty Fix wrong date time labels for event segments for multi time zone data (all labels are computed based on a single tz) Fix periodic segment crash when there are no segments to assign (only affects wday, mday, qday, or yday) Fix crash in Analysis Workflow with new suffix in segments\u2019 labels","title":"v1.0.1"},{"location":"change-log/#v100","text":"Add a new Overview page. You can extend RAPIDS with your own data streams . Data streams are data collected with other sensing apps besides AWARE (like Beiwe, mindLAMP), and stored in other data containers (databases, files) besides MySQL. Support to analyze Empatica wearable data (thanks to Joe Kim and Brinnae Bent from the DBDP ) Support to analyze AWARE data stored in CSV files and InfluxDB databases Support to analyze data collected over multiple time zones Support for sleep intraday features from the core team and also from the community (thanks to Stephen Price) Users can comment on the documentation (powered by utterances). SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT . Add RAPIDS new logo Move Citation and Minimal Example page to the Setup section Add config.yaml validation schema and documentation. Now it\u2019s more difficult to modify the config.yaml file with invalid values. Add new time at home Doryab location feature Add and home coordinates to the location data file so location providers can build features based on it. If you are migrating from RAPIDS 0.4.3 or older, check this guide","title":"v1.0.0"},{"location":"change-log/#v043","text":"Fix bug when any of the rows from any sensor do not belong a time segment","title":"v0.4.3"},{"location":"change-log/#v042","text":"Update battery testing Fix location processing bug when certain columns don\u2019t exist Fix HR intraday bug when minutesonZONE features were 0 Update FAQs Fix HR summary bug when restinghr=0 (ignore those rows) Fix ROG, location entropy and normalized entropy in Doryab location provider Remove sampling frequency dependance in Doryab location provider Update documentation of Doryab location provider Add new FITBIT_DATA_YIELD RAPIDS provider Deprecate Doryab circadian movement feature until it is fixed","title":"v0.4.2"},{"location":"change-log/#v041","text":"Fix bug when no error message was displayed for an empty [PHONE_DATA_YIELD][SENSORS] when resampling location data","title":"v0.4.1"},{"location":"change-log/#v040","text":"Add four new phone sensors that can be used for PHONE_DATA_YIELD Add code so new feature providers can be added for the new four sensors Add new clustering algorithm (OPTICS) for Doryab features Update default EPS parameter for Doryab location clustering Add clearer error message for invalid phone data yield sensors Add ALL_RESAMPLED flag and accuracy limit for location features Add FAQ about null characters in phone tables Reactivate light and wifi tests and update testing docs Fix bug when parsing Fitbit steps data Fix bugs when merging features from empty time segments Fix minor issues in the documentation","title":"v0.4.0"},{"location":"change-log/#v032","text":"Update docker and linux instructions to use RSPM binary repo for for faster installation Update CI to create a release on a tagged push that passes the tests Clarify in DB credential configuration that we only support MySQL Add Windows installation instructions Fix bugs in the create_participants_file script Fix bugs in Fitbit data parsing. Fixed Doryab location features context of clustering. Fixed the wrong shifting while calculating distance in Doryab location features. Refactored the haversine function","title":"v0.3.2"},{"location":"change-log/#v031","text":"Update installation docs for RAPIDS\u2019 docker container Fix example analysis use of accelerometer data in a plot Update FAQ Update minimal example documentation Minor doc updates","title":"v0.3.1"},{"location":"change-log/#v030","text":"Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README","title":"v0.3.0"},{"location":"change-log/#v026","text":"Fix old versions banner on nested pages","title":"v0.2.6"},{"location":"change-log/#v025","text":"Fix docs deploy typo","title":"v0.2.5"},{"location":"change-log/#v024","text":"Fix broken links in landing page and docs deploy","title":"v0.2.4"},{"location":"change-log/#v023","text":"Fix participant IDS in the example analysis workflow","title":"v0.2.3"},{"location":"change-log/#v022","text":"Fix readme link to docs","title":"v0.2.2"},{"location":"change-log/#v021","text":"FIx link to the most recent version in the old version banner","title":"v0.2.1"},{"location":"change-log/#v020","text":"Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item","title":"v0.2.0"},{"location":"change-log/#v010","text":"New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"v0.1.0"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 DBDP (all Empatica sensors) \u00b6 If you computed features using the provider [DBDP] of any of the Empatica sensors (accelerometer, heart rate, temperature, EDA, BVP, IBI, tags) cite this paper in addition to RAPIDS. Bent et al. citation Bent, B., Wang, K., Grzesiak, E., Jiang, C., Qi, Y., Jiang, Y., Cho, P., Zingler, K., Ogbeide, F.I., Zhao, A., Runge, R., Sim, I., Dunn, J. (2020). The Digital Biomarker Discovery Pipeline: An open source software platform for the development of digital biomarkers using mHealth and wearables data. Journal of Clinical and Translational Science, 1-28. doi:10.1017/cts.2020.511 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Doryab (bluetooth) \u00b6 If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. In addition, if you used the SUN_LI_VEGA_STRATEGY strategy, cite this paper as well. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Sun et al. citation Sun S, Folarin AA, Ranjan Y, Rashid Z, Conde P, Stewart C, Cummins N, Matcham F, Dalla Costa G, Simblett S, Leocani L, Lamers F, S\u00f8rensen PS, Buron M, Zabalza A, Guerrero P\u00e9rez AI, Penninx BW, Siddi S, Haro JM, Myin-Germeys I, Rintala A, Wykes T, Narayan VA, Comi G, Hotopf M, Dobson RJ, RADAR-CNS Consortium. Using Smartphones and Wearable Devices to Monitor Behavioral Changes During COVID-19. J Med Internet Res 2020;22(9):e19992","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#dbdp-all-empatica-sensors","text":"If you computed features using the provider [DBDP] of any of the Empatica sensors (accelerometer, heart rate, temperature, EDA, BVP, IBI, tags) cite this paper in addition to RAPIDS. Bent et al. citation Bent, B., Wang, K., Grzesiak, E., Jiang, C., Qi, Y., Jiang, Y., Cho, P., Zingler, K., Ogbeide, F.I., Zhao, A., Runge, R., Sim, I., Dunn, J. (2020). The Digital Biomarker Discovery Pipeline: An open source software platform for the development of digital biomarkers using mHealth and wearables data. Journal of Clinical and Translational Science, 1-28. doi:10.1017/cts.2020.511","title":"DBDP (all Empatica sensors)"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#doryab-bluetooth","text":"If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394","title":"Doryab (bluetooth)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. In addition, if you used the SUN_LI_VEGA_STRATEGY strategy, cite this paper as well. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Sun et al. citation Sun S, Folarin AA, Ranjan Y, Rashid Z, Conde P, Stewart C, Cummins N, Matcham F, Dalla Costa G, Simblett S, Leocani L, Lamers F, S\u00f8rensen PS, Buron M, Zabalza A, Guerrero P\u00e9rez AI, Penninx BW, Siddi S, Haro JM, Myin-Germeys I, Rintala A, Wykes T, Narayan VA, Comi G, Hotopf M, Dobson RJ, RADAR-CNS Consortium. Using Smartphones and Wearable Devices to Monitor Behavioral Changes During COVID-19. J Med Internet Res 2020;22(9):e19992","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"common-errors/","text":"Common Errors \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R pull_phone_data or ./rapids -j1 -R pull_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [CONTAINER] of each sensor you activated in config.yaml match your database tables or files. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda Embedded nul in string \u00b6 Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: Remove the the null character from the conflictive table cell(s). You can adapt the following query on a MySQL server 8.0 or older update YOUR_TABLE set YOUR_COLUMN = regexp_replace ( YOUR_COLUMN , '\\0' , '' ); If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Linux: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/streams/pull_phone_data.R or src/data/streams/pull_fitbit_data.R and replace library(RMariaDB) with library(RMySQL) In the same file(s) replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group) There is no package called RMariaDB \u00b6 Problem You get the following error when executing RAPIDS: Error in library ( RMariaDB ) : there is no package called 'RMariaDB' Execution halted Solution In RAPIDS v0.1.0 we replaced RMySQL R package with RMariaDB , this error means your R virtual environment is out of date, to update it run snakemake -j1 renv_restore Unrecognized output timezone \u201cAmerica/New_York\u201d \u00b6 Problem When running RAPIDS with R 4.0.3 on MacOS on M1, lubridate may throw an error associated with the timezone. Error in C_force_tz ( time, tz = tzone, roll ) : CCTZ: Unrecognized output timezone: \"America/New_York\" Calls: get_timestamp_filter ... .parse_date_time -> .strptime -> force_tz -> C_force_tz Solution This is because R timezone library is not set. Please add Sys.setenv(\u201cTZDIR\u201d = file.path(R.home(), \u201cshare\u201d, \u201czoneinfo\u201d)) to the file active.R in renv folder to set the timezone library. For further details on how to test if TZDIR is properly set, please refer to https://github.com/tidyverse/lubridate/issues/928#issuecomment-720059233 . Unimplemented MAX_NO_FIELD_TYPES \u00b6 Problem You get the following error when downloading Fitbit data: Error: Unimplemented MAX_NO_FIELD_TYPES Execution halted Solution At the moment RMariaDB cannot handle MySQL columns of JSON type. Change the type of your Fitbit data column to longtext (note that the content will not change and will still be a JSON object just interpreted as a string). Running RAPIDS on Apple Silicon M1 Mac \u00b6 Problem You get the following error when installing pandoc or running rapids: MoSHI/rapids/renv/staging/1/00LOCK-KernSmooth/00new/KernSmooth/libs/KernSmooth.so: mach-0, but wrong architecture Solution As of Feb 2020 in M1 macs, R needs to be installed via brew under Rosetta (x86 arch) due to some incompatibility with selected R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. x86 homebrew should be installed in /usr/local/bin/brew , you can check which brew you are using by typing which brew . Then use x86 homebrew to install R and restore RAPIDS packages ( renv_restore ).","title":"Common Errors"},{"location":"common-errors/#common-errors","text":"","title":"Common Errors"},{"location":"common-errors/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"common-errors/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"common-errors/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R pull_phone_data or ./rapids -j1 -R pull_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"common-errors/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [CONTAINER] of each sensor you activated in config.yaml match your database tables or files.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"common-errors/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"common-errors/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"common-errors/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"common-errors/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"common-errors/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"common-errors/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"common-errors/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"common-errors/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"common-errors/#embedded-nul-in-string","text":"Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: Remove the the null character from the conflictive table cell(s). You can adapt the following query on a MySQL server 8.0 or older update YOUR_TABLE set YOUR_COLUMN = regexp_replace ( YOUR_COLUMN , '\\0' , '' ); If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Linux: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/streams/pull_phone_data.R or src/data/streams/pull_fitbit_data.R and replace library(RMariaDB) with library(RMySQL) In the same file(s) replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"Embedded nul in string"},{"location":"common-errors/#there-is-no-package-called-rmariadb","text":"Problem You get the following error when executing RAPIDS: Error in library ( RMariaDB ) : there is no package called 'RMariaDB' Execution halted Solution In RAPIDS v0.1.0 we replaced RMySQL R package with RMariaDB , this error means your R virtual environment is out of date, to update it run snakemake -j1 renv_restore","title":"There is no package called RMariaDB"},{"location":"common-errors/#unrecognized-output-timezone-americanew_york","text":"Problem When running RAPIDS with R 4.0.3 on MacOS on M1, lubridate may throw an error associated with the timezone. Error in C_force_tz ( time, tz = tzone, roll ) : CCTZ: Unrecognized output timezone: \"America/New_York\" Calls: get_timestamp_filter ... .parse_date_time -> .strptime -> force_tz -> C_force_tz Solution This is because R timezone library is not set. Please add Sys.setenv(\u201cTZDIR\u201d = file.path(R.home(), \u201cshare\u201d, \u201czoneinfo\u201d)) to the file active.R in renv folder to set the timezone library. For further details on how to test if TZDIR is properly set, please refer to https://github.com/tidyverse/lubridate/issues/928#issuecomment-720059233 .","title":"Unrecognized output timezone \"America/New_York\""},{"location":"common-errors/#unimplemented-max_no_field_types","text":"Problem You get the following error when downloading Fitbit data: Error: Unimplemented MAX_NO_FIELD_TYPES Execution halted Solution At the moment RMariaDB cannot handle MySQL columns of JSON type. Change the type of your Fitbit data column to longtext (note that the content will not change and will still be a JSON object just interpreted as a string).","title":"Unimplemented MAX_NO_FIELD_TYPES"},{"location":"common-errors/#running-rapids-on-apple-silicon-m1-mac","text":"Problem You get the following error when installing pandoc or running rapids: MoSHI/rapids/renv/staging/1/00LOCK-KernSmooth/00new/KernSmooth/libs/KernSmooth.so: mach-0, but wrong architecture Solution As of Feb 2020 in M1 macs, R needs to be installed via brew under Rosetta (x86 arch) due to some incompatibility with selected R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. x86 homebrew should be installed in /usr/local/bin/brew , you can check which brew you are using by typing which brew . Then use x86 homebrew to install R and restore RAPIDS packages ( renv_restore ).","title":"Running RAPIDS on Apple Silicon M1 Mac"},{"location":"contributing/","text":"Contributing \u00b6 Thank you for taking the time to contribute! All changes, small or big, are welcome, and regardless of who you are, we are always happy to work together to make your contribution as strong as possible. We follow the Covenant Code of Conduct , so we ask you to uphold it. Be kind to everyone in the community, and please report unacceptable behavior to moshiresearch@gmail.com . Questions, Feature Requests, and Discussions \u00b6 Post any questions, feature requests, or discussions in our GitHub Discussions tab . Bug Reports \u00b6 Report any bugs in our GithHub issue tracker keeping in mind to: Debug and simplify the problem to create a minimal example. For example, reduce the problem to a single participant, sensor, and a few rows of data. Provide a clear and succinct description of the problem (expected behavior vs. actual behavior). Attach your config.yaml , time segments file, and time zones file if appropriate. Attach test data if possible and any screenshots or extra resources that will help us debug the problem. Share the commit you are running: git rev-parse --short HEAD Share your OS version (e.g., Windows 10) Share the device/sensor you are processing (e.g., phone accelerometer) Documentation Contributions \u00b6 If you want to fix a typo or any other minor changes, you can edit the file online by clicking on the pencil icon at the top right of any page and opening a pull request using Github\u2019s website If your changes are more complex, clone RAPIDS\u2019 repository, setup the dev environment for our documentation with this tutorial , and submit any changes on a new feature branch following our git flow . Code Contributions \u00b6 Hints for any code changes To submit any new code, use a new feature branch following our git flow . If you neeed a new Python or R package in RAPIDS\u2019 virtual environments, follow this tutorial If you need to change the config.yaml you will need to update its validation schema with this tutorial New Data Streams \u00b6 New data containers. If you want to process data from a device RAPIDS supports ( see this table ) but it\u2019s stored in a database engine or file type we don\u2019t support yet, implement a new data stream container and format . You can copy and paste the format.yaml of one of the other streams of the device you are targeting. New sensing apps. If you want to add support for new smartphone sensing apps like Beiwe, implement a new data stream container and format . New wearable devices. If you want to add support for a new wearable, open a Github discussion , so we can add the necessary initial configuration files and code. New Behavioral Features \u00b6 If you want to add new behavioral features for mobile sensors RAPIDS already supports, follow this tutorial . A sensor is supported if it has a configuration section in config.yaml . If you want to add new behavioral features for mobile sensors RAPIDS does not support yet, open a Github discussion , so we can add the necessary initial configuration files and code. New Tests \u00b6 If you want to add new tests for existent behavioral features, follow this tutorial . New Visualizations \u00b6 Open a Github discussion , so we can add the necessary initial configuration files and code.","title":"Contributing"},{"location":"contributing/#contributing","text":"Thank you for taking the time to contribute! All changes, small or big, are welcome, and regardless of who you are, we are always happy to work together to make your contribution as strong as possible. We follow the Covenant Code of Conduct , so we ask you to uphold it. Be kind to everyone in the community, and please report unacceptable behavior to moshiresearch@gmail.com .","title":"Contributing"},{"location":"contributing/#questions-feature-requests-and-discussions","text":"Post any questions, feature requests, or discussions in our GitHub Discussions tab .","title":"Questions, Feature Requests, and Discussions"},{"location":"contributing/#bug-reports","text":"Report any bugs in our GithHub issue tracker keeping in mind to: Debug and simplify the problem to create a minimal example. For example, reduce the problem to a single participant, sensor, and a few rows of data. Provide a clear and succinct description of the problem (expected behavior vs. actual behavior). Attach your config.yaml , time segments file, and time zones file if appropriate. Attach test data if possible and any screenshots or extra resources that will help us debug the problem. Share the commit you are running: git rev-parse --short HEAD Share your OS version (e.g., Windows 10) Share the device/sensor you are processing (e.g., phone accelerometer)","title":"Bug Reports"},{"location":"contributing/#documentation-contributions","text":"If you want to fix a typo or any other minor changes, you can edit the file online by clicking on the pencil icon at the top right of any page and opening a pull request using Github\u2019s website If your changes are more complex, clone RAPIDS\u2019 repository, setup the dev environment for our documentation with this tutorial , and submit any changes on a new feature branch following our git flow .","title":"Documentation Contributions"},{"location":"contributing/#code-contributions","text":"Hints for any code changes To submit any new code, use a new feature branch following our git flow . If you neeed a new Python or R package in RAPIDS\u2019 virtual environments, follow this tutorial If you need to change the config.yaml you will need to update its validation schema with this tutorial","title":"Code Contributions"},{"location":"contributing/#new-data-streams","text":"New data containers. If you want to process data from a device RAPIDS supports ( see this table ) but it\u2019s stored in a database engine or file type we don\u2019t support yet, implement a new data stream container and format . You can copy and paste the format.yaml of one of the other streams of the device you are targeting. New sensing apps. If you want to add support for new smartphone sensing apps like Beiwe, implement a new data stream container and format . New wearable devices. If you want to add support for a new wearable, open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Data Streams"},{"location":"contributing/#new-behavioral-features","text":"If you want to add new behavioral features for mobile sensors RAPIDS already supports, follow this tutorial . A sensor is supported if it has a configuration section in config.yaml . If you want to add new behavioral features for mobile sensors RAPIDS does not support yet, open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Behavioral Features"},{"location":"contributing/#new-tests","text":"If you want to add new tests for existent behavioral features, follow this tutorial .","title":"New Tests"},{"location":"contributing/#new-visualizations","text":"Open a Github discussion , so we can add the necessary initial configuration files and code.","title":"New Visualizations"},{"location":"migrating-from-old-versions/","text":"Migration guides \u00b6 Migrating from RAPIDS 0.4.x or older \u00b6 There are four actions that you need to take if you were using RAPIDS 0.4.3 or older ( before Feb 9 th , 2021 ): Check the new Overview page Check the new Overview page. Hopefully, it is a better overview of RAPIDS and provides answers to Frequently Asked Questions. Deploy RAPIDS in a new folder Clone RAPIDS 1.x in a new folder (do not pull the updates in your current folder) Activate your conda environment Install renv again snakemake -j1 renv_install (for Ubuntu take advantage of the platform specific R renv instructions ) Restore renv packages snakemake -j1 renv_restore (for Ubuntu take advantage of the platform specific R renv instructions ) Move your participant files pxx.yaml to the new folder Move your time segment files to the new folder Move your .env file to the new folder Migrate your .env file to the new credentials.yaml format The .env file is not used anymore, the same credential groups are stored in credentials.yaml , migrate your .env file by running: python tools/update_format_env.py Reconfigure your config.yaml Reconfigure your config.yaml file by hand (don\u2019t copy and paste the old one). Some keys and values changed but the defaults should be compatible with the things you know from RAPIDS 0.x (see below). The most relevant changes to RAPIDS that you need to know about are: We introduced the concept of data streams RAPIDS abstracts sensor data logged by different devices, platforms and stored in different data containers as data streams . The default data stream for PHONE is aware_mysql , and the default for FITBIT is fitbitjson_mysql . This is compatible with the old functionality (AWARE and JSON Fitbit data stored in MySQL). These values are set in [PHONE_DATA_STREAMS][USE] and [FITBIT_DATA_STREAMS][USE] . You can add new data stream formats (sensing apps) and containers (database engines, file types, etc.). If you were processing your Fitbit data either in JSON or plain text (parsed) format, and it was stored in MySQL or CSV files, the changes that you made to your raw data will be compatible. Just choose fitbitjson_mysql , fitbitparsed_mysql , fitbitjson_csv , fitbitparsed_csv accordingly and set it in [FITBIT_DATA_STREAMS][USE] . In the future, you will not have to change your raw data; you will be able to just change column mappings/values in the data stream\u2019s format.yaml file. We introduced multiple time zones You can now process data from participants that visited multiple time zones. The default is still a single time zone (America/New_York). See how to handle multiple time zones The keyword multiple is now infer When processing data from smartphones, RAPIDS allows you to infer the OS of a smartphone by using the keyword multiple in the [PLATFORM] key of participant files. Now RAPIDS uses infer instead of multiple Nonetheless, multiple still works for backward compatibility. A global DATABASE_GROUP does not exist anymore There is no global DATABASE_GROUP anymore. Each data stream that needs credentials to connect to a database has its own DATABASE_GROUP config key . The groups are defined in credentials.yaml instead of the .env . [DEVICE_SENSOR][TABLE] is now [DEVICE_SENSOR][CONTAINER] We renamed the keys [DEVICE_SENSOR][TABLE] to [DEVICE_SENSOR][CONTAINER] to reflect that, with the introduction of data streams, they can point to a database table, file, or any other data container. Creating participant files from the AWARE_DEVICE_TABLE is deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions to create participant files from CSV files : SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT The attributes SCR_SCRIPT and SRC_LANGUAGE of every sensor PROVIDER are replaced by SRC_SCRIPT . SRC_SCRIPT is a relative path from the RAPIDS root folder to that provider\u2019s feature script. We did this to simplify and clarify where the features scripts are stored. There are no actions to take unless you created your own feature provider; update it with your feature script path. Migrating from RAPIDS beta \u00b6 If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the RAPIDS 0.1.0 right away, just take into account the following: Deploy RAPIDS in a new folder Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Move your old .env file Move your participant files Migrate your participant files You can migrate your old participant files to the new YAML format: python tools/update_format_participant_files.py Follow the new Configuration guide Follow the new Configuration guide Learn more about the new way to run RAPIDS Get familiar with the new way of Executing RAPIDS","title":"Migrating from an old version"},{"location":"migrating-from-old-versions/#migration-guides","text":"","title":"Migration guides"},{"location":"migrating-from-old-versions/#migrating-from-rapids-04x-or-older","text":"There are four actions that you need to take if you were using RAPIDS 0.4.3 or older ( before Feb 9 th , 2021 ): Check the new Overview page Check the new Overview page. Hopefully, it is a better overview of RAPIDS and provides answers to Frequently Asked Questions. Deploy RAPIDS in a new folder Clone RAPIDS 1.x in a new folder (do not pull the updates in your current folder) Activate your conda environment Install renv again snakemake -j1 renv_install (for Ubuntu take advantage of the platform specific R renv instructions ) Restore renv packages snakemake -j1 renv_restore (for Ubuntu take advantage of the platform specific R renv instructions ) Move your participant files pxx.yaml to the new folder Move your time segment files to the new folder Move your .env file to the new folder Migrate your .env file to the new credentials.yaml format The .env file is not used anymore, the same credential groups are stored in credentials.yaml , migrate your .env file by running: python tools/update_format_env.py Reconfigure your config.yaml Reconfigure your config.yaml file by hand (don\u2019t copy and paste the old one). Some keys and values changed but the defaults should be compatible with the things you know from RAPIDS 0.x (see below). The most relevant changes to RAPIDS that you need to know about are: We introduced the concept of data streams RAPIDS abstracts sensor data logged by different devices, platforms and stored in different data containers as data streams . The default data stream for PHONE is aware_mysql , and the default for FITBIT is fitbitjson_mysql . This is compatible with the old functionality (AWARE and JSON Fitbit data stored in MySQL). These values are set in [PHONE_DATA_STREAMS][USE] and [FITBIT_DATA_STREAMS][USE] . You can add new data stream formats (sensing apps) and containers (database engines, file types, etc.). If you were processing your Fitbit data either in JSON or plain text (parsed) format, and it was stored in MySQL or CSV files, the changes that you made to your raw data will be compatible. Just choose fitbitjson_mysql , fitbitparsed_mysql , fitbitjson_csv , fitbitparsed_csv accordingly and set it in [FITBIT_DATA_STREAMS][USE] . In the future, you will not have to change your raw data; you will be able to just change column mappings/values in the data stream\u2019s format.yaml file. We introduced multiple time zones You can now process data from participants that visited multiple time zones. The default is still a single time zone (America/New_York). See how to handle multiple time zones The keyword multiple is now infer When processing data from smartphones, RAPIDS allows you to infer the OS of a smartphone by using the keyword multiple in the [PLATFORM] key of participant files. Now RAPIDS uses infer instead of multiple Nonetheless, multiple still works for backward compatibility. A global DATABASE_GROUP does not exist anymore There is no global DATABASE_GROUP anymore. Each data stream that needs credentials to connect to a database has its own DATABASE_GROUP config key . The groups are defined in credentials.yaml instead of the .env . [DEVICE_SENSOR][TABLE] is now [DEVICE_SENSOR][CONTAINER] We renamed the keys [DEVICE_SENSOR][TABLE] to [DEVICE_SENSOR][CONTAINER] to reflect that, with the introduction of data streams, they can point to a database table, file, or any other data container. Creating participant files from the AWARE_DEVICE_TABLE is deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions to create participant files from CSV files : SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; SCR_SCRIPT and SRC_LANGUAGE are replaced by SRC_SCRIPT The attributes SCR_SCRIPT and SRC_LANGUAGE of every sensor PROVIDER are replaced by SRC_SCRIPT . SRC_SCRIPT is a relative path from the RAPIDS root folder to that provider\u2019s feature script. We did this to simplify and clarify where the features scripts are stored. There are no actions to take unless you created your own feature provider; update it with your feature script path.","title":"Migrating from RAPIDS 0.4.x or older"},{"location":"migrating-from-old-versions/#migrating-from-rapids-beta","text":"If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the RAPIDS 0.1.0 right away, just take into account the following: Deploy RAPIDS in a new folder Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Move your old .env file Move your participant files Migrate your participant files You can migrate your old participant files to the new YAML format: python tools/update_format_participant_files.py Follow the new Configuration guide Follow the new Configuration guide Learn more about the new way to run RAPIDS Get familiar with the new way of Executing RAPIDS","title":"Migrating from RAPIDS beta"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Joe Kim \u00b6 About Personal Website Brinnae Bent \u00b6 About Personal Website Stephen Price \u00b6 About Carnegie Mellon University Neil Singh \u00b6 About University of Virginia Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#joe-kim","text":"About Personal Website","title":"Joe Kim"},{"location":"team/#brinnae-bent","text":"About Personal Website","title":"Brinnae Bent"},{"location":"team/#stephen-price","text":"About Carnegie Mellon University","title":"Stephen Price"},{"location":"team/#neil-singh","text":"About University of Virginia","title":"Neil Singh"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"datastreams/add-new-data-streams/","text":"Add New Data Streams \u00b6 A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . RAPIDS is agnostic to data streams\u2019 formats and container; see the Data Streams Introduction for a list of supported streams. A container is queried with an R or Python script that connects to the database, API or file where your stream\u2019s raw data is stored. A format is described using a format.yaml file that specifies how to map and mutate your stream\u2019s raw data to match the data and format RAPIDS needs. The most common cases when you would want to implement a new data stream are: You collected data with a mobile sensing app RAPIDS does not support yet. For example, Beiwe data stored in MySQL. You will need to define a new format file and a new container script. You collected data with a mobile sensing app RAPIDS supports, but this data is stored in a container that RAPIDS can\u2019t connect to yet. For example, AWARE data stored in PostgreSQL. In this case, you can reuse the format file of the aware_mysql stream, but you will need to implement a new container script. Hint Both the container.[R|py] and the format.yaml are stored in ./src/data/streams/[stream_name] where [stream_name] can be aware_mysql for example. Implement a Container \u00b6 The container script of a data stream can be implemented in R (strongly recommended) or python. This script must have two functions if you are implementing a stream for phone data or one function otherwise. The script can contain other auxiliary functions. First of all, add any parameters your script might need in config.yaml under (device)_DATA_STREAMS . These parameters will be available in the stream_parameters argument of the one or two functions you implement. For example, if you are adding support for Beiwe data stored in PostgreSQL and your container needs a set of credentials to connect to a database, your new data stream configuration would be: PHONE_DATA_STREAMS : USE : aware_python # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP beiwe_postgresql : DATABASE_GROUP : MY_GROUP # users define this group (user, password, host, etc.) in credentials.yaml Then implement one or both of the following functions: pull_data This function returns the data columns for a specific sensor and participant. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] sensor_container The value set by the user in any [DEVICE_SENSOR][CONTAINER] key of config.yaml . It can be a table, file path, or whatever data source you want to support that contains the data from a single sensor for all participants . For example, [PHONE_ACCELEROMETER][CONTAINER] device The device id that you need to get the data for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid columns A list of the columns that you need to get from sensor_container . You specify these columns in your stream\u2019s format.yaml Example This is the pull_data function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. pull_data <- function ( stream_parameters , device , sensor_container , columns ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP ) query <- paste0 ( \"SELECT \" , paste ( columns , collapse = \",\" ), \" FROM \" , sensor_container , \" WHERE device_id = '\" , device , \"'\" ) # Letting the user know what we are doing message ( paste0 ( \"Executing the following query to download data: \" , query )) sensor_data <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( sensor_data ) == 0 ) warning ( paste ( \"The device '\" , device , \"' did not have data in \" , sensor_container )) return ( sensor_data ) } infer_device_os Warning This function is only necessary for phone data streams. RAPIDS allows users to use the keyword infer (previously multiple ) to automatically infer the mobile Operative System a phone was running. If you have a way to infer the OS of a device id, implement this function. For example, for AWARE data we use the aware_device table. If you don\u2019t have a way to infer the OS, call stop(\"Error Message\") so other users know they can\u2019t use infer or the inference failed, and they have to assign the OS manually in the participant file. This function returns the operative system ( android or ios ) for a specific phone device id. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] device The device id that you need to infer the OS for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid Example This is the infer_device_os function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. infer_device_os <- function ( stream_parameters , device ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R group <- stream_parameters $ DATABASE_GROUP dbEngine <- dbConnect ( MariaDB (), default.file = \"./.env\" , group = group ) query <- paste0 ( \"SELECT device_id,brand FROM aware_device WHERE device_id = '\" , device , \"'\" ) message ( paste0 ( \"Executing the following query to infer phone OS: \" , query )) os <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( os ) > 0 ) return ( os %>% mutate ( os = ifelse ( brand == \"iPhone\" , \"ios\" , \"android\" )) %>% pull ( os )) else stop ( paste ( \"We cannot infer the OS of the following device id because it does not exist in the aware_device table:\" , device )) return ( os ) } Implement a Format \u00b6 A format file format.yaml describes the mapping between your stream\u2019s raw data and the data that RAPIDS needs. This file has a section per sensor (e.g. PHONE_ACCELEROMETER ), and each section has two attributes (keys): RAPIDS_COLUMN_MAPPINGS are mappings between the columns RAPIDS needs and the columns your raw data already has. The reserved keyword FLAG_TO_MUTATE flags columns that RAPIDS requires but that are not initially present in your container (database, CSV file). These columns have to be created by your mutation scripts. MUTATION . Sometimes your raw data needs to be transformed to match the format RAPIDS can handle (including creating columns marked as FLAG_TO_MUTATE ) COLUMN_MAPPINGS are mappings between the columns a mutation SCRIPT needs and the columns your raw data has. SCRIPTS are a collection of R or Python scripts that transform one or more raw data columns into the format RAPIDS needs. Hint [RAPIDS_COLUMN_MAPPINGS] and [MUTATE][COLUMN_MAPPINGS] have a key (left-hand side string) and a value (right-hand side string). The values are the names used to pulled columns from a container (e.g., columns in a database table). All values are renamed to their keys in lower case. The renamed columns are sent to every mutation script within the data argument, and the final output is the input RAPIDS process further. For example, let\u2019s assume we are implementing beiwe_mysql and defining the following format for PHONE_FAKESENSOR : PHONE_FAKESENSOR : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID MAGNITUDE_SQUARED : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : MAGNITUDE : beiwe_value SCRIPTS : - src/data/streams/mutations/phone/square_magnitude.py RAPIDS will: Download beiwe_timestamp , beiwe_deviceID , and beiwe_value from the container of beiwe_mysql (MySQL DB) Rename these columns to timestamp , device_id , and magnitude , respectively. Execute square_magnitude.py with a data frame as an argument containing the renamed columns. This script will square magnitude and rename it to magnitude_squared Verify the data frame returned by square_magnitude.py has the columns RAPIDS needs timestamp , device_id , and magnitude_squared . Use this data frame as the input to be processed in the pipeline. Note that although RAPIDS_COLUMN_MAPPINGS and [MUTATE][COLUMN_MAPPINGS] keys are in capital letters for readability (e.g. MAGNITUDE_SQUARED ), the names of the final columns you mutate in your scripts should be lower case. Let\u2019s explain in more depth this column mapping with examples. Name mapping \u00b6 The mapping for some sensors is straightforward. For example, accelerometer data most of the time has a timestamp, three axes (x,y,z), and a device id that produced it. AWARE and a different sensing app like Beiwe likely logged accelerometer data in the same way but with different column names. In this case, we only need to match Beiwe data columns to RAPIDS columns one-to-one: PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : beiwe_x DOUBLE_VALUES_1 : beiwe_y DOUBLE_VALUES_2 : beiwe_z MUTATE : COLUMN_MAPPINGS : SCRIPTS : # it's ok if this is empty Value mapping \u00b6 For some sensors, we need to map column names and values. For example, screen data has ON and OFF events; let\u2019s suppose Beiwe represents an ON event with the number 1, but RAPIDS identifies ON events with the number 2 . In this case, we need to mutate the raw data coming from Beiwe and replace all 1 s with 2 s. We do this by listing one or more R or Python scripts in MUTATION_SCRIPTS that will be executed in order. We usually store all mutation scripts under src/data/streams/mutations/[device]/[platform]/ and they can be reused across data streams. PHONE_SCREEN : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID EVENT : beiwe_event MUTATE : COLUMN_MAPPINGS : SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_screen_map.py Hint A MUTATION_SCRIPT can also be used to clean/preprocess your data before extracting behavioral features. A mutation script has to have a main function that receives two arguments, data and stream_parameters . The stream_parameters argument contains the config.yaml key/values of your data stream (this is the same argument that your container.[py|R] script receives, see Implement a Container ). python Example of a python mutation script import pandas as pd def main ( data , stream_parameters ): # mutate data return ( data ) R Example of a R mutation script source ( \"renv/activate.R\" ) # needed to use RAPIDS renv environment library ( dplyr ) main <- function ( data , stream_parameters ){ # mutate data return ( data ) } Complex mapping \u00b6 Sometimes, your raw data doesn\u2019t even have the same columns RAPIDS expects for a sensor. For example, let\u2019s pretend Beiwe stores PHONE_ACCELEROMETER axis data in a single column called acc_col instead of three. You have to create a MUTATION_SCRIPT to split acc_col into three columns x , y , and z . For this, you mark the three axes columns RAPIDS needs in [RAPIDS_COLUMN_MAPPINGS] with the word FLAG_TO_MUTATE , map acc_col in [MUTATION][COLUMN_MAPPINGS] , and list a Python script under [MUTATION][SCRIPTS] with the code to split acc_col . See an example below. RAPIDS expects that every column mapped as FLAG_TO_MUTATE will be generated by your mutation script, so it won\u2019t try to retrieve them from your container (database, CSV file, etc.). In our example, acc_col will be fetched from the stream\u2019s container and renamed to JOINED_AXES because beiwe_split_acc.py will split it into double_values_0 , double_values_1 , and double_values_2 . PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : FLAG_TO_MUTATE DOUBLE_VALUES_1 : FLAG_TO_MUTATE DOUBLE_VALUES_2 : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : JOINED_AXES : acc_col SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_split_acc.py This is a draft of beiwe_split_acc.py MUTATION_SCRIPT : import pandas as pd def main ( data , stream_parameters ): # data has the acc_col # split acc_col into three columns: double_values_0, double_values_1, double_values_2 to match RAPIDS format # remove acc_col since we don't need it anymore return ( data ) OS complex mapping \u00b6 There is a special case for a complex mapping scenario for smartphone data streams. The Android and iOS sensor APIs return data in different formats for certain sensors (like screen, activity recognition, battery, among others). In case you didn\u2019t notice, the examples we have used so far are grouped under an ANDROID key, which means they will be applied to data collected by Android phones. Additionally, each sensor has an IOS key for a similar purpose. We use the complex mapping described above to transform iOS data into an Android format (it\u2019s always iOS to Android and any new phone data stream must do the same). For example, this is the format.yaml key for PHONE_ACTVITY_RECOGNITION . Note that the ANDROID mapping is simple (one-to-one) but the IOS mapping is complex with three FLAG_TO_MUTATE columns, two [MUTATE][COLUMN_MAPPINGS] mappings, and one [MUTATION][SCRIPT] . PHONE_ACTIVITY_RECOGNITION : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : activity_type ACTIVITY_NAME : activity_name CONFIDENCE : confidence MUTATION : COLUMN_MAPPINGS : SCRIPTS : IOS : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : FLAG_TO_MUTATE ACTIVITY_NAME : FLAG_TO_MUTATE CONFIDENCE : FLAG_TO_MUTATE MUTATION : COLUMN_MAPPINGS : ACTIVITIES : activities CONFIDENCE : confidence SCRIPTS : - \"src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R\" Example activity_recogniton_ios_unification.R In this MUTATION_SCRIPT we create ACTIVITY_NAME and ACTIVITY_TYPE based on activities , and map confidence iOS values to Android values. source ( \"renv/activate.R\" ) library ( \"dplyr\" , warn.conflicts = F ) library ( stringr ) clean_ios_activity_column <- function ( ios_gar ){ ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = '(\"|\\\\[|\\\\])' , replacement = \"\" )) existent_multiple_activities <- ios_gar %>% filter ( str_detect ( activities , \",\" )) %>% group_by ( activities ) %>% summarise ( mutiple_activities = unique ( activities ), .groups = \"drop_last\" ) %>% pull ( mutiple_activities ) known_multiple_activities <- c ( \"stationary,automotive\" ) unkown_multiple_actvities <- setdiff ( existent_multiple_activities , known_multiple_activities ) if ( length ( unkown_multiple_actvities ) > 0 ){ stop ( paste0 ( \"There are unkwown combinations of ios activities, you need to implement the decision of the ones to keep: \" , unkown_multiple_actvities )) } ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = \"stationary,automotive\" , replacement = \"automotive\" )) return ( ios_gar ) } unify_ios_activity_recognition <- function ( ios_gar ){ # We only need to unify Google Activity Recognition data for iOS # discard rows where activities column is blank ios_gar <- ios_gar [ - which ( ios_gar $ activities == \"\" ), ] # clean \"activities\" column of ios_gar ios_gar <- clean_ios_activity_column ( ios_gar ) # make it compatible with android version: generate \"activity_name\" and \"activity_type\" columns ios_gar <- ios_gar %>% mutate ( activity_name = case_when ( activities == \"automotive\" ~ \"in_vehicle\" , activities == \"cycling\" ~ \"on_bicycle\" , activities == \"walking\" ~ \"walking\" , activities == \"running\" ~ \"running\" , activities == \"stationary\" ~ \"still\" ), activity_type = case_when ( activities == \"automotive\" ~ 0 , activities == \"cycling\" ~ 1 , activities == \"walking\" ~ 7 , activities == \"running\" ~ 8 , activities == \"stationary\" ~ 3 , activities == \"unknown\" ~ 4 ), confidence = case_when ( confidence == 0 ~ 0 , confidence == 1 ~ 50 , confidence == 2 ~ 100 ) ) %>% select ( - activities ) return ( ios_gar ) } main <- function ( data , stream_parameters ){ return ( unify_ios_activity_recognition ( data , stream_parameters )) }","title":"Add New Data Streams"},{"location":"datastreams/add-new-data-streams/#add-new-data-streams","text":"A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . RAPIDS is agnostic to data streams\u2019 formats and container; see the Data Streams Introduction for a list of supported streams. A container is queried with an R or Python script that connects to the database, API or file where your stream\u2019s raw data is stored. A format is described using a format.yaml file that specifies how to map and mutate your stream\u2019s raw data to match the data and format RAPIDS needs. The most common cases when you would want to implement a new data stream are: You collected data with a mobile sensing app RAPIDS does not support yet. For example, Beiwe data stored in MySQL. You will need to define a new format file and a new container script. You collected data with a mobile sensing app RAPIDS supports, but this data is stored in a container that RAPIDS can\u2019t connect to yet. For example, AWARE data stored in PostgreSQL. In this case, you can reuse the format file of the aware_mysql stream, but you will need to implement a new container script. Hint Both the container.[R|py] and the format.yaml are stored in ./src/data/streams/[stream_name] where [stream_name] can be aware_mysql for example.","title":"Add New Data Streams"},{"location":"datastreams/add-new-data-streams/#implement-a-container","text":"The container script of a data stream can be implemented in R (strongly recommended) or python. This script must have two functions if you are implementing a stream for phone data or one function otherwise. The script can contain other auxiliary functions. First of all, add any parameters your script might need in config.yaml under (device)_DATA_STREAMS . These parameters will be available in the stream_parameters argument of the one or two functions you implement. For example, if you are adding support for Beiwe data stored in PostgreSQL and your container needs a set of credentials to connect to a database, your new data stream configuration would be: PHONE_DATA_STREAMS : USE : aware_python # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP beiwe_postgresql : DATABASE_GROUP : MY_GROUP # users define this group (user, password, host, etc.) in credentials.yaml Then implement one or both of the following functions: pull_data This function returns the data columns for a specific sensor and participant. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] sensor_container The value set by the user in any [DEVICE_SENSOR][CONTAINER] key of config.yaml . It can be a table, file path, or whatever data source you want to support that contains the data from a single sensor for all participants . For example, [PHONE_ACCELEROMETER][CONTAINER] device The device id that you need to get the data for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid columns A list of the columns that you need to get from sensor_container . You specify these columns in your stream\u2019s format.yaml Example This is the pull_data function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. pull_data <- function ( stream_parameters , device , sensor_container , columns ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP ) query <- paste0 ( \"SELECT \" , paste ( columns , collapse = \",\" ), \" FROM \" , sensor_container , \" WHERE device_id = '\" , device , \"'\" ) # Letting the user know what we are doing message ( paste0 ( \"Executing the following query to download data: \" , query )) sensor_data <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( sensor_data ) == 0 ) warning ( paste ( \"The device '\" , device , \"' did not have data in \" , sensor_container )) return ( sensor_data ) } infer_device_os Warning This function is only necessary for phone data streams. RAPIDS allows users to use the keyword infer (previously multiple ) to automatically infer the mobile Operative System a phone was running. If you have a way to infer the OS of a device id, implement this function. For example, for AWARE data we use the aware_device table. If you don\u2019t have a way to infer the OS, call stop(\"Error Message\") so other users know they can\u2019t use infer or the inference failed, and they have to assign the OS manually in the participant file. This function returns the operative system ( android or ios ) for a specific phone device id. It has the following parameters: Param Description stream_parameters Any parameters (keys/values) set by the user in any [DEVICE_DATA_STREAMS][stream_name] key of config.yaml . For example, [DATABASE_GROUP] inside [FITBIT_DATA_STREAMS][fitbitjson_mysql] device The device id that you need to infer the OS for (this is set by the user in the participant files ). For example, in AWARE this device id is a uuid Example This is the infer_device_os function we implemented for aware_mysql . Note that we can message , warn or stop the user during execution. infer_device_os <- function ( stream_parameters , device ){ # get_db_engine is an auxiliary function not shown here for brevity bu can be found in src/data/streams/aware_mysql/container.R group <- stream_parameters $ DATABASE_GROUP dbEngine <- dbConnect ( MariaDB (), default.file = \"./.env\" , group = group ) query <- paste0 ( \"SELECT device_id,brand FROM aware_device WHERE device_id = '\" , device , \"'\" ) message ( paste0 ( \"Executing the following query to infer phone OS: \" , query )) os <- dbGetQuery ( dbEngine , query ) dbDisconnect ( dbEngine ) if ( nrow ( os ) > 0 ) return ( os %>% mutate ( os = ifelse ( brand == \"iPhone\" , \"ios\" , \"android\" )) %>% pull ( os )) else stop ( paste ( \"We cannot infer the OS of the following device id because it does not exist in the aware_device table:\" , device )) return ( os ) }","title":"Implement a Container"},{"location":"datastreams/add-new-data-streams/#implement-a-format","text":"A format file format.yaml describes the mapping between your stream\u2019s raw data and the data that RAPIDS needs. This file has a section per sensor (e.g. PHONE_ACCELEROMETER ), and each section has two attributes (keys): RAPIDS_COLUMN_MAPPINGS are mappings between the columns RAPIDS needs and the columns your raw data already has. The reserved keyword FLAG_TO_MUTATE flags columns that RAPIDS requires but that are not initially present in your container (database, CSV file). These columns have to be created by your mutation scripts. MUTATION . Sometimes your raw data needs to be transformed to match the format RAPIDS can handle (including creating columns marked as FLAG_TO_MUTATE ) COLUMN_MAPPINGS are mappings between the columns a mutation SCRIPT needs and the columns your raw data has. SCRIPTS are a collection of R or Python scripts that transform one or more raw data columns into the format RAPIDS needs. Hint [RAPIDS_COLUMN_MAPPINGS] and [MUTATE][COLUMN_MAPPINGS] have a key (left-hand side string) and a value (right-hand side string). The values are the names used to pulled columns from a container (e.g., columns in a database table). All values are renamed to their keys in lower case. The renamed columns are sent to every mutation script within the data argument, and the final output is the input RAPIDS process further. For example, let\u2019s assume we are implementing beiwe_mysql and defining the following format for PHONE_FAKESENSOR : PHONE_FAKESENSOR : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID MAGNITUDE_SQUARED : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : MAGNITUDE : beiwe_value SCRIPTS : - src/data/streams/mutations/phone/square_magnitude.py RAPIDS will: Download beiwe_timestamp , beiwe_deviceID , and beiwe_value from the container of beiwe_mysql (MySQL DB) Rename these columns to timestamp , device_id , and magnitude , respectively. Execute square_magnitude.py with a data frame as an argument containing the renamed columns. This script will square magnitude and rename it to magnitude_squared Verify the data frame returned by square_magnitude.py has the columns RAPIDS needs timestamp , device_id , and magnitude_squared . Use this data frame as the input to be processed in the pipeline. Note that although RAPIDS_COLUMN_MAPPINGS and [MUTATE][COLUMN_MAPPINGS] keys are in capital letters for readability (e.g. MAGNITUDE_SQUARED ), the names of the final columns you mutate in your scripts should be lower case. Let\u2019s explain in more depth this column mapping with examples.","title":"Implement a Format"},{"location":"datastreams/add-new-data-streams/#name-mapping","text":"The mapping for some sensors is straightforward. For example, accelerometer data most of the time has a timestamp, three axes (x,y,z), and a device id that produced it. AWARE and a different sensing app like Beiwe likely logged accelerometer data in the same way but with different column names. In this case, we only need to match Beiwe data columns to RAPIDS columns one-to-one: PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : beiwe_x DOUBLE_VALUES_1 : beiwe_y DOUBLE_VALUES_2 : beiwe_z MUTATE : COLUMN_MAPPINGS : SCRIPTS : # it's ok if this is empty","title":"Name mapping"},{"location":"datastreams/add-new-data-streams/#value-mapping","text":"For some sensors, we need to map column names and values. For example, screen data has ON and OFF events; let\u2019s suppose Beiwe represents an ON event with the number 1, but RAPIDS identifies ON events with the number 2 . In this case, we need to mutate the raw data coming from Beiwe and replace all 1 s with 2 s. We do this by listing one or more R or Python scripts in MUTATION_SCRIPTS that will be executed in order. We usually store all mutation scripts under src/data/streams/mutations/[device]/[platform]/ and they can be reused across data streams. PHONE_SCREEN : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID EVENT : beiwe_event MUTATE : COLUMN_MAPPINGS : SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_screen_map.py Hint A MUTATION_SCRIPT can also be used to clean/preprocess your data before extracting behavioral features. A mutation script has to have a main function that receives two arguments, data and stream_parameters . The stream_parameters argument contains the config.yaml key/values of your data stream (this is the same argument that your container.[py|R] script receives, see Implement a Container ). python Example of a python mutation script import pandas as pd def main ( data , stream_parameters ): # mutate data return ( data ) R Example of a R mutation script source ( \"renv/activate.R\" ) # needed to use RAPIDS renv environment library ( dplyr ) main <- function ( data , stream_parameters ){ # mutate data return ( data ) }","title":"Value mapping"},{"location":"datastreams/add-new-data-streams/#complex-mapping","text":"Sometimes, your raw data doesn\u2019t even have the same columns RAPIDS expects for a sensor. For example, let\u2019s pretend Beiwe stores PHONE_ACCELEROMETER axis data in a single column called acc_col instead of three. You have to create a MUTATION_SCRIPT to split acc_col into three columns x , y , and z . For this, you mark the three axes columns RAPIDS needs in [RAPIDS_COLUMN_MAPPINGS] with the word FLAG_TO_MUTATE , map acc_col in [MUTATION][COLUMN_MAPPINGS] , and list a Python script under [MUTATION][SCRIPTS] with the code to split acc_col . See an example below. RAPIDS expects that every column mapped as FLAG_TO_MUTATE will be generated by your mutation script, so it won\u2019t try to retrieve them from your container (database, CSV file, etc.). In our example, acc_col will be fetched from the stream\u2019s container and renamed to JOINED_AXES because beiwe_split_acc.py will split it into double_values_0 , double_values_1 , and double_values_2 . PHONE_ACCELEROMETER : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : beiwe_timestamp DEVICE_ID : beiwe_deviceID DOUBLE_VALUES_0 : FLAG_TO_MUTATE DOUBLE_VALUES_1 : FLAG_TO_MUTATE DOUBLE_VALUES_2 : FLAG_TO_MUTATE MUTATE : COLUMN_MAPPINGS : JOINED_AXES : acc_col SCRIPTS : - src/data/streams/mutations/phone/beiwe/beiwe_split_acc.py This is a draft of beiwe_split_acc.py MUTATION_SCRIPT : import pandas as pd def main ( data , stream_parameters ): # data has the acc_col # split acc_col into three columns: double_values_0, double_values_1, double_values_2 to match RAPIDS format # remove acc_col since we don't need it anymore return ( data )","title":"Complex mapping"},{"location":"datastreams/add-new-data-streams/#os-complex-mapping","text":"There is a special case for a complex mapping scenario for smartphone data streams. The Android and iOS sensor APIs return data in different formats for certain sensors (like screen, activity recognition, battery, among others). In case you didn\u2019t notice, the examples we have used so far are grouped under an ANDROID key, which means they will be applied to data collected by Android phones. Additionally, each sensor has an IOS key for a similar purpose. We use the complex mapping described above to transform iOS data into an Android format (it\u2019s always iOS to Android and any new phone data stream must do the same). For example, this is the format.yaml key for PHONE_ACTVITY_RECOGNITION . Note that the ANDROID mapping is simple (one-to-one) but the IOS mapping is complex with three FLAG_TO_MUTATE columns, two [MUTATE][COLUMN_MAPPINGS] mappings, and one [MUTATION][SCRIPT] . PHONE_ACTIVITY_RECOGNITION : ANDROID : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : activity_type ACTIVITY_NAME : activity_name CONFIDENCE : confidence MUTATION : COLUMN_MAPPINGS : SCRIPTS : IOS : RAPIDS_COLUMN_MAPPINGS : TIMESTAMP : timestamp DEVICE_ID : device_id ACTIVITY_TYPE : FLAG_TO_MUTATE ACTIVITY_NAME : FLAG_TO_MUTATE CONFIDENCE : FLAG_TO_MUTATE MUTATION : COLUMN_MAPPINGS : ACTIVITIES : activities CONFIDENCE : confidence SCRIPTS : - \"src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R\" Example activity_recogniton_ios_unification.R In this MUTATION_SCRIPT we create ACTIVITY_NAME and ACTIVITY_TYPE based on activities , and map confidence iOS values to Android values. source ( \"renv/activate.R\" ) library ( \"dplyr\" , warn.conflicts = F ) library ( stringr ) clean_ios_activity_column <- function ( ios_gar ){ ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = '(\"|\\\\[|\\\\])' , replacement = \"\" )) existent_multiple_activities <- ios_gar %>% filter ( str_detect ( activities , \",\" )) %>% group_by ( activities ) %>% summarise ( mutiple_activities = unique ( activities ), .groups = \"drop_last\" ) %>% pull ( mutiple_activities ) known_multiple_activities <- c ( \"stationary,automotive\" ) unkown_multiple_actvities <- setdiff ( existent_multiple_activities , known_multiple_activities ) if ( length ( unkown_multiple_actvities ) > 0 ){ stop ( paste0 ( \"There are unkwown combinations of ios activities, you need to implement the decision of the ones to keep: \" , unkown_multiple_actvities )) } ios_gar <- ios_gar %>% mutate ( activities = str_replace_all ( activities , pattern = \"stationary,automotive\" , replacement = \"automotive\" )) return ( ios_gar ) } unify_ios_activity_recognition <- function ( ios_gar ){ # We only need to unify Google Activity Recognition data for iOS # discard rows where activities column is blank ios_gar <- ios_gar [ - which ( ios_gar $ activities == \"\" ), ] # clean \"activities\" column of ios_gar ios_gar <- clean_ios_activity_column ( ios_gar ) # make it compatible with android version: generate \"activity_name\" and \"activity_type\" columns ios_gar <- ios_gar %>% mutate ( activity_name = case_when ( activities == \"automotive\" ~ \"in_vehicle\" , activities == \"cycling\" ~ \"on_bicycle\" , activities == \"walking\" ~ \"walking\" , activities == \"running\" ~ \"running\" , activities == \"stationary\" ~ \"still\" ), activity_type = case_when ( activities == \"automotive\" ~ 0 , activities == \"cycling\" ~ 1 , activities == \"walking\" ~ 7 , activities == \"running\" ~ 8 , activities == \"stationary\" ~ 3 , activities == \"unknown\" ~ 4 ), confidence = case_when ( confidence == 0 ~ 0 , confidence == 1 ~ 50 , confidence == 2 ~ 100 ) ) %>% select ( - activities ) return ( ios_gar ) } main <- function ( data , stream_parameters ){ return ( unify_ios_activity_recognition ( data , stream_parameters )) }","title":"OS complex mapping"},{"location":"datastreams/aware-csv/","text":"aware_csv \u00b6 This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in CSV files. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . See examples in the CSV files inside rapids_example_csv.zip Example of a valid CSV file \"_id\",\"timestamp\",\"device_id\",\"activities\",\"confidence\",\"stationary\",\"walking\",\"running\",\"automotive\",\"cycling\",\"unknown\",\"label\" 1,1587528000000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"\" 2,1587528060000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 3,1587528120000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 4,1587528180000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 5,1587528240000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 6,1587528300000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 7,1587528360000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" Container \u00b6 A CSV file per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_csv/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_csv"},{"location":"datastreams/aware-csv/#aware_csv","text":"This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in CSV files. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . See examples in the CSV files inside rapids_example_csv.zip Example of a valid CSV file \"_id\",\"timestamp\",\"device_id\",\"activities\",\"confidence\",\"stationary\",\"walking\",\"running\",\"automotive\",\"cycling\",\"unknown\",\"label\" 1,1587528000000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"\" 2,1587528060000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 3,1587528120000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 4,1587528180000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 5,1587528240000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 6,1587528300000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\" 7,1587528360000,\"13dbc8a3-dae3-4834-823a-4bc96a7d459d\",\"[\\\"stationary\\\"]\",2,1,0,0,0,0,0,\"supplement\"","title":"aware_csv"},{"location":"datastreams/aware-csv/#container","text":"A CSV file per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_csv/container.R","title":"Container"},{"location":"datastreams/aware-csv/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/aware-influxdb/","text":"aware_influxdb (beta) \u00b6 Warning This data stream is being released in beta while we test it thoroughly. This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in an InfluxDB database. Container \u00b6 An InfluxDB database with a table per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_influxdb/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_influxdb (beta)"},{"location":"datastreams/aware-influxdb/#aware_influxdb-beta","text":"Warning This data stream is being released in beta while we test it thoroughly. This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in an InfluxDB database.","title":"aware_influxdb (beta)"},{"location":"datastreams/aware-influxdb/#container","text":"An InfluxDB database with a table per sensor, each containing the data for all participants. The script to connect and download data from this container is at: src/data/streams/aware_influxdb/container.R","title":"Container"},{"location":"datastreams/aware-influxdb/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/aware-mysql/","text":"aware_mysql \u00b6 This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in a MySQL database. Container \u00b6 A MySQL database with a table per sensor, each containing the data for all participants. This is the default database created by the old PHP AWARE server (as opposed to the new JavaScript Micro server). The script to connect and download data from this container is at: src/data/streams/aware_mysql/container.R Format \u00b6 If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"aware_mysql"},{"location":"datastreams/aware-mysql/#aware_mysql","text":"This data stream handles iOS and Android sensor data collected with the AWARE Framework and stored in a MySQL database.","title":"aware_mysql"},{"location":"datastreams/aware-mysql/#container","text":"A MySQL database with a table per sensor, each containing the data for all participants. This is the default database created by the old PHP AWARE server (as opposed to the new JavaScript Micro server). The script to connect and download data from this container is at: src/data/streams/aware_mysql/container.R","title":"Container"},{"location":"datastreams/aware-mysql/#format","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Format"},{"location":"datastreams/data-streams-introduction/","text":"Data Streams Introduction \u00b6 A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Similarly, smartphone data collected with Beiwe will have a different format and could be stored in a container like a PostgreSQL database or a CSV file. If you want to process a data stream using RAPIDS, make sure that your data is stored in a supported format and container (see table below). If RAPIDS doesn\u2019t support your data stream yet (e.g. Beiwe data stored in PostgreSQL, or AWARE data stored in SQLite), you can always implement a new data stream . If it\u2019s something you think other people might be interested on, we will be happy to include your new data stream in RAPIDS, so get in touch!. Hint Currently, you can add new data streams for smartphones, Fitbit, and Empatica devices. If you need RAPIDS to process data from other devices , like Oura Rings or Actigraph wearables, get in touch. It is a more complicated process that could take a couple of days to implement for someone familiar with R or Python, but we would be happy to work on it together. For reference, these are the data streams we currently support: Data Stream Device Format Container Docs aware_mysql Phone AWARE app MySQL link aware_csv Phone AWARE app CSV files link aware_influxdb (beta) Phone AWARE app InfluxDB link fitbitjson_mysql Fitbit JSON (per Fitbit\u2019s API ) MySQL link fitbitjson_csv Fitbit JSON (per Fitbit\u2019s API ) CSV files link fitbitparsed_mysql Fitbit Parsed (parsed API data) MySQL link fitbitparsed_csv Fitbit Parsed (parsed API data) CSV files link empatica_zip Empatica E4 Connect ZIP files link","title":"Introduction"},{"location":"datastreams/data-streams-introduction/#data-streams-introduction","text":"A data stream is a set of sensor data collected using a specific type of device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Similarly, smartphone data collected with Beiwe will have a different format and could be stored in a container like a PostgreSQL database or a CSV file. If you want to process a data stream using RAPIDS, make sure that your data is stored in a supported format and container (see table below). If RAPIDS doesn\u2019t support your data stream yet (e.g. Beiwe data stored in PostgreSQL, or AWARE data stored in SQLite), you can always implement a new data stream . If it\u2019s something you think other people might be interested on, we will be happy to include your new data stream in RAPIDS, so get in touch!. Hint Currently, you can add new data streams for smartphones, Fitbit, and Empatica devices. If you need RAPIDS to process data from other devices , like Oura Rings or Actigraph wearables, get in touch. It is a more complicated process that could take a couple of days to implement for someone familiar with R or Python, but we would be happy to work on it together. For reference, these are the data streams we currently support: Data Stream Device Format Container Docs aware_mysql Phone AWARE app MySQL link aware_csv Phone AWARE app CSV files link aware_influxdb (beta) Phone AWARE app InfluxDB link fitbitjson_mysql Fitbit JSON (per Fitbit\u2019s API ) MySQL link fitbitjson_csv Fitbit JSON (per Fitbit\u2019s API ) CSV files link fitbitparsed_mysql Fitbit Parsed (parsed API data) MySQL link fitbitparsed_csv Fitbit Parsed (parsed API data) CSV files link empatica_zip Empatica E4 Connect ZIP files link","title":"Data Streams Introduction"},{"location":"datastreams/empatica-zip/","text":"empatica_zip \u00b6 This data stream handles Empatica sensor data downloaded as zip files using the E4 Connect . Container \u00b6 You need to create a subfolder for every participant named after their device id inside the folder specified by [EMPATICA_DATA_STREAMS][empatica_zipfiles][FOLDER] . You can add one or more Empatica zip files to any subfolder. The script to connect and download data from this container is at: src/data/streams/empatica_zip/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Empatica sensors . This file is at: src/data/streams/empatica_zip/format.yaml All columns are mutated from the raw data in the zip files so you don\u2019t need to modify any column mappings. EMPATICA_ACCELEROMETER RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_HEARTRATE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id HEARTRATE heartrate MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_TEMPERATURE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TEMPERATURE temperature MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ELECTRODERMAL_ACTIVITY electrodermal_activity MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_BLOOD_VOLUME_PULSE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BLOOD_VOLUME_PULSE blood_volume_pulse MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_INTER_BEAT_INTERVAL RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id INTER_BEAT_INTERVAL inter_beat_interval MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_EMPATICA_TAGS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TAGS tags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None)","title":"empatica_zip"},{"location":"datastreams/empatica-zip/#empatica_zip","text":"This data stream handles Empatica sensor data downloaded as zip files using the E4 Connect .","title":"empatica_zip"},{"location":"datastreams/empatica-zip/#container","text":"You need to create a subfolder for every participant named after their device id inside the folder specified by [EMPATICA_DATA_STREAMS][empatica_zipfiles][FOLDER] . You can add one or more Empatica zip files to any subfolder. The script to connect and download data from this container is at: src/data/streams/empatica_zip/container.R","title":"Container"},{"location":"datastreams/empatica-zip/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Empatica sensors . This file is at: src/data/streams/empatica_zip/format.yaml All columns are mutated from the raw data in the zip files so you don\u2019t need to modify any column mappings. EMPATICA_ACCELEROMETER RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_HEARTRATE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id HEARTRATE heartrate MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_TEMPERATURE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TEMPERATURE temperature MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ELECTRODERMAL_ACTIVITY electrodermal_activity MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_BLOOD_VOLUME_PULSE RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BLOOD_VOLUME_PULSE blood_volume_pulse MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_INTER_BEAT_INTERVAL RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id INTER_BEAT_INTERVAL inter_beat_interval MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) EMPATICA_EMPATICA_TAGS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id TAGS tags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None)","title":"Format"},{"location":"datastreams/fitbitjson-csv/","text":"fitbitjson_csv \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a CSV file, RAPIDS can process it. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"timestamp\",\"device_id\",\"label\",\"fitbit_id\",\"fitbit_data_type\",\"fitbit_data\" 1587614400000,\"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",\"5S\",\"5ZKN9B\",\"steps\",\"{\\\"activities-steps\\\":[{\\\"dateTime\\\":\\\"2020-04-23\\\",\\\"value\\\":\\\"7881\\\"}]\" Container \u00b6 The container should be a CSV file per Fitbit sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_csv/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"fitbitjson_csv"},{"location":"datastreams/fitbitjson-csv/#fitbitjson_csv","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a CSV file, RAPIDS can process it. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"timestamp\",\"device_id\",\"label\",\"fitbit_id\",\"fitbit_data_type\",\"fitbit_data\" 1587614400000,\"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",\"5S\",\"5ZKN9B\",\"steps\",\"{\\\"activities-steps\\\":[{\\\"dateTime\\\":\\\"2020-04-23\\\",\\\"value\\\":\\\"7881\\\"}]\"","title":"fitbitjson_csv"},{"location":"datastreams/fitbitjson-csv/#container","text":"The container should be a CSV file per Fitbit sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_csv/container.R","title":"Container"},{"location":"datastreams/fitbitjson-csv/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Format"},{"location":"datastreams/fitbitjson-mysql/","text":"fitbitjson_mysql \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a MySQL database, RAPIDS can process it. Container \u00b6 The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_mysql/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"fitbitjson_mysql"},{"location":"datastreams/fitbitjson-mysql/#fitbitjson_mysql","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your sensor data in a MySQL database, RAPIDS can process it.","title":"fitbitjson_mysql"},{"location":"datastreams/fitbitjson-mysql/#container","text":"The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitjson_mysql/container.R","title":"Container"},{"location":"datastreams/fitbitjson-mysql/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Format"},{"location":"datastreams/fitbitparsed-csv/","text":"fitbitparsed_csv \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a CSV file, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"device_id\",\"heartrate\",\"heartrate_zone\",\"local_date_time\",\"timestamp\" \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:00:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:01:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",67,\"outofrange\",\"2020-04-23 00:02:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:03:00\",0 Container \u00b6 The container should be a CSV file per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_csv/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"fitbitparsed_csv"},{"location":"datastreams/fitbitparsed-csv/#fitbitparsed_csv","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a CSV file. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a CSV file, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Warning The CSV files have to use , as separator, \\ as escape character (do not escape \" with \"\" ), and wrap any string columns with \" . Example of a valid CSV file \"device_id\",\"heartrate\",\"heartrate_zone\",\"local_date_time\",\"timestamp\" \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:00:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:01:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",67,\"outofrange\",\"2020-04-23 00:02:00\",0 \"a748ee1a-1d0b-4ae9-9074-279a2b6ba524\",69,\"outofrange\",\"2020-04-23 00:03:00\",0","title":"fitbitparsed_csv"},{"location":"datastreams/fitbitparsed-csv/#container","text":"The container should be a CSV file per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_csv/container.R","title":"Container"},{"location":"datastreams/fitbitparsed-csv/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Format"},{"location":"datastreams/fitbitparsed-mysql/","text":"fitbitparsed_mysql \u00b6 This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a MySQL database, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream. Container \u00b6 The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_mysql/container.R Format \u00b6 The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"fitbitparsed_mysql"},{"location":"datastreams/fitbitparsed-mysql/#fitbitparsed_mysql","text":"This data stream handles Fitbit sensor data downloaded using the Fitbit Web API , parsed , and stored in a MySQL database. Please note that RAPIDS cannot query the API directly; you need to use other available tools or implement your own. Once you have your parsed sensor data in a MySQL database, RAPIDS can process it. What is the difference between JSON and plain data streams Most people will only need fitbitjson_* because they downloaded and stored their data directly from Fitbit\u2019s API. However, if, for some reason, you don\u2019t have access to that JSON data and instead only have the parsed data (columns and rows), you can use this data stream.","title":"fitbitparsed_mysql"},{"location":"datastreams/fitbitparsed-mysql/#container","text":"The container should be a MySQL database with a table per sensor, each containing all participants\u2019 data. The script to connect and download data from this container is at: src/data/streams/fitbitparsed_mysql/container.R","title":"Container"},{"location":"datastreams/fitbitparsed-mysql/#format","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Format"},{"location":"datastreams/mandatory-empatica-format/","text":"Mandatory Empatica Format \u00b6 This is a description of the format RAPIDS needs to process data for the following Empatica sensors. EMPATICA_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration EMPATICA_HEARTRATE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate EMPATICA_TEMPERATURE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TEMPERATURE temperature EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device ELECTRODERMAL_ACTIVITY electrical conductance EMPATICA_BLOOD_VOLUME_PULSE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device BLOOD_VOLUME_PULSE blood volume pulse EMPATICA_INTER_BEAT_INTERVAL RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device INTER_BEAT_INTERVAL inter beat interval EMPATICA_TAGS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TAGS tags","title":"Mandatory Empatica Format"},{"location":"datastreams/mandatory-empatica-format/#mandatory-empatica-format","text":"This is a description of the format RAPIDS needs to process data for the following Empatica sensors. EMPATICA_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration EMPATICA_HEARTRATE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate EMPATICA_TEMPERATURE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TEMPERATURE temperature EMPATICA_ELECTRODERMAL_ACTIVITY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device ELECTRODERMAL_ACTIVITY electrical conductance EMPATICA_BLOOD_VOLUME_PULSE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device BLOOD_VOLUME_PULSE blood volume pulse EMPATICA_INTER_BEAT_INTERVAL RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device INTER_BEAT_INTERVAL inter beat interval EMPATICA_TAGS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) DEVICE_ID A string that uniquely identifies a device TAGS tags","title":"Mandatory Empatica Format"},{"location":"datastreams/mandatory-fitbit-format/","text":"Mandatory Fitbit Format \u00b6 This is a description of the format RAPIDS needs to process data for the following Fitbit sensors. FITBIT_HEARTRATE_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE_DAILY_RESTINGHR Daily resting heartrate HEARTRATE_DAILY_CALORIESOUTOFRANGE Calories spent while heartrate was oustide a heartrate zone HEARTRATE_DAILY_CALORIESFATBURN Calories spent while heartrate was inside the fat burn zone HEARTRATE_DAILY_CALORIESCARDIO Calories spent while heartrate was inside the cardio zone HEARTRATE_DAILY_CALORIESPEAK Calories spent while heartrate was inside the peak zone FITBIT_HEARTRATE_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate HEARTRATE_ZONE Heartrate zone that HEARTRATE belongs to. It is based on the heartrate zone ranges of each device FITBIT_SLEEP_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd 00:00:00 , the date is the same as the start date of a daily sleep episode if its time is after SLEEP_SUMMARY_LAST_NIGHT_END, otherwise it is the day before the start date of that sleep episode LOCAL_START_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the start of a daily sleep episode LOCAL_END_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the end of a daily sleep episode DEVICE_ID A string that uniquely identifies a device EFFICIENCY Sleep efficiency computed by fitbit as time asleep / (total time in bed - time to fall asleep) MINUTES_AFTER_WAKEUP Minutes the participant spent in bed after waking up MINUTES_ASLEEP Minutes the participant was asleep MINUTES_AWAKE Minutes the participant was awake MINUTES_TO_FALL_ASLEEP Minutes the participant spent in bed before falling asleep MINUTES_IN_BED Minutes the participant spent in bed across the sleep episode IS_MAIN_SLEEP 0 if this episode is a nap, or 1 if it is a main sleep episode TYPE stages or classic sleep data FITBIT_SLEEP_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss , this either is a copy of LOCAL_START_DATE_TIME or LOCAL_END_DATE_TIME depending on which column is used to assign an episode to a specific day DEVICE_ID A string that uniquely identifies a device TYPE_EPISODE_ID An id for each unique main or nap episode. Main and nap episodes have different levels, each row in this table is one of such levels, so multiple rows can have the same TYPE_EPISODE_ID DURATION Duration of the episode level in minutes IS_MAIN_SLEEP 0 if this episode level belongs to a nap, or 1 if it belongs to a main sleep episode TYPE type of level: stages or classic sleep data LEVEL For stages levels one of wake , deep , light , or rem . For classic levels one of awake , restless , and asleep FITBIT_STEPS_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Daily step count FITBIT_STEPS_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Intraday step count (usually every minute)","title":"Mandatory Fitbit Format"},{"location":"datastreams/mandatory-fitbit-format/#mandatory-fitbit-format","text":"This is a description of the format RAPIDS needs to process data for the following Fitbit sensors. FITBIT_HEARTRATE_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE_DAILY_RESTINGHR Daily resting heartrate HEARTRATE_DAILY_CALORIESOUTOFRANGE Calories spent while heartrate was oustide a heartrate zone HEARTRATE_DAILY_CALORIESFATBURN Calories spent while heartrate was inside the fat burn zone HEARTRATE_DAILY_CALORIESCARDIO Calories spent while heartrate was inside the cardio zone HEARTRATE_DAILY_CALORIESPEAK Calories spent while heartrate was inside the peak zone FITBIT_HEARTRATE_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device HEARTRATE Intraday heartrate HEARTRATE_ZONE Heartrate zone that HEARTRATE belongs to. It is based on the heartrate zone ranges of each device FITBIT_SLEEP_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd 00:00:00 , the date is the same as the start date of a daily sleep episode if its time is after SLEEP_SUMMARY_LAST_NIGHT_END, otherwise it is the day before the start date of that sleep episode LOCAL_START_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the start of a daily sleep episode LOCAL_END_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss representing the end of a daily sleep episode DEVICE_ID A string that uniquely identifies a device EFFICIENCY Sleep efficiency computed by fitbit as time asleep / (total time in bed - time to fall asleep) MINUTES_AFTER_WAKEUP Minutes the participant spent in bed after waking up MINUTES_ASLEEP Minutes the participant was asleep MINUTES_AWAKE Minutes the participant was awake MINUTES_TO_FALL_ASLEEP Minutes the participant spent in bed before falling asleep MINUTES_IN_BED Minutes the participant spent in bed across the sleep episode IS_MAIN_SLEEP 0 if this episode is a nap, or 1 if it is a main sleep episode TYPE stages or classic sleep data FITBIT_SLEEP_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss , this either is a copy of LOCAL_START_DATE_TIME or LOCAL_END_DATE_TIME depending on which column is used to assign an episode to a specific day DEVICE_ID A string that uniquely identifies a device TYPE_EPISODE_ID An id for each unique main or nap episode. Main and nap episodes have different levels, each row in this table is one of such levels, so multiple rows can have the same TYPE_EPISODE_ID DURATION Duration of the episode level in minutes IS_MAIN_SLEEP 0 if this episode level belongs to a nap, or 1 if it belongs to a main sleep episode TYPE type of level: stages or classic sleep data LEVEL For stages levels one of wake , deep , light , or rem . For classic levels one of awake , restless , and asleep FITBIT_STEPS_SUMMARY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Daily step count FITBIT_STEPS_INTRADAY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged (automatically created by RAPIDS) LOCAL_DATE_TIME Date time string with format yyyy-mm-dd hh:mm:ss DEVICE_ID A string that uniquely identifies a device STEPS Intraday step count (usually every minute)","title":"Mandatory Fitbit Format"},{"location":"datastreams/mandatory-phone-format/","text":"Mandatory Phone Format \u00b6 This is a description of the format RAPIDS needs to process data for the following PHONE sensors. See examples in the CSV files inside rapids_example_csv.zip PHONE_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration PHONE_ACTIVITY_RECOGNITION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device ACTIVITY_NAME An string that denotes current activity name: in_vehicle , on_bicycle , on_foot , still , unknown , tilting , walking or running ACTIVITY_TYPE An integer (ranged from 0 to 8) that denotes current activity type CONFIDENCE An integer (ranged from 0 to 100) that denotes the prediction accuracy PHONE_APPLICATIONS_CRASHES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name APPLICATION_VERSION Application\u2019s version code ERROR_SHORT Short description of the error ERROR_LONG More verbose version of the error description ERROR_CONDITION 1 = code error; 2 = non-responsive (ANR error) IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_FOREGROUND RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_NOTIFICATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name TEXT Notification\u2019s header text, not the content SOUND Notification\u2019s sound source (if applicable) VIBRATE Notification\u2019s vibration pattern (if applicable) DEFAULTS If notification was delivered according to device\u2019s default settings FLAGS An integer that denotes Android notification flag PHONE_BATTERY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BATTERY_STATUS An integer that denotes battery status: 0 or 1 = unknown, 2 = charging, 3 = discharging, 4 = not charging, 5 = full BATTERY_LEVEL An integer that denotes battery level, between 0 and BATTERY_SCALE BATTERY_SCALE An integer that denotes the maximum battery level PHONE_BLUETOOTH RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BT_ADDRESS MAC address of the device\u2019s Bluetooth sensor BT_NAME User assigned name of the device\u2019s Bluetooth sensor BT_RSSI The RSSI dB to the scanned device PHONE_CALLS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device CALL_TYPE An integer that denotes call type: 1 = incoming, 2 = outgoing, 3 = missed CALL_DURATION Length of the call session TRACE SHA-1 one-way source/target of the call PHONE_CONVERSATION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_ENERGY A number that denotes the amplitude of an audio sample (L2-norm of the audio frame) INFERENCE An integer (ranged from 0 to 3) that denotes the type of an audio sample: 0 = silence, 1 = noise, 2 = voice, 3 = unknown DOUBLE_CONVO_START UNIX timestamp (13 digits) of the beginning of a conversation DOUBLE_CONVO_END UNIX timestamp (13 digits) of the end of a conversation PHONE_KEYBOARD RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME The application\u2019s package name of keyboard interaction BEFORE_TEXT The previous keyboard input (empty if password) CURRENT_TEXT The current keyboard input (empty if password) IS_PASSWORD An integer: 0 = not password; 1 = password PHONE_LIGHT RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LIGHT_LUX The ambient luminance in lux units ACCURACY An integer that denotes the sensor\u2019s accuracy level: 3 = maximum accuracy, 2 = medium accuracy, 1 = low accuracy PHONE_LOCATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LATITUDE The location\u2019s latitude, in degrees DOUBLE_LONGITUDE The location\u2019s longitude, in degrees DOUBLE_BEARING The location\u2019s bearing, in degrees DOUBLE_SPEED The speed if available, in meters/second over ground DOUBLE_ALTITUDE The altitude if available, in meters above sea level PROVIDER A string that denotes the provider: gps , fused or network ACCURACY The estimated location accuracy PHONE_LOG RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device LOG_MESSAGE A string that denotes log message PHONE_MESSAGES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MESSAGE_TYPE An integer that denotes message type: 1 = received, 2 = sent TRACE SHA-1 one-way source/target of the message PHONE_SCREEN RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SCREEN_STATUS An integer that denotes screen status: 0 = off, 1 = on, 2 = locked, 3 = unlocked PHONE_WIFI_CONNECTED RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MAC_ADDRESS Device\u2019s MAC address SSID Currently connected access point network name BSSID Currently connected access point MAC address PHONE_WIFI_VISIBLE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SSID Detected access point network name BSSID Detected access point MAC address SECURITY Active security protocols FREQUENCY Wi-Fi band frequency (e.g., 2427, 5180), in Hz RSSI RSSI dB to the scanned device","title":"Mandatory Phone Format"},{"location":"datastreams/mandatory-phone-format/#mandatory-phone-format","text":"This is a description of the format RAPIDS needs to process data for the following PHONE sensors. See examples in the CSV files inside rapids_example_csv.zip PHONE_ACCELEROMETER RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_VALUES_0 x axis of acceleration DOUBLE_VALUES_1 y axis of acceleration DOUBLE_VALUES_2 z axis of acceleration PHONE_ACTIVITY_RECOGNITION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device ACTIVITY_NAME An string that denotes current activity name: in_vehicle , on_bicycle , on_foot , still , unknown , tilting , walking or running ACTIVITY_TYPE An integer (ranged from 0 to 8) that denotes current activity type CONFIDENCE An integer (ranged from 0 to 100) that denotes the prediction accuracy PHONE_APPLICATIONS_CRASHES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name APPLICATION_VERSION Application\u2019s version code ERROR_SHORT Short description of the error ERROR_LONG More verbose version of the error description ERROR_CONDITION 1 = code error; 2 = non-responsive (ANR error) IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_FOREGROUND RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name IS_SYSTEM_APP Device\u2019s pre-installed application PHONE_APPLICATIONS_NOTIFICATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME Application\u2019s package name APPLICATION_NAME Application\u2019s localized name TEXT Notification\u2019s header text, not the content SOUND Notification\u2019s sound source (if applicable) VIBRATE Notification\u2019s vibration pattern (if applicable) DEFAULTS If notification was delivered according to device\u2019s default settings FLAGS An integer that denotes Android notification flag PHONE_BATTERY RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BATTERY_STATUS An integer that denotes battery status: 0 or 1 = unknown, 2 = charging, 3 = discharging, 4 = not charging, 5 = full BATTERY_LEVEL An integer that denotes battery level, between 0 and BATTERY_SCALE BATTERY_SCALE An integer that denotes the maximum battery level PHONE_BLUETOOTH RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device BT_ADDRESS MAC address of the device\u2019s Bluetooth sensor BT_NAME User assigned name of the device\u2019s Bluetooth sensor BT_RSSI The RSSI dB to the scanned device PHONE_CALLS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device CALL_TYPE An integer that denotes call type: 1 = incoming, 2 = outgoing, 3 = missed CALL_DURATION Length of the call session TRACE SHA-1 one-way source/target of the call PHONE_CONVERSATION RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_ENERGY A number that denotes the amplitude of an audio sample (L2-norm of the audio frame) INFERENCE An integer (ranged from 0 to 3) that denotes the type of an audio sample: 0 = silence, 1 = noise, 2 = voice, 3 = unknown DOUBLE_CONVO_START UNIX timestamp (13 digits) of the beginning of a conversation DOUBLE_CONVO_END UNIX timestamp (13 digits) of the end of a conversation PHONE_KEYBOARD RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device PACKAGE_NAME The application\u2019s package name of keyboard interaction BEFORE_TEXT The previous keyboard input (empty if password) CURRENT_TEXT The current keyboard input (empty if password) IS_PASSWORD An integer: 0 = not password; 1 = password PHONE_LIGHT RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LIGHT_LUX The ambient luminance in lux units ACCURACY An integer that denotes the sensor\u2019s accuracy level: 3 = maximum accuracy, 2 = medium accuracy, 1 = low accuracy PHONE_LOCATIONS RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device DOUBLE_LATITUDE The location\u2019s latitude, in degrees DOUBLE_LONGITUDE The location\u2019s longitude, in degrees DOUBLE_BEARING The location\u2019s bearing, in degrees DOUBLE_SPEED The speed if available, in meters/second over ground DOUBLE_ALTITUDE The altitude if available, in meters above sea level PROVIDER A string that denotes the provider: gps , fused or network ACCURACY The estimated location accuracy PHONE_LOG RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device LOG_MESSAGE A string that denotes log message PHONE_MESSAGES RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MESSAGE_TYPE An integer that denotes message type: 1 = received, 2 = sent TRACE SHA-1 one-way source/target of the message PHONE_SCREEN RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SCREEN_STATUS An integer that denotes screen status: 0 = off, 1 = on, 2 = locked, 3 = unlocked PHONE_WIFI_CONNECTED RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device MAC_ADDRESS Device\u2019s MAC address SSID Currently connected access point network name BSSID Currently connected access point MAC address PHONE_WIFI_VISIBLE RAPIDS column Description TIMESTAMP An UNIX timestamp (13 digits) when a row of data was logged DEVICE_ID A string that uniquely identifies a device SSID Detected access point network name BSSID Detected access point MAC address SECURITY Active security protocols FREQUENCY Wi-Fi band frequency (e.g., 2427, 5180), in Hz RSSI RSSI dB to the scanned device","title":"Mandatory Phone Format"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/git-flow/","text":"Git Flow \u00b6 We use the develop/master variation of the OneFlow git flow Add New Features \u00b6 We use feature (topic) branches to implement new features Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. Starting your feature branch Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Fetch the latest changes to develop git fetch origin develop Rebase your feature branch git checkout feature/feature1 git rebase -i develop Integrate your new feature to develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Starting your feature branch Fork and clone our repository on Github Switch to the latest develop git checkout develop Create your feature branch git checkout -b feature/external-test Add, modify or delete the necessary files to add your new feature Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented, it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Add our repo as another remote git remote add upstream https://github.com/carissalow/rapids/ Fetch the latest changes to develop git fetch upstream develop Rebase your feature branch git checkout feature/external-test git rebase -i develop Push your feature branch online git push --set-upstream origin feature/external-test Open a pull request to the develop branch using Github\u2019s GUI Release a New Version \u00b6 Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log) Release a Hotfix \u00b6 Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Git Flow"},{"location":"developers/git-flow/#git-flow","text":"We use the develop/master variation of the OneFlow git flow","title":"Git Flow"},{"location":"developers/git-flow/#add-new-features","text":"We use feature (topic) branches to implement new features Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. Starting your feature branch Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Fetch the latest changes to develop git fetch origin develop Rebase your feature branch git checkout feature/feature1 git rebase -i develop Integrate your new feature to develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Starting your feature branch Fork and clone our repository on Github Switch to the latest develop git checkout develop Create your feature branch git checkout -b feature/external-test Add, modify or delete the necessary files to add your new feature Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Merging back your feature branch If your changes took time to be implemented, it is possible that there are new commits in our develop branch, so we need to rebase your feature branch. Add our repo as another remote git remote add upstream https://github.com/carissalow/rapids/ Fetch the latest changes to develop git fetch upstream develop Rebase your feature branch git checkout feature/external-test git rebase -i develop Push your feature branch online git push --set-upstream origin feature/external-test Open a pull request to the develop branch using Github\u2019s GUI","title":"Add New Features"},{"location":"developers/git-flow/#release-a-new-version","text":"Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)","title":"Release a New Version"},{"location":"developers/git-flow/#release-a-hotfix","text":"Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Release a Hotfix"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open your RAPIDS root folder in a new VSCode window Open a new terminal in Visual Studio Code Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open your RAPIDS root folder in a new VSCode window Open a new terminal in Visual Studio Code Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Sensor Provider Periodic Frequency Event Phone Accelerometer Panda N N N Phone Accelerometer RAPIDS N N N Phone Activity Recognition RAPIDS Y Y Y Phone Applications Foreground RAPIDS N N N Phone Battery RAPIDS Y Y N Phone Bluetooth Doryab Y Y Y Phone Bluetooth RAPIDS Y Y Y Phone Calls RAPIDS Y Y Y Phone Conversation RAPIDS Y Y Y Phone Data Yield RAPIDS N N N Phone Light RAPIDS Y Y N Phone Locations Doryab N N N Phone Locations Barnett N N N Phone Messages RAPIDS Y Y N Phone Screen RAPIDS Y Y Y Phone WiFi Connected RAPIDS Y Y Y Phone WiFi Visible RAPIDS Y Y Y Fitbit Calories Intraday RAPIDS Y Y Y Fitbit Data Yield RAPIDS N N N Fitbit Heart Rate Summary RAPIDS N N N Fitbit Heart Rate Intraday RAPIDS N N N Fitbit Sleep Summary RAPIDS N N N Fitbit Sleep Intraday RAPIDS Y Y Y Fitbit Sleep Intraday PRICE Y Y Y Fitbit Steps Summary RAPIDS N N N Fitbit Steps Intraday RAPIDS N N N Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw data for iOS and Android the following is the expected results the phone_calls.csv . Description One missed episode, one outgoing episode and one incoming episode on Friday night, morning, afternoon and evening There is at least one episode of each type of phone calls on each day One incoming episode crossing two 30-mins segments One outgoing episode crossing two 30-mins segments One missed episode before, during and after the event There is one incoming episode before, during or after the event There is one outcoming episode before, during or after the event There is one missed episode before, during or after the event Data format Device Missed Outgoing Incoming iOS 3 2 1 Android 1,4 or 3,4 3,2,4 1,2,4 Note When generating test data, all traces for iOS device need to be unique otherwise the episode with duplicate trace will be dropped Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the phone_screen.csv . Description The screen data file contains data for 4 days. The screen data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night One episode that crossing two 30-min segments Data format Device unlock Android 3, 0 iOS 3, 2 Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 Description The 4-day raw data is contained in phone_bluetooth_raw.csv One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same 30-min segment ( Fri 23:38:45.789 and Fri 23:59:59.465 ) Two episodes locate in the same daily segment ( Fri 00:00:00.798 and Fri 00:49:04.132 ) One episode before the time switch ( Sun 00:24:00.000 ) and one episode after the time switch ( Sun 17:32:00.000 ) Checklist time segment single tz multi tz platform 30min OK OK Android morning OK OK Android daily OK OK Android threeday OK OK Android weekend OK OK Android beforeMarchEvent OK OK Android beforeNovemberEvent OK OK Android WIFI \u00b6 There are two wifi features ( phone wifi connected and phone wifi visible ). The raw test data are seperatly stored in the phone_wifi_connected_raw.csv and phone_wifi_visible_raw.csv . Description One episode for each epoch ( night , morining , afternoon and evening ) Two two episodes in the same time segment ( daily and 30-min ) Two episodes around the transition of epochs (e.g. one at the end of night and one at the beginning of morning ) One episode before and after the time switch on Sunday phone wifi connected Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS phone wifi visible Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Locations \u00b6 Description The participant\u2019s home location is (latitude=1, longitude=1). From Sat 10:56:00 to Sat 11:04:00, the center of the cluster is (latitude=-100, longitude=-100). From Sun 03:30:00 to Sun 03:47:00, the center of the cluster is (latitude=1, longitude=1). Home location is extracted from this period. From Sun 11:30:00 to Sun 11:38:00, the center of the cluster is (latitude=100, longitude=100). Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 Description The 4-day raw conversation data is contained in plugin_google_activity_recognition_raw.csv and plugin_ios_activity_recognition_raw.csv . Two episodes locate in the same 30-min segment ( Fri 04:01:54 and Fri 04:13:52 ) One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same daily segment ( Fri 05:03:09 and Fri 05:50:36 ) Two episodes with the time difference less than 5 mins threshold ( Fri 07:14:21 and Fri 07:18:50 ) One episode before the time switch ( Sun 00:46:00 ) and one episode after the time switch ( Sun 03:42:00 ) Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS Conversation \u00b6 The 4-day raw conversation data is contained in phone_conversation_raw.csv . The different inference records are randomly distributed throughout the epoch . Description One episode for each daily segment ( night , morning , afternoon and evening ) on each day Two episodes near the transition of the daily segment, one starts at the end of the afternoon, Fri 17:10:00 and another one starts at the beginning of the evening, Fri 18:01:00 One episode across two segments, daily and 30-mins , (from Fri 05:55:00 to Fri 06:00:41 ) Two episodes locate in the same daily segment ( Sat 12:45:36 and Sat 16:48:22 ) One episode before the time switch, Sun 00:15:06 , and one episode after the time switch, Sun 06:01:00 Data format inference type 0 silence 1 noise 2 voice 3 unknown Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android Keyboard \u00b6 The raw keyboard data file contains data for 4 days. The raw keyboard data contains records with difference in timestamp ranging from milliseconds to seconds. With difference in timestamps between consecutive records more than 5 seconds helps us to create separate sessions within the usage of the same app. This helps to verify the case where sessions have to be different. The raw keyboard data contains records where the difference in text is less than 5 seconds which makes it into 1 session but because of difference of app new session starts. This edge case determines the behaviour within particular app and also within 5 seconds. The raw keyboard data also contains the records where length of current_text varies between consecutive rows. This helps us to tests on the cases where input text is entered by auto-suggested or auto-correct operations. One three-minute episode with a 1-minute row on Sun 08:59:54.65 and 09:00:00,another on Sun 12:01:02 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Keyboard from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. Application Episodes \u00b6 The feature requires raw application foreground data file and raw phone screen data file The raw data files contains data for 4 day. The raw conversation data contains records with difference in timestamp ranging from milliseconds to minutes. An app episode starts when an app is launched and ends when another app is launched, marking the episode end of the first one, or when the screen locks. Thus, we are taking into account the screen unlock episodes. There are multiple apps usage within each screen unlock episode to verify creation of different app episodes in each screen unlock session. In the screen unlock episode starting from Fri 05:56:51, Fri 10:00:24, Sat 17:48:01, Sun 22:02:00, and Mon 21:05:00 we have multiple apps, both system and non-system apps, to check this. The 22 minute chunk starting from Fri 10:03:56 checks app episodes for system apps only. The screen unlock episode starting from Mon 21:05:00 and Sat 17:48:01 checks if the screen lock marks the end of episode for that particular app which was launched a few milliseconds to 8 mins before the screen lock. Finally, since application foreground is only for Android devices, this feature is also for Android devices only. All other files are empty data files Fitbit Calories Intraday \u00b6 Description A five-minute sedentary episode on Fri 11:00:00 A one-minute sedentary episode on Sun 02:00:00. It exists in November but not in February in STZ A five-minute sedentary episode on Fri 11:58:00. It is split within two 30-min segments and the morning A three-minute lightly active episode on Fri 11:10:00, a one-minute at 11:18:00 and a one-minute 11:24:00. These check for start and end times of first/last/longest episode A three-minute fairly active episode on Fri 11:40:00, a one-minute at 11:48:00 and a one-minute 11:54:00. These check for start and end times of first/last/longest episode A three-minute very active episode on Fri 12:10:00, a one-minute at 12:18:00 and a one-minute 12:24:00. These check for start and end times of first/last/longest episode A eight-minute MVPA episode with intertwined fairly and very active rows on Fri 12:30:00 The above episodes contain six higmet (>= 3 MET) episodes and nine lowmet episodes. One two-minute sedentary episode with a 1-minute row on Sun 09:00:00 and another on Sun 12:01:01 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Fitbit from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. A three-minute sedentary episode on Sat 08:59 that will be ignored for multi-timezone event segments. A three-minute sedentary episode on Sat 12:59 of which the first minute will be ignored for multi-timezone event segments since the test segment starts at 13:00 A three-minute sedentary episode on Sat 16:00 A four-minute sedentary episode on Sun 10:01 that will be ignored for Novembers\u2019s multi-timezone event segments since the test segment ends at 10am on that weekend. A three-minute very active episode on Sat 16:03. This episode and the one at 16:00 are counted as one for lowmet episodes Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit Fitbit Sleep Summary \u00b6 Description A main sleep episode that starts on Fri 20:00:00 and ends on Sat 02:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Fri) data. A nap that starts on Sat 04:00:00 and ends on Sat 06:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Fri) data. A nap that starts on Sat 13:00:00 and ends on Sat 15:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sat) data. A main sleep that starts on Sun 01:00:00 and ends on Sun 12:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Sat) data. A main sleep that starts on Sun 23:00:00 and ends on Mon 07:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sun) data. Any segment shorter than one day will be ignored for sleep RAPIDS features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit Fitbit Sleep Intraday \u00b6 Description A five-minute main sleep episode with asleep-classic level on Fri 11:00:00. An eight-hour main sleep episode on Fri 17:00:00. It is split into 2 parts for daily segment: a seven-hour sleep episode on Fri 17:00:00 and an one-hour sleep episode on Sat 00:00:00. A two-hour nap on Sat 01:00:00 that will be ignored for main sleep features. An one-hour nap on Sat 13:00:00 that will be ignored for main sleep features. An eight-hour main sleep episode on Sat 22:00:00. This episode ends on Sun 08:00:00 (NY) for March and Sun 06:00:00 (NY) for Novembers due to daylight savings. It will be considered for beforeMarchEvent segment and ignored for beforeNovemberEvent segment. A nine-hour main sleep episode on Sun 11:00:00. Start time will be assigned as NY time zone and converted to 14:00:00. A seven-hour main sleep episode on Mon 06:00:00. This episode will be split into two parts: a five-hour sleep episode on Mon 06:00:00 and a two-hour sleep episode on Mon 11:00:00. The first part will be discarded as it is before 11am (Last Night End) Any segment shorter than one day will be ignored for sleep PRICE features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Sensor Provider Periodic Frequency Event Phone Accelerometer Panda N N N Phone Accelerometer RAPIDS N N N Phone Activity Recognition RAPIDS Y Y Y Phone Applications Foreground RAPIDS N N N Phone Battery RAPIDS Y Y N Phone Bluetooth Doryab Y Y Y Phone Bluetooth RAPIDS Y Y Y Phone Calls RAPIDS Y Y Y Phone Conversation RAPIDS Y Y Y Phone Data Yield RAPIDS N N N Phone Light RAPIDS Y Y N Phone Locations Doryab N N N Phone Locations Barnett N N N Phone Messages RAPIDS Y Y N Phone Screen RAPIDS Y Y Y Phone WiFi Connected RAPIDS Y Y Y Phone WiFi Visible RAPIDS Y Y Y Fitbit Calories Intraday RAPIDS Y Y Y Fitbit Data Yield RAPIDS N N N Fitbit Heart Rate Summary RAPIDS N N N Fitbit Heart Rate Intraday RAPIDS N N N Fitbit Sleep Summary RAPIDS N N N Fitbit Sleep Intraday RAPIDS Y Y Y Fitbit Sleep Intraday PRICE Y Y Y Fitbit Steps Summary RAPIDS N N N Fitbit Steps Intraday RAPIDS N N N","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw data for iOS and Android the following is the expected results the phone_calls.csv . Description One missed episode, one outgoing episode and one incoming episode on Friday night, morning, afternoon and evening There is at least one episode of each type of phone calls on each day One incoming episode crossing two 30-mins segments One outgoing episode crossing two 30-mins segments One missed episode before, during and after the event There is one incoming episode before, during or after the event There is one outcoming episode before, during or after the event There is one missed episode before, during or after the event Data format Device Missed Outgoing Incoming iOS 3 2 1 Android 1,4 or 3,4 3,2,4 1,2,4 Note When generating test data, all traces for iOS device need to be unique otherwise the episode with duplicate trace will be dropped Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the phone_screen.csv . Description The screen data file contains data for 4 days. The screen data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night One episode that crossing two 30-min segments Data format Device unlock Android 3, 0 iOS 3, 2 Checklist time segment single tz multi tz platform 30min OK OK Android, iOS morning OK OK Android, iOS daily OK OK Android, iOS threeday OK OK Android, iOS weekend OK OK Android, iOS beforeMarchEvent OK OK Android, iOS beforeNovemberEvent OK OK Android, iOS","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"Description The 4-day raw data is contained in phone_bluetooth_raw.csv One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same 30-min segment ( Fri 23:38:45.789 and Fri 23:59:59.465 ) Two episodes locate in the same daily segment ( Fri 00:00:00.798 and Fri 00:49:04.132 ) One episode before the time switch ( Sun 00:24:00.000 ) and one episode after the time switch ( Sun 17:32:00.000 ) Checklist time segment single tz multi tz platform 30min OK OK Android morning OK OK Android daily OK OK Android threeday OK OK Android weekend OK OK Android beforeMarchEvent OK OK Android beforeNovemberEvent OK OK Android","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are two wifi features ( phone wifi connected and phone wifi visible ). The raw test data are seperatly stored in the phone_wifi_connected_raw.csv and phone_wifi_visible_raw.csv . Description One episode for each epoch ( night , morining , afternoon and evening ) Two two episodes in the same time segment ( daily and 30-min ) Two episodes around the transition of epochs (e.g. one at the end of night and one at the beginning of morning ) One episode before and after the time switch on Sunday phone wifi connected Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS phone wifi visible Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#locations","text":"Description The participant\u2019s home location is (latitude=1, longitude=1). From Sat 10:56:00 to Sat 11:04:00, the center of the cluster is (latitude=-100, longitude=-100). From Sun 03:30:00 to Sun 03:47:00, the center of the cluster is (latitude=1, longitude=1). Home location is extracted from this period. From Sun 11:30:00 to Sun 11:38:00, the center of the cluster is (latitude=100, longitude=100).","title":"Locations"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"Description The 4-day raw conversation data is contained in plugin_google_activity_recognition_raw.csv and plugin_ios_activity_recognition_raw.csv . Two episodes locate in the same 30-min segment ( Fri 04:01:54 and Fri 04:13:52 ) One episode for each daily segment ( night , morning , afternoon and evening ) Two episodes locate in the same daily segment ( Fri 05:03:09 and Fri 05:50:36 ) Two episodes with the time difference less than 5 mins threshold ( Fri 07:14:21 and Fri 07:18:50 ) One episode before the time switch ( Sun 00:46:00 ) and one episode after the time switch ( Sun 03:42:00 ) Checklist time segment single tz multi tz platform 30min OK OK android, iOS morning OK OK android, iOS daily OK OK android, iOS threeday OK OK android, iOS weekend OK OK android, iOS beforeMarchEvent OK OK android, iOS beforeNovemberEvent OK OK android, iOS","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The 4-day raw conversation data is contained in phone_conversation_raw.csv . The different inference records are randomly distributed throughout the epoch . Description One episode for each daily segment ( night , morning , afternoon and evening ) on each day Two episodes near the transition of the daily segment, one starts at the end of the afternoon, Fri 17:10:00 and another one starts at the beginning of the evening, Fri 18:01:00 One episode across two segments, daily and 30-mins , (from Fri 05:55:00 to Fri 06:00:41 ) Two episodes locate in the same daily segment ( Sat 12:45:36 and Sat 16:48:22 ) One episode before the time switch, Sun 00:15:06 , and one episode after the time switch, Sun 06:01:00 Data format inference type 0 silence 1 noise 2 voice 3 unknown Checklist time segment single tz multi tz platform 30min OK OK android morning OK OK android daily OK OK android threeday OK OK android weekend OK OK android beforeMarchEvent OK OK android beforeNovemberEvent OK OK android","title":"Conversation"},{"location":"developers/test-cases/#keyboard","text":"The raw keyboard data file contains data for 4 days. The raw keyboard data contains records with difference in timestamp ranging from milliseconds to seconds. With difference in timestamps between consecutive records more than 5 seconds helps us to create separate sessions within the usage of the same app. This helps to verify the case where sessions have to be different. The raw keyboard data contains records where the difference in text is less than 5 seconds which makes it into 1 session but because of difference of app new session starts. This edge case determines the behaviour within particular app and also within 5 seconds. The raw keyboard data also contains the records where length of current_text varies between consecutive rows. This helps us to tests on the cases where input text is entered by auto-suggested or auto-correct operations. One three-minute episode with a 1-minute row on Sun 08:59:54.65 and 09:00:00,another on Sun 12:01:02 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Keyboard from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes.","title":"Keyboard"},{"location":"developers/test-cases/#application-episodes","text":"The feature requires raw application foreground data file and raw phone screen data file The raw data files contains data for 4 day. The raw conversation data contains records with difference in timestamp ranging from milliseconds to minutes. An app episode starts when an app is launched and ends when another app is launched, marking the episode end of the first one, or when the screen locks. Thus, we are taking into account the screen unlock episodes. There are multiple apps usage within each screen unlock episode to verify creation of different app episodes in each screen unlock session. In the screen unlock episode starting from Fri 05:56:51, Fri 10:00:24, Sat 17:48:01, Sun 22:02:00, and Mon 21:05:00 we have multiple apps, both system and non-system apps, to check this. The 22 minute chunk starting from Fri 10:03:56 checks app episodes for system apps only. The screen unlock episode starting from Mon 21:05:00 and Sat 17:48:01 checks if the screen lock marks the end of episode for that particular app which was launched a few milliseconds to 8 mins before the screen lock. Finally, since application foreground is only for Android devices, this feature is also for Android devices only. All other files are empty data files","title":"Application Episodes"},{"location":"developers/test-cases/#fitbit-calories-intraday","text":"Description A five-minute sedentary episode on Fri 11:00:00 A one-minute sedentary episode on Sun 02:00:00. It exists in November but not in February in STZ A five-minute sedentary episode on Fri 11:58:00. It is split within two 30-min segments and the morning A three-minute lightly active episode on Fri 11:10:00, a one-minute at 11:18:00 and a one-minute 11:24:00. These check for start and end times of first/last/longest episode A three-minute fairly active episode on Fri 11:40:00, a one-minute at 11:48:00 and a one-minute 11:54:00. These check for start and end times of first/last/longest episode A three-minute very active episode on Fri 12:10:00, a one-minute at 12:18:00 and a one-minute 12:24:00. These check for start and end times of first/last/longest episode A eight-minute MVPA episode with intertwined fairly and very active rows on Fri 12:30:00 The above episodes contain six higmet (>= 3 MET) episodes and nine lowmet episodes. One two-minute sedentary episode with a 1-minute row on Sun 09:00:00 and another on Sun 12:01:01 that are considering a single episode in multi-timezone event segments to showcase how inferring time zone data for Fitbit from phone data can produce inaccurate results around the tz change. This happens because the device was on LA time until 11:59 and switched to NY time at 12pm, in terms of actual time 09 am LA and 12 pm NY represent the same moment in time so 09:00 LA and 12:01 NY are consecutive minutes. A three-minute sedentary episode on Sat 08:59 that will be ignored for multi-timezone event segments. A three-minute sedentary episode on Sat 12:59 of which the first minute will be ignored for multi-timezone event segments since the test segment starts at 13:00 A three-minute sedentary episode on Sat 16:00 A four-minute sedentary episode on Sun 10:01 that will be ignored for Novembers\u2019s multi-timezone event segments since the test segment ends at 10am on that weekend. A three-minute very active episode on Sat 16:03. This episode and the one at 16:00 are counted as one for lowmet episodes Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Calories Intraday"},{"location":"developers/test-cases/#fitbit-sleep-summary","text":"Description A main sleep episode that starts on Fri 20:00:00 and ends on Sat 02:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Fri) data. A nap that starts on Sat 04:00:00 and ends on Sat 06:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Fri) data. A nap that starts on Sat 13:00:00 and ends on Sat 15:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sat) data. A main sleep that starts on Sun 01:00:00 and ends on Sun 12:00:00. This episode starts before 11am (Last Night End) which will be considered as yesterday\u2019s (Sat) data. A main sleep that starts on Sun 23:00:00 and ends on Mon 07:00:00. This episode starts after 11am (Last Night End) which will be considered as today\u2019s (Sun) data. Any segment shorter than one day will be ignored for sleep RAPIDS features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Sleep Summary"},{"location":"developers/test-cases/#fitbit-sleep-intraday","text":"Description A five-minute main sleep episode with asleep-classic level on Fri 11:00:00. An eight-hour main sleep episode on Fri 17:00:00. It is split into 2 parts for daily segment: a seven-hour sleep episode on Fri 17:00:00 and an one-hour sleep episode on Sat 00:00:00. A two-hour nap on Sat 01:00:00 that will be ignored for main sleep features. An one-hour nap on Sat 13:00:00 that will be ignored for main sleep features. An eight-hour main sleep episode on Sat 22:00:00. This episode ends on Sun 08:00:00 (NY) for March and Sun 06:00:00 (NY) for Novembers due to daylight savings. It will be considered for beforeMarchEvent segment and ignored for beforeNovemberEvent segment. A nine-hour main sleep episode on Sun 11:00:00. Start time will be assigned as NY time zone and converted to 14:00:00. A seven-hour main sleep episode on Mon 06:00:00. This episode will be split into two parts: a five-hour sleep episode on Mon 06:00:00 and a two-hour sleep episode on Mon 11:00:00. The first part will be discarded as it is before 11am (Last Night End) Any segment shorter than one day will be ignored for sleep PRICE features. Checklist time segment single tz multi tz platform 30min OK OK fitbit morning OK OK fitbit daily OK OK fitbit threeday OK OK fitbit weekend OK OK fitbit beforeMarchEvent OK OK fitbit beforeNovemberEvent OK OK fitbit","title":"Fitbit Sleep Intraday"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to run RAPIDS\u2019 tests. All files necessary for testing are stored in the ./tests/ directory Steps for Testing \u00b6 Testing Overview You have to create a single four day test dataset for the sensor you are working on. You will adjust your dataset with tests/script/assign_test_timestamps.py to fit Fri March 6th 2020 - Mon March 9th 2020 and Fri Oct 30th 2020 - Mon Nov 2nd 2020 . We test daylight saving times with these dates. We have one test participant per platform ( pids : android , ios , fitbit , empatica , empty ). The data device_id should be equal to the pid . We will run this test dataset against six test pipelines, three for frequency , periodic , and event time segments in a single time zone, and the same three in multiple time zones. You will have to create your test data to cover as many corner cases as possible. These cases depend on the sensor you are working on. The time segments and time zones to be tested are: Frequency 30 minutes ( 30min,30 ) Periodic morning ( morning,06:00:00,5H 59M 59S,every_day,0 ) daily ( daily,00:00:00,23H 59M 59S,every_day,0 ) three-day segments that repeat every day ( threeday,00:00:00,71H 59M 59S,every_day,0 ) three-day segments that repeat every Friday ( weekend,00:00:00,71H 59M 59S,wday,5 ) Event A segment that starts 3 hour before an event (Sat Mar 07 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves forward and the period 2am-3am does not exist. In this case, the segment would start on Sat Mar 07 2020 16:00:00 EST (timestamp: 1583614800000) and end on Sun Mar 08 2020 15:00:00 EST (timestamp: 1583694000000). ( beforeMarchEvent,1583625600000,22H,3H,-1,android ) A segment that starts 3 hour before an event (Sat Oct 31 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves back and the period 1am-2am exists twice. In this case, the segment would start on Sat Oct 31 2020 16:00:00 EST (timestamp: 1604174400000) and end on Sun Nov 01 2020 13:00:00 EST (timestamp: 1604253600000). ( beforeNovemberEvent,1604185200000,22H,3H,-1,android ) Single time zone to test America/New_York Multi time zones to test America/New_York starting at 0 America/Los_Angeles starting at 1583600400000 (Sat Mar 07 2020 12:00:00 EST) America/New_York starting at 1583683200000 (Sun Mar 08 2020 12:00:00 EST) America/Los_Angeles starting at 1604160000000 (Sat Oct 31 2020 12:00:00 EST) America/New_York starting at 1604250000000 (Sun Nov 01 2020 12:00:00 EST) Understanding event segments with multi timezones Document your tests Before you start implementing any test data you need to document your tests. The documentation of your tests should be added to docs/developers/test-cases.md under the corresponding sensor. You will need to add two subsections Description and the Checklist The amount of data you need depends on each sensor but you can be efficient by creating data that covers corner cases in more than one time segment. For example, a battery episode from 11am to 1pm, covers the case when an episode has to be split for 30min frequency segments and for morning segments. As a rule of thumb think about corner cases for 30min segments as they will give you the most flexibility. Only add tests for iOS if the raw data format is different than Android\u2019s (for example for screen) Create specific tests for Sunday before and after 02:00. These will test daylight saving switches, in March 02:00 to 02:59 do not exist, and in November 01:00 to 01:59 exist twice (read below how tests/script/assign_test_timestamps.py handles this) Example of Description Description is a list and every item describes the different scenarios your test data is covering. For example, if we are testing PHONE_BATTERY: - We test 24 discharge episodes, 24 charge episodes and 2 episodes with a 0 discharge rate - One episode is shorter than 30 minutes (`start timestamp` to `end timestamp`) - One episode is 120 minutes long from 11:00 to 13:00 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for morning segments - One episode is 60 minutes long from 23:30 to 00:30 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for daly segments (overnight) - One 0 discharge rate episode 10 minutes long that happens within a 30-minute segment (10:00 to 10:29) (`start timestamp` to `end timestamp`) - Three discharge episodes that happen between during beforeMarchEvent (start/end timestamps of those discharge episodes) - Three charge episodes that happen between during beforeMarchEvent (start/end timestamps of those charge episodes) - One discharge episode that happen between 00:30 and 04:00 to test for daylight saving times in March and Novemeber 2020. - ... any other test corner cases you can think of Describe your test cases in as much detail as possible so in the future if we find a bug in RAPIDS, we know what test case we did not include and should add. Example of Checklist Checklist is a table where you confirm you have verified the output of your dataset for the different time segments and time zones time segment single tz multi tz platform 30min OK OK android and iOS morning OK OK android and iOS daily OK OK android and iOS threeday OK OK android and iOS weekend OK OK android and iOS beforeMarchEvent OK OK android and iOS beforeNovemberEvent OK OK android and iOS Add raw input data. Add the raw test data to the corresponding sensor CSV file in tests/data/manual/aware_csv/SENSOR_raw.csv . Create the CSV if it does not exist. The test data you create will have the same columns as normal raw data except test_time replaces timestamp . To make your life easier, you can place a test data row in time using the test_time column with the following format: Day HH:MM:SS.XXX , for example Fri 22:54:30.597 . You can convert your manual test data to actual raw test data with the following commands: For the selected files: (It could be a single file name or multiple file names separated by whitespace(s)) python tests/scripts/assign_test_timestamps.py -f file_name_1 file_name_2 For all files under the tests/data/manual/aware_csv folder: python tests/scripts/assign_test_timestamps.py -a The script assign_test_timestamps.py converts you test_time column into a timestamp . For example, Fri 22:54:30.597 is converted to 1583553270597 ( Fri Mar 06 2020 22:54:30 GMT-0500 ) and to 1604112870597 ( Fri Oct 30 2020 22:54:30 GMT-0400 ). Note you can include milliseconds. The device_id should be the same as pid . Example of test data you need to create The test_time column will be automatically converted to a timestamp that fits our testing periods in March and November by tests/script/assign_test_timestamps.py test_time,device_id,battery_level,battery_scale,battery_status Fri 01:00:00.000,ios,90,100,4 Fri 01:00:30.500,ios,89,100,4 Fri 01:01:00.000,ios,80,100,4 Fri 01:01:45.500,ios,79,100,4 ... Sat 08:00:00.000,ios,78,100,4 Sat 08:01:00.000,ios,50,100,4 Sat 08:02:00.000,ios,49,100,4 Add expected output data. Add or update the expected output feature file of the participant and sensor you are testing: tests/data/processed/features/ { type_of_time_segment } / { pid } /device_sensor.csv # this example is expected output data for battery tests for periodic segments in a single timezone tests/data/processed/features/stz_periodic/android/phone_sensor.csv # this example is expected output data for battery tests for periodic segments in multi timezones tests/data/processed/features/mtz_periodic/android/phone_sensor.csv Edit the config file(s). Activate the sensor provider you are testing if it isn\u2019t already. Set [SENSOR][PROVIDER][COMPUTE] to TRUE in the config.yaml of the time segments and time zones you are testing: - tests/settings/stz_frequency_config.yaml # For single-timezone frequency time segments - tests/settings/stz_periodic_config.yaml # For single-timezone periodic time segments - tests/settings/stz_event_config.yaml # For single-timezone event time segments - tests/settings/mtz_frequency_config.yaml # For multi-timezone frequency time segments - tests/settings/mtz_periodic_config.yaml # For multi-timezone periodic time segments - tests/settings/mtz_event_config.yaml # For multi-timezone event time segments Run the pipeline and tests. You can run all six segment pipelines and their tests bash tests/scripts/run_tests.sh -t all You can run only the pipeline of a specific time segment and its tests bash tests/scripts/run_tests.sh -t stz_frequency -a both # swap stz_frequency for mtz_frequency, stz_event, mtz_event, etc Or, if you are working on your tests and you want to run a pipeline and its tests independently bash tests/scripts/run_tests.sh -t stz_frequency -a run bash tests/scripts/run_tests.sh -t stz_frequency -a test How does the test execution work? This bash script tests/scripts/run_tests.sh executes one or all test pipelines for different time segment types ( frequency , periodic , and events ) and single or multiple timezones. The python script tests/scripts/run_tests.py runs the tests. It parses the involved participants and active sensor providers in the config.yaml file of the time segment type and time zone being tested. We test that the output file we expect exists and that its content matches the expected values. Output Example The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_frequency ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_frequency FAIL The results above show that the for stz_periodic, both test_sensors_files_exist and test_sensors_features_calculations passed. While for stz_frequency, the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. Additionally, you should get the traceback of the failure (not shown here).","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to run RAPIDS\u2019 tests. All files necessary for testing are stored in the ./tests/ directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"Testing Overview You have to create a single four day test dataset for the sensor you are working on. You will adjust your dataset with tests/script/assign_test_timestamps.py to fit Fri March 6th 2020 - Mon March 9th 2020 and Fri Oct 30th 2020 - Mon Nov 2nd 2020 . We test daylight saving times with these dates. We have one test participant per platform ( pids : android , ios , fitbit , empatica , empty ). The data device_id should be equal to the pid . We will run this test dataset against six test pipelines, three for frequency , periodic , and event time segments in a single time zone, and the same three in multiple time zones. You will have to create your test data to cover as many corner cases as possible. These cases depend on the sensor you are working on. The time segments and time zones to be tested are: Frequency 30 minutes ( 30min,30 ) Periodic morning ( morning,06:00:00,5H 59M 59S,every_day,0 ) daily ( daily,00:00:00,23H 59M 59S,every_day,0 ) three-day segments that repeat every day ( threeday,00:00:00,71H 59M 59S,every_day,0 ) three-day segments that repeat every Friday ( weekend,00:00:00,71H 59M 59S,wday,5 ) Event A segment that starts 3 hour before an event (Sat Mar 07 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves forward and the period 2am-3am does not exist. In this case, the segment would start on Sat Mar 07 2020 16:00:00 EST (timestamp: 1583614800000) and end on Sun Mar 08 2020 15:00:00 EST (timestamp: 1583694000000). ( beforeMarchEvent,1583625600000,22H,3H,-1,android ) A segment that starts 3 hour before an event (Sat Oct 31 2020 19:00:00 EST) and lasts for 22 hours. Note that the last part of this segment will happen during a daylight saving change on Sunday at 2am when the clock moves back and the period 1am-2am exists twice. In this case, the segment would start on Sat Oct 31 2020 16:00:00 EST (timestamp: 1604174400000) and end on Sun Nov 01 2020 13:00:00 EST (timestamp: 1604253600000). ( beforeNovemberEvent,1604185200000,22H,3H,-1,android ) Single time zone to test America/New_York Multi time zones to test America/New_York starting at 0 America/Los_Angeles starting at 1583600400000 (Sat Mar 07 2020 12:00:00 EST) America/New_York starting at 1583683200000 (Sun Mar 08 2020 12:00:00 EST) America/Los_Angeles starting at 1604160000000 (Sat Oct 31 2020 12:00:00 EST) America/New_York starting at 1604250000000 (Sun Nov 01 2020 12:00:00 EST) Understanding event segments with multi timezones Document your tests Before you start implementing any test data you need to document your tests. The documentation of your tests should be added to docs/developers/test-cases.md under the corresponding sensor. You will need to add two subsections Description and the Checklist The amount of data you need depends on each sensor but you can be efficient by creating data that covers corner cases in more than one time segment. For example, a battery episode from 11am to 1pm, covers the case when an episode has to be split for 30min frequency segments and for morning segments. As a rule of thumb think about corner cases for 30min segments as they will give you the most flexibility. Only add tests for iOS if the raw data format is different than Android\u2019s (for example for screen) Create specific tests for Sunday before and after 02:00. These will test daylight saving switches, in March 02:00 to 02:59 do not exist, and in November 01:00 to 01:59 exist twice (read below how tests/script/assign_test_timestamps.py handles this) Example of Description Description is a list and every item describes the different scenarios your test data is covering. For example, if we are testing PHONE_BATTERY: - We test 24 discharge episodes, 24 charge episodes and 2 episodes with a 0 discharge rate - One episode is shorter than 30 minutes (`start timestamp` to `end timestamp`) - One episode is 120 minutes long from 11:00 to 13:00 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for morning segments - One episode is 60 minutes long from 23:30 to 00:30 (`start timestamp` to `end timestamp`). This one covers the case when an episode has to be chunked for 30min frequency segments and for daly segments (overnight) - One 0 discharge rate episode 10 minutes long that happens within a 30-minute segment (10:00 to 10:29) (`start timestamp` to `end timestamp`) - Three discharge episodes that happen between during beforeMarchEvent (start/end timestamps of those discharge episodes) - Three charge episodes that happen between during beforeMarchEvent (start/end timestamps of those charge episodes) - One discharge episode that happen between 00:30 and 04:00 to test for daylight saving times in March and Novemeber 2020. - ... any other test corner cases you can think of Describe your test cases in as much detail as possible so in the future if we find a bug in RAPIDS, we know what test case we did not include and should add. Example of Checklist Checklist is a table where you confirm you have verified the output of your dataset for the different time segments and time zones time segment single tz multi tz platform 30min OK OK android and iOS morning OK OK android and iOS daily OK OK android and iOS threeday OK OK android and iOS weekend OK OK android and iOS beforeMarchEvent OK OK android and iOS beforeNovemberEvent OK OK android and iOS Add raw input data. Add the raw test data to the corresponding sensor CSV file in tests/data/manual/aware_csv/SENSOR_raw.csv . Create the CSV if it does not exist. The test data you create will have the same columns as normal raw data except test_time replaces timestamp . To make your life easier, you can place a test data row in time using the test_time column with the following format: Day HH:MM:SS.XXX , for example Fri 22:54:30.597 . You can convert your manual test data to actual raw test data with the following commands: For the selected files: (It could be a single file name or multiple file names separated by whitespace(s)) python tests/scripts/assign_test_timestamps.py -f file_name_1 file_name_2 For all files under the tests/data/manual/aware_csv folder: python tests/scripts/assign_test_timestamps.py -a The script assign_test_timestamps.py converts you test_time column into a timestamp . For example, Fri 22:54:30.597 is converted to 1583553270597 ( Fri Mar 06 2020 22:54:30 GMT-0500 ) and to 1604112870597 ( Fri Oct 30 2020 22:54:30 GMT-0400 ). Note you can include milliseconds. The device_id should be the same as pid . Example of test data you need to create The test_time column will be automatically converted to a timestamp that fits our testing periods in March and November by tests/script/assign_test_timestamps.py test_time,device_id,battery_level,battery_scale,battery_status Fri 01:00:00.000,ios,90,100,4 Fri 01:00:30.500,ios,89,100,4 Fri 01:01:00.000,ios,80,100,4 Fri 01:01:45.500,ios,79,100,4 ... Sat 08:00:00.000,ios,78,100,4 Sat 08:01:00.000,ios,50,100,4 Sat 08:02:00.000,ios,49,100,4 Add expected output data. Add or update the expected output feature file of the participant and sensor you are testing: tests/data/processed/features/ { type_of_time_segment } / { pid } /device_sensor.csv # this example is expected output data for battery tests for periodic segments in a single timezone tests/data/processed/features/stz_periodic/android/phone_sensor.csv # this example is expected output data for battery tests for periodic segments in multi timezones tests/data/processed/features/mtz_periodic/android/phone_sensor.csv Edit the config file(s). Activate the sensor provider you are testing if it isn\u2019t already. Set [SENSOR][PROVIDER][COMPUTE] to TRUE in the config.yaml of the time segments and time zones you are testing: - tests/settings/stz_frequency_config.yaml # For single-timezone frequency time segments - tests/settings/stz_periodic_config.yaml # For single-timezone periodic time segments - tests/settings/stz_event_config.yaml # For single-timezone event time segments - tests/settings/mtz_frequency_config.yaml # For multi-timezone frequency time segments - tests/settings/mtz_periodic_config.yaml # For multi-timezone periodic time segments - tests/settings/mtz_event_config.yaml # For multi-timezone event time segments Run the pipeline and tests. You can run all six segment pipelines and their tests bash tests/scripts/run_tests.sh -t all You can run only the pipeline of a specific time segment and its tests bash tests/scripts/run_tests.sh -t stz_frequency -a both # swap stz_frequency for mtz_frequency, stz_event, mtz_event, etc Or, if you are working on your tests and you want to run a pipeline and its tests independently bash tests/scripts/run_tests.sh -t stz_frequency -a run bash tests/scripts/run_tests.sh -t stz_frequency -a test How does the test execution work? This bash script tests/scripts/run_tests.sh executes one or all test pipelines for different time segment types ( frequency , periodic , and events ) and single or multiple timezones. The python script tests/scripts/run_tests.py runs the tests. It parses the involved participants and active sensor providers in the config.yaml file of the time segment type and time zone being tested. We test that the output file we expect exists and that its content matches the expected values. Output Example The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_periodic ok test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... stz_frequency ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... stz_frequency FAIL The results above show that the for stz_periodic, both test_sensors_files_exist and test_sensors_features_calculations passed. While for stz_frequency, the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. Additionally, you should get the traceback of the failure (not shown here).","title":"Steps for Testing"},{"location":"developers/validation-schema-config/","text":"Validation schema of config.yaml \u00b6 Why do we need to validate the config.yaml ? Most of the key/values in the config.yaml are constrained to a set of possible values or types. For example [TIME_SEGMENTS][TYPE] can only be one of [\"FREQUENCY\", \"PERIODIC\", \"EVENT\"] , and [TIMEZONE] has to be a string. We should show the user an error if that\u2019s not the case. We could validate this in Python or R but since we reuse scripts and keys in multiple places, tracking these validations can be time consuming and get out of control. Thus, we do these validations through a schema and check that schema before RAPIDS starts processing any data so the user can see the error right away. Keep in mind these validations can only cover certain base cases. Some validations that require more complex logic should still be done in the respective script. For example, we can check that a CSV file path actually ends in .csv but we can only check that the file actually exists in a Python script. The structure and values of the config.yaml file are validated using a YAML schema stored in tools/config.schema.yaml . Each key in config.yaml , for example PIDS , has a corresponding entry in the schema where we can validate its type, possible values, required properties, min and max values, among other things. The config.yaml is validated against the schema every time RAPIDS runs (see the top of the Snakefile ): validate ( config , \"tools/config.schema.yaml\" ) Structure of the schema \u00b6 The schema has three main sections required , definitions , and properties . All of them are just nested key/value YAML pairs, where the value can be a primitive type ( integer , string , boolean , number ) or can be another key/value pair ( object ). required \u00b6 required lists properties that should be present in the config.yaml . We will almost always add every config.yaml key to this list (meaning that the user cannot delete any of those keys like TIMEZONE or PIDS ). definitions \u00b6 definitions lists key/values that are common to different properties so we can reuse them. You can define a key/value under definitions and use $ref to refer to it in any property . For example, every sensor like [PHONE_ACCELEROMETER] has one or more providers like RAPIDS and PANDA , these providers have some common properties like the COMPUTE flag or the SRC_SCRIPT string. Therefore we define a shared provider \u201ctemplate\u201d that is used by every provider and extended with properties exclusive to each one of them. For example: provider definition (template) The PROVIDER definition will be used later on different properties . PROVIDER : type : object required : [ COMPUTE , SRC_SCRIPT , FEATURES ] properties : COMPUTE : type : boolean FEATURES : type : [ array , object ] SRC_SCRIPT : type : string pattern : \"^.*\\\\.(py|R)$\" provider reusing and extending the template Notice that RAPIDS (a provider) uses and extends the PROVIDER template in this example. The FEATURES key is overriding the FEATURES key from the #/definitions/PROVIDER template but is keeping the validation for COMPUTE , and SRC_SCRIPT . For more details about reusing properties, go to this link PHONE_ACCELEROMETER : type : object # .. other properties PROVIDERS : type : [ \"null\" , object ] properties : RAPIDS : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : FEATURES : type : array uniqueItems : True items : type : string enum : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] properties \u00b6 properties are nested key/values that describe the different components of our config.yaml file. Values can be of one or more primitive types like string , number , array , boolean and null . Values can also be another key/value pair (of type object ) that are similar to a dictionary in Python. For example, the following property validates the PIDS of our config.yaml . It checks that PIDS is an array with unique items of type string . PIDS : type : array uniqueItems : True items : type : string Modifying the schema \u00b6 Validating the config.yaml during development If you updated the schema and want to check the config.yaml is compliant, you can run the command snakemake --list-params-changes . You will see Building DAG of jobs... if there are no problems or an error message otherwise (try setting any COMPUTE flag to a string like test instead of False/True ). You can use this command without having to configure RAPIDS to process any participants or sensors. You can validate different aspects of each key/value in our config.yaml file: number/integer Including min and max values MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS : type : number minimum : 0 maximum : 1 FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD : type : integer exclusiveMinimum : 0 string Including valid values ( enum ) items : type : string enum : [ \"count\" , \"maxlux\" , \"minlux\" , \"avglux\" , \"medianlux\" , \"stdlux\" ] boolean MINUTES_DATA_USED : type : boolean array Including whether or not it should have unique values, the type of the array\u2019s elements ( strings , numbers ) and valid values ( enum ). MESSAGES_TYPES : type : array uniqueItems : True items : type : string enum : [ \"received\" , \"sent\" ] object PARENT is an object that has two properties. KID1 is one of those properties that are, in turn, another object that will reuse the \"#/definitions/PROVIDER\" definition AND also include (extend) two extra properties GRAND_KID1 of type array and GRAND_KID2 of type number . KID2 is another property of PARENT of type boolean . The schema validation looks like this PARENT : type : object properties : KID1 : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : GRAND_KID1 : type : array uniqueItems : True GRAND_KID2 : type : number KID2 : type : boolean The config.yaml key that the previous schema validates looks like this: PARENT : KID1 : # These four come from the `PROVIDER` definition (template) COMPUTE : False FEATURES : [ x , y ] # an array SRC_SCRIPT : \"a path to a py or R script\" # This two come from the extension GRAND_KID1 : [ a , b ] # an array GRAND_KID2 : 5.1 # an number KID2 : True # a boolean Verifying the schema is correct \u00b6 We recommend that before you start modifying the schema you modify the config.yaml key that you want to validate with an invalid value. For example, if you want to validate that COMPUTE is boolean, you set COMPUTE: 123 . Then create your validation, run snakemake --list-params-changes and make sure your validation fails (123 is not boolean ), and then set the key to the correct value. In other words, make sure it\u2019s broken first so that you know that your validation works. Warning Be careful . You can check that the schema config.schema.yaml has a valid format by running python tools/check_schema.py . You will see this message if its structure is correct: Schema is OK . However, we don\u2019t have a way to detect typos, for example allOf will work but allOF won\u2019t (capital F ) and it won\u2019t show any error. That\u2019s why we recommend to start with an invalid key/value in your config.yaml so that you can be sure the schema validation finds the problem. Useful resources \u00b6 Read the following links to learn more about what we can validate with schemas. They are based on JSON instead of YAML schemas but the same concepts apply. Understanding JSON Schemas Specification of the JSON schema we use","title":"Validation schema of config.yaml"},{"location":"developers/validation-schema-config/#validation-schema-of-configyaml","text":"Why do we need to validate the config.yaml ? Most of the key/values in the config.yaml are constrained to a set of possible values or types. For example [TIME_SEGMENTS][TYPE] can only be one of [\"FREQUENCY\", \"PERIODIC\", \"EVENT\"] , and [TIMEZONE] has to be a string. We should show the user an error if that\u2019s not the case. We could validate this in Python or R but since we reuse scripts and keys in multiple places, tracking these validations can be time consuming and get out of control. Thus, we do these validations through a schema and check that schema before RAPIDS starts processing any data so the user can see the error right away. Keep in mind these validations can only cover certain base cases. Some validations that require more complex logic should still be done in the respective script. For example, we can check that a CSV file path actually ends in .csv but we can only check that the file actually exists in a Python script. The structure and values of the config.yaml file are validated using a YAML schema stored in tools/config.schema.yaml . Each key in config.yaml , for example PIDS , has a corresponding entry in the schema where we can validate its type, possible values, required properties, min and max values, among other things. The config.yaml is validated against the schema every time RAPIDS runs (see the top of the Snakefile ): validate ( config , \"tools/config.schema.yaml\" )","title":"Validation schema of config.yaml"},{"location":"developers/validation-schema-config/#structure-of-the-schema","text":"The schema has three main sections required , definitions , and properties . All of them are just nested key/value YAML pairs, where the value can be a primitive type ( integer , string , boolean , number ) or can be another key/value pair ( object ).","title":"Structure of the schema"},{"location":"developers/validation-schema-config/#required","text":"required lists properties that should be present in the config.yaml . We will almost always add every config.yaml key to this list (meaning that the user cannot delete any of those keys like TIMEZONE or PIDS ).","title":"required"},{"location":"developers/validation-schema-config/#definitions","text":"definitions lists key/values that are common to different properties so we can reuse them. You can define a key/value under definitions and use $ref to refer to it in any property . For example, every sensor like [PHONE_ACCELEROMETER] has one or more providers like RAPIDS and PANDA , these providers have some common properties like the COMPUTE flag or the SRC_SCRIPT string. Therefore we define a shared provider \u201ctemplate\u201d that is used by every provider and extended with properties exclusive to each one of them. For example: provider definition (template) The PROVIDER definition will be used later on different properties . PROVIDER : type : object required : [ COMPUTE , SRC_SCRIPT , FEATURES ] properties : COMPUTE : type : boolean FEATURES : type : [ array , object ] SRC_SCRIPT : type : string pattern : \"^.*\\\\.(py|R)$\" provider reusing and extending the template Notice that RAPIDS (a provider) uses and extends the PROVIDER template in this example. The FEATURES key is overriding the FEATURES key from the #/definitions/PROVIDER template but is keeping the validation for COMPUTE , and SRC_SCRIPT . For more details about reusing properties, go to this link PHONE_ACCELEROMETER : type : object # .. other properties PROVIDERS : type : [ \"null\" , object ] properties : RAPIDS : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : FEATURES : type : array uniqueItems : True items : type : string enum : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ]","title":"definitions"},{"location":"developers/validation-schema-config/#properties","text":"properties are nested key/values that describe the different components of our config.yaml file. Values can be of one or more primitive types like string , number , array , boolean and null . Values can also be another key/value pair (of type object ) that are similar to a dictionary in Python. For example, the following property validates the PIDS of our config.yaml . It checks that PIDS is an array with unique items of type string . PIDS : type : array uniqueItems : True items : type : string","title":"properties"},{"location":"developers/validation-schema-config/#modifying-the-schema","text":"Validating the config.yaml during development If you updated the schema and want to check the config.yaml is compliant, you can run the command snakemake --list-params-changes . You will see Building DAG of jobs... if there are no problems or an error message otherwise (try setting any COMPUTE flag to a string like test instead of False/True ). You can use this command without having to configure RAPIDS to process any participants or sensors. You can validate different aspects of each key/value in our config.yaml file: number/integer Including min and max values MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS : type : number minimum : 0 maximum : 1 FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD : type : integer exclusiveMinimum : 0 string Including valid values ( enum ) items : type : string enum : [ \"count\" , \"maxlux\" , \"minlux\" , \"avglux\" , \"medianlux\" , \"stdlux\" ] boolean MINUTES_DATA_USED : type : boolean array Including whether or not it should have unique values, the type of the array\u2019s elements ( strings , numbers ) and valid values ( enum ). MESSAGES_TYPES : type : array uniqueItems : True items : type : string enum : [ \"received\" , \"sent\" ] object PARENT is an object that has two properties. KID1 is one of those properties that are, in turn, another object that will reuse the \"#/definitions/PROVIDER\" definition AND also include (extend) two extra properties GRAND_KID1 of type array and GRAND_KID2 of type number . KID2 is another property of PARENT of type boolean . The schema validation looks like this PARENT : type : object properties : KID1 : allOf : - $ref : \"#/definitions/PROVIDER\" - properties : GRAND_KID1 : type : array uniqueItems : True GRAND_KID2 : type : number KID2 : type : boolean The config.yaml key that the previous schema validates looks like this: PARENT : KID1 : # These four come from the `PROVIDER` definition (template) COMPUTE : False FEATURES : [ x , y ] # an array SRC_SCRIPT : \"a path to a py or R script\" # This two come from the extension GRAND_KID1 : [ a , b ] # an array GRAND_KID2 : 5.1 # an number KID2 : True # a boolean","title":"Modifying the schema"},{"location":"developers/validation-schema-config/#verifying-the-schema-is-correct","text":"We recommend that before you start modifying the schema you modify the config.yaml key that you want to validate with an invalid value. For example, if you want to validate that COMPUTE is boolean, you set COMPUTE: 123 . Then create your validation, run snakemake --list-params-changes and make sure your validation fails (123 is not boolean ), and then set the key to the correct value. In other words, make sure it\u2019s broken first so that you know that your validation works. Warning Be careful . You can check that the schema config.schema.yaml has a valid format by running python tools/check_schema.py . You will see this message if its structure is correct: Schema is OK . However, we don\u2019t have a way to detect typos, for example allOf will work but allOF won\u2019t (capital F ) and it won\u2019t show any error. That\u2019s why we recommend to start with an invalid key/value in your config.yaml so that you can be sure the schema validation finds the problem.","title":"Verifying the schema is correct"},{"location":"developers/validation-schema-config/#useful-resources","text":"Read the following links to learn more about what we can validate with schemas. They are based on JSON instead of YAML schemas but the same concepts apply. Understanding JSON Schemas Specification of the JSON schema we use","title":"Useful resources"},{"location":"developers/virtual-environments/","text":"Python Virtual Environment \u00b6 Add new packages \u00b6 Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ). Remove packages \u00b6 Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME Updating all packages \u00b6 Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all Update your conda environment.yaml \u00b6 After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml R Virtual Environment \u00b6 Add new packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\") Remove packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\") Updating all packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update() Update your R renv.lock \u00b6 After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Virtual Environments"},{"location":"developers/virtual-environments/#python-virtual-environment","text":"","title":"Python Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ).","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages","text":"Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages","text":"Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#r-virtual-environment","text":"","title":"R Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\")","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\")","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update()","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-r-renvlock","text":"After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Update your R renv.lock"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page. You can implement new features in Python or R scripts. You won\u2019t have to deal with time zones, dates, times, data cleaning, or preprocessing. The data that RAPIDS pipes to your feature extraction code are ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create your feature provider script Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 with a Python script that requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor of any device with a configuration entry in config.yaml : Smartphone (AWARE) Phone Accelerometer Phone Activity Recognition Phone Applications Crashes Phone Applications Foreground Phone Applications Notifications Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Keyboard Phone Light Phone Locations Phone Log Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Fitbit Data Yield Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Sleep Intraday Fitbit Steps Summary Fitbit Steps Intraday Empatica Empatica Accelerometer Empatica Heart Rate Empatica Temperature Empatica Electrodermal Activity Empatica Blood Volume Pulse Empatica Inter Beat Interval Empatica Tags Modify the config.yaml file \u00b6 In this step, you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : CONTAINER : accelerometer PROVIDERS : RAPIDS : # this is a feature provider COMPUTE : False ... PANDA : # this is another feature provider COMPUTE : False ... VEGA : # this is our new feature provider COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_SCRIPT : src/features/phone_accelerometer/vega/main.py Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string, or an array of any of such types. [SRC_SCRIPT] The relative path from RAPIDS\u2019 root folder to a script that computes the features for this provider. It can be implemented in R or Python. Create a feature provider script \u00b6 Create your feature Python or R script called main.py or main.R in the correct folder, src/feature/[sensorname]/[providername]/ . RAPIDS automatically loads and executes it based on the config key [SRC_SCRIPT] you added in the last step. For our example, this script is: src/feature/phone_accelerometer/vega/main.py Implement your feature extraction code \u00b6 Every feature script ( main.[py|R] ) needs a [providername]_features function with specific parameters. RAPIDS calls this function with the sensor data ready to process and with other functions and arguments you will need. Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): # empty for now return ( your_features_df ) R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ){ # empty for now return ( your_features_df ) } Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example, this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R, this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The next step is to implement the code that computes your behavioral features in your provider script\u2019s function. As with any other script, this function can call other auxiliary methods, but in general terms, it should have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that the phone\u2019s battery, screen, and activity recognition data are given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but keep reading to understand why we need it. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and weekend basis for p01 . The labels are arbitrary, and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks , and once where time_segment is my_weekends . In this example, not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from that number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g., 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. The name of your features should only contain letters or numbers ( feature1 ) by convention. RAPIDS automatically adds the correct sensor and provider prefix; in our example, this prefix is phone_accelerometr_vega_ . PHONE_ACCELEROMETER Provider Example For your reference, this our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features import pandas as pd import numpy as np def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), open a new discussion in Github and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page. You can implement new features in Python or R scripts. You won\u2019t have to deal with time zones, dates, times, data cleaning, or preprocessing. The data that RAPIDS pipes to your feature extraction code are ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create your feature provider script Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 with a Python script that requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor of any device with a configuration entry in config.yaml : Smartphone (AWARE) Phone Accelerometer Phone Activity Recognition Phone Applications Crashes Phone Applications Foreground Phone Applications Notifications Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Keyboard Phone Light Phone Locations Phone Log Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Fitbit Data Yield Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Sleep Intraday Fitbit Steps Summary Fitbit Steps Intraday Empatica Empatica Accelerometer Empatica Heart Rate Empatica Temperature Empatica Electrodermal Activity Empatica Blood Volume Pulse Empatica Inter Beat Interval Empatica Tags","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step, you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : CONTAINER : accelerometer PROVIDERS : RAPIDS : # this is a feature provider COMPUTE : False ... PANDA : # this is another feature provider COMPUTE : False ... VEGA : # this is our new feature provider COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_SCRIPT : src/features/phone_accelerometer/vega/main.py Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string, or an array of any of such types. [SRC_SCRIPT] The relative path from RAPIDS\u2019 root folder to a script that computes the features for this provider. It can be implemented in R or Python.","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-feature-provider-script","text":"Create your feature Python or R script called main.py or main.R in the correct folder, src/feature/[sensorname]/[providername]/ . RAPIDS automatically loads and executes it based on the config key [SRC_SCRIPT] you added in the last step. For our example, this script is: src/feature/phone_accelerometer/vega/main.py","title":"Create a feature provider script"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"Every feature script ( main.[py|R] ) needs a [providername]_features function with specific parameters. RAPIDS calls this function with the sensor data ready to process and with other functions and arguments you will need. Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): # empty for now return ( your_features_df ) R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ){ # empty for now return ( your_features_df ) } Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example, this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R, this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The next step is to implement the code that computes your behavioral features in your provider script\u2019s function. As with any other script, this function can call other auxiliary methods, but in general terms, it should have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that the phone\u2019s battery, screen, and activity recognition data are given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but keep reading to understand why we need it. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and weekend basis for p01 . The labels are arbitrary, and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks , and once where time_segment is my_weekends . In this example, not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from that number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g., 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. The name of your features should only contain letters or numbers ( feature1 ) by convention. RAPIDS automatically adds the correct sensor and provider prefix; in our example, this prefix is phone_accelerometr_vega_ . PHONE_ACCELEROMETER Provider Example For your reference, this our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features import pandas as pd import numpy as np def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), open a new discussion in Github and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/empatica-accelerometer/","text":"Empatica Accelerometer \u00b6 Sensor parameters description for [EMPATICA_ACCELEROMETER] : Key Description [CONTAINER] Name of the CSV file containing accelerometer data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_accelerometer_raw.csv - data/raw/ { pid } /empatica_accelerometer_with_datetime.csv - data/interim/ { pid } /empatica_accelerometer_features/empatica_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_accelerometer.csv Parameters description for [EMPATICA_ACCELEROMETER][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ACCELEROMETER features from the DBDP provider [FEATURES] Features to be computed, see table below Features description for [EMPATICA_ACCELEROMETER][PROVIDERS][RAPDBDPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is too big to fit in memory. We are considering different alternatives to overcome this problem, if this is something you need, get in touch and we can discuss how to implement it.","title":"Empatica Accelerometer"},{"location":"features/empatica-accelerometer/#empatica-accelerometer","text":"Sensor parameters description for [EMPATICA_ACCELEROMETER] : Key Description [CONTAINER] Name of the CSV file containing accelerometer data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Accelerometer"},{"location":"features/empatica-accelerometer/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_accelerometer_raw.csv - data/raw/ { pid } /empatica_accelerometer_with_datetime.csv - data/interim/ { pid } /empatica_accelerometer_features/empatica_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_accelerometer.csv Parameters description for [EMPATICA_ACCELEROMETER][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ACCELEROMETER features from the DBDP provider [FEATURES] Features to be computed, see table below Features description for [EMPATICA_ACCELEROMETER][PROVIDERS][RAPDBDPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is too big to fit in memory. We are considering different alternatives to overcome this problem, if this is something you need, get in touch and we can discuss how to implement it.","title":"DBDP provider"},{"location":"features/empatica-blood-volume-pulse/","text":"Empatica Blood Volume Pulse \u00b6 Sensor parameters description for [EMPATICA_BLOOD_VOLUME_PULSE] : Key Description [CONTAINER] Name of the CSV file containing blood volume pulse data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_blood_volume_pulse_raw.csv - data/raw/ { pid } /empatica_blood_volume_pulse_with_datetime.csv - data/interim/ { pid } /empatica_blood_volume_pulse_features/empatica_blood_volume_pulse_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_blood_volume_pulse.csv Parameters description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_BLOOD_VOLUME_PULSE features from the DBDP provider [FEATURES] Features to be computed from blood volume pulse intraday data, see table below Features description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Feature Units Description maxbvp - The maximum blood volume pulse during a time segment. minbvp - The minimum blood volume pulse during a time segment. avgbvp - The average blood volume pulse during a time segment. medianbvp - The median of blood volume pulse during a time segment. modebvp - The mode of blood volume pulse during a time segment. stdbvp - The standard deviation of blood volume pulse during a time segment. diffmaxmodebvp - The difference between the maximum and mode blood volume pulse during a time segment. diffminmodebvp - The difference between the mode and minimum blood volume pulse during a time segment. entropybvp nats Shannon\u2019s entropy measurement based on blood volume pulse during a time segment. Assumptions/Observations For more information about BVP read this .","title":"Empatica Blood Volume Pulse"},{"location":"features/empatica-blood-volume-pulse/#empatica-blood-volume-pulse","text":"Sensor parameters description for [EMPATICA_BLOOD_VOLUME_PULSE] : Key Description [CONTAINER] Name of the CSV file containing blood volume pulse data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Blood Volume Pulse"},{"location":"features/empatica-blood-volume-pulse/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_blood_volume_pulse_raw.csv - data/raw/ { pid } /empatica_blood_volume_pulse_with_datetime.csv - data/interim/ { pid } /empatica_blood_volume_pulse_features/empatica_blood_volume_pulse_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_blood_volume_pulse.csv Parameters description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_BLOOD_VOLUME_PULSE features from the DBDP provider [FEATURES] Features to be computed from blood volume pulse intraday data, see table below Features description for [EMPATICA_BLOOD_VOLUME_PULSE][PROVIDERS][DBDP] : Feature Units Description maxbvp - The maximum blood volume pulse during a time segment. minbvp - The minimum blood volume pulse during a time segment. avgbvp - The average blood volume pulse during a time segment. medianbvp - The median of blood volume pulse during a time segment. modebvp - The mode of blood volume pulse during a time segment. stdbvp - The standard deviation of blood volume pulse during a time segment. diffmaxmodebvp - The difference between the maximum and mode blood volume pulse during a time segment. diffminmodebvp - The difference between the mode and minimum blood volume pulse during a time segment. entropybvp nats Shannon\u2019s entropy measurement based on blood volume pulse during a time segment. Assumptions/Observations For more information about BVP read this .","title":"DBDP provider"},{"location":"features/empatica-electrodermal-activity/","text":"Empatica Electrodermal Activity \u00b6 Sensor parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY] : Key Description [CONTAINER] Name of the CSV file containing electrodermal activity data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_electrodermal_activity_raw.csv - data/raw/ { pid } /empatica_electrodermal_activity_with_datetime.csv - data/interim/ { pid } /empatica_electrodermal_activity_features/empatica_electrodermal activity_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_electrodermal_activity.csv Parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ELECTRODERMAL_ACTIVITY features from the DBDP provider [FEATURES] Features to be computed from electrodermal activity intraday data, see table below Features description for [EMPATICA_ELECTRODERMAL ACTIVITY][PROVIDERS][DBDP] : Feature Units Description maxeda microsiemens The maximum electrical conductance during a time segment. mineda microsiemens The minimum electrical conductance during a time segment. avgeda microsiemens The average electrical conductance during a time segment. medianeda microsiemens The median of electrical conductance during a time segment. modeeda microsiemens The mode of electrical conductance during a time segment. stdeda microsiemens The standard deviation of electrical conductance during a time segment. diffmaxmodeeda microsiemens The difference between the maximum and mode electrical conductance during a time segment. diffminmodeeda microsiemens The difference between the mode and minimum electrical conductance during a time segment. entropyeda nats Shannon\u2019s entropy measurement based on electrical conductance during a time segment. Assumptions/Observations None","title":"Empatica Electrodermal Activity"},{"location":"features/empatica-electrodermal-activity/#empatica-electrodermal-activity","text":"Sensor parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY] : Key Description [CONTAINER] Name of the CSV file containing electrodermal activity data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Electrodermal Activity"},{"location":"features/empatica-electrodermal-activity/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_electrodermal_activity_raw.csv - data/raw/ { pid } /empatica_electrodermal_activity_with_datetime.csv - data/interim/ { pid } /empatica_electrodermal_activity_features/empatica_electrodermal activity_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_electrodermal_activity.csv Parameters description for [EMPATICA_ELECTRODERMAL_ACTIVITY][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_ELECTRODERMAL_ACTIVITY features from the DBDP provider [FEATURES] Features to be computed from electrodermal activity intraday data, see table below Features description for [EMPATICA_ELECTRODERMAL ACTIVITY][PROVIDERS][DBDP] : Feature Units Description maxeda microsiemens The maximum electrical conductance during a time segment. mineda microsiemens The minimum electrical conductance during a time segment. avgeda microsiemens The average electrical conductance during a time segment. medianeda microsiemens The median of electrical conductance during a time segment. modeeda microsiemens The mode of electrical conductance during a time segment. stdeda microsiemens The standard deviation of electrical conductance during a time segment. diffmaxmodeeda microsiemens The difference between the maximum and mode electrical conductance during a time segment. diffminmodeeda microsiemens The difference between the mode and minimum electrical conductance during a time segment. entropyeda nats Shannon\u2019s entropy measurement based on electrical conductance during a time segment. Assumptions/Observations None","title":"DBDP provider"},{"location":"features/empatica-heartrate/","text":"Empatica Heart Rate \u00b6 Sensor parameters description for [EMPATICA_HEARTRATE] : Key Description [CONTAINER] Name of the CSV file containing heart rate data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_heartrate_raw.csv - data/raw/ { pid } /empatica_heartrate_with_datetime.csv - data/interim/ { pid } /empatica_heartrate_features/empatica_heartrate_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_heartrate.csv Parameters description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_HEARTRATE features from the DBDP provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Feature Units Description maxhr beats The maximum heart rate during a time segment. minhr beats The minimum heart rate during a time segment. avghr beats The average heart rate during a time segment. medianhr beats The median of heart rate during a time segment. modehr beats The mode of heart rate during a time segment. stdhr beats The standard deviation of heart rate during a time segment. diffmaxmodehr beats The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. Assumptions/Observations We extract the previous features based on the average heart rate values computed in 10-second windows .","title":"Empatica Heart Rate"},{"location":"features/empatica-heartrate/#empatica-heart-rate","text":"Sensor parameters description for [EMPATICA_HEARTRATE] : Key Description [CONTAINER] Name of the CSV file containing heart rate data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Heart Rate"},{"location":"features/empatica-heartrate/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_heartrate_raw.csv - data/raw/ { pid } /empatica_heartrate_with_datetime.csv - data/interim/ { pid } /empatica_heartrate_features/empatica_heartrate_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_heartrate.csv Parameters description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_HEARTRATE features from the DBDP provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [EMPATICA_HEARTRATE][PROVIDERS][DBDP] : Feature Units Description maxhr beats The maximum heart rate during a time segment. minhr beats The minimum heart rate during a time segment. avghr beats The average heart rate during a time segment. medianhr beats The median of heart rate during a time segment. modehr beats The mode of heart rate during a time segment. stdhr beats The standard deviation of heart rate during a time segment. diffmaxmodehr beats The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. Assumptions/Observations We extract the previous features based on the average heart rate values computed in 10-second windows .","title":"DBDP provider"},{"location":"features/empatica-inter-beat-interval/","text":"Empatica Inter Beat Interval \u00b6 Sensor parameters description for [EMPATICA_INTER_BEAT_INTERVAL] : Key Description [CONTAINER] Name of the CSV file containing inter beat interval data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_inter_beat_interval_raw.csv - data/raw/ { pid } /empatica_inter_beat_interval_with_datetime.csv - data/interim/ { pid } /empatica_inter_beat_interval_features/empatica_inter_beat_interval_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_inter_beat_interval.csv Parameters description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_INTER_BEAT_INTERVAL features from the DBDP provider [FEATURES] Features to be computed from inter beat interval intraday data, see table below Features description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Feature Units Description maxibi seconds The maximum inter beat interval during a time segment. minibi seconds The minimum inter beat interval during a time segment. avgibi seconds The average inter beat interval during a time segment. medianibi seconds The median of inter beat interval during a time segment. modeibi seconds The mode of inter beat interval during a time segment. stdibi seconds The standard deviation of inter beat interval during a time segment. diffmaxmodeibi seconds The difference between the maximum and mode inter beat interval during a time segment. diffminmodeibi seconds The difference between the mode and minimum inter beat interval during a time segment. entropyibi nats Shannon\u2019s entropy measurement based on inter beat interval during a time segment. Assumptions/Observations For more information about IBI read this .","title":"Empatica Inter Beat Interval"},{"location":"features/empatica-inter-beat-interval/#empatica-inter-beat-interval","text":"Sensor parameters description for [EMPATICA_INTER_BEAT_INTERVAL] : Key Description [CONTAINER] Name of the CSV file containing inter beat interval data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Inter Beat Interval"},{"location":"features/empatica-inter-beat-interval/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_inter_beat_interval_raw.csv - data/raw/ { pid } /empatica_inter_beat_interval_with_datetime.csv - data/interim/ { pid } /empatica_inter_beat_interval_features/empatica_inter_beat_interval_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_inter_beat_interval.csv Parameters description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_INTER_BEAT_INTERVAL features from the DBDP provider [FEATURES] Features to be computed from inter beat interval intraday data, see table below Features description for [EMPATICA_INTER_BEAT_INTERVAL][PROVIDERS][DBDP] : Feature Units Description maxibi seconds The maximum inter beat interval during a time segment. minibi seconds The minimum inter beat interval during a time segment. avgibi seconds The average inter beat interval during a time segment. medianibi seconds The median of inter beat interval during a time segment. modeibi seconds The mode of inter beat interval during a time segment. stdibi seconds The standard deviation of inter beat interval during a time segment. diffmaxmodeibi seconds The difference between the maximum and mode inter beat interval during a time segment. diffminmodeibi seconds The difference between the mode and minimum inter beat interval during a time segment. entropyibi nats Shannon\u2019s entropy measurement based on inter beat interval during a time segment. Assumptions/Observations For more information about IBI read this .","title":"DBDP provider"},{"location":"features/empatica-tags/","text":"Empatica Tags \u00b6 Sensor parameters description for [EMPATICA_TAGS] : Key Description [CONTAINER] Name of the CSV file containing tags data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. Note No feature providers have been implemented for this sensor yet, however you can implement your own features . To know more about tags read this .","title":"Empatica Tags"},{"location":"features/empatica-tags/#empatica-tags","text":"Sensor parameters description for [EMPATICA_TAGS] : Key Description [CONTAINER] Name of the CSV file containing tags data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. Note No feature providers have been implemented for this sensor yet, however you can implement your own features . To know more about tags read this .","title":"Empatica Tags"},{"location":"features/empatica-temperature/","text":"Empatica Temperature \u00b6 Sensor parameters description for [EMPATICA_TEMPERATURE] : Key Description [CONTAINER] Name of the CSV file containing temperature data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute. DBDP provider \u00b6 Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_temperature_raw.csv - data/raw/ { pid } /empatica_temperature_with_datetime.csv - data/interim/ { pid } /empatica_temperature_features/empatica_temperature_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_temperature.csv Parameters description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_TEMPERATURE features from the DBDP provider [FEATURES] Features to be computed from temperature intraday data, see table below Features description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Feature Units Description maxtemp degrees C The maximum temperature during a time segment. mintemp degrees C The minimum temperature during a time segment. avgtemp degrees C The average temperature during a time segment. mediantemp degrees C The median of temperature during a time segment. modetemp degrees C The mode of temperature during a time segment. stdtemp degrees C The standard deviation of temperature during a time segment. diffmaxmodetemp degrees C The difference between the maximum and mode temperature during a time segment. diffminmodetemp degrees C The difference between the mode and minimum temperature during a time segment. entropytemp nats Shannon\u2019s entropy measurement based on temperature during a time segment. Assumptions/Observations None","title":"Empatica Temperature"},{"location":"features/empatica-temperature/#empatica-temperature","text":"Sensor parameters description for [EMPATICA_TEMPERATURE] : Key Description [CONTAINER] Name of the CSV file containing temperature data that is compressed inside an Empatica zip file. Since these zip files are created automatically by Empatica, there is no need to change the value of this attribute.","title":"Empatica Temperature"},{"location":"features/empatica-temperature/#dbdp-provider","text":"Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /empatica_temperature_raw.csv - data/raw/ { pid } /empatica_temperature_with_datetime.csv - data/interim/ { pid } /empatica_temperature_features/empatica_temperature_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /empatica_temperature.csv Parameters description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Key Description [COMPUTE] Set to True to extract EMPATICA_TEMPERATURE features from the DBDP provider [FEATURES] Features to be computed from temperature intraday data, see table below Features description for [EMPATICA_TEMPERATURE][PROVIDERS][DBDP] : Feature Units Description maxtemp degrees C The maximum temperature during a time segment. mintemp degrees C The minimum temperature during a time segment. avgtemp degrees C The average temperature during a time segment. mediantemp degrees C The median of temperature during a time segment. modetemp degrees C The mode of temperature during a time segment. stdtemp degrees C The standard deviation of temperature during a time segment. diffmaxmodetemp degrees C The difference between the maximum and mode temperature during a time segment. diffminmodetemp degrees C The difference between the mode and minimum temperature during a time segment. entropytemp nats Shannon\u2019s entropy measurement based on temperature during a time segment. Assumptions/Observations None","title":"DBDP provider"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 A behavioral feature is a metric computed from raw sensor data quantifying the behavior of a participant. For example, the time spent at home computed based on location data. These are also known as digital biomarkers. RAPIDS\u2019 config.yaml has a section for each supported device/sensor (e.g., PHONE_ACCELEROMETER , FITBIT_STEPS , EMPATICA_HEARTRATE ). These sections follow a similar structure, and they can have one or more feature PROVIDERS , that compute one or more behavioral features. You will modify the parameters of these PROVIDERS to obtain features from different mobile sensors. We\u2019ll use PHONE_ACCELEROMETER as an example to explain this further. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. In short, to extract features offered by a provider, you need to set its [COMPUTE] flag to TRUE , configure any of its parameters, and execute RAPIDS. Explaining the config.yaml sensor sections with an example \u00b6 Each sensor section follows the same structure. Click on the numbered markers to know more. PHONE_ACCELEROMETER : # (1) CONTAINER : accelerometer # (2) PROVIDERS : # (3) RAPIDS : COMPUTE : False # (4) FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_SCRIPT : src/features/phone_accelerometer/rapids/main.py PANDA : COMPUTE : False VALID_SENSED_MINUTES : False FEATURES : # (5) exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] # (6) SRC_SCRIPT : src/features/phone_accelerometer/panda/main.py Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda . These are the descriptions of each marker for accessibility: Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"A behavioral feature is a metric computed from raw sensor data quantifying the behavior of a participant. For example, the time spent at home computed based on location data. These are also known as digital biomarkers. RAPIDS\u2019 config.yaml has a section for each supported device/sensor (e.g., PHONE_ACCELEROMETER , FITBIT_STEPS , EMPATICA_HEARTRATE ). These sections follow a similar structure, and they can have one or more feature PROVIDERS , that compute one or more behavioral features. You will modify the parameters of these PROVIDERS to obtain features from different mobile sensors. We\u2019ll use PHONE_ACCELEROMETER as an example to explain this further. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. In short, to extract features offered by a provider, you need to set its [COMPUTE] flag to TRUE , configure any of its parameters, and execute RAPIDS.","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#explaining-the-configyaml-sensor-sections-with-an-example","text":"Each sensor section follows the same structure. Click on the numbered markers to know more. PHONE_ACCELEROMETER : # (1) CONTAINER : accelerometer # (2) PROVIDERS : # (3) RAPIDS : COMPUTE : False # (4) FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_SCRIPT : src/features/phone_accelerometer/rapids/main.py PANDA : COMPUTE : False VALID_SENSED_MINUTES : False FEATURES : # (5) exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] # (6) SRC_SCRIPT : src/features/phone_accelerometer/panda/main.py Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda . These are the descriptions of each marker for accessibility: Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Explaining the config.yaml sensor sections with an example"},{"location":"features/fitbit-calories-intraday/","text":"Fitbit Calories Intraday \u00b6 Sensor parameters description for [FITBIT_CALORIES_INTRADAY] : Key Description [CONTAINER] Container where your calories intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_calories_intraday_raw.csv - data/raw/ { pid } /fitbit_calories_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_calories_intraday_features/fitbit_calories_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_calories_intraday.csv Parameters description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_CALORIES_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from calories intraday data, see table below [EPISODE_TYPE] RAPIDS will compute features for any episodes in this list. There are seven types of episodes defined as consecutive appearances of a label. Four are based on the activity level labels provided by Fitbit: sedentary , lightly active , fairly active , and very active . One is defined by RAPIDS as moderate to vigorous physical activity MVPA episodes that are based on all fairly active , and very active labels. Two are defined by the user based on a threshold that divides low or high MET (metabolic equivalent) episodes. EPISODE_TIME_THRESHOLD Any consecutive rows of the same [EPISODE_TYPE] will be considered a single episode if the time difference between them is less or equal than this threshold in minutes [EPISODE_MET_THRESHOLD] Any 1-minute calorie data chunk with a MET value equal or higher than this threshold will be considered a high MET episode and low MET otherwise. The default value is 3 [EPISODE_MVPA_CATEGORIES] The Fitbit level labels that are considered part of a moderate to vigorous physical activity episode. One or more of sedentary , lightly active , fairly active , and very active . The default are fairly active and very active [EPISODE_REFERENCE_TIME] Reference time for the start/end time features. MIDNIGHT sets the reference time to 00:00 of each day, START_OF_THE_SEGMENT sets the reference time to the start of the time segment (useful when a segment is shorter than a day or spans multiple days) Features description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description starttimefirstepisode EPISODE_TYPE minutes Start time of the first episode of type [EPISODE_TYPE] endtimefirstepisode EPISODE_TYPE minutes End time of the first episode of type [EPISODE_TYPE] starttimelastepisode EPISODE_TYPE minutes Start time of the last episode of type [EPISODE_TYPE] endtimelastepisode EPISODE_TYPE minutes End time of the last episode of type [EPISODE_TYPE] starttimelongestepisode EPISODE_TYPE minutes Start time of the longest episode of type [EPISODE_TYPE] endtimelongestepisode EPISODE_TYPE minutes End time of the longest episode of type [EPISODE_TYPE] countepisode EPISODE_TYPE episodes The number of episodes of type [EPISODE_TYPE] sumdurationepisode EPISODE_TYPE minutes The sum of the duration of episodes of type [EPISODE_TYPE] avgdurationepisode EPISODE_TYPE minutes The average of the duration of episodes of type [EPISODE_TYPE] maxdurationepisode EPISODE_TYPE minutes The maximum of the duration of episodes of type [EPISODE_TYPE] mindurationepisode EPISODE_TYPE minutes The minimum of the duration of episodes of type [EPISODE_TYPE] stddurationepisode EPISODE_TYPE minutes The standard deviation of the duration of episodes of type [EPISODE_TYPE] summet EPISODE_TYPE METs The sum of all METs during episodes of type [EPISODE_TYPE] avgmet EPISODE_TYPE METs The average of all METs during episodes of type [EPISODE_TYPE] maxmet EPISODE_TYPE METs The maximum of all METs during episodes of type [EPISODE_TYPE] minmet EPISODE_TYPE METs The minimum of all METs during episodes of type [EPISODE_TYPE] stdmet EPISODE_TYPE METs The standard deviation of all METs during episodes of type [EPISODE_TYPE] sumcalories EPISODE_TYPE calories The sum of all calories during episodes of type [EPISODE_TYPE] avgcalories EPISODE_TYPE calories The average of all calories during episodes of type [EPISODE_TYPE] maxcalories EPISODE_TYPE calories The maximum of all calories during episodes of type [EPISODE_TYPE] mincalories EPISODE_TYPE calories The minimum of all calories during episodes of type [EPISODE_TYPE] stdcalories EPISODE_TYPE calories The standard deviation of all calories during episodes of type [EPISODE_TYPE] Assumptions/Observations These features are based on intraday calories data that is usually obtained in 1-minute chunks from Fitbit\u2019s API. The MET value returned by Fitbit is divided by 10 Take into account that the intraday data returned by Fitbit can contain time series for calories burned inclusive of BMR, tracked activity, and manually logged activities.","title":"Fitbit Calories Intraday"},{"location":"features/fitbit-calories-intraday/#fitbit-calories-intraday","text":"Sensor parameters description for [FITBIT_CALORIES_INTRADAY] : Key Description [CONTAINER] Container where your calories intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Calories Intraday"},{"location":"features/fitbit-calories-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_calories_intraday_raw.csv - data/raw/ { pid } /fitbit_calories_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_calories_intraday_features/fitbit_calories_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_calories_intraday.csv Parameters description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_CALORIES_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from calories intraday data, see table below [EPISODE_TYPE] RAPIDS will compute features for any episodes in this list. There are seven types of episodes defined as consecutive appearances of a label. Four are based on the activity level labels provided by Fitbit: sedentary , lightly active , fairly active , and very active . One is defined by RAPIDS as moderate to vigorous physical activity MVPA episodes that are based on all fairly active , and very active labels. Two are defined by the user based on a threshold that divides low or high MET (metabolic equivalent) episodes. EPISODE_TIME_THRESHOLD Any consecutive rows of the same [EPISODE_TYPE] will be considered a single episode if the time difference between them is less or equal than this threshold in minutes [EPISODE_MET_THRESHOLD] Any 1-minute calorie data chunk with a MET value equal or higher than this threshold will be considered a high MET episode and low MET otherwise. The default value is 3 [EPISODE_MVPA_CATEGORIES] The Fitbit level labels that are considered part of a moderate to vigorous physical activity episode. One or more of sedentary , lightly active , fairly active , and very active . The default are fairly active and very active [EPISODE_REFERENCE_TIME] Reference time for the start/end time features. MIDNIGHT sets the reference time to 00:00 of each day, START_OF_THE_SEGMENT sets the reference time to the start of the time segment (useful when a segment is shorter than a day or spans multiple days) Features description for [FITBIT_CALORIES_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description starttimefirstepisode EPISODE_TYPE minutes Start time of the first episode of type [EPISODE_TYPE] endtimefirstepisode EPISODE_TYPE minutes End time of the first episode of type [EPISODE_TYPE] starttimelastepisode EPISODE_TYPE minutes Start time of the last episode of type [EPISODE_TYPE] endtimelastepisode EPISODE_TYPE minutes End time of the last episode of type [EPISODE_TYPE] starttimelongestepisode EPISODE_TYPE minutes Start time of the longest episode of type [EPISODE_TYPE] endtimelongestepisode EPISODE_TYPE minutes End time of the longest episode of type [EPISODE_TYPE] countepisode EPISODE_TYPE episodes The number of episodes of type [EPISODE_TYPE] sumdurationepisode EPISODE_TYPE minutes The sum of the duration of episodes of type [EPISODE_TYPE] avgdurationepisode EPISODE_TYPE minutes The average of the duration of episodes of type [EPISODE_TYPE] maxdurationepisode EPISODE_TYPE minutes The maximum of the duration of episodes of type [EPISODE_TYPE] mindurationepisode EPISODE_TYPE minutes The minimum of the duration of episodes of type [EPISODE_TYPE] stddurationepisode EPISODE_TYPE minutes The standard deviation of the duration of episodes of type [EPISODE_TYPE] summet EPISODE_TYPE METs The sum of all METs during episodes of type [EPISODE_TYPE] avgmet EPISODE_TYPE METs The average of all METs during episodes of type [EPISODE_TYPE] maxmet EPISODE_TYPE METs The maximum of all METs during episodes of type [EPISODE_TYPE] minmet EPISODE_TYPE METs The minimum of all METs during episodes of type [EPISODE_TYPE] stdmet EPISODE_TYPE METs The standard deviation of all METs during episodes of type [EPISODE_TYPE] sumcalories EPISODE_TYPE calories The sum of all calories during episodes of type [EPISODE_TYPE] avgcalories EPISODE_TYPE calories The average of all calories during episodes of type [EPISODE_TYPE] maxcalories EPISODE_TYPE calories The maximum of all calories during episodes of type [EPISODE_TYPE] mincalories EPISODE_TYPE calories The minimum of all calories during episodes of type [EPISODE_TYPE] stdcalories EPISODE_TYPE calories The standard deviation of all calories during episodes of type [EPISODE_TYPE] Assumptions/Observations These features are based on intraday calories data that is usually obtained in 1-minute chunks from Fitbit\u2019s API. The MET value returned by Fitbit is divided by 10 Take into account that the intraday data returned by Fitbit can contain time series for calories burned inclusive of BMR, tracked activity, and manually logged activities.","title":"RAPIDS provider"},{"location":"features/fitbit-data-yield/","text":"Fitbit Data Yield \u00b6 We use Fitbit heart rate intraday data to extract data yield features. Fitbit data yield features can be used to remove rows ( time segments ) that do not contain enough Fitbit data. You should decide what is your \u201cenough\u201d threshold depending on the time a participant was supposed to be wearing their Fitbit, the length of your study, and the rates of missing data that your analysis could handle. Why is Fitbit data yield important? Imagine that you want to extract FITBIT_STEPS_SUMMARY features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the Fitbit logged 6k as the total step count and the heart rate sensor logged 24 hours of data and on day 2 the Fitbit logged 101 as the total step count and the heart rate sensor logged 2 hours of data. It\u2019s very likely that on day 2 you walked during the other 22 hours so including this day in your analysis could bias your results. Sensor parameters description for [FITBIT_DATA_YIELD] : Key Description [SENSORS] The Fitbit sensor we considered for calculating the Fitbit data yield features. We only support FITBIT_HEARTRATE_INTRADAY since sleep data is commonly collected only overnight, and step counts are 0 even when not wearing the Fitbit device. RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when Fitbit heart rate intraday sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_data_yield_features/fitbit_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_data_yield.csv Parameters description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a . We assume your Fitbit intraday data was sampled (requested form the Fitbit API) at 1 minute intervals, if the interval is longer, for example 15 minutes, you need to take into account that valid minutes and valid hours ratios are going to be small (for example you would have at most 4 \u201cminutes\u201d of data per hour because you would have four 15-minute windows) and so you should adjust your thresholds to include and exclude rows accordingly. If you are in this situation, get in touch with us, we could implement this use case but we are not sure there is enough demand for it at the moment since you can control the sampling rate of the data you request from Fitbit API.","title":"Fitbit Data Yield"},{"location":"features/fitbit-data-yield/#fitbit-data-yield","text":"We use Fitbit heart rate intraday data to extract data yield features. Fitbit data yield features can be used to remove rows ( time segments ) that do not contain enough Fitbit data. You should decide what is your \u201cenough\u201d threshold depending on the time a participant was supposed to be wearing their Fitbit, the length of your study, and the rates of missing data that your analysis could handle. Why is Fitbit data yield important? Imagine that you want to extract FITBIT_STEPS_SUMMARY features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the Fitbit logged 6k as the total step count and the heart rate sensor logged 24 hours of data and on day 2 the Fitbit logged 101 as the total step count and the heart rate sensor logged 2 hours of data. It\u2019s very likely that on day 2 you walked during the other 22 hours so including this day in your analysis could bias your results. Sensor parameters description for [FITBIT_DATA_YIELD] : Key Description [SENSORS] The Fitbit sensor we considered for calculating the Fitbit data yield features. We only support FITBIT_HEARTRATE_INTRADAY since sleep data is commonly collected only overnight, and step counts are 0 even when not wearing the Fitbit device.","title":"Fitbit Data Yield"},{"location":"features/fitbit-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when Fitbit heart rate intraday sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] Available time segments and platforms Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_data_yield_features/fitbit_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_data_yield.csv Parameters description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [FITBIT_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a . We assume your Fitbit intraday data was sampled (requested form the Fitbit API) at 1 minute intervals, if the interval is longer, for example 15 minutes, you need to take into account that valid minutes and valid hours ratios are going to be small (for example you would have at most 4 \u201cminutes\u201d of data per hour because you would have four 15-minute windows) and so you should adjust your thresholds to include and exclude rows accordingly. If you are in this situation, get in touch with us, we could implement this use case but we are not sure there is enough demand for it at the moment since you can control the sampling rate of the data you request from Fitbit API.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [CONTAINER] Container where your heart rate intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [CONTAINER] Container where your heart rate intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [CONTAINER] Container where your heart rate summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [CONTAINER] Container where your heart rate summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-intraday/","text":"Fitbit Sleep Intraday \u00b6 Sensor parameters description for [FITBIT_SLEEP_INTRADAY] : Key Description [CONTAINER] Container where your sleep intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes LEVELS_AND_TYPES features grouping all levels together in a single all category. [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS][LEVELS_AND_TYPES] : Feature Units Description countepisode [LEVEL][TYPE] episodes Number of [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. sumduration [LEVEL][TYPE] minutes Total duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. maxduration [LEVEL][TYPE] minutes Longest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. minduration [LEVEL][TYPE] minutes Shortest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. avgduration [LEVEL][TYPE] minutes Average duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. medianduration [LEVEL][TYPE] minutes Median duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. stdduration [LEVEL][TYPE] minutes Standard deviation duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_LEVELS] : Feature Units Description ratiocount [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem ? (e.g., \\(countepisode[remstages][all] / countepisode[all][all]\\) ) ratioduration [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem ? (e.g., \\(sumduration[remstages][all] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_TYPES] : Feature Units Description ratiocountmain - Ratio between the count of all main episodes (independently of the levels inside) divided by the count of all main and nap episodes. This answers the question: what percentage of all sleep episodes ( main and nap ) were main ? We do not provide the ratio for nap because is complementary. ( \\(countepisode[all][main] / countepisode[all][all]\\) ) ratiodurationmain - Ratio between the duration of all main episodes (independently of the levels inside) divided by the duration of all main and nap episodes. This answers the question: what percentage of all sleep time ( main and nap ) was main ? We do not provide the ratio for nap because is complementary. ( \\(sumduration[all][main] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_LEVELS] : Feature Units Description ratiocountmainwithin [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] during main sleep divided by the count of episodes of a single sleep [LEVEL] during main and nap . This answers the question: are rem episodes more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) ratiodurationmainwithin [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] during main sleep divided by the duration of episodes of a single sleep [LEVEL] during main and nap . This answers the question: is rem time more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_TYPES] : Feature Units Description ratiocount [LEVEL] within [TYPE] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem during main / nap sleep time? (e.g., \\(countepisode[remstages][main] / countepisode[all][main]\\) ) ratioduration [LEVEL] within [TYPE] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem during main / nap sleep time? (e.g., \\(sumduration[remstages][main] / sumduration[all][main]\\) ) Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Features listed in [LEVELS_AND_TYPES] are computed for any levels and types listed in [SLEEP_LEVELS] or [SLEEP_TYPES] . For example if STAGES only contains [rem, light] you will not get countepisode[wake|deep][TYPE] or sum, max, min, avg, median, or std duration . Levels or types in these lists do not influence RATIOS or ROUTINE features. Any [LEVEL] grouping is done within the elements of each class CLASSIC , STAGES , and UNIFIED . That is, we never combine CLASSIC or STAGES types to compute features. The categories for all levels (when INCLUDE_ALL_GROUPS is True ) and all SLEEP_TYPES are not considered for RATIOS features as they are always 1. These features can be computed in time segments of any length, but only the 1-minute sleep chunks within each segment instance will be used. PRICE provider \u00b6 Understanding PRICE features This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. Available time segments Available for any time segments larger or equal to one day File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_parsed.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the PRICE provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes avgdurationallmain [DAY_TYPE] features grouping all levels together in a single all category. [DAY_TYPE] The features of this provider can be computed using daily averages/standard deviations that were extracted on WEEKEND days only, WEEK days only, or ALL days [LAST_NIGHT_END] Only main sleep episodes that start within the LNE-LNE interval [ LAST_NIGHT_END , LAST_NIGHT_END + 23H 59M 59S] are taken into account to compute the features described below. [LAST_NIGHT_END] is a number ranging from 0 (midnight) to 1439 (23:59). Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Feature Units Description avgduration [LEVEL] main [DAY_TYPE] minutes Average duration of daily sleep chunks of a LEVEL . Use the DAY_TYPE flag to include daily durations from weekend days only, weekdays, or both. Use [LEVEL] to group all levels in a single all category. avgratioduration [LEVEL] withinmain [DAY_TYPE] - Average of the daily ratio between the duration of sleep chunks of a LEVEL and total duration of all main sleep episodes in a day. When INCLUDE_ALL_GROUPS is True the all LEVEL is ignored since this feature is always 1. Use the DAY_TYPE flag to include start times from weekend days only, weekdays, or both. avgstarttimeofepisodemain [DAY_TYPE] minutes Average of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgendtimeofepisodemain [DAY_TYPE] minutes Average of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgmidpointofepisodemain [DAY_TYPE] minutes Average of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdstarttimeofepisodemain [DAY_TYPE] minutes Standard deviation of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdendtimeofepisodemain [DAY_TYPE] minutes Standard deviation of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdmidpointofepisodemain [DAY_TYPE] minutes Standard deviation of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. socialjetlag minutes Difference in minutes between the avgmidpointofepisodemain of weekends and weekdays that belong to each time segment instance. If your time segment does not contain at least one week day and one weekend day this feature will be NA. rmssdmeanstarttimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmeanendtimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmeanmidpointofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s midpointofepisodemain (mid time between bedtime and wake time) changed from night to night. rmssdmedianstarttimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmedianendtimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmedianmidpointofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s midpointofepisodemain (average mid time between bedtime and wake time) changed from night to night. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. We recommend you use periodic segments that start in the morning so RAPIDS can chunk and group sleep episodes overnight. Shifted segments (as any other segments) are labelled based on their start and end date times. avgstarttime... and avgendtime... are roughly equivalent to an average bed and awake time only if you are using shifted segments. The features of this provider are only available on time segments that are longer than 24 hours because they are based on descriptive statistics computed across daily values. Even though Fitbit provides 2 types of sleep episodes ( main and nap ), only main sleep episodes are considered. The reference point for all times is 00:00 of the first day in the LNE-LNE interval. Sleep episodes are formed by 1-minute chunks that we group overnight starting from today\u2019s LNE and ending on tomorrow\u2019s LNE or the end of that segment (whatever is first). The features avgstarttime... and avgendtime... are the average of the first and last sleep episode across every LNE-LNE interval within a segment ( avgmidtime... is the mid point between start and end). Therefore, only segments longer than 24hrs will be averaged across more than one LNE-LNE interval. socialjetlag is only available on segment instances equal or longer than 48hrs that contain at least one weekday day and one weekend day, for example seven-day (weekly) segments.","title":"Fitbit Sleep Intraday"},{"location":"features/fitbit-sleep-intraday/#fitbit-sleep-intraday","text":"Sensor parameters description for [FITBIT_SLEEP_INTRADAY] : Key Description [CONTAINER] Container where your sleep intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Sleep Intraday"},{"location":"features/fitbit-sleep-intraday/#rapids-provider","text":"Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes LEVELS_AND_TYPES features grouping all levels together in a single all category. [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS][LEVELS_AND_TYPES] : Feature Units Description countepisode [LEVEL][TYPE] episodes Number of [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. sumduration [LEVEL][TYPE] minutes Total duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. maxduration [LEVEL][TYPE] minutes Longest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. minduration [LEVEL][TYPE] minutes Shortest duration of any [LEVEL][TYPE] sleep episode. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. avgduration [LEVEL][TYPE] minutes Average duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. medianduration [LEVEL][TYPE] minutes Median duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. stdduration [LEVEL][TYPE] minutes Standard deviation duration of all [LEVEL][TYPE] sleep episodes. [LEVEL] is one of [SLEEP_LEVELS] (e.g. awake-classic or rem-stages) and [TYPE] is one of [SLEEP_TYPES] (e.g. main). [LEVEL] can also be all when INCLUDE_ALL_GROUPS is True, which ignores the levels and groups by sleep types. Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_LEVELS] : Feature Units Description ratiocount [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem ? (e.g., \\(countepisode[remstages][all] / countepisode[all][all]\\) ) ratioduration [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during both main and nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem ? (e.g., \\(sumduration[remstages][all] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [ACROSS_TYPES] : Feature Units Description ratiocountmain - Ratio between the count of all main episodes (independently of the levels inside) divided by the count of all main and nap episodes. This answers the question: what percentage of all sleep episodes ( main and nap ) were main ? We do not provide the ratio for nap because is complementary. ( \\(countepisode[all][main] / countepisode[all][all]\\) ) ratiodurationmain - Ratio between the duration of all main episodes (independently of the levels inside) divided by the duration of all main and nap episodes. This answers the question: what percentage of all sleep time ( main and nap ) was main ? We do not provide the ratio for nap because is complementary. ( \\(sumduration[all][main] / sumduration[all][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_LEVELS] : Feature Units Description ratiocountmainwithin [LEVEL] - Ratio between the count of episodes of a single sleep [LEVEL] during main sleep divided by the count of episodes of a single sleep [LEVEL] during main and nap . This answers the question: are rem episodes more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) ratiodurationmainwithin [LEVEL] - Ratio between the duration of episodes of a single sleep [LEVEL] during main sleep divided by the duration of episodes of a single sleep [LEVEL] during main and nap . This answers the question: is rem time more frequent during main than nap sleep? We do not provide the ratio for nap because is complementary. ( \\(countepisode[remstages][main] / countepisode[remstages][all]\\) ) Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][RAPIDS] RATIOS [WITHIN_TYPES] : Feature Units Description ratiocount [LEVEL] within [TYPE] - Ratio between the count of episodes of a single sleep [LEVEL] and the count of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem episodes were rem during main / nap sleep time? (e.g., \\(countepisode[remstages][main] / countepisode[all][main]\\) ) ratioduration [LEVEL] within [TYPE] - Ratio between the duration of episodes of a single sleep [LEVEL] and the duration of all episodes of all levels during either main or nap sleep types. This answers the question: what percentage of all wake , deep , light , and rem time was rem during main / nap sleep time? (e.g., \\(sumduration[remstages][main] / sumduration[all][main]\\) ) Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments for the RAPIDS provider. Features listed in [LEVELS_AND_TYPES] are computed for any levels and types listed in [SLEEP_LEVELS] or [SLEEP_TYPES] . For example if STAGES only contains [rem, light] you will not get countepisode[wake|deep][TYPE] or sum, max, min, avg, median, or std duration . Levels or types in these lists do not influence RATIOS or ROUTINE features. Any [LEVEL] grouping is done within the elements of each class CLASSIC , STAGES , and UNIFIED . That is, we never combine CLASSIC or STAGES types to compute features. The categories for all levels (when INCLUDE_ALL_GROUPS is True ) and all SLEEP_TYPES are not considered for RATIOS features as they are always 1. These features can be computed in time segments of any length, but only the 1-minute sleep chunks within each segment instance will be used.","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-intraday/#price-provider","text":"Understanding PRICE features This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. Available time segments Available for any time segments larger or equal to one day File Sequence - data/raw/ { pid } /fitbit_sleep_intraday_raw.csv - data/raw/ { pid } /fitbit_sleep_intraday_parsed.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled.csv - data/interim/ { pid } /fitbit_sleep_intraday_episodes_resampled_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_intraday_features/fitbit_sleep_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_intraday.csv Parameters description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_INTRADAY features from the PRICE provider [FEATURES] Features to be computed from sleep intraday data, see table below [SLEEP_LEVELS] Fitbit\u2019s sleep API Version 1 only provides CLASSIC records. However, Version 1.2 provides 2 types of records: CLASSIC and STAGES . STAGES is only available in devices with a heart rate sensor and even those devices will fail to report it if the battery is low or the device is not tight enough. While CLASSIC contains 3 sleep levels ( awake , restless , and asleep ), STAGES contains 4 sleep levels ( wake , deep , light , rem ). To make it consistent, RAPIDS groups them into 2 UNIFIED sleep levels: awake ( CLASSIC : awake and restless ; STAGES : wake ) and asleep ( CLASSIC : asleep ; STAGES : deep , light , and rem ). In this section, there is a boolean flag named INCLUDE_ALL_GROUPS that if set to TRUE, computes avgdurationallmain [DAY_TYPE] features grouping all levels together in a single all category. [DAY_TYPE] The features of this provider can be computed using daily averages/standard deviations that were extracted on WEEKEND days only, WEEK days only, or ALL days [LAST_NIGHT_END] Only main sleep episodes that start within the LNE-LNE interval [ LAST_NIGHT_END , LAST_NIGHT_END + 23H 59M 59S] are taken into account to compute the features described below. [LAST_NIGHT_END] is a number ranging from 0 (midnight) to 1439 (23:59). Features description for [FITBIT_SLEEP_INTRADAY][PROVIDERS][PRICE] : Feature Units Description avgduration [LEVEL] main [DAY_TYPE] minutes Average duration of daily sleep chunks of a LEVEL . Use the DAY_TYPE flag to include daily durations from weekend days only, weekdays, or both. Use [LEVEL] to group all levels in a single all category. avgratioduration [LEVEL] withinmain [DAY_TYPE] - Average of the daily ratio between the duration of sleep chunks of a LEVEL and total duration of all main sleep episodes in a day. When INCLUDE_ALL_GROUPS is True the all LEVEL is ignored since this feature is always 1. Use the DAY_TYPE flag to include start times from weekend days only, weekdays, or both. avgstarttimeofepisodemain [DAY_TYPE] minutes Average of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgendtimeofepisodemain [DAY_TYPE] minutes Average of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. avgmidpointofepisodemain [DAY_TYPE] minutes Average of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdstarttimeofepisodemain [DAY_TYPE] minutes Standard deviation of all start times of the first main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include start times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdendtimeofepisodemain [DAY_TYPE] minutes Standard deviation of all end times of the last main sleep episode within each LNE-LNE interval in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. stdmidpointofepisodemain [DAY_TYPE] minutes Standard deviation of all the differences between avgendtime... and avgstarttime.. in a time segment. Use the DAY_TYPE flag to include end times from LNE-LNE intervals that start on weekend days only, weekdays, or both. socialjetlag minutes Difference in minutes between the avgmidpointofepisodemain of weekends and weekdays that belong to each time segment instance. If your time segment does not contain at least one week day and one weekend day this feature will be NA. rmssdmeanstarttimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmeanendtimeofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmeanmidpointofepisodemain minutes Square root of the mean squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the mean of how someone\u2019s midpointofepisodemain (mid time between bedtime and wake time) changed from night to night. rmssdmedianstarttimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s starttimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s starttimeofepisodemain (bedtime) changed from night to night. rmssdmedianendtimeofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s endtimeofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s endtimeofepisodemain (wake time) changed from night to night. rmssdmedianmidpointofepisodemain minutes Square root of the median squared successive difference (RMSSD) between today\u2019s and yesterday\u2019s midpointofepisodemain values across the entire participant\u2019s sleep data grouped per time segment instance. It represents the median of how someone\u2019s midpointofepisodemain (average mid time between bedtime and wake time) changed from night to night. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments and LNE-LNE intervals for the PRICE provider. We recommend you use periodic segments that start in the morning so RAPIDS can chunk and group sleep episodes overnight. Shifted segments (as any other segments) are labelled based on their start and end date times. avgstarttime... and avgendtime... are roughly equivalent to an average bed and awake time only if you are using shifted segments. The features of this provider are only available on time segments that are longer than 24 hours because they are based on descriptive statistics computed across daily values. Even though Fitbit provides 2 types of sleep episodes ( main and nap ), only main sleep episodes are considered. The reference point for all times is 00:00 of the first day in the LNE-LNE interval. Sleep episodes are formed by 1-minute chunks that we group overnight starting from today\u2019s LNE and ending on tomorrow\u2019s LNE or the end of that segment (whatever is first). The features avgstarttime... and avgendtime... are the average of the first and last sleep episode across every LNE-LNE interval within a segment ( avgmidtime... is the mid point between start and end). Therefore, only segments longer than 24hrs will be averaged across more than one LNE-LNE interval. socialjetlag is only available on segment instances equal or longer than 48hrs that contain at least one weekday day and one weekend day, for example seven-day (weekly) segments.","title":"PRICE provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [CONTAINER] Container where your sleep summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments using SLEEP_SUMMARY_LAST_NIGHT_END for the RAPIDS provider. Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. [FEATURES] Features to be computed from sleep summary data, see table below [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END] As an exception, the LAST_NIGHT_END parameter for this provider is in the data stream configuration section. This parameter controls how sleep episodes are assigned to different days and affects wake and bedtimes. Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description firstwaketimeTYPE minutes First wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. lastwaketimeTYPE minutes Last wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. firstbedtimeTYPE minutes First bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. lastbedtimeTYPE minutes Last bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments using LNE for the RAPIDS provider. There are three sleep types (TYPE): main , nap , all . The all type groups both main sleep and naps . All types are based on Fitbit\u2019s labels. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Most features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type . Bed time and sleep duration are based on episodes that started between today\u2019s LNE and tomorrow\u2019s LNE while awake time is based on the episodes that started between yesterday\u2019s LNE and today\u2019s LNE The reference point for bed/awake times is today\u2019s 00:00. You can have bedtimes larger than 24 and awake times smaller than 0 These features are only available for time segments that span midnight to midnight of the same or different day. We include first and last wake and bedtimes because, when LAST_NIGHT_END is 10 am, the first bedtime could match a nap at 2 pm, and the last bedtime could match a main overnight sleep episode that starts at 10pm. Set the value for SLEEP_SUMMARY_LAST_NIGHT_END int the config parameter [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END].","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [CONTAINER] Container where your sleep summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Understanding RAPIDS features This diagram will help you understand how sleep episodes are chunked and grouped within time segments using SLEEP_SUMMARY_LAST_NIGHT_END for the RAPIDS provider. Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. There are three sleep types: main , nap , and all . The all type means both main sleep and naps are considered. [FEATURES] Features to be computed from sleep summary data, see table below [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END] As an exception, the LAST_NIGHT_END parameter for this provider is in the data stream configuration section. This parameter controls how sleep episodes are assigned to different days and affects wake and bedtimes. Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description firstwaketimeTYPE minutes First wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. lastwaketimeTYPE minutes Last wake time for a certain sleep type during a time segment. Wake time is number of minutes after midnight of a sleep episode\u2019s end time. firstbedtimeTYPE minutes First bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. lastbedtimeTYPE minutes Last bedtime for a certain sleep type during a time segment. Bedtime is number of minutes after midnight of a sleep episode\u2019s start time. countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations This diagram will help you understand how sleep episodes are chunked and grouped within time segments using LNE for the RAPIDS provider. There are three sleep types (TYPE): main , nap , all . The all type groups both main sleep and naps . All types are based on Fitbit\u2019s labels. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Most features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type . Bed time and sleep duration are based on episodes that started between today\u2019s LNE and tomorrow\u2019s LNE while awake time is based on the episodes that started between yesterday\u2019s LNE and today\u2019s LNE The reference point for bed/awake times is today\u2019s 00:00. You can have bedtimes larger than 24 and awake times smaller than 0 These features are only available for time segments that span midnight to midnight of the same or different day. We include first and last wake and bedtimes because, when LAST_NIGHT_END is 10 am, the first bedtime could match a nap at 2 pm, and the last bedtime could match a main overnight sleep episode that starts at 10pm. Set the value for SLEEP_SUMMARY_LAST_NIGHT_END int the config parameter [FITBIT_DATA_STREAMS][data stream][SLEEP_SUMMARY_LAST_NIGHT_END].","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [CONTAINER] Container where your steps intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. [EXCLUDE_SLEEP] Step data will be excluded if it was logged during sleep periods when at least one [EXCLUDE] flag is set to True . Sleep can be delimited by (1) a fixed period that repeats on every day if [TIME_BASED][EXCLUDE] is True or (2) by Fitbit summary sleep episodes if [FITBIT_BASED][EXCLUDE] is True. If both are True (3), we use all Fitbit sleep episodes as well as the time-based episodes that do not overlap with any Fitbit episodes. If [TIME_BASED][EXCLUDE] is True, make sure Fitbit sleep summary container points to a valid table or file. RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_with_datetime.csv - data/raw/ { pid } /fitbit_sleep_summary_raw.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True and [ EXCLUDE_SLEEP ][ TYPE ]= FITBIT_BASED ) - data/interim/ { pid } /fitbit_steps_intraday_with_datetime_exclude_sleep.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True ) - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [CONTAINER] Container where your steps intraday data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. [EXCLUDE_SLEEP] Step data will be excluded if it was logged during sleep periods when at least one [EXCLUDE] flag is set to True . Sleep can be delimited by (1) a fixed period that repeats on every day if [TIME_BASED][EXCLUDE] is True or (2) by Fitbit summary sleep episodes if [FITBIT_BASED][EXCLUDE] is True. If both are True (3), we use all Fitbit sleep episodes as well as the time-based episodes that do not overlap with any Fitbit episodes. If [TIME_BASED][EXCLUDE] is True, make sure Fitbit sleep summary container points to a valid table or file.","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_with_datetime.csv - data/raw/ { pid } /fitbit_sleep_summary_raw.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True and [ EXCLUDE_SLEEP ][ TYPE ]= FITBIT_BASED ) - data/interim/ { pid } /fitbit_steps_intraday_with_datetime_exclude_sleep.csv ( Only when [ EXCLUDE_SLEEP ][ EXCLUDE ]= True ) - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [CONTAINER] Container where your steps summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc. RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [CONTAINER] Container where your steps summary data is stored, depending on the data stream you are using this can be a database table, a CSV file, etc.","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes of still and tilting activities durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes of still and tilting activities durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-crashes/","text":"Phone Applications Crashes \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_CRASHES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications crashes data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_CRASHES ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Crashes"},{"location":"features/phone-applications-crashes/#phone-applications-crashes","text":"Sensor parameters description for [PHONE_APPLICATIONS_CRASHES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications crashes data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_CRASHES ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Crashes"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [INCLUDE_EPISODE_FEATURES] Set to True to extract application episode features as well from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app minduration minutes For a time_segment , the minimum duration an application was used in minutes maxduration minutes For a time_segment , the maximum duration an application was used in minutes meanduration minutes For a time_segment , the mean duration of all the applications used in minutes sumduration minutes For a time_segment , the sum duration of all the applications used in minutes Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above). The application episodes are calculated using the application foreground and screen unlock episode data. An application episode starts when the application is launched and ends when either, a new application is launched or the screen is locked.","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [INCLUDE_EPISODE_FEATURES] Set to True to extract application episode features as well from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app minduration minutes For a time_segment , the minimum duration an application was used in minutes maxduration minutes For a time_segment , the maximum duration an application was used in minutes meanduration minutes For a time_segment , the mean duration of all the applications used in minutes sumduration minutes For a time_segment , the sum duration of all the applications used in minutes Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above). The application episodes are calculated using the application foreground and screen unlock episode data. An application episode starts when the application is launched and ends when either, a new application is launched or the screen is locked.","title":"RAPIDS provider"},{"location":"features/phone-applications-notifications/","text":"Phone Applications Notifications \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_NOTIFICATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications notifications data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_NOTIFICATIONS ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Notifications"},{"location":"features/phone-applications-notifications/#phone-applications-notifications","text":"Sensor parameters description for [PHONE_APPLICATIONS_NOTIFICATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the applications notifications data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_APPLICATIONS_NOTIFICATIONS ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Applications Notifications"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the bluetooth data is stored RAPIDS provider \u00b6 Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider DORYAB provider \u00b6 This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. When searching for the most frequent device across 30-minute segments, the search range is equivalent to the sum of all segments of the same time period. For instance, the countscansmostfrequentdeviceacrosssegments for the time segment ( Fri 00:00:00, Fri 00:29:59 ) will get the count in that segment of the most frequent device found within all ( 00:00:00, 00:29:59 ) time segments. To find countscansmostfrequentdeviceacrosssegments for other devices, the search range needs to filter out all own devices. But no need to do so for countscansmostfrequentdeviceacrosssedataset . The most frequent device across the dataset stays the same for countscansmostfrequentdeviceacrossdatasetall , countscansmostfrequentdeviceacrossdatasetown and countscansmostfrequentdeviceacrossdatasetother . Same rule applies to the least frequent device across the dataset. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/#doryab-provider","text":"This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. When searching for the most frequent device across 30-minute segments, the search range is equivalent to the sum of all segments of the same time period. For instance, the countscansmostfrequentdeviceacrosssegments for the time segment ( Fri 00:00:00, Fri 00:29:59 ) will get the count in that segment of the most frequent device found within all ( 00:00:00, 00:29:59 ) time segments. To find countscansmostfrequentdeviceacrosssegments for other devices, the search range needs to filter out all own devices. But no need to do so for countscansmostfrequentdeviceacrosssedataset . The most frequent device across the dataset stays the same for countscansmostfrequentdeviceacrossdatasetall , countscansmostfrequentdeviceacrossdatasetown and countscansmostfrequentdeviceacrossdatasetother . Same rule applies to the least frequent device across the dataset. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"DORYAB provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors, ONLY include phone sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_CRASHES PHONE_APPLICATIONS_FOREGROUND PHONE_APPLICATIONS_NOTIFICATIONS PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_KEYBOARD PHONE_LIGHT PHONE_LOCATIONS PHONE_LOG PHONE_MESSAGES PHONE_SCREEN PHONE_WIFI_CONNECTED PHONE_WIFI_VISIBLE RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors, ONLY include phone sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_CRASHES PHONE_APPLICATIONS_FOREGROUND PHONE_APPLICATIONS_NOTIFICATIONS PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_KEYBOARD PHONE_LIGHT PHONE_LOCATIONS PHONE_LOG PHONE_MESSAGES PHONE_SCREEN PHONE_WIFI_CONNECTED PHONE_WIFI_VISIBLE","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes - The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours - The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-keyboard/","text":"Phone Keyboard \u00b6 Sensor parameters description for [PHONE_KEYBOARD] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the keyboard data is stored File Sequence - data/raw/ { pid } /phone_keyboard_raw.csv - data/raw/ { pid } /phone_keyboard_with_datetime.csv - data/interim/ { pid } /phone_keyboard_features/phone_keyboard_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_keyboard.csv Features description for [PHONE_KEYBOARD] : Feature Units Description sessioncount - Number of typing sessions in a time segment. A session begins with any keypress and finishes until 5 seconds have elapsed since the last key was pressed or the application that the user was typing on changes. averagesessionlength milliseconds Average length of all sessions in a time segment instance averageinterkeydelay milliseconds The average time between keystrokes measured in milliseconds. changeintextlengthlessthanminusone Number of times a keyboard typing or swiping event changed the length of the current text to less than one fewer character. changeintextlengthequaltominusone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one fewer character. changeintextlengthequaltoone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one more character. changeintextlengthmorethanone Number of times a keyboard typing or swiping event changed the length of the current text to more than one character. maxtextlength Length in characters of the longest sentence(s) contained in the typing text box of any app during the time segment. lastmessagelength Length of the last text in characters of the sentence(s) contained in the typing text box of any app during the time segment. totalkeyboardtouches Average number of typing events across all sessions in a time segment instance. Note We did not find a reliable way to distinguish between AutoCorrect or AutoComplete changes, since both can be applied with a single touch or swipe event and can decrease or increase the length of the text by an arbitrary number of characters.","title":"Phone Keyboard"},{"location":"features/phone-keyboard/#phone-keyboard","text":"Sensor parameters description for [PHONE_KEYBOARD] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the keyboard data is stored File Sequence - data/raw/ { pid } /phone_keyboard_raw.csv - data/raw/ { pid } /phone_keyboard_with_datetime.csv - data/interim/ { pid } /phone_keyboard_features/phone_keyboard_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_keyboard.csv Features description for [PHONE_KEYBOARD] : Feature Units Description sessioncount - Number of typing sessions in a time segment. A session begins with any keypress and finishes until 5 seconds have elapsed since the last key was pressed or the application that the user was typing on changes. averagesessionlength milliseconds Average length of all sessions in a time segment instance averageinterkeydelay milliseconds The average time between keystrokes measured in milliseconds. changeintextlengthlessthanminusone Number of times a keyboard typing or swiping event changed the length of the current text to less than one fewer character. changeintextlengthequaltominusone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one fewer character. changeintextlengthequaltoone Number of times a keyboard typing or swiping event changed the length of the current text in exactly one more character. changeintextlengthmorethanone Number of times a keyboard typing or swiping event changed the length of the current text to more than one character. maxtextlength Length in characters of the longest sentence(s) contained in the typing text box of any app during the time segment. lastmessagelength Length of the last text in characters of the sentence(s) contained in the typing text box of any app during the time segment. totalkeyboardtouches Average number of typing events across all sessions in a time segment instance. Note We did not find a reliable way to distinguish between AutoCorrect or AutoComplete changes, since both can be applied with a single touch or swipe event and can decrease or increase the length of the text by an arbitrary number of characters.","title":"Phone Keyboard"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS , ALL_RESAMPLED or FUSED_RESAMPLED . This filter is based on the provider column of the locations table, ALL includes every row, GPS only includes rows where the provider is gps, ALL_RESAMPLED includes all rows after being resampled, and FUSED_RESAMPLED only includes rows where the provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use Android and iOS clients can collect location coordinates through the phone\u2019s GPS, the network cellular towers around the phone, or Google\u2019s fused location API. If you want to use only the GPS provider, set [LOCATIONS_TO_USE] to GPS If you want to use all providers, set [LOCATIONS_TO_USE] to ALL If you collected location data from different providers, including the fused API, use ALL_RESAMPLED If your mobile client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . ALL_RESAMPLED and RESAMPLE_FUSED take the original location coordinates and replicate each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] . This is done because Google\u2019s API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one and because GPS and network providers can log data at variable rates. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair. For example, participant A\u2019s phone did not collect data between 10.30 am and 10:50 am and between 11:05am and 11:40am, the last known coordinate pair is replicated during the first period but not the second. In other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes. FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer than this threshold even if the phone was sensing data continuously. For example, participant A went home at 9 pm, and their phone was sensing data without gaps until 11 am the next morning, the last known location is replicated until 9 am. If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same or a different day (daily, weekly, weekend, etc.) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this is dropped. This number means there\u2019s a 68% probability the actual location is within this radius [IF_MULTIPLE_TIMEZONES] Currently, USE_MOST_COMMON is the only value supported. If the location data for a participant belongs to multiple time zones, we select the most common because Barnett\u2019s algorithm can only handle one time zone [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am, including any pauses within a 200-meter radius. disttravelled meters Total distance traveled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day, and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement is based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Multi day segment features Barnett\u2019s features are only available on time segments that span entire days (00:00:00 to 23:59:59). Such segments can be one-day long (daily) or multi-day (weekly, for example). Multi-day segment features are computed based on daily features summarized the following way: sum for hometime , disttravelled , siglocsvisited , and minutes_data_used max for maxdiam , and maxhomedist mean for rog , avgflightlen , stdflightlen , avgflightdur , stdflightdur , probpause , siglocentropy , circdnrtn , wkenddayrtn , and minsmissing Computation speed The process to extract these features can be slow compared to other sensors and providers due to the required simulation. How are these features computed? These features are based on a Pause-Flight model. A pause is defined as a mobility trace (location pings) within a certain duration and distance (by default, 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS, we only expose one parameter for these features (accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_processed_with_datetime_with_doryab_columns.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_ROW_GAP] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the phone was not sensing. This value must be larger than your GPS sampling interval when [LOCATIONS_TO_USE] is ALL or GPS , otherwise all the stationary-related features will be NA. If [LOCATIONS_TO_USE] is ALL_RESAMPLED or FUSED_RESAMPLED , you can use the default value as every row will be resampled at 1-minute intervals. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [CLUSTER_ON] Set this flag to PARTICIPANT_DATASET to create clusters based on the entire participant\u2019s dataset or to TIME_SEGMENT to create clusters based on all the instances of the corresponding time segment (e.g. all mornings) or to TIME_SEGMENT_INSTANCE to create clusters based on a single instance (e.g. 2020-05-20\u2019s morning). [INFER_HOME_LOCATION_STRATEGY] The strategy applied to infer home locations. Set to DORYAB_STRATEGY to infer one home location for the entire dataset of each participant or to SUN_LI_VEGA_STRATEGY to infer one home location per day per participant. See Observations below to know more. [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] The minimum number of consecutive days a new home location candidate has to repeat before it is considered the participant\u2019s new home. This parameter will be used only when [INFER_HOME_LOCATION_STRATEGY] is set to SUN_LI_VEGA_STRATEGY . [CLUSTERING_ALGORITHM] The original Doryab et al. implementation uses DBSCAN , OPTICS is also available with similar (but not identical) clustering results and lower memory consumption. [RADIUS_FOR_HOME] All location coordinates within this distance (meters) from the home location coordinates are considered a homestay (see timeathome feature). Features description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance traveled in a time segment using the haversine formula. avgspeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - Deprecated, see Observations below. \u201cIt encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN/OPTICS clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between stationary time and total location sensed time. A lat/long coordinate pair is labeled as stationary if its speed (distance/time) to the next coordinate pair is less than 1km/hr. A higher value represents a more stationary routine. outlierstimepercent - Ratio between the time spent in non-significant clusters divided by the time spent in all clusters (stationary time. Only stationary samples are clustered). A higher value represents more time spent in non-significant clusters. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). avglengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters; it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). timeathome minutes Time spent at home (see Observations below for a description on how we compute home). homelabel - An integer that represents a different home location. It will be a constant number (1) for all participants when [INFER_HOME_LOCATION_STRATEGY] is set to DORYAB_STRATEGY or an incremental index if the strategy is set to SUN_LI_VEGA_STRATEGY . Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. Circadian Movement Calculation Note Feb 3 2021. It seems the implementation of this feature is not correct; we suggest not to use this feature until a fix is in place. For a detailed description of how this should be calculated, see Saeb et al . Fine-Tuning Clustering Parameters Based on an experiment where we collected fused location data for 7 days with a mean accuracy of 86 & SD of 350.874635, we determined that EPS/MAX_EPS =100 produced closer clustering results to reality. Higher values (>100) missed out on some significant places, like a short grocery visit, while lower values (<100) picked up traffic lights and stop signs while driving as significant locations. We recommend you set EPS based on your location data\u2019s accuracy (the more accurate your data is, the lower you should be able to set EPS). Duration Calculation To calculate the time duration component for our features, we compute the difference between consecutive rows\u2019 timestamps to take into account sampling rate variability. If this time difference is larger than a threshold (300 seconds by default), we replace it with NA and label that row as Moving. Home location DORYAB_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ) and considering the center of the biggest cluster home for that participant. SUN_LI_VEGA_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ). The following steps are used to infer the home location per day for that participant: if there are records within [03:30:00, 04:30:00] for that night: we choose the most common cluster during that period as a home candidate for that day. elif there are records within [midnight, 03:30:00) for that night: we choose the last valid cluster during that period as a home candidate for that day. elif there are records within (04:30:00, 06:00:00] for that night: we choose the first valid cluster during that period as a home candidate for that day. else: the home location is NA (missing) for that day. If the count of consecutive days with the same candidate home location cluster label is larger or equal to [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] , the candidate will be regarded as the home cluster; otherwise, the home cluster will be the last valid day\u2019s cluster. If there are no valid clusters before that day, the first home location in the days after is used.","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS , ALL_RESAMPLED or FUSED_RESAMPLED . This filter is based on the provider column of the locations table, ALL includes every row, GPS only includes rows where the provider is gps, ALL_RESAMPLED includes all rows after being resampled, and FUSED_RESAMPLED only includes rows where the provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if ALL_RESAMPLED or FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row is resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use Android and iOS clients can collect location coordinates through the phone\u2019s GPS, the network cellular towers around the phone, or Google\u2019s fused location API. If you want to use only the GPS provider, set [LOCATIONS_TO_USE] to GPS If you want to use all providers, set [LOCATIONS_TO_USE] to ALL If you collected location data from different providers, including the fused API, use ALL_RESAMPLED If your mobile client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . ALL_RESAMPLED and RESAMPLE_FUSED take the original location coordinates and replicate each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] . This is done because Google\u2019s API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one and because GPS and network providers can log data at variable rates. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair. For example, participant A\u2019s phone did not collect data between 10.30 am and 10:50 am and between 11:05am and 11:40am, the last known coordinate pair is replicated during the first period but not the second. In other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes. FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer than this threshold even if the phone was sensing data continuously. For example, participant A went home at 9 pm, and their phone was sensing data without gaps until 11 am the next morning, the last known location is replicated until 9 am. If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same or a different day (daily, weekly, weekend, etc.) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this is dropped. This number means there\u2019s a 68% probability the actual location is within this radius [IF_MULTIPLE_TIMEZONES] Currently, USE_MOST_COMMON is the only value supported. If the location data for a participant belongs to multiple time zones, we select the most common because Barnett\u2019s algorithm can only handle one time zone [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am, including any pauses within a 200-meter radius. disttravelled meters Total distance traveled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day, and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement is based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Multi day segment features Barnett\u2019s features are only available on time segments that span entire days (00:00:00 to 23:59:59). Such segments can be one-day long (daily) or multi-day (weekly, for example). Multi-day segment features are computed based on daily features summarized the following way: sum for hometime , disttravelled , siglocsvisited , and minutes_data_used max for maxdiam , and maxhomedist mean for rog , avgflightlen , stdflightlen , avgflightdur , stdflightdur , probpause , siglocentropy , circdnrtn , wkenddayrtn , and minsmissing Computation speed The process to extract these features can be slow compared to other sensors and providers due to the required simulation. How are these features computed? These features are based on a Pause-Flight model. A pause is defined as a mobility trace (location pings) within a certain duration and distance (by default, 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS, we only expose one parameter for these features (accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_processed_with_datetime_with_doryab_columns.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_ROW_GAP] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the phone was not sensing. This value must be larger than your GPS sampling interval when [LOCATIONS_TO_USE] is ALL or GPS , otherwise all the stationary-related features will be NA. If [LOCATIONS_TO_USE] is ALL_RESAMPLED or FUSED_RESAMPLED , you can use the default value as every row will be resampled at 1-minute intervals. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes; the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [CLUSTER_ON] Set this flag to PARTICIPANT_DATASET to create clusters based on the entire participant\u2019s dataset or to TIME_SEGMENT to create clusters based on all the instances of the corresponding time segment (e.g. all mornings) or to TIME_SEGMENT_INSTANCE to create clusters based on a single instance (e.g. 2020-05-20\u2019s morning). [INFER_HOME_LOCATION_STRATEGY] The strategy applied to infer home locations. Set to DORYAB_STRATEGY to infer one home location for the entire dataset of each participant or to SUN_LI_VEGA_STRATEGY to infer one home location per day per participant. See Observations below to know more. [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] The minimum number of consecutive days a new home location candidate has to repeat before it is considered the participant\u2019s new home. This parameter will be used only when [INFER_HOME_LOCATION_STRATEGY] is set to SUN_LI_VEGA_STRATEGY . [CLUSTERING_ALGORITHM] The original Doryab et al. implementation uses DBSCAN , OPTICS is also available with similar (but not identical) clustering results and lower memory consumption. [RADIUS_FOR_HOME] All location coordinates within this distance (meters) from the home location coordinates are considered a homestay (see timeathome feature). Features description for [PHONE_LOCATIONS][PROVIDERS][DORYAB] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance traveled in a time segment using the haversine formula. avgspeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - Deprecated, see Observations below. \u201cIt encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN/OPTICS clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between stationary time and total location sensed time. A lat/long coordinate pair is labeled as stationary if its speed (distance/time) to the next coordinate pair is less than 1km/hr. A higher value represents a more stationary routine. outlierstimepercent - Ratio between the time spent in non-significant clusters divided by the time spent in all clusters (stationary time. Only stationary samples are clustered). A higher value represents more time spent in non-significant clusters. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). avglengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters; it is higher the more rows belong to a cluster (i.e., the more time a participant spent at a significant location). timeathome minutes Time spent at home (see Observations below for a description on how we compute home). homelabel - An integer that represents a different home location. It will be a constant number (1) for all participants when [INFER_HOME_LOCATION_STRATEGY] is set to DORYAB_STRATEGY or an incremental index if the strategy is set to SUN_LI_VEGA_STRATEGY . Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. Circadian Movement Calculation Note Feb 3 2021. It seems the implementation of this feature is not correct; we suggest not to use this feature until a fix is in place. For a detailed description of how this should be calculated, see Saeb et al . Fine-Tuning Clustering Parameters Based on an experiment where we collected fused location data for 7 days with a mean accuracy of 86 & SD of 350.874635, we determined that EPS/MAX_EPS =100 produced closer clustering results to reality. Higher values (>100) missed out on some significant places, like a short grocery visit, while lower values (<100) picked up traffic lights and stop signs while driving as significant locations. We recommend you set EPS based on your location data\u2019s accuracy (the more accurate your data is, the lower you should be able to set EPS). Duration Calculation To calculate the time duration component for our features, we compute the difference between consecutive rows\u2019 timestamps to take into account sampling rate variability. If this time difference is larger than a threshold (300 seconds by default), we replace it with NA and label that row as Moving. Home location DORYAB_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ) and considering the center of the biggest cluster home for that participant. SUN_LI_VEGA_STRATEGY : home is calculated using all location data of a participant between 12 am and 6 am, then applying a clustering algorithm ( DBSCAN or OPTICS ). The following steps are used to infer the home location per day for that participant: if there are records within [03:30:00, 04:30:00] for that night: we choose the most common cluster during that period as a home candidate for that day. elif there are records within [midnight, 03:30:00) for that night: we choose the last valid cluster during that period as a home candidate for that day. elif there are records within (04:30:00, 06:00:00] for that night: we choose the first valid cluster during that period as a home candidate for that day. else: the home location is NA (missing) for that day. If the count of consecutive days with the same candidate home location cluster label is larger or equal to [MINIMUM_DAYS_TO_DETECT_HOME_CHANGES] , the candidate will be regarded as the home cluster; otherwise, the home cluster will be the last valid day\u2019s cluster. If there are no valid clusters before that day, the first home location in the days after is used.","title":"DORYAB provider"},{"location":"features/phone-log/","text":"Phone Log \u00b6 Sensor parameters description for [PHONE_LOG] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where a data log is stored for Android devices [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where a data log is stored for iOS devices Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_LOG ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Log"},{"location":"features/phone-log/#phone-log","text":"Sensor parameters description for [PHONE_LOG] : Key Description [CONTAINER][ANDROID] Data stream container (database table, CSV file, etc.) where a data log is stored for Android devices [CONTAINER][IOS] Data stream container (database table, CSV file, etc.) where a data log is stored for iOS devices Note No feature providers have been implemented for this sensor yet, however you can use its key ( PHONE_LOG ) to improve PHONE_DATA_YIELD or you can implement your own features .","title":"Phone Log"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes firstuseafter minutes Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes firstuseafter minutes Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [CONTAINER] Data stream container (database table, CSV file, etc.) where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features. Verify RAPIDS can process your data streams Create your participants files Select what time segments you want to extract features on Select the timezone of your study Configure your data streams Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs, we are referring to the corresponding key in the config.yaml file. Supported data streams \u00b6 A data stream refers to sensor data collected using a specific device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Check the table in introduction to data streams to know what data streams we support. If your data stream is supported, continue to the next configuration section, you will use its label later in this guide (e.g. aware_mysql ). If your steam is not supported, but you want to implement it, follow the tutorial to add support for new data streams and open a new discussion in Github with any questions. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Remember to modify the config.yaml file with your PIDS The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you could run the following command, and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, a Fitbit device, and an Empatica device throughout the study between April 23 rd , 2020, and October 28 th , 2020 If your participants didn\u2019t use a [PHONE] , [FITBIT] or [EMPATICA] device, it is not necessary to include that section in their participant file. In other words, you can analyze data from 1 or more devices per participant. PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 EMPATICA : DEVICE_IDS : [ empatica1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). You can set [PLATFORMS]: [infer] , and RAPIDS will infer them automatically (each phone data stream infer this differently, e.g., aware_mysql uses the aware_device table). [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [EMPATICA] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Empatica device used by this participant. Since the most common use case involves having multiple zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Automatic creation of participant files \u00b6 You can use a CSV file with a row per participant to automatically create participant files. AWARE_DEVICE_TABLE was deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option, but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions below: SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; In your config.yaml : Set CSV_FILE_PATH to a CSV file path that complies with the specs described below Set the devices ( PHONE , FITBIT , EMPATICA ) [ADD] flag to TRUE depending on what devices you used in your study. CREATE_PARTICIPANT_FILES : CSV_FILE_PATH : \"your_path/to_your.csv\" PHONE_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] EMPATICA_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] Your CSV file ( [CSV_FILE_PATH] ) should have the following columns (headers), but the values within each column can be empty: Column Description device_id Phone device id. Separate multiple ids with ; fitbit_id Fitbit device id. Separate multiple ids with ; empatica_id Empatica device id. Since the most common use case involves having various zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) pid Unique identifiers with the format pXXX (your participant files will be named with this string) platform Use android , ios or infer as explained above, separate values with ; label A human-readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . end_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Example We added white spaces to this example to make it easy to read, but you don\u2019t have to. device_id ,fitbit_id, empatica_id ,pid ,label ,platform ,start_date ,end_date a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ,fitbit1 , p01 ,p01 ,julio ,android;ios ,2020-01-01 ,2021-01-01 4c4cf7a1-0340-44bc-be0f-d5053bf7390c ,fitbit2 , p02 ,p02 ,meng ,ios ,2021-01-01 ,2022-01-01 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed every day, and all have the same duration (for example, 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute, but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday, March 7 th , 2020, and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would begin on Sunday, March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday, March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment. It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S repeats_on One of the following options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month, and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day , set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segment instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and last 23:59:59 ; the other four segments will begin at 6am, 12pm, 6pm, and 12am, respectively, and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute, but they can be as long as you want. The start of each segment can be shifted backward or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be calculated across all these segments). There cannot be two overlapping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or Fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyze. If you have participants with multiple device ids, you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes, and stress2 and stress4 are shifted backward by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day, and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some information for such computation will be extracted from all three segments, for example, the phone contact that called a participant the most, or the location clusters visited by a participant. Date time labels of event segments In the final feature file, you will find a row per event segment. The local_segment column of each row has a label , a start date-time string, and an end date-time string. weeklysurvey2060#2020-09-12 01 :00:00,2020-09-18 23 :59:59 All sensor data is always segmented based on timestamps, and the date-time strings are attached for informative purposes. For example, you can plot your features based on these strings. When you configure RAPIDS to work with a single time zone, such time zone code will be used to convert start/end timestamps (the ones you typed in the event segments file) into start/end date-time strings. However, when you configure RAPIDS to work with multiple time zones, RAPIDS will use the most common time zone across all devices of every participant to do the conversion. The most common time zone is the one in which a participant spent the most time. In practical terms, this means that the date-time strings of event segments that happened in uncommon time zones will have shifted start/end date-time labels. However, the data within each segment was correctly filtered based on timestamps. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone or you want to ignore short trips of your participants to different time zones, select the appropriate code from this list and change the following config key. Double-check your timezone code pick; for example, US Eastern Time is America/New_York , not EST . TIMEZONE : TYPE : SINGLE TZCODE : America/New_York Multiple timezones \u00b6 If your participants lived in different time zones or they traveled across time zones, and you know when participants\u2019 devices were in a specific time zone, RAPIDS can use this data to process your data streams with the correct date-time. You need to provide RAPIDS with the time zone data in a CSV file ( [TZCODES_FILE] ) in the format described below. TIMEZONE : TYPE : MULTIPLE SINGLE : TZCODE : America/New_York MULTIPLE : TZCODES_FILE : path_to/time_zones_csv.file IF_MISSING_TZCODE : STOP DEFAULT_TZCODE : America/New_York FITBIT : ALLOW_MULTIPLE_TZ_PER_DEVICE : False INFER_FROM_SMARTPHONE_TZ : False Parameters for [TIMEZONE] Parameter Description [TYPE] Either SINGLE or MULTIPLE as explained above [SINGLE][TZCODE] The time zone code from this list to be used across all devices [MULTIPLE][TZCODES_FILE] A CSV file containing the time zones in which participants\u2019 devices sensed data (see the required format below). Multiple devices can be linked to the same person. Read more in Participants Files [MULTIPLE][IF_MISSING_TZCODE] When a device is missing from [TZCODES_FILE] Set this flag to STOP to stop RAPIDS execution and show an error, or to USE_DEFAULT to assign the time zone specified in [DEFAULT_TZCODE] to any such devices [MULTIPLE][FITBIT][ALLOW_MULTIPLE_TZ_PER_DEVICE] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. [MULTIPLE][FITBIT][INFER_FROM_SMARTPHONE_TZ] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. Format of TZCODES_FILE TZCODES_FILE has three columns and a row for each time zone a device visited (a device can be a smartphone or wearable (Fitbit/Empatica)): Column Description device_id A string that uniquely identifies a smartphone or wearable tzcode A string with the appropriate code from this list that represents the time zone where the device sensed data timestamp A UNIX timestamp indicating when was the first time this device_id sensed data in tzcode device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/New_York, 1587500000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Mexico_City, 1587600000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 1587700000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587100000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Berlin, 1587200000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587300000000 Using this file, RAPDIS will create time zone intervals per device, for example for 13dbc8a3-dae3-4834-823a-4bc96a7d459d : Interval 1 [1587500000000, 1587599999999] for America/New_York Interval 2 [1587600000000, 1587699999999] for America/Mexico_City Interval 3 [1587700000000, now] for America/Los_Angeles Any sensor data row from a device will be assigned a timezone if it falls within that interval, for example: A screen row sensed at 1587533333333 will be assigned to America/New_York because it falls within Interval 1 A screen row sensed at 1587400000000 will be discarded because it was logged outside any interval. Can I get the TZCODES_FILE from the time zone table collected automatically by the AWARE app? Sure. You can put your timezone table ( timezone.csv ) collected by the AWARE app under data/external folder and run: python tools/create_multi_timezones_file.py The TZCODES_FILE will be saved as data/external/multiple_timezones.csv . What happens if participant X lives in Los Angeles but participant Y lives in Amsterdam and they both stayed there during my study? Add a row per participant and set timestamp to 0 : device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 0 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 0 What happens if I forget to add a timezone for one or more devices? It depends on [IF_MISSING_TZCODE] . If [IF_MISSING_TZCODE] is set to STOP , RAPIDS will stop its execution and show you an error message. If [IF_MISSING_TZCODE] is set to USE_DEFAULT , it will assign the time zone specified in [DEFAULT_TZCODE] to any devices with missing time zone information in [TZCODES_FILE] . This is helpful if only a few of your participants had multiple timezones, and you don\u2019t want to specify the same time zone for the rest. How does RAPIDS handle Fitbit devices? Fitbit devices are not time zone aware, and they always log data with a local date-time string. When none of the Fitbit devices in your study changed time zones (e.g., p01 was always in New York and p02 was always in Amsterdam), you can set a single time zone per Fitbit device id along with a timestamp of 0 (you can still assign multiple time zones to smartphone device ids) device_id, tzcode, timestamp fitbit123, America/New_York, 0 fitbit999, Europe/Amsterdam, 0 On the other hand, when at least one of your Fitbit devices changed time zones AND you want RAPIDS to take into account these changes, you need to set [ALLOW_MULTIPLE_TZ_PER_DEVICE] to True . You have to manually allow this option because you need to be aware it can produce inaccurate features around the times when time zones changed . This is because we cannot know precisely when the Fitbit device detected and processed the time zone change. If you want to ALLOW_MULTIPLE_TZ_PER_DEVICE , you will need to add any time zone changes per device in the TZCODES_FILE as explained above. You could obtain this data by hand, but if your participants also used a smartphone during your study, you can use their time zone logs. Recall that in RAPIDS, every participant is represented with a participant file pXX.yaml , this file links together multiple devices, and we will use it to know what smartphone time zone data should be applied to Fitbit devices. Thus set INFER_FROM_SMARTPHONE_TZ to TRUE , if you have included smartphone time zone data in your TZCODE_FILE and want to make a participant\u2019s Fitbit data time zone aware with their respective smartphone data. Data Stream Configuration \u00b6 Modify the following keys in your config.yaml depending on the data stream you want to process. Phone Set [PHONE_DATA_STREAMS][TYPE] to the smartphone data stream you want to process (e.g. aware_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of streams you are not using (e.g. [FOLDER] of aware_csv ). PHONE_DATA_STREAMS : USE : aware_mysql # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP aware_csv : FOLDER : data/external/aware_csv aware_mysql Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. aware_csv Key Description [FOLDER] Folder where you have to place a CSV file per phone sensor. Each file has to contain all the data from every participant you want to process. Fitbit Set [FITBIT_DATA_STREAMS][TYPE] to the Fitbit data stream you want to process (e.g. fitbitjson_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of the other streams you are not using (e.g. [FOLDER] of aware_csv ). Warning You will probably have to tell RAPIDS the name of the columns where you stored your Fitbit data. To do this, modify your chosen stream\u2019s format.yaml column mappings to match your raw data column names. FITBIT_DATA_STREAMS : USE : fitbitjson_mysql # AVAILABLE: fitbitjson_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_mysql This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitjson_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitjson_csv This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitjson_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. fitbitparsed_mysql This data stream process Fitbit data stored in multiple columns after being parsed from the JSON column returned by Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitparsed_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitparsed_csv This data stream process Fitbit data stored in multiple columns (plain text) after being parsed from the JSON column returned by Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitparsed_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Empatica Set [USE] to the Empatica data stream you want to use; see the table in introduction to data streams . Configure any parameters as indicated below. EMPATICA_DATA_STREAMS : USE : empatica_zip # AVAILABLE: empatica_zip : FOLDER : data/external/empatica empatica_zip Key Description [FOLDER] The relative path to a folder containing one subfolder per participant. The name of a participant folder should match their device_id assigned in their participant file. Each participant folder can have one or more zip files with any name; in other words, the sensor data in those zip files belong to a single participant. The zip files are automatically generated by Empatica and have a CSV file per sensor ( ACC , HR , TEMP , EDA , BVP , TAGS ). All CSV files of the same type contained in one or more zip files are uncompressed, parsed, sorted by timestamp, and joined together. Example of an EMPATICA FOLDER In the file tree below, we want to process three participants\u2019 data: p01 , p02 , and p03 . p01 has two zip files, p02 has only one zip file, and p03 has three zip files. Each zip has a CSV file per sensor that is joined together and processed by RAPIDS. data/ # this folder exists in the root RAPIDS folder external/ empatica/ p01/ file1.zip file2.zip p02/ aaaa.zip p03/ t1.zip t2.zip t3.zip Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features. Verify RAPIDS can process your data streams Create your participants files Select what time segments you want to extract features on Select the timezone of your study Configure your data streams Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs, we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#supported-data-streams","text":"A data stream refers to sensor data collected using a specific device with a specific format and stored in a specific container . For example, the aware_mysql data stream handles smartphone data ( device ) collected with the AWARE Framework ( format ) stored in a MySQL database ( container ). Check the table in introduction to data streams to know what data streams we support. If your data stream is supported, continue to the next configuration section, you will use its label later in this guide (e.g. aware_mysql ). If your steam is not supported, but you want to implement it, follow the tutorial to add support for new data streams and open a new discussion in Github with any questions.","title":"Supported data streams"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Remember to modify the config.yaml file with your PIDS The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you could run the following command, and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, a Fitbit device, and an Empatica device throughout the study between April 23 rd , 2020, and October 28 th , 2020 If your participants didn\u2019t use a [PHONE] , [FITBIT] or [EMPATICA] device, it is not necessary to include that section in their participant file. In other words, you can analyze data from 1 or more devices per participant. PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 EMPATICA : DEVICE_IDS : [ empatica1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). You can set [PLATFORMS]: [infer] , and RAPIDS will infer them automatically (each phone data stream infer this differently, e.g., aware_mysql uses the aware_device table). [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [EMPATICA] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Empatica device used by this participant. Since the most common use case involves having multiple zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected after this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . [END_DATE] A string with format YYYY-MM-DD or YYYY-MM-DD HH:MM:SS . Only data collected before this date-time will be included in the analysis. By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 .","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You can use a CSV file with a row per participant to automatically create participant files. AWARE_DEVICE_TABLE was deprecated In previous versions of RAPIDS, you could create participant files automatically using the aware_device table. We deprecated this option, but you can still achieve the same results if you export the output of the following SQL query as a CSV file and follow the instructions below: SELECT device_id , device_id as fitbit_id , CONCAT ( \"p\" , _id ) as empatica_id , CONCAT ( \"p\" , _id ) as pid , if ( brand = \"iPhone\" , \"ios\" , \"android\" ) as platform , CONCAT ( \"p\" , _id ) as label , DATE_FORMAT ( FROM_UNIXTIME (( timestamp / 1000 ) - 86400 ), \"%Y-%m-%d\" ) as start_date , CURRENT_DATE as end_date from aware_device order by _id ; In your config.yaml : Set CSV_FILE_PATH to a CSV file path that complies with the specs described below Set the devices ( PHONE , FITBIT , EMPATICA ) [ADD] flag to TRUE depending on what devices you used in your study. CREATE_PARTICIPANT_FILES : CSV_FILE_PATH : \"your_path/to_your.csv\" PHONE_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] EMPATICA_SECTION : ADD : TRUE # or FALSE IGNORED_DEVICE_IDS : [] Your CSV file ( [CSV_FILE_PATH] ) should have the following columns (headers), but the values within each column can be empty: Column Description device_id Phone device id. Separate multiple ids with ; fitbit_id Fitbit device id. Separate multiple ids with ; empatica_id Empatica device id. Since the most common use case involves having various zip files from a single device for each person, set this device id to an arbitrary string (we usually use their pid ) pid Unique identifiers with the format pXXX (your participant files will be named with this string) platform Use android , ios or infer as explained above, separate values with ; label A human-readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . end_date A string with format YYY-MM-DD or YYYY-MM-DD HH:MM:SS . By default, YYYY-MM-DD is interpreted as YYYY-MM-DD 00:00:00 . Example We added white spaces to this example to make it easy to read, but you don\u2019t have to. device_id ,fitbit_id, empatica_id ,pid ,label ,platform ,start_date ,end_date a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ,fitbit1 , p01 ,p01 ,julio ,android;ios ,2020-01-01 ,2021-01-01 4c4cf7a1-0340-44bc-be0f-d5053bf7390c ,fitbit2 , p02 ,p02 ,meng ,ios ,2021-01-01 ,2022-01-01 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed every day, and all have the same duration (for example, 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute, but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday, March 7 th , 2020, and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would begin on Sunday, March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday, March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment. It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S repeats_on One of the following options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month, and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day , set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segment instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and last 23:59:59 ; the other four segments will begin at 6am, 12pm, 6pm, and 12am, respectively, and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute, but they can be as long as you want. The start of each segment can be shifted backward or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be calculated across all these segments). There cannot be two overlapping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent days, hours, minutes, and seconds. For example, 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or Fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyze. If you have participants with multiple device ids, you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes, and stress2 and stress4 are shifted backward by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day, and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some information for such computation will be extracted from all three segments, for example, the phone contact that called a participant the most, or the location clusters visited by a participant. Date time labels of event segments In the final feature file, you will find a row per event segment. The local_segment column of each row has a label , a start date-time string, and an end date-time string. weeklysurvey2060#2020-09-12 01 :00:00,2020-09-18 23 :59:59 All sensor data is always segmented based on timestamps, and the date-time strings are attached for informative purposes. For example, you can plot your features based on these strings. When you configure RAPIDS to work with a single time zone, such time zone code will be used to convert start/end timestamps (the ones you typed in the event segments file) into start/end date-time strings. However, when you configure RAPIDS to work with multiple time zones, RAPIDS will use the most common time zone across all devices of every participant to do the conversion. The most common time zone is the one in which a participant spent the most time. In practical terms, this means that the date-time strings of event segments that happened in uncommon time zones will have shifted start/end date-time labels. However, the data within each segment was correctly filtered based on timestamps.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone or you want to ignore short trips of your participants to different time zones, select the appropriate code from this list and change the following config key. Double-check your timezone code pick; for example, US Eastern Time is America/New_York , not EST . TIMEZONE : TYPE : SINGLE TZCODE : America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"If your participants lived in different time zones or they traveled across time zones, and you know when participants\u2019 devices were in a specific time zone, RAPIDS can use this data to process your data streams with the correct date-time. You need to provide RAPIDS with the time zone data in a CSV file ( [TZCODES_FILE] ) in the format described below. TIMEZONE : TYPE : MULTIPLE SINGLE : TZCODE : America/New_York MULTIPLE : TZCODES_FILE : path_to/time_zones_csv.file IF_MISSING_TZCODE : STOP DEFAULT_TZCODE : America/New_York FITBIT : ALLOW_MULTIPLE_TZ_PER_DEVICE : False INFER_FROM_SMARTPHONE_TZ : False Parameters for [TIMEZONE] Parameter Description [TYPE] Either SINGLE or MULTIPLE as explained above [SINGLE][TZCODE] The time zone code from this list to be used across all devices [MULTIPLE][TZCODES_FILE] A CSV file containing the time zones in which participants\u2019 devices sensed data (see the required format below). Multiple devices can be linked to the same person. Read more in Participants Files [MULTIPLE][IF_MISSING_TZCODE] When a device is missing from [TZCODES_FILE] Set this flag to STOP to stop RAPIDS execution and show an error, or to USE_DEFAULT to assign the time zone specified in [DEFAULT_TZCODE] to any such devices [MULTIPLE][FITBIT][ALLOW_MULTIPLE_TZ_PER_DEVICE] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. [MULTIPLE][FITBIT][INFER_FROM_SMARTPHONE_TZ] You only need to care about this flag if one or more Fitbit devices sensed data in one or more time zones, and you want RAPIDS to take into account this in its feature computation. Read more in \u201cHow does RAPIDS handle Fitbit devices?\u201d below. Format of TZCODES_FILE TZCODES_FILE has three columns and a row for each time zone a device visited (a device can be a smartphone or wearable (Fitbit/Empatica)): Column Description device_id A string that uniquely identifies a smartphone or wearable tzcode A string with the appropriate code from this list that represents the time zone where the device sensed data timestamp A UNIX timestamp indicating when was the first time this device_id sensed data in tzcode device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/New_York, 1587500000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Mexico_City, 1587600000000 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 1587700000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587100000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Berlin, 1587200000000 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 1587300000000 Using this file, RAPDIS will create time zone intervals per device, for example for 13dbc8a3-dae3-4834-823a-4bc96a7d459d : Interval 1 [1587500000000, 1587599999999] for America/New_York Interval 2 [1587600000000, 1587699999999] for America/Mexico_City Interval 3 [1587700000000, now] for America/Los_Angeles Any sensor data row from a device will be assigned a timezone if it falls within that interval, for example: A screen row sensed at 1587533333333 will be assigned to America/New_York because it falls within Interval 1 A screen row sensed at 1587400000000 will be discarded because it was logged outside any interval. Can I get the TZCODES_FILE from the time zone table collected automatically by the AWARE app? Sure. You can put your timezone table ( timezone.csv ) collected by the AWARE app under data/external folder and run: python tools/create_multi_timezones_file.py The TZCODES_FILE will be saved as data/external/multiple_timezones.csv . What happens if participant X lives in Los Angeles but participant Y lives in Amsterdam and they both stayed there during my study? Add a row per participant and set timestamp to 0 : device_id, tzcode, timestamp 13dbc8a3-dae3-4834-823a-4bc96a7d459d, America/Los_Angeles, 0 65sa66a5-2d2d-4524-946v-44ascbv4sad7, Europe/Amsterdam, 0 What happens if I forget to add a timezone for one or more devices? It depends on [IF_MISSING_TZCODE] . If [IF_MISSING_TZCODE] is set to STOP , RAPIDS will stop its execution and show you an error message. If [IF_MISSING_TZCODE] is set to USE_DEFAULT , it will assign the time zone specified in [DEFAULT_TZCODE] to any devices with missing time zone information in [TZCODES_FILE] . This is helpful if only a few of your participants had multiple timezones, and you don\u2019t want to specify the same time zone for the rest. How does RAPIDS handle Fitbit devices? Fitbit devices are not time zone aware, and they always log data with a local date-time string. When none of the Fitbit devices in your study changed time zones (e.g., p01 was always in New York and p02 was always in Amsterdam), you can set a single time zone per Fitbit device id along with a timestamp of 0 (you can still assign multiple time zones to smartphone device ids) device_id, tzcode, timestamp fitbit123, America/New_York, 0 fitbit999, Europe/Amsterdam, 0 On the other hand, when at least one of your Fitbit devices changed time zones AND you want RAPIDS to take into account these changes, you need to set [ALLOW_MULTIPLE_TZ_PER_DEVICE] to True . You have to manually allow this option because you need to be aware it can produce inaccurate features around the times when time zones changed . This is because we cannot know precisely when the Fitbit device detected and processed the time zone change. If you want to ALLOW_MULTIPLE_TZ_PER_DEVICE , you will need to add any time zone changes per device in the TZCODES_FILE as explained above. You could obtain this data by hand, but if your participants also used a smartphone during your study, you can use their time zone logs. Recall that in RAPIDS, every participant is represented with a participant file pXX.yaml , this file links together multiple devices, and we will use it to know what smartphone time zone data should be applied to Fitbit devices. Thus set INFER_FROM_SMARTPHONE_TZ to TRUE , if you have included smartphone time zone data in your TZCODE_FILE and want to make a participant\u2019s Fitbit data time zone aware with their respective smartphone data.","title":"Multiple timezones"},{"location":"setup/configuration/#data-stream-configuration","text":"Modify the following keys in your config.yaml depending on the data stream you want to process. Phone Set [PHONE_DATA_STREAMS][TYPE] to the smartphone data stream you want to process (e.g. aware_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of streams you are not using (e.g. [FOLDER] of aware_csv ). PHONE_DATA_STREAMS : USE : aware_mysql # AVAILABLE: aware_mysql : DATABASE_GROUP : MY_GROUP aware_csv : FOLDER : data/external/aware_csv aware_mysql Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. aware_csv Key Description [FOLDER] Folder where you have to place a CSV file per phone sensor. Each file has to contain all the data from every participant you want to process. Fitbit Set [FITBIT_DATA_STREAMS][TYPE] to the Fitbit data stream you want to process (e.g. fitbitjson_mysql ) and configure its parameters (e.g. [DATABASE_GROUP] ). Ignore the parameters of the other streams you are not using (e.g. [FOLDER] of aware_csv ). Warning You will probably have to tell RAPIDS the name of the columns where you stored your Fitbit data. To do this, modify your chosen stream\u2019s format.yaml column mappings to match your raw data column names. FITBIT_DATA_STREAMS : USE : fitbitjson_mysql # AVAILABLE: fitbitjson_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_mysql : DATABASE_GROUP : MY_GROUP SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitparsed_csv : FOLDER : data/external/fitbit_csv SLEEP_SUMMARY_LAST_NIGHT_END : 660 fitbitjson_mysql This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitjson_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitjson_csv This data stream processes Fitbit data inside a JSON column obtained from the Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitjson_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. fitbitparsed_mysql This data stream process Fitbit data stored in multiple columns after being parsed from the JSON column returned by Fitbit API and stored in a MySQL database. Read more about its column mappings and mutations in fitbitparsed_mysql . Key Description [DATABASE_GROUP] A database credentials group. Read the instructions below to set it up [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine. fitbitparsed_csv This data stream process Fitbit data stored in multiple columns (plain text) after being parsed from the JSON column returned by Fitbit API and stored in a CSV file. Read more about its column mappings and mutations in fitbitparsed_csv . Key Description [FOLDER] Folder where you have to place a CSV file per Fitbit sensor. Each file has to contain all the data from every participant you want to process. [SLEEP_SUMMARY_LAST_NIGHT_END] Segments are assigned based on this parameter. Any sleep episodes that start between today\u2019s SLEEP_SUMMARY_LAST_NIGHT_END (LNE) and tomorrow\u2019s LNE are regarded as today\u2019s sleep episodes. While today\u2019s bedtime is based on today\u2019s sleep episodes, today\u2019s wake time is based on yesterday\u2019s sleep episodes. Empatica Set [USE] to the Empatica data stream you want to use; see the table in introduction to data streams . Configure any parameters as indicated below. EMPATICA_DATA_STREAMS : USE : empatica_zip # AVAILABLE: empatica_zip : FOLDER : data/external/empatica empatica_zip Key Description [FOLDER] The relative path to a folder containing one subfolder per participant. The name of a participant folder should match their device_id assigned in their participant file. Each participant folder can have one or more zip files with any name; in other words, the sensor data in those zip files belong to a single participant. The zip files are automatically generated by Empatica and have a CSV file per sensor ( ACC , HR , TEMP , EDA , BVP , TAGS ). All CSV files of the same type contained in one or more zip files are uncompressed, parsed, sorted by timestamp, and joined together. Example of an EMPATICA FOLDER In the file tree below, we want to process three participants\u2019 data: p01 , p02 , and p03 . p01 has two zip files, p02 has only one zip file, and p03 has three zip files. Each zip has a CSV file per sensor that is joined together and processed by RAPIDS. data/ # this folder exists in the root RAPIDS folder external/ empatica/ p01/ file1.zip file2.zip p02/ aaaa.zip p03/ t1.zip t2.zip t3.zip","title":"Data Stream Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction We wrap Snakemake The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will execute the script that computes MESSAGES features and update its output file. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be loaded in memory at the same time. If RAPIDS crashes because it ran out of memory, reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Deleting RAPIDS output If you want to delete all the output files RAPIDS produces, you can execute the following command: ./rapids -j1 --delete-all-output Forcing a complete rerun or updating your raw data in RAPIDS If you want to update your raw data or rerun the whole pipeline from scratch, run the following commands: ./rapids -j1 --delete-all-output ./rapids -j1","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction We wrap Snakemake The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will execute the script that computes MESSAGES features and update its output file. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be loaded in memory at the same time. If RAPIDS crashes because it ran out of memory, reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Deleting RAPIDS output If you want to delete all the output files RAPIDS produces, you can execute the following command: ./rapids -j1 --delete-all-output Forcing a complete rerun or updating your raw data in RAPIDS If you want to update your raw data or rerun the whole pipeline from scratch, run the following commands: ./rapids -j1 --delete-all-output ./rapids -j1","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Linux (Ubuntu). Windows is supported through Docker or WSL. Docker Install Docker Pull our RAPIDS container docker pull moshiresearch/rapids:latest Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it moshiresearch/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure the Remote Containers extension Make sure RAPIDS Docker container is running Install VS Code and its Remote - Containers extension Click the Remote Explorer icon on the left-hand sidebar (the icon is a computer monitor) On the top right dropdown menu, choose Containers Right-click on the moshiresearch/rapids container in the CONTAINERS tree and select Attach to Container . A new VS Code window should open In the new window, open the /rapids/ folder via the File/Open... menu Run RAPIDS inside a terminal in VS Code. Open one with the Terminal/New Terminal menu Warning If you installed RAPIDS using Docker for Windows on Windows 10, the container will have limits on the amount of RAM it can use. If you find that RAPIDS crashes due to running out of memory, increase this limit. MacOS We tested these instructions in Catalina and Big Sur M1 Macs RAPIDS can run on M1 Macs, the only changes as of Feb 21, 2021 are: R needs to be installed via brew under Rosetta (x86 arch) due to incompatibility issues with some R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. Use x86 brew to install R and restore RAPIDS\u2019 packages ( snakemake -j1 renv_install & snakemake -j1 renv_restore ). There is a bug related to timezone codes. We set the correct TZ_DIR in renv/activate.R (line #19) Sys.setenv(\"TZDIR\" = file.path(R.home(), \"share\", \"zoneinfo\")) (RAPIDS does this automatically). Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested RAPIDS on Ubuntu 18.04 & 20.04. Note that the necessary Python and R packages are available in other Linux distributions, so if you decide to give it a try, let us know and we can update these docs. Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev sudo apt install libglpk40 Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository Ubuntu 18.04 Bionic sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' Ubuntu 20.04 Focal sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install the R virtual environment management package (renv) snakemake -j1 renv_install Restore the R virtual environment Ubuntu 18.04 Bionic (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/bionic/latest\"))' Ubuntu 20.04 Focal (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/focal/latest\"))' Ubuntu (slow) If the fast installation command failed for some reason, you can restore the R virtual environment from source: R -e 'renv::restore()' Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Windows There are several options varying in complexity: You can use our Docker instructions (tested) You can use our Ubuntu 20.04 instructions on WSL2 (not tested but it will likely work) Native installation (experimental). If you would like to contribute to RAPIDS you could try to install MySQL, miniconda, Python, and R 4.0+ in Windows and restore the Python and R virtual environments using steps 6 and 7 of the instructions for Mac. You can get in touch if you would like to discuss this with the team.","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Linux (Ubuntu). Windows is supported through Docker or WSL. Docker Install Docker Pull our RAPIDS container docker pull moshiresearch/rapids:latest Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it moshiresearch/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure the Remote Containers extension Make sure RAPIDS Docker container is running Install VS Code and its Remote - Containers extension Click the Remote Explorer icon on the left-hand sidebar (the icon is a computer monitor) On the top right dropdown menu, choose Containers Right-click on the moshiresearch/rapids container in the CONTAINERS tree and select Attach to Container . A new VS Code window should open In the new window, open the /rapids/ folder via the File/Open... menu Run RAPIDS inside a terminal in VS Code. Open one with the Terminal/New Terminal menu Warning If you installed RAPIDS using Docker for Windows on Windows 10, the container will have limits on the amount of RAM it can use. If you find that RAPIDS crashes due to running out of memory, increase this limit. MacOS We tested these instructions in Catalina and Big Sur M1 Macs RAPIDS can run on M1 Macs, the only changes as of Feb 21, 2021 are: R needs to be installed via brew under Rosetta (x86 arch) due to incompatibility issues with some R libraries. To do this, run your terminal via Rosetta , then proceed with the usual brew installation command. Use x86 brew to install R and restore RAPIDS\u2019 packages ( snakemake -j1 renv_install & snakemake -j1 renv_restore ). There is a bug related to timezone codes. We set the correct TZ_DIR in renv/activate.R (line #19) Sys.setenv(\"TZDIR\" = file.path(R.home(), \"share\", \"zoneinfo\")) (RAPIDS does this automatically). Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested RAPIDS on Ubuntu 18.04 & 20.04. Note that the necessary Python and R packages are available in other Linux distributions, so if you decide to give it a try, let us know and we can update these docs. Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev sudo apt install libglpk40 Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository Ubuntu 18.04 Bionic sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' Ubuntu 20.04 Focal sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install the R virtual environment management package (renv) snakemake -j1 renv_install Restore the R virtual environment Ubuntu 18.04 Bionic (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/bionic/latest\"))' Ubuntu 20.04 Focal (fast) Run the following command to restore the R virtual environment using RSPM binaries R -e 'renv::restore(repos = c(CRAN = \"https://packagemanager.rstudio.com/all/__linux__/focal/latest\"))' Ubuntu (slow) If the fast installation command failed for some reason, you can restore the R virtual environment from source: R -e 'renv::restore()' Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Windows There are several options varying in complexity: You can use our Docker instructions (tested) You can use our Ubuntu 20.04 instructions on WSL2 (not tested but it will likely work) Native installation (experimental). If you would like to contribute to RAPIDS you could try to install MySQL, miniconda, Python, and R 4.0+ in Windows and restore the Python and R virtual environments using steps 6 and 7 of the instructions for Mac. You can get in touch if you would like to discuss this with the team.","title":"Installation"},{"location":"setup/overview/","text":"Overview \u00b6 Let\u2019s review some key concepts we use throughout these docs: Definition Description Device A mobile or wearable device, like smartphones, Fitbit wrist bands, Oura Rings, etc. Sensor A physical or digital module builtin in a device that produces a data stream. For example, a smartphone\u2019s accelerometer or screen. Data Stream Set of sensor data collected using a specific device with a particular ** format** and stored in a specific container . For example, smartphone (device) data collected with the AWARE Framework (format) and stored in a MySQL database (container). Data Stream Format Sensor data produced by a data stream have columns with specific names and types. RAPIDS can process a data stream using a format.yaml file that describes the raw data columns and any necessary transformations. Data Stream Container Sensor data produced by a data stream can be stored in a database, electronic files, or arbitrary electronic containers. RAPIDS can pull (download) the data from a stream using a container script implemented in R or Python. Participant A person that took part in a monitoring study Behavioral feature A metric computed from raw sensor data quantifying the behavior of a participant. For example, time spent at home calculated from location data. These are also known as digital biomarkers Time segment Time segments (or epochs) are the time windows on which RAPIDS extracts behavioral features. For example, you might want to compute participants\u2019 time at home every morning or only during weekends. You define time segments in a CSV file that RAPIDS processes. Time zone A string like America/New_York that represents a time zone where a device logged data. You can process data collected in single or multiple time zones for every participant. Feature Provider A script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . config.yaml A YAML file where you can modify parameters to process data streams and behavioral features. This is the heart of RAPIDS and the file that you will change the most. credentials.yaml A YAML file where you can define credential groups (user, password, host, etc.) if your data stream needs to connect to a database or Web API Participant file(s) A YAML file that links one or more smartphone or wearable devices used by a single participant. RAPIDS needs one file per participant. What can I do with RAPIDS? Extract behavioral features from smartphone, Fitbit, and Empatica\u2019s supported data streams Add your own behavioral features (we can include them in RAPIDS if you want to share them with the community) Add support for new data streams if yours cannot be processed by RAPIDS yet Create visualizations for data quality control and feature inspection Extending RAPIDS to organize your analysis and publish a code repository along with your code Hint We recommend you follow the Minimal Example tutorial to get familiar with RAPIDS In order to follow any of the previous tutorials, you will have to Install , Configure , and learn how to Execute RAPIDS. Open a new discussion in Github if you have any questions and open an issue to report any bugs. Frequently Asked Questions \u00b6 General \u00b6 What exactly is RAPIDS? RAPIDS is a group of configuration files and R and Python scripts executed by Snakemake . You can get a copy of RAPIDS by cloning our Github repository. RAPIDS is not a web application or server; all the processing is done in your laptop, server, or computer cluster. How does RAPIDS work? You will most of the time only have to modify configuration files in YAML format ( config.yaml , credentials.yaml , and participant files pxx.yaml ), and in CSV format (time zones and time segments). RAPIDS pulls data from different data containers and processes it in steps. The input/output of each stage is saved as a CSV file for inspection; you can check the files created for each sensor on its documentation page. All data is stored in data/ , and all processing Python and R scripts are stored in src/ . User and File interactions in RAPIDS In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS Data flow in RAPIDS In the figure below, we represent the flow of data in RAPIDS. In broad terms, smartphone and wearable devices log data streams with a certain format to a data container (database, file, etc.). RAPIDS can connect to these containers if it has a format.yaml and a container.[R|py] script used to pull the correct data and mutate it to comply with RAPIDS\u2019 internal data representation. Once the data stream is in RAPIDS, it goes through some basic transformations (scripts), one that assigns a time segment and a time zone to each data row, and another one that creates \u201cepisodes\u201d of data for some sensors that need it (like screen, battery, activity recognition, and sleep intraday data). After this, RAPIDS executes the requested PROVIDER script that computes behavioral features per time segment instance. After every feature is computed, they are joined per sensor, per participant, and study. Visualizations are built based on raw data or based on calculated features. Data stream flow in RAPIDS Is my data private? Absolutely, you are processing your data with your own copy of RAPIDS in your laptop, server, or computer cluster, so neither we nor anyone else can access your datasets. Do I need to have coding skills to use RAPIDS? If you want to extract the behavioral features or visualizations that RAPIDS offers out of the box, the answer is no. However, you need to be comfortable running commands in your terminal and familiar with editing YAML files and CSV files. If you want to add support for new data streams or behavioral features, you need to be familiar with R or Python. Is RAPIDS open-source or free? Yes, RAPIDS is both open-source and free. How do I cite RAPIDS? Please refer to our Citation guide ; depending on what parts of RAPIDS you used, we also ask you to cite the work of other authors that shared their work. I have a lot of data, can RAPIDS handle it/ is RAPIDS fast enough? Yes, we use Snakemake under the hood, so you can automatically distribute RAPIDS execution over multiple cores or clusters . RAPIDS processes data per sensor and participant, so it can take advantage of this parallel processing. What are the advantages of using RAPIDS over implementing my own analysis code? We believe RAPIDS can benefit your analysis in several ways: RAPIDS has more than 250 behavioral features available, many of them tested and used by other researchers. RAPIDS can extract features in dynamic time segments (for example, every x minutes, x hours, x days, x weeks, x months, etc.). This is handy because you don\u2019t have to deal with time zones, daylight saving changes, or date arithmetic. Your analysis is less prone to errors. Every participant sensor dataset is analyzed in the same way and isolated from each other. If you have lots of data, out-of-the-box parallel execution will speed up your analysis, and if your computer crashes, RAPIDS will start from where it left off. You can publish your analysis code along with your papers and be sure it will run exactly as it does on your computer. You can still add your own behavioral features and data streams if you need to, and the community will be able to reuse your work. Data Streams \u00b6 Can I process smartphone data collected with Beiwe, PurpleRobot, or app X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. Can I process data from Oura Rings, Actigraphs, or wearable X? The only wearables we support at the moment are Empatica and Fitbit. However, get in touch if you need to process data from a different wearable. We have limited resources, so we add support for additional devices on an as-needed basis, but we would be happy to collaborate. Open a new discussion in Github if you have any questions. Can I process smartphone or wearable data stored in PostgreSQL, Oracle, SQLite, CSV files, or data container X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . If you are processing data streams we already support like AWARE, Fitbit, or Empatica and are just connecting to a different container, you can reuse their format.yaml and only implement a new container script. Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. I have participants that live in different time zones and some that travel; can RAPIDS handle this? Yes, RAPIDS can handle single or multiple timezones per participant. You can use time zone data collected by smartphones or collected by hand. Some of my participants used more than one device during my study; can RAPIDS handle this? Yes, you can link more than one smartphone or wearable device to a single participant. RAPIDS will merge them and sort them automatically. Some of my participants switched from Android to iOS or vice-versa during my study; can RAPIDS handle this? Yes, data from multiple smartphones can be linked to a single participant. All iOS data is converted to Android data before merging it. Extending RAPIDS \u00b6 Can I add my own behavioral features/digital biomarkers? Yes, you can implement your own features in R or Python following this tutorial Can I extract behavioral features based on two or more sensors? Yes, we do this for PHONE_DATA_YIELD (combines all phone sensors), PHONE_LOCATIONS (combines location and data yield data), PHONE_APPLICATIONS_BACKGROUND (combines screen and app usage data), and FITBIT_INTRADAY_STEPS (combines Fitbit and sleep and step data). However, we haven\u2019t come up with a user-friendly way to configure this, and currently, we join sensors on a case-by-case basis. This is mainly because not enough users have needed this functionality so far. Get in touch, and we can set it up together; the more use cases we are aware of, the easier it will be to integrate this into RAPIDS. I know how to program in Python or R but not both. Can I still use or extend RAPIDS? Yes, you don\u2019t need to write any code to use RAPIDS out of the box. If you need to add support for new data streams or behavioral features you can use scripts in either language. I have scripts that clean raw data from X sensor, can I use them with RAPIDS? Yes, you can add them as a [MUTATION][SCRIPT] in the format.yaml of the data stream you are using. You will add a main function that will receive a data frame with the raw data for that sensor that, in turn, will be used to compute behavioral features.","title":"Overview"},{"location":"setup/overview/#overview","text":"Let\u2019s review some key concepts we use throughout these docs: Definition Description Device A mobile or wearable device, like smartphones, Fitbit wrist bands, Oura Rings, etc. Sensor A physical or digital module builtin in a device that produces a data stream. For example, a smartphone\u2019s accelerometer or screen. Data Stream Set of sensor data collected using a specific device with a particular ** format** and stored in a specific container . For example, smartphone (device) data collected with the AWARE Framework (format) and stored in a MySQL database (container). Data Stream Format Sensor data produced by a data stream have columns with specific names and types. RAPIDS can process a data stream using a format.yaml file that describes the raw data columns and any necessary transformations. Data Stream Container Sensor data produced by a data stream can be stored in a database, electronic files, or arbitrary electronic containers. RAPIDS can pull (download) the data from a stream using a container script implemented in R or Python. Participant A person that took part in a monitoring study Behavioral feature A metric computed from raw sensor data quantifying the behavior of a participant. For example, time spent at home calculated from location data. These are also known as digital biomarkers Time segment Time segments (or epochs) are the time windows on which RAPIDS extracts behavioral features. For example, you might want to compute participants\u2019 time at home every morning or only during weekends. You define time segments in a CSV file that RAPIDS processes. Time zone A string like America/New_York that represents a time zone where a device logged data. You can process data collected in single or multiple time zones for every participant. Feature Provider A script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . config.yaml A YAML file where you can modify parameters to process data streams and behavioral features. This is the heart of RAPIDS and the file that you will change the most. credentials.yaml A YAML file where you can define credential groups (user, password, host, etc.) if your data stream needs to connect to a database or Web API Participant file(s) A YAML file that links one or more smartphone or wearable devices used by a single participant. RAPIDS needs one file per participant. What can I do with RAPIDS? Extract behavioral features from smartphone, Fitbit, and Empatica\u2019s supported data streams Add your own behavioral features (we can include them in RAPIDS if you want to share them with the community) Add support for new data streams if yours cannot be processed by RAPIDS yet Create visualizations for data quality control and feature inspection Extending RAPIDS to organize your analysis and publish a code repository along with your code Hint We recommend you follow the Minimal Example tutorial to get familiar with RAPIDS In order to follow any of the previous tutorials, you will have to Install , Configure , and learn how to Execute RAPIDS. Open a new discussion in Github if you have any questions and open an issue to report any bugs.","title":"Overview"},{"location":"setup/overview/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"setup/overview/#general","text":"What exactly is RAPIDS? RAPIDS is a group of configuration files and R and Python scripts executed by Snakemake . You can get a copy of RAPIDS by cloning our Github repository. RAPIDS is not a web application or server; all the processing is done in your laptop, server, or computer cluster. How does RAPIDS work? You will most of the time only have to modify configuration files in YAML format ( config.yaml , credentials.yaml , and participant files pxx.yaml ), and in CSV format (time zones and time segments). RAPIDS pulls data from different data containers and processes it in steps. The input/output of each stage is saved as a CSV file for inspection; you can check the files created for each sensor on its documentation page. All data is stored in data/ , and all processing Python and R scripts are stored in src/ . User and File interactions in RAPIDS In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS Data flow in RAPIDS In the figure below, we represent the flow of data in RAPIDS. In broad terms, smartphone and wearable devices log data streams with a certain format to a data container (database, file, etc.). RAPIDS can connect to these containers if it has a format.yaml and a container.[R|py] script used to pull the correct data and mutate it to comply with RAPIDS\u2019 internal data representation. Once the data stream is in RAPIDS, it goes through some basic transformations (scripts), one that assigns a time segment and a time zone to each data row, and another one that creates \u201cepisodes\u201d of data for some sensors that need it (like screen, battery, activity recognition, and sleep intraday data). After this, RAPIDS executes the requested PROVIDER script that computes behavioral features per time segment instance. After every feature is computed, they are joined per sensor, per participant, and study. Visualizations are built based on raw data or based on calculated features. Data stream flow in RAPIDS Is my data private? Absolutely, you are processing your data with your own copy of RAPIDS in your laptop, server, or computer cluster, so neither we nor anyone else can access your datasets. Do I need to have coding skills to use RAPIDS? If you want to extract the behavioral features or visualizations that RAPIDS offers out of the box, the answer is no. However, you need to be comfortable running commands in your terminal and familiar with editing YAML files and CSV files. If you want to add support for new data streams or behavioral features, you need to be familiar with R or Python. Is RAPIDS open-source or free? Yes, RAPIDS is both open-source and free. How do I cite RAPIDS? Please refer to our Citation guide ; depending on what parts of RAPIDS you used, we also ask you to cite the work of other authors that shared their work. I have a lot of data, can RAPIDS handle it/ is RAPIDS fast enough? Yes, we use Snakemake under the hood, so you can automatically distribute RAPIDS execution over multiple cores or clusters . RAPIDS processes data per sensor and participant, so it can take advantage of this parallel processing. What are the advantages of using RAPIDS over implementing my own analysis code? We believe RAPIDS can benefit your analysis in several ways: RAPIDS has more than 250 behavioral features available, many of them tested and used by other researchers. RAPIDS can extract features in dynamic time segments (for example, every x minutes, x hours, x days, x weeks, x months, etc.). This is handy because you don\u2019t have to deal with time zones, daylight saving changes, or date arithmetic. Your analysis is less prone to errors. Every participant sensor dataset is analyzed in the same way and isolated from each other. If you have lots of data, out-of-the-box parallel execution will speed up your analysis, and if your computer crashes, RAPIDS will start from where it left off. You can publish your analysis code along with your papers and be sure it will run exactly as it does on your computer. You can still add your own behavioral features and data streams if you need to, and the community will be able to reuse your work.","title":"General"},{"location":"setup/overview/#data-streams","text":"Can I process smartphone data collected with Beiwe, PurpleRobot, or app X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. Can I process data from Oura Rings, Actigraphs, or wearable X? The only wearables we support at the moment are Empatica and Fitbit. However, get in touch if you need to process data from a different wearable. We have limited resources, so we add support for additional devices on an as-needed basis, but we would be happy to collaborate. Open a new discussion in Github if you have any questions. Can I process smartphone or wearable data stored in PostgreSQL, Oracle, SQLite, CSV files, or data container X? Yes, but you need to add a new data stream to RAPIDS (a new format.yaml and container script in R or Python). Follow this tutorial . If you are processing data streams we already support like AWARE, Fitbit, or Empatica and are just connecting to a different container, you can reuse their format.yaml and only implement a new container script. Open a new discussion in Github if you have any questions. If you do so, let us know so we can integrate your work into RAPIDS. I have participants that live in different time zones and some that travel; can RAPIDS handle this? Yes, RAPIDS can handle single or multiple timezones per participant. You can use time zone data collected by smartphones or collected by hand. Some of my participants used more than one device during my study; can RAPIDS handle this? Yes, you can link more than one smartphone or wearable device to a single participant. RAPIDS will merge them and sort them automatically. Some of my participants switched from Android to iOS or vice-versa during my study; can RAPIDS handle this? Yes, data from multiple smartphones can be linked to a single participant. All iOS data is converted to Android data before merging it.","title":"Data Streams"},{"location":"setup/overview/#extending-rapids","text":"Can I add my own behavioral features/digital biomarkers? Yes, you can implement your own features in R or Python following this tutorial Can I extract behavioral features based on two or more sensors? Yes, we do this for PHONE_DATA_YIELD (combines all phone sensors), PHONE_LOCATIONS (combines location and data yield data), PHONE_APPLICATIONS_BACKGROUND (combines screen and app usage data), and FITBIT_INTRADAY_STEPS (combines Fitbit and sleep and step data). However, we haven\u2019t come up with a user-friendly way to configure this, and currently, we join sensors on a case-by-case basis. This is mainly because not enough users have needed this functionality so far. Get in touch, and we can set it up together; the more use cases we are aware of, the easier it will be to integrate this into RAPIDS. I know how to program in Python or R but not both. Can I still use or extend RAPIDS? Yes, you don\u2019t need to write any code to use RAPIDS out of the box. If you need to add support for new data streams or behavioral features you can use scripts in either language. I have scripts that clean raw data from X sensor, can I use them with RAPIDS? Yes, you can add them as a [MUTATION][SCRIPT] in the format.yaml of the data stream you are using. You will add a main function that will receive a data frame with the raw data for that sensor that, in turn, will be used to compute behavioral features.","title":"Extending RAPIDS"},{"location":"snippets/aware_format/","text":"If you collected sensor data with the vanilla (original) AWARE mobile clients, you shouldn\u2019t need to modify this format (described below). Remember that a format maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs . The yaml file that describes the format of this data stream is at: src/data/streams/aware_csv/format.yaml For some sensors, we need to transform iOS data into Android format; you can refer to OS complex mapping for learn how this works. Hint The mappings in this stream (RAPIDS/Stream) are the same names because AWARE data was the first stream RAPIDS supported, meaning that it considers AWARE column names the default. PHONE_ACCELEROMETER ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_VALUES_0 double_values_0 DOUBLE_VALUES_1 double_values_1 DOUBLE_VALUES_2 double_values_2 MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_ACTIVITY_RECOGNITION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME activity_name ACTIVITY_TYPE activity_type CONFIDENCE confidence MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id ACTIVITY_NAME FLAG_TO_MUTATE ACTIVITY_TYPE FLAG_TO_MUTATE CONFIDENCE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column ACTIVITIES activities CONFIDENCE confidence SCRIPTS src/data/streams/mutations/phone/aware/activity_recogniton_ios_unification.R Note For RAPIDS columns of ACTIVITY_NAME and ACTIVITY_TYPE : if stream\u2019s activities field is automotive, set ACTIVITY_NAME = in_vehicle and ACTIVITY_TYPE = 0 if stream\u2019s activities field is cycling, set ACTIVITY_NAME = on_bicycle and ACTIVITY_TYPE = 1 if stream\u2019s activities field is walking, set ACTIVITY_NAME = walking and ACTIVITY_TYPE = 7 if stream\u2019s activities field is running, set ACTIVITY_NAME = running and ACTIVITY_TYPE = 8 if stream\u2019s activities field is stationary, set ACTIVITY_NAME = still and ACTIVITY_TYPE = 3 if stream\u2019s activities field is unknown, set ACTIVITY_NAME = unknown and ACTIVITY_TYPE = 4 For RAPIDS CONFIDENCE column: if stream\u2019s confidence field is 0, set CONFIDENCE = 0 if stream\u2019s confidence field is 1, set CONFIDENCE = 50 if stream\u2019s confidence field is 2, set CONFIDENCE = 100 PHONE_APPLICATIONS_CRASHES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name APPLICATION_VERSION application_version ERROR_SHORT error_short ERROR_LONG error_long ERROR_CONDITION error_condition IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_FOREGROUND ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name IS_SYSTEM_APP is_system_app MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_APPLICATIONS_NOTIFICATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name APPLICATION_NAME application_name TEXT text SOUND sound VIBRATE vibrate DEFAULTS defaults FLAGS flags MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_BATTERY ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS battery_status BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Client V1 RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BATTERY_STATUS FLAG_TO_MUTATE BATTERY_LEVEL battery_level BATTERY_SCALE battery_scale MUTATION COLUMN_MAPPINGS Script column Stream column BATTERY_STATUS battery_status SCRIPTS src/data/streams/mutations/phone/aware/battery_ios_unification.R Note For RAPIDS BATTERY_STATUS column: if stream\u2019s battery_status field is 3, set BATTERY_STATUS = 5 (full status) if stream\u2019s battery_status field is 1, set BATTERY_STATUS = 3 (discharge) IOS Client V2 Same as ANDROID PHONE_BLUETOOTH ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id BT_ADDRESS bt_address BT_NAME bt_name BT_RSSI bt_rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android). PHONE_CALLS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE call_type CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id CALL_TYPE FLAG_TO_MUTATE CALL_DURATION call_duration TRACE trace MUTATION COLUMN_MAPPINGS Script column Stream column CALL_TYPE call_type SCRIPTS src/data/streams/mutations/phone/aware/calls_ios_unification.R Note We transform iOS call logs into Android\u2019s format. iOS stores call status: 1=incoming, 2=connected, 3=dialing, 4=disconnected, as opposed to Android\u2019s events: 1=incoming, 2=outgoing, 3=missed. We follow this algorithm to convert iOS call data (there are some inaccuracies in the way we handle sequences, see new rules below): Search for the disconnected (4) status as it is common to all calls Group all events that preceded every status 4 We convert every 1,2,4 (or 2,1,4) sequence to an incoming call We convert every 3,2,4 (or 2,3,4) sequence to an outgoing call We convert every 1,4 or 3,4 sequence to a missed call (either incoming or outgoing) We set the duration of the call to be the sum of every status (dialing/ringing to hangup) as opposed to the duration of the last status (pick up to hang up) Tested with an Android (OnePlus 7T) and an iPhone XR Call type Android (duration) iOS (duration) New Rule Outgoing missed ended by me 2 (0) 3,4 (0,X) 3,4 is converted to 2 with duration 0 Outgoing missed ended by them 2(0) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2* Incoming missed ended by me NA** 1,4 (0,X) 1,4 is converted to 3 with duration 0 Incoming missed ended by them 3(0) 1,4 (0,X) 1,4 is converted to 3 with duration 0 Outgoing answered 2(X excluding dialing time) 3,2,4 (0,X,X2) 3,2,4 is converted to 2 with duration X2 Incoming answered 1(X excluding dialing time) 1,2,4 (0,X,X2) 1,2,4 is converted to 1 with duration X2 .* There is no way to differentiate an outgoing missed call ended by them from an outgoing answered call because the phone goes directly to voice mail and it counts as call time (essentially the voice mail answered). .** Android does not record incoming missed calls ended by the participant, just those ended by the person calling or ignored by the participant. PHONE_CONVERSATION ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_ENERGY double_energy INFERENCE inference DOUBLE_CONVO_START FLAG_TO_MUTATE DOUBLE_CONVO_END FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column DOUBLE_CONVO_START double_convo_start DOUBLE_CONVO_END double_convo_end SCRIPTS src/data/streams/mutations/phone/aware/conversation_ios_timestamp.R Note For RAPIDS columns of DOUBLE_CONVO_START and DOUBLE_CONVO_END : if stream\u2019s double_convo_start field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_START = 1000 * double_convo_start . if stream\u2019s double_convo_end field is smaller than 9999999999, it is in seconds instead of milliseconds. Set DOUBLE_CONVO_END = 1000 * double_convo_end . PHONE_KEYBOARD ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id PACKAGE_NAME package_name BEFORE_TEXT before_text CURRENT_TEXT current_text IS_PASSWORD is_password MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LIGHT ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LIGHT_LUX double_light_lux ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_LOCATIONS ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id DOUBLE_LATITUDE double_latitude DOUBLE_LONGITUDE double_longitude DOUBLE_BEARING double_bearing DOUBLE_SPEED double_speed DOUBLE_ALTITUDE double_altitude PROVIDER provider ACCURACY accuracy MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_LOG ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id LOG_MESSAGE log_message MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_MESSAGES ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MESSAGE_TYPE message_type TRACE trace MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS This sensor is not supported by iOS devices. PHONE_SCREEN ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS screen_status MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SCREEN_STATUS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column SCREEN_STATUS screen_status SCRIPTS src/data/streams/mutations/phone/aware/screen_ios_unification.R Note For SCREEN_STATUS RAPIDS column: if stream\u2019s screen_status field is 2 (lock episode), set SCREEN_STATUS = 0 (off episode). PHONE_WIFI_CONNECTED ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id MAC_ADDRESS mac_address SSID ssid BSSID bssid MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Same as ANDROID PHONE_WIFI_VISIBLE ANDROID RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP timestamp DEVICE_ID device_id SSID ssid BSSID bssid SECURITY security FREQUENCY frequency RSSI rssi MUTATION COLUMN_MAPPINGS (None) SCRIPTS (None) IOS Only old iOS versions supported this sensor (same mapping as Android).","title":"Aware format"},{"location":"snippets/database/","text":"Setting up a DATABASE_GROUP and its connection credentials. If you haven\u2019t done so, create an empty file called credentials.yaml in your RAPIDS root directory: Add the following lines to credentials.yaml and replace your database-specific credentials (user, password, host, and database): MY_GROUP : database : MY_DATABASE host : MY_HOST password : MY_PASSWORD port : 3306 user : MY_USER Notes The label [MY_GROUP] is arbitrary but it has to match the [DATABASE_GROUP] attribute of the data stream you choose to use. Indentation matters You can have more than one credentials group in credentials.yaml Upgrading from ./.env from RAPIDS 0.x In RAPIDS versions 0.x, database credentials were stored in a ./.env file. If you are migrating from that type of file, you have two options: Migrate your credentials by hand: change .env format [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE to credentials.yaml format MY_GROUP : user : MY_USER password : MY_PASSWORD host : MY_HOST port : 3306 database : MY_DATABASE Use the migration script we provide (make sure your conda environment is active): python tools / update_format_env . py Connecting to localhost (host machine) from inside our docker container. If you are using RAPIDS\u2019 docker container and Docker-for-mac or Docker-for-Windows 18.03+, you can connect to a MySQL database in your host machine using host.docker.internal instead of 127.0.0.1 or localhost . In a Linux host, you need to run our docker container using docker run --network=\"host\" -d moshiresearch/rapids:latest and then 127.0.0.1 will point to your host machine.","title":"Database"},{"location":"snippets/feature_introduction_example/","text":"Sensor section Each sensor (accelerometer, screen, etc.) of every supported device (smartphone, Fitbit, etc.) has a section in the config.yaml with parameters and feature PROVIDERS . Sensor Parameters. Each sensor section has one or more parameters. These are parameters that affect different aspects of how the raw data is pulled, and processed. The CONTAINER parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers Each object in this list represents a feature PROVIDER . Each sensor can have zero, one, or more providers. A PROVIDER is a script that creates behavioral features for a specific sensor. Providers are created by the core RAPIDS team or by the community, which are named after its first author like [PHONE_LOCATIONS][DORYAB] . In this example, there are two accelerometer feature providers RAPIDS and PANDA . PROVIDER Parameters Each PROVIDER has parameters that affect the computation of the behavioral features it offers. These parameters include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. PROVIDER Features Each PROVIDER offers a set of behavioral features. These features are grouped in an array for some providers, like those for RAPIDS provider. For others, they are grouped in a collection of arrays, like those for PANDAS provider. In either case, you can delete the features you are not interested in, and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page. PROVIDER script Each PROVIDER has a SRC_SCRIPT that points to the script implementing its behavioral features. It has to be a relative path from RAPIDS\u2019 root folder and the script\u2019s parent folder should be named after the provider, e.g. panda .","title":"Feature introduction example"},{"location":"snippets/jsonfitbit_format/","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitjson_csv/format.yaml If you want RAPIDS to process Fitbit sensor data using this stream, you will need to map DEVICE_ID and JSON_FITBIT_COLUMN to your own raw data columns inside each sensor section in format.yaml . FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESOUTOFRANGE FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESFATBURN FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESCARDIO FLAG_TO_MUTATE HEARTRATE_DAILY_CALORIESPEAK FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id HEARTRATE FLAG_TO_MUTATE HEARTRATE_ZONE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_heartrate_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the raw data RAPIDS expects for this data stream device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME FLAG_TO_MUTATE LOCAL_END_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id EFFICIENCY FLAG_TO_MUTATE MINUTES_AFTER_WAKEUP FLAG_TO_MUTATE MINUTES_ASLEEP FLAG_TO_MUTATE MINUTES_AWAKE FLAG_TO_MUTATE MINUTES_TO_FALL_ASLEEP FLAG_TO_MUTATE MINUTES_IN_BED FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_summary_json.py - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE DEVICE_ID device_id TYPE_EPISODE_ID FLAG_TO_MUTATE DURATION FLAG_TO_MUTATE IS_MAIN_SLEEP FLAG_TO_MUTATE TYPE FLAG_TO_MUTATE LEVEL FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_sleep_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note Fitbit API has two versions for sleep data, v1 and v1.2, we support both. All columns except DEVICE_ID are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_summary_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API. See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME FLAG_TO_MUTATE STEPS FLAG_TO_MUTATE MUTATION COLUMN_MAPPINGS Script column Stream column JSON_FITBIT_COLUMN fitbit_data SCRIPTS - src/data/streams/mutations/fitbit/parse_steps_intraday_json.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note TIMESTAMP , LOCAL_DATE_TIME , and STEPS are parsed from JSON_FITBIT_COLUMN . JSON_FITBIT_COLUMN is a string column containing the JSON objects returned by Fitbit\u2019s API . See an example of the raw data RAPIDS expects for this data stream: Example of the expected raw data device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}}","title":"Jsonfitbit format"},{"location":"snippets/parsedfitbit_format/","text":"The format.yaml maps and transforms columns in your raw data stream to the mandatory columns RAPIDS needs for Fitbit sensors . This file is at: src/data/streams/fitbitparsed_mysql/format.yaml If you want to use this stream with your data, modify every sensor in format.yaml to map all columns except TIMESTAMP in [RAPIDS_COLUMN_MAPPINGS] to your raw data column names. All columns are mandatory; however, all except device_id and local_date_time can be empty if you don\u2019t have that data. Just have in mind that some features will be empty if some of these columns are empty. FITBIT_HEARTRATE_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE_DAILY_RESTINGHR heartrate_daily_restinghr HEARTRATE_DAILY_CALORIESOUTOFRANGE heartrate_daily_caloriesoutofrange HEARTRATE_DAILY_CALORIESFATBURN heartrate_daily_caloriesfatburn HEARTRATE_DAILY_CALORIESCARDIO heartrate_daily_caloriescardio HEARTRATE_DAILY_CALORIESPEAK heartrate_daily_caloriespeak MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 FITBIT_HEARTRATE_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id HEARTRATE heartrate HEARTRATE_ZONE heartrate_zone MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the raw data RAPIDS expects for this data stream device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange FITBIT_SLEEP_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME FLAG_TO_MUTATE LOCAL_START_DATE_TIME local_start_date_time LOCAL_END_DATE_TIME local_end_date_time DEVICE_ID device_id EFFICIENCY efficiency MINUTES_AFTER_WAKEUP minutes_after_wakeup MINUTES_ASLEEP minutes_asleep MINUTES_AWAKE minutes_awake MINUTES_TO_FALL_ASLEEP minutes_to_fall_asleep MINUTES_IN_BED minutes_in_bed IS_MAIN_SLEEP is_main_sleep TYPE type MUTATION COLUMN_MAPPINGS (None) SCRIPTS - src/data/streams/mutations/fitbit/add_local_date_time.py - src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2. We support both but ignore v1\u2019s count_awake , duration_awake , and count_awakenings , count_restless , duration_restless columns. Example of the expected raw data device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages FITBIT_SLEEP_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE LOCAL_DATE_TIME local_date_time DEVICE_ID device_id TYPE_EPISODE_ID type_episode_id DURATION duration IS_MAIN_SLEEP is_main_sleep TYPE type LEVEL level MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Fitbit API has two versions for sleep data, v1 and v1.2, we support both. Example of the expected raw data device_id type_episode_id local_date_time duration level is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:36:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:37:30 660 asleep 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 0 2020-10-10 15:48:30 60 restless 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u2026 \u2026 \u2026 \u2026 \u2026 \u2026 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:46:30 420 light 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 1 2020-10-10 01:53:30 1230 deep 1 stages FITBIT_STEPS_SUMMARY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 FITBIT_STEPS_INTRADAY RAPIDS_COLUMN_MAPPINGS RAPIDS column Stream column TIMESTAMP FLAG_TO_MUTATE DEVICE_ID device_id LOCAL_DATE_TIME local_date_time STEPS steps MUTATION COLUMN_MAPPINGS (None) SCRIPTS src/data/streams/mutations/fitbit/add_zero_timestamp.py Note add_zero_timestamp adds an all-zero column called timestamp that will be filled in later in the pipeline by readable_time.R converting LOCAL_DATE_TIME to a unix timestamp taking into account single or multiple time zones. Example of the expected raw data device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Parsedfitbit format"},{"location":"visualizations/data-quality-visualizations/","text":"Data Quality Visualizations \u00b6 We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (example01 and example02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.) 1. Histograms of phone data yield \u00b6 RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, morning, afternoon, evening, and night) 2. Heatmaps of overall data yield \u00b6 These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of each time segment instance or the time delta between each time segment instance and the start of the first instance for each participant. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants example01 and example02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). [ABSOLUTE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants [RELATIVE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants 3. Heatmap of recorded phone sensors \u00b6 In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant example01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 7 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant 4. Heatmap of sensor row count \u00b6 These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. A grey cell represents missing data in that time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 14 phone sensors (including data yield) of example01\u2019s daily segments. From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"Data Quality"},{"location":"visualizations/data-quality-visualizations/#data-quality-visualizations","text":"We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (example01 and example02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)","title":"Data Quality Visualizations"},{"location":"visualizations/data-quality-visualizations/#1-histograms-of-phone-data-yield","text":"RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, morning, afternoon, evening, and night)","title":"1. Histograms of phone data yield"},{"location":"visualizations/data-quality-visualizations/#2-heatmaps-of-overall-data-yield","text":"These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of each time segment instance or the time delta between each time segment instance and the start of the first instance for each participant. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants example01 and example02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). [ABSOLUTE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants [RELATIVE_TIME] Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants","title":"2. Heatmaps of overall data yield"},{"location":"visualizations/data-quality-visualizations/#3-heatmap-of-recorded-phone-sensors","text":"In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant example01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 7 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant","title":"3. Heatmap of recorded phone sensors"},{"location":"visualizations/data-quality-visualizations/#4-heatmap-of-sensor-row-count","text":"These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. A grey cell represents missing data in that time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 14 phone sensors (including data yield) of example01\u2019s daily segments. From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"4. Heatmap of sensor row count"},{"location":"visualizations/feature-visualizations/","text":"Feature Visualizations \u00b6 1. Heatmap Correlation Matrix \u00b6 Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"Features"},{"location":"visualizations/feature-visualizations/#feature-visualizations","text":"","title":"Feature Visualizations"},{"location":"visualizations/feature-visualizations/#1-heatmap-correlation-matrix","text":"Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"1. Heatmap Correlation Matrix"},{"location":"workflow-examples/analysis/","text":"Analysis Workflow Example \u00b6 TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers Why should I integrate my analysis in RAPIDS? \u00b6 Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS. Analysis workflow structure \u00b6 To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules . Description of the study modeled in our analysis workflow example \u00b6 Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share files with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation Configure and run the analysis workflow example \u00b6 Install RAPIDS Unzip the CSV files inside rapids_example_csv.zip in data/external/example_workflow/*.csv . Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Note you will see a lot of warning messages, you can ignore them since they happen because we ran ML algorithms with a small fake dataset. Modules of our analysis workflow example \u00b6 1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the data/external/example_workflow/participant_info.csv file. As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the data/external/example_workflow/participant_target.csv file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_sensor_features_for_all_participants rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 161 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 109 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Complete Example"},{"location":"workflow-examples/analysis/#analysis-workflow-example","text":"TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers","title":"Analysis Workflow Example"},{"location":"workflow-examples/analysis/#why-should-i-integrate-my-analysis-in-rapids","text":"Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS.","title":"Why should I integrate my analysis in RAPIDS?"},{"location":"workflow-examples/analysis/#analysis-workflow-structure","text":"To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules .","title":"Analysis workflow structure"},{"location":"workflow-examples/analysis/#description-of-the-study-modeled-in-our-analysis-workflow-example","text":"Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share files with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation","title":"Description of the study modeled in our analysis workflow example"},{"location":"workflow-examples/analysis/#configure-and-run-the-analysis-workflow-example","text":"Install RAPIDS Unzip the CSV files inside rapids_example_csv.zip in data/external/example_workflow/*.csv . Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Note you will see a lot of warning messages, you can ignore them since they happen because we ran ML algorithms with a small fake dataset.","title":"Configure and run the analysis workflow example"},{"location":"workflow-examples/analysis/#modules-of-our-analysis-workflow-example","text":"1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the data/external/example_workflow/participant_info.csv file. As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the data/external/example_workflow/participant_target.csv file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_sensor_features_for_all_participants rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 161 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 109 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Modules of our analysis workflow example"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for 24 hr ( 00:00:00 to 23:59:59 ) and night ( 00:00:00 to 05:59:59 ) time segments of every day of data of one participant that was monitored on the US East coast with an Android smartphone. Install RAPIDS and make sure your conda environment is active (see Installation ) Download this CSV file and save it as data/external/aware_csv/calls.csv Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Required configuration changes ( click to expand ) Supported data streams . Based on the docs, we decided to use the aware_csv data stream because we are processing aware data saved in a CSV file. We will use this label in a later step; there\u2019s no need to type it or save it anywhere yet. Create your participants file . Since we are processing data from a single participant, you only need to create a single participant file called p01.yaml in data/external/participant_files . This participant file only has a PHONE section because this hypothetical participant was only monitored with a smartphone. Note that for a real analysis, you can do this automatically with a CSV file Add p01 to [PIDS] in config.yaml Create a file in data/external/participant_files/p01.yaml with the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty Select what time segments you want to extract features on. Set [TIME_SEGMENTS][FILE] to data/external/timesegments_periodic.csv Create a file in data/external/timesegments_periodic.csv with the following content label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 Choose the timezone of your study . We will use the default time zone settings since this example is processing data collected on the US East Coast ( America/New_York ) TIMEZONE : TYPE : SINGLE SINGLE : TZCODE : America/New_York Modify your device data stream configuration Set [PHONE_DATA_STREAMS][USE] to aware_csv . We will use the default value for [PHONE_DATA_STREAMS][aware_csv][FOLDER] since we already stored the test calls CSV file there. Select what sensors and features you want to process. Set [PHONE_CALLS][CONTAINER] to calls.csv in the config.yaml file. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True in the config.yaml file. Example of the config.yaml sections after the changes outlined above This will be your config.yaml after following the instructions above. Click on the numbered markers to know more. PIDS : [ p01 ] # (1) TIMEZONE : TYPE : SINGLE # (2) SINGLE : TZCODE : America/New_York # ... other irrelevant sections TIME_SEGMENTS : &time_segments TYPE : PERIODIC # (3) FILE : \"data/external/timesegments_periodic.csv\" # (4) INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE PHONE_DATA_STREAMS : USE : aware_csv # (5) aware_csv : FOLDER : data/external/aware_csv # (6) # ... other irrelevant sections ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS : CONTAINER : calls.csv # (7) PROVIDERS : RAPIDS : COMPUTE : True # (8) CALL_TYPES : ... We added p01 to PIDS after creating the participant file: data/external/participant_files/p01.yaml With the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty We use the default SINGLE time zone. We use the default PERIODIC time segment [TYPE] We created this time segments file with these lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,001:00:00,5H 59M 59S,every_day,0 We set [USE] to aware_device to tell RAPIDS to process sensor data collected with the AWARE Framework stored in CSV files. We used the default [FOLDER] for awre_csv since we already stored our test calls.csv file there We changed [CONTAINER] to calls.csv to process our test call data. We flipped [COMPUTE] to True to extract call behavioral features using the RAPIDS feature provider. Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in data/processed/features/all_participants/all_sensor_features.csv","title":"Minimal Example"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for 24 hr ( 00:00:00 to 23:59:59 ) and night ( 00:00:00 to 05:59:59 ) time segments of every day of data of one participant that was monitored on the US East coast with an Android smartphone. Install RAPIDS and make sure your conda environment is active (see Installation ) Download this CSV file and save it as data/external/aware_csv/calls.csv Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Required configuration changes ( click to expand ) Supported data streams . Based on the docs, we decided to use the aware_csv data stream because we are processing aware data saved in a CSV file. We will use this label in a later step; there\u2019s no need to type it or save it anywhere yet. Create your participants file . Since we are processing data from a single participant, you only need to create a single participant file called p01.yaml in data/external/participant_files . This participant file only has a PHONE section because this hypothetical participant was only monitored with a smartphone. Note that for a real analysis, you can do this automatically with a CSV file Add p01 to [PIDS] in config.yaml Create a file in data/external/participant_files/p01.yaml with the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty Select what time segments you want to extract features on. Set [TIME_SEGMENTS][FILE] to data/external/timesegments_periodic.csv Create a file in data/external/timesegments_periodic.csv with the following content label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 Choose the timezone of your study . We will use the default time zone settings since this example is processing data collected on the US East Coast ( America/New_York ) TIMEZONE : TYPE : SINGLE SINGLE : TZCODE : America/New_York Modify your device data stream configuration Set [PHONE_DATA_STREAMS][USE] to aware_csv . We will use the default value for [PHONE_DATA_STREAMS][aware_csv][FOLDER] since we already stored the test calls CSV file there. Select what sensors and features you want to process. Set [PHONE_CALLS][CONTAINER] to calls.csv in the config.yaml file. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True in the config.yaml file. Example of the config.yaml sections after the changes outlined above This will be your config.yaml after following the instructions above. Click on the numbered markers to know more. PIDS : [ p01 ] # (1) TIMEZONE : TYPE : SINGLE # (2) SINGLE : TZCODE : America/New_York # ... other irrelevant sections TIME_SEGMENTS : &time_segments TYPE : PERIODIC # (3) FILE : \"data/external/timesegments_periodic.csv\" # (4) INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE PHONE_DATA_STREAMS : USE : aware_csv # (5) aware_csv : FOLDER : data/external/aware_csv # (6) # ... other irrelevant sections ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS : CONTAINER : calls.csv # (7) PROVIDERS : RAPIDS : COMPUTE : True # (8) CALL_TYPES : ... We added p01 to PIDS after creating the participant file: data/external/participant_files/p01.yaml With the following content: PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 ] # the participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty We use the default SINGLE time zone. We use the default PERIODIC time segment [TYPE] We created this time segments file with these lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,001:00:00,5H 59M 59S,every_day,0 We set [USE] to aware_device to tell RAPIDS to process sensor data collected with the AWARE Framework stored in CSV files. We used the default [FOLDER] for awre_csv since we already stored our test calls.csv file there We changed [CONTAINER] to calls.csv to process our test call data. We flipped [COMPUTE] to True to extract call behavioral features using the RAPIDS feature provider. Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in data/processed/features/all_participants/all_sensor_features.csv","title":"Minimal Working Example"}]} \ No newline at end of file diff --git a/dev/sitemap.xml b/dev/sitemap.xml index 09fade4d..f1c9324b 100644 --- a/dev/sitemap.xml +++ b/dev/sitemap.xml @@ -2,382 +2,382 @@ https://www.rapids.science/dev/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/change-log/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/citation/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/code_of_conduct/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/common-errors/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/contributing/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/migrating-from-old-versions/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/team/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/add-new-data-streams/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/aware-csv/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/aware-influxdb/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/aware-mysql/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/data-streams-introduction/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/empatica-zip/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/fitbitjson-csv/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/fitbitjson-mysql/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/fitbitparsed-csv/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/fitbitparsed-mysql/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/mandatory-empatica-format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/mandatory-fitbit-format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/datastreams/mandatory-phone-format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/documentation/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/git-flow/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/remote-support/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/test-cases/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/testing/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/validation-schema-config/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/developers/virtual-environments/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/add-new-features/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-accelerometer/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-blood-volume-pulse/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-electrodermal-activity/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-heartrate/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-inter-beat-interval/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-tags/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/empatica-temperature/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/feature-introduction/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-calories-intraday/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-data-yield/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-heartrate-intraday/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-heartrate-summary/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-sleep-intraday/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-sleep-summary/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-steps-intraday/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/fitbit-steps-summary/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-accelerometer/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-activity-recognition/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-applications-crashes/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-applications-foreground/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-applications-notifications/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-battery/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-bluetooth/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-calls/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-conversation/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-data-yield/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-keyboard/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-light/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-locations/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-log/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-messages/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-screen/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-wifi-connected/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/features/phone-wifi-visible/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/setup/configuration/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/setup/execution/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/setup/installation/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/setup/overview/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/snippets/aware_format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/snippets/database/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/snippets/feature_introduction_example/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/snippets/jsonfitbit_format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/snippets/parsedfitbit_format/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/visualizations/data-quality-visualizations/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/visualizations/feature-visualizations/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/workflow-examples/analysis/ - 2021-06-23 + 2021-06-29 daily https://www.rapids.science/dev/workflow-examples/minimal/ - 2021-06-23 + 2021-06-29 daily \ No newline at end of file diff --git a/dev/sitemap.xml.gz b/dev/sitemap.xml.gz index d7988597f7c4c917ee0842ed7f61af858383baa6..db7e642b3279ea56a74aa7d6ad26774192c7046c 100644 GIT binary patch delta 504 zcmVU5C(GWB zmVu|#)%~K0+IDZ16<)zi0ytgFTp}C^DtW~c+RP5x-S^JXr3Ad4ygN011mZ@!24KBz zc&F+{x|y!ieMS5PuR0_zfPOuYcVSL_w+&}IfAR4qTj?cUA|NO0yXj*??>giMIvdQkc znX`@~3;bO9cwNxv|T{7aKhnaFxts*!<->tR6vB3 z8>Wm*uAjIp+GZhx8%eK(Y9I^>y;YmpX;-lfIy4JsHJ6)GLCl@DRzC;I#E-~sc)ODF1ij|6OvMgs;cL~Xmb$_lSwCIOr-W-bwq1eJMW32kNv?e2T$=u!gSPTrjwKLT;1T?4RQ zH@s7IBi&5b>AoU#}q7eK$BTdQ>;F;k-+0Fwb-eAuMD`?W=n*R2. Heatmaps of overall data yield

      These heatmaps are a break down per time segment and per participant of Visualization 1. Heatmap’s rows represent participants, columns represent time segment instances and the cells’ color represent the valid yielded minute or hour ratio for a participant during a time segment instance.

      -

      As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of the start of each time segment instance or the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment.

      +

      As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis can be labelled with the absolute time of each time segment instance or the time delta between each time segment instance and the start of the first instance for each participant. These plots provide a quick study overview of the monitoring coverage per person and per time segment.

      The figure below shows the heatmap of the valid yielded minute ratio for participants example01 and example02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones).

      @@ -1888,7 +1888,7 @@

      4. Heatmap of sensor row count

      These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2. Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2.

      -

      In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell’s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis.

      +

      In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell’s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. A grey cell represents missing data in that time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis.

      The figure below shows data for 14 phone sensors (including data yield) of example01’s daily segments. From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23rd), peaks of location coordinates on Apr 26th and Apr 30th, and no sent or received SMS except for Apr 23rd, Apr 29th and Apr 30th (unlabeled row between screen and locations).

      Example

      diff --git a/dev/workflow-examples/analysis/index.html b/dev/workflow-examples/analysis/index.html index 04299980..209fef76 100644 --- a/dev/workflow-examples/analysis/index.html +++ b/dev/workflow-examples/analysis/index.html @@ -1899,7 +1899,7 @@
      5. Data visualization.

      At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots.

      6. Feature cleaning.

      In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml.

      -

      After this step, we kept 158 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 106 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones.

      +

      After this step, we kept 161 features over 11 days for the individual model of p01, 101 features over 12 days for the individual model of p02 and 109 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones.

      Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk.

      7. Merge features and targets.

      In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk. Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk. These two merged files are the input for our individual and population models.

    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