Files
sheq-analysis-tool/__pycache__/analysis_engine.cpython-314.pyc
T

648 lines
130 KiB
Plaintext
Raw Normal View History

2026-04-20 15:23:18 +12:00
+
Š!×ihãó,Rt^RIHt^RIt^RIt^RIt^RIt^RIHt^RI H
t
H t ^RI H
t
Ht^RIt]P !R4^RIHt^RIHt^RIt^RIt^RIHtHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t,H-t-H.t.]P^!]04t1]Pd!R]3R 7]
!R
R 44t4R R
lt5RRlt6RRlt7.RFOt8.RGOt9.RHOt:.RIOt;0RJmt<0RKmt=0RLmt>0RMmt?0RNmt@.ROOtARRltBRRltCRRltDRRltERRltFRPRRlltGRRltHR R!ltIR"R#ltJRQR$R%lltKR&R'ltLR(R)ltMR*R+ltNR,R-ltOR.R/ltPR0R1ltQR2R3ltRR4R5ltSR6R7ltTR8R9ltURPR:R;lltVR<R=ltWR>R?ltXR@RAltYRBRCltZRDRElt[R#)Ru©
analysis_engine.py — Core analytical layer for the SHEQ reporting tool.
Accepts normalised DataFrames from data_loader and produces a structured
results dict consumed by report_builder. All analysis is performed here;
report_builder only formats and writes.
Public API
----------
run_full_analysis(events, safety_energy, llc, start_date, split_date,
pd1_name, pd2_name, output_dir) -> AnalysisResults
)Ú annotationsN)ÚCounter)Ú dataclassÚfield)ÚAnyÚOptionalÚAgg)Ú
CHART_PALETTEÚ DEEP_BLUEÚSKY_BLUEÚ
DARK_GREENÚ MID_GREENÚ LIGHT_GREENÚPURPLEÚAMBERÚREDÚMUTEDÚCONSEQUENCE_ORDERÚCONSEQUENCE_SERIOUSÚLEADING_ACTIVITY_TYPESÚACTIVITY_COLOURSÚAT_RISK_KEYWORDSÚCORR_MIN_MONTHSÚLEADER_MIN_ACTIVITIESÚTWO_YEAR_WINDOW_MONTHSÚQUALITY_SCORE_BANDSÚignore)Úcategorycól]tRt^2t$Rt]!]R7tR]R&]!]R7t R]R&]!]R7t
R]R&]!]R7t R]R&]!]R7t R]R&]!]R7t
R]R &]!]R7tR]R
&]!]R7tR]R &]!]R7tR]R &]!]R7tR
]R&]!]R7tR]R&]!]R7tR]R&RtR#)ÚAnalysisResultsz.All analysis outputs passed to report_builder.)Údefault_factoryúdict[str, Any]ÚparamsÚ data_qualityÚevents_summaryÚleading_summaryÚtrendsÚ
effectivenessÚat_riskÚ
se_events_relÚ focus_areasúdict[str, str]Úchartsú list[str]ÚrecommendationsÚcaveats©N)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__doc__rÚdictr"Ú__annotations__r#r$r%r&r'r(r)r*r,Úlistr.r/Ú__static_attributes__r0óÚanalysis_engine.pyrr2á8Ù05ÀdÔ0K€FKÙ05ÀdÔ0K€LKÙ05ÀdÔ0K€NKÙ05ÀdÔ0K€OKÙ05ÀdÔ0K€FKÙ05ÀdÔ0K€MKÙ05ÀdÔ0K€GKÙ05ÀdÔ0K€MKÙ05ÀdÔ0K€KKÙ05ÀdÔ0K€FKÙ/4ÀTÔ/J€OJÙ/4ÀTÔ/J€GY×Jr:rcóV^8„dQhRR/#)éÚreturnÚNoner0)Úformats"r;Ú __annotate__rAGs÷ñr:c ó\^RIHpVPPUu0uFqPkK ppRV9dR\
P R&M.RV9dR\
P R&MR\
P R&\
P PRRRRR R
R R R
R/4R#uupi)z(Apply brand-aligned matplotlib defaults.NzSource Sans Proz font.familyz
Source Sans 3z
sans-serifzaxes.spines.topFzaxes.spines.rightz axes.gridTz
grid.alphaç333333Ó?zgrid.linestyleú--)Úmatplotlib.font_managerÚ font_managerÚ fontManagerÚttflistÚnameÚpltÚrcParamsÚupdate)ÚfmÚfÚ availables r;Ú _setup_stylerPGså(Ø!#§¡×!7Ò!7Ó8Ñ!7˜A—Ñ!7€IИ%Ø&7Œ ˜IÔ %Ø&5Œ #à&2Œ ‡LÑØ˜eؘeؘdؘcؘdð öùò9sŸB)có$V^8„dQhRRRRRR/#)r=Úfigz
plt.FigureÚpathÚstrr>r?r0)r@s"r;rArAZs!÷ñˆzð ð¨ñr:có|VP4VPV^´RRR7\P!V4R#)é´ÚtightÚwhite)ÚdpiÚ bbox_inchesÚ facecolorN)Ú tight_layoutÚsavefigrJÚclose)rRrSs&&r;Ú_saver_Zs-Ø×ÑÔØ‡KK˜#¨7¸g€KÔ‡IIˆc†Nr:có V^8„dQhRRRR/#)r=Úperiodszpd.PeriodIndexr>r-r0)r@s"r;rArA`s÷2˜2¨iñ2r:cóLVUu.uFqPR4NK up#uupi)z%b %y)Ústrftime)raÚps& r;Ú
_month_labelsre`s!Ù)0Ó  AJ‰J ©Ñ 1ùÒ 1s!có$V^8„dQhRRRRRR/#)r=Ú numeratorÚfloatÚ denominatorr>r0)r@s"r;rArAÁs!÷ð9¨Uð9°uñ9r:cóVR9g\P!V4'dR#\V4\V4, R,#)éççY@)rkrl)ÚpdÚisnarh)rgris&&r;Ú _safe_pctrpÁs5ؤ"§'¢'¨+×"6Ò"6ÙÜ Ó œe  0°5Õ 8r:có V^8„dQhRRRR/#)r=Útextrr>rTr0)r@s"r;rArAÇs÷2˜2 2r:cóœ\P!V4'dR#\P!RR\ V44P 4#)Úú\s+Ú )rnroÚreÚsubrTÚstrip©rrs&r;Ú_normalise_textr{Çs2Ü ‡w‚wˆt‡}‚}ÙÜ
6Š6&˜#œs 4 )× 1r:có V^8„dQhRRRR/#)r=Úvaluerr>Úboolr0)r@s"r;rArAÍs÷ñ˜sð tñr:cóf\V4P4pV'gR#V\9dR#R#)FT)r{ÚlowerÚSEMANTIC_EMPTY_STRINGS)r}rrs& r;Ú_is_meaningful_textrÍs*Ü ˜ !× )€Dß ÙØ ÔÙ r:có V^8„dQhRRRR/#)r=rrrTr>r-r0)r@s"r;rArAÖs÷AñAA˜Ar:cóL\P!RVP44#)z[a-zA-Z][a-zA-Z0-9/&'-]+)rwÚfindallr€rzs&r;Ú _tokeniser†ÖsÜ
:Š:Ð1°4·:±:³<Ó @r:có V^8„dQhRRRR/#)r=rrrTr>zset[str]r0)r@s"r;rArAÚs÷ñ˜ð ñr:cóaVP4o\P!4UUu0uFIwr\;QJdV3RlV4F 'gK RM RM!V3RlV44'gKGVkKK upp#uuppi)c3ó,<"TF qS9xK R#5i©Nr0©Ú.0ÚkwÚtls& €r;Ú <genexpr>Ú!_theme_matches.<locals>.<genexpr>ÞsøéÐ+¡(˜BRŽx£(ùóƒTF)r€rÚitemsÚany)rrÚthemeÚkeywordsrŽs& @r;Ú_theme_matchesrÚs^ø€Ø
€Bä%5×%;Ò%;Ô%=ô Ù%=/ +¡(Ó+33Š3Ô+¡(Ó+×  ˆÑ%=ò ðùó sª&A=ÁA=Á3A=có$V^8„dQhRRRRRR/#)r=Úseriesú pd.SeriesÚlimitÚintr>údict[str, int]r0)r@s"r;rArAâs!÷8ð8°^ñ8r:cóTVP'd/#VP4P\4PP 4pW"P R4VP R4,,pVP
4PV4P4#)rtÚ
,
P4#)ÚM)Ú to_periodrÚ to_timestamp)s&r;Ú_pick_window_startr®ês'Ø × Ñ ˜ #Ô'=ÀÕ'AÕ B× Rr:có V^8„dQhRRRR/#)r=Ú se_windowú pd.DataFramer>r0)r@s"r;rArAîs÷mñm m°\ñmr:cóÒaVP'dVP4#VP4o\Uu.uFqSP9gKVNK ppV'd^SV,P R4P \ 4PRP^R7P\4SR&MRSR&SR,P\4SR&SR,P\4SR&SR,PR4SR&SR,P PR R
R R 7SR
&SR,PR4SR&SR,PR4SR&SR,PR4SR&SR,P P4PR4SR&SR,P P4PR4SR&SR,^8*SR,P P4PR4,SR&\P !SP#R4RR7P ^4p\P !SP#R4RR7P ^4p\P !SP#R4RR7P ^4p\P !SP#R4RR7P ^4p\$Uu.uFqSP9gKVNK pp\&Uu.uFqSP9gKVNK pp\(Uu.uFqSP9gKVNK p pV'd\+V3R lV44SR!&M^SR!&V'd\+V3R"lV44SR#&M^SR#&.p
V F p \P !SV ,RR7P ^4p V R8Xd6V
P-V P/^4P \044KmV
P-V P/^4P \044 V
'd \+V
4M^SR$&\3^\V4\V4,\V 4,4p
SR!,R%,SR#,R&,,SR$,R%,,p\3R%\V4R%,\V4R&,,\V 4R%,,4p\4P6!Wï, R',^^d4P9^4SR(&\4P:!SR(,^<8¬SR(,^(8¬SR(,^..RIOR)R*7SR+&WV,^8„SR,P P4P PR,R
R R 7,SR-&V^8„SR,P/^4,SR,P P4P PR.R
R R 7,SR/&SP#R0\P<!SP>R1R274P \ 4P P4P PR3R
R R 7SR4&SR,P P4P PAR5RR
R67P PAR7RR
R67P PC4pVVPER4,PG4pVPV4P ^4PI^4SR,PI^4,SR8&\4PJ!SR,^#8¬^\4PJ!SR,^^\4PJ!SR,^
^ \4PJ!SR,^^^4444p\4PJ!SR,^^
\4PJ!SR,^
^^44\4PJ!SR
,^^4,\4PJ!SR,^^\4PJ!SR,^8H^^44,p\4PJ!WV,^^ \4PJ!WV,^8H^^44\4PJ!SR,^^\4PJ!SR,^8H^^44,p\4PJ!SR,^^
\4PJ!SR,^8H^^44\4PJ!SR,P P4P PR9R
R R 7^^4,p\4PJ!SR/,^^4\4PJ!V^^\4PJ!V^8H^^44,\4PJ!SR4,^^4,\4PJ!V^8„WCPA^\4PL4, P ^4R:8¬,^^4,p\4PJ!SR-,^^4\4PJ!SR,P P4P PR;R
R R 7^^4,p\4PJ!SR,^
^4\4PJ!SR8,^^4,\4PJ!SR,^8*SR-,(,SR/,(,^^4,p\4P6!VV,V,V,V,V,V,
^^d4P \04SR<&SR<,\NR=,SR>&SR<,\NR?,SR@&SR<,\NRA,8*SRB&SR,SR,8„WV,^8„VP/^4,,SRC&SR,SR,SR/,,SRB,(,SRD&SR8,SRE&RFRGlpSR<,PV4SRH&S#uupiuupiuupiuupi)Jz?Create practical quality proxies for each Safety Energy record.rtrv©ÚaxisÚ
_text_blobÚ_tokensÚ _word_countcó*\\V44#)ÚlenÚset©Útokss&r;Ú<lambda>Ú&_build_quality_frame.<locals>.<lambda>s ¼¼SÀ»Y¼r:Ú
_unique_wordsz\dTF)ÚregexÚnaÚ_contains_numbercó*\\V44#)r)Úts&r;s¼¼NÈ1Ó<MÔ8Nr:Ú _theme_countcó@\\V4\,4#)Ú ACTION_WORDSr»s&r;s¼¼SÀ»YÌÕ=UÔ9Vr:Ú
_action_wordscó@\\V4\,4#)ÚLEARNING_WORDSr»s&r;s¼3¼sÀ4»yÌ>Õ?YÔ;Zr:Ú_learning_wordscó6a\V3Rl\44#)c3ó8<"TFqS9gK ^xK R#5i©éNr0©ÚwordÚtxts& €r;rÚ9_build_quality_frame.<locals>.<lambda>.<locals>.<genexpr> søéÐD¡n˜dÀ¹ Ÿš£nùóƒ
)ÚsumÚREACTIVE_WORDS©sfr; sø€”CÔD¥nÓDr:Ú_reactive_wordscó6a\V3Rl\44#)c3ó8<"TFqS9gK ^xK R#5ir0s& €r;r søéÐFÑ&6˜dÀ#¹+ŸšÓ&6ùrÔ)ÚPREVENTIVE_WORDSr×sfr; sø€”CÔFÕ&6ÓFr:Ú_preventive_wordscóˆa\;QJd#V3Rl\4F 'gK R# R#!V3Rl\44#)c3ó,<"TF qS9xK R#5ir0)rds& €r;rsøéÐ:^ÑM]ÈÀ¾8ÓM]ùrTF)r“ÚGENERIC_PATTERNSr×sfr;s*ø€·s³sÔ:^ÕM]Ó:^·s´sÐ7^²sÐ7^°sÔ:^ÕM]Ó:^Ô7^r:Ú
_generic_flagÚtotal_questionsÚcoerce©ÚerrorsÚat_risk_aspectsÚactionsÚ atl_actionsc3ó‚<"TF4pSV,P\4P\4xK6 R#5i©Úmaprr©ÚcolÚdfs& €r;rÚ'_build_quality_frame.<locals>.<genexpr>s0øéÐ%jÑ^iÐWZ ¥g§k¡kÔ2EÓ&F×&MÑ&MÌc×&RÐ&RÓ^iùóƒ<?Ú_base_input_countc3ó‚<"TF4pSV,P\4P\4xK6 R#5is& €r;r"s1øéÐ)rÑbqÐ[^¨"¨S­'¯+©+Ô6IÓ*J×*QÑ*QÔRU×*VÐ*VÓbqùrïÚ_optional_input_countÚ_numeric_input_countgð?ç333333ó?rmÚinput_depth_scoreÚSparse)ÚdefaultÚinput_depth_bandz)follow up|review|action|close out|escalatÚ_follow_up_signalz#critical risk|hazard|unsafe|controlÚ _risk_signalzOWas a critical risk identified and controls verified as effective and in place?Úobject)ÚindexÚdtypezyes|effective|verifiedÚ_critical_control_signalz
[^a-z0-9 ])ruÚ_duplicate_flagz&best practice|lesson|learning|feedbackçš™™™™™¹?zclose out|owner|due|monitorÚ
quality_scoreÚ
meaningfulÚmeaningful_flagÚ
high_valueÚhigh_value_flagÚshallowÚ shallow_flagÚ
reactive_flagÚpreventive_flagÚrepetitive_flagcó V^8„dQhRRRR/#)r=Úscorerr>rTr0)r@s"r;rAÚ*_build_quality_frame.<locals>.__annotate__s÷ñ˜Sñr:có~V\R,dR#V\R,dR#V\R,8:dR#R#)rú
High valuerÚ
MeaningfulrÚShallowÚMixed)r)r s&r;Ú_bandÚ#_build_quality_frame.<locals>._bands8Ø Ô Õ Ø Ô Õ Ø Ô'¨ Õ Ùr:Ú quality_band)ÚRichÚBalancedÚLight)(rŸÚcopyÚQUALITY_TEXT_COLUMNSÚcolumnsÚfillnar¡rTÚaggÚjoinrêr{r†Úcontainsr€rnÚ
to_numericÚgetÚINPUT_DEPTH_BASE_FIELDSÚINPUT_DEPTH_OPTIONAL_FIELDSÚINPUT_DEPTH_NUMERIC_FIELDSrÕÚappendÚgtrÚmaxÚnpÚclipÚroundÚselectÚSeriesrüÚreplaceryÚgeÚwhereržr)ÚcÚ text_colsÚtotal_qr(Ú base_fieldsÚoptional_fieldsÚnumeric_fieldsÚnumeric_presencerìÚvalsÚ
max_pointsÚweighted_pointsÚ weighted_maxÚ norm_textÚfreqÚrichnessÚ specificityÚ action_scoreÚlearning_scoreÚ
risk_scoreÚfollow_up_scoreÚpenaltyrs& @r;Ú_build_quality_framerDîss ø€àØ~‰~ÓÐà Ó €BÝ0¿¹±O—Ñ0€IÐà ˆy
‰VB
‰V”C
‰S ˆ
‰S”Ó
ˆðˆˆàÓ3€B€y˜9
×)¬#Ó.€B€}ÑØ˜Y+Ñ,GÓH€B€ÑØ  Õ:¸5ÈÐQVÐW€BÐÑØ˜LÕ-Ñ.NÓO€B€~ÑØ˜Y+Ñ,VÓW€B€Ñؘy-Ñ.ZÓ[€BÐÑØ˜|Õ0×8×€BÐÑðÕ2×:×€BÐÑð
ˆ˜Ø
ˆ
×
Ñ
×
&×
*Ñ+^Ó
 `ðÑô
mŠm˜BŸF™FÐ#4Ó5¸G×NÈqÓQ€GÜmŠm˜BŸF™FÐ#4Ó5¸G×NÈqÓQ€GÜmŠm˜BŸF™F 9Ó-°hÔ?×FÀqÓI€GÜ—-’- §¡ }Ó 5¸hÔNÈqÓQ€Kå¸b¿j¹j¹—15€KÐIÝ"=ÓQÑ"=˜QÀbÇjÁjÁ—qqÑ"=€OÐQÝ!;ÓOÑ!;˜AÀBÇJÁJ¹—aaÑ!;€NÐÜ"%Ô%jÑ^iÓ%jÓ"jˆÐ Òà"#ˆÐ ÑçÜ&)Ô)rÑbqÓ)rÓ&rˆÐ #à&'ˆÐ ÐÛˆÜ}Š}˜R W¨XÔ=¸aÓØ Ð × # D§G¡G¨A£J×$5Ñ$5´cÓ$:Ö × # D§G¡G¨A£J×$5Ñ$5´cÓ$:Ö ÷ ;K¤Ð%5Ô!6ÐPQ€BÐÑä˜KÓ(¬3¨Ó+?Õ?Ä#ÀnÓBUÕV€Jà
Ð Õ 
Ð
Õ

Ð
$ 
ô
Ø Ü ˆKÓ˜3Õ¤ _Ó!5¸Õ!;Õ;¼cÀ.Ó>QÐTWÕ>WÕ€Lô!Ÿgšg Õ'EÈÕ&NÐPQÐSVÓW×]Ð^_Ó`€BÐÑÜŸYšYà Ð #  Ð #  Ð #  
ò
ô€BÐÑð
Õ  Ñ "Ø
ˆ
×
Ñ
×
&×
*×
3Ð4_ÐgkÐpuÐ
 wðÐÑð
