1-
21import numpy as np
32import pandas as pd
43
@@ -60,7 +59,7 @@ def auc(data: pd.DataFrame, tz: str = "") -> pd.DataFrame:
6059 if not isinstance (data .index , pd .DatetimeIndex ):
6160 raise ValueError ("Series must have a DatetimeIndex" )
6261
63- auc = auc_single (data ,tz = tz )
62+ auc = auc_single (data , tz = tz )
6463 return auc
6564
6665 # Check data format and convert time to datetime
@@ -70,46 +69,41 @@ def auc(data: pd.DataFrame, tz: str = "") -> pd.DataFrame:
7069 result = []
7170 for subject in data ["id" ].unique ():
7271 subject_data = data [data ["id" ] == subject ]
73- hourly_auc = auc_single (subject_data ,tz = tz )
72+ hourly_auc = auc_single (subject_data , tz = tz )
7473 result .append ({"id" : subject , "hourly_auc" : hourly_auc })
7574
7675 # Convert to DataFrame
7776 return pd .DataFrame (result )
7877
79- def auc_single (subject_data : pd .DataFrame | pd .Series ,tz :str = "" ) -> float :
78+
79+ def auc_single (subject_data : pd .DataFrame | pd .Series , tz : str = "" ) -> float :
8080 """Calculate AUC for a single subject"""
8181 # Get interpolated data using CGMS2DayByDay
8282 gd2d , actual_dates , dt0 = CGMS2DayByDay (subject_data , tz = tz )
8383
8484 # Convert gd2d to DataFrame
8585 input_data = gd2d_to_df (gd2d , actual_dates , dt0 )
8686 if is_iglu_r_compatible ():
87- input_data [' day' ] = input_data [' time' ].dt .floor ('d' )
88- input_data [' gl_next' ] = input_data ['gl' ].shift (- 1 )
87+ input_data [" day" ] = input_data [" time" ].dt .floor ("d" )
88+ input_data [" gl_next" ] = input_data ["gl" ].shift (- 1 )
8989 each_day_area = input_data .groupby ("day" ).apply (
90- lambda x : np .nansum (
91- (dt0 / 60 )* (x ["gl" ].values + x ["gl_next" ].values ) / 2
92- ),
93- include_groups = False
90+ lambda x : np .nansum ((dt0 / 60 ) * (x ["gl" ].values + x ["gl_next" ].values ) / 2 ), include_groups = False
9491 )
9592 # calculate number of not nan trapezoids in total (number of not nan gl and gl_next)
9693 n_trapezoids = (~ np .isnan (input_data ["gl" ]) & ~ np .isnan (input_data ["gl_next" ])).sum ()
97- hours = dt0 / 60 * n_trapezoids
94+ hours = dt0 / 60 * n_trapezoids
9895 daily_area = each_day_area .sum ()
99- hourly_avg = daily_area / hours
96+ hourly_avg = daily_area / hours
10097 return hourly_avg
10198 else :
10299 # Add hour column by rounding time to nearest hour
103- input_data [' hour' ] = input_data [' time' ].dt .floor ('h' )
100+ input_data [" hour" ] = input_data [" time" ].dt .floor ("h" )
104101
105- input_data [' gl_next' ] = input_data ['gl' ].shift (- 1 )
102+ input_data [" gl_next" ] = input_data ["gl" ].shift (- 1 )
106103
107104 # Calculate AUC for each hour using trapezoidal rule (mg*min/dL)
108105 hourly_auc = input_data .groupby ("hour" ).apply (
109- lambda x : np .nansum (
110- (dt0 / 60 )* (x ["gl" ].values + x ["gl_next" ].values ) / 2
111- ),
112- include_groups = False
106+ lambda x : np .nansum ((dt0 / 60 ) * (x ["gl" ].values + x ["gl_next" ].values ) / 2 ), include_groups = False
113107 )
114108 # 0 mean no data in this hour, replace with nan
115109 hourly_auc = hourly_auc .replace (0 , np .nan )
0 commit comments