From 57a92f7fab3116d9fc8feb892c38a7abacd52c8b Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 09:50:57 +0300 Subject: [PATCH 1/8] CGM input files examples --- README.md | 44 +- tests/data/dexcom_eur_01.xlsx | Bin 0 -> 142811 bytes tests/data/dexcom_eur_02.xlsx | Bin 0 -> 144319 bytes tests/data/dexcom_eur_03.xlsx | Bin 0 -> 138587 bytes tests/data/libre_amer_01.csv | 1342 +++++++++++++++++++++++++++++++++ tests/data/libre_amer_02.csv | 1341 ++++++++++++++++++++++++++++++++ 6 files changed, 2710 insertions(+), 17 deletions(-) create mode 100644 tests/data/dexcom_eur_01.xlsx create mode 100644 tests/data/dexcom_eur_02.xlsx create mode 100644 tests/data/dexcom_eur_03.xlsx create mode 100644 tests/data/libre_amer_01.csv create mode 100644 tests/data/libre_amer_02.csv diff --git a/README.md b/README.md index 46bcbbd..6f50f44 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,27 @@ A significant focus of this project has been ensuring compatibility with the ori This approach ensures that the Python implementation produces results consistent with the original R package. -## Unit Test Status +### Input & Output +The implementation maintains compatibility with the R version while following Python best practices. The metrics can be used as: + +```Python +import iglu_python ias iglu + +# With DataFrame input +result_df = iglu.cv_glu(data) # data should have 'id', 'time', and 'gl' columns +# Return DataFrame with "id' and column(s) with value(s) + +# With Series input (some metrics require Series with DateTimeIndex) +result_float = iglu.cv_glu(glucose_series) # just glucose values +# returns a single float value + +# Same with function that support list or ndarray +result_float = iglu.cv_glu(glucose_list) # list of glucose values +# returns a single float value + +``` + +## IGLU-R Compatibility Test Status The current version of IGLU-PYTHON is test-compatible with IGLU-R v4.2.2 Unless noted, IGLU-R test compatability is considered successful if it achieves precision of 0.001 @@ -69,25 +89,15 @@ Unless noted, IGLU-R test compatability is considered successful if it achieves | process_data | Data Pre-Processor | ✅ | | CGMS2DayByDay |Interpolate glucose input| ✅ | -### Input & Output -The implementation maintains compatibility with the R version while following Python best practices. The metrics can be used as: - -```Python -import iglu_python ias iglu - -# With DataFrame input -result_df = iglu.cv_glu(data) # data should have 'id', 'time', and 'gl' columns -# Return DataFrame with "id' and column(s) with value(s) +## Extended functionality +IGLU_PYTHON extends beyond the capabilities of the original IGLU-R package by offering enhanced functionality and improved user experience. We believe that combining these extended features with the proven reliability of IGLU-R creates a powerful synergy that benefits both the research community and wide software developers community. -# With Series input (some metrics require Series with DateTimeIndex) -result_float = iglu.cv_glu(glucose_series) # just glucose values -# returns a single float value -# Same with function that support list or ndarray -result_float = iglu.cv_glu(glucose_list) # list of glucose values -# returns a single float value -``` +| Function | Description | +|-------------------|------------------------------------------| +| load_libre() | Load Timeseries from Libre device file (CGM reading converted into mg/dL) +| load_dexcom() | Load Timeseries from Dexcom device file (CGM reading converted into mg/dL) # Installation diff --git a/tests/data/dexcom_eur_01.xlsx b/tests/data/dexcom_eur_01.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..54b67b8a6b0b78d65dd57ea8469949993be65b03 GIT binary patch literal 142811 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%0Am~an$DCS>QBpmJlIj)q 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 J6#lvGe*sT-{WMN*OX$$gE7wR7B<| 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