1‰Ø
ˆ
×
Ñ
 Ó

ˆ
×
Ñ
×
&×
*×
3Ð4YÐaeÐjoÐ
 qð€~Ñð
&(§V¡VØ
Š ˜Ÿ¨Ô&÷
fŒSƒk—##—ee“gŸc™c§(¡(Ð+CÈ4ÐTY (Ó"ZðÐ ˆ×Ñ× W‰W] C¨tˆ
W‰WV˜ˆ
U‰Uð Y—\\  &× 5€DØ%ŸM™M¨$Ó/×6°qÓ9×<¸?À"À]ÕBS×BVÑBVÐWXÓBYÕY€BÐÑô Š" (¨"Ü
Š" (¨"Ü
Š" (¨"Ü
Š" ¨AÓ
ô ŠÑ*¨B´·²¸¸OÕ9LÐPRÑ9RÐTUÐWXÓ0YÓ
(Š()¨1¨aÓ

(Š(2Ñ*¨A¬r¯xªx¸¸>Õ8JÈaÑ8OÐQRÐTUÓ/VÓ
 Xðô ŠÕ&¨!Ñ+¨R´·²¸'Õ:OÐSTÑ:TÐVWÐYZÓ1[Ó
(Š(2&¨!Ñ+¨Q´·²¸¸OÕ9LÐPQÑ9QÐSTÐVWÓ0XÓ
 Zðô
ŠÐ&¨!Ñ+¨R´·²¸"Ð=NÕ:OÐSTÑ:TÐVWÐYZÓ1[Ó
(Š(2#×'×/×3×<Ð=eÐmqÐv{Ð|Ð~ðBCó Dõ Dðô
Š# Ó
(Š(7˜a< ¤B§H¢H¨W¸©\¸1¸aÓ$@Ó
 Bä
(Š(1°1°aÓ

(Š(G˜aK ©¸qÄ"Ç&Á&Ó/IÕ%I×$QÑ$QÐRSÓ$TÐX[Ñ$[Õ\Ð^_ÐabÓ
 dðô ŠÐ(¨!¨QÓ
(Š(2#×'×/×3×<Ð=ZÐbfÐkpÐqÐstÐvwÓ
 yðô
Š$ b¨!Ó
(Š((¨!¨QÓ

(Š(BÑÐ3FÕ0GÐ/GÕHÈRÐP^ÕM_ÐL_Õ`ÐbcÐefÓ
 hð ô Ÿ'š'Ø ÕÕÕKÈoÕ]Ð`gÕ ˆ3ó÷
fŒSƒkðÑð
˜Õ/Ô3FÀ|Õ3TÑT€BÐÑØ˜Õ/Ô3FÀ|Õ3TÑT€BÐÑØ˜,Ô0CÀIÕ0NÑN€B€~Ñà Ð Õ  Ð$7Õ!8Ñ 8Ø Õ ! AÑ ¯©°A«Õ Ñð
Ð Õ  BÐ'8Õ$9Ñ 9Ø
ˆ
õ à
ˆ Ð
õ ðÐÑð
Ð1€BÐÑõð˜OÕÓ7€B€~ÑØ
€IùòOEùòHJùÚQùÚOs/¼uÁuÌ(uÌ?uÍuÍ&uÍ6u$Î
u$có V^8„dQhRRRR/#©r=r>r!r0)r@s"r;rArAžs÷ñ ð°.ñr:cóÜVP'dR^RRRRRRRRRRRRRRR RR
RR RR R/ #R\\V44R\\ VR
,P 44^4R\\ VR,P 44^4R\\
VR,P4\V44^4R\\
VR,P4\V44^4R\\
VR,P4\V44^4R\\
VR,P4\V44^4R\\
VR,P4\V44^4R \\
VR,P4\V44^4R
\\
VR,P4\V44^4R \\
VR,P4\V44^4R \\
VR,R8HP4\V44^4/ #)ÚcountÚ avg_qualityrlÚavg_input_depthÚmeaningful_pctÚhigh_value_pctÚ shallow_pctÚ reactive_pctÚpreventive_pctÚrepetitive_pctÚ
follow_up_pctÚrisk_signal_pctÚrich_input_pctrrrrrr r
r)rr*rhÚmeanrp)s&r;Ú_summarise_quality_slicerUžs
Ø ‡x‡x€xà  ˜3Ø ˜sØ ˜cØ ˜cØ ˜3Ø ˜CØ ˜cØ ˜cØ ˜SØ ˜sØ ˜cð

ð
ð ”S˜“W“Ø”uœU 2 oÕ#6×#;Ñ#;Ó#=ÓÓœ5¤ rÐ*=Õ'>×'CÑ'CÓ'EÓ!FÈÓœ%¤ ¨"Ð->Õ*?×*CÑ*CÓ*EÄsÈ2ÃwÓ OÐQRÓœ%¤ ¨"Ð->Õ*?×*CÑ*CÓ*EÄsÈ2ÃwÓ OÐQRÓ”uœY r¨.Õ'9×'=Ñ'=Ó'?ÄÀRÃÓIÈ1Óœœi¨¨?Õ(;×(?Ñ(?Ó(AÄ3ÀrÃ7ÓKÈQÓœ%¤ ¨"Ð->Õ*?×*CÑ*CÓ*EÄsÈ2ÃwÓ OÐQRÓœ%¤ ¨"Ð->Õ*?×*CÑ*CÓ*EÄsÈ2ÃwÓ OÐQRÓœœy¨Ð,?Õ)@×)DÑ)DÓ)FÌÈBËÓPÐRSÓœ5¤¨2¨nÕ+=×+AÑ+AÓ+CÄSÈÃWÓ!MÈqÓœ%¤ ¨2Ð.@Õ+AÀVÑ+K×*PÑ*PÓ*RÔTWÐXZÓT[Ó \Ð^_Ó
ð
r:có$V^8„dQhRRRRRR/#)r=Ú
recent_monthsrr>z1tuple[list[dict[str, Any]], list[dict[str, Any]]]r0)r@s"r;rArA¿s"÷-ñ-˜-¸-ÐHyñ-r:cóîVP'd..3#.pVP4Fuwr4VPRR4p\V4pV'g'\ VPRR44pV'dV0pVFpVP RVR,RV/4K! Kw V'g..3#\ P!V4p V PRR.4P4P^R7P^R7p
V
PV)Rp V
PV^,)V)p \V 4^8Xd..3#.p
V
P4wrŽ\Wë,P44p\V 4'd \Wì,P44MRpVV,
pV^8XdKhV
P R\!V4R \#V^4R
\#V^4R \#V^4/4 \%V
Uu.uFpVR ,^8”gKVNK upR R
7R,p\%V
Uu.uFpVR ,^8gKVNK upRR
7R,pVV3#uupiuupi)rtÚ module_nameÚ
year_monthr”©Ú
fill_valuer³NrlÚ
recent_avgÚ prior_avgÚdeltacó*VR,)VR,)3#©r_r]r0©Úrs&r;Ú(_summarise_theme_trend.<locals>.<lambda>êsÈÈ7ÍÈ ÐVWÐXdÕVeÐUeÑGfr:©Úkey:NéNcó(VR,VR,)3#rar0rbs&r;rdësÈ1ÈWÍ:ÐXYÐZfÕXgÐWgÑJhr:)Úiterrowsr!rr{r%rnÚ DataFrameÚgroupbyÚsizeÚunstackÚ
sort_indexrrhrTrTr*Úsorted)rWÚ
theme_rowsÚrowÚblobÚmatchesrYr”Útheme_dfÚmonthlyÚ recent_colsÚ
prior_colsÚrowsr7r]r^r_rcÚrisingÚ declinings&& r;Ú_summarise_theme_trendr|¿s8Ø ‡x‡x€xØ2ˆvˆ
à')€JØ—++-‰ˆØw‰w| Ü  Ó&ˆßÜ)¨#¯'©'°-ÀÓ*DÓEˆØ&˜-ÛˆEØ × Ñ ˜|¨S°Õ->ÀÈÐ ñ ÷ Ø2ˆvˆ
ä|Š|˜'€Hà×ј' 1טAˆÓ ß ˜ˆÓ ð ð
—/‘/ = . 2€KØ =°1Õ#4Ð!5°}°nÐE€JÜ
ˆ˜Ø2ˆvˆ
à!#€DØ×)‰ ˆÜ˜,×
Ü69¸*·o²o”E˜$Õ2È3ˆ Ø˜Ø AŒ:Ù Ø Ø ”S˜“ZØ œ% 
¨AÓ œ˜y¨!Ó ”U˜5 !“_ð 
ö ñ
¡Ó˜¨'­
°Q©—QÑ7Ñ=fÔ
gÐhjÕ
k€FÜ¡4Ó:¡4˜a¨1¨W­©>Ÿ˜¡4Ñ:Ñ@hÔiÐjlÕm€IØ  Ðùò8ùÚ:sÈI-ÈI-È=I2ÉI2có V^8„dQhRRRR/#rFr0)r@s"r;rArAïs÷4ñ4˜4¨~ñ4r:có8VP'gRVP9d RRR.RR/#RpVR,P4^8”dOVR,P4^8”d3\\ VR,P VR,44^4p.ROpVP
R4PRRRR 3R
R 3R R
3R R7P4pVR,P\V4UUu/uFwrEWTbK upp4VR&VPR4pVP4UUu.uwrgRVR,R\VR,4R\\ VR,4^4R\\ VR,4^4R\\ VR,4^4R\\ VR,4^4R\\ VR,4^4/N pppRp VfRp MVR8dRp M VR8dRp RVRVRV /#uuppiuuppi)!rõÚ correlationNÚby_bandÚnotez!No input-depth insight available.rrcóH\VP4\V44#©rp©Úss&r;Ú'_input_depth_insights.<locals>.<lambda>ó¼À1Ç5Á5Ã7ÌCÐPQËFÔ9Sr:rcóH\VP4\V44#r„s&r;r†r‡r:rcóH\VP4\V44#r„s&r;r†s´9¸Q¿U¹U»WÄcÈ!ÃfÔ3Mr:)rHrIrKrLrMrJÚ
band_orderÚbandrHrJrIrKrLrMz:Input depth appears usable as a supporting quality metric.z`Input depth could not be tested reliably against quality because there was not enough variation.gÐ?z`Input depth is only weakly aligned with overall quality, so it should remain a secondary metric.çà?z\Input depth is moderately aligned with overall quality and is useful as a supporting metric.)rrr©rrl©rrT)rT)rÚnuniquer*rhÚcorrrkrÚ reset_indexrêÚ enumerateÚ sort_valuesrir)
rÚgroupedÚbrqrcr€rs
& r;Ú_input_depth_insightsr—ïs3Ø ‡x‡x€xÐ&¨b¯j©jÔ ˜  Ð
ð
ð €DØ Ð
Õ×(¨1Ô°OÕ1D×1LÑ1LÓ1NÐQRÔ1RÜ”U˜2׸?Õ8KÓMÈqÓâ8€Jà
Ð Ø-Ñ/SÐ-Ñ/SÐ'Ñ)MÐ
ó
÷
ð ð$Ð$6Õ7×;ÌiÐXbÔNcÔ<dÑNcÁdÀa¸QºTÑNcÒ<dÓe€GˆØ×! ,Ó/€Gð× ñ'‰Dˆ
 ”S˜˜7“_Ø œu¤U¨1Ð->Õ+?Ó%@À!Ó œ5¤ Õ'7Ó!8¸ œe¤E¨!Ð,<Õ*=Ó$>ÀÓ œe¤E¨!Ð,<Õ*=Ó$>ÀÓ œ5¤ Õ'7Ó!8¸
ñ ñ ð H€DØ ‚|Øq‰Ø
ŒØq‰Ø
ŒØð ð ðùó/=eùó s
Ã9
H
Ä5B4Hc
ó,V^8„dQhRRRRRRRRRR/#) r=Úser±ÚllcÚeventsÚ
start_daterTr>r!r0)r@s"r;rArA&sA÷JñJØðJà ðJð
ðJðð Jð
ñ Jr:có„VP'dRR/#VR,P4p\V4p\P!V4pWR,VVR,V8*,,P 4pWR,VVR,V8*,,P 4pW"R,VVR,V8*,,P 4p VP'dRR/#\
V4p
\P!V
R,P4PR4V
R,P4PR4RR7p \P!V
R,P4PR4V
R,P4PR4RR7p V
PRR .4P4P^R
7PV ^R
7p
V
PV
R,PPR4R 7PR R .4P4P^R
7PV ^R
7pV
PRR .4R
,P!4P\"P$R
7PV 4p/p.p/p.p/p\&EF0pWªR ,V8H,P 4pVP'dK8\)VP+R\P,!RR74^4p\)VP+R\P,!RR74^4pRV P.9dBW™R,P1VR,P34P544,M\P6!4p\9V4p\;V4pVP=RVRVR\?\A\PB!VP+R4RR7PE^4P!44^4R\?\A\PB!VP+R4RR7PE^4P!44^4/4VVV&.pRVP.9Ed€VPR4PGRƒR„RR3RR3RR 3R!7PI4pVVR",^,PKR#R".R$R$.R%7pVPM4UUu.uF“wppRVR,R"\OVR",4R#\?\AVR#,4^4R&\?\AVR&,4^4R'\?\AVR',4^4R(\?\AVR(,4^4/NK• pppVR),VV&VFZp V R",^gKV R&,^-8¼gK#VPQR VRV R,R"V R",R#V R#,R&V R&,/4K\ VPQR VR"VR",R#VR#,R*VR*,R+VR+,R'VR',R&VR&,R,VR,,R-VR-,R(VR(,R.VR.,R/VR/,/ 4/p!\SVR0,P34P544^EdVPR04PGRƒR„R…R17PU4p"\SV"4^d¿V"PVR†,p#V"PVR‡,p$R2\?\YV$R",V#R",,
V#R",4^4R3\?\AV$R4,V#R4,,
4^4R5\?\AV$R6,4\AV#R6,4,
^d,^4/p!/VCRVRVR7VR8VR9V!/CVV&EK3 \[4p%V
R:,F,p&\]V&4p'V'Fp(V%V(;;,^,
uu&K K. WªR ,R;8H,P 4p)\_V)4wp*p+\_V
4wp,p-\aVR<R=7R),p..p/RV)P.9V)PR4PGRƒR„RR>3RR?3R@7PI4PKR"R$R%7p0V0Pc^
4PM4UUu.uFwwppRVR,R"\OVR",4R#\?\AVR#,4^4R(\?\AVR(,4^4R&\?\AVR&,4^4/NKy p/ppV U1Uu.uFVp1RA\eV14/\&Uu/uF5pTVV
P.9d\OV
PfV1V3,4M^bK7 upCNKX p2p1pV U1Uu.uFp1RA\eV14/\&Uu/uFnpTVVP.9dX\Ph!VPfV1V3,4'd)\?\AVPfV1V3,4^4MRBbKp upCNK p3p1pV U1Uu.uFVp1RA\eV14/\&Uu/uF5pTVVP.9d\OVPfV1V3,4M^bK7 upCNKX p4p1pV
PV
R,PPk4RC7PRD4P4PKR$R%7p5\;V
4p6.p7VP+R;/4p8VP+RE/4p9VP+RF/4p:V8'd[V7PQRGV8P+R#^4RH
RI\SV 4 RJV8P+R&^4RH
RKV8P+R'^4RH
RL2 4V.'dOV.^,p;V7PQV;R, RMV;R , RNV;R", ROV;R#,RH
RPV;R&,RH
RQ2
4V,'d3V7PQRRRSPmRTV,RU,44 RV24V:'dHV9'd@V:P+R#^4V9P+R#^4dRFMREp<V7PQV< RW24V6P+RX4eV7PQRYV6RX,RZ
R[24.p=V8P+R(^4^dV=PQR\4V+'d3V=PQR]RSPmR^V+RU,44 R_24V-'d3V=PQR`RSPmRaV-RU,44 Rb24V8P+R.^4^#8dV=PQRc4V6P+RX4e V6RX,Rd8¼dV=PQRe4V='gV=PQRf4.RˆOp>/RgVPoRh4bRiVPoRh4bRj\O\SV 44bRkVPoRh4bRlV2bRmV4bRnV3bRoVbRpVbR8V6bRqVbRr\qV%Ps^
44bRsV,bRtV-bRuV*bRvV+bRwV/bRxT.RyTRzV5Pc^4Pu4U?U@u/uFwp?p@V?\OV@4bK up@p?R{V7R|V=R}V>R~RRR€RV
RV/
C#uuppiuuppiuupiuupp1iuupiuupp1iuupiuupp1iuup@p?i)‰zÿ
Build a rolling two-year Safety Energy trend and quality view.
Counts come from Safety Energy. Quality is inferred through practical
proxies such as text richness, specificity, action/follow-up signals,
hazard recognition, and repeated generic entries.
rz<No Safety Energy data available for two-year trend analysis.ÚdatezANo Safety Energy records fall within the rolling two-year window.r«©r<ÚQrZÚ
activity_typer[)Ú year_quarterr¢rrY©Ú llc_topicÚ
business_unitÚ top_modulesÚ
top_topicsÚ avg_at_riskråÚ avg_actionsrærcóH\VP4\V44#r„s&r;Ú*_analyse_two_year_trends.<locals>.<lambda>s¼9ÀQÇUÁUÃWÌcÐRSËfÔ;Ur:rcóH\VP4\V44#r„s&r;óÄÈ1Ï5É5Ë7ÔTWÐXYÓTZÔA[r:r
cóH\VP4\V44#r„s&r;r­r:)rHrIrMrLrPrHrIÚ ascendingrMrLrPºNéNrJrKrOrNrQrSÚyear)rHÚqualityrÚcount_change_pctÚquality_changer´Úmeaningful_change_pctrÚbusiness_unitsÚ input_depthÚyoyrµÚCCCcó:VR,)VR,)VR,3#)rHrMrIr0rbs&r;Ðs˜˜'
{ Q }Õ%5Ð$5°q¸Õ7GÑHr:recóH\VP4\V44#r„s&r;Ús¼YÀqÇuÁuÃwÔPSÐTUÓPVÔ=Wr:cóH\VP4\V44#r„s&r;Ûs´yÀÇÁÃÌ#ÈaË&Ô7Qr:)rHrIrPrMÚperiodN)Ú
month_namerÀÚOCCÚLLCz!CCCs averaged a quality score of ú.1fz/100 over the last z months, with z% assessed as shallow and z% assessed as high value.z, shows a high-volume / low-value pattern in z activity: z records with average quality z and z% shallow entries.z?Emerging Safety Energy themes in the recent six months include ú, c3ó2"TF
qR,xK R#5i©r”Nr0)rcs& r;rÚ+_analyse_two_year_trends.<locals>.<genexpr>!séÐ@Ñ-?¨˜7ŸšÓ-?ùóºNé.zk records currently show the strongest overall documentation quality among the three leading activity types.rz.Input depth and quality are correlated at r = ú.2fzU, indicating that fuller records are a useful supporting signal for activity quality.zŽCCC records show a material level of repeated or duplicated wording, suggesting some checks may be drifting toward compliance-only completion.z
CCC focus on c3ó2"TF
qR,xK R#5ir0©Úitems& r;r4séÐ%RÑ@Q¸¨7§m¢mÓ@QùrÈz\ has reduced in the recent six months; confirm this is intentional rather than a blind spot.z"Previously visible themes such as c3ó2"TF
qR,xK R#5ir0s& r;r8séÐ:kÑUjÈTÀ¿=º=ÓUjùrÈz: are appearing less often in recorded activity narratives.z¶A relatively low share of CCCs contain clear follow-up or close-out signals, which weakens the evidence that issues identified in checks are being converted into learning and action.çš™™™™™Ù?z¶Rows with richer input depth are materially more likely to read as meaningful records, so populated-field depth can be used as a practical early warning metric for declining quality.z‡No dominant low-value pattern was detected across the full two-year window, but monthly quality should still be monitored for slippage.Ú window_startz%Y-%m-%dÚ
window_endÚ
window_monthsÚrequested_start_dateÚ monthly_mixÚ
quarterly_mixÚmonthly_qualityÚquality_by_typeÚactivity_insightsÚinput_depth_by_typeÚ
top_themesÚ
rising_themesÚdeclining_themesÚccc_rising_themesÚccc_declining_themesÚccc_recurring_modulesÚhigh_volume_low_valueÚbu_quality_snapshotsÚ seasonalityÚexecutive_summaryÚleadership_focusr.Ú
proxy_notea Quality is inferred using practical proxies: richness and specificity of text, risk recognition, action/follow-up language, evidence of learning, input depth across useful fields, and penalties for generic or repeated wording. These scores indicate likely value, not definitive assurance.zÓThe deeper Safety Energy analysis uses a rolling two-year window ending on the latest Safety Energy record. Counts come from Safety_Energy.xlsx; LLC_Data is used separately elsewhere for richer LLC theme detail.Ú _quality_dfÚ _llc_windowr)rrTéþÿÿÿéÿÿÿÿ)zUse CCC quality, not just CCC count, as a leadership KPI. Track shallow-entry rate, follow-up rate, and repeated wording monthly.z«Review the highest-volume low-value Business Units with their leaders and sample the underlying records to confirm whether quality concerns are real or data-entry related.z™Push recurring CCC/OCC themes that show little improvement into board-level focus areas where repeated exposure is visible but learning evidence is weak.);rŸr'rnÚ TimestamprrDÚ period_rangeÚminr¬rkrlrmÚreindexÚassignÚdtrTr(rr!r,rÚisinr ÚuniquerjrUr—rLr*rhr rrrr“rirr%rnÚilocrprrr|rorTÚlocÚnotnarÀrrcr6Ú most_commonr)Ar™rÚrequested_startr°Ú
llc_windowÚ
events_windowÚ
quality_dfÚ
all_monthsÚ all_quartersÚmonthly_countsÚquarterly_countsrØÚ quality_rowsÚ bu_snapshotsÚlow_value_unitsÚdepth_insights_by_typeÚatyperxÚ
module_topicsÚ text_topicsÚ
sub_eventsÚsummaryÚdepth_insightsÚbu_rowsr”rqrcrrÚyearlyÚprevÚcurrÚoverall_themesrsrtr”Úccc_dfÚ
ccc_risingÚ
ccc_decliningÚoverall_risingÚoverall_decliningrâÚrecurring_modulesÚmodule_summaryr¿Úquality_monthly_rowsÚ quarter_rowsräÚoverall_input_depthråÚ ccc_summaryÚ occ_summaryÚ llc_summaryÚhvÚstrongerrær.ÚvsA&&&& r;Ú_analyse_two_year_trendsr &s­ð
‡x‡x€xØÐ&z~‰~Ó€HÜ% /€LÜ—l’l .€OØv•J .°2°fµ:ÀÑ3IÕK×R€Iؘ&•k 1°c¸&µkÀXÑ6MÕO×V€JØ 6N¨lÑ:¸vÀf½~ÐQYÑ?YÕb€MàØÐ% iÓ0€JÜØ×ÑÓ ×*¨3Ó×ÑÓ ×*¨3Ó
ô€Jô
—?’?Ø×ÑÓ ×*¨3Ó×ÑÓ ×*¨3Ó
ô€Lð ×јL¨/ИAˆÓ ß ¨ˆÓ *ðð ×Ñ z°&Õ'9×'<Ñ'<×'FÑ'FÀsÓ'KÐÓ. 2Ó 3·D±D³Fß ˜AˆÓ ß ¨!ˆÓ ,ð ð ×јL¨/Ð;¸OÕœBŸF™FˆÓ #ß Ó ðð )+ÐØ)+€LØ46€LØ,.€OØ-/Ðç'ˆØ 4¸Ñ>×EˆØ 99ˆ ä! #§'¡'¨-¼¿ºÈÔ9RÓ"SÐUVÓWˆ
Ü §¡¨ ´R·Y²YÀXÔ5NÓ OÐQRÓSˆ ð -×"7Ñ"7Ô
¨Õ8×=¸cÀ/Õ>R×>YÑ>YÓ>[×>bÑ>bÓ>dÓ fÜ=?¿\º\»^ð ô+¨3ÓÜ.¨sÓØØ ˜=Ø ˜+Ø œ5¤¤r§}¢}°S·W±WÐ=NÓ5OÐX`Ô'a×'hÑ'hÐijÓ'k×'pÑ'pÓ'rÓ!sÐuvÓ œ5¤¤r§}¢}°S·W±W¸YÓ5GÐPXÔ'Y×'`Ñ'`ÐabÓ'c×'hÑ'hÓ'jÓ!kÐmnÓ
ô ð )7ИuÑ%à(*ˆØ ˜cŸk™kÕ  ˜OÓØ3Ø 9Ø!/Ñ1UÐ VØ$5Ñ7[Ð#\Ø$5Ñ7[Ð#\ð ó÷ð
ð˜g .°"Ñ5×AÀ=ÐRYÐBZÐglÐnsÐftÐuˆ$×
ñ/DA$ Q Õ%7ØœS  !¤5¬¨q°Õ/?Ó)@À!Ó#DØ!¤5¬¨q°Õ/?Ó)@À!Ó#DØ$¤e¬E°!Ð4DÕ2EÓ,FÈÓ&JØ$¤e¬E°!Ð4DÕ2EÓ,FÈÓ&Jó
ñ
ñ
ð#*¨"¥+ˆL˜Ñ ÛØw•< %¨#¨mÕ*<ÀÖ*BØ#ר¨_Õ)=Ø  Ø% s¨=Õ'9Ø% s¨=Õ'9ð ,öñð ×ÑØ ˜UØ W˜WÕ ˜7  ˜wÐ'8Õ ˜gÐ&6Õ ˜gÐ&6Õ ˜7  ˜gÐ&6Õ ˜G  ˜gÐ&6Õ ˜W  ˜gÐ&6Õ

ô
ðˆÜ ˆs6 Õ —[‘[ Ó÷‰j‹lð
ô
6‹{˜aÔØ—{‘{ 2•Ø—{‘{ 2•à¬i¸¸
ÈÈWÍ
Õ8UÐW[Ð\cÕWdÓ.eÐghÓ(iØ$¤e¬E°$°yµ/ÀDÈÅOÕ2SÓ,TÐVWÓ&XØ+¬U´E¸$¸|Õ:LÓ4MÔPUÐVZÐ[gÕVhÓPiÕ4iÐmpÕ3pÐrsÓ-tðð $
Øð$
à ˜=Ø ˜+Ø ˜gØ ˜>Ø 
$
И%Ô ñq(ôB“Y€Nؘ<×(ˆÜ  ÓÛˆ ˜5× !  ñ
 3°uÑ
=×
D€FÜ 6°vÓ >Ñ€J
Ü(>¸zÓ(JÑ%€NÐÙ ð õ
Ðð
/1ÐØ˜ŸÔ N‰N˜
‰SØ5Ø 1Ñ3WÐ+Ñ-QÐó÷ ‰[‹]ß
‰[˜¨Eˆ
 ð&'×+¨BÓ/× 
ñ;
˜q Õœ˜Q˜wZ›Øœu¤U¨1¨]Õ+;Ó%<¸ ¤%¬¨aÐ0@Õ.AÓ(BÀAÓ"FØœu¤U¨1¨]Õ+;Ó%<¸ 
ñ ñ 
ñ  ñ
!ˆ
”c˜&“kð
õuKóLñuKÐkpˆÈ×I_ÑI_Ô@_”c˜.×,¨V°U¨]Õ<ÐefÒuKñLó
ñ ññ"
ñ!ˆ
”c˜&“kð
õ
ñ4ؘO׿ºÀ×ATÑATÐU[Ð]bÐUbÕAc×8dÒ8dôœU ?×#6Ñ#6°v¸u°}Õ#EÓÔJØjnòoáó
ññ
ñ" ñ
#ˆ
”c˜&“kð
õyOóPñyOÐotˆuÀ%ÐK[×KcÑKcÔBc”cÐ*×.¨v°u¨}Õ>ÐijÒyOñPó
ñ ñð ×Ñ Õ%7×%:Ñ%:×%EÑ%EÓ%GÐÓÓ Ÿt™tv§k¡k¸E kÓ&Bðô
Óà#%ÐØ#רrÓ2€KØ#רrÓ2€KØ#רrÓ2€KçØ× Ñ Ø ·±À
ÈqÓ0QÐRUÐ/VÐViÜ:И~¨k¯o©o¸mÈQÓ.OÐPSÐ-TðUØ—??Ð#3°QÓ7¸Ð<Ð<Uð
Wô
÷
Ø
" 
Ø× Ñ Ø#Ð#OÐPRÐSbÕPcÐOdÐdoØ'{ˆ9¸"¸]Õ:KÈCÐ9PÐPUÐVXÐYfÕVgÐhkÐUlÐl~ð
@ô
÷Ø× Ñ Øy‰yÑ@¨^¸BÖ-?Óð
Dô
÷—{Ø'ŸO™O¨M¸ÇÁÐQ^Ð`aÓAbÔb‘5ÐhmˆØ× Ñ ØˆjðDð
Eô
ð×ј}Ó× Ñ Ø<Ð=PÐQ^Õ=_Ð`cÐ<dðezð
{ô
ð#%ÐØÐÓ+¨rÔ×Ñð
]ô
÷Ø×ÑØ˜DŸI™IÑ%RÀ
ÈbÖ@QÓ%RÓTpð
qô
÷Ø×ÑØ·±Ñ:kÐUfÐgiÖUjÓ:kÓ1kÐ0lðmgð
hô
ð¨Ó*¨RÔ×Ñð
Eô
ð×ј9Ð>QÐR_Õ>`ÐdgÔ>gØ×Ñð
Eô
÷ Ø×Ñð
Vô
ò€Oð # ؘ ×-¨jÓ# àh×
Ó# 𠜜S ›_Ó# ð  × 8Ñ 8¸Ó Dð # ð
 # ð ˜ð
# ð Ð# ð ˜# ð Ð# ð Ð# ð Ð# ð ”d˜>×5°bÓ# ð ˜ð# ð Ð# ð ˜# ð  
ð!# ð" Ð!2ð## ð$ Ð!6Ø  بk×.>Ñ.>¸qÓ.A×.GÑ.GÔ.IÔJÑ.I¡d ˜œ3˜q›6š Ñ.IÒÐИ?Øð
Lð ð
vð zñE# ð#ùóO
ùót 
ùòLùóùòùó
ùòPùóùóDKscÕB|ä%A=|æ*| ç;|ç>| è|+è'A|&é-.|&ê|+ê+|6ë;|1ë?|6û#|<ü| ü&|+ü1|6có(V^8„dQhRRRRRRRR/#)r=rr™r>r!r0)r@s"r;rArAws0÷3ñ3Ø ð3àð3ð
ð3ðñ 3r:cóvRRlpRRlpV!V4pV!V4pV!V4pRR\V4RV^,RV^,R V!VR
4R V!VR 4R
V!VR4RV!VR4RRVP9d/\VR,P4P 44MR/RR\V4RV^,RV^,RRV9d&VR,P 4P
4M/RV!VR4RV!VR4/RR\V4RV^,RV^,RV!VR4RV!VR4//#)zE
Summarise row counts, date coverage, and null rates for key fields.
có V^8„dQhRRRR/#)r=r>ztuple[str, str]r0)r@s"r;rAÚ+_profile_data_quality.<locals>.__annotate__s÷
ñ
˜ ð
¨ñ
r:cóVR,P4pVR,P4p\P!V4'dVP R4MR\P!V4'dVP R43#R3#)ú%d %b %YúN/A)r'rnrc)ÚmnÚmxs& r;Ú _date_rangeÚ*_profile_data_quality.<locals>._date_rangeskØ
Z^‰^Ó
ˆØ
Z^‰^Ó
ˆä')§x¢x°§|¢|ˆBK‰K˜
Ô #¸Ü')§x¢x°§|¢|ˆBK‰K˜
Ó 
ð
à9>ð
ð
r:có$V^8„dQhRRRRRR/#)r=rTr>r0)r@s"r;rAr$s!÷5ðñ5r:có„WP9dR#W,P4P4^d,R
R2#)r'Ú%)rrorT)s&&r;Ú _null_pctÚ(_profile_data_quality.<locals>._null_pct‡s5Ø —j ÙØ•'—,,“.×'¨#Õ-¨cÐ2°!Ð4r:rryÚ date_fromÚdate_toÚnull_event_typeÚ
event_typeÚnull_consequenceÚ consequenceÚnull_business_unitr¥Únull_root_causeÚroot_cause_catÚ
duplicate_idsÚEventIDr'Ú
safety_energyÚtype_breakdownr¡Ú null_leaderÚleaderÚnull_buršÚ
null_topicÚtopic)rrÚ
duplicatedrÕ)rr™r*r/Úev_rangeÚse_rangeÚ llc_ranges&&& r;Ú_profile_data_qualityrGws^õ
õ
˜FÓ#€HÙ˜B“€HÙ˜CÓ €Ið Ø ”C˜“KØ ˜ !Ø ˜ !Ø ¡ ¨&°,Ó ?Ø ¡ ¨&°-Ó @Ø ¡)¨F°OÓ"DØ ¡ ¨&Ð2BÓ CØ ÈYÐZ`×ZhÑZhÔMh¤ F¨9Õ$5×$@Ñ$@Ó$B×$FÑ$FÓ$HÔ IÐnsð 
ð Ø ”C˜“GØ ˜ !Ø ˜ !Ø ÈoÐacÔNc˜b Õ1×@×JÐikØ ™I b¨(Ó ™I b¨/Ó

ð Ø ”C˜“HØ ˜ 1Ø ˜ 1Ø ™9 S¨'Ó ™9 S¨(Ó 
ð' ðr:có V^8„dQhRRRR/#)r=r}rr>ú
Optional[int]r0)r@s"r;rArA±s÷ ñ ˜sð  }ñ r:có¶\P!V4'dR#\V4P4pV'dVP 4R8XdR#\P
!VRR7p\P !V4'd\VP4#\P!RV4pV'd\VP^44#R#)Nržz(\d{1,2}):(\d{2})) rnrorTryr€Ú to_datetimerörÚhourrwÚsearchÚgroup)r}rrÚparsedÚmatchs& r;Ú_parse_time_to_hourrQ±sÜ ‡w‚wˆu‡~‚~ÙÜ ˆu‹:× Ñ Ó €Dß 4—:‘:“< Ü
^Š^˜Ô
2€FÜ ‡x‚x×ÒÜ6—;‘;ÓÐÜ IŠIÐ*¨DÓ 1€Eß Ü5—;;˜q“>Ó r:có V^8„dQhRRRR/#)r=rLrIr>rTr0)r@s"r;rArAÀs÷  # ñ #r:cóˆVfR#^Tu;8:d
^8dR#^Tu;8:d
^ 8dR#^ Tu;8:d
^8dR#R#R#)UnknownzNight (00:00-05:59)zMorning (06:00-11:59)zAfternoon (12:00-17:59)zEvening (18:00-23:59)r0)rLs&r;Ú _time_bucketrUÀsFØ ‚|ÙØˆD†}1…}ÙàˆD†~2…~Ùà ˆT†B…Ùã "r:c ó0V^8„dQhRRRRRRRRRRRR /#)
r=rrTÚ
split_dateÚpd1_nameÚpd2_namer>r!r0)r@s"r;rArAÌsL÷\ñ\Ø ð\àð\ðð\ðð \ð
ð \ð ñ
\r:c"ó WR,\P!V4,P4pVP'dR^RV/#RRlpRRlpRR lpVP R
4P 4P
\P!VR,P4PR 4VR,P4PR 4R R 7^R
7p \^\V 44p
RVP9d&VR,P4P4M/p RVP9d1WUR,P\ 4,P4MVP"R,p RV P9V R,P%\&4V R&V R,P%\(4V R&V R,P4P4p
V R,P+4P-\.4P4P14P4p\/V R,P34P544pM/p
/p^pRVP9dMWUR,P-\64P6P9RRRR7,P4MVP"R,pRVP9d2VVR,P\ 4,P4MVP"R,p/R\V4bRVR,P4P;R4bRVR,P4P;R4bRV
bR\=\V4V
, ^4bR\/\V 44bRV!\V 4\V44bR\/V P?R ^44bR!\/V P?R"^44bR#RVP9d&VR,P4P4M/bR$V!V4bR%V!V4bR&R'VP9d5VR',P4PA^
4P4M/bR(R)V P9d5V R),P4PA^4P4M/bR*R+V P9d5V R+,P4PA^4P4M/bR,R-V P9d5V R-,P4PA^4P4M/bR.V
bR/VPC4UUu/uFwpp\7V4\/V4bK uppR0\V 4'd \=\EV\V 44^4MR1R2R3\/\V44R4\=\E\V4\V44^4R\/\V44R5\V4'd)\=\E\V4\V44^4MR1R$V!V4R6R)VP9d5VR),P4PA^4P4M/R7R+VP9d5VR+,P4PA^4P4M/R8\GVP?R9\PH!R:R;74^4R<\GVP?R=\PH!R:R;74^4R>\GVP?R?\PH!R:R;74^4/
R@V PC4UUu/uFwpp\7V4\/V4bK uppRVRAV RBV/C#uuppiuuppi)CzHWhole-of-period events view with serious-event, timing, and MVE insight.ržÚtotalÚ_dfcó$V^8„dQhRRRRRR/#)r=Únrr[r>rTr0)r@s"r;rAÚ%_analyse_events.<locals>.__annotate__Ùs!÷,ð,˜, ,r:có>V\V^4, ^d,R
R2#)r.)r')r^r[s&&r;Ú_pctÚ_analyse_events.<locals>._pctÙs!Ø”C˜˜a“L•. Õ$ SÐÐ+r:có V^8„dQhRRRR/#©r=rxr>r0)r@s"r;rAr_Üs÷TñT˜T¨>ñTr:cóŒRV9d/#\Uu/uF&q\VR,V8HP44bK( up#uupi)r6)rr)rxr0s& r;Ú _cons_countsÚ%_analyse_events.<locals>._cons_countsÜsDØ  Ô ˆIÝARÓSÑAR¸A”3˜˜MÕ*¨aÑ/×7ÑARÑSùÒSs,Acó V^8„dQhRRRR/#rdr0)r@s"r;rAr_ás÷%˜ð%¨.ñ%r:có:RV9d/#VR,P4P\4PP4P 4pWP
P
.RO4(,pVP^
4P4#)Úcrp)zNone IdentifiedzUnder Investigationržrt) r rTry)rxÚvcs& r;Ú _crp_countsÚ$_analyse_events.<locals>._crp_countsástØ ˜Ô ؈IØ
Z×
Ñ
Ó
×
Ó
,×
0×
8×
GˆØ
Ò
VˆØw‰wr{×$r:rZr[Ú injury_classr6ºrkrkNz
Time of EventÚ _event_hourrUr4zmotor|vehicle|mva|trafficF)ÚcaserÁr1r&r2ÚmonthsÚevents_per_monthÚ
serious_countÚ serious_pctÚ lti_countzLost Time InjuryÚ fai_countzFirst Aid TreatmentÚevent_type_countsÚconsequence_countsÚ
crp_countsÚroot_cause_countsr9Úserious_projectsÚprojectÚserious_locationsÚlocationÚ serious_busr¥Úserious_time_bucketsÚserious_time_hoursÚserious_time_coverage_pctrlÚ
motor_vehiclerHÚ pct_totalÚserious_pct_within_mveÚ top_projectsÚ
top_locationsÚ
road_typesz Road TyperûÚ
conditionszRoad ConditionsÚ
vehicle_typeszType of vehicle involvedÚ monthly_allÚ_seriousÚ_motor)%rnrrkrlr'rrrQrUr rrnrTrrcr*r!rrpr,)rrWrXrYrarfrlrrrnÚseriousÚtime_bucket_countsÚtime_hour_countsÚ
timed_seriousÚmotorÚ
serious_motorrrs&&&&& r;Ú_analyse_eventsr•Ìsÿð
v•¤"§,¢,¨zÓ":Ñ:Õ ;× @Ñ @Ó B€BØ ‡x‡x€xؘ˜E Tõ

 ×Ü OŠO˜B˜vJŸN™NÓ6°sÓ;¸½Z¿^¹^Ó=M×=WÑ=WÐX[Ó=\ÐcfÔ ð
ó
ðô”C˜ Ó
%€FØBPÐTV×T^ÑT^ÔB^2%×4×>Ðdf€LØHUÐY[×YcÑYcÔHcˆb"×'Ô(;Ó=×DÐik×ipÑipÐqtÕiu€Gà˜'Ÿ/™/Ô)Ø!(¨Õ!9×!=Ñ!=Ô>QÓ!Rˆ
ÑØ")¨-Õ"8×"<Ñ"<¼\Ó"JˆÑØ$ 4×Cר" 1×:×AÄ#ÓܘG 2×:×A‰
àÐØÐØˆ
ð ˜2Ÿ:™:Ô  ˆ × "¤3Ó '× +× 4Ð5PÐW\ÐafÐ h×oØ+-¯7©7°3­
ðUbÐej×erÑerÔTrE˜% 
Õ3Ô4GÓI×PÐx}÷yCñyCðDGõyH€Mð$ ØR“ð$ à•Z—^‘^Ó.¨zÓ$ ð 2f•:—>#×,¨ZÓ$ ð &ð $ ð
œE¤# b£'¨FÕ"2°AÓ $ 𠜜S ›\Ó
$ ð tœC L¬#¨b«'Ó$ ð ”S˜×)Ð*<¸$ ð ”S˜×)Ð*?ÀÓ$ ð È,ÐZ\×ZdÑZdÔJd˜R  Õ-×<×FÐjlð$ ð ™l¨2Ó$ ð k "“oð$ ð ÐWgÐkm×kuÑkuÔWu˜RÐ 0Õ1×@×EÀbÓI×SÐ{}ð$ ð ÐS\Ð`g×`oÑ`oÔSo˜G .×=×BÀ1ÓOÐuwð$ ð ÐU_Ðcj×crÑcrÔUr˜W 0×?×DÀQÓQÐxzð$ ð ÐTcÐgn×gvÑgvÔTvw˜Õ/×>×CÀAÓF×PÐ|~ð!$ ð" Ð 2ð#$ ð$ Ð:J×:PÑ:PÔ:RÔSÑ:R±$°!°Qœs 1v¤s¨1£vš~Ñ:RÒ#ÔY\Ð]d×YeÒYe¤U¬9°]ÄCÈÃLÓ+QÐSTÔ%UÐknØØ ”Sœ˜U›“_Ø œœy¬¨U«´S¸³WÓ=¸qÓ œS¤ ]Ó!3Ó $Ô]`Ðaf×]gÒ]g¤e¬I´c¸-Ó6HÌ#ÈeË*Ó,UÐWXÔ&YÐmpØ ¡,¨uÓ"5Ø ÐQZÐ^c×^kÑ^kÔQk˜E ,×;×ÓMÐqsØ ÐS]Ðaf×anÑanÔSn˜U .×=×BÀ1ÓOÐtvØ œ) E§I¡I¨k¼2¿9º9È8Ô;TÓ$UÐWXÓ œ) E§I¡IÐ.?ÄÇÂÐQYÔAZÓ$[Ð]^Ó œY u§y¡yÐ1KÌRÏYÊYÐ]eÔMfÓ'gÐijÓ 
ð °;×3DÑ3DÔ3FÔGÑ3F©4¨1¨aœ˜A›¤ A£šÑ3FÒ
ˆrØ%ñG$ ð$ùó$TùóHs Ö7!`
ß!`
có(V^8„dQhRRRRRRRR/#)r=r™rTr>r!r0)r@s"r;rArA/s6÷pñpØðpà ðpððpðñ pr:códWR,\P!V4,P4p/p\P!VR,P 4P R4VR,P
4P R4RR7p\F~pW3R,V8H,pVPR4P4PV^R7pVP4U U
u/uFwrš\V 4\V
4bK up
p WF&K€ /p \FEpW3R,V8H,pRV9gKVR,P4P4W¶&KG WR,\P!V4,P4p /p
RV 9dCV R,P!4P4P#^4P4p
/pR V 9d[V R ,P!4PP%4P4P#^4P4p/pR
V 9d[V R
,P!4PP%4P4P#^
4P4p^pR V 9d!\V R ,P'44pVR,P4P4p/pR V9dm\FbpW3R,V8H,pVR ,P)4p\P*!V4'd\-\/V4^4MR
VV&Kd VPR4P4PV^R7pRRlpV!V4pRTRTRVP4U U
u/uFwrš\V 4\V
4bK up
p RT RT
RTR
TRTRTRTRVUu.uFp\V4NK upRVRV /
#uup
p iuup
p iuupi)
Summarise leading activities from Safety Energy + LLC Data.
LLC_Data is used for its richer free-text (topic, CRP focus, observations).
Safety Energy provides the authoritative counts for all three activity types.
rZr[r?rBÚ crp_focusÚ at_risk_flagrårlcó V^8„dQhRRRR/#)r=r˜r™r>rTr0)r@s"r;rAÚ&_analyse_leading.<locals>.__annotate__s÷  *˜ ñ *r:có\V4^8dR#VP\^\V44)Rp\V4^ dVP\^R
4R M(VPR\^\V4^,
4pVP 4^8XdR#VP 4VP 4,
VP 4, ^d,pV^
8”dRVR
R2#VR 8dRVR
R2#RVR
R2#)
ézinsufficient dataNzno prior baselinez
increasing (+ú.0fz%)z declining (zstable (z+.0féôÿÿÿiúÿÿÿéöÿÿÿ)r'rT)r˜ÚrecentÚpriorÚchanges& r;Ú
_trend_dirÚ$_analyse_leading.<locals>._trend_dirÜ ˆvŒ?Ùœc !¤S¨£[ÓÜ03°F³ ¸rÔ0AœS  C›[¨Ñ,ÀvÇ{Á{ÐSiÔTWÐXYÔ[^Ð_eÓ[fÐghÕ[hÓTiÐGjˆØ :‰:<˜ Ù—++“- %§*¡*£,Õ.°%·*±*³,ÕÕDˆØ BŒ;Ø" 6¨# ,¨bÐ
cŒ\Ø  ¨  ¨BÐ ˜& ˜ )r:ÚtotalsÚmonthly_by_typeÚ
monthly_totalÚ
bu_by_typeÚ top_leadersr§Úat_risk_total_llcr¨Úactivity_trendrüÚ_se_fÚ_llc_f)rnrr'rrkrlrrTrr ryrTr*rh)r™Úse_fr§rrxrvrrÚllc_frªr˜Ú
at_risk_totalr¦Úvalr¨Úms&&& r;Ú_analyse_leadingr´/sð jœBŸLšL¨Ó 5× <€Dð24€OÜ  ×!1Ñ!1Ó!3×!=Ñ!=¸cÓ!BØ!% ×!1Ñ!1Ó!3×!=Ñ!=¸cÓ!BÈôN€J÷ؘÕ(¨EÑØ—+‘+˜lÓ:¸:ÐRSÐTˆØ=D¿]¹]¼_Ô!M¹_±T°Q¤# a£&¬#¨a«&¢.¹_Ò!MˆÓñ -/€Jß'ˆØ˜Õ(¨EÑØ ˜cÖ !Ø # OÕ 4× AÑ AÓ C× KÑ KÓ MˆJÓ ñ
F• œrŸ|š|¨JÓ 8× ?€EØ"$€KØà (O× $×
‰T"X—gg“ið ð "$€JØà 'N×
‰S—ß
‰\
‰T"X—gg“ið ð!#€IØà  ×
‰S—ß
‰\
‰T"X—gg“ið ð€MؘÔܘE .Õ8ˆ
ð
"×
1×
;€Fð%'€Kؘ ß+ˆ˜OÕÑ6ˆÐ(×/ˆCÜ9;¿ºÀ#¿º¤¤u¨S£z°1Ô!5ÈCˆK˜Ó ñ
"רˆÓ *ðõ   
Ó.€Nð ˜6ؘ?ذ}×7JÑ7JÔ7LÔMÑ7L©t¨qœC F¤C¨£FšNÑ7LÒ˜:ؘ;ؘ:ؘ9ؘ]ؘ;ؘ>Ø©JÓ7©J qœC žF©JÑØ ðùó["Nùó`Nùò8sÃ6 P!Ï P'ÐP-.có$V^8„dQhRRRRRR/#)r=Ú
events_resultr6Úleading_resultr>r!r0)r@s"r;rArA¦s+÷LñLØðLàðLðñLr:c óºVPR4pVPR4pVeVeRVP9dRR/#VPR4P4P R4pVPR4P4P R4p\
P !WE.^R 7P^4pRR.VnWfR,^8„,PRR
R 7pVPR 4P4pVPR 4P4pVPPVP4p Rp
R
p \V 4\VPV ^R7Pp VPV ^R7Pp
\P !V 4^8”\P !V
4^8”\#\P$!WÍ4R&,4p
V
^8”dRMRp\'V
4R8dRM\'V
4R8dRMRpRV RV RV
R
R\V 4 R2 V
R8”dRM
V
R'8dRMR,p .p.p\V4^VR,P)4pVR,P)4pVP+4FxwppVR,Vd+VR,VdVP-\/V44K>VR,VgKNVR,V8gK^VP-\/V44Kz RVP14P3R 4R!V
R"V R#VR$VRR%/#)(zÇ
Assess whether leading activities appear associated with event outcomes.
Uses Business Unit as the common grouping dimension.
All language is deliberately cautious (associated with, may indicate).
r\r­Nr¥rz-Insufficient data for effectiveness analysis.Ú
activitiesrFr¯rZz9Insufficient overlapping months for correlation analysis.r[ÚpositiveÚnegativerCÚweakç333333ã?ÚmoderateÚstrongzA rvz association (r = rÌzW) was observed between monthly leading-activity counts and monthly event counts across z overlapping months. ušThis may warrant further review — high activity volumes and high event rates in the same periods could reflect reactive activity rather than prevention.zA negative association is consistent with leading activities having a preventive effect, though causation cannot be assumed from this data alone.z1No strong directional association was identified.Úbu_tableÚrecordsÚ
corr_valueÚ corr_noteÚhigh_activity_high_eventsÚhigh_activity_low_eventsuEffectiveness analysis uses business unit-level and monthly aggregates. All associations are indicative only — correlation does not imply causation.)rkg333333Ó¿)r!rrkrlÚrenamernÚconcatrr“Ú intersectionr¹rÚvaluesr(ÚstdrhÚcorrcoefÚabsÚmedianrir%rTr)Úev_dfr¯Ú
bu_activitiesÚ bu_eventsrÀÚ monthly_actsÚmonthly_eventsÚ
common_monthsrÂÚa_valsÚe_valsÚ directionÚstrengthÚ high_bothÚhigh_acts_low_eventsÚ
act_medianÚ
evt_medianÚburrs&& r;Ú_analyse_effectivenessrݦs&ð×
Ñ
˜
%€EØ
×
Ñ
 Ó
(€Dà ‚}˜š ¨¸u¿}¹}Ô(LØÐ—L‘L Ó ÓM€MØ—M‘M /ÓÓJ€IäyŠy˜3¸<×CÀAÓF€HØ$ /€HÔØ ÕÑ ÐX]Ð^€Hð—L‘L Ó5€LØ—]] 0×7€Nà ×&×3°N×4HÑ4HÓI€MØ"&€JØK€Iä
ˆ=Óœ_Ô×% mÀÐB×IˆØ×
À!ÐD×KˆÜ
6Š6&>˜ ¤"§&¢&¨£.°1Ô"4ÜœrŸ{š{¨6Ó:¸AˆJØ&0°1¤n™
¸*ˆIÜ"% j£/°CÔ"7™ÌCÐPZËOÐ^aÔLa¹jÐgoˆXJ˜a  ˜{Ð*<¸Ð<LðM[ä&Ð&;ð
! að
! aðGõ Hð
ð€IØ&(Ðä
ˆ8ƒ}˜ÔؘlÕ
ؘ'×0ˆ
Ø×*‰GˆBØ  .°3°xµ=ÀJÔ3NØ× Ñ ¤ Ö" 0°S¸µ]ÀZÖ5OØ$×+¬C°«GÖ H×*×2°9Ó# "Ð%9Øð
]ð
ð
r:c
ó,V^8„dQhRRRRRRRRRR/#© r=rr™rTr>r!r0)r@s"r;rArAùsA÷FñFØ ðFàðFð
ðFðð Fð
ñ Fr:cóWR,\P!V4,pW"R,\P!V4,pWR,\P!V4,p\V.RO4p\V.RO4p\VRR.4p RRlp
V
!V4p V
!V4p V
!V 4p
\4pV P 4F!wppWï;;,V^,,
uu&K# V P 4FwppWï;;,V,
uu&K V
P 4FwppWï;;,V,
uu&K \ \