Files
bio-performx/app/services/__pycache__/context_generator.cpython-312.pyc
T

213 lines
30 KiB
Plaintext
Raw Normal View History

Ë
i¢~ãóDdZddlmZddlmZmZmZddlZGdd«Zy)
Context Generator Service
This service processes all data files and generates context dictionaries for each page
of the medical report. It performs analysis on Pnoe, Spirometry, and SECA data.
é)Údatetime)ÚDictÚOptionalÚTupleNc óPeZdZdZdZ ddededeefdZdZd ed
e fd Z
dd ee d
e fd
Z dd ee d
e fdZ d
e
ee ee ffdZdee dee dej d
e fdZde d
e fdZde d
e fdZd
e fdZd
e fdZd
e fdZ dd ede eefd ee d
e ee ffdZy)ÚContextGeneratorz&Generate context data for report pagescó<d|_d|_d|_i|_y©N)Úpnoe_dfÚ
spirometry_dfÚseca_dfÚ patient_info)Úselfs úW/home/oluwasanmi/Documents/Work/MKD/report_generation/app/services/context_generator.pyÚ__init__zContextGenerator.__init__s ؈Œ ØÔ؈Œ ؈ÕóNÚ pnoe_pathÚspirometry_pathÚ seca_pathcóØtj|d¬«|_tj|«|_|rtj|«|_nd|_|j
«y)zLoad all required datasetsú;)Ú delimiterN)ÚpdÚread_csvr r Ú
read_excelr
Ú_preprocess_pnoe_data)rrrrs rÚ load_datazContextGenerator.load_datasMô—{{ 9¸ÔŒ ÜŸ[™[¨ÓÔÙ ÜŸ=™=¨Ó3ˆDˆDŒLØ ×$rcóú|jjD]2} tj|j|«|j|<Œ4|jd|jdz |jd<|jd|jdz |jd<|jd|jdzdz |jd <|jd|jd
zdz |jd <d }gd
¢}|D]Y}||jjvsŒ|j|j
|d¬«j«|j|d<Œ[y#tt
f$rYŒbwxYw)z&Apply preprocessing steps to Pnoe dataú VO2(ml/min)úHR(bpm)ú VO2 PulseúBF(bpm)ú
VO2 Breathú EE(kcal/min)zCARBS(%)édÚCHOúFAT(%)ÚFATé
)
rz VCO2(ml/min)r zVT(l)r"z VE(l/min)r!r#r&r(é©ÚwindowÚ min_periodsÚ _smoothedN)r ÚcolumnsrÚ
to_numericÚ
ValueErrorÚ TypeErrorÚrollingÚmean)rÚcolÚ window_sizeÚcolumns_to_smooths rrz&ContextGenerator._preprocess_pnoe_data&syð—<<× ˆ
Ü$&§M¡M°$·,±,¸sÑ2CÓ$D ˜SÒ ð
L‰L˜Ñ '¨$¯,©,°yÑ*AÑ 

L‰L˜Ñ '¨$¯,©,°yÑ*AÑ 

