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

107 lines
16 KiB
Plaintext
Raw Normal View History

Ë
8ÿi7ãóHdZddlmZddlmZmZmZmZddlZGdd«Z y)
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ÚListÚOptionalÚTupleNc
óüeZdZdZdZdededefdZdZded efd
Z dd e
ed efd
Z dd e
ed efdZ d e
e
ee
effdZde
ede
edej d efdZ ddedeeefd e
ed eefdZy )Ú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 ؈Œ ØÔ؈Œ ؈ÕóÚ pnoe_pathÚspirometry_pathÚ seca_pathcóÄtj|d¬«|_tj|«|_tj|«|_|j
«y)zLoad all required datasetsú;)Ú delimiterN)ÚpdÚread_csvr r
Ú
read_excelrÚ_preprocess_pnoe_data)rrrrs rÚ load_datazContextGenerator.load_datasCô—{{ 9¸ÔŒ ÜŸ[™[¨ÓÔÜ—}‘} YÓ/ˆŒ Ø ×$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 Breathz EE(kcal/min)zCARBS(%)édÚCHOzFAT(%)ÚFATé
)
r z 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
ó®|j=|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œ
|_ |jS)z-Extract patient information from SECA datasetÚ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_lbs)
rÚstrÚcontainsÚemptyÚilocÚfloatÚgetÚintÚlowerr)rr6Ú patient_dataÚrowÚ weight_kgÚfat_pcts rÚextract_patient_infoz%ContextGenerator.extract_patient_infoMsMà <‰<Ñ Ÿ<™<Ø ˜(×  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ñ %Ô× Ñ Ð rmetric_overridescó˜|i}i}dD]=}|j«jdd«jdd«}|d|vrt||d«||d<ne|jj|jdj
j
«|k(}|js|djd ||d<|d
|vrt||d
«||d
<Œ×|jj|jdj
j
«|k(}|jrŒ&|d jd ||d
<Œ@|S) z$Calculate spirometry-related metrics)ÚFVCÚFEV1z FEV1/FVC%ú_pctÚ_bestÚ
ParametersÚBestrÚ_predz%Pred.) rUÚreplacerRr
ÚlocrNÚstriprPÚvalues)rr[ÚmetricsÚparamÚ param_keyrWs rÚcalculate_spirometry_metricsz-ContextGenerator.calculate_spirometry_metricshszà Ð  àˆØ KˆEØŸ
×-¨c°3ÓÀVÓLˆ˜"Ð&6Ñ6Ü/4Ð5EÈÈ ÐSXÐFYÑ5ZÓ/[˜9˜+ ×(××& 4×8×@ÀEÑð—yyØ36°v±;×3EÑ3EÀaÑ3HG˜y˜Ð˜"Ð&6Ñ6Ü/4Ð5EÈÈ ÐSXÐFYÑ5ZÓ/[˜9˜+ ×(××& 4×8×@ÀEÑð—y”yØ36°x±=×3GÑ3GÈÑ3JG˜y˜Ð0ð' Kð(ˆrcó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_kgrIÚ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)ér{r|) rRr ÚmaxrÚidxmaxrhÚ_detect_thresholdsÚanyÚrangeÚ_calculate_hr_zonesÚupdate)
rr[rkÚ peak_vt_idxÚ peak_vt_rowÚ fat_max_idxÚ fat_max_rowrxr`ryrÚzone_keyÚzoness
` rÚcalculate_pnoe_metricsz'ContextGenerator.calculate_pnoe_metrics„s3ø€à Ð  àˆð Ð (Ü!&Ð'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Ø×,¨W°U©^¸WÀU¹^È[ÓYˆEØ N‰N˜5Ô ˆ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_smoothedrwNrrtÚSpeedzT(sec))Ú HeartRaterÚTimezVE(l/min)_smoothed)r ÚindexÚlenrhÚdiffrƒrÚnotna) rÚ conditionÚcrossover_indicesrxÚvt1_idxÚvt1_rowÚve_slopeÚsecond_derivativeÚvt2_idxryÚvt2_rows rr„z#ContextGenerator._detect_thresholdsÐsà—LL Ñ0°4·<±<ÀÑ3OÑOˆ Ø% àˆÜ Ð Ó ! AÒ Ñ*ˆ—ll×& /ˆ$Ð%7Ñ  Ñ Ñˆ —<<Ð 4Ñ5×<ˆØ$ŸM™M›OÐØàˆÜ