b5@%;n|yh`u$TEJGTz~v98^tKPG(sZzqM(59%Ng z@q;SleOl#k(JnfDY^5ArjE?=IoIayIp9SX!M|2nV189!7R=@=k9MM^*-I>>Q8F#&PR~_Xbd4O&3oXrpl7D)ReHqA zkzqb?j%;jeT=+{F4*0ke`-!)-Sm2{}yy0Bi@u55?MmzP?Ib0^tVhR48Q8F6uJ! zT{`-}-}I_)_ z7j4;?_ReU>ke+ZC2ef`u`rcCpwdOja9TeZC_8*UuOYHZ|4zPb1!2UN+0PF)s!`>T- z_nvHWhE&`G+Z&lfZ0{M2Yn_!ZsvsdFZ~JMah8%ECBYOAG4dRCM%u*V4eH+xSH*#GC zc-8wWRH5D^h9M4nPKwxRA&Z0aU&C?0z<-G)|5B@QCMT$E2-^y=#^Z@*aug-x3 zu(cZ$ew=jdPfgZjz2BgZz+v6;ccojJ^r@b*@#hCvI#RDL5~@#rqmY2&|7sn;%Kc`p-Y1bfhcX$J5Q*GN0_Do=X`ey&!vY zEf9dZ=)$!RJ=#P5Oy5aNKX}9tS1mq$lof?6*bO5ewh#J$`6*t ziVTzhTs;K7jC^6gNhh97ni6h)I~P2;SHzQR7A#3Ac3!Do*Z|<-q`S zsYgL(GJ%hqLbGs+({PF=^U>?CUj;6=ZL;h;nHSum12e2gZ|ku^oL#G#?fplt$_(0_ z<0q3+6I#xqzIpfmU@&$y)Bt&ZHYoHJ%K~0z^R3L$>(7R%&Kf7Sru?BD;=SvxIpud-X!%Cz9E#4|EQaq z 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%0Am+{2Oj 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 literal 0 HcmV?d00001 diff --git a/tests/data/libre_amer_01.csv b/tests/data/libre_amer_01.csv new file mode 100644 index 0000000..df6e785 --- /dev/null +++ b/tests/data/libre_amer_01.csv @@ -0,0 +1,1342 @@ +Patient report,Generated on,04-26-2021 05:25 PM UTC,Generated by,xxxx,,,,,,,,,,,,,, +xxxx,xxxx,,,,,,,,,,,,,,,,, +Device,Serial Number,Device Timestamp,Record Type,Historic Glucose mg/dL,Scan Glucose mg/dL,Non-numeric Rapid-Acting Insulin,Rapid-Acting Insulin (units),Non-numeric Food,Carbohydrates (grams),Carbohydrates (servings),Non-numeric Long-Acting Insulin,Long-Acting Insulin (units),Notes,Strip Glucose mg/dL,Ketone mmol/L,Meal Insulin (units),Correction Insulin (units),User Change Insulin (units) +FreeStyle Libre Pro,xxxx,03-20-2021 05:38 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 05:53 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 06:08 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 06:23 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 06:38 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 06:53 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 07:08 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 07:23 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 07:38 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 07:53 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 08:08 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 08:23 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 08:38 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 08:53 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 09:08 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 09:23 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 09:38 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 09:53 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 10:08 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 10:23 PM,0,204,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 10:38 PM,0,201,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 10:53 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 11:08 PM,0,199,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 11:23 PM,0,205,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 11:38 PM,0,199,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-20-2021 11:53 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:08 AM,0,188,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:23 AM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:38 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:53 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:08 AM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:23 AM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:38 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:53 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:08 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:23 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:38 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:53 AM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:08 AM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:23 AM,0,75,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:38 AM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:53 AM,0,74,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:08 AM,0,75,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:23 AM,0,73,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:38 AM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:53 AM,0,75,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:08 AM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:23 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:38 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:53 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:08 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:23 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:38 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:53 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:23 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:38 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:53 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:08 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:23 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:08 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:23 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:38 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:53 AM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:08 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:23 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:38 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:08 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:38 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:53 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:08 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:23 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:38 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 12:53 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:08 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:23 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:38 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 01:53 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:08 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:23 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:38 PM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 02:53 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:08 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:23 PM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:38 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 03:53 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:08 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:23 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:38 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 04:53 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:08 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:23 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:38 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 05:53 PM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:08 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:23 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:38 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 06:53 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:08 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:23 PM,0,75,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:38 PM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 07:53 PM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:08 PM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:23 PM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:38 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 08:53 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:08 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:23 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:38 PM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 09:53 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:08 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:23 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:38 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 10:53 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:08 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:38 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-21-2021 11:53 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:08 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:23 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:38 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:53 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:08 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:23 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:38 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:53 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:08 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:23 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:38 AM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:53 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:08 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:23 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:38 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:53 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:08 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:23 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:38 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:08 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:23 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:38 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:53 AM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:08 AM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:23 AM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:38 AM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:53 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:08 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:23 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:38 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:53 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:08 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:23 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:38 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:53 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:08 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:23 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:38 AM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:53 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:08 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:23 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:38 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:53 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:08 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:23 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:38 AM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:53 AM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:08 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:23 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:38 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 12:53 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:08 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:23 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:38 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 01:53 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:08 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:23 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:38 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 02:53 PM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:08 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:23 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:38 PM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 03:53 PM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:08 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:23 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:38 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 04:53 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:08 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:23 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:38 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 05:53 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:08 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:23 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:38 PM,0,211,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 06:53 PM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:08 PM,0,227,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:23 PM,0,222,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:38 PM,0,218,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 07:53 PM,0,206,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:08 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:23 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:38 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 08:53 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:08 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:23 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:38 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 09:53 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:08 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:23 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:38 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 10:53 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:08 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:23 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:38 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-22-2021 11:53 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:08 AM,0,206,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:23 AM,0,206,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:38 AM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:53 AM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:08 AM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:23 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:38 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:08 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:23 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:38 AM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:53 AM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:08 AM,0,73,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:23 AM,0,71,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:38 AM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:53 AM,0,73,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:08 AM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:23 AM,0,71,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:38 AM,0,71,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:53 AM,0,71,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:08 AM,0,71,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:23 AM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:38 AM,0,73,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:53 AM,0,73,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:08 AM,0,74,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:23 AM,0,75,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:38 AM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:53 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:08 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:23 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:38 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:53 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:08 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:23 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:38 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:23 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:38 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:53 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:08 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:23 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:38 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:53 AM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:08 AM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:23 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:38 AM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:53 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:08 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:23 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:38 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:53 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:08 PM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:23 PM,0,76,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:38 PM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:53 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:08 PM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:23 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:38 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:53 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:08 PM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:23 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:38 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:53 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:08 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:23 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:38 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:53 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:08 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:23 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:38 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:53 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:08 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:23 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:38 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:53 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:08 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:23 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:38 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:53 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:08 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:23 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:38 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:53 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:08 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:23 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:38 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:53 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:08 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:23 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:38 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:53 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:08 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:23 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:38 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:53 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:08 AM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:23 AM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:38 AM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:53 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:08 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:23 AM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:38 AM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:53 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:08 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:23 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:38 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:53 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:08 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:23 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:38 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:53 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:08 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:23 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:38 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:53 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:08 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:23 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:38 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:53 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:08 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:23 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:38 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:53 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:08 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:23 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:53 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:08 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:23 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:38 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:53 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:08 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:23 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:38 AM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:53 AM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:08 AM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:23 AM,0,182,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:38 AM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:53 AM,0,184,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:08 AM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:23 AM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:38 AM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:53 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:08 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:38 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:53 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:08 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:23 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:38 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:53 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:08 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:23 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:38 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:53 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:08 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:23 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:38 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:53 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:08 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:23 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:38 PM,0,184,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:53 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:08 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:23 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:38 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:53 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:08 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:23 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:38 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:53 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:08 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:23 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:38 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:53 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:08 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:23 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:38 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:53 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:08 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:23 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:38 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:53 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:08 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:23 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:38 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:53 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:08 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:23 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:38 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:53 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:08 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:23 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:38 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:53 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:08 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:23 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:38 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:08 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:23 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:38 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:53 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:08 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:38 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:08 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:23 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:38 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:53 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:08 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:23 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:38 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:53 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:08 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:08 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:23 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:38 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:53 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:08 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:23 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:38 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:53 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:08 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:38 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:08 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:23 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:38 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:53 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:08 AM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:23 AM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:38 AM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:53 AM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:08 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:23 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:38 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:53 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:08 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:23 PM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:38 PM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:53 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:08 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:23 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:38 PM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:53 PM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:08 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:23 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:38 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:53 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:08 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:23 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:38 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:53 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:08 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:23 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:38 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:53 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:08 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:23 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:38 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:53 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:08 PM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:23 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:38 PM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:53 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:08 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:23 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:38 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:53 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:08 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:23 PM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:38 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:53 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:08 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:23 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:38 PM,0,184,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:53 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:08 PM,0,194,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:23 PM,0,191,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:38 PM,0,186,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:53 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:08 AM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:23 AM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:38 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:53 AM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:08 AM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:23 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:38 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:53 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:08 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:23 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:38 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:53 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:08 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:38 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:08 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:23 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:38 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:53 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:08 AM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:23 AM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:38 AM,0,76,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:53 AM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:08 AM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:23 AM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:38 AM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:53 AM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:08 AM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:23 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:38 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:53 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:08 AM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:23 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:38 AM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:53 AM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:08 AM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:23 AM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:38 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:53 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:08 AM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:23 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:38 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:53 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:08 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:23 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:38 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:53 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:08 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:38 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:53 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:08 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:23 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:53 PM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:08 PM,0,210,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:23 PM,0,209,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:38 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:53 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:08 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:23 PM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:38 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:53 PM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:08 PM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:23 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:38 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:53 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:08 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:23 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:38 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:53 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:08 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:23 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:38 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:53 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:08 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:23 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:38 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:53 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:08 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:38 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:53 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:08 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:23 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:38 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:53 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:08 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:23 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:38 PM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:53 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:08 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:23 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:38 PM,0,196,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:53 PM,0,202,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:08 AM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:23 AM,0,210,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:38 AM,0,209,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:53 AM,0,210,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:08 AM,0,213,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:23 AM,0,213,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:38 AM,0,218,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:53 AM,0,224,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:08 AM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:23 AM,0,214,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:38 AM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:53 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:08 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:23 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:38 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:08 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:38 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:53 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:08 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:23 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:38 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:53 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:08 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:23 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:38 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:53 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:08 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:23 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:38 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:53 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:08 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:23 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:38 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:53 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:08 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:23 AM,0,88,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:38 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:53 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:08 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:23 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:38 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:53 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:08 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:23 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:38 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:53 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:08 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:23 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:38 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:53 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:08 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:23 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:38 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:53 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:08 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:23 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:38 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:53 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:08 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:23 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:53 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:08 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:23 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:38 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:53 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:08 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:23 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:38 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:53 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:08 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:23 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:38 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:53 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:08 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:23 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:38 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:53 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:08 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:23 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:38 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:53 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:08 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:23 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:38 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:53 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:08 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:23 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:38 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:53 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:08 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:23 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:38 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:53 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:08 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:23 AM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:38 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:53 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:08 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:23 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:38 AM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:53 AM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:08 AM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:23 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:38 AM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:53 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:08 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:23 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:38 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:53 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:08 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:23 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:53 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:08 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:38 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:53 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:38 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:08 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:53 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:08 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:23 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:38 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:53 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:08 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:23 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:38 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:53 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:08 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:23 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:38 AM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:53 AM,0,194,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:08 AM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:23 AM,0,234,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:38 AM,0,225,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:53 AM,0,206,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:08 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:23 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:38 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:53 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:08 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:23 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:38 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:53 PM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:08 PM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:23 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:38 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:53 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:08 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:23 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:53 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:08 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:23 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:38 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:53 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:08 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:23 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:38 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:53 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:08 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:23 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:38 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:53 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:08 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:23 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:38 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:53 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:08 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:23 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:38 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:53 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:08 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:23 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:38 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:53 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:08 PM,0,186,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:23 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:38 PM,0,182,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:53 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:08 PM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:23 PM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:38 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:53 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:08 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:23 AM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:38 AM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:53 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:08 AM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:23 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:38 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:53 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:08 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:23 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:38 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:08 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:23 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:38 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:53 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:38 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:53 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:38 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:53 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:23 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:38 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:53 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:08 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:23 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:38 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:08 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:23 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:38 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:08 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:23 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:38 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:08 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:23 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:38 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:53 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:08 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:23 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:38 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:53 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:08 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:23 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:38 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:53 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:08 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:23 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:38 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:53 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:08 PM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:23 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:38 PM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:53 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:08 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:23 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:38 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:53 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:08 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:23 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:38 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:53 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:08 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:23 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:38 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:53 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:08 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:38 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:53 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:08 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:38 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:53 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:08 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:23 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:38 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:53 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:08 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:38 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:53 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:08 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:23 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:38 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:53 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:08 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:23 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:53 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:08 AM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:23 AM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:38 AM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:53 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:08 AM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:23 AM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:38 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:53 AM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:08 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:23 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:38 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:53 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:08 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:23 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:53 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:38 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:38 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:08 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:23 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:38 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:08 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:23 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:38 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:53 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:08 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:23 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:38 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:53 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:08 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:23 AM,0,188,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:38 AM,0,202,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:53 AM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:08 AM,0,206,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:23 AM,0,198,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:38 AM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:53 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:08 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:23 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:38 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:53 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:08 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:38 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:53 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:08 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:23 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:38 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:53 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:08 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:38 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:53 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:08 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:38 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:53 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:08 PM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:23 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:38 PM,0,80,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:53 PM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:08 PM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:23 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:38 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:53 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:08 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:23 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:38 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:53 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:08 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:23 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:38 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:53 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:08 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:23 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:38 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:53 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:08 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:23 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:38 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:53 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:08 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:23 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:38 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:53 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:08 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:23 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:53 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:08 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:23 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:38 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:53 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:08 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:23 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:38 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:53 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:08 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:23 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:38 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:53 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:08 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:23 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:38 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:53 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:08 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:23 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:38 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:53 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:08 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:38 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:53 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:08 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:38 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:53 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:08 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:23 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:08 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:23 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:38 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:53 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:08 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:23 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:08 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:23 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:38 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:53 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:08 AM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:23 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:38 AM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:53 AM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:08 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:23 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:38 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:53 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:08 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:23 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:38 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:53 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:08 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:23 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:38 PM,0,205,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:53 PM,0,227,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:08 PM,0,232,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:23 PM,0,229,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:38 PM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:53 PM,0,213,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:08 PM,0,208,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:23 PM,0,202,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:38 PM,0,193,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:53 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:08 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:23 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:38 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:53 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:08 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:23 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:38 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:53 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:08 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:23 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:38 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:53 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:08 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:23 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:38 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:53 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:08 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:23 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:38 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:53 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:08 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:23 PM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:38 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:53 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:08 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:23 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:38 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:53 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:08 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:23 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:38 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:53 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:08 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:23 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:38 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:53 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:23 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:38 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:08 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:23 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:38 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:53 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:08 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:23 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:38 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:53 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:08 AM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:23 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:38 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:53 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:08 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:23 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:38 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:08 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:23 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:53 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:23 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:38 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:53 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:08 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:23 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:38 AM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:53 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:08 AM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:23 AM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:38 AM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:53 AM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:08 AM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:23 AM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:38 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:53 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:08 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:23 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:38 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:53 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:08 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:23 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:38 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:53 PM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:08 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:23 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:38 PM,0,79,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:53 PM,0,77,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:08 PM,0,78,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:23 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:38 PM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:53 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:08 PM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:23 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:38 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:53 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:08 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:23 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:38 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:53 PM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:08 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:23 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:38 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:53 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:08 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:23 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:38 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:53 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:08 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:23 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:38 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:53 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:08 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:23 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:38 PM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:53 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:08 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:23 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:38 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:53 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:08 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:23 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:38 PM,0,186,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:53 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:08 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:23 AM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:38 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:53 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:08 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:23 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:38 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:53 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:08 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:23 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:08 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:23 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:38 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:53 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:08 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:23 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:38 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:53 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:08 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:23 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:38 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:53 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:38 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:53 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:23 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:38 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:53 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:08 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:23 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:38 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:53 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:08 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:23 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:38 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:53 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:08 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:23 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:38 AM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:53 AM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:08 AM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:23 AM,0,199,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:38 AM,0,202,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:53 AM,0,188,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:08 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:23 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:38 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:53 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:08 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:23 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:38 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:53 PM,0,86,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:08 PM,0,72,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:23 PM,0,63,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:38 PM,0,59,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:53 PM,0,58,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:08 PM,0,64,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:23 PM,0,74,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:38 PM,0,82,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:53 PM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:08 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:23 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:38 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:53 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:08 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:23 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:38 PM,0,195,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:53 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:08 PM,0,210,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:23 PM,0,222,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:38 PM,0,224,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:53 PM,0,221,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:08 PM,0,213,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:23 PM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:38 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:53 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:08 PM,0,188,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:23 PM,0,190,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:38 PM,0,191,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:53 PM,0,197,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:08 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:23 PM,0,199,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:38 PM,0,199,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:53 PM,0,200,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:08 PM,0,209,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:23 PM,0,221,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:38 PM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:53 PM,0,221,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:08 PM,0,220,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:23 PM,0,225,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:38 PM,0,232,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:53 PM,0,237,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:08 AM,0,234,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:23 AM,0,225,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:38 AM,0,214,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:53 AM,0,209,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:08 AM,0,197,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:23 AM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:38 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:53 AM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:08 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:23 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:38 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:53 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:08 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:23 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:38 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:53 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:23 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:38 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:23 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:38 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:08 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:23 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:38 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:53 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:08 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:23 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:38 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:53 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:08 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:23 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:38 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:53 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:08 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:23 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:38 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:53 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:08 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:23 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:38 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:53 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:08 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:23 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:38 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:53 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:08 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:23 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:38 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:53 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:08 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:23 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:38 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:53 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:08 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:23 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:38 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:53 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:08 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:23 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:38 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:53 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:08 PM,0,110,,,,,,,,,,,,,, diff --git a/tests/data/libre_amer_02.csv b/tests/data/libre_amer_02.csv new file mode 100644 index 0000000..5b8ffc2 --- /dev/null +++ b/tests/data/libre_amer_02.csv @@ -0,0 +1,1341 @@ +Patient report,Generated on,04-26-2021 04:41 PM UTC,Generated by,xxxx,,,,,,,,,,,,,, +xxxx,xxxx,,,,,,,,,,,,,,,,, +Device,Serial Number,Device Timestamp,Record Type,Historic Glucose mg/dL,Scan Glucose mg/dL,Non-numeric Rapid-Acting Insulin,Rapid-Acting Insulin (units),Non-numeric Food,Carbohydrates (grams),Carbohydrates (servings),Non-numeric Long-Acting Insulin,Long-Acting Insulin (units),Notes,Strip Glucose mg/dL,Ketone mmol/L,Meal Insulin (units),Correction Insulin (units),User Change Insulin (units) +FreeStyle Libre Pro,xxxx,03-23-2021 03:26 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:41 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:56 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:11 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:26 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:41 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:56 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:26 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:41 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:56 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:11 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:26 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:41 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:56 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:11 AM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:26 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:41 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:11 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:26 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:41 AM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:56 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:11 AM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:26 AM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:41 AM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:56 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:11 AM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:26 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:41 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:56 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:11 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:11 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:26 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:41 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 12:56 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:11 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:41 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 01:56 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:11 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:26 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:41 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 02:56 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:11 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:26 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:41 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 03:56 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:11 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:26 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:41 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 04:56 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:11 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:26 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:41 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 05:56 PM,0,201,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:11 PM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:26 PM,0,201,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:41 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 06:56 PM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:11 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:26 PM,0,193,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:41 PM,0,203,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 07:56 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:11 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:26 PM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:41 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 08:56 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:11 PM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:26 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:41 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 09:56 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:11 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:26 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 10:56 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:11 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:26 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:41 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-23-2021 11:56 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:11 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:26 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:56 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:11 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:26 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:41 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:56 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:11 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:26 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:41 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:56 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:11 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:26 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:41 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:56 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:26 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:41 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:56 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:11 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:26 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:41 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:56 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:11 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:26 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:41 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:11 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:26 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:41 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:56 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:11 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:26 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:41 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:56 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:11 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:41 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:11 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:26 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:41 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:56 AM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:11 AM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:26 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:41 AM,0,182,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:56 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:11 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:26 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:41 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 12:56 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:11 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:26 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:41 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 01:56 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:11 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:41 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 02:56 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:11 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:26 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:41 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 03:56 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:11 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:41 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 04:56 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:11 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:26 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:41 PM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 05:56 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:11 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:26 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:41 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 06:56 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:11 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:26 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:41 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 07:56 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:11 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:26 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:41 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 08:56 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:11 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:26 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:41 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 09:56 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:11 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:26 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:41 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 10:56 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:11 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:26 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-24-2021 11:56 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:11 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:11 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:26 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:11 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:41 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:56 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:11 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:41 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:56 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:11 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:56 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:11 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:41 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:26 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:41 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:56 AM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:11 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:26 AM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:41 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:56 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:26 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:41 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:56 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:11 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:26 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:41 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:56 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:11 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:26 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:41 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:56 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:11 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:26 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:41 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:56 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:11 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:41 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 12:56 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:11 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:26 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:41 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 01:56 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:11 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:26 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:41 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 02:56 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:11 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:26 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:41 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 03:56 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:11 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:26 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:41 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 04:56 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:11 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:26 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:41 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 05:56 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:11 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:26 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:41 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 06:56 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:11 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:26 PM,0,186,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:41 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 07:56 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:11 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:26 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:41 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 08:56 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:11 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:26 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:41 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 09:56 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:11 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:41 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 10:56 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:26 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:41 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-25-2021 11:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:11 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:26 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:41 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:56 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:11 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:26 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:41 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:56 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:41 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:56 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:11 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:26 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:41 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:56 AM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:11 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:26 AM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:41 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:56 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:11 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:26 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:56 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:26 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:41 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:56 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:26 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:41 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:11 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:26 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:41 AM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:56 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:26 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:41 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:56 AM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:11 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:26 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:41 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:56 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:41 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:56 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:11 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:26 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:41 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 12:56 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:11 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:26 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:41 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 01:56 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:11 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:26 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:41 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 02:56 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:11 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:26 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:41 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 03:56 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:11 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:26 PM,0,190,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:41 PM,0,204,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 04:56 PM,0,213,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:11 PM,0,218,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:26 PM,0,217,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:41 PM,0,211,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 05:56 PM,0,196,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:11 PM,0,191,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:26 PM,0,194,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:41 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 06:56 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:11 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:26 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:41 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 07:56 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:11 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:26 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:41 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 08:56 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:11 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:41 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 09:56 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:11 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:26 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:41 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 10:56 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:11 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:26 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:41 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-26-2021 11:56 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:11 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:26 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:26 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:41 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:56 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:41 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:56 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:11 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:56 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:11 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:26 AM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:41 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:56 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:26 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:56 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:11 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:26 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:41 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:56 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:11 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:26 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:41 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:56 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:11 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:26 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:56 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:11 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:26 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:41 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:56 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:26 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:41 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:56 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:11 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:26 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 12:56 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:11 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:41 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 01:56 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:11 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:26 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:41 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 02:56 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:11 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:26 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:41 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 03:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:11 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:26 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:41 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 04:56 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:11 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:26 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:41 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 05:56 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:11 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:26 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:41 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 06:56 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:11 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:26 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:41 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 07:56 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:11 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:26 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:41 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 08:56 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:11 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:26 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:41 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 09:56 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:11 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:26 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:41 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 10:56 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:11 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:26 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:41 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-27-2021 11:56 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:11 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:26 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:41 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:56 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:11 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:26 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:41 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:11 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:41 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:56 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:11 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:41 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:56 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:11 AM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:26 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:41 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:56 AM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:41 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:56 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:11 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:41 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:26 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:56 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:11 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:26 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:41 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:11 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:26 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:56 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:41 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:56 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:11 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:26 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:41 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 12:56 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:11 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:26 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:41 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 01:56 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:11 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:26 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:41 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 02:56 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:11 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:26 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:41 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 03:56 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:11 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:26 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:41 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 04:56 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:11 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:26 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:41 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 05:56 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:11 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:26 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:41 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 06:56 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:11 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:26 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:41 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 07:56 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:11 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:41 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 08:56 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:26 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:41 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 09:56 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:11 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:26 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:41 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 10:56 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:11 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:41 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-28-2021 11:56 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:11 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:26 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:41 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:11 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:11 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:26 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:41 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:56 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:11 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:26 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:41 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:56 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:11 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:26 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:56 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:26 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:41 AM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:56 AM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:11 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:41 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:56 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:11 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:26 AM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:41 AM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:56 AM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:11 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:26 AM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:41 AM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:56 AM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:11 AM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:26 AM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:41 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:56 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:11 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:26 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:41 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:56 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:11 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:41 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 12:56 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:11 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:41 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 01:56 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:26 PM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:41 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 02:56 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:11 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:26 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:41 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 03:56 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:11 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:26 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:41 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 04:56 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:11 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:26 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:41 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 05:56 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:11 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:26 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:41 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 06:56 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:11 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:26 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:41 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 07:56 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:11 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:26 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:41 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 08:56 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:11 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:26 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:41 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 09:56 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:11 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:26 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:41 PM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 10:56 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:26 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:41 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-29-2021 11:56 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:11 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:56 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:41 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:56 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:11 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:41 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:11 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:26 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:41 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:56 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:11 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:26 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:41 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:26 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:41 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:11 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:26 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:41 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:56 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:11 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:26 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:56 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:11 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:41 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:26 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:41 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:56 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:11 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:26 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:41 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:26 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:41 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:56 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:11 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:26 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:41 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 12:56 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:11 PM,0,184,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:26 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:41 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 01:56 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:11 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:26 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:41 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 02:56 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:11 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:26 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:41 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 03:56 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:11 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:26 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:41 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 04:56 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:11 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:26 PM,0,161,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:41 PM,0,168,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 05:56 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:11 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:26 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:41 PM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 06:56 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:11 PM,0,171,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:26 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:41 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 07:56 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:11 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:26 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:41 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 08:56 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:11 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:26 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:41 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 09:56 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:11 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:26 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:41 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 10:56 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:11 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:26 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:41 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-30-2021 11:56 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:26 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:41 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:56 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:11 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:26 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:56 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:11 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:26 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:41 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:56 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:11 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:26 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:41 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:56 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:11 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:26 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:41 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:41 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:56 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:11 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:26 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:41 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:56 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:11 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:26 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:41 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:56 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:11 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:26 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:56 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:11 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:26 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:41 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:26 AM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:41 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:56 AM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:11 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:26 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:41 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 12:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:11 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:41 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 01:56 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:11 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:26 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:41 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 02:56 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:11 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:26 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:41 PM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 03:56 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:11 PM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:26 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:41 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 04:56 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:11 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:26 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:41 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 05:56 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:11 PM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:26 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:41 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 06:56 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:11 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:26 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:41 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 07:56 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:11 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:26 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:41 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 08:56 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:11 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:26 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:41 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 09:56 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:11 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 10:56 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:11 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:26 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:41 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,03-31-2021 11:56 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:11 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:26 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:11 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:41 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:56 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:11 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:26 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:41 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:56 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:11 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:26 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:41 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:56 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:11 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:26 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:56 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:11 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:11 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:26 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:41 AM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:56 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:11 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:26 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:41 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:56 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:11 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:26 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:41 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:56 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:11 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:26 AM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:41 AM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:56 AM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:11 AM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:26 AM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:41 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:56 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:11 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:26 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:41 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 12:56 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:11 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:26 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:41 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 01:56 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:11 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:41 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 02:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:11 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:26 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:41 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 03:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:11 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:41 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 04:56 PM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:11 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:26 PM,0,170,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:41 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 05:56 PM,0,186,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:11 PM,0,197,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:26 PM,0,208,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:41 PM,0,215,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 06:56 PM,0,217,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:11 PM,0,207,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:26 PM,0,192,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:41 PM,0,195,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 07:56 PM,0,218,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:11 PM,0,232,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:26 PM,0,223,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:41 PM,0,205,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 08:56 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:11 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:26 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:41 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 09:56 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:11 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:26 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:41 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 10:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:11 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:26 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:41 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-01-2021 11:56 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:56 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:11 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:41 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:41 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:56 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:11 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:26 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:11 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:26 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:41 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:56 AM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:11 AM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:26 AM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:41 AM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:56 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:26 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:41 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:56 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:11 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:26 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:41 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:56 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:11 AM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:26 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:41 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:56 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:11 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:26 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:41 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:56 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:11 AM,0,89,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:26 AM,0,90,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:41 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:11 PM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:26 PM,0,87,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:41 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 12:56 PM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:11 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:26 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:41 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 01:56 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:11 PM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:41 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 02:56 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:11 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:26 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:41 PM,0,164,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 03:56 PM,0,182,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:11 PM,0,197,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:26 PM,0,195,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:41 PM,0,181,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 04:56 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:11 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:26 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:41 PM,0,178,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 05:56 PM,0,179,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:11 PM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:26 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:41 PM,0,185,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 06:56 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:11 PM,0,172,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:26 PM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:41 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 07:56 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:11 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:26 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:41 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 08:56 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:11 PM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:26 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:41 PM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 09:56 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:11 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:41 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 10:56 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:11 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:26 PM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:41 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-02-2021 11:56 PM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:11 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:26 AM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:41 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:56 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:11 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:26 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:41 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:56 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:11 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:41 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:56 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:11 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:26 AM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:41 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:56 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:11 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:26 AM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:41 AM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:56 AM,0,156,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:11 AM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:26 AM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:41 AM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:56 AM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:26 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:41 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:11 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:26 AM,0,95,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:41 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:56 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:11 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:26 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:41 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:56 AM,0,138,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:11 AM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:26 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:41 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:56 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:11 AM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:26 AM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:41 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:56 AM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:11 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:26 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:41 AM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:56 AM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:11 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:26 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 12:56 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:11 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:26 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:41 PM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 01:56 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:11 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:41 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 02:56 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:11 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:26 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:41 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 03:56 PM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:11 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:26 PM,0,136,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:41 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 04:56 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:11 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:26 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:41 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 05:56 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:11 PM,0,153,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:26 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:41 PM,0,148,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 06:56 PM,0,144,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:11 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:26 PM,0,126,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:41 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 07:56 PM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:41 PM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 08:56 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:11 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:41 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 09:56 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:11 PM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:26 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:41 PM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 10:56 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:11 PM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:26 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:41 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-03-2021 11:56 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:11 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:41 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:56 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:11 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:26 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:41 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:11 AM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:26 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:41 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:56 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:11 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:41 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:56 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:11 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:41 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:56 AM,0,113,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:11 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:41 AM,0,110,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:56 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:11 AM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:26 AM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:41 AM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:56 AM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:11 AM,0,155,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:26 AM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:41 AM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:56 AM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:11 AM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:26 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:41 AM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:56 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:11 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:26 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:41 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:56 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:11 AM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:26 AM,0,112,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:41 AM,0,117,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:56 AM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:11 AM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:26 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:41 AM,0,100,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:11 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:26 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:41 PM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 12:56 PM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:11 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:26 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:41 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 01:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:11 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:26 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:41 PM,0,129,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 02:56 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:11 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:26 PM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:41 PM,0,132,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 03:56 PM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:11 PM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:26 PM,0,151,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:41 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 04:56 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:11 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:41 PM,0,118,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 05:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:11 PM,0,115,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:26 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:41 PM,0,119,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 06:56 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:11 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:26 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:41 PM,0,166,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 07:56 PM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:11 PM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:26 PM,0,150,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:41 PM,0,145,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 08:56 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:11 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:26 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:41 PM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 09:56 PM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:11 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:26 PM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:41 PM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 10:56 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:11 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:26 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:41 PM,0,93,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-04-2021 11:56 PM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:11 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:26 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:41 AM,0,91,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:56 AM,0,94,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:11 AM,0,96,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:26 AM,0,97,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:41 AM,0,99,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:11 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:26 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:41 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:56 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:11 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:26 AM,0,102,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:41 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:56 AM,0,105,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:11 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:26 AM,0,114,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:41 AM,0,147,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:56 AM,0,184,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:11 AM,0,203,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:26 AM,0,205,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:41 AM,0,191,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:56 AM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:11 AM,0,125,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:26 AM,0,109,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:41 AM,0,103,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:56 AM,0,92,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:11 AM,0,85,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:26 AM,0,83,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:41 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:56 AM,0,81,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:11 AM,0,84,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:26 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:41 AM,0,122,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:56 AM,0,142,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:11 AM,0,163,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:26 AM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:41 AM,0,175,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:56 AM,0,177,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:11 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:26 AM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:41 AM,0,154,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:56 AM,0,152,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:11 AM,0,157,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:26 AM,0,167,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:41 AM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:56 AM,0,173,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:11 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:26 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:41 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 12:56 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:11 PM,0,130,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:26 PM,0,123,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 01:56 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:11 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:26 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:41 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 02:56 PM,0,187,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:11 PM,0,189,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:26 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:41 PM,0,176,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 03:56 PM,0,159,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:11 PM,0,146,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:26 PM,0,143,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:41 PM,0,141,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 04:56 PM,0,135,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:11 PM,0,128,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:26 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:41 PM,0,120,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 05:56 PM,0,124,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:11 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:26 PM,0,137,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:41 PM,0,133,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 06:56 PM,0,131,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:11 PM,0,139,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:26 PM,0,160,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:41 PM,0,180,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 07:56 PM,0,188,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:11 PM,0,183,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:26 PM,0,174,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:41 PM,0,169,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 08:56 PM,0,165,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:11 PM,0,162,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:26 PM,0,158,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:41 PM,0,149,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 09:56 PM,0,140,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:11 PM,0,134,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:26 PM,0,127,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:41 PM,0,121,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 10:56 PM,0,116,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:11 PM,0,111,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:26 PM,0,108,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:41 PM,0,106,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-05-2021 11:56 PM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 12:11 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 12:26 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 12:41 AM,0,98,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 12:56 AM,0,101,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 01:11 AM,0,104,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 01:26 AM,0,107,,,,,,,,,,,,,, +FreeStyle Libre Pro,xxxx,04-06-2021 01:41 AM,0,108,,,,,,,,,,,,,, From ef0fad37a7d1c797f507cf19061e031e466dde71 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 11:12:37 +0300 Subject: [PATCH 2/8] implement load data for Libre and Dexcom devices --- iglu_python/__init__.py | 3 + iglu_python/extension/load_data.py | 178 +++++++++++++++++++++++++ pyproject.toml | 3 +- requirements.txt | 4 +- tests/test_load_data.py | 200 +++++++++++++++++++++++++++++ 5 files changed, 385 insertions(+), 3 deletions(-) create mode 100644 iglu_python/extension/load_data.py create mode 100644 tests/test_load_data.py diff --git a/iglu_python/__init__.py b/iglu_python/__init__.py index fbc7b95..c83d870 100644 --- a/iglu_python/__init__.py +++ b/iglu_python/__init__.py @@ -41,6 +41,7 @@ from .sd_roc import sd_roc from .summary_glu import summary_glu from .utils import CGMS2DayByDay, check_data_columns, gd2d_to_df, is_iglu_r_compatible, set_iglu_r_compatible +from .extension.load_data import load_libre, load_dexcom __all__ = [ "above_percent", @@ -74,6 +75,8 @@ "iqr_glu", "j_index", "lbgi", + "load_dexcom", + "load_libre", "mad_glu", "mag", "mage", diff --git a/iglu_python/extension/load_data.py b/iglu_python/extension/load_data.py new file mode 100644 index 0000000..aa6f915 --- /dev/null +++ b/iglu_python/extension/load_data.py @@ -0,0 +1,178 @@ +""" +This module is to load CGM timeseries from device specific files. +It is inspired by https://github.com/cafoala/diametrics/blob/main/src/diametrics/transform.py +""" + +from pathlib import Path +import pandas as pd + + +def load_libre(file_path: str) -> pd.Series: + """ + Load Libre timeseries from file. + + Parameters + ---------- + file_path : str + Path to the Libre device file. + + Returns + ------- + pd.Series + Series with datetime index and glucose values.(in mg/dL) + + Examples + -------- + >>> load_libre("tests/data/libre_amer_01.csv") + """ + df = _open_file(file_path) + + # Set third row as column headers + df.columns = df.iloc[2] + # Drop top rows + df = df.iloc[3:] + df.reset_index(inplace=True, drop=True) + # Keep important columns based on column names + convert = False + if 'Historic Glucose(mmol/L)' in df.columns: + df = df.loc[:, ('Meter Timestamp', 'Historic Glucose(mmol/L)', 'Scan Glucose(mmol/L)')] + format = '%d-%m-%Y %H:%M' + convert = True + elif 'Historic Glucose(mg/dL)' in df.columns: + df = df.loc[:, ('Meter Timestamp', 'Historic Glucose(mg/dL)', 'Scan Glucose(mg/dL)')] + format = '%m-%d-%Y %H:%M' + elif 'Historic Glucose mmol/L' in df.columns: + df = df.loc[:, ('Device Timestamp', 'Historic Glucose mmol/L', 'Scan Glucose mmol/L')] + format = '%d-%m-%Y %I:%M %p' + convert = True + else: + df = df = df.loc[:, ('Device Timestamp', 'Historic Glucose mg/dL', 'Scan Glucose mg/dL')] + format = '%m-%d-%Y %I:%M %p' + # Rename columns + df.columns = ['time', 'glc', 'scan_glc'] + + # Convert 'time' column to datetime + df['time'] = pd.to_datetime(df['time'], format=format) + + # convert to mg/dL if needed + if convert: + df['glc'] = df['glc'] * 18.01559 + + # Drop NaN values and sort by 'time' + df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) + + # convert into timeseries + timeseries = df.set_index('time')['glc'] + + return timeseries + + + + +def load_dexcom(file_path: str) -> pd.Series: + """ + Load Dexcom timeseries from file. + + Parameters + ---------- + file_path : str + Path to the Dexcom device file. + + Returns + ------- + pd.Series + Series with datetime index and glucose values (in mg/dL) + + Examples + -------- + >>> load_dexcom("tests/data/dexcom_eur_01.xlsx") + """ + df = _open_file(file_path) + + # Set first row as column headers + df.columns = df.iloc[0] + # Drop top rows + df = df.iloc[1:] + df.reset_index(inplace=True, drop=True) + + # Find timestamp column + timestamp_cols = [col for col in df.columns if 'Timestamp' in str(col)] + if not timestamp_cols: + raise ValueError("No timestamp column found in Dexcom data") + timestamp_col = timestamp_cols[0] + + # Find glucose column + glucose_cols = [col for col in df.columns if 'Glucose' in str(col)] + if not glucose_cols: + raise ValueError("No glucose column found in Dexcom data") + glucose_col = glucose_cols[0] + + # Check if conversion is needed (mmol/L to mg/dL) + convert = False + if 'mmol/L' in str(glucose_col): + convert = True + + # Select relevant columns + df = df.loc[:, [timestamp_col, glucose_col]] + + # Rename columns + df.columns = ['time', 'glc'] + + # Convert 'time' column to datetime + df['time'] = pd.to_datetime(df['time'], errors='coerce') + + # Convert glucose values to numeric + df['glc'] = pd.to_numeric(df['glc'], errors='coerce') + + # Convert to mg/dL if needed + if convert: + df['glc'] = df['glc'] * 18.01559 + + # Drop NaN values and sort by 'time' + df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) + + # Convert into timeseries + timeseries = df.set_index('time')['glc'] + + return timeseries + + + +def _open_file(filepath: str) -> pd.DataFrame: + """ + Open a file and read its contents into a pandas DataFrame. + + Args: + filepath (str): The path to the file. + + Returns: + pandas.DataFrame: The DataFrame containing the file data. + + Raises: + Exception: If an error occurs while reading the file. + """ + # TODO: handle S3 path + + if not Path(filepath).exists(): + raise FileNotFoundError(f"File not found: {filepath}") + + + # Get file extension using basename + extension = Path(filepath).suffix + + try: + if extension == '.csv': + # Assume that the user uploaded a CSV file + df = pd.read_csv(filepath, header=None, names=[i for i in range(0, 20)]) + elif extension == '.xls' or extension == '.xlsx': + # Assume that the user uploaded an Excel file + df = pd.read_excel(filepath, header=None, names=[i for i in range(0, 20)]) + elif extension == '.txt' or extension == '.tsv': + # Assume that the user uploaded a text file + df = pd.read_table(filepath, header=None, names=[i for i in range(0, 20)]) + else: + raise ValueError(f"Unsupported file extension: {extension}") + + return df + except Exception as e: + raise ValueError(f"Error reading file: {filepath}") from e \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ada3613..b375afd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,8 @@ classifiers = [ dependencies = [ "numpy>=2.2.6", "pandas>=2.2.3", - "tzlocal>=5.3.1" + "tzlocal>=5.3.1", + "openpyxl >= 3.1.5" ] [project.urls] diff --git a/requirements.txt b/requirements.txt index 4c4217a..1855f87 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ pandas >= 2.2.3 numpy >= 2.2.6 -scipy >= 1.15.0 -tzlocal >= 5.3.1 \ No newline at end of file +tzlocal >= 5.3.1 +openpyxl >= 3.1.5 \ No newline at end of file diff --git a/tests/test_load_data.py b/tests/test_load_data.py new file mode 100644 index 0000000..bddca6c --- /dev/null +++ b/tests/test_load_data.py @@ -0,0 +1,200 @@ +""" +Unit tests for iglu_python.extension.load_data module. + +Tests the functionality of loading CGM data from device-specific files. +""" + +import pytest +import pandas as pd +import numpy as np +from pathlib import Path +import tempfile +import os + +# Import the module to test +from iglu_python import load_libre, load_dexcom + +@pytest.fixture(scope="module") +def test_data_paths(): + test_data_dir = Path(__file__).parent / "data" + return { + 'libre_amer_01': test_data_dir / "libre_amer_01.csv", + 'libre_amer_02': test_data_dir / "libre_amer_02.csv", + 'dexcom_eur_01': test_data_dir / "dexcom_eur_01.xlsx", + 'dexcom_eur_02': test_data_dir / "dexcom_eur_02.xlsx", + 'dexcom_eur_03': test_data_dir / "dexcom_eur_03.xlsx", + } + +@pytest.mark.parametrize("key", [ + 'libre_amer_01', 'libre_amer_02', 'dexcom_eur_01', 'dexcom_eur_02', 'dexcom_eur_03' +]) +def test_files_exist(test_data_paths, key): + assert test_data_paths[key].exists(), f"Test file not found: {test_data_paths[key]}" + +def test_load_libre_amer_01(test_data_paths): + timeseries = load_libre(str(test_data_paths['libre_amer_01'])) + assert isinstance(timeseries, pd.Series) + assert isinstance(timeseries.index, pd.DatetimeIndex) + assert len(timeseries) > 0 + numeric_values = pd.to_numeric(timeseries, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_values) + assert timeseries.index.is_monotonic_increasing + expected_first_values = [127, 124, 121, 131, 153] + actual_first_values = pd.to_numeric(timeseries.head(), errors='coerce').dropna().tolist() + np.testing.assert_array_almost_equal(actual_first_values, expected_first_values, decimal=0) + +def test_load_libre_amer_02(test_data_paths): + timeseries = load_libre(str(test_data_paths['libre_amer_02'])) + assert isinstance(timeseries, pd.Series) + assert isinstance(timeseries.index, pd.DatetimeIndex) + assert len(timeseries) > 0 + numeric_values = pd.to_numeric(timeseries, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_values) + assert timeseries.index.is_monotonic_increasing + expected_first_values = [118, 120, 128, 137, 132] + actual_first_values = pd.to_numeric(timeseries.head(), errors='coerce').dropna().tolist() + np.testing.assert_array_almost_equal(actual_first_values, expected_first_values, decimal=0) + +def test_load_libre_data_consistency(test_data_paths): + ts1 = load_libre(str(test_data_paths['libre_amer_01'])) + ts2 = load_libre(str(test_data_paths['libre_amer_02'])) + assert isinstance(ts1, pd.Series) + assert isinstance(ts2, pd.Series) + assert isinstance(ts1.index, pd.DatetimeIndex) + assert isinstance(ts2.index, pd.DatetimeIndex) + numeric_1 = pd.to_numeric(ts1, errors='coerce').dropna() + numeric_2 = pd.to_numeric(ts2, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_1) + assert all(35 <= val <= 400 for val in numeric_2) + +def test_load_libre_time_format(test_data_paths): + timeseries = load_libre(str(test_data_paths['libre_amer_01'])) + sample_times = timeseries.index[:5] + assert all(time.year == 2021 for time in sample_times) + assert all(time.month == 3 for time in sample_times) + +def test_load_libre_no_nan_values(test_data_paths): + ts1 = load_libre(str(test_data_paths['libre_amer_01'])) + ts2 = load_libre(str(test_data_paths['libre_amer_02'])) + assert not ts1.isna().any() + assert not ts2.isna().any() + +def test_load_dexcom_eur_01(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + assert isinstance(timeseries, pd.Series) + assert isinstance(timeseries.index, pd.DatetimeIndex) + assert len(timeseries) > 0 + # Convert to numeric and check values are reasonable glucose values (mg/dL) + numeric_values = pd.to_numeric(timeseries, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_values) + assert timeseries.index.is_monotonic_increasing + +def test_load_dexcom_eur_02(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_02'])) + assert isinstance(timeseries, pd.Series) + assert isinstance(timeseries.index, pd.DatetimeIndex) + assert len(timeseries) > 0 + # Convert to numeric and check values are reasonable glucose values (mg/dL) + numeric_values = pd.to_numeric(timeseries, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_values) + assert timeseries.index.is_monotonic_increasing + +def test_load_dexcom_eur_03(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_03'])) + assert isinstance(timeseries, pd.Series) + assert isinstance(timeseries.index, pd.DatetimeIndex) + assert len(timeseries) > 0 + # Convert to numeric and check values are reasonable glucose values (mg/dL) + numeric_values = pd.to_numeric(timeseries, errors='coerce').dropna() + assert all(35 <= val <= 400 for val in numeric_values) + assert timeseries.index.is_monotonic_increasing + +def test_load_dexcom_data_consistency(test_data_paths): + ts_01 = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + ts_02 = load_dexcom(str(test_data_paths['dexcom_eur_02'])) + ts_03 = load_dexcom(str(test_data_paths['dexcom_eur_03'])) + # All should have the same structure + assert isinstance(ts_01, pd.Series) + assert isinstance(ts_02, pd.Series) + assert isinstance(ts_03, pd.Series) + assert isinstance(ts_01.index, pd.DatetimeIndex) + assert isinstance(ts_02.index, pd.DatetimeIndex) + assert isinstance(ts_03.index, pd.DatetimeIndex) + # All should have glucose data + for ts in [ts_01, ts_02, ts_03]: + numeric_values = pd.to_numeric(ts, errors='coerce').dropna() + assert len(numeric_values) > 0 + +def test_load_dexcom_timestamp_format(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + # Check that timestamps are in the expected format + sample_times = timeseries.index[:5] + # Check that all times are in 2023 (from the test data) + assert all(time.year == 2023 for time in sample_times) + +def test_load_dexcom_glucose_statistics(test_data_paths): + ts_01 = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + ts_02 = load_dexcom(str(test_data_paths['dexcom_eur_02'])) + ts_03 = load_dexcom(str(test_data_paths['dexcom_eur_03'])) + + for ts in [ts_01, ts_02, ts_03]: + # Convert to numeric for statistics + numeric_values = pd.to_numeric(ts, errors='coerce').dropna() + assert len(numeric_values) > 0 + assert numeric_values.mean() > 0 + assert numeric_values.std() > 0 + # Check that means are reasonable glucose values (mg/dL) + assert 80 <= numeric_values.mean() <= 300 + +def test_load_libre_error_handling(): + with pytest.raises(FileNotFoundError): + load_libre("nonexistent_file.csv") + with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as tmp_file: + tmp_file_path = tmp_file.name + try: + with pytest.raises(Exception): + load_libre(tmp_file_path) + finally: + os.unlink(tmp_file_path) + +def test_load_dexcom_error_handling(): + with pytest.raises(FileNotFoundError): + load_dexcom("nonexistent_file.xlsx") + with tempfile.NamedTemporaryFile(suffix='.xlsx', delete=False) as tmp_file: + tmp_file_path = tmp_file.name + try: + with pytest.raises(Exception): + load_dexcom(tmp_file_path) + finally: + os.unlink(tmp_file_path) + +def test_load_libre_data_statistics(test_data_paths): + ts1 = load_libre(str(test_data_paths['libre_amer_01'])) + ts2 = load_libre(str(test_data_paths['libre_amer_02'])) + numeric_1 = pd.to_numeric(ts1, errors='coerce') + numeric_2 = pd.to_numeric(ts2, errors='coerce') + assert numeric_1.mean() > 0 + assert numeric_2.mean() > 0 + assert numeric_1.std() > 0 + assert numeric_2.std() > 0 + assert 80 <= numeric_1.mean() <= 200 + assert 80 <= numeric_2.mean() <= 200 + +def test_load_libre_time_interval(test_data_paths): + timeseries = load_libre(str(test_data_paths['libre_amer_01'])) + time_diffs = timeseries.index.to_series().diff().dropna() + expected_interval = pd.Timedelta(minutes=15) + tolerance = pd.Timedelta(minutes=5) + close_intervals = time_diffs[abs(time_diffs - expected_interval) <= tolerance] + assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close + +def test_load_dexcom_time_interval(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + time_diffs = timeseries.index.to_series().diff().dropna() + # Most intervals should be around 5 minutes (300 seconds) + # Allow some tolerance for missing data points + expected_interval = pd.Timedelta(minutes=5) + tolerance = pd.Timedelta(minutes=2) # Allow some variation + # Check that most intervals are close to expected + close_intervals = time_diffs[abs(time_diffs - expected_interval) <= tolerance] + assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close \ No newline at end of file From c7ba8c3804df1cdf8c3db44f24047d0459dd8b75 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 13:49:16 +0300 Subject: [PATCH 3/8] implement load data for Libre and Dexcom devices --- iglu_python/extension/load_data.py | 3 +++ pyproject.toml | 2 +- tests/test_load_data.py | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/iglu_python/extension/load_data.py b/iglu_python/extension/load_data.py index aa6f915..64a15f7 100644 --- a/iglu_python/extension/load_data.py +++ b/iglu_python/extension/load_data.py @@ -54,6 +54,9 @@ def load_libre(file_path: str) -> pd.Series: # Convert 'time' column to datetime df['time'] = pd.to_datetime(df['time'], format=format) + # Convert glucose values to numeric + df['glc'] = pd.to_numeric(df['glc'], errors='coerce') + # convert to mg/dL if needed if convert: df['glc'] = df['glc'] * 18.01559 diff --git a/pyproject.toml b/pyproject.toml index b375afd..56d6e79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "iglu_python" -version = "0.2.1" +version = "0.2.4" description = "Python implementation of the iglu package for continuous glucose monitoring data analysis" readme = "README.md" requires-python = ">=3.11" diff --git a/tests/test_load_data.py b/tests/test_load_data.py index bddca6c..ce07224 100644 --- a/tests/test_load_data.py +++ b/tests/test_load_data.py @@ -197,4 +197,18 @@ def test_load_dexcom_time_interval(test_data_paths): tolerance = pd.Timedelta(minutes=2) # Allow some variation # Check that most intervals are close to expected close_intervals = time_diffs[abs(time_diffs - expected_interval) <= tolerance] - assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close \ No newline at end of file + assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close + +def test_load_libre_numeric_values(test_data_paths): + timeseries = load_libre(str(test_data_paths['libre_amer_01'])) + # Check that all values are numeric + assert pd.api.types.is_numeric_dtype(timeseries) + # Check that there are no NaN values (all should be valid numbers) + assert not timeseries.isna().any() + +def test_load_dexcom_numeric_values(test_data_paths): + timeseries = load_dexcom(str(test_data_paths['dexcom_eur_01'])) + # Check that all values are numeric + assert pd.api.types.is_numeric_dtype(timeseries) + # Check that there are no NaN values (all should be valid numbers) + assert not timeseries.isna().any() \ No newline at end of file From 3aecc10151352fff8a78cd1edb487fa0e7c62b48 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 13:54:02 +0300 Subject: [PATCH 4/8] ruff cleanup --- iglu_python/__init__.py | 2 +- iglu_python/extension/load_data.py | 43 +++++++++++++++--------------- tests/test_load_data.py | 20 +++++++------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/iglu_python/__init__.py b/iglu_python/__init__.py index c83d870..7319042 100644 --- a/iglu_python/__init__.py +++ b/iglu_python/__init__.py @@ -9,6 +9,7 @@ from .cv_measures import cv_measures from .ea1c import ea1c from .episode_calculation import episode_calculation +from .extension.load_data import load_dexcom, load_libre from .gmi import gmi from .grade import grade from .grade_eugly import grade_eugly @@ -41,7 +42,6 @@ from .sd_roc import sd_roc from .summary_glu import summary_glu from .utils import CGMS2DayByDay, check_data_columns, gd2d_to_df, is_iglu_r_compatible, set_iglu_r_compatible -from .extension.load_data import load_libre, load_dexcom __all__ = [ "above_percent", diff --git a/iglu_python/extension/load_data.py b/iglu_python/extension/load_data.py index 64a15f7..892dcb5 100644 --- a/iglu_python/extension/load_data.py +++ b/iglu_python/extension/load_data.py @@ -4,6 +4,7 @@ """ from pathlib import Path + import pandas as pd @@ -43,7 +44,7 @@ def load_libre(file_path: str) -> pd.Series: format = '%m-%d-%Y %H:%M' elif 'Historic Glucose mmol/L' in df.columns: df = df.loc[:, ('Device Timestamp', 'Historic Glucose mmol/L', 'Scan Glucose mmol/L')] - format = '%d-%m-%Y %I:%M %p' + format = '%d-%m-%Y %I:%M %p' convert = True else: df = df = df.loc[:, ('Device Timestamp', 'Historic Glucose mg/dL', 'Scan Glucose mg/dL')] @@ -56,10 +57,10 @@ def load_libre(file_path: str) -> pd.Series: # Convert glucose values to numeric df['glc'] = pd.to_numeric(df['glc'], errors='coerce') - + # convert to mg/dL if needed if convert: - df['glc'] = df['glc'] * 18.01559 + df['glc'] = df['glc'] * 18.01559 # Drop NaN values and sort by 'time' df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) @@ -97,46 +98,46 @@ def load_dexcom(file_path: str) -> pd.Series: # Drop top rows df = df.iloc[1:] df.reset_index(inplace=True, drop=True) - + # Find timestamp column timestamp_cols = [col for col in df.columns if 'Timestamp' in str(col)] if not timestamp_cols: raise ValueError("No timestamp column found in Dexcom data") timestamp_col = timestamp_cols[0] - + # Find glucose column glucose_cols = [col for col in df.columns if 'Glucose' in str(col)] if not glucose_cols: raise ValueError("No glucose column found in Dexcom data") glucose_col = glucose_cols[0] - + # Check if conversion is needed (mmol/L to mg/dL) convert = False if 'mmol/L' in str(glucose_col): convert = True - + # Select relevant columns df = df.loc[:, [timestamp_col, glucose_col]] - + # Rename columns df.columns = ['time', 'glc'] - + # Convert 'time' column to datetime df['time'] = pd.to_datetime(df['time'], errors='coerce') - + # Convert glucose values to numeric df['glc'] = pd.to_numeric(df['glc'], errors='coerce') - + # Convert to mg/dL if needed if convert: df['glc'] = df['glc'] * 18.01559 - + # Drop NaN values and sort by 'time' df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) - + # Convert into timeseries timeseries = df.set_index('time')['glc'] - + return timeseries @@ -159,23 +160,23 @@ def _open_file(filepath: str) -> pd.DataFrame: if not Path(filepath).exists(): raise FileNotFoundError(f"File not found: {filepath}") - + # Get file extension using basename extension = Path(filepath).suffix - + try: if extension == '.csv': # Assume that the user uploaded a CSV file - df = pd.read_csv(filepath, header=None, names=[i for i in range(0, 20)]) + df = pd.read_csv(filepath, header=None, names=list(range(0, 20))) elif extension == '.xls' or extension == '.xlsx': # Assume that the user uploaded an Excel file - df = pd.read_excel(filepath, header=None, names=[i for i in range(0, 20)]) + df = pd.read_excel(filepath, header=None, names=list(range(0, 20))) elif extension == '.txt' or extension == '.tsv': # Assume that the user uploaded a text file - df = pd.read_table(filepath, header=None, names=[i for i in range(0, 20)]) + df = pd.read_table(filepath, header=None, names=list(range(0, 20))) else: raise ValueError(f"Unsupported file extension: {extension}") - + return df except Exception as e: - raise ValueError(f"Error reading file: {filepath}") from e \ No newline at end of file + raise ValueError(f"Error reading file: {filepath}") from e diff --git a/tests/test_load_data.py b/tests/test_load_data.py index ce07224..b867654 100644 --- a/tests/test_load_data.py +++ b/tests/test_load_data.py @@ -4,15 +4,17 @@ Tests the functionality of loading CGM data from device-specific files. """ -import pytest -import pandas as pd -import numpy as np -from pathlib import Path -import tempfile import os +import tempfile +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest # Import the module to test -from iglu_python import load_libre, load_dexcom +from iglu_python import load_dexcom, load_libre + @pytest.fixture(scope="module") def test_data_paths(): @@ -136,7 +138,7 @@ def test_load_dexcom_glucose_statistics(test_data_paths): ts_01 = load_dexcom(str(test_data_paths['dexcom_eur_01'])) ts_02 = load_dexcom(str(test_data_paths['dexcom_eur_02'])) ts_03 = load_dexcom(str(test_data_paths['dexcom_eur_03'])) - + for ts in [ts_01, ts_02, ts_03]: # Convert to numeric for statistics numeric_values = pd.to_numeric(ts, errors='coerce').dropna() @@ -186,7 +188,7 @@ def test_load_libre_time_interval(test_data_paths): expected_interval = pd.Timedelta(minutes=15) tolerance = pd.Timedelta(minutes=5) close_intervals = time_diffs[abs(time_diffs - expected_interval) <= tolerance] - assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close + assert len(close_intervals) / len(time_diffs) > 0.8 # At least 80% should be close def test_load_dexcom_time_interval(test_data_paths): timeseries = load_dexcom(str(test_data_paths['dexcom_eur_01'])) @@ -211,4 +213,4 @@ def test_load_dexcom_numeric_values(test_data_paths): # Check that all values are numeric assert pd.api.types.is_numeric_dtype(timeseries) # Check that there are no NaN values (all should be valid numbers) - assert not timeseries.isna().any() \ No newline at end of file + assert not timeseries.isna().any() From 274fa59c952217ab0883753986c68e7282df92e2 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 14:10:32 +0300 Subject: [PATCH 5/8] refactoring to simplify --- iglu_python/mage.py | 265 +++++++++++++++----------------- iglu_python/process_data.py | 294 ++++++++++++++++-------------------- 2 files changed, 253 insertions(+), 306 deletions(-) diff --git a/iglu_python/mage.py b/iglu_python/mage.py index f97fa54..782d578 100644 --- a/iglu_python/mage.py +++ b/iglu_python/mage.py @@ -171,142 +171,135 @@ def mage_naive(data: pd.DataFrame,sd_multiplier:float = 1.0) -> float: return float(mage_val) if not pd.isna(mage_val) else np.nan -def mage_ma_single(data: pd.DataFrame, short_ma: int, long_ma: int, - direction:str ='avg', - return_type:str = "num", - inter_gap:int = 45, - max_gap:int = 180, - tz:str = "" ) -> pd.DataFrame|float: - """Calculate MAGE using moving average algorithm for a single subject""" - ## 1. Preprocessing - # 1.1 Interpolate over uniform grid - # Note: always interpolate to 5 minute grid +def _preprocess_data(data: pd.DataFrame, short_ma: int, long_ma: int, + inter_gap: int, tz: str) -> pd.DataFrame: + """Preprocess data for MAGE calculation""" + # Interpolate over uniform grid data_ip = CGMS2DayByDay(data, dt0=5, inter_gap=inter_gap, tz=tz) - data_ip[2] # Time between measurements in minutes - # replace for 5 min to fix bug in CGMS2DayByDay day_one = data_ip[1][0] - len(data_ip[1]) - - # 1.2 Generate grid times by starting from day one and cumulatively summing - # note fix 5 min used in interpretation gl = data_ip[0].flatten().tolist() - time_ip = [pd.Timedelta(i * 5, unit="m") + day_one for i in range(1,len(gl)+1)] + time_ip = [pd.Timedelta(i * 5, unit="m") + day_one for i in range(1, len(gl)+1)] - # 1.3 Recalculate short_ma and long_ma because short and long are based on 5 minutes originally - # > Multiply by 5 to get length in min - # > Divide by dt0 to get rounded number of measurements that are roughly equal to original short/long ma definition - # short_ma = round(short_ma*5/dt0) - # long_ma = round(long_ma*5/dt0) # Ensure short_ma and long_ma are appropriate if short_ma >= long_ma: short_ma, long_ma = long_ma, short_ma - ## 2. Change to interpolated data (times and glucose) - # > change data into id, interpolated times, interpolated glucose (t to get rowwise) - # > drop NA rows before first glucose reading - # > then drop NA rows after last glucose reading - # > Label NA glucose as gap (gap = 1) + # Create interpolated data interpolated_data = pd.DataFrame({ - "id" : data['id'].iloc[0], + "id": data['id'].iloc[0], "time": pd.Series(time_ip, dtype='datetime64[ns]'), "gl": pd.Series(gl, dtype='float64') }) + # Drop NA rows before first glucose reading first_valid_idx = interpolated_data['gl'].first_valid_index() if first_valid_idx is not None: interpolated_data = interpolated_data.iloc[first_valid_idx:] + # Drop NA rows after last glucose reading last_valid_idx = interpolated_data['gl'].last_valid_index() if last_valid_idx is not None: interpolated_data = interpolated_data.iloc[:last_valid_idx+1] + # Add gap column to mark NA values as 1 interpolated_data['gap'] = interpolated_data['gl'].isna().astype(int) - # 4. Time Series Segmentation: split gaps > max_gap into separate segments - dfs = segment_time_series(interpolated_data,max_gap) # note: max_gap is in minutes + return interpolated_data - # 5. Calculate MAGE on each identified segment - return_val = pd.DataFrame(columns=["start", "end", "mage", "plus_or_minus", "first_excursion"]) - for segment in dfs: - ret = mage_atomic(segment,short_ma,long_ma) - if return_val.empty: - return_val = ret - else: - return_val = pd.concat([return_val, ret], ignore_index=True) - - if return_type == 'df': - return return_val - - """Process MAGE results with filtering and weighting.""" - # Filter by direction (equivalent to the previous R filtering code) +def _filter_mage_results(return_val: pd.DataFrame, direction: str) -> pd.DataFrame: + """Filter MAGE results based on direction""" if direction == 'plus': - res = return_val[return_val['plus_or_minus'] == 'PLUS'].copy() + return return_val[return_val['plus_or_minus'] == 'PLUS'].copy() elif direction == 'minus': - res = return_val[return_val['plus_or_minus'] == 'MINUS'].copy() + return return_val[return_val['plus_or_minus'] == 'MINUS'].copy() elif direction == 'avg': - res = return_val[return_val['MAGE'].notna()].copy() + return return_val[return_val['MAGE'].notna()].copy() elif direction == 'max': # Group by start,end and keep max mage in each group idx = return_val.groupby(['start', 'end'])['MAGE'].idxmax() - res = return_val.loc[idx].reset_index(drop=True) + return return_val.loc[idx].reset_index(drop=True) else: # default: first excursions only - res = return_val[return_val['first_excursion']].copy() + return return_val[return_val['first_excursion']].copy() - # Calculate time-weighted MAGE +def _calculate_weighted_mage(res: pd.DataFrame) -> float: + """Calculate time-weighted MAGE""" if res.empty: return np.nan res['hours'] = res['end'] - res['start'] res['weight'] = res['hours'] / res['hours'].sum() - weighted_mage = (res['MAGE'] * res['weight']).sum() + return (res['MAGE'] * res['weight']).sum() - return weighted_mage +def mage_ma_single(data: pd.DataFrame, short_ma: int, long_ma: int, + direction:str ='avg', + return_type:str = "num", + inter_gap:int = 45, + max_gap:int = 180, + tz:str = "" ) -> pd.DataFrame|float: + """Calculate MAGE using moving average algorithm for a single subject""" -def mage_atomic(data, short_ma,long_ma): - """ 0. Calculates MAGE on 1 segment of CGM trace """ + # Preprocess data + interpolated_data = _preprocess_data(data, short_ma, long_ma, inter_gap, tz) - # 2c. Calculate the moving average values + # Time Series Segmentation: split gaps > max_gap into separate segments + dfs = segment_time_series(interpolated_data, max_gap) + + # Calculate MAGE on each identified segment + return_val = pd.DataFrame(columns=["start", "end", "mage", "plus_or_minus", "first_excursion"]) + for segment in dfs: + ret = mage_atomic(segment, short_ma, long_ma) + if return_val.empty: + return_val = ret + else: + return_val = pd.concat([return_val, ret], ignore_index=True) + + if return_type == 'df': + return return_val + + # Filter results based on direction + res = _filter_mage_results(return_val, direction) + + # Calculate weighted MAGE + return _calculate_weighted_mage(res) + +def _calculate_moving_averages(data: pd.DataFrame, short_ma: int, long_ma: int) -> pd.DataFrame: + """Calculate short and long moving averages""" data = data.copy() data["MA_Short"] = data["gl"].rolling(window=short_ma, min_periods=1).mean() data["MA_Long"] = data["gl"].rolling(window=long_ma, min_periods=1).mean() + # Fill leading NAs (forward fill first valid value) if short_ma > len(data): data.loc[data.index[:short_ma], 'MA_Short'] = data['MA_Short'].iloc[-1] else: data.loc[data.index[:short_ma], 'MA_Short'] = data['MA_Short'].iloc[short_ma-1] + if long_ma > len(data): data.loc[data.index[:long_ma], 'MA_Long'] = data['MA_Long'].iloc[-1] else: data.loc[data.index[:long_ma], 'MA_Long'] = data['MA_Long'].iloc[long_ma-1] + # Calculate difference data['DELTA_SHORT_LONG'] = data['MA_Short'] - data['MA_Long'] - data = data.reset_index(drop=True) - nmeasurements = len(data) + return data.reset_index(drop=True) - # Sanity check - if ( +def _check_data_validity(data: pd.DataFrame, short_ma: int) -> bool: + """Check if data is valid for MAGE calculation""" + nmeasurements = len(data) + return not ( data['gl'].isnull().all() or nmeasurements < 7 or nmeasurements < short_ma or np.std(data['gl'], ddof=1) < 1 - ): - return pd.DataFrame({ - 'start': [data['time'].iloc[0]], - 'end': [data['time'].iloc[-1]], - 'MAGE': [np.nan], - 'plus_or_minus': [np.nan], - 'first_excursion': [np.nan] - }) + ) - # 2d. Create a preallocated list of crossing point ids & type - # Find crossing points - # Detect trend reversal points in glucose data using DELTA signal. - # Initialize variables - idx = list(data.index) # R: idx = as.numeric(rownames(.data)) - types = {'REL_MIN': 0, 'REL_MAX': 1} # R: types = list2env(list(REL_MIN=0, REL_MAX=1)) +def _find_crossing_points(data: pd.DataFrame) -> tuple[list, list]: + """Find crossing points in the data""" + idx = list(data.index) + types = {'REL_MIN': 0, 'REL_MAX': 1} + nmeasurements = len(data) - # Create storage lists - R: list_cross <- list("id" = rep.int(NA, nmeasurements), - # "type" = rep.int(NA, nmeasurements)) + # Create storage lists list_cross = { 'id': [np.nan] * nmeasurements, 'type': [np.nan] * nmeasurements @@ -315,12 +308,12 @@ def mage_atomic(data, short_ma,long_ma): # Always add 1st point list_cross['id'][0] = idx[0] list_cross['type'][0] = types['REL_MAX'] if data['DELTA_SHORT_LONG'].iloc[0] > 0 else types['REL_MIN'] - count = 1 # Python uses 0-based indexing, so count starts at 1 + count = 1 - # treat DELTA_SHORT_LONG==0 as NaN ( so we can skip its multiplication) + # treat DELTA_SHORT_LONG==0 as NaN data.loc[data['DELTA_SHORT_LONG'] == 0, 'DELTA_SHORT_LONG'] = np.nan - # Main loop - R: for(i in 2:length(.data$DELTA_SHORT_LONG)) + # Main loop for i in range(1, len(data['DELTA_SHORT_LONG'])): # Check data validity if (not pd.isna(data['gl'].iloc[i]) and @@ -328,7 +321,7 @@ def mage_atomic(data, short_ma,long_ma): not pd.isna(data['DELTA_SHORT_LONG'].iloc[i]) and not pd.isna(data['DELTA_SHORT_LONG'].iloc[i-1])): - # Primary crossover detection: crossing point if DELTA changes sign + # Primary crossover detection if (data['DELTA_SHORT_LONG'].iloc[i] * data['DELTA_SHORT_LONG'].iloc[i-1] < 0): list_cross['id'][count] = idx[i] if data['DELTA_SHORT_LONG'].iloc[i] < data['DELTA_SHORT_LONG'].iloc[i-1]: @@ -337,11 +330,8 @@ def mage_atomic(data, short_ma,long_ma): list_cross['type'][count] = types['REL_MAX'] count += 1 - # Gap handling: needed for gaps, where DELTA_SHORT_LONG(i-1 | i-2) = NaN - elif (not pd.isna(data['DELTA_SHORT_LONG'].iloc[i]) and - count >= 1): # Make sure we have a previous crossover - - # R: match(list_cross$id[count-1], idx) - find index of previous crossover + # Gap handling + elif (not pd.isna(data['DELTA_SHORT_LONG'].iloc[i]) and count >= 1): try: prev_cross_idx = idx.index(list_cross['id'][count-1]) prev_delta = data['DELTA_SHORT_LONG'].iloc[prev_cross_idx] @@ -354,78 +344,77 @@ def mage_atomic(data, short_ma,long_ma): list_cross['type'][count] = types['REL_MAX'] count += 1 except ValueError: - # Handle case where previous crossover id not found in idx pass - # Add last point to capture excursion at end - # R: utils::tail(idx, 1) + # Add last point last_idx = idx[-1] list_cross['id'][count] = last_idx + list_cross['type'][count] = types['REL_MAX'] if data['DELTA_SHORT_LONG'].iloc[-1] > 0 else types['REL_MIN'] - if data['DELTA_SHORT_LONG'].iloc[-1] > 0: - list_cross['type'][count] = types['REL_MAX'] - else: - list_cross['type'][count] = types['REL_MIN'] - - # Filter out NaN values - R: list_cross$id[!is.na(list_cross$id)] + # Filter out NaN values clean_ids = [x for x in list_cross['id'] if not pd.isna(x)] clean_types = [x for x in list_cross['type'] if not pd.isna(x)] - # Create DataFrame - R: do.call(cbind.data.frame, list_cross) - crosses = pd.DataFrame({ - "id":clean_ids, - "type":clean_types - }) + return clean_ids, clean_types - # 2e. Calculate min and max glucose values from ids and types in crosses + store indexes for plotting later - # R: num_extrema = nrow(crosses)-1 +def _calculate_extrema(data: pd.DataFrame, crosses: pd.DataFrame) -> tuple[list, list]: + """Calculate min and max glucose values from crossing points""" num_extrema = len(crosses) - 1 - - # R: minmax <- rep(NA_real_, num_extrema), indexes <- rep(NA_real_, num_extrema) minmax = [np.nan] * num_extrema indexes = [np.nan] * num_extrema + types = {'REL_MIN': 0, 'REL_MAX': 1} - # R: for(i in 1:num_extrema) for i in range(num_extrema): # Define search boundaries - # R: s1 <- ifelse(i == 1, crosses[i, 1], indexes[i-1]) - if i == 0: # First extrema - s1 = int(crosses.iloc[i]['id']) # crosses[i, 1] in R (1-indexed) + if i == 0: + s1 = int(crosses.iloc[i]['id']) else: - s1 = int(indexes[i-1]) # last minmax index + s1 = int(indexes[i-1]) - # R: s2 <- crosses[i+1,1] - s2 = int(crosses.iloc[i+1]['id']) # crosses[i+1, 1] in R + s2 = int(crosses.iloc[i+1]['id']) - # Extract glucose segment - R: .data[as.character(s1:s2), ]$gl - segment_start = s1 - segment_end = s2 - glucose_segment = data['gl'].iloc[segment_start:segment_end+1] # including next cross point + # Extract glucose segment + glucose_segment = data['gl'].iloc[s1:s2+1] # Find min or max based on crossover type - if crosses.iloc[i]['type'] == types['REL_MIN']: # crosses[i, "type"] in R - # R: min(.data[as.character(s1:s2), ]$gl, na.rm = TRUE) + if crosses.iloc[i]['type'] == types['REL_MIN']: minmax[i] = glucose_segment.min() - # R: which.min(.data[as.character(s1:s2), ]$gl)+s1-1 indexes[i] = glucose_segment.idxmin() else: - # R: max(.data[as.character(s1:s2), ]$gl, na.rm = TRUE) minmax[i] = glucose_segment.max() - # R: which.max(.data[as.character(s1:s2), ]$gl)+s1-1 indexes[i] = glucose_segment.idxmax() - # excursion elimination - differences = np.subtract.outer(minmax, minmax).T - standardD = data['gl'].std() # pandas uses sample std dev by default - len(minmax) + return minmax, indexes +def mage_atomic(data, short_ma, long_ma): + """Calculate MAGE on 1 segment of CGM trace""" - # MAGE+ algorithm, which identifies and measures positive glycemic excursions - # (nadir-to-peak movements that exceed the standard deviation threshold). - mage_plus_heights, mage_plus_tp_pairs = calculate_mage_plus(differences, minmax, standardD) + # Calculate moving averages + data = _calculate_moving_averages(data, short_ma, long_ma) - # MAGE- algorithm, which identifies and measures negative glycemic excursions - # (peak-to-nadir movements that exceed the standard deviation threshold). + # Sanity check + if not _check_data_validity(data, short_ma): + return pd.DataFrame({ + 'start': [data['time'].iloc[0]], + 'end': [data['time'].iloc[-1]], + 'MAGE': [np.nan], + 'plus_or_minus': [np.nan], + 'first_excursion': [np.nan] + }) + + # Find crossing points + clean_ids, clean_types = _find_crossing_points(data) + crosses = pd.DataFrame({"id": clean_ids, "type": clean_types}) + + # Calculate extrema + minmax, indexes = _calculate_extrema(data, crosses) + + # Calculate differences and standard deviation + differences = np.subtract.outer(minmax, minmax).T + standardD = data['gl'].std() + + # Calculate MAGE+ and MAGE- + mage_plus_heights, mage_plus_tp_pairs = calculate_mage_plus(differences, minmax, standardD) mage_minus_heights, mage_minus_tp_pairs = calculate_mage_minus(differences, minmax, standardD) if len(mage_minus_heights) == 0 and len(mage_plus_heights) == 0: @@ -438,14 +427,13 @@ def mage_atomic(data, short_ma,long_ma): }, index=[0]) # Determine which excursion type occurs first - if (len(mage_plus_heights) > 0 and + is_plus_first = ( + len(mage_plus_heights) > 0 and (len(mage_minus_heights) == 0 or - mage_plus_tp_pairs[0][1] <= mage_minus_tp_pairs[0][0])): - is_plus_first = True - else: - is_plus_first = False + mage_plus_tp_pairs[0][1] <= mage_minus_tp_pairs[0][0]) + ) - # Create MAGE+ result dataframe + # Create result dataframes mage_plus = pd.DataFrame({ 'start': [data['time'].iloc[0]], 'end': [data['time'].iloc[-1]], @@ -454,7 +442,6 @@ def mage_atomic(data, short_ma,long_ma): 'first_excursion': [is_plus_first] }) - # Create MAGE- result dataframe mage_minus = pd.DataFrame({ 'start': [data['time'].iloc[0]], 'end': [data['time'].iloc[-1]], @@ -463,18 +450,8 @@ def mage_atomic(data, short_ma,long_ma): 'first_excursion': [not is_plus_first] }) - # Determine which direction has maximum MAGE value - ((mage_plus['MAGE'].iloc[0] >= mage_minus['MAGE'].iloc[0]) - if not pd.isna(mage_plus['MAGE'].iloc[0]) - and not pd.isna(mage_minus['MAGE'].iloc[0]) - else False - ) - return pd.concat([mage_plus, mage_minus], ignore_index=True) - - - def calculate_mage_plus(differences, minmax, standardD): """ Calculate MAGE+ (positive glycemic excursions) diff --git a/iglu_python/process_data.py b/iglu_python/process_data.py index d5ef53b..baf666f 100644 --- a/iglu_python/process_data.py +++ b/iglu_python/process_data.py @@ -7,6 +7,127 @@ from .utils import localize_naive_timestamp +def _validate_input_data(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> None: + """Validate input data type""" + if not isinstance(data, (pd.DataFrame, pd.Series, list, np.ndarray)): + raise TypeError("Invalid data type, please use DataFrame, Series, list, or numpy array.") + + +def _convert_to_dataframe(data: Union[pd.DataFrame, pd.Series, list, np.ndarray], + glu: Optional[str], timestamp: Optional[str], + id: Optional[str]) -> pd.DataFrame: + """Convert input data to DataFrame""" + if isinstance(data, (list, np.ndarray)): + if all(param is None for param in [glu, timestamp, id]): + return pd.DataFrame({'gl': data}) + raise ValueError("Cannot process list/array data with column specifications. Please provide a DataFrame.") + + if isinstance(data, pd.Series): + if data.index.dtype.kind == 'M': # datetime index + return pd.DataFrame({'time': data.index, 'gl': data.values}) + return pd.DataFrame({'gl': data.values}) + + if not isinstance(data, pd.DataFrame): + raise TypeError("Could not convert data to DataFrame") + return data + + +def _find_column(data: pd.DataFrame, column_name: Optional[str], default_name: str, + original_columns: list, param_name: str) -> str: + """Find and validate column name""" + if column_name is None: + if default_name not in data.columns: + raise ValueError(f"No {param_name} column specified and no '{default_name}' column found") + return default_name + + if not isinstance(column_name, str): + raise ValueError(f"User-defined {param_name} name must be string.") + + column_lower = column_name.lower() + if column_lower not in data.columns: + warnings.warn(f"Could not find user-defined {param_name} argument name '{column_name}' in dataset. " + f"Available columns: {original_columns}", stacklevel=2) + + if default_name in data.columns: + raise ValueError(f"Fix user-defined argument name for {param_name}. " + f"Note: A column in the dataset DOES match the name '{default_name}': " + f"If this is the correct column, indicate as such in function argument. " + f"i.e. {param_name} = '{default_name}'") + else: + raise ValueError(f"Column '{column_name}' not found in data") + + return column_lower + + +def _process_id_column(data: pd.DataFrame, id: Optional[str], original_columns: list) -> pd.DataFrame: + """Process and validate ID column""" + if id is None: + print("No 'id' parameter passed, defaulting id to 1") + data.insert(0, 'id', pd.Series(['1'] * len(data), dtype='string')) + return data + + id_col = _find_column(data, id, 'id', original_columns, 'id') + id_data = data[id_col] + data = data.drop(columns=[id_col]) + data.insert(0, 'id', id_data.astype('string')) + return data + + +def _process_timestamp_column(data: pd.DataFrame, timestamp: Optional[str], + original_columns: list, time_parser: Callable) -> pd.DataFrame: + """Process and validate timestamp column""" + timestamp_col = _find_column(data, timestamp, 'time', original_columns, 'timestamp') + + if 'time' not in data.columns or timestamp_col != 'time': + time_data = data[timestamp_col] + if timestamp_col != 'time': + data = data.drop(columns=[timestamp_col]) + + try: + time_data = time_parser(time_data) + except Exception as e: + raise ValueError(f"Failed to parse times, ensure times are in parsable format. " + f"Original error: {str(e)}") from e + + data.insert(1, 'time', time_data) + + data["time"] = pd.to_datetime(data["time"]).apply(localize_naive_timestamp) + return data + + +def _process_glucose_column(data: pd.DataFrame, glu: Optional[str], original_columns: list) -> pd.DataFrame: + """Process and validate glucose column""" + glu_col = _find_column(data, glu, 'gl', original_columns, 'glucose') + + # Check if glucose values are in mmol/L + mmol_conversion = glu and 'mmol/l' in glu.lower() + + if 'gl' not in data.columns or glu_col != 'gl': + gl_data = data[glu_col] + if glu_col != 'gl': + data = data.drop(columns=[glu_col]) + + try: + gl_data = pd.to_numeric(gl_data, errors='coerce') + except Exception as e: + raise ValueError(f"Failed to convert glucose values to numeric: {str(e)}") from e + + if mmol_conversion: + gl_data = gl_data * 18 + + data.insert(2, 'gl', gl_data) + + return data + + +def _validate_glucose_values(data: pd.DataFrame) -> None: + """Validate glucose values and issue warnings if needed""" + if data['gl'].min() < 20: + warnings.warn("Minimum glucose reading below 20. Data may not be cleaned.", stacklevel=2) + if data['gl'].max() > 500: + warnings.warn("Maximum glucose reading above 500. Data may not be cleaned.", stacklevel=2) + + def process_data( data: Union[pd.DataFrame, pd.Series, list, np.ndarray], id: Optional[str] = None, @@ -79,178 +200,27 @@ def process_data( >>> print(processed.columns.tolist()) ['id', 'time', 'gl'] """ - # Default time parser - if time_parser is None: - time_parser = pd.to_datetime - - # Validate input data type - if not isinstance(data, (pd.DataFrame, pd.Series, list, np.ndarray)): - raise TypeError("Invalid data type, please use DataFrame, Series, list, or numpy array.") - - # Convert to DataFrame if necessary - if isinstance(data, (list, np.ndarray)): - if glu is None and timestamp is None and id is None: - # Assume it's just glucose values - data = pd.DataFrame({'gl': data}) - else: - raise ValueError("Cannot process list/array data with column specifications. Please provide a DataFrame.") - - if isinstance(data, pd.Series): - if data.index.dtype.kind == 'M': # datetime index - data = pd.DataFrame({'time': data.index, 'gl': data.values}) - else: - data = pd.DataFrame({'gl': data.values}) - - # Ensure we have a DataFrame - if not isinstance(data, pd.DataFrame): - raise TypeError("Could not convert data to DataFrame") + time_parser = time_parser or pd.to_datetime - # Drop NAs + # Validate and convert input data + _validate_input_data(data) + data = _convert_to_dataframe(data, glu, timestamp, id) data = data.dropna() if data.empty: raise ValueError("No data remaining after removing NAs") - # Make column names lowercase for matching + # Normalize columns and process original_columns = data.columns.tolist() data.columns = [col.lower() if isinstance(col, str) else str(col).lower() for col in data.columns] - # Process id column - if id is None: - print("No 'id' parameter passed, defaulting id to 1") - data.insert(0, 'id', pd.Series(['1'] * len(data), dtype='string')) - else: - if not isinstance(id, str): - raise ValueError("User-defined id name must be string.") - - id_lower = id.lower() - if id_lower not in data.columns: - warning_msg = (f"Could not find user-defined id argument name '{id}' in dataset. " - f"Available columns: {original_columns}") - warnings.warn(warning_msg, stacklevel=2) - - # Check if there's a column named 'id' - if 'id' in data.columns: - raise ValueError("Fix user-defined argument name for id. " - "Note: A column in the dataset DOES match the name 'id': " - "If this is the correct column, indicate as such in function argument. " - "i.e. id = 'id'") - else: - raise ValueError(f"Column '{id}' not found in data") - - # Move id column to first position and rename - id_col = data[id_lower] - data = data.drop(columns=[id_lower]) - data.insert(0, 'id', id_col.astype('string')) - - # Process timestamp column - if timestamp is None: - if 'time' not in data.columns: - raise ValueError("No timestamp column specified and no 'time' column found") - timestamp_col = 'time' - else: - if not isinstance(timestamp, str): - raise ValueError("User-defined timestamp name must be string.") - - timestamp_lower = timestamp.lower() - if timestamp_lower not in data.columns: - warning_msg = (f"Could not find user-defined timestamp argument name '{timestamp}' in dataset. " - f"Available columns: {original_columns}") - warnings.warn(warning_msg, stacklevel=2) - - # Check if there's a column named 'time' - if 'time' in data.columns: - raise ValueError("Fix user-defined argument name for timestamp. " - "Note: A column in the dataset DOES match the name 'time': " - "If this is the correct column, indicate as such in function argument. " - "i.e. timestamp = 'time'") - else: - raise ValueError(f"Column '{timestamp}' not found in data") - - timestamp_col = timestamp_lower - - # Move timestamp column to second position and rename - if 'time' not in data.columns or timestamp_col != 'time': - time_data = data[timestamp_col] - if timestamp_col != 'time': - data = data.drop(columns=[timestamp_col]) - - # Parse time - try: - time_data = time_parser(time_data) - except Exception as e: - raise ValueError(f"Failed to parse times, ensure times are in parsable format. " - f"Original error: {str(e)}") from e - - # Insert at position 1 (after id) - data.insert(1, 'time', time_data) - - # localize time if in naive format - data["time"] = pd.to_datetime(data["time"]).apply(localize_naive_timestamp) - - # Process glucose column - if glu is None: - if 'gl' not in data.columns: - raise ValueError("No glucose column specified and no 'gl' column found") - glu_col = 'gl' - else: - if not isinstance(glu, str): - raise ValueError("User-defined glucose name must be string.") - - glu_lower = glu.lower() - if glu_lower not in data.columns: - warning_msg = (f"Could not find user-defined glucose argument name '{glu}' in dataset. " - f"Available columns: {original_columns}") - warnings.warn(warning_msg, stacklevel=2) - - # Check if there's a column named 'gl' - if 'gl' in data.columns: - raise ValueError("Fix user-defined argument name for glucose. " - "Note: A column in the dataset DOES match the name 'gl': " - "If this is the correct column, indicate as such in function argument. " - "i.e. glu = 'gl'") - else: - raise ValueError(f"Column '{glu}' not found in data") - - glu_col = glu_lower - - # Check if glucose values are in mmol/L - mmol_conversion = False - if glu and 'mmol/l' in glu.lower(): - mmol_conversion = True - - # Move glucose column to third position and rename - if 'gl' not in data.columns or glu_col != 'gl': - gl_data = data[glu_col] - if glu_col != 'gl': - data = data.drop(columns=[glu_col]) - - # Convert to numeric - try: - gl_data = pd.to_numeric(gl_data, errors='coerce') - except Exception as e: - raise ValueError(f"Failed to convert glucose values to numeric: {str(e)}") from e - - # Convert mmol/L to mg/dL if needed - if mmol_conversion: - gl_data = gl_data * 18 - - # Insert at position 2 (after id and time) - data.insert(2, 'gl', gl_data) - - # Validation warnings - if data['gl'].min() < 20: - warnings.warn("Minimum glucose reading below 20. Data may not be cleaned.", stacklevel=2) - - if data['gl'].max() > 500: - warnings.warn("Maximum glucose reading above 500. Data may not be cleaned.", stacklevel=2) - - # Keep only the three required columns in correct order - data = data[['id', 'time', 'gl']] - - # Drop rows with NaN glucose values - data = data.dropna(subset=['gl']) + data = _process_id_column(data, id, original_columns) + data = _process_timestamp_column(data, timestamp, original_columns, time_parser) + data = _process_glucose_column(data, glu, original_columns) + _validate_glucose_values(data) + # Final cleanup + data = data[['id', 'time', 'gl']].dropna(subset=['gl']) if data.empty: raise ValueError("No valid data remaining after processing") From 85fd08ff2c2c0ec56ac837e792483a839997bc83 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 14:22:42 +0300 Subject: [PATCH 6/8] formatting with ruff --- .github/workflows/ci.yml | 8 +- iglu_python/above_percent.py | 10 +- iglu_python/active_percent.py | 22 +- iglu_python/adrr.py | 17 +- iglu_python/auc.py | 30 ++- iglu_python/below_percent.py | 11 +- iglu_python/cogi.py | 23 +- iglu_python/conga.py | 13 +- iglu_python/cv_glu.py | 4 +- iglu_python/cv_measures.py | 29 +-- iglu_python/ea1c.py | 7 +- iglu_python/episode_calculation.py | 119 +++++----- iglu_python/extension/load_data.py | 62 +++--- iglu_python/gmi.py | 6 +- iglu_python/grade.py | 1 - iglu_python/grade_eugly.py | 6 +- iglu_python/grade_hyper.py | 7 +- iglu_python/grade_hypo.py | 7 +- iglu_python/gri.py | 13 +- iglu_python/gvp.py | 7 +- iglu_python/hbgi.py | 7 +- iglu_python/hyper_index.py | 13 +- iglu_python/hypo_index.py | 13 +- iglu_python/igc.py | 19 +- iglu_python/in_range_percent.py | 16 +- iglu_python/iqr_glu.py | 11 +- iglu_python/j_index.py | 11 +- iglu_python/lbgi.py | 10 +- iglu_python/m_value.py | 12 +- iglu_python/mad_glu.py | 11 +- iglu_python/mag.py | 11 +- iglu_python/mage.py | 282 ++++++++++++------------ iglu_python/mean_glu.py | 4 +- iglu_python/median_glu.py | 4 +- iglu_python/modd.py | 11 +- iglu_python/pgs.py | 17 +- iglu_python/process_data.py | 83 +++---- iglu_python/quantile_glu.py | 8 +- iglu_python/range_glu.py | 6 +- iglu_python/roc.py | 10 +- iglu_python/sd_glu.py | 4 +- iglu_python/sd_measures.py | 65 +++--- iglu_python/sd_roc.py | 20 +- iglu_python/summary_glu.py | 37 ++-- iglu_python/utils.py | 29 ++- iglu_r_discrepancies.ipynb | 334 ++++++++++++++++------------- pyproject.toml | 14 ++ 47 files changed, 698 insertions(+), 766 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e27a769..81a2668 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,10 +38,10 @@ jobs: pip install -e . pip install -r requirements-dev.txt - # - name: Lint with ruff - # run: | - # ruff check . - # ruff format --check . + - name: Lint with ruff + run: | + ruff check . + ruff format --check . - name: Test with pytest run: | diff --git a/iglu_python/above_percent.py b/iglu_python/above_percent.py index bbdb9d6..3d0fb3e 100644 --- a/iglu_python/above_percent.py +++ b/iglu_python/above_percent.py @@ -7,9 +7,9 @@ def above_percent( - data: Union[pd.DataFrame, pd.Series, list,np.ndarray], + data: Union[pd.DataFrame, pd.Series, list, np.ndarray], targets_above: List[int] = None, -) -> pd.DataFrame|dict[str:float]: +) -> pd.DataFrame | dict[str:float]: """ Calculate percentage of values above target thresholds. @@ -61,12 +61,11 @@ def above_percent( # Handle Series input if targets_above is None: targets_above = [140, 180, 250] - if isinstance(data, (pd.Series, list,np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return above_percent_single(data, targets_above) - # Handle DataFrame input data = check_data_columns(data) targets_above = [int(t) for t in targets_above] @@ -83,9 +82,10 @@ def above_percent( # Convert to DataFrame df = pd.DataFrame(result) - df = df[['id'] + [col for col in df.columns if col != 'id']] + df = df[["id"] + [col for col in df.columns if col != "id"]] return df + def above_percent_single(data: pd.Series, targets_above: List[int] = None) -> dict[str:float]: """ Calculate percentage of values above target thresholds for a single series/subject. diff --git a/iglu_python/active_percent.py b/iglu_python/active_percent.py index b1cfbfa..2e4ef48 100644 --- a/iglu_python/active_percent.py +++ b/iglu_python/active_percent.py @@ -14,7 +14,7 @@ def active_percent( range_type: str = "automatic", ndays: int = 14, consistent_end_date: Optional[Union[str, datetime]] = None, -) -> pd.DataFrame|dict[str:float]: +) -> pd.DataFrame | dict[str:float]: """ Calculate percentage of time CGM was active. @@ -86,21 +86,16 @@ def active_percent( # Process each subject for subject in data["id"].unique(): # Filter data for current subject and remove NA values - sub_data = ( - data[data["id"] == subject] - .dropna(subset=["gl", "time"]) - .sort_values("time") - ) + sub_data = data[data["id"] == subject].dropna(subset=["gl", "time"]).sort_values("time") timeseries = sub_data.set_index("time")["gl"] active_percent_dict = active_percent_single(timeseries, dt0, tz, range_type, ndays, consistent_end_date) active_percent_dict["id"] = subject active_perc_data.append(active_percent_dict) - # Convert to DataFrame df = pd.DataFrame(active_perc_data) - df = df[['id'] + [col for col in df.columns if col != 'id']] + df = df[["id"] + [col for col in df.columns if col != "id"]] return df @@ -127,9 +122,7 @@ def active_percent_single( return {"active_percent": 0, "ndays": 0, "start_date": None, "end_date": None} # Calculate time differences between consecutive measurements - time_diffs = np.array( - data.index.diff().total_seconds() / 60 - ) # Convert to minutes + time_diffs = np.array(data.index.diff().total_seconds() / 60) # Convert to minutes # Automatically determine dt0 if not provided if dt0 is None: @@ -154,9 +147,7 @@ def active_percent_single( ndays = (max_time - min_time).total_seconds() / (24 * 3600) # Calculate active percentage - active_percent = ( - (theoretical_gl_vals - missing_gl_vals) / theoretical_gl_vals - ) * 100 + active_percent = ((theoretical_gl_vals - missing_gl_vals) / theoretical_gl_vals) * 100 elif range_type == "manual": # Handle consistent end date if provided if consistent_end_date is not None: @@ -178,6 +169,3 @@ def active_percent_single( raise ValueError(f"Invalid range_type: {range_type}") return {"active_percent": active_percent, "ndays": round(ndays, 1), "start_date": min_time, "end_date": max_time} - - - diff --git a/iglu_python/adrr.py b/iglu_python/adrr.py index cf26023..3e65c8f 100644 --- a/iglu_python/adrr.py +++ b/iglu_python/adrr.py @@ -1,11 +1,10 @@ - import numpy as np import pandas as pd from .utils import check_data_columns -def adrr(data: pd.DataFrame|pd.Series) -> pd.DataFrame|float: +def adrr(data: pd.DataFrame | pd.Series) -> pd.DataFrame | float: """ Calculate average daily risk range (ADRR) @@ -52,7 +51,6 @@ def adrr(data: pd.DataFrame|pd.Series) -> pd.DataFrame|float: >>> iglu.adrr(data) """ - # Validate input if isinstance(data, pd.Series): if not isinstance(data.index, pd.DatetimeIndex): @@ -61,15 +59,13 @@ def adrr(data: pd.DataFrame|pd.Series) -> pd.DataFrame|float: data = check_data_columns(data) - data.set_index("time", inplace=True,drop=True) - out = data.groupby("id").agg( - ADRR = ("gl", lambda x: adrr_single(x)) - ).reset_index() + data.set_index("time", inplace=True, drop=True) + out = data.groupby("id").agg(ADRR=("gl", lambda x: adrr_single(x))).reset_index() return out -def adrr_single(data: pd.DataFrame|pd.Series) -> float: +def adrr_single(data: pd.DataFrame | pd.Series) -> float: """Internal function to calculate ADRR for a single subject or timeseries of glucose values""" if isinstance(data, pd.Series): @@ -85,11 +81,10 @@ def adrr_single(data: pd.DataFrame|pd.Series) -> float: return np.nan # Group by date and calculate daily risk for each day - daily_risks = data_filtered.groupby(data_filtered.index.date).apply( - lambda x: _calculate_daily_risk(x) - ) + daily_risks = data_filtered.groupby(data_filtered.index.date).apply(lambda x: _calculate_daily_risk(x)) return daily_risks.mean() + def _calculate_daily_risk(gl: pd.Series) -> float: """Calculate daily risk range for a single day and subject""" diff --git a/iglu_python/auc.py b/iglu_python/auc.py index e0cbdb4..9429100 100644 --- a/iglu_python/auc.py +++ b/iglu_python/auc.py @@ -1,4 +1,3 @@ - import numpy as np import pandas as pd @@ -60,7 +59,7 @@ def auc(data: pd.DataFrame, tz: str = "") -> pd.DataFrame: if not isinstance(data.index, pd.DatetimeIndex): raise ValueError("Series must have a DatetimeIndex") - auc = auc_single(data,tz=tz) + auc = auc_single(data, tz=tz) return auc # Check data format and convert time to datetime @@ -70,13 +69,14 @@ def auc(data: pd.DataFrame, tz: str = "") -> pd.DataFrame: result = [] for subject in data["id"].unique(): subject_data = data[data["id"] == subject] - hourly_auc = auc_single(subject_data,tz=tz) + hourly_auc = auc_single(subject_data, tz=tz) result.append({"id": subject, "hourly_auc": hourly_auc}) # Convert to DataFrame return pd.DataFrame(result) -def auc_single(subject_data: pd.DataFrame|pd.Series,tz:str = "") -> float: + +def auc_single(subject_data: pd.DataFrame | pd.Series, tz: str = "") -> float: """Calculate AUC for a single subject""" # Get interpolated data using CGMS2DayByDay gd2d, actual_dates, dt0 = CGMS2DayByDay(subject_data, tz=tz) @@ -84,32 +84,26 @@ def auc_single(subject_data: pd.DataFrame|pd.Series,tz:str = "") -> float: # Convert gd2d to DataFrame input_data = gd2d_to_df(gd2d, actual_dates, dt0) if is_iglu_r_compatible(): - input_data['day'] = input_data['time'].dt.floor('d') - input_data['gl_next'] = input_data['gl'].shift(-1) + input_data["day"] = input_data["time"].dt.floor("d") + input_data["gl_next"] = input_data["gl"].shift(-1) each_day_area = input_data.groupby("day").apply( - lambda x: np.nansum( - (dt0/60)*(x["gl"].values + x["gl_next"].values) / 2 - ), - include_groups=False + lambda x: np.nansum((dt0 / 60) * (x["gl"].values + x["gl_next"].values) / 2), include_groups=False ) # calculate number of not nan trapezoids in total (number of not nan gl and gl_next) n_trapezoids = (~np.isnan(input_data["gl"]) & ~np.isnan(input_data["gl_next"])).sum() - hours = dt0/60 * n_trapezoids + hours = dt0 / 60 * n_trapezoids daily_area = each_day_area.sum() - hourly_avg = daily_area/hours + hourly_avg = daily_area / hours return hourly_avg else: # Add hour column by rounding time to nearest hour - input_data['hour'] = input_data['time'].dt.floor('h') + input_data["hour"] = input_data["time"].dt.floor("h") - input_data['gl_next'] = input_data['gl'].shift(-1) + input_data["gl_next"] = input_data["gl"].shift(-1) # Calculate AUC for each hour using trapezoidal rule (mg*min/dL) hourly_auc = input_data.groupby("hour").apply( - lambda x: np.nansum( - (dt0/60)*(x["gl"].values + x["gl_next"].values) / 2 - ), - include_groups=False + lambda x: np.nansum((dt0 / 60) * (x["gl"].values + x["gl_next"].values) / 2), include_groups=False ) # 0 mean no data in this hour, replace with nan hourly_auc = hourly_auc.replace(0, np.nan) diff --git a/iglu_python/below_percent.py b/iglu_python/below_percent.py index 2632bc1..4dbf457 100644 --- a/iglu_python/below_percent.py +++ b/iglu_python/below_percent.py @@ -7,8 +7,8 @@ def below_percent( - data: Union[pd.DataFrame, pd.Series, list,np.ndarray], targets_below: List[int] = None -) -> pd.DataFrame|dict[str:float]: + data: Union[pd.DataFrame, pd.Series, list, np.ndarray], targets_below: List[int] = None +) -> pd.DataFrame | dict[str:float]: """ Calculate percentage of values below target thresholds. @@ -60,12 +60,11 @@ def below_percent( # Handle Series input if targets_below is None: targets_below = [54, 70] - if isinstance(data, (pd.Series, list,np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return below_percent_single(data, targets_below) - # Handle DataFrame input data = check_data_columns(data) @@ -82,9 +81,10 @@ def below_percent( # Convert to DataFrame df = pd.DataFrame(result) - df = df[['id'] + [col for col in df.columns if col != 'id']] + df = df[["id"] + [col for col in df.columns if col != "id"]] return df + def below_percent_single(data: pd.Series, targets_below: List[int] = None) -> dict[str:float]: """ Calculate percentage of values below target thresholds for a single series/subject. @@ -106,4 +106,3 @@ def below_percent_single(data: pd.Series, targets_below: List[int] = None) -> di percentages[f"below_{target}"] = (below_count / total_readings) * 100 return percentages - diff --git a/iglu_python/cogi.py b/iglu_python/cogi.py index ab56908..aff6ee4 100644 --- a/iglu_python/cogi.py +++ b/iglu_python/cogi.py @@ -10,10 +10,10 @@ def cogi( - data: Union[pd.DataFrame, pd.Series, list,np.ndarray], + data: Union[pd.DataFrame, pd.Series, list, np.ndarray], targets: List[int] = None, weights: List[float] = None, -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate Coefficient of Glucose Irregularity (COGI). @@ -81,12 +81,11 @@ def cogi( data = check_data_columns(data) - out = data.groupby("id").agg( - COGI=('gl', lambda x: cogi_single(x, targets, weights)) - ).reset_index() + out = data.groupby("id").agg(COGI=("gl", lambda x: cogi_single(x, targets, weights))).reset_index() return out + def cogi_single(data: pd.Series, targets: List[int] = None, weights: List[float] = None) -> float: """Calculate COGI for a single subject""" # Calculate components @@ -110,7 +109,6 @@ def cogi_single(data: pd.Series, targets: List[int] = None, weights: List[float] return weighted_features * 100 # Convert to percentage - def weight_features( feature: Union[float, pd.Series, list], scale_range: List[float], @@ -122,26 +120,19 @@ def weight_features( with the same number of rows (or length) as the input, with values clipped (or "inverse" clipped) so that they are between 0 and 1.""" if isinstance(feature, pd.Series): - scaled = (feature - min(scale_range)) / ( - max(scale_range) - min(scale_range) - ) + scaled = (feature - min(scale_range)) / (max(scale_range) - min(scale_range)) if increasing: out = scaled.clip(lower=0, upper=1) else: out = (1 - scaled).clip(lower=0, upper=1) elif isinstance(feature, list): - scaled = [ - (x - min(scale_range)) / (max(scale_range) - min(scale_range)) - for x in feature - ] + scaled = [(x - min(scale_range)) / (max(scale_range) - min(scale_range)) for x in feature] if increasing: out = [min(1, max(0, x)) for x in scaled] else: out = [min(1, max(0, 1 - x)) for x in scaled] else: - scaled = (feature - min(scale_range)) / ( - max(scale_range) - min(scale_range) - ) + scaled = (feature - min(scale_range)) / (max(scale_range) - min(scale_range)) if increasing: out = min(1, max(0, scaled)) else: diff --git a/iglu_python/conga.py b/iglu_python/conga.py index 4beda95..20f18c0 100644 --- a/iglu_python/conga.py +++ b/iglu_python/conga.py @@ -6,9 +6,7 @@ from .utils import CGMS2DayByDay, check_data_columns -def conga( - data: Union[pd.DataFrame, pd.Series], n: int = 24, tz: str = "" -) -> pd.DataFrame|float: +def conga(data: Union[pd.DataFrame, pd.Series], n: int = 24, tz: str = "") -> pd.DataFrame | float: """ Calculate Continuous Overall Net Glycemic Action (CONGA). @@ -69,14 +67,13 @@ def conga( data = check_data_columns(data) # Calculate CONGA for each subject - data.set_index("time", inplace=True,drop=True) - out = data.groupby('id').agg( - CONGA = ("gl", lambda x: conga_single(x, hours=n, tz=tz)) - ).reset_index() + data.set_index("time", inplace=True, drop=True) + out = data.groupby("id").agg(CONGA=("gl", lambda x: conga_single(x, hours=n, tz=tz))).reset_index() return out -def conga_single(data: pd.DataFrame|pd.Series, hours: int = 1, tz: str = "") -> float: + +def conga_single(data: pd.DataFrame | pd.Series, hours: int = 1, tz: str = "") -> float: """Calculate CONGA for a single subject""" # Convert data to day-by-day format # Missing values will be linearly interpolated when close enough to non-missing values. diff --git a/iglu_python/cv_glu.py b/iglu_python/cv_glu.py index 9a20a31..c98a4d6 100644 --- a/iglu_python/cv_glu.py +++ b/iglu_python/cv_glu.py @@ -56,8 +56,6 @@ def cv_glu(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> Union[pd.D data = data.dropna() # Calculate CV for each subject - out = data.groupby('id').agg( - CV=('gl', lambda x: 100 * x.std() / x.mean()) - ).reset_index() + out = data.groupby("id").agg(CV=("gl", lambda x: 100 * x.std() / x.mean())).reset_index() return out diff --git a/iglu_python/cv_measures.py b/iglu_python/cv_measures.py index 7300a7b..8dbfc4e 100644 --- a/iglu_python/cv_measures.py +++ b/iglu_python/cv_measures.py @@ -17,7 +17,7 @@ from .utils import CGMS2DayByDay, check_data_columns -def cv_measures(data, dt0=None, inter_gap=45, tz="")->pd.DataFrame|dict[str:float]: +def cv_measures(data, dt0=None, inter_gap=45, tz="") -> pd.DataFrame | dict[str:float]: """Calculate Coefficient of Variation subtypes (CVmean and CVsd). The function cv_measures produces CV subtype values in a pandas DataFrame object. @@ -60,43 +60,36 @@ def cv_measures(data, dt0=None, inter_gap=45, tz="")->pd.DataFrame|dict[str:floa # Check and prepare data data = check_data_columns(data) - # Process each subject results = [] - for subject_id in data['id'].unique(): - subject_data = data[data['id'] == subject_id] + for subject_id in data["id"].unique(): + subject_data = data[data["id"] == subject_id] results_dict = _calculate_series_cv(subject_data, dt0=dt0, inter_gap=inter_gap, tz=tz) - results.append({ - 'id': subject_id, - 'CVmean': results_dict['CVmean'], - 'CVsd': results_dict['CVsd'] - }) + results.append({"id": subject_id, "CVmean": results_dict["CVmean"], "CVsd": results_dict["CVsd"]}) return pd.DataFrame(results) -def _calculate_series_cv(subject_data: pd.DataFrame|pd.Series, dt0=None, inter_gap=45, tz="") -> dict[str:float]: + +def _calculate_series_cv(subject_data: pd.DataFrame | pd.Series, dt0=None, inter_gap=45, tz="") -> dict[str:float]: """Calculate CV for series/single subject input""" # Convert to day-by-day format - gd2d,active_days,dt0 = CGMS2DayByDay(subject_data, dt0=dt0, inter_gap=inter_gap, tz=tz) + gd2d, active_days, dt0 = CGMS2DayByDay(subject_data, dt0=dt0, inter_gap=inter_gap, tz=tz) # gd2d is two dimensional array - 1st dimension is day, 2nd dimension is time point # active_days is a list of days that have at least 2 non-missing values # dt0 is the time frequency for interpolation in minutes # calculate devioation and median for each day - daily_deviations = np.apply_along_axis(np.nanstd, 1, gd2d,ddof=1) + daily_deviations = np.apply_along_axis(np.nanstd, 1, gd2d, ddof=1) daily_mean = np.apply_along_axis(np.nanmean, 1, gd2d) - cv = daily_deviations *100 / daily_mean + cv = daily_deviations * 100 / daily_mean # calculate mean of daily deviations cv_mean = np.nanmean(cv) - cv_sd = np.nanstd(cv,ddof=1) + cv_sd = np.nanstd(cv, ddof=1) - return { - 'CVmean': cv_mean, - 'CVsd': cv_sd - } + return {"CVmean": cv_mean, "CVsd": cv_sd} diff --git a/iglu_python/ea1c.py b/iglu_python/ea1c.py index b9bca91..f7c5e1a 100644 --- a/iglu_python/ea1c.py +++ b/iglu_python/ea1c.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def ea1c(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.DataFrame|float: +def ea1c(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.DataFrame | float: """ Calculate estimated A1C (eA1C) values. @@ -56,14 +56,11 @@ def ea1c(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.DataFrame data = pd.Series(data) return ea1c_single(data) - # Handle DataFrame input data = check_data_columns(data) # Calculate eA1C for each subject - out = data.groupby('id').agg( - eA1C = ("gl", lambda x: ea1c_single(x)) - ).reset_index() + out = data.groupby("id").agg(eA1C=("gl", lambda x: ea1c_single(x))).reset_index() return out diff --git a/iglu_python/episode_calculation.py b/iglu_python/episode_calculation.py index 927047d..56af7f8 100644 --- a/iglu_python/episode_calculation.py +++ b/iglu_python/episode_calculation.py @@ -127,28 +127,32 @@ def episode_calculation( # Check duration parameters if dur_length > inter_gap: print( - "Warning: Interpolation gap parameter less than episode duration, " - "data gaps may cause incorrect computation" + "Warning: Interpolation gap parameter less than episode duration, data gaps may cause incorrect computation" ) episode_data_df = pd.DataFrame( columns=[ - 'id', 'time', 'gl', 'segment', - 'lv1_hypo', 'lv2_hypo', 'lv1_hyper', 'lv2_hyper', - 'ext_hypo', 'lv1_hypo_excl', 'lv1_hyper_excl' + "id", + "time", + "gl", + "segment", + "lv1_hypo", + "lv2_hypo", + "lv1_hyper", + "lv2_hyper", + "ext_hypo", + "lv1_hypo_excl", + "lv1_hyper_excl", ] ) episode_summary_df = pd.DataFrame( - columns=[ - 'id', 'type', 'level', 'avg_ep_per_day', - 'avg_ep_duration', 'avg_ep_gl', 'total_episodes' - ] + columns=["id", "type", "level", "avg_ep_per_day", "avg_ep_duration", "avg_ep_gl", "total_episodes"] ) # Process each subject ID separately - for subject_id in data['id'].unique(): + for subject_id in data["id"].unique(): # Get data for this subject - subject_data = data[data['id'] == subject_id].copy() + subject_data = data[data["id"] == subject_id].copy() # Calculate episodes for this subject subject_summary, subject_episode_data = episode_single( @@ -164,8 +168,8 @@ def episode_calculation( tz=tz, ) - subject_summary['id'] = subject_id - subject_episode_data['id'] = subject_id + subject_summary["id"] = subject_id + subject_episode_data["id"] = subject_id # Append to main dataframes if episode_data_df.empty: @@ -178,13 +182,12 @@ def episode_calculation( else: episode_summary_df = pd.concat([episode_summary_df, subject_summary], ignore_index=True) - - if return_data: return episode_summary_df, episode_data_df else: return episode_summary_df + def episode_single( data: pd.DataFrame, lv1_hypo: float, @@ -236,25 +239,22 @@ def episode_single( dt0 = gd2d_tuple[2] if is_iglu_r_compatible(): - day_one = pd.to_datetime(gd2d_tuple[1][0]).tz_localize(None) # make in naive-timezone - day_one = day_one.tz_localize('UTC') # this is how IGLU_R works - if tz and tz!="": + day_one = pd.to_datetime(gd2d_tuple[1][0]).tz_localize(None) # make in naive-timezone + day_one = day_one.tz_localize("UTC") # this is how IGLU_R works + if tz and tz != "": day_one = day_one.tz_convert(tz) else: local_tz = get_local_tz() day_one = day_one.tz_convert(local_tz) ndays = len(gd2d_tuple[1]) # generate grid times by starting from day one and cumulatively summing - time_ip = pd.date_range(start=day_one + pd.Timedelta(minutes=dt0), periods=int(ndays * 24 * 60 /dt0), - freq=f"{dt0}min") + time_ip = pd.date_range( + start=day_one + pd.Timedelta(minutes=dt0), periods=int(ndays * 24 * 60 / dt0), freq=f"{dt0}min" + ) data_ip = gd2d_tuple[0].flatten().tolist() - new_data = pd.DataFrame({ - "time": time_ip, - "gl": data_ip - }) + new_data = pd.DataFrame({"time": time_ip, "gl": data_ip}) else: - new_data = gd2d_to_df(gd2d_tuple[0],gd2d_tuple[1],gd2d_tuple[2]) - + new_data = gd2d_to_df(gd2d_tuple[0], gd2d_tuple[1], gd2d_tuple[2]) # Check duration parameters if dur_length % dt0 != 0: @@ -268,7 +268,7 @@ def episode_single( # Step 1: Create boolean mask for NA values # R: na_idx = is.na(new_data$gl) - na_idx = new_data['gl'].isna() + na_idx = new_data["gl"].isna() # Step 2: Run-length encoding to find consecutive runs # R: segment_rle = rle(na_idx)$lengths @@ -282,14 +282,13 @@ def episode_single( # R: segment_data$segment = rep(1:length(segment_rle), segment_rle) segment_ids = np.repeat( range(1, len(segment_rle) + 1), # 1:length(segment_rle) - segment_rle # repeat counts + segment_rle, # repeat counts ) - segment_data['segment'] = segment_ids + segment_data["segment"] = segment_ids # Step 5: Remove rows with NA glucose values # R: segment_data = segment_data[!is.na(segment_data$gl), ] - segment_data = segment_data[~segment_data['gl'].isna()].reset_index(drop=True) - + segment_data = segment_data[~segment_data["gl"].isna()].reset_index(drop=True) # Classify events for each segment ep_per_seg = ( @@ -301,29 +300,26 @@ def episode_single( "lv2_hypo": event_class(x, "hypo", lv2_hypo, dur_idx, end_idx), "lv1_hyper": event_class(x, "hyper", lv1_hyper, dur_idx, end_idx), "lv2_hyper": event_class(x, "hyper", lv2_hyper, dur_idx, end_idx), - "ext_hypo": event_class( - x, "hypo", lv1_hypo, int(120 / dt0) + 1, end_idx - ), + "ext_hypo": event_class(x, "hypo", lv1_hypo, int(120 / dt0) + 1, end_idx), } ), - include_groups=False + include_groups=False, ) .reset_index() - .drop(columns=['level_1']) + .drop(columns=["level_1"]) ) - # Add exclusive labels using the correct original logic without DeprecationWarning # For hypo exclusion: group by both segment and lv1_hypo, set to 0 if any lv2_hypo > 0 in that group def calculate_exclusion(df, lv1_col, lv2_col): """Calculate exclusion labels for lv1 episodes based on lv2 episodes in same group""" df = df.copy() - df['group_id'] = df.groupby(['segment', lv1_col]).ngroup() - group_has_lv2 = df.groupby('group_id')[lv2_col].transform(lambda x: (x > 0).any()) + df["group_id"] = df.groupby(["segment", lv1_col]).ngroup() + group_has_lv2 = df.groupby("group_id")[lv2_col].transform(lambda x: (x > 0).any()) return df[lv1_col].where(~group_has_lv2, 0) - ep_per_seg['lv1_hypo_excl'] = calculate_exclusion(ep_per_seg, 'lv1_hypo', 'lv2_hypo') - ep_per_seg['lv1_hyper_excl'] = calculate_exclusion(ep_per_seg, 'lv1_hyper', 'lv2_hyper') + ep_per_seg["lv1_hypo_excl"] = calculate_exclusion(ep_per_seg, "lv1_hypo", "lv2_hypo") + ep_per_seg["lv1_hyper_excl"] = calculate_exclusion(ep_per_seg, "lv1_hyper", "lv2_hyper") full_segment_df = pd.concat([segment_data, ep_per_seg.drop(["segment"], axis=1)], axis=1) @@ -331,6 +327,7 @@ def calculate_exclusion(df, lv1_col, lv2_col): summary_df = episode_summary(full_segment_df, dt0) return summary_df, full_segment_df + def event_class( data: pd.DataFrame, level_type: str, @@ -391,29 +388,25 @@ def event_class( lambda x: pd.DataFrame( { # possibly event; where duration is met - "pos_start": [x["level"].iloc[0] and (len(x) >= event_duration)]*len(x), + "pos_start": [x["level"].iloc[0] and (len(x) >= event_duration)] * len(x), # if possible event, add start on first index of event "start": ( - ["start" - if (x["level"].iloc[0] and len(x) >= event_duration) - else None] + [None]*(len(x)-1) + ["start" if (x["level"].iloc[0] and len(x) >= event_duration) else None] + [None] * (len(x) - 1) ), # add possible ends (always need to check for end duration) - "pos_end": [not x["level"].iloc[0] and (len(x) >= end_duration)]*len(x), + "pos_end": [not x["level"].iloc[0] and (len(x) >= end_duration)] * len(x), "end": ( - ["end" - if (not x["level"].iloc[0] and len(x) >= end_duration) - else None] + [None]*(len(x)-1) + ["end" if (not x["level"].iloc[0] and len(x) >= end_duration) else None] + [None] * (len(x) - 1) ), } ), - include_groups=False + include_groups=False, ) .reset_index() - .drop(columns=['level_1']) + .drop(columns=["level_1"]) ) - annotated = pd.concat([annotated,annotated_grouped.drop(["event"], axis=1)], axis=1) + annotated = pd.concat([annotated, annotated_grouped.drop(["event"], axis=1)], axis=1) ### for each possible end find the matching start # Get start and end positions @@ -473,16 +466,13 @@ def lv1_excl(data: pd.DataFrame) -> np.ndarray: # Calculate exclusive labels excl = grouped.apply( - lambda x: pd.DataFrame( - { - "excl":[0 if (x[lv2_first].values > 0).any() else x[lv1_first].iloc[0]]*len(x) - }), - include_groups=False + lambda x: pd.DataFrame({"excl": [0 if (x[lv2_first].values > 0).any() else x[lv1_first].iloc[0]] * len(x)}), + include_groups=False, ) excl = excl.reset_index() - return excl[['segment','excl']] + return excl[["segment", "excl"]] def episode_summary(data: pd.DataFrame, dt0: float) -> pd.DataFrame: @@ -502,12 +492,10 @@ def episode_summary(data: pd.DataFrame, dt0: float) -> pd.DataFrame: Summary statistics for each episode type """ - def episode_summary_helper( - data: pd.DataFrame, level_label: str, dt0: float - ) -> List[float]: + def episode_summary_helper(data: pd.DataFrame, level_label: str, dt0: float) -> List[float]: """Helper function to calculate summary for one episode type""" # Select relevant columns - data = data[[ "time", "gl", "segment", level_label]].copy() + data = data[["time", "gl", "segment", level_label]].copy() data.columns = ["time", "gl", "segment", "event"] # If no events, return zeros/NA @@ -516,11 +504,7 @@ def episode_summary_helper( # Calculate summary metrics events = data[data["event"] != 0][["gl", "segment", "event"]] - data_sum = ( - events.groupby(["segment", "event"]) - .agg({"gl": ["count", "mean"]}) - .reset_index() - ) + data_sum = events.groupby(["segment", "event"]).agg({"gl": ["count", "mean"]}).reset_index() # Calculate metrics avg_ep_per_day = len(data_sum) / (len(data) * dt0 / 60 / 24) @@ -556,6 +540,7 @@ def episode_summary_helper( return output + def _rle_lengths(boolean_series): """Python equivalent of R's rle()$lengths""" # Find where values change diff --git a/iglu_python/extension/load_data.py b/iglu_python/extension/load_data.py index 892dcb5..520775c 100644 --- a/iglu_python/extension/load_data.py +++ b/iglu_python/extension/load_data.py @@ -35,44 +35,42 @@ def load_libre(file_path: str) -> pd.Series: df.reset_index(inplace=True, drop=True) # Keep important columns based on column names convert = False - if 'Historic Glucose(mmol/L)' in df.columns: - df = df.loc[:, ('Meter Timestamp', 'Historic Glucose(mmol/L)', 'Scan Glucose(mmol/L)')] - format = '%d-%m-%Y %H:%M' + if "Historic Glucose(mmol/L)" in df.columns: + df = df.loc[:, ("Meter Timestamp", "Historic Glucose(mmol/L)", "Scan Glucose(mmol/L)")] + format = "%d-%m-%Y %H:%M" convert = True - elif 'Historic Glucose(mg/dL)' in df.columns: - df = df.loc[:, ('Meter Timestamp', 'Historic Glucose(mg/dL)', 'Scan Glucose(mg/dL)')] - format = '%m-%d-%Y %H:%M' - elif 'Historic Glucose mmol/L' in df.columns: - df = df.loc[:, ('Device Timestamp', 'Historic Glucose mmol/L', 'Scan Glucose mmol/L')] - format = '%d-%m-%Y %I:%M %p' + elif "Historic Glucose(mg/dL)" in df.columns: + df = df.loc[:, ("Meter Timestamp", "Historic Glucose(mg/dL)", "Scan Glucose(mg/dL)")] + format = "%m-%d-%Y %H:%M" + elif "Historic Glucose mmol/L" in df.columns: + df = df.loc[:, ("Device Timestamp", "Historic Glucose mmol/L", "Scan Glucose mmol/L")] + format = "%d-%m-%Y %I:%M %p" convert = True else: - df = df = df.loc[:, ('Device Timestamp', 'Historic Glucose mg/dL', 'Scan Glucose mg/dL')] - format = '%m-%d-%Y %I:%M %p' + df = df = df.loc[:, ("Device Timestamp", "Historic Glucose mg/dL", "Scan Glucose mg/dL")] + format = "%m-%d-%Y %I:%M %p" # Rename columns - df.columns = ['time', 'glc', 'scan_glc'] + df.columns = ["time", "glc", "scan_glc"] # Convert 'time' column to datetime - df['time'] = pd.to_datetime(df['time'], format=format) + df["time"] = pd.to_datetime(df["time"], format=format) # Convert glucose values to numeric - df['glc'] = pd.to_numeric(df['glc'], errors='coerce') + df["glc"] = pd.to_numeric(df["glc"], errors="coerce") # convert to mg/dL if needed if convert: - df['glc'] = df['glc'] * 18.01559 + df["glc"] = df["glc"] * 18.01559 # Drop NaN values and sort by 'time' - df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) + df = df.dropna(subset=["time", "glc"]).sort_values("time").reset_index(drop=True) # convert into timeseries - timeseries = df.set_index('time')['glc'] + timeseries = df.set_index("time")["glc"] return timeseries - - def load_dexcom(file_path: str) -> pd.Series: """ Load Dexcom timeseries from file. @@ -100,48 +98,47 @@ def load_dexcom(file_path: str) -> pd.Series: df.reset_index(inplace=True, drop=True) # Find timestamp column - timestamp_cols = [col for col in df.columns if 'Timestamp' in str(col)] + timestamp_cols = [col for col in df.columns if "Timestamp" in str(col)] if not timestamp_cols: raise ValueError("No timestamp column found in Dexcom data") timestamp_col = timestamp_cols[0] # Find glucose column - glucose_cols = [col for col in df.columns if 'Glucose' in str(col)] + glucose_cols = [col for col in df.columns if "Glucose" in str(col)] if not glucose_cols: raise ValueError("No glucose column found in Dexcom data") glucose_col = glucose_cols[0] # Check if conversion is needed (mmol/L to mg/dL) convert = False - if 'mmol/L' in str(glucose_col): + if "mmol/L" in str(glucose_col): convert = True # Select relevant columns df = df.loc[:, [timestamp_col, glucose_col]] # Rename columns - df.columns = ['time', 'glc'] + df.columns = ["time", "glc"] # Convert 'time' column to datetime - df['time'] = pd.to_datetime(df['time'], errors='coerce') + df["time"] = pd.to_datetime(df["time"], errors="coerce") # Convert glucose values to numeric - df['glc'] = pd.to_numeric(df['glc'], errors='coerce') + df["glc"] = pd.to_numeric(df["glc"], errors="coerce") # Convert to mg/dL if needed if convert: - df['glc'] = df['glc'] * 18.01559 + df["glc"] = df["glc"] * 18.01559 # Drop NaN values and sort by 'time' - df = df.dropna(subset=['time', 'glc']).sort_values('time').reset_index(drop=True) + df = df.dropna(subset=["time", "glc"]).sort_values("time").reset_index(drop=True) # Convert into timeseries - timeseries = df.set_index('time')['glc'] + timeseries = df.set_index("time")["glc"] return timeseries - def _open_file(filepath: str) -> pd.DataFrame: """ Open a file and read its contents into a pandas DataFrame. @@ -160,18 +157,17 @@ def _open_file(filepath: str) -> pd.DataFrame: if not Path(filepath).exists(): raise FileNotFoundError(f"File not found: {filepath}") - # Get file extension using basename extension = Path(filepath).suffix try: - if extension == '.csv': + if extension == ".csv": # Assume that the user uploaded a CSV file df = pd.read_csv(filepath, header=None, names=list(range(0, 20))) - elif extension == '.xls' or extension == '.xlsx': + elif extension == ".xls" or extension == ".xlsx": # Assume that the user uploaded an Excel file df = pd.read_excel(filepath, header=None, names=list(range(0, 20))) - elif extension == '.txt' or extension == '.tsv': + elif extension == ".txt" or extension == ".tsv": # Assume that the user uploaded a text file df = pd.read_table(filepath, header=None, names=list(range(0, 20))) else: diff --git a/iglu_python/gmi.py b/iglu_python/gmi.py index 312b7d4..4450ae6 100644 --- a/iglu_python/gmi.py +++ b/iglu_python/gmi.py @@ -19,7 +19,7 @@ from iglu_python.utils import check_data_columns -def gmi(data: Union[pd.DataFrame, pd.Series, list]) -> float|pd.DataFrame: +def gmi(data: Union[pd.DataFrame, pd.Series, list]) -> float | pd.DataFrame: """Calculate GMI (Glucose Management Indicator). The function gmi produces GMI values in a pandas DataFrame object. @@ -54,8 +54,6 @@ def gmi(data: Union[pd.DataFrame, pd.Series, list]) -> float|pd.DataFrame: getattr(data, "is_vector", False) # Calculate GMI for each subject - out = data.groupby("id").agg( - GMI=("gl", lambda x: 3.31 + (0.02392 * x.mean())) - ).reset_index() + out = data.groupby("id").agg(GMI=("gl", lambda x: 3.31 + (0.02392 * x.mean()))).reset_index() return out diff --git a/iglu_python/grade.py b/iglu_python/grade.py index 3ebe98f..bc4868f 100644 --- a/iglu_python/grade.py +++ b/iglu_python/grade.py @@ -87,4 +87,3 @@ def _grade_formula(x: Union[pd.Series, np.ndarray]) -> Union[pd.Series, np.ndarr """ grade = 425 * (np.log10(np.log10(x / 18)) + 0.16) ** 2 return np.minimum(grade, 50) # Cap at 50 - diff --git a/iglu_python/grade_eugly.py b/iglu_python/grade_eugly.py index 8320198..82478ef 100644 --- a/iglu_python/grade_eugly.py +++ b/iglu_python/grade_eugly.py @@ -9,7 +9,7 @@ def grade_eugly( data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lower: int = 70, upper: int = 140 -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate percentage of GRADE score attributable to target range. @@ -69,9 +69,7 @@ def grade_eugly( data = check_data_columns(data) # Calculate GRADE euglycemia for each subject - out = data.groupby('id').agg( - GRADE_eugly = ("gl", lambda x: grade_eugly_single(x, lower, upper)) - ).reset_index() + out = data.groupby("id").agg(GRADE_eugly=("gl", lambda x: grade_eugly_single(x, lower, upper))).reset_index() return out diff --git a/iglu_python/grade_hyper.py b/iglu_python/grade_hyper.py index 3c60e44..bf3e22d 100644 --- a/iglu_python/grade_hyper.py +++ b/iglu_python/grade_hyper.py @@ -7,7 +7,7 @@ from .utils import check_data_columns -def grade_hyper(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], upper: int = 140) -> pd.DataFrame|float: +def grade_hyper(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], upper: int = 140) -> pd.DataFrame | float: """ Calculate percentage of GRADE score attributable to hyperglycemia. @@ -63,11 +63,10 @@ def grade_hyper(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], upper: i # Handle DataFrame input data = check_data_columns(data) - out = data.groupby('id').agg( - GRADE_hyper = ("gl", lambda x: grade_hyper_single(x, upper)) - ).reset_index() + out = data.groupby("id").agg(GRADE_hyper=("gl", lambda x: grade_hyper_single(x, upper))).reset_index() return out + def grade_hyper_single(data: pd.Series, upper: int = 140) -> float: """Calculate GRADE hyperglycemia for a single timeseries""" data = data.dropna() diff --git a/iglu_python/grade_hypo.py b/iglu_python/grade_hypo.py index 591a2a8..11ab319 100644 --- a/iglu_python/grade_hypo.py +++ b/iglu_python/grade_hypo.py @@ -7,7 +7,7 @@ from .utils import check_data_columns -def grade_hypo(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lower: int = 80) -> pd.DataFrame|float: +def grade_hypo(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lower: int = 80) -> pd.DataFrame | float: """ Calculate percentage of GRADE score attributable to hypoglycemia. @@ -64,12 +64,11 @@ def grade_hypo(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lower: in data = check_data_columns(data) # Calculate GRADE hypoglycemia for each subject - out = data.groupby('id').agg( - GRADE_hypo = ("gl", lambda x: grade_hypo_single(x, lower)) - ).reset_index() + out = data.groupby("id").agg(GRADE_hypo=("gl", lambda x: grade_hypo_single(x, lower))).reset_index() return out + def grade_hypo_single(data: pd.Series, lower: int = 80) -> float: """Calculate GRADE hypoglycemia for a single timeseries""" data = data.dropna() diff --git a/iglu_python/gri.py b/iglu_python/gri.py index 5a023b4..47eff50 100644 --- a/iglu_python/gri.py +++ b/iglu_python/gri.py @@ -8,7 +8,7 @@ from .utils import check_data_columns -def gri(data: Union[pd.DataFrame, pd.Series,list,np.ndarray], tz: str = "") -> pd.DataFrame|float: +def gri(data: Union[pd.DataFrame, pd.Series, list, np.ndarray], tz: str = "") -> pd.DataFrame | float: """ Calculate Glycemia Risk Index (GRI). @@ -55,7 +55,7 @@ def gri(data: Union[pd.DataFrame, pd.Series,list,np.ndarray], tz: str = "") -> p 0 35.43 """ # Handle Series input - if isinstance(data, (pd.Series, list,np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return gri_single(data, tz) @@ -73,6 +73,7 @@ def gri(data: Union[pd.DataFrame, pd.Series,list,np.ndarray], tz: str = "") -> p return pd.DataFrame(result) + def gri_single(data: pd.Series, tz: str = "") -> float: """ Calculate Glycemia Risk Index (GRI) for a single series/subject. @@ -81,7 +82,6 @@ def gri_single(data: pd.Series, tz: str = "") -> float: if len(data) == 0: return np.nan - # Get percentages in each range below_54 = below_percent(data, targets_below=[54])["below_54"] below_70 = below_percent(data, targets_below=[70])["below_70"] @@ -89,12 +89,7 @@ def gri_single(data: pd.Series, tz: str = "") -> float: above_250 = above_percent(data, targets_above=[250])["above_250"] # Calculate GRI - gri_value = ( - 3.0 * below_54 - + 2.4 * (below_70 - below_54) - + 1.6 * above_250 - + 0.8 * (above_180 - above_250) - ) + gri_value = 3.0 * below_54 + 2.4 * (below_70 - below_54) + 1.6 * above_250 + 0.8 * (above_180 - above_250) # Threshold at 100% gri_value = min(gri_value, 100.0) diff --git a/iglu_python/gvp.py b/iglu_python/gvp.py index ce08e31..7f758aa 100644 --- a/iglu_python/gvp.py +++ b/iglu_python/gvp.py @@ -6,7 +6,7 @@ from .utils import CGMS2DayByDay, check_data_columns -def gvp(data: Union[pd.DataFrame, pd.Series]) -> pd.DataFrame|float: +def gvp(data: Union[pd.DataFrame, pd.Series]) -> pd.DataFrame | float: r""" Calculate Glucose Variability Percentage (GVP). @@ -66,9 +66,7 @@ def gvp(data: Union[pd.DataFrame, pd.Series]) -> pd.DataFrame|float: data = check_data_columns(data) data.set_index("time", inplace=True, drop=True) - out = data.groupby('id').agg( - GVP = ("gl", lambda x: gvp_single(x)) - ).reset_index() + out = data.groupby("id").agg(GVP=("gl", lambda x: gvp_single(x))).reset_index() return out @@ -119,6 +117,7 @@ def calculate_gvp(glucose_values: pd.Series, timestamps: pd.Series) -> float: return gvp + def gvp_single(subj_data): """Calculate GVP for a single subject""" # Get interpolated data diff --git a/iglu_python/hbgi.py b/iglu_python/hbgi.py index 49bc67e..4d0353c 100644 --- a/iglu_python/hbgi.py +++ b/iglu_python/hbgi.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def hbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def hbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: r""" Calculate High Blood Glucose Index (HBGI). @@ -69,11 +69,10 @@ def hbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame # Handle DataFrame input data = check_data_columns(data) - out = data.groupby('id').agg( - HBGI = ("gl", lambda x: calculate_hbgi_single(x)) - ).reset_index() + out = data.groupby("id").agg(HBGI=("gl", lambda x: calculate_hbgi_single(x))).reset_index() return out + def calculate_hbgi_single(glucose_values: pd.Series) -> float: """Helper function to calculate HBGI for a single series of values.""" glucose_values = glucose_values.dropna() diff --git a/iglu_python/hyper_index.py b/iglu_python/hyper_index.py index 8ca2302..131b7fb 100644 --- a/iglu_python/hyper_index.py +++ b/iglu_python/hyper_index.py @@ -8,7 +8,7 @@ def hyper_index( data: Union[pd.DataFrame, pd.Series, np.ndarray, list], ULTR: int = 140, a: float = 1.1, c: int = 30 -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate Hyperglycemia Index. @@ -63,7 +63,7 @@ def hyper_index( 0 0.106 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return hyper_index_single(data, ULTR, a, c) @@ -72,15 +72,12 @@ def hyper_index( data = check_data_columns(data) # Calculate hyper_index for each subject - out = data.groupby('id').agg( - hyper_index = ("gl", lambda x: hyper_index_single(x, ULTR, a, c)) - ).reset_index() + out = data.groupby("id").agg(hyper_index=("gl", lambda x: hyper_index_single(x, ULTR, a, c))).reset_index() return out -def hyper_index_single( - gl: pd.Series, ULTR: int = 140, a: float = 1.1, c: int = 30 -) -> float: + +def hyper_index_single(gl: pd.Series, ULTR: int = 140, a: float = 1.1, c: int = 30) -> float: """ Calculate Hyperglycemia Index for a single subject. """ diff --git a/iglu_python/hypo_index.py b/iglu_python/hypo_index.py index bce1dbb..d0d0109 100644 --- a/iglu_python/hypo_index.py +++ b/iglu_python/hypo_index.py @@ -8,7 +8,7 @@ def hypo_index( data: Union[pd.DataFrame, pd.Series, np.ndarray, list], LLTR: int = 80, b: float = 2, d: int = 30 -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate Hypoglycemia Index. @@ -63,20 +63,17 @@ def hypo_index( 0 0.106 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return hypo_index_single(data, LLTR, b, d) data = check_data_columns(data) - out = data.groupby('id').agg( - hypo_index = ("gl", lambda x: hypo_index_single(x, LLTR, b, d)) - ).reset_index() + out = data.groupby("id").agg(hypo_index=("gl", lambda x: hypo_index_single(x, LLTR, b, d))).reset_index() return out -def hypo_index_single( - gl: pd.Series, LLTR: int = 80, b: float = 2, d: int = 30 -) -> float: + +def hypo_index_single(gl: pd.Series, LLTR: int = 80, b: float = 2, d: int = 30) -> float: """ Calculate Hypoglycemia Index for a single subject. """ diff --git a/iglu_python/igc.py b/iglu_python/igc.py index b4200e8..cfc4ee0 100644 --- a/iglu_python/igc.py +++ b/iglu_python/igc.py @@ -16,7 +16,7 @@ def igc( b: float = 2, c: int = 30, d: int = 30, -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate Index of Glycemic Control (IGC). @@ -73,7 +73,7 @@ def igc( 0 0.106 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return igc_single(data, LLTR, ULTR, a, b, c, d) @@ -81,24 +81,17 @@ def igc( # Check and prepare data data = check_data_columns(data) - out = data.groupby('id').agg( - IGC = ("gl", lambda x: igc_single(x, LLTR, ULTR, a, b, c, d)) - ).reset_index() + out = data.groupby("id").agg(IGC=("gl", lambda x: igc_single(x, LLTR, ULTR, a, b, c, d))).reset_index() return out + def igc_single( - gl: pd.Series, - LLTR: int = 80, - ULTR: int = 140, - a: float = 1.1, - b: float = 2, - c: int = 30, - d: int = 30 + gl: pd.Series, LLTR: int = 80, ULTR: int = 140, a: float = 1.1, b: float = 2, c: int = 30, d: int = 30 ) -> float: """ Calculate Index of Glycemic Control for a single subject. """ - # Calculate hyper_index and hypo_index + # Calculate hyper_index and hypo_index out_hyper = hyper_index(gl, ULTR=ULTR, a=a, c=c) out_hypo = hypo_index(gl, LLTR=LLTR, b=b, d=d) diff --git a/iglu_python/in_range_percent.py b/iglu_python/in_range_percent.py index 76909e9..128707b 100644 --- a/iglu_python/in_range_percent.py +++ b/iglu_python/in_range_percent.py @@ -7,9 +7,9 @@ def in_range_percent( - data: Union[pd.DataFrame, pd.Series, list,np.ndarray], + data: Union[pd.DataFrame, pd.Series, list, np.ndarray], target_ranges: List[List[int]] = None, -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate percentage of values within target ranges. @@ -67,7 +67,7 @@ def in_range_percent( # Handle Series input if target_ranges is None: target_ranges = [[70, 180], [63, 140]] - if isinstance(data, (pd.Series, list,np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return in_range_percent_single(data, target_ranges) @@ -87,9 +87,10 @@ def in_range_percent( # Convert to DataFrame df = pd.DataFrame(result) - df = df[['id'] + [col for col in df.columns if col != 'id']] + df = df[["id"] + [col for col in df.columns if col != "id"]] return df + def in_range_percent_single(data: pd.Series, target_ranges: List[List[int]] = None) -> float: """ Calculate percentage of values within target ranges for a single series/subject. @@ -99,16 +100,13 @@ def in_range_percent_single(data: pd.Series, target_ranges: List[List[int]] = No target_ranges = [[70, 180], [63, 140]] total_readings = len(data.dropna()) if total_readings == 0: - return {f"in_range_{min(range_vals)}_{max(range_vals)}": 0 - for range_vals in target_ranges} + return {f"in_range_{min(range_vals)}_{max(range_vals)}": 0 for range_vals in target_ranges} # Calculate percentages for each range percentages = {} for range_vals in target_ranges: min_val, max_val = sorted(range_vals) in_range_count = len(data[(data >= min_val) & (data <= max_val)]) - percentages[f"in_range_{min_val}_{max_val}"] = ( - in_range_count / total_readings - ) * 100 + percentages[f"in_range_{min_val}_{max_val}"] = (in_range_count / total_readings) * 100 return percentages diff --git a/iglu_python/iqr_glu.py b/iglu_python/iqr_glu.py index 4ab936b..444a311 100644 --- a/iglu_python/iqr_glu.py +++ b/iglu_python/iqr_glu.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def iqr_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def iqr_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: """ Calculate glucose level interquartile range (IQR). @@ -44,7 +44,7 @@ def iqr_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFr 0 70.0 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) data = data.dropna() @@ -60,14 +60,11 @@ def iqr_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFr # Calculate IQR for each subject # drop all rows with missing values data = data.dropna() - result = ( - data.groupby("id") - .agg(IQR=("gl", lambda x: iqr_glu_single(x))) - .reset_index() - ) + result = data.groupby("id").agg(IQR=("gl", lambda x: iqr_glu_single(x))).reset_index() return result + def iqr_glu_single( gl: pd.Series, ) -> float: diff --git a/iglu_python/j_index.py b/iglu_python/j_index.py index 417c029..9723af1 100644 --- a/iglu_python/j_index.py +++ b/iglu_python/j_index.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def j_index(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def j_index(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: """ Calculate J-Index score for glucose measurements. @@ -52,7 +52,7 @@ def j_index(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFr 0 1.5000 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return j_index_single(data) @@ -60,12 +60,11 @@ def j_index(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFr # Handle DataFrame input data = check_data_columns(data) - out = data.groupby('id').agg( - J_index = ("gl", lambda x: j_index_single(x)) - ).reset_index() + out = data.groupby("id").agg(J_index=("gl", lambda x: j_index_single(x))).reset_index() return out -def j_index_single(gl: pd.Series) -> float: + +def j_index_single(gl: pd.Series) -> float: """ Calculate J-Index score for a single subject. """ diff --git a/iglu_python/lbgi.py b/iglu_python/lbgi.py index 54807ab..369f306 100644 --- a/iglu_python/lbgi.py +++ b/iglu_python/lbgi.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def lbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def lbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: r""" Calculate the Low Blood Glucose Index (LBGI) for each subject. @@ -64,7 +64,7 @@ def lbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame LBGI 0 0.123456 """ - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return calculate_lbgi(data) @@ -72,11 +72,10 @@ def lbgi(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame # Check DataFrame format check_data_columns(data) - out = data.groupby('id').agg( - LBGI = ("gl", lambda x: calculate_lbgi(x)) - ).reset_index() + out = data.groupby("id").agg(LBGI=("gl", lambda x: calculate_lbgi(x))).reset_index() return out + def calculate_lbgi(glucose_values: pd.Series) -> float: """ Calculate LBGI for a single series of glucose values. @@ -110,4 +109,3 @@ def calculate_lbgi(glucose_values: pd.Series) -> float: lbgi = 10 * np.sum(fbg[glucose_values < 112.5] ** 2) / n return lbgi - diff --git a/iglu_python/m_value.py b/iglu_python/m_value.py index 9048acf..89ef5e1 100644 --- a/iglu_python/m_value.py +++ b/iglu_python/m_value.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def m_value(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], r: float = 90) -> pd.DataFrame|float: +def m_value(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], r: float = 90) -> pd.DataFrame | float: r""" Calculate the M-value of Schlichtkrull et al. (1965) for each subject. @@ -60,7 +60,7 @@ def m_value(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], r: float = 9 0 111.11 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return m_value_single(data, r) @@ -68,12 +68,11 @@ def m_value(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], r: float = 9 # Handle DataFrame input data = check_data_columns(data) - out = data.groupby('id').agg( - M_value = ("gl", lambda x: m_value_single(x, r)) - ).reset_index() + out = data.groupby("id").agg(M_value=("gl", lambda x: m_value_single(x, r))).reset_index() return out -def m_value_single(gl: pd.Series, r: float = 90) -> float: + +def m_value_single(gl: pd.Series, r: float = 90) -> float: """ Calculate the M-value of Schlichtkrull et al. (1965) for a single subject. """ @@ -82,4 +81,3 @@ def m_value_single(gl: pd.Series, r: float = 90) -> float: return np.nan m_value = 1000 * np.mean(np.abs(np.log10(gl / r)) ** 3) return m_value - diff --git a/iglu_python/mad_glu.py b/iglu_python/mad_glu.py index 5d13881..eb97735 100644 --- a/iglu_python/mad_glu.py +++ b/iglu_python/mad_glu.py @@ -6,9 +6,7 @@ from .utils import check_data_columns -def mad_glu( - data: Union[pd.DataFrame, pd.Series, np.ndarray, list], constant: float = 1.4826 -) -> pd.DataFrame|float: +def mad_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], constant: float = 1.4826) -> pd.DataFrame | float: """ Calculate Median Absolute Deviation (MAD) of glucose values. @@ -53,7 +51,7 @@ def mad_glu( 0 27.5 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return mad_glu_single(data, constant) @@ -61,11 +59,10 @@ def mad_glu( # Handle DataFrame input data = check_data_columns(data) - out = data.groupby('id').agg( - MAD = ("gl", lambda x: mad_glu_single(x, constant)) - ).reset_index() + out = data.groupby("id").agg(MAD=("gl", lambda x: mad_glu_single(x, constant))).reset_index() return out + def mad_glu_single(gl: pd.Series, constant: float = 1.4826) -> float: """ Calculate Median Absolute Deviation (MAD) of glucose values for a single subject. diff --git a/iglu_python/mag.py b/iglu_python/mag.py index faddd1d..faee060 100644 --- a/iglu_python/mag.py +++ b/iglu_python/mag.py @@ -12,7 +12,7 @@ def mag( dt0: Optional[int] = None, inter_gap: int = 45, tz: str = "", -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate Mean Absolute Glucose (MAG). @@ -79,13 +79,12 @@ def mag( # Handle DataFrame input data = check_data_columns(data) - data.set_index('time', drop=True, inplace=True) + data.set_index("time", drop=True, inplace=True) - out = data.groupby('id').agg( - MAG = ("gl", lambda x: mag_single(x, n, dt0, inter_gap, tz)) - ).reset_index() + out = data.groupby("id").agg(MAG=("gl", lambda x: mag_single(x, n, dt0, inter_gap, tz))).reset_index() return out + def mag_single(gl: pd.Series, n: int = 60, dt0: Optional[int] = None, inter_gap: int = 45, tz: str = "") -> float: """Calculate MAG for a single subject""" # Convert data to day-by-day format @@ -110,7 +109,7 @@ def mag_single(gl: pd.Series, n: int = 60, dt0: Optional[int] = None, inter_gap: lag = readings_per_interval if is_iglu_r_compatible(): - idx = np.arange(0,len(gl_values),lag) + idx = np.arange(0, len(gl_values), lag) gl_values_idx = gl_values[idx] diffs = gl_values_idx[1:] - gl_values_idx[:-1] diffs = np.abs(diffs) diff --git a/iglu_python/mage.py b/iglu_python/mage.py index 782d578..f5ca657 100644 --- a/iglu_python/mage.py +++ b/iglu_python/mage.py @@ -124,13 +124,11 @@ def mage( } ) if version == "ma": - mage_val = mage_ma_single(data_df, short_ma, long_ma, direction, - return_type='num', - inter_gap=inter_gap, - max_gap=max_gap, - tz=tz) + mage_val = mage_ma_single( + data_df, short_ma, long_ma, direction, return_type="num", inter_gap=inter_gap, max_gap=max_gap, tz=tz + ) else: - mage_val = mage_naive(data_df,sd_multiplier=sd_multiplier) + mage_val = mage_naive(data_df, sd_multiplier=sd_multiplier) return mage_val # Handle DataFrame input @@ -144,20 +142,21 @@ def mage( continue if version == "ma": - mage_val = mage_ma_single(subject_data, short_ma, long_ma, direction, return_type,inter_gap,max_gap,tz) - if return_type == "df" : + mage_val = mage_ma_single(subject_data, short_ma, long_ma, direction, return_type, inter_gap, max_gap, tz) + if return_type == "df": subject_result_dict = mage_val.to_dict() else: subject_result_dict = {"MAGE": mage_val} else: - mage_val = mage_naive(subject_data,sd_multiplier=sd_multiplier) + mage_val = mage_naive(subject_data, sd_multiplier=sd_multiplier) subject_result_dict = {"MAGE": mage_val} result.append({"id": subject, **subject_result_dict}) return pd.DataFrame(result) -def mage_naive(data: pd.DataFrame,sd_multiplier:float = 1.0) -> float: + +def mage_naive(data: pd.DataFrame, sd_multiplier: float = 1.0) -> float: """Calculate MAGE using naive algorithm""" # Calculate absolute differences from mean mean_gl = data["gl"].mean() @@ -171,71 +170,80 @@ def mage_naive(data: pd.DataFrame,sd_multiplier:float = 1.0) -> float: return float(mage_val) if not pd.isna(mage_val) else np.nan -def _preprocess_data(data: pd.DataFrame, short_ma: int, long_ma: int, - inter_gap: int, tz: str) -> pd.DataFrame: + +def _preprocess_data(data: pd.DataFrame, short_ma: int, long_ma: int, inter_gap: int, tz: str) -> pd.DataFrame: """Preprocess data for MAGE calculation""" # Interpolate over uniform grid data_ip = CGMS2DayByDay(data, dt0=5, inter_gap=inter_gap, tz=tz) day_one = data_ip[1][0] gl = data_ip[0].flatten().tolist() - time_ip = [pd.Timedelta(i * 5, unit="m") + day_one for i in range(1, len(gl)+1)] + time_ip = [pd.Timedelta(i * 5, unit="m") + day_one for i in range(1, len(gl) + 1)] # Ensure short_ma and long_ma are appropriate if short_ma >= long_ma: short_ma, long_ma = long_ma, short_ma # Create interpolated data - interpolated_data = pd.DataFrame({ - "id": data['id'].iloc[0], - "time": pd.Series(time_ip, dtype='datetime64[ns]'), - "gl": pd.Series(gl, dtype='float64') - }) + interpolated_data = pd.DataFrame( + { + "id": data["id"].iloc[0], + "time": pd.Series(time_ip, dtype="datetime64[ns]"), + "gl": pd.Series(gl, dtype="float64"), + } + ) # Drop NA rows before first glucose reading - first_valid_idx = interpolated_data['gl'].first_valid_index() + first_valid_idx = interpolated_data["gl"].first_valid_index() if first_valid_idx is not None: interpolated_data = interpolated_data.iloc[first_valid_idx:] # Drop NA rows after last glucose reading - last_valid_idx = interpolated_data['gl'].last_valid_index() + last_valid_idx = interpolated_data["gl"].last_valid_index() if last_valid_idx is not None: - interpolated_data = interpolated_data.iloc[:last_valid_idx+1] + interpolated_data = interpolated_data.iloc[: last_valid_idx + 1] # Add gap column to mark NA values as 1 - interpolated_data['gap'] = interpolated_data['gl'].isna().astype(int) + interpolated_data["gap"] = interpolated_data["gl"].isna().astype(int) return interpolated_data + def _filter_mage_results(return_val: pd.DataFrame, direction: str) -> pd.DataFrame: """Filter MAGE results based on direction""" - if direction == 'plus': - return return_val[return_val['plus_or_minus'] == 'PLUS'].copy() - elif direction == 'minus': - return return_val[return_val['plus_or_minus'] == 'MINUS'].copy() - elif direction == 'avg': - return return_val[return_val['MAGE'].notna()].copy() - elif direction == 'max': + if direction == "plus": + return return_val[return_val["plus_or_minus"] == "PLUS"].copy() + elif direction == "minus": + return return_val[return_val["plus_or_minus"] == "MINUS"].copy() + elif direction == "avg": + return return_val[return_val["MAGE"].notna()].copy() + elif direction == "max": # Group by start,end and keep max mage in each group - idx = return_val.groupby(['start', 'end'])['MAGE'].idxmax() + idx = return_val.groupby(["start", "end"])["MAGE"].idxmax() return return_val.loc[idx].reset_index(drop=True) else: # default: first excursions only - return return_val[return_val['first_excursion']].copy() + return return_val[return_val["first_excursion"]].copy() + def _calculate_weighted_mage(res: pd.DataFrame) -> float: """Calculate time-weighted MAGE""" if res.empty: return np.nan - res['hours'] = res['end'] - res['start'] - res['weight'] = res['hours'] / res['hours'].sum() - return (res['MAGE'] * res['weight']).sum() + res["hours"] = res["end"] - res["start"] + res["weight"] = res["hours"] / res["hours"].sum() + return (res["MAGE"] * res["weight"]).sum() + -def mage_ma_single(data: pd.DataFrame, short_ma: int, long_ma: int, - direction:str ='avg', - return_type:str = "num", - inter_gap:int = 45, - max_gap:int = 180, - tz:str = "" ) -> pd.DataFrame|float: +def mage_ma_single( + data: pd.DataFrame, + short_ma: int, + long_ma: int, + direction: str = "avg", + return_type: str = "num", + inter_gap: int = 45, + max_gap: int = 180, + tz: str = "", +) -> pd.DataFrame | float: """Calculate MAGE using moving average algorithm for a single subject""" # Preprocess data @@ -253,7 +261,7 @@ def mage_ma_single(data: pd.DataFrame, short_ma: int, long_ma: int, else: return_val = pd.concat([return_val, ret], ignore_index=True) - if return_type == 'df': + if return_type == "df": return return_val # Filter results based on direction @@ -262,6 +270,7 @@ def mage_ma_single(data: pd.DataFrame, short_ma: int, long_ma: int, # Calculate weighted MAGE return _calculate_weighted_mage(res) + def _calculate_moving_averages(data: pd.DataFrame, short_ma: int, long_ma: int) -> pd.DataFrame: """Calculate short and long moving averages""" data = data.copy() @@ -270,114 +279,112 @@ def _calculate_moving_averages(data: pd.DataFrame, short_ma: int, long_ma: int) # Fill leading NAs (forward fill first valid value) if short_ma > len(data): - data.loc[data.index[:short_ma], 'MA_Short'] = data['MA_Short'].iloc[-1] + data.loc[data.index[:short_ma], "MA_Short"] = data["MA_Short"].iloc[-1] else: - data.loc[data.index[:short_ma], 'MA_Short'] = data['MA_Short'].iloc[short_ma-1] + data.loc[data.index[:short_ma], "MA_Short"] = data["MA_Short"].iloc[short_ma - 1] if long_ma > len(data): - data.loc[data.index[:long_ma], 'MA_Long'] = data['MA_Long'].iloc[-1] + data.loc[data.index[:long_ma], "MA_Long"] = data["MA_Long"].iloc[-1] else: - data.loc[data.index[:long_ma], 'MA_Long'] = data['MA_Long'].iloc[long_ma-1] + data.loc[data.index[:long_ma], "MA_Long"] = data["MA_Long"].iloc[long_ma - 1] # Calculate difference - data['DELTA_SHORT_LONG'] = data['MA_Short'] - data['MA_Long'] + data["DELTA_SHORT_LONG"] = data["MA_Short"] - data["MA_Long"] return data.reset_index(drop=True) + def _check_data_validity(data: pd.DataFrame, short_ma: int) -> bool: """Check if data is valid for MAGE calculation""" nmeasurements = len(data) return not ( - data['gl'].isnull().all() or - nmeasurements < 7 or - nmeasurements < short_ma or - np.std(data['gl'], ddof=1) < 1 + data["gl"].isnull().all() or nmeasurements < 7 or nmeasurements < short_ma or np.std(data["gl"], ddof=1) < 1 ) + def _find_crossing_points(data: pd.DataFrame) -> tuple[list, list]: """Find crossing points in the data""" idx = list(data.index) - types = {'REL_MIN': 0, 'REL_MAX': 1} + types = {"REL_MIN": 0, "REL_MAX": 1} nmeasurements = len(data) # Create storage lists - list_cross = { - 'id': [np.nan] * nmeasurements, - 'type': [np.nan] * nmeasurements - } + list_cross = {"id": [np.nan] * nmeasurements, "type": [np.nan] * nmeasurements} # Always add 1st point - list_cross['id'][0] = idx[0] - list_cross['type'][0] = types['REL_MAX'] if data['DELTA_SHORT_LONG'].iloc[0] > 0 else types['REL_MIN'] + list_cross["id"][0] = idx[0] + list_cross["type"][0] = types["REL_MAX"] if data["DELTA_SHORT_LONG"].iloc[0] > 0 else types["REL_MIN"] count = 1 # treat DELTA_SHORT_LONG==0 as NaN - data.loc[data['DELTA_SHORT_LONG'] == 0, 'DELTA_SHORT_LONG'] = np.nan + data.loc[data["DELTA_SHORT_LONG"] == 0, "DELTA_SHORT_LONG"] = np.nan # Main loop - for i in range(1, len(data['DELTA_SHORT_LONG'])): + for i in range(1, len(data["DELTA_SHORT_LONG"])): # Check data validity - if (not pd.isna(data['gl'].iloc[i]) and - not pd.isna(data['gl'].iloc[i-1]) and - not pd.isna(data['DELTA_SHORT_LONG'].iloc[i]) and - not pd.isna(data['DELTA_SHORT_LONG'].iloc[i-1])): - + if ( + not pd.isna(data["gl"].iloc[i]) + and not pd.isna(data["gl"].iloc[i - 1]) + and not pd.isna(data["DELTA_SHORT_LONG"].iloc[i]) + and not pd.isna(data["DELTA_SHORT_LONG"].iloc[i - 1]) + ): # Primary crossover detection - if (data['DELTA_SHORT_LONG'].iloc[i] * data['DELTA_SHORT_LONG'].iloc[i-1] < 0): - list_cross['id'][count] = idx[i] - if data['DELTA_SHORT_LONG'].iloc[i] < data['DELTA_SHORT_LONG'].iloc[i-1]: - list_cross['type'][count] = types['REL_MIN'] + if data["DELTA_SHORT_LONG"].iloc[i] * data["DELTA_SHORT_LONG"].iloc[i - 1] < 0: + list_cross["id"][count] = idx[i] + if data["DELTA_SHORT_LONG"].iloc[i] < data["DELTA_SHORT_LONG"].iloc[i - 1]: + list_cross["type"][count] = types["REL_MIN"] else: - list_cross['type'][count] = types['REL_MAX'] + list_cross["type"][count] = types["REL_MAX"] count += 1 # Gap handling - elif (not pd.isna(data['DELTA_SHORT_LONG'].iloc[i]) and count >= 1): + elif not pd.isna(data["DELTA_SHORT_LONG"].iloc[i]) and count >= 1: try: - prev_cross_idx = idx.index(list_cross['id'][count-1]) - prev_delta = data['DELTA_SHORT_LONG'].iloc[prev_cross_idx] + prev_cross_idx = idx.index(list_cross["id"][count - 1]) + prev_delta = data["DELTA_SHORT_LONG"].iloc[prev_cross_idx] - if (data['DELTA_SHORT_LONG'].iloc[i] * prev_delta < 0): - list_cross['id'][count] = idx[i] - if data['DELTA_SHORT_LONG'].iloc[i] < prev_delta: - list_cross['type'][count] = types['REL_MIN'] + if data["DELTA_SHORT_LONG"].iloc[i] * prev_delta < 0: + list_cross["id"][count] = idx[i] + if data["DELTA_SHORT_LONG"].iloc[i] < prev_delta: + list_cross["type"][count] = types["REL_MIN"] else: - list_cross['type'][count] = types['REL_MAX'] + list_cross["type"][count] = types["REL_MAX"] count += 1 except ValueError: pass # Add last point last_idx = idx[-1] - list_cross['id'][count] = last_idx - list_cross['type'][count] = types['REL_MAX'] if data['DELTA_SHORT_LONG'].iloc[-1] > 0 else types['REL_MIN'] + list_cross["id"][count] = last_idx + list_cross["type"][count] = types["REL_MAX"] if data["DELTA_SHORT_LONG"].iloc[-1] > 0 else types["REL_MIN"] # Filter out NaN values - clean_ids = [x for x in list_cross['id'] if not pd.isna(x)] - clean_types = [x for x in list_cross['type'] if not pd.isna(x)] + clean_ids = [x for x in list_cross["id"] if not pd.isna(x)] + clean_types = [x for x in list_cross["type"] if not pd.isna(x)] return clean_ids, clean_types + def _calculate_extrema(data: pd.DataFrame, crosses: pd.DataFrame) -> tuple[list, list]: """Calculate min and max glucose values from crossing points""" num_extrema = len(crosses) - 1 minmax = [np.nan] * num_extrema indexes = [np.nan] * num_extrema - types = {'REL_MIN': 0, 'REL_MAX': 1} + types = {"REL_MIN": 0, "REL_MAX": 1} for i in range(num_extrema): # Define search boundaries if i == 0: - s1 = int(crosses.iloc[i]['id']) + s1 = int(crosses.iloc[i]["id"]) else: - s1 = int(indexes[i-1]) + s1 = int(indexes[i - 1]) - s2 = int(crosses.iloc[i+1]['id']) + s2 = int(crosses.iloc[i + 1]["id"]) # Extract glucose segment - glucose_segment = data['gl'].iloc[s1:s2+1] + glucose_segment = data["gl"].iloc[s1 : s2 + 1] # Find min or max based on crossover type - if crosses.iloc[i]['type'] == types['REL_MIN']: + if crosses.iloc[i]["type"] == types["REL_MIN"]: minmax[i] = glucose_segment.min() indexes[i] = glucose_segment.idxmin() else: @@ -386,6 +393,7 @@ def _calculate_extrema(data: pd.DataFrame, crosses: pd.DataFrame) -> tuple[list, return minmax, indexes + def mage_atomic(data, short_ma, long_ma): """Calculate MAGE on 1 segment of CGM trace""" @@ -394,13 +402,15 @@ def mage_atomic(data, short_ma, long_ma): # Sanity check if not _check_data_validity(data, short_ma): - return pd.DataFrame({ - 'start': [data['time'].iloc[0]], - 'end': [data['time'].iloc[-1]], - 'MAGE': [np.nan], - 'plus_or_minus': [np.nan], - 'first_excursion': [np.nan] - }) + return pd.DataFrame( + { + "start": [data["time"].iloc[0]], + "end": [data["time"].iloc[-1]], + "MAGE": [np.nan], + "plus_or_minus": [np.nan], + "first_excursion": [np.nan], + } + ) # Find crossing points clean_ids, clean_types = _find_crossing_points(data) @@ -411,47 +421,53 @@ def mage_atomic(data, short_ma, long_ma): # Calculate differences and standard deviation differences = np.subtract.outer(minmax, minmax).T - standardD = data['gl'].std() + standardD = data["gl"].std() # Calculate MAGE+ and MAGE- mage_plus_heights, mage_plus_tp_pairs = calculate_mage_plus(differences, minmax, standardD) mage_minus_heights, mage_minus_tp_pairs = calculate_mage_minus(differences, minmax, standardD) if len(mage_minus_heights) == 0 and len(mage_plus_heights) == 0: - return pd.DataFrame({ - 'start': [data['time'].iloc[0]], - 'end': [data['time'].iloc[-1]], - 'MAGE': [np.nan], - 'plus_or_minus': [np.nan], - 'first_excursion': [np.nan] - }, index=[0]) + return pd.DataFrame( + { + "start": [data["time"].iloc[0]], + "end": [data["time"].iloc[-1]], + "MAGE": [np.nan], + "plus_or_minus": [np.nan], + "first_excursion": [np.nan], + }, + index=[0], + ) # Determine which excursion type occurs first - is_plus_first = ( - len(mage_plus_heights) > 0 and - (len(mage_minus_heights) == 0 or - mage_plus_tp_pairs[0][1] <= mage_minus_tp_pairs[0][0]) + is_plus_first = len(mage_plus_heights) > 0 and ( + len(mage_minus_heights) == 0 or mage_plus_tp_pairs[0][1] <= mage_minus_tp_pairs[0][0] ) # Create result dataframes - mage_plus = pd.DataFrame({ - 'start': [data['time'].iloc[0]], - 'end': [data['time'].iloc[-1]], - 'MAGE': [np.mean(mage_plus_heights) if len(mage_plus_heights) > 0 else np.nan], - 'plus_or_minus': ['PLUS'], - 'first_excursion': [is_plus_first] - }) - - mage_minus = pd.DataFrame({ - 'start': [data['time'].iloc[0]], - 'end': [data['time'].iloc[-1]], - 'MAGE': [abs(np.mean(mage_minus_heights)) if len(mage_minus_heights) > 0 else np.nan], - 'plus_or_minus': ['MINUS'], - 'first_excursion': [not is_plus_first] - }) + mage_plus = pd.DataFrame( + { + "start": [data["time"].iloc[0]], + "end": [data["time"].iloc[-1]], + "MAGE": [np.mean(mage_plus_heights) if len(mage_plus_heights) > 0 else np.nan], + "plus_or_minus": ["PLUS"], + "first_excursion": [is_plus_first], + } + ) + + mage_minus = pd.DataFrame( + { + "start": [data["time"].iloc[0]], + "end": [data["time"].iloc[-1]], + "MAGE": [abs(np.mean(mage_minus_heights)) if len(mage_minus_heights) > 0 else np.nan], + "plus_or_minus": ["MINUS"], + "first_excursion": [not is_plus_first], + } + ) return pd.concat([mage_plus, mage_minus], ignore_index=True) + def calculate_mage_plus(differences, minmax, standardD): """ Calculate MAGE+ (positive glycemic excursions) @@ -471,7 +487,7 @@ def calculate_mage_plus(differences, minmax, standardD): while j < N: # Get differences from previous extrema to current point j - delta = differences[prev_j:j+1, j] # j+1 because Python slicing is exclusive + delta = differences[prev_j : j + 1, j] # j+1 because Python slicing is exclusive if len(delta) == 0: j += 1 @@ -503,6 +519,7 @@ def calculate_mage_plus(differences, minmax, standardD): return mage_plus_heights, mage_plus_tp_pairs + def calculate_mage_minus(differences, minmax, standardD): """ Calculate MAGE- (negative glycemic excursions) @@ -522,7 +539,7 @@ def calculate_mage_minus(differences, minmax, standardD): while j < N: # Get differences from previous extrema to current point j - delta = differences[prev_j:j+1, j] # j+1 because Python slicing is exclusive + delta = differences[prev_j : j + 1, j] # j+1 because Python slicing is exclusive if len(delta) == 0: j += 1 @@ -553,6 +570,7 @@ def calculate_mage_minus(differences, minmax, standardD): return mage_minus_heights, mage_minus_tp_pairs + def segment_time_series(data, max_gap_minutes): """ Split glucose time series into segments based on large gaps @@ -561,30 +579,30 @@ def segment_time_series(data, max_gap_minutes): # Calculate time differences # Calculate time differences between consecutive non-NA glucose readings - data['time_diff'] = np.nan - valid_indices = data['gl'].notna() + data["time_diff"] = np.nan + valid_indices = data["gl"].notna() if valid_indices.any(): # Get timestamps of valid readings - valid_times = data.loc[valid_indices, 'time'] + valid_times = data.loc[valid_indices, "time"] # Calculate differences between consecutive valid readings time_diffs = valid_times.diff().dt.total_seconds() / 60 # Convert to minutes # Assign differences back to original dataframe at valid indices - data.loc[valid_indices, 'time_diff'] = time_diffs + data.loc[valid_indices, "time_diff"] = time_diffs # Identify where gaps exceed threshold - large_gaps = data['time_diff'] > max_gap_minutes + large_gaps = data["time_diff"] > max_gap_minutes # Create segment labels by cumulatively summing large gaps # This creates a new segment ID each time we encounter a large gap - data['segment_id'] = large_gaps.cumsum() + data["segment_id"] = large_gaps.cumsum() # Group by segment and return list of DataFrames segments = [] - for _segment_id, group in data.groupby('segment_id'): + for _segment_id, group in data.groupby("segment_id"): # Drop the temporary columns we added - group = group.drop(['time_diff', 'segment_id'], axis=1) + group = group.drop(["time_diff", "segment_id"], axis=1) # Drop rows with NA glucose values at the end of the segment - while len(group) > 0 and pd.isna(group['gl'].iloc[-1]): + while len(group) > 0 and pd.isna(group["gl"].iloc[-1]): group = group.iloc[:-1] segments.append(group.reset_index(drop=True)) diff --git a/iglu_python/mean_glu.py b/iglu_python/mean_glu.py index 4757ccb..f2c5e23 100644 --- a/iglu_python/mean_glu.py +++ b/iglu_python/mean_glu.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def mean_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataFrame|float: +def mean_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataFrame | float: """ Calculate mean glucose value for each subject. @@ -46,7 +46,7 @@ def mean_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataF """ # Handle Series input if isinstance(data, (list, np.ndarray, pd.Series)): - if isinstance(data, (list,np.ndarray)): + if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return data.mean() diff --git a/iglu_python/median_glu.py b/iglu_python/median_glu.py index b2ca9da..62224c1 100644 --- a/iglu_python/median_glu.py +++ b/iglu_python/median_glu.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def median_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def median_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: """ Calculate median glucose value for each subject. @@ -45,7 +45,7 @@ def median_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.Dat 0 160.0 """ # Handle Series input - if isinstance(data, (pd.Series,list, np.ndarray)): + if isinstance(data, (pd.Series, list, np.ndarray)): if isinstance(data, (np.ndarray, list)): data = pd.Series(data) return data.median() diff --git a/iglu_python/modd.py b/iglu_python/modd.py index a8bba91..4c2479e 100644 --- a/iglu_python/modd.py +++ b/iglu_python/modd.py @@ -6,9 +6,7 @@ from .utils import CGMS2DayByDay, check_data_columns -def modd( - data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lag: int = 1, tz: str = "" -) -> pd.DataFrame|float: +def modd(data: Union[pd.DataFrame, pd.Series, np.ndarray, list], lag: int = 1, tz: str = "") -> pd.DataFrame | float: """ Calculate Mean of Daily Differences (MODD). @@ -67,12 +65,11 @@ def modd( # Handle DataFrame input data = check_data_columns(data) - data.set_index('time', drop=True, inplace=True) - out = data.groupby('id').agg( - MODD = ("gl", lambda x: modd_single(x, lag, tz)) - ).reset_index() + data.set_index("time", drop=True, inplace=True) + out = data.groupby("id").agg(MODD=("gl", lambda x: modd_single(x, lag, tz))).reset_index() return out + def modd_single(data: pd.Series, lag: int = 1, tz: str = "") -> float: """Calculate MODD for a single subject""" # Convert data to day-by-day format diff --git a/iglu_python/pgs.py b/iglu_python/pgs.py index 763203f..dfb751f 100644 --- a/iglu_python/pgs.py +++ b/iglu_python/pgs.py @@ -10,9 +10,7 @@ from .utils import check_data_columns -def pgs( - data: Union[pd.DataFrame, pd.Series], dur_length: int = 20, end_length: int = 30 -) -> pd.DataFrame|float: +def pgs(data: Union[pd.DataFrame, pd.Series], dur_length: int = 20, end_length: int = 30) -> pd.DataFrame | float: """ Calculate Personal Glycemic State (PGS). @@ -87,19 +85,18 @@ def pgs( # Handle DataFrame input data = check_data_columns(data) - data.set_index('time', drop=True, inplace=True) + data.set_index("time", drop=True, inplace=True) - out = data.groupby('id').agg( - PGS = ("gl", lambda x: pgs_single(x, dur_length, end_length)) - ).reset_index() + out = data.groupby("id").agg(PGS=("gl", lambda x: pgs_single(x, dur_length, end_length))).reset_index() return out + def pgs_single(gl: pd.Series, dur_length: int = 20, end_length: int = 30) -> float: """Calculate PGS for a single subject""" # Calculate components gvp_val = gvp(gl) mean_val = mean_glu(gl) - ptir_val = in_range_percent(gl, target_ranges=[[70, 180]])['in_range_70_180'] + ptir_val = in_range_percent(gl, target_ranges=[[70, 180]])["in_range_70_180"] # Calculate episode components eps = episode_calculation( @@ -116,8 +113,7 @@ def pgs_single(gl: pd.Series, dur_length: int = 20, end_length: int = 30) -> flo f_gvp = 1 + (9 / (1 + np.exp(-0.049 * (gvp_val - 65.47)))) f_ptir = 1 + (9 / (1 + np.exp(0.0833 * (ptir_val - 55.04)))) f_mg = 1 + 9 * ( - (1 / (1 + np.exp(0.1139 * (mean_val - 72.08)))) - + (1 / (1 + np.exp(-0.09195 * (mean_val - 157.57)))) + (1 / (1 + np.exp(0.1139 * (mean_val - 72.08)))) + (1 / (1 + np.exp(-0.09195 * (mean_val - 157.57)))) ) f_h54 = 0.5 + 4.5 * (1 - np.exp(-0.91093 * n54)) @@ -127,4 +123,3 @@ def pgs_single(gl: pd.Series, dur_length: int = 20, end_length: int = 30) -> flo pgs_score = f_gvp + f_ptir + f_mg + f_h54 + f_h70 return pgs_score - diff --git a/iglu_python/process_data.py b/iglu_python/process_data.py index baf666f..0959362 100644 --- a/iglu_python/process_data.py +++ b/iglu_python/process_data.py @@ -13,27 +13,31 @@ def _validate_input_data(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) raise TypeError("Invalid data type, please use DataFrame, Series, list, or numpy array.") -def _convert_to_dataframe(data: Union[pd.DataFrame, pd.Series, list, np.ndarray], - glu: Optional[str], timestamp: Optional[str], - id: Optional[str]) -> pd.DataFrame: +def _convert_to_dataframe( + data: Union[pd.DataFrame, pd.Series, list, np.ndarray], + glu: Optional[str], + timestamp: Optional[str], + id: Optional[str], +) -> pd.DataFrame: """Convert input data to DataFrame""" if isinstance(data, (list, np.ndarray)): if all(param is None for param in [glu, timestamp, id]): - return pd.DataFrame({'gl': data}) + return pd.DataFrame({"gl": data}) raise ValueError("Cannot process list/array data with column specifications. Please provide a DataFrame.") if isinstance(data, pd.Series): - if data.index.dtype.kind == 'M': # datetime index - return pd.DataFrame({'time': data.index, 'gl': data.values}) - return pd.DataFrame({'gl': data.values}) + if data.index.dtype.kind == "M": # datetime index + return pd.DataFrame({"time": data.index, "gl": data.values}) + return pd.DataFrame({"gl": data.values}) if not isinstance(data, pd.DataFrame): raise TypeError("Could not convert data to DataFrame") return data -def _find_column(data: pd.DataFrame, column_name: Optional[str], default_name: str, - original_columns: list, param_name: str) -> str: +def _find_column( + data: pd.DataFrame, column_name: Optional[str], default_name: str, original_columns: list, param_name: str +) -> str: """Find and validate column name""" if column_name is None: if default_name not in data.columns: @@ -45,14 +49,19 @@ def _find_column(data: pd.DataFrame, column_name: Optional[str], default_name: s column_lower = column_name.lower() if column_lower not in data.columns: - warnings.warn(f"Could not find user-defined {param_name} argument name '{column_name}' in dataset. " - f"Available columns: {original_columns}", stacklevel=2) + warnings.warn( + f"Could not find user-defined {param_name} argument name '{column_name}' in dataset. " + f"Available columns: {original_columns}", + stacklevel=2, + ) if default_name in data.columns: - raise ValueError(f"Fix user-defined argument name for {param_name}. " - f"Note: A column in the dataset DOES match the name '{default_name}': " - f"If this is the correct column, indicate as such in function argument. " - f"i.e. {param_name} = '{default_name}'") + raise ValueError( + f"Fix user-defined argument name for {param_name}. " + f"Note: A column in the dataset DOES match the name '{default_name}': " + f"If this is the correct column, indicate as such in function argument. " + f"i.e. {param_name} = '{default_name}'" + ) else: raise ValueError(f"Column '{column_name}' not found in data") @@ -63,33 +72,35 @@ def _process_id_column(data: pd.DataFrame, id: Optional[str], original_columns: """Process and validate ID column""" if id is None: print("No 'id' parameter passed, defaulting id to 1") - data.insert(0, 'id', pd.Series(['1'] * len(data), dtype='string')) + data.insert(0, "id", pd.Series(["1"] * len(data), dtype="string")) return data - id_col = _find_column(data, id, 'id', original_columns, 'id') + id_col = _find_column(data, id, "id", original_columns, "id") id_data = data[id_col] data = data.drop(columns=[id_col]) - data.insert(0, 'id', id_data.astype('string')) + data.insert(0, "id", id_data.astype("string")) return data -def _process_timestamp_column(data: pd.DataFrame, timestamp: Optional[str], - original_columns: list, time_parser: Callable) -> pd.DataFrame: +def _process_timestamp_column( + data: pd.DataFrame, timestamp: Optional[str], original_columns: list, time_parser: Callable +) -> pd.DataFrame: """Process and validate timestamp column""" - timestamp_col = _find_column(data, timestamp, 'time', original_columns, 'timestamp') + timestamp_col = _find_column(data, timestamp, "time", original_columns, "timestamp") - if 'time' not in data.columns or timestamp_col != 'time': + if "time" not in data.columns or timestamp_col != "time": time_data = data[timestamp_col] - if timestamp_col != 'time': + if timestamp_col != "time": data = data.drop(columns=[timestamp_col]) try: time_data = time_parser(time_data) except Exception as e: - raise ValueError(f"Failed to parse times, ensure times are in parsable format. " - f"Original error: {str(e)}") from e + raise ValueError( + f"Failed to parse times, ensure times are in parsable format. Original error: {str(e)}" + ) from e - data.insert(1, 'time', time_data) + data.insert(1, "time", time_data) data["time"] = pd.to_datetime(data["time"]).apply(localize_naive_timestamp) return data @@ -97,34 +108,34 @@ def _process_timestamp_column(data: pd.DataFrame, timestamp: Optional[str], def _process_glucose_column(data: pd.DataFrame, glu: Optional[str], original_columns: list) -> pd.DataFrame: """Process and validate glucose column""" - glu_col = _find_column(data, glu, 'gl', original_columns, 'glucose') + glu_col = _find_column(data, glu, "gl", original_columns, "glucose") # Check if glucose values are in mmol/L - mmol_conversion = glu and 'mmol/l' in glu.lower() + mmol_conversion = glu and "mmol/l" in glu.lower() - if 'gl' not in data.columns or glu_col != 'gl': + if "gl" not in data.columns or glu_col != "gl": gl_data = data[glu_col] - if glu_col != 'gl': + if glu_col != "gl": data = data.drop(columns=[glu_col]) try: - gl_data = pd.to_numeric(gl_data, errors='coerce') + gl_data = pd.to_numeric(gl_data, errors="coerce") except Exception as e: raise ValueError(f"Failed to convert glucose values to numeric: {str(e)}") from e if mmol_conversion: gl_data = gl_data * 18 - data.insert(2, 'gl', gl_data) + data.insert(2, "gl", gl_data) return data def _validate_glucose_values(data: pd.DataFrame) -> None: """Validate glucose values and issue warnings if needed""" - if data['gl'].min() < 20: + if data["gl"].min() < 20: warnings.warn("Minimum glucose reading below 20. Data may not be cleaned.", stacklevel=2) - if data['gl'].max() > 500: + if data["gl"].max() > 500: warnings.warn("Maximum glucose reading above 500. Data may not be cleaned.", stacklevel=2) @@ -133,7 +144,7 @@ def process_data( id: Optional[str] = None, timestamp: Optional[str] = None, glu: Optional[str] = None, - time_parser: Optional[Callable] = None + time_parser: Optional[Callable] = None, ) -> pd.DataFrame: """ Data Pre-Processor @@ -220,7 +231,7 @@ def process_data( _validate_glucose_values(data) # Final cleanup - data = data[['id', 'time', 'gl']].dropna(subset=['gl']) + data = data[["id", "time", "gl"]].dropna(subset=["gl"]) if data.empty: raise ValueError("No valid data remaining after processing") diff --git a/iglu_python/quantile_glu.py b/iglu_python/quantile_glu.py index 20e9d16..ecae933 100644 --- a/iglu_python/quantile_glu.py +++ b/iglu_python/quantile_glu.py @@ -8,7 +8,7 @@ def quantile_glu( data: Union[pd.DataFrame, pd.Series, np.ndarray, list], quantiles: List[float] = None -) -> pd.DataFrame|list[float]: +) -> pd.DataFrame | list[float]: """ Calculate glucose level quantiles. @@ -71,11 +71,7 @@ def quantile_glu( # Calculate quantiles for each subject and unstack to columns result = ( data.groupby("id")["gl"] - .apply( - lambda x: pd.Series( - np.quantile(x.dropna(), np.array(quantiles) / 100), index=quantiles - ) - ) + .apply(lambda x: pd.Series(np.quantile(x.dropna(), np.array(quantiles) / 100), index=quantiles)) .unstack() .reset_index() ) diff --git a/iglu_python/range_glu.py b/iglu_python/range_glu.py index c94ca37..9b7fd06 100644 --- a/iglu_python/range_glu.py +++ b/iglu_python/range_glu.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def range_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame|float: +def range_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.DataFrame | float: """ Calculate glucose level range. @@ -56,8 +56,6 @@ def range_glu(data: Union[pd.DataFrame, pd.Series, np.ndarray, list]) -> pd.Data data = check_data_columns(data) # Calculate range for each subject - result = ( - data.groupby("id").agg(range=("gl", lambda x: x.max() - x.min())).reset_index() - ) + result = data.groupby("id").agg(range=("gl", lambda x: x.max() - x.min())).reset_index() return result diff --git a/iglu_python/roc.py b/iglu_python/roc.py index b75d8d8..b2a2349 100644 --- a/iglu_python/roc.py +++ b/iglu_python/roc.py @@ -87,11 +87,7 @@ def roc( 3 NaN """ - def roc_single(data: pd.DataFrame, - timelag: int, - dt0: int = None , - inter_gap: int = 45, - tz: str = "") -> np.ndarray: + def roc_single(data: pd.DataFrame, timelag: int, dt0: int = None, inter_gap: int = 45, tz: str = "") -> np.ndarray: """Calculate ROC for a single subject's data""" data_ip = CGMS2DayByDay(data, dt0=dt0, inter_gap=inter_gap, tz=tz) gl_ip_vec = data_ip[0].flatten() # Flatten the interpolated glucose matrix @@ -145,9 +141,7 @@ def roc_single(data: pd.DataFrame, roc_values = roc_single(subject_data, timelag, dt0, inter_gap, tz) # Create time points for ROC values - time_points = pd.date_range( - start=subject_data["time"].min(), periods=len(roc_values), freq=f"{dt0}min" - ) + time_points = pd.date_range(start=subject_data["time"].min(), periods=len(roc_values), freq=f"{dt0}min") # Add ROC values to result for t, r in zip(time_points, roc_values, strict=False): diff --git a/iglu_python/sd_glu.py b/iglu_python/sd_glu.py index 42d4899..0722018 100644 --- a/iglu_python/sd_glu.py +++ b/iglu_python/sd_glu.py @@ -6,7 +6,7 @@ from .utils import check_data_columns -def sd_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataFrame|float: +def sd_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataFrame | float: """ Calculate standard deviation of glucose values. @@ -46,7 +46,7 @@ def sd_glu(data: Union[pd.DataFrame, list, np.ndarray, pd.Series]) -> pd.DataFra """ # Handle Series input if isinstance(data, (list, np.ndarray, pd.Series)): - if isinstance(data, (list,np.ndarray)): + if isinstance(data, (list, np.ndarray)): data = pd.Series(data) return data.std(ddof=1) diff --git a/iglu_python/sd_measures.py b/iglu_python/sd_measures.py index 8d0db02..8eb9042 100644 --- a/iglu_python/sd_measures.py +++ b/iglu_python/sd_measures.py @@ -7,10 +7,9 @@ from .utils import CGMS2DayByDay, check_data_columns -def sd_measures(data: pd.DataFrame|pd.Series, - dt0: Optional[int] = None, - inter_gap: int = 45, - tz: str = "") -> pd.DataFrame|dict[str, float]: +def sd_measures( + data: pd.DataFrame | pd.Series, dt0: Optional[int] = None, inter_gap: int = 45, tz: str = "" +) -> pd.DataFrame | dict[str, float]: """ Calculate SD subtypes for glucose variability analysis @@ -87,22 +86,21 @@ def sd_measures(data: pd.DataFrame|pd.Series, # Convert the dictionary results into a DataFrame with proper columns results = [] - for subject_id in data['id'].unique(): - subject_data = data[data['id'] == subject_id] + for subject_id in data["id"].unique(): + subject_data = data[data["id"] == subject_id] result_dict = sd_measures_single(subject_data, dt0, inter_gap, tz) - result_dict['id'] = subject_id + result_dict["id"] = subject_id results.append(result_dict) # convert result into dataframe with 'id' on the first place out = pd.DataFrame(results) - out = out[['id'] + list(out.columns[:-1])] + out = out[["id"] + list(out.columns[:-1])] return out -def sd_measures_single(data: pd.DataFrame, - dt0: Optional[int] = None, - inter_gap: int = 45, - tz: str = "") -> dict[str, float]: +def sd_measures_single( + data: pd.DataFrame, dt0: Optional[int] = None, inter_gap: int = 45, tz: str = "" +) -> dict[str, float]: gd2d, actual_dates, gd2d_dt0 = CGMS2DayByDay(data, tz=tz, dt0=dt0, inter_gap=inter_gap) return _calculate_sd_subtypes(gd2d, gd2d_dt0) @@ -131,12 +129,12 @@ def _calculate_sd_subtypes(gd2d: np.ndarray, dt0: int) -> Dict[str, Any]: # 1. SDw - vertical within days # Standard deviation within each day, then mean across days daily_sds = _safe_nanstd(gd2d, axis=1, ddof=1) # ddof=1 for sample std - result['SDw'] = _safe_nanmean(daily_sds) + result["SDw"] = _safe_nanmean(daily_sds) # 2. SDhhmm - between time points # Mean at each time point across days, then SD of those means timepoint_means = _safe_nanmean(gd2d, axis=0) - result['SDhhmm'] = _safe_nanstd(timepoint_means, ddof=1) + result["SDhhmm"] = _safe_nanstd(timepoint_means, ddof=1) # 3. SDwsh - within series (1-hour windows) # Rolling standard deviation over 1-hour windows @@ -145,24 +143,24 @@ def _calculate_sd_subtypes(gd2d: np.ndarray, dt0: int) -> Dict[str, Any]: # Calculate rolling standard deviation rolling_sds = _rolling_std(gs, window=win) - result['SDwsh'] = _safe_nanmean(rolling_sds) + result["SDwsh"] = _safe_nanmean(rolling_sds) # 4. SDdm - horizontal sd (between daily means) # Standard deviation of daily mean glucose values daily_means = _safe_nanmean(gd2d, axis=1) - result['SDdm'] = _safe_nanstd(daily_means, ddof=1) + result["SDdm"] = _safe_nanstd(daily_means, ddof=1) # 5. SDb - between days, within timepoints # SD across days for each time point, then mean of those SDs timepoint_sds = _safe_nanstd(gd2d, axis=0, ddof=1) - result['SDb'] = _safe_nanmean(timepoint_sds) + result["SDb"] = _safe_nanmean(timepoint_sds) # 6. SDbdm - between days, within timepoints, corrected for daily means # Subtract daily mean from each value, then calculate SDb on corrected values daily_means_matrix = daily_means[:, np.newaxis] # Convert to column vector corrected_gd2d = gd2d - daily_means_matrix corrected_timepoint_sds = _safe_nanstd(corrected_gd2d, axis=0, ddof=1) - result['SDbdm'] = _safe_nanmean(corrected_timepoint_sds) + result["SDbdm"] = _safe_nanmean(corrected_timepoint_sds) return result @@ -183,7 +181,7 @@ def _rolling_std(data: np.ndarray, window: int) -> np.ndarray: np.ndarray Rolling standard deviations (trimmed to valid windows only) """ - #valid_data = data[~np.isnan(data)] + # valid_data = data[~np.isnan(data)] valid_data = np.concatenate([data, np.full(window, np.nan)]) # add nan tail to match R n = len(valid_data) @@ -193,12 +191,13 @@ def _rolling_std(data: np.ndarray, window: int) -> np.ndarray: rolling_stds = [] for i in range(n - window + 1): - window_data = valid_data[i:i + window] + window_data = valid_data[i : i + window] if len(window_data) == window: # Full window rolling_stds.append(_safe_nanstd(window_data, ddof=1)) return np.array(rolling_stds) if rolling_stds else np.array([np.nan]) + def _safe_nanstd(data: np.ndarray, axis: Optional[int] = None, ddof: int = 1) -> float: """ Safe version of np.nanstd that handles insufficient data gracefully @@ -264,10 +263,9 @@ def _safe_nanmean(data: np.ndarray, axis: Optional[int] = None) -> float: # Alternative vectorized implementation for better performance -def sd_measures_vectorized(data: pd.DataFrame, - dt0: Optional[int] = None, - inter_gap: int = 45, - tz: str = "") -> pd.DataFrame: +def sd_measures_vectorized( + data: pd.DataFrame, dt0: Optional[int] = None, inter_gap: int = 45, tz: str = "" +) -> pd.DataFrame: """ Vectorized version of sd_measures for better performance with large datasets """ @@ -276,8 +274,8 @@ def sd_measures_vectorized(data: pd.DataFrame, results = [] current_dt0 = dt0 - for i, subject_id in enumerate(data['id'].unique()): - subject_data = data[data['id'] == subject_id].copy() + for i, subject_id in enumerate(data["id"].unique()): + subject_data = data[data["id"] == subject_id].copy() gd2d, actual_dates, gd2d_dt0 = CGMS2DayByDay(subject_data, tz=tz, dt0=current_dt0, inter_gap=inter_gap) if i == 0: current_dt0 = gd2d_dt0 @@ -296,12 +294,11 @@ def _calculate_sd_subtypes_vectorized(gd2d: np.ndarray, dt0: int, subject_id: An warnings.simplefilter("ignore", category=RuntimeWarning) return { - 'id': subject_id, - 'SDw': _safe_nanmean(np.nanstd(gd2d, axis=1, ddof=1)), - 'SDhhmm': np.nanstd(_safe_nanmean(gd2d, axis=0), ddof=1), - 'SDwsh': _safe_nanmean(_rolling_std(gd2d.T.flatten(), round(60/dt0))), - 'SDdm': np.nanstd(_safe_nanmean(gd2d, axis=1), ddof=1), - 'SDb': _safe_nanmean(np.nanstd(gd2d, axis=0, ddof=1)), - 'SDbdm': _safe_nanmean(np.nanstd(gd2d - _safe_nanmean(gd2d, axis=1, keepdims=True), - axis=0, ddof=1)) + "id": subject_id, + "SDw": _safe_nanmean(np.nanstd(gd2d, axis=1, ddof=1)), + "SDhhmm": np.nanstd(_safe_nanmean(gd2d, axis=0), ddof=1), + "SDwsh": _safe_nanmean(_rolling_std(gd2d.T.flatten(), round(60 / dt0))), + "SDdm": np.nanstd(_safe_nanmean(gd2d, axis=1), ddof=1), + "SDb": _safe_nanmean(np.nanstd(gd2d, axis=0, ddof=1)), + "SDbdm": _safe_nanmean(np.nanstd(gd2d - _safe_nanmean(gd2d, axis=1, keepdims=True), axis=0, ddof=1)), } diff --git a/iglu_python/sd_roc.py b/iglu_python/sd_roc.py index e60fd4e..a37fd98 100644 --- a/iglu_python/sd_roc.py +++ b/iglu_python/sd_roc.py @@ -13,7 +13,7 @@ def sd_roc( dt0: int = 5, inter_gap: int = 45, tz: str = "", -) -> pd.DataFrame|float: +) -> pd.DataFrame | float: """ Calculate the standard deviation of the rate of change. @@ -96,19 +96,19 @@ def sd_roc( # Validate input data data = check_data_columns(data, tz=tz) - data.set_index('time', drop=True, inplace=True) + data.set_index("time", drop=True, inplace=True) # Calculate ROC values for all subjects - out = data.groupby('id').apply(lambda x: sd_roc_single(x['gl'], timelag, dt0, inter_gap, tz)).reset_index() - out.columns = ['id', 'sd_roc'] + results = [] + for subject_id, group in data.groupby("id"): + sd_roc_value = sd_roc_single(group["gl"], timelag, dt0, inter_gap, tz) + results.append({"id": subject_id, "sd_roc": sd_roc_value}) + + out = pd.DataFrame(results) return out -def sd_roc_single(data: pd.Series, - timelag: int = 15, - dt0: int = 5, - inter_gap: int = 45, - tz: str = "") -> float: +def sd_roc_single(data: pd.Series, timelag: int = 15, dt0: int = 5, inter_gap: int = 45, tz: str = "") -> float: roc_data = roc(data, timelag=timelag, dt0=dt0, inter_gap=inter_gap, tz=tz) - sd_roc = np.nanstd(roc_data.dropna()['roc'], ddof=1) + sd_roc = np.nanstd(roc_data.dropna()["roc"], ddof=1) return sd_roc diff --git a/iglu_python/summary_glu.py b/iglu_python/summary_glu.py index c7951ef..21c07bd 100644 --- a/iglu_python/summary_glu.py +++ b/iglu_python/summary_glu.py @@ -7,7 +7,7 @@ from .utils import check_data_columns -def summary_glu(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.DataFrame|dict[str,float]: +def summary_glu(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.DataFrame | dict[str, float]: """ Calculate summary glucose level @@ -50,7 +50,6 @@ def summary_glu(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.Da # Handle vector input (Series, list, or numpy array) if isinstance(data, (pd.Series, list, np.ndarray)): - # Convert to numpy array for consistent handling if isinstance(data, pd.Series): glucose_values = data.values @@ -79,33 +78,33 @@ def summary_glu(data: Union[pd.DataFrame, pd.Series, list, np.ndarray]) -> pd.Da # Filter out missing glucose values and group by id result_rows = [] - for subject_id in data['id'].unique(): - subject_data = data[data['id'] == subject_id] - glucose_values = subject_data['gl'].dropna().values + for subject_id in data["id"].unique(): + subject_data = data[data["id"] == subject_id] + glucose_values = subject_data["gl"].dropna().values if len(glucose_values) == 0: warnings.warn(f"No valid glucose values found for subject {subject_id}", stacklevel=2) # Still include the subject with NaN values summary_stats = { - 'Min.': np.nan, - '1st Qu.': np.nan, - 'Median': np.nan, - 'Mean': np.nan, - '3rd Qu.': np.nan, - 'Max.': np.nan + "Min.": np.nan, + "1st Qu.": np.nan, + "Median": np.nan, + "Mean": np.nan, + "3rd Qu.": np.nan, + "Max.": np.nan, } else: summary_stats = _calculate_summary_stats(glucose_values) # Add subject id to the summary - summary_stats['id'] = subject_id + summary_stats["id"] = subject_id result_rows.append(summary_stats) # Create result DataFrame with id column first result_df = pd.DataFrame(result_rows) # Reorder columns to match R output (id first, then summary stats) - column_order = ['id', 'Min.', '1st Qu.', 'Median', 'Mean', '3rd Qu.', 'Max.'] + column_order = ["id", "Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max."] return result_df[column_order] @@ -126,10 +125,10 @@ def _calculate_summary_stats(glucose_values: np.ndarray) -> dict: Dictionary with summary statistics matching R's summary() output """ return { - 'Min.': np.min(glucose_values), - '1st Qu.': np.percentile(glucose_values, 25), - 'Median': np.median(glucose_values), - 'Mean': np.mean(glucose_values), - '3rd Qu.': np.percentile(glucose_values, 75), - 'Max.': np.max(glucose_values) + "Min.": np.min(glucose_values), + "1st Qu.": np.percentile(glucose_values, 25), + "Median": np.median(glucose_values), + "Mean": np.mean(glucose_values), + "3rd Qu.": np.percentile(glucose_values, 75), + "Max.": np.max(glucose_values), } diff --git a/iglu_python/utils.py b/iglu_python/utils.py index e487f73..4f30aaf 100644 --- a/iglu_python/utils.py +++ b/iglu_python/utils.py @@ -10,14 +10,17 @@ _IGLU_R_COMPATIBLE = True + def set_iglu_r_compatible(value: bool) -> None: global _IGLU_R_COMPATIBLE _IGLU_R_COMPATIBLE = value + def is_iglu_r_compatible() -> bool: global _IGLU_R_COMPATIBLE return _IGLU_R_COMPATIBLE + def localize_naive_timestamp(timestamp: datetime) -> datetime: """ Localize a naive timestamp to the local timezone. @@ -36,7 +39,8 @@ def set_local_tz(tz: str) -> None: global local_tz local_tz = ZoneInfo(tz) -def get_local_tz() : + +def get_local_tz(): global local_tz return local_tz @@ -120,7 +124,7 @@ def check_data_columns(data: pd.DataFrame, time_check=False, tz="") -> pd.DataFr def CGMS2DayByDay( - data: pd.DataFrame|pd.Series, + data: pd.DataFrame | pd.Series, dt0: Optional[pd.Timestamp] = None, inter_gap: int = 45, tz: str = "", @@ -195,9 +199,7 @@ def CGMS2DayByDay( # Create time grid start_time = data["time"].min().floor("D") end_time = data["time"].max().ceil("D") - time_grid = pd.date_range( - start=start_time, end=end_time, freq=f"{dt0}min" - ) + time_grid = pd.date_range(start=start_time, end=end_time, freq=f"{dt0}min") if is_iglu_r_compatible(): # remove the first time point time_grid = time_grid[1:] @@ -208,9 +210,7 @@ def CGMS2DayByDay( # find gaps in the data (using original data indexes, not time grid) gaps = [] for i in range(len(data) - 1): - if ( - data["time"].iloc[i + 1] - data["time"].iloc[i] - ).total_seconds() > inter_gap * 60: + if (data["time"].iloc[i + 1] - data["time"].iloc[i]).total_seconds() > inter_gap * 60: gaps.append((i, i + 1)) # Interpolate glucose values @@ -227,15 +227,14 @@ def CGMS2DayByDay( gap_start_idx = gap[0] gap_start_time = data["time"].iloc[gap_start_idx] # find the index of the gap start in the time grid - gap_start_idx_in_time_grid = int( - np.floor((gap_start_time - start_time).total_seconds() / (60 * dt0)) - ) + gap_start_idx_in_time_grid = int(np.floor((gap_start_time - start_time).total_seconds() / (60 * dt0))) gap_end_idx = gap[1] gap_end_time = data["time"].iloc[gap_end_idx] # find the index of the gap end in the time grid gap_end_idx_in_time_grid = int( # -1sec to indicate time before measurement - np.floor(((gap_end_time - start_time).total_seconds() -1 ) / (60 * dt0))) + np.floor(((gap_end_time - start_time).total_seconds() - 1) / (60 * dt0)) + ) # put nan in the gap interp_data[gap_start_idx_in_time_grid:gap_end_idx_in_time_grid] = np.nan @@ -260,6 +259,7 @@ def CGMS2DayByDay( return interp_data, actual_dates, dt0 + def gd2d_to_df(gd2d, actual_dates, dt0): """Convert gd2d (CGMS2DayByDay output) to a pandas DataFrame""" df = pd.DataFrame({"time": [], "gl": []}) @@ -271,9 +271,6 @@ def gd2d_to_df(gd2d, actual_dates, dt0): day_time = [pd.Timedelta(i * dt0, unit="m") + actual_dates[day] for i in range(n)] time.extend(day_time) - df = pd.DataFrame({ - "time": pd.Series(time), - "gl": pd.Series(gl, dtype='float64') - }) + df = pd.DataFrame({"time": pd.Series(time), "gl": pd.Series(gl, dtype="float64")}) return df diff --git a/iglu_r_discrepancies.ipynb b/iglu_r_discrepancies.ipynb index 98ee64c..e31841f 100644 --- a/iglu_r_discrepancies.ipynb +++ b/iglu_r_discrepancies.ipynb @@ -49,7 +49,7 @@ "iglu_version = str(ro.r('packageVersion(\"iglu\")'))\n", "print(f\"iglu version: {iglu_version}\")\n", "print(f\"iglu_py version: {version('iglu-py')}\")\n", - "print(f\"rpy2 version: {version('rpy2')}\")\n" + "print(f\"rpy2 version: {version('rpy2')}\")" ] }, { @@ -67,18 +67,14 @@ "source": [ "@bridge.df_conversion\n", "def my_CGMS2DayByDay(data: pd.DataFrame, **kwargs):\n", - "\n", " r_named_list = bridge.iglu_r.CGMS2DayByDay(data, **kwargs)\n", "\n", - " result = {\n", - " name: ro.conversion.rpy2py(r_named_list[i])\n", - " for i, name in enumerate(r_named_list.names())\n", - " }\n", + " result = {name: ro.conversion.rpy2py(r_named_list[i]) for i, name in enumerate(r_named_list.names())}\n", "\n", - " result['actual_dates'] = [pd.to_datetime(d, unit='D', origin='1970-01-01') for d in result['actual_dates']]\n", - " result['dt0'] = result['dt0'][0]\n", + " result[\"actual_dates\"] = [pd.to_datetime(d, unit=\"D\", origin=\"1970-01-01\") for d in result[\"actual_dates\"]]\n", + " result[\"dt0\"] = result[\"dt0\"][0]\n", "\n", - " return result\n" + " return result" ] }, { @@ -168,16 +164,20 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "display(data)" ] }, @@ -209,17 +209,18 @@ "source": [ "r_result = my_CGMS2DayByDay(data)\n", "\n", - "gd2d = r_result['gd2d']\n", - "actual_dates = r_result['actual_dates']\n", - "dt0 = r_result['dt0']\n", - "\n", - "print(f\"gd2d.shape={gd2d.shape} \\t/ expected (1,288)\") # expected (1,288)\n", - "print(f\"actual_dates={actual_dates} \\t/ expected [Timestamp('2020-01-01 00:00:00')]\") # expected [datetime.date(2020, 1, 1)]\n", - "print(f\"dt0={dt0}\") # expected 5\n", - "print(f\"gd2d[:,0:5]=\\n{gd2d[:,0:5]} \\t/ expected [[150. 155. 160. 165. nan]]\") # expected [[150. 155. 160. 165. nan]]\n", + "gd2d = r_result[\"gd2d\"]\n", + "actual_dates = r_result[\"actual_dates\"]\n", + "dt0 = r_result[\"dt0\"]\n", "\n", - "\n", - "\n" + "print(f\"gd2d.shape={gd2d.shape} \\t/ expected (1,288)\") # expected (1,288)\n", + "print(\n", + " f\"actual_dates={actual_dates} \\t/ expected [Timestamp('2020-01-01 00:00:00')]\"\n", + ") # expected [datetime.date(2020, 1, 1)]\n", + "print(f\"dt0={dt0}\") # expected 5\n", + "print(\n", + " f\"gd2d[:,0:5]=\\n{gd2d[:, 0:5]} \\t/ expected [[150. 155. 160. 165. nan]]\"\n", + ") # expected [[150. 155. 160. 165. nan]]" ] }, { @@ -294,17 +295,13 @@ "source": [ "hours = 1\n", "dt0 = 5\n", - "samples = int(hours*60/dt0)\n", - "times = pd.date_range('2020-01-01', periods=samples, freq=f\"{dt0}min\")\n", - "glucose_values = [80,120]* int(samples/2)\n", + "samples = int(hours * 60 / dt0)\n", + "times = pd.date_range(\"2020-01-01\", periods=samples, freq=f\"{dt0}min\")\n", + "glucose_values = [80, 120] * int(samples / 2)\n", "\n", - "syntheticdata = pd.DataFrame({\n", - " 'id': ['subject1'] * samples,\n", - " 'time': times,\n", - " 'gl': glucose_values\n", - "})\n", + "syntheticdata = pd.DataFrame({\"id\": [\"subject1\"] * samples, \"time\": times, \"gl\": glucose_values})\n", "\n", - "synthetic_iglu_auc_results = iglu_py.auc(syntheticdata)\n", + "synthetic_iglu_auc_results = iglu_py.auc(syntheticdata)\n", "synthetic_iglu_auc_results" ] }, @@ -334,17 +331,17 @@ } ], "source": [ - "r_result = my_CGMS2DayByDay(data,tz=\"UTC\")\n", + "r_result = my_CGMS2DayByDay(data, tz=\"UTC\")\n", "\n", - "gd2d = r_result['gd2d']\n", - "actual_dates = r_result['actual_dates']\n", - "dt0 = r_result['dt0']\n", + "gd2d = r_result[\"gd2d\"]\n", + "actual_dates = r_result[\"actual_dates\"]\n", + "dt0 = r_result[\"dt0\"]\n", "\n", - "print(gd2d.shape) # expected (1,288)\n", - "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", - "print(dt0) # expected 5\n", + "print(gd2d.shape) # expected (1,288)\n", + "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", + "print(dt0) # expected 5\n", "\n", - "print(gd2d[:,0:5]) # expected [[150. 155. 160. 165. nan]]" + "print(gd2d[:, 0:5]) # expected [[150. 155. 160. 165. nan]]" ] }, { @@ -435,16 +432,20 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 10:00:00', # 0 min\n", - " '2020-01-01 10:05:00', # 5 min\n", - " '2020-01-01 10:10:00', # 10 min\n", - " '2020-01-01 10:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 10:00:00\", # 0 min\n", + " \"2020-01-01 10:05:00\", # 5 min\n", + " \"2020-01-01 10:10:00\", # 10 min\n", + " \"2020-01-01 10:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "display(data)" ] }, @@ -471,18 +472,18 @@ "source": [ "r_result = my_CGMS2DayByDay(data)\n", "\n", - "gd2d = r_result['gd2d']\n", - "actual_dates = r_result['actual_dates']\n", - "dt0 = r_result['dt0']\n", + "gd2d = r_result[\"gd2d\"]\n", + "actual_dates = r_result[\"actual_dates\"]\n", + "dt0 = r_result[\"dt0\"]\n", "\n", - "print(gd2d.shape) # expected (1,288)\n", - "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", - "print(dt0) # expected 5\n", + "print(gd2d.shape) # expected (1,288)\n", + "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", + "print(dt0) # expected 5\n", "\n", - "indx_10am = int((60/dt0) * 10)\n", + "indx_10am = int((60 / dt0) * 10)\n", "print(indx_10am)\n", - "print(gd2d[:,indx_10am:indx_10am+6]) # expected [[ 150. 155. 160. 165. nan nan]\n", - "print(gd2d[:,indx_10am-1:indx_10am+5]) # but we'll get expected on one position left\n" + "print(gd2d[:, indx_10am : indx_10am + 6]) # expected [[ 150. 155. 160. 165. nan nan]\n", + "print(gd2d[:, indx_10am - 1 : indx_10am + 5]) # but we'll get expected on one position left" ] }, { @@ -602,20 +603,24 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1']*8,\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " '2020-01-02 00:00:00', # 0 min\n", - " '2020-01-02 00:05:00', # 5 min\n", - " '2020-01-02 00:10:00', # 10 min\n", - " '2020-01-02 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]*2\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\"] * 8,\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " \"2020-01-02 00:00:00\", # 0 min\n", + " \"2020-01-02 00:05:00\", # 5 min\n", + " \"2020-01-02 00:10:00\", # 10 min\n", + " \"2020-01-02 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165] * 2,\n", + " }\n", + ")\n", "display(data)" ] }, @@ -641,18 +646,18 @@ } ], "source": [ - "r_result = my_CGMS2DayByDay(data,tz=\"UTC\")\n", + "r_result = my_CGMS2DayByDay(data, tz=\"UTC\")\n", "\n", - "gd2d = r_result['gd2d']\n", - "actual_dates = r_result['actual_dates']\n", - "dt0 = r_result['dt0']\n", + "gd2d = r_result[\"gd2d\"]\n", + "actual_dates = r_result[\"actual_dates\"]\n", + "dt0 = r_result[\"dt0\"]\n", "\n", - "print(gd2d.shape) # expected (1,288)\n", - "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", - "print(dt0) # expected 5\n", + "print(gd2d.shape) # expected (1,288)\n", + "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", + "print(dt0) # expected 5\n", "\n", - "print(gd2d[:,0:5]) # expected [[150. 155. 160. 165. nan]]\n", - "print(gd2d[:,283:])" + "print(gd2d[:, 0:5]) # expected [[150. 155. 160. 165. nan]]\n", + "print(gd2d[:, 283:])" ] }, { @@ -771,20 +776,24 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1']*8,\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 23:40:00', # 0 min\n", - " '2020-01-01 23:45:00', # 5 min\n", - " '2020-01-01 23:50:00', # 10 min\n", - " '2020-01-01 23:55:00', # 15 min\n", - " '2020-01-02 00:00:00', # 0 min\n", - " '2020-01-02 00:05:00', # 5 min\n", - " '2020-01-02 00:10:00', # 10 min\n", - " '2020-01-02 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165, 170, 175, 180, 185]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\"] * 8,\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 23:40:00\", # 0 min\n", + " \"2020-01-01 23:45:00\", # 5 min\n", + " \"2020-01-01 23:50:00\", # 10 min\n", + " \"2020-01-01 23:55:00\", # 15 min\n", + " \"2020-01-02 00:00:00\", # 0 min\n", + " \"2020-01-02 00:05:00\", # 5 min\n", + " \"2020-01-02 00:10:00\", # 10 min\n", + " \"2020-01-02 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165, 170, 175, 180, 185],\n", + " }\n", + ")\n", "display(data)" ] }, @@ -808,18 +817,18 @@ } ], "source": [ - "r_result = my_CGMS2DayByDay(data,tz=\"UTC\")\n", + "r_result = my_CGMS2DayByDay(data, tz=\"UTC\")\n", "\n", - "gd2d = r_result['gd2d']\n", - "actual_dates = r_result['actual_dates']\n", - "dt0 = r_result['dt0']\n", + "gd2d = r_result[\"gd2d\"]\n", + "actual_dates = r_result[\"actual_dates\"]\n", + "dt0 = r_result[\"dt0\"]\n", "\n", - "print(gd2d.shape) # expected (1,288)\n", - "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", - "print(dt0) # expected 5\n", + "print(gd2d.shape) # expected (1,288)\n", + "print(actual_dates) # expected [datetime.date(2020, 1, 1)]\n", + "print(dt0) # expected 5\n", "\n", - "print(gd2d[:,280:])\n", - "print(gd2d[:,:8]) # expected [[150. 155. 160. 165. nan]]" + "print(gd2d[:, 280:])\n", + "print(gd2d[:, :8]) # expected [[150. 155. 160. 165. nan]]" ] }, { @@ -844,8 +853,7 @@ "source": [ "@bridge.df_conversion\n", "def my_check_data_columns(data: pd.DataFrame, **kwargs):\n", - "\n", - " return bridge.iglu_r.check_data_columns(data, **kwargs)\n" + " return bridge.iglu_r.check_data_columns(data, **kwargs)" ] }, { @@ -987,16 +995,20 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "\n", "display(data)\n", "\n", @@ -1151,20 +1163,24 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "\n", "display(data)\n", "\n", - "r_result = my_check_data_columns(data,tz=\"UTC\")\n", + "r_result = my_check_data_columns(data, tz=\"UTC\")\n", "\n", "display(r_result)" ] @@ -1317,16 +1333,20 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " ]),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " ]\n", + " ),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "\n", "display(data)\n", "\n", @@ -1483,20 +1503,24 @@ } ], "source": [ - "data = pd.DataFrame({\n", - " 'id': ['subject1', 'subject1', 'subject1', 'subject1'],\n", - " 'time': pd.to_datetime([\n", - " '2020-01-01 00:00:00', # 0 min\n", - " '2020-01-01 00:05:00', # 5 min\n", - " '2020-01-01 00:10:00', # 10 min\n", - " '2020-01-01 00:15:00', # 15 min\n", - " ]).tz_localize('UTC'),\n", - " 'gl': [150, 155, 160, 165]\n", - "})\n", + "data = pd.DataFrame(\n", + " {\n", + " \"id\": [\"subject1\", \"subject1\", \"subject1\", \"subject1\"],\n", + " \"time\": pd.to_datetime(\n", + " [\n", + " \"2020-01-01 00:00:00\", # 0 min\n", + " \"2020-01-01 00:05:00\", # 5 min\n", + " \"2020-01-01 00:10:00\", # 10 min\n", + " \"2020-01-01 00:15:00\", # 15 min\n", + " ]\n", + " ).tz_localize(\"UTC\"),\n", + " \"gl\": [150, 155, 160, 165],\n", + " }\n", + ")\n", "\n", "display(data)\n", "\n", - "r_result = my_check_data_columns(data,time_check=True,tz=\"Asia/Jerusalem\")\n", + "r_result = my_check_data_columns(data, time_check=True, tz=\"Asia/Jerusalem\")\n", "\n", "display(r_result)" ] diff --git a/pyproject.toml b/pyproject.toml index 56d6e79..a3d1809 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,6 +91,20 @@ disallow_incomplete_defs = false [tool.ruff] line-length = 120 target-version = "py311" +exclude = [ + ".git/", + ".venv/", + "venv/", + "__pycache__/", + "*.egg-info/", + "build/", + "dist/", + ".pytest_cache/", + ".mypy_cache/", + ".ruff_cache/", + "tests/", + "notebooks/" +] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings From 8f92c4488ad72025df4e05bc6633dff787f115cd Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 14:24:23 +0300 Subject: [PATCH 7/8] formatting with ruff --- iglu_python/sd_roc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iglu_python/sd_roc.py b/iglu_python/sd_roc.py index a37fd98..2e71f55 100644 --- a/iglu_python/sd_roc.py +++ b/iglu_python/sd_roc.py @@ -103,7 +103,7 @@ def sd_roc( for subject_id, group in data.groupby("id"): sd_roc_value = sd_roc_single(group["gl"], timelag, dt0, inter_gap, tz) results.append({"id": subject_id, "sd_roc": sd_roc_value}) - + out = pd.DataFrame(results) return out From 09846c7a91a95af704d0e441c552421bccb0b235 Mon Sep 17 00:00:00 2001 From: Stas Khirman Date: Wed, 25 Jun 2025 14:29:35 +0300 Subject: [PATCH 8/8] fix ruff runtime warnings --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a3d1809..aa7a4f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,7 +105,7 @@ exclude = [ "tests/", "notebooks/" ] -select = [ +lint.select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes @@ -113,10 +113,10 @@ select = [ "C", # flake8-comprehensions "B", # flake8-bugbear ] -ignore = [] +lint.ignore = [] -[tool.ruff.isort] +[tool.lint.isort] known-first-party = ["iglu_python"] -[tool.ruff.per-file-ignores] +[tool.lint.per-file-ignores] "tests/*" = ["E501"] # Allow long lines in tests