L‰L˜Ñ (¨4¯<©<¸
Ñ+CÑ CÀcÑ 
ð
L‰L˜Ñ (¨4¯<©<¸Ñ+AÑ AÀCÑ 
ðˆ ò 
Ðð ˆCØd—l‘l×—L‘L Ñ-°[ÈaÐ  ˜u IÐ øô=¤ Ð
Úð
ús/E'Å'E:Å9E:Ú patient_nameÚreturnc
ó |jI|j|jdjj|dd¬«}|jsù|jd}t |j
dd««}t |j
dd««}|j
dd«d |j
dd«|j
dd«|j
dd«t|j
d
d««|j
d d«||j
d d«j«|||zd
z dz|d|d
z z
zdzdœ
|_ |jSd|jvr_d|jvrQ|jd}|jd}||zd
z dz|jd<|d|d
z z
zdz|jd<|jS)zJExtract patient information from SECA dataset or use provided patient_infoÚLastNameF)ÚcaseÚnarÚWeightÚ Adult_FMPÚ FirstNameÚú ÚAgeÚHeightÚGenderr%g3܀ϣ@r*)
ÚnameÚ
first_nameÚ last_nameÚageÚheightÚweightÚgenderÚfat_percentageÚ fat_mass_lbsÚ
lean_mass_lbsrKrMrNrO)
r
ÚstrÚcontainsÚemptyÚilocÚfloatÚgetÚintÚlowerr)rr8Ú patient_dataÚrowÚ weight_kgÚfat_pcts rÚextract_patient_infoz%ContextGenerator.extract_patient_infoPà <‰<Ñ Ÿ<™<Ø ˜(×  u°ðñˆLð
 ×"×Ñ*Ü! #§'¡'¨(°AÓ"6Ó7 Ü §¡¨ °QÓ 7Ó8ð #Ÿw™w {°BÓ8¸¸#¿'¹'À*ÈbÓ:QÐ9RÐSØ"%§'¡'¨+°rÓ":Ø!$§¡¨°RÓ!8ܘsŸw™w u¨aÓ1Ø!$§¡¨°2Ó!6Ð 7Ø!Ÿg™g Ó3×;Ø&-Ø$-°Ñ$7¸#Ñ$=ÀÑ$GØ%.°!°gÀ±mÑ2CÑ%DÀwÑ%Nñ %Ô!ð(× Ñ Ð ð˜×
*Ð/?À4×CTÑCTÑ/TØ×)¨(Ñ3ˆ×'Ð(8Ñ9ˆGØ09¸GÑ0CÀcÑ0IÈGÑ0SˆD× Ñ ˜nÑ ˜Q ¨3¡Ñ/°'Ñ
× Ñ ˜oÑ × Ñ Ð rÚmetric_overridescóv|i}i}dD]}|j«jdd«jdd«}|d|vrt||d«||d<n†|jj|jdj
j
«|k(}|js9|djd }tj|«r t|«||d<|d
|vrt||d
«||d
<ο|jj|jdj
j
«|k(}|jrŒG|d jd }tj|«sŒp t|«||d
<Œ„|S#ttf$rYŒ¿wxYw#ttf$rYŒ®wxYw) z$Calculate spirometry-related metrics)ÚFVCÚFEV1z FEV1/FVC%ú_pctÚ_bestÚ
ParametersÚBestrÚ_predz%Pred.)
rWÚreplacerTr ÚlocrPÚstriprRÚvaluesrÚnotnar1r2)rr]ÚmetricsÚparamÚ param_keyrYÚvalues rÚcalculate_spirometry_metricsz-ContextGenerator.calculate_spirometry_metricssð Ð  àˆØ! !ˆEØŸ
×-¨c°3ÓÀVÓLˆ˜"Ð&6Ñ6Ü/4Ø {°%Ð%8Ñ0˜9˜+ ×(××& 4×8×@ÀEÑð—y’yØ ™K×.¨qÑ1—xx ð!Ü;@À»<˜G y Ð$7ј"Ð&6Ñ6Ü/4Ø {°%Ð%8Ñ0˜9˜+ ×(××& 4×8×@ÀEÑð—y”yØ ™M×Ñ3—x‘x ð!Ü;@À»<˜G y Ð$7Ó8ð?! !ðDˆøô%!+¬IÐ ð!ûô !+¬IÐ ð!ús$ÃFÅ:F%ÆF"Æ!F"Æ%F8Æ7F8cóxiŠi}dvrtd«|d<n |jdj«|d<dvrtd«|d<n|d|jdz |d<dvrftd«|d<dvrtd«|d<n…|jdj «}|jj
|}|d|d<nF|jdj «}|jj
|}|d|d<|d|d<d ‰vrftd «|d <d
vrtd
«|d
<n…|jd j «}|jj
|}|d|d
<nF|jd j «}|jj
|}|d |d <|d|d
<d vr ‰d |d <n|j
«\}}||d <d
vr ‰d
|d
<n|j
«\}} | |d
<tˆfdtdd«D««r&tdd«D]}
d|
d} | vsŒ| || <Œ|S|jd j «}|jj
|}|j|d |d
|«} |j| «|S)z"Calculate all Pnoe-derived metricsÚvo2_maxzVO2(ml/min)_smoothedÚvo2_max_per_kgrKÚpeak_vtÚ
peak_vt_hrzVT(l)_smoothedúHR(bpm)_smoothedÚ
fat_max_valueÚ
fat_max_hrÚ FAT_smoothedÚvt1Úvt2c3ó.K|] }d|dvŒy­w)ÚzoneÚ_bpmN©)Ú.0Úir]s €rú <genexpr>z:ContextGenerator.calculate_pnoe_metrics.<locals>.<genexpr>Þsøèø€ÒG°aaˆ~Ð!1ÔGùsƒr*érr€) rTr ÚmaxrÚidxmaxrjÚ_detect_thresholdsÚanyÚrangeÚ_calculate_hr_zonesÚupdate)
rr]rnÚ peak_vt_idxÚ peak_vt_rowÚ fat_max_idxÚ fat_max_rowr|rbr}Úzone_keyÚzoness
` rÚcalculate_pnoe_metricsz'ContextGenerator.calculate_pnoe_metricsŸs8ø€à Ð  àˆð Ð (Ü!&Ð'7¸ Ñ'BÓ!CˆG à!%§¡Ð.DÑ!E×!IÑ!IÓ!KˆG à Ð /Ü(-Ð.>Ð?OÑ.PÓ(Qˆ %à(/° Ñ(:¸T×=NÑ=NÈxÑ=XÑ(Xˆ  Ð (Ü!&Ð'7¸ Ñ'BÓ!CˆG àÐ/Ü(-Ð.>¸|Ñ.LÓ(M˜ Ò"Ÿl™lÐ+;Ñ<×E Ø"Ÿl™l×.¨{Ñ; Ø(3Ð4FÑ(G˜ ÒŸ,™,Ð'7Ñ8×AˆŸ,™,×*¨;Ñ7ˆKØ!,Ð-=Ñ!>ˆG Ø$/Ð0BÑ$CˆG  Ð .Ü',Ð-=¸oÑ-NÓ'OˆG Ð/Ü(-Ð.>¸|Ñ.LÓ(M˜ Ò"Ÿl™l¨>Ñ:×C Ø"Ÿl™l×.¨{Ñ; Ø(3Ð4FÑ(G˜ ÒŸ,™, ~Ñ?ˆKØŸ,™,×*¨;Ñ7ˆKØ'2°>Ñ'BˆG $Ø$/Ð0BÑ$CˆG  Ð -¨eÑ4ˆGEŠNà×.‰FˆCØ ˆGE‰Nà Ð -¨eÑ4ˆGEŠNà×.‰FˆAˆsØ ˆGE‰Nô ÓG¼5ÀÀA»;Ô ˜1˜a“[ò
CØ! !  D˜>ØÐ/Ø(8¸Ñ(BG˜
CðˆðŸ,™, ~Ñ?ˆKØŸ,™,×*¨;Ñ7ˆKØ×˜ ¨¡° óˆEð
N‰N˜ ˆrcóØ|jd|jdkD}||j}d}t|«dkDr-|d}|jj|}|d|d|ddœ}|jd j «}|j «}|j «}d} t
j|«r(|jj|}
|
d|
d|
ddœ} || fS)
zDetect VT1 and VT2 thresholdsÚ CHO_smoothedr{NrrxÚSpeedúT(sec))Ú HeartRaterÚTimezVE(l/min)_smoothed)r ÚindexÚlenrjÚdiffr‡rrm) rÚ conditionÚcrossover_indicesr|Úvt1_idxÚvt1_rowÚve_slopeÚsecond_derivativeÚvt2_idxr}Úvt2_rows rrˆz#ContextGenerator._detect_thresholdsísà—LL Ñ0°4·<±<ÀÑ3OÑOˆ Ø% àˆÜ Ð Ó ! AÒ Ñ*ˆ—ll×& /ˆ$Ð%7Ñ  Ñ Ñˆ —<<Ð 4Ñ5×<ˆØ$ŸM™M›OÐØàˆÜ
8‰8 Ø—ll×& /ˆ$Ð%7Ñ  Ñ ÑˆCð Cˆxˆrr|r}rcóÎi}|r®|r¬|ddz
}|d}|d}|ddz
}|ddz} t|«dt|«d|d<t|«dt|d«d|d<t|«dt|«d|d <t|«dt| «d|d
<t| «d |d <|Sd
|jdz
}
t|
dz«dt|
dz«d|d<t|
dz«dt|
dz«d|d<t|
dz«dt|
dz«d|d <t|
dz«dt|
dz«d|d
<t|
dz«d |d <|S)z.Calculate heart rate zones based on thresholdsrxér˜r)úbpmÚ zone1_bpmÚ zone2_bpmÚ zone3_bpmÚ zone4_bpmz+bpmÚ zone5_bpméÜrIgš™™™™™á?gÍÌÌÌÌÌä?gè?g333333ë?gffffffî?)rVr) rr|r}rrÚ zone_1_startÚ zone_2_startÚ zone_3_startÚ zone_4_startÚ zone_5_startÚmax_hrs rrz$ContextGenerator._calculate_hr_zones ðˆÙ &Ð'9Ñ:¸?ˆ&Ð'9Ñ:ˆ˜+ˆ˜{Ñ+¨bÑ0ˆLؘ+¨bÑ0ˆLä$'¨ Ó$5Ð#6°a¼¸LÓ8IÐ7JÈ#Ð!NˆE Ü$'¨ Ó$5Ð#6°a¼¸ Ñ<LÓ8MÐ7NÈcÐ!RˆE Ü$'¨ Ó$5Ð#6°a¼¸LÓ8IÐ7JÈ#Ð!NˆE Ü$'¨ Ó$5Ð#6°a¼¸LÓ8IÐ7JÈ#Ð!NˆE Ü$'¨ Ó$5Ð#6°dÐ!;ˆE ðˆ ð
˜4×,¨UÑ3ˆFÜ$'¨°©
Ó$6Ð#7°q¼¸VÀd¹]Ó9KÐ8LÈCÐ!PˆE Ü$'¨°©
Ó$6Ð#7°q¼¸VÀd¹]Ó9KÐ8LÈCÐ!PˆE Ü$'¨°©
Ó$6Ð#7°q¼¸VÀd¹]Ó9KÐ8LÈCÐ!PˆE Ü$'¨°©
Ó$6Ð#7°q¼¸VÀd¹]Ó9KÐ8LÈCÐ!PˆE Ü$'¨°©
Ó$6Ð#7°tÐ!<ˆE ؈ rÚ pnoe_metricscóx|jdj«}tdt|j«dz«}|j |d¬«j «}|dk}||j }d}d}t|«dkDr7|d} |jj| }
t|
d«}|jd«rú|røtdd «D cgc]} |jd
| d d «Œ} } t| d«D\} }
|
sŒ |
jd
d «j«}d|vrc|jd«}t|«dk(sŒM t|d«t|djdd ««}}||cxkr|kr
nnd| }n0Œd|vsŒ• t|jdd ««}||k\rd| }nŒ¾|jdj«}|j |d¬«j «}|dk}||j }d}d}t|«dkDr7|d} |jj| }
t|
d«}|jd«rú|røtdd «D cgc]} |jd
| d d «Œ} } t| d«D\} }
|
sŒ |
jd
d «j«}d|vrc|jd«}t|«dk(sŒM t|d«t|djdd ««}}||cxkr|kr
nnd| }n0Œd|vsŒ• t|jdd ««}||k\rd| }nŒ¾|xsd|xsd|xsd|xsddœScc} w#t$rYŒƒwxYw#t$rYŒ“wxYwcc} w#t$rYŒ wxYw#t$rYŒwxYw)z.Calculate VO2 Pulse and VO2 Breath drop pointszVO2 Pulse_smoothedr*ér+rNrxr…rr€rAéú+zZone zVO2 Breath_smoothedé´zZone 4é­zZone 3)Úvo2_pulse_drop_bpmÚvo2_pulse_drop_zoneÚvo2_breath_drop_bpmÚvo2_breath_drop_zone)r r†rr3r4rjrVrUÚ enumeraterirkÚsplitr1)rÚvo2_pulse_sloper,Úvo2_pulse_slope_smoothedÚ
mask_pulseÚdrop_indices_pulser¼Údrop_idxÚdrop_rowrƒrÚzone_strÚ
zone_cleanÚpartsÚstartÚendÚvo2_breath_slopeÚvo2_breath_slope_smoothedÚ mask_breathÚdrop_indices_breathr¾r¿s rÚ_calculate_vo2_drop_pointsz+ContextGenerator._calculate_vo2_drop_points%sFðŸ,™,Ð';Ñ<×CˆÜ˜DŸL™LÓ)¨QÑ/ˆØ#2×#:Ñ#:Ø $;ó$
ç
‰$
Ñ2ˆ
Ø
ÑàØÜ Ð "  )¨!Ñ,ˆ—||×Ñ1ˆHÜ!$ XÐ.@Ñ%AÓ!BÐ à×Ñ  Ô,Ñ1CÜGLÈQÐPQÃ{ÖSÀ!˜×)¨D°°°4¨.¸SÐSÜ#,¨U°AÓ#6ò%KAØ%-×%5Ñ%5°e¸RÓ%@×%FÑ%FÓ%H˜
Ø ,Ø$.×$4Ñ$4°SÓ$9˜" 5z¨Qð !)ä(+¨E°!©H«
Ü(+¨E°!©H×,<Ñ,<¸SÀ"Ó,EÓ(Fð,/ (-Ð0BÔ'IÀcÕ'IØ@EÀaÀS¸kÐ(;Ù(-øð! %Ü(+¨J×,>Ñ,>¸sÀBÓ,GÓ(H Ø#5¸Ò#>Ø<AÀ!À¸+Ð$7Ù$)ð$?ð)%ð6 Ÿ<™<Ð(=Ñ>ר$4×$<Ñ$<Ø %=ó%
ç
‰$
0°1Ñ4ˆ Ø)¨+Ñ6×àØÜ Ð #  *¨1Ñ-ˆ—||×Ñ1ˆHÜ"% hÐ/AÑ&BÓ"CÐ à×Ñ  Ô,Ñ1DÜGLÈQÐPQÃ{ÖSÀ!˜×)¨D°°°4¨.¸SÐSÜ#,¨U°AÓ#6ò%KAØ%-×%5Ñ%5°e¸RÓ%@×%FÑ%FÓ%H˜
Ø ,Ø$.×$4Ñ$4°SÓ$9˜" 5z¨Qð !)ä(+¨E°!©H«
Ü(+¨E°!©H×,<Ñ,<¸SÀ"Ó,EÓ(Fð,/ (-Ð0CÔ'JÀsÕ'JØAFÀqÀc¸{Ð(<Ù(-øð! %Ü(+¨J×,>Ñ,>¸sÀBÓ,GÓ(H Ø#6¸%Ò#?Ø=BÀ1À#¸;Ð$8Ù$)ð$@ð)%ð6#5Ò";¸Ø#6Ò#B¸(Ø#6Ò#=¸#Ø$8Ò$D¸
ð
ùòQTøô(2ò!)Ú$(ð!)ûô$.ò%Ú $ð%üò*Tøô(2ò!)Ú$(ð!)ûô$.ò%Ú $ð%úsTÃM2Å?M7Æ%NÉ1NË*?NÌ2%N,Í7 NÎNÎ NÎNÎ N)Î(N)Î, N9Î8N9c óì|jdj«}|jj|}|jdd«}|jdd«}d|jdz
}|dkDr||z dznd}d}|jj
D]=} |jj| d f|jj| dfkDsŒ;| }nd}
d} |6|jj|} t
| d
«}
|dkDr|
|z dznd} |jd d«}
d |vr|jd d
«nd
}|dd|ddt
|«dd|
xsdd| xsddd|
xsdd|
dd|dddœS)z,Calculate fat metabolism metrics for page 11r{ryrrzrIr%Nr•rxrÚInclineg.2fz Kcals/minz.0fz% of Max Heart Rateú bpmz*Optimal 10-12Kcals/minuter¨é3zbpm at a speed of ú.1fzmph and incline of rc)ryÚfat_max_heart_rateÚ fat_max_bpmÚfat_max_optimalÚ
crossover_bpmÚcrossover_heart_rateÚfat_metabolism_note)r r‡rjrUrrV)rrrryrzr´Úfat_max_heart_rate_pctÚ
crossover_idxÚidxrÛÚcrossover_heart_rate_pctÚ
crossover_rowÚ
fat_max_speedÚfat_max_inclines rÚ!_calculate_fat_metabolism_metricsz2ContextGenerator._calculate_fat_metabolism_metrics‰à—ll ;ˆ Ø—ll×& 3ˆ à$׸<ˆ
Ø!×% l°AÓ6ˆ
ØÑØ@FÈÂ
 *¨vÑ"5¸Ò";ÐPQÐðˆ
Ø—<<× ˆ × Ñ   nÐ!4Ñ—,,×" Ð#6Ñ!$
Ùð
 ðˆ
Ø#'Ð Ø Ð  ŸL™L×,¨]Ñ;ˆMÜ 
Ð.@Ñ AÓBˆMà28¸1²* Ñ'¨#Ò-À!ð
¨°Ó3ˆ
à/8¸KÑ/GˆKO‰O˜I  +ÈSð ð
!.¨cÐ2°)Ð<Ø%;¸CÐ$@Ð@SÐ"TÜ! *.¨dÐ;Ø -Ò 4°Ð5°SÐ9Ø'?Ò'EÀ2ÀcÐ&JÐJ]Ð$^Ø&3Ò&:°sÐ%;Ð;MÈmÐ\_ÐM`Ð`sðuDðEHðtIðIJð$Kñ
ð
rcó”|jdj«}|jj|df}|jj|df}|j|jd|kDj«}t |«dk(r dddddd d
œS|d z}||d|k}t |«dkDr%|j
d d}|dkDr ||z
|z d
znd}nd}|dz} |jj|df}
||d| k} t | «dkDr%| j
d d} |
dkDr |
| z
|