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

272 lines
43 KiB
Plaintext
Raw Normal View History

2026-04-20 15:23:18 +12:00
+
@×iďxă óţRt^RIt^RIt^RIt]P
!R4^RIHt^RI t
^RI H t ^RI
HtHtHtHtHt^RIHt^RIHt^RIHtHt^RIHt^R IHt]!^ ^2^T4t]!^^µ^ę4t]!^^n^G4t ]!^^™^F4t!]!^{^Á^C4t"]!^^5^Ť4t#]!^d^t^4t$]t%]t&] t'R
t(R t)R t*R
t+Rt,Rt-Rt.Rt/](])]*]+],]-].]/.t0](t1])t2Rt3Rt4Rt5Rt6Rt7Rt8Rt9Rt:R#Rlt;]<R8Xd];!RRRR R!RR"7R#R#)$a
SHEQ Incident Analysis Engine
Generates charts and a DOCX report comparing two Project Director periods.
Usage:
from analysis import run_analysis
run_analysis("All_Events__5_.xlsx", "2024-01-01", "2025-04-01",
"Matthew Arthur", "Manga", output_dir="output")
Agg)ÚDocument)ÚInchesÚPtÚCmÚRGBColorÚEmu)ÚWD_ALIGN_PARAGRAPH)ÚWD_TABLE_ALIGNMENT)ÚqnÚnsdecls)Ú parse_xml)ÚBytesIOz#0b3254z#13b5eaz#006e47z#009946z#7bc143z#96358dz#d97706z#dc2626cóva\P!V4p\P!VR,4VR&W3R,\P!V4,P 4pVR,P
P VR&VR,P
PVR&VR,P
PR4VR&VR,P
P4VR&VR,P
PR4VR&VR,PV3R l4VR
&V#) z0Load Excel, filter by date range, add PD column.ú
Event DateÚYearÚMonthz%bÚ MonthNameÚDOWÚMÚ YearMonthcóB<V\P!S48dR#R#)Úpd1Úpd2)ÚpdÚ Timestamp)Ú
split_dates&€Úc:\Users\mattc\sheq\analysis.pyÚ<lambda>Ú"load_and_prepare.<locals>.<lambda>Msř€1śrź|š|¨JÓ7B¸ÚPD) rÚ
read_excelÚ to_datetimerÚcopyÚdtÚyearÚmonthÚstrftimeÚday_nameÚ to_periodÚapply)ÚfilepathÚ
start_daterÚdfs&&f rÚload_and_preparer0Bř€ä ŹŠxÓ €BÜ—~~ Ő&6Ó7€B€|ŃŘ ¤§ ˘ ¨ZÓ 8Ń 8Ő 9× >Ń >Ó @€BŘ!×$×)€B€v"×%×+€B€wŐ&×)×2°4Ó8€B€{ ×#×.€B€uŐ&×)×3°CÓ8€B€{×€B€t €Ir!có&.pVP4Ffp\V4PR4FEpVP4pV'gKRVP 49gK4VP V4KG Kh \ P!V4#)z2Split multi-value body part entries and normalise.Ú unspecified)ÚdropnaÚstrÚsplitÚstripÚlowerÚappendrÚSeries)ÚseriesÚpartsÚvalÚparts& rÚget_body_partsr?Rshŕ €EŘŹ}‰}ŽÜ“H—NN '—::“<‰t
¨TŻZ©Z«\Ö ô
Ź9Š9 Đr!có|VP4VPV^ČRRR7\P!V4R#)éČÚtightÚwhite)ÚdpiÚ bbox_inchesÚ facecolorN)Ú tight_layoutÚsavefigÚpltÚclose)ÚfigÚpaths&&rÚ_saverMas-Ř×ŃÔ؇KK#¨7¸g€KÔ‡IIc†Nr!có^RIHpVPPUu.uFqPNK ppRV9dR\
P R&R#RV9dR\
P R&R#R\
P R&R#uupi)z9Configure matplotlib to use Source Sans Pro if available.NúSource Sans Proz font.familyz
Source Sans 3z
sans-serif)Úmatplotlib.font_managerÚ font_managerÚ fontManagerÚttflistÚnamerIÚrcParams)ÚfmÚfÚ availables rÚ_setup_chart_stylerYgsfĺ(Ř!#§ˇ×!7Ň!7Ó8Ń!7A—Ń!7€IĐ%Ř&7ŚŹ IÔ %Ř&5ŚŹ #ŕ&2ŚŹ #ůň
9sźBc ó€\4/pWR,R8H,pWR,R8H,p\\\\.p\
P !RMR7wršVR,P4PR4p VR,P4PR4p \P!WĽRR7p
VPRR.4P4P^R 7PV
^R 7p\!\#V
44pV
Uu.uFpVP%R
4NK ppVP'R\P(!^V
R 74P*pVP'R\P(!^V
R 74P*pV
P-VV\.VR R
R7V
P-VVV\0VR R
R7\P2!V4PR4pVV
9d\5V
4P7V4pV
P9VR,
\RRR R7V
P;VR,
\\VV,4^4R,R^ \RR7V
P=V4V
P?V^-R^R7V
PAR^R\.R7V
PCR4V
PERR 7V
PFR!,PIR"4V
PFR,PIR"4\JPLPOVR#4p\QV V4VVR$&VR%,PS4P6R&,pVR%,PS4PV^R 7pVR%,PS4PV^R 7p\
P !RNR7wrš\TPV!\#V44pR'pV
PYVV^, ,
VP*VV\.R(7V
PYVV^, ,VP*VV\0R(7V
P[V4V
P]V^
R)7V
P_4V
PAR*^R\.R7V
PE4V
PFR!,PIR"4V
PFR,PIR"4\a\cVP*VP*44F{wpwppV
P;VR+,VV^, ,
\eV4R,^ \.R-7V
P;VR+,VV^, ,\eV4R,^ \0R-7K} \JPLPOVR.4p\QV V4VVR/&.ROOp\
P !^^RPR7wp p \cV Wg.W.4Fkwp
p!p"V!R0,PS4PV^R 7p#V
PgV#P*VR1V^ŚR2^ /R37V
PAV"^
R\.R7Km \JPLPOVR44p\QV V4VVR5&.RQOp$\
P !RRR7wrš\TPV!\#V$44p%R'p&VR6,PS4PV$^R 7p'VR6,PS4PV$^R 7p(V
P-V%V&^, ,
V'P*V&V\.R(7p)V
P-V%V&^, ,V(P*V&V\0R(7p*V
P=V%4T
P?V$U+u.uF p+V+R7,NK up+4V
PAR8^R\.R7V
PE4V
PFR!,PIR"4V
PFR,PIR"4V)p,V,Pi4^8”gKV
P;V,Pk4V,Pm4^, ,V,Pi4R,\e\oV,Pi444R,^ R97K V*p,V,Pi4^8”gKV
P;V,Pk4V,Pm4^, ,V,Pi4R,\e\oV,Pi444R,^ R97K \JPLPOVR:4p\QV V4VVR;&.RSOp-\
P !RRR7wrš\TPV!\#V-44pR'pVR<,PS4PV-^R 7p.VR<,PS4PV-^R 7p/V
PYVV^, ,
V.P*VV\.R(7V
PYVV^, ,V/P*VV\0R(7V
P[V4V
P]V-^
R)7V
P_4V
PAR=^R\.R7V
PE4V
PFR!,PIR"4V
PFR,PIR"4\JPLPOVR>4p\QV V4VVR?&VR@,PS4p0V0V0P6PqRARB.4(,Ps^4p1V1P6p2\
P !RTR7wrš\TPV!\#V244pVR@,PS4PV2^R 7p3VR@,PS4PV2^R 7p4V
PYVV^, ,
V3P*VV\.R(7V
PYVV^, ,V4P*VV\0R(7V
P[V4V
P]V2^ R)7V
P_4V
PARC^R\.R7V
PE4V
PFR!,PIR"4V
PFR,PIR"4\JPLPOVRD4p\QV V4VVRE&\uVRF,4p5\#V54^8”EdV5PS4Ps^
4p6\
P !RUR7wršV
PY\!\#V644V6P*\RG7V
P[\!\#V6444V
P]V6P6^
R)7V
P_4\aV6P*4F-wpp7V
P;V7RH,V\eV74R,^ RRI7K/ V
PARJ^R\.R7V
PFR!,PIR"4V
PFR,PIR"4\JPLPOVRK4p\QV V4VVRL&V#uupiuup+i)Vz5Generate all comparison charts, return dict of paths.r"rr)Úfigsizerr)Úfreqr)Ú
fill_valuez%b %y)Úindexgffffffć?gÍĚĚĚĚĚě?)ÚcolorÚlabelÚwidthÚalpha)Úbottomr_r`rarbgŕ?z--çř?)rr_Ú linestyleÚ linewidthrbg333333Ó?gffffffî?z
PD TransitionÚleft)Úfontsizer_ÚhaÚright)Úrotationrirhz"Monthly Events by Project DirectorÚbold)rhÚ
fontweightr_ÚEventsz upper right)ÚlocÚtopFzmonthly_by_pd.pngÚ
monthly_by_pdú
Event TypeşNéNgffffffÖ?)r`r_)rhzEvent Types by Project Directorgš™™™™™É?Úcenter)Úvarhr_zevent_type_by_pd.pngÚevent_type_by_pdúActual Consequencez%1.0f%%rh)ÚlabelsÚautopctÚcolorsÚ
startangleÚ textpropszconsequence_by_pd.pngÚconsequence_by_pdr:NéNzEvents by Day of Week)rirhz
dow_by_pd.pngÚ dow_by_pdúRoot Cause Categoryz)Root Cause Categories by Project Directorzrootcause_by_pd.pngÚrootcause_by_pdÚ CRPInvolvedzNone IdentifiedzUnder Investigationz+Critical Risk Protocols by Project Directorz
crp_by_pd.pngÚ crp_by_pdúBodily Location)r_gš™™™™™ą?)rvrhrmzTop Injured Body Partszbody_parts.pngÚ
body_parts)é
é)é é©Ú
NegligibleÚMinorÚModerateÚMajor)r‰g @)ÚMondayÚTuesdayÚ WednesdayÚThursdayÚFridayÚSaturdayÚSunday)r‰r©zExternal FactorsÚPeoplezProduction / DeliveryÚProcessÚPlanningÚ Providers)r‰g@)rtr);rYÚDARK_GREEN_HEXÚ AMBER_HEXÚRED_HEXÚ
PURPLE_HEXrIÚsubplotsÚminr+ÚmaxrÚ period_rangeÚgroupbyÚsizeÚunstackÚreindexÚrangeÚlenr)Úgetr:ÚvaluesÚbarÚMA_HEXÚMG_HEXrÚlistr^ÚaxvlineÚtextÚ
set_xticksÚset_xticklabelsÚ set_titleÚ
set_ylabelÚlegendÚspinesÚ set_visibleÚosrLÚjoinrMÚ value_countsÚnpÚarangeÚbarhÚ
set_yticksÚset_yticklabelsÚ invert_yaxisÚ enumerateÚzipr5ÚpieÚ
get_heightÚget_xÚ get_widthÚintÚisinÚheadr?)8r/Úpd1_nameÚpd2_namerÚ
output_dirÚchartsrrÚ CONS_COLORSrKÚaxÚ start_periodÚ
end_periodÚ
months_allÚmonthlyrÚmryÚma_valsÚmg_valsÚsplit_mÚ trans_idxÚpÚ evt_typesÚma_evtÚmg_evtÚv1Úv2Ú
cons_orderÚaxesÚsubÚtitleÚdataÚ dow_orderÚx_arrÚma_dÚmg_dÚb1Úb2Úrc_catsÚma_rcÚmg_rcÚcrp_allÚ
crp_activeÚcrp_catsÚma_cÚmg_cÚ bp_seriesÚbp_topÚvs8&&&&& rÚgenerate_chartsrüs äÔŘ
€FŘ
ŤXŃ
Ő
€CŘ
ŤXŃ
Ő
€Cô"¤9¬g´B€KôŹlŠl +G€CŘ#×)×3°CÓ8€LŘ!×'×1°#Ó6€JÜ ŔÔD€JŘŹj‰j+ tĐ-×4×ĐJ×RĐS]ĐjkĐl€GÜ
Śc*€AŮ+5Ó
6©: aaŹj‰jÖ!©:€FĐ
Źk‰k§˘¨1°JÔ!?ÓG€GŘŹk‰k§˘¨1°JÔ!?ÓG€G؇FF1gśV¨8¸3Ŕc€FÔ‡FF1gg¬V¸8Č3ĐVY€FÔŹlŠl&×Ó5€GŘÜÓ*¨7Ó3 Ř
Ź
Y •_¬G¸tČsĐZ]
Ô
Ź C•¤¤S¨°7Ő):Ó%;¸QÓ!?Ŕ$Ő!FČؤ'¨fđ ô‡MMŘ×ѨwŔĐÔ‡LČvÔ]c€LÔ‡MM؇II-€IÔ Ř‡II× Ń  Ô‡II×" 
ŹŹ ZĐ!4Ó5€AÜ #q„MŘ€Fđ ×/×5°bŐ9€IŘ
Ő
×
-×
5°iČAĐ
N€FŘ
Ő
×
-×
5°iČAĐ
N€FÜŹlŠl *G€CÜ
Ź Š ”#i“.Ó!€AŘ €A؇GGAA•ŤIv—}} a¨xĽv€GÔ‡GGAA•ŤIv—}} a¨xĽv€GÔ‡MMŘ×Ńy¨2ĐÔ‡O؇L2¸RČFÔZ`€LÔ‡II„K؇II× Ń  Ô‡II×"  ¤ V§]ˇ]°F·M±MÓ!BÖC‰ ‰8BŘ
ŹS•!a !ťeť)¤S¨ŁW°ŔAĚVÔ
ŹS•!a !ťeť)¤S¨ŁW°ŔAĚVÖDô ŹŹ ZĐ!7Ó8€AÜ #q„MŘ!"€FĐ Ńň>€JÜ Q ¨8Ô4I€CÜd S Đ0DÖE‰CŘĐ(×7×
ĐWXĐYŘ
ŹtŹ{‰{ :°yČĐadŘ$ ađ ô
Ź U R°FÄ& ÖFô
ŹŹ ZĐ!8Ó9€AÜ #q„MŘ"#€FĐ Ńň_€IÜŹlŠl 6Ô*G€CÜ ŹIŠI”c)“nÓ %€EŘ €AŘ uŤ:× $× ,¨YŔ1Đ E€DŘ uŤ:× $× ,¨YŔ1Đ E€DŘ Ź
tź{™{¨A°XÄVÓ L€BŘ Ź
tź{™{¨A°XÄVÓ L€B؇MMŘ×ѡyÓ1ˇy !ˇyчL(°2Ŕ&ÔPV€LÔ‡II„K؇II× Ń  Ô‡II×" 
Ř Ź<‰<> Ř ŹG‰GA—GG“I § ˇ Ł
°Ő 1Ő1°1·<±<ł>ŔCŐ3GĚĚSĐQR×Q]ŃQ]ÓQ_ÓM`ÓIaب!đ
ö
óŘ Ź<‰<> Ř ŹG‰GA—GG“I § ˇ Ł
°Ő 1Ő1°1·<±<ł>ŔCŐ3GĚĚSĐQR×Q]ŃQ]ÓQ_ÓM`ÓIaب!đ
ö
ô ŹŹ Ó1€AÜ #q„MŘ€Fňj€GÜŹlŠl *G€CÜ
Ź Š ”#g“,Ó€AŘ €AŘ Đ &× 5× =¸gĐRSĐ T€EŘ Đ &× 5× =¸gĐRSĐ T€E؇GGAA•ŤIu—|| Q¨hĽf€GÔ‡GGAA•ŤIu—|| Q¨hĽf€GÔ‡MMŘ×ŃĐÔ‡O؇L<ŔrĐV\Ôdj€LÔ‡II„K؇II× Ń  Ô‡II×" 
ŹŹ ZĐ!6Ó7€AÜ #q„MŘ !€FĐ ŃđŐ×.€GŘ'ź-™-×,Đ.?ĐAVĐ-WÓY×^Đ_`Óa€JŘ×Ń€HÜŹlŠl 8Ô,G€CÜ
Ź Š ”#h“-Ó €AŘ  × 4°XČ!Đ L€DŘ  × 4°XČ!Đ L€D؇GGAA•ŤIt—{{ A¨XĽV€GÔ‡GGAA•ŤIt—{{ A¨XĽV€GÔ‡MMŘ×Ńx¨!ĐÔ‡O؇LĐX^Ôfl€LÔ‡II„K؇II× Ń  Ô‡II×" 
ŹŹ Ó1€AÜ #q„MŘ€FôrĐ"3Ő5€IÜ
9~ŐŘ×)×.¨rÓ2Ü—,’, vÔ.‰Ř
Ź”c&“kÓ" F§MˇMĽÔ
Ź
”eśC 
×Ń6ź<™<°"ĐÔ
ŹÔÜfźm™mÖ,‰DA ŹG‰GA•G ¨8¸bČV 
Ź ĐŔvÔU[ Ô
Ź ‰ ×$ 
Ź ‰ ×&  ŹG‰GŹL‰LĐ%5Ó 6Ü
c
Ř ŕ €Můň_7ůňF2s Ä|6ß|;cóŽ\R\R4 RV R24pVPP4P V4R#)z)Apply background shading to a table cell.z<w:shd ręz w:fill="z" w:val="clear"/>N)r
r Ú_tcÚget_or_add_tcPrr9)ÚcellÚ color_hexÚshadings&& rÚ_set_cell_shadingrs;ä'¤'¨#Ł, ¨y¸¸ ĐCTĐV€G؇HŃÓ×% .r!cóRVP^\V4,\V4R7p\PVnRVn\
V4F¸wrVVP^,PV,pRVn VP^,pVPV4p RV n \^ 4V Pn\!^˙^˙^˙4V PP"nRV Pn\)VR4 \
V4wr«\
V 4wrÍVPV
^,,PV ,pRVn VP^,pVP\+V
44p \^ 4V PnRV PnV
^,^8XdRMRp\)W~4  \
V4F9wr_VPF$p \-V4V PV,nK& K; V#) z!Add a formatted comparison table.)ÚrowsÚcolsz
Table GridÚTrOÚ0b3254ÚF0F5FAÚFFFFFF)Ú add_tabler©r
ÚLEFTÚ alignmentÚstylerÂrÚcellsr±Ú
paragraphsÚadd_runrlrÚfontrĄrr_ÚrgbrTrr5rra)ÚdocÚheadersrÚcol_widths_inchesÚtablerŕrÚrunÚriÚrowÚcir=Úbgręs&&&& rÚ_add_styled_tabler sŕ ŹM‰Mq¤3 tŁ9ť}´3°wł< @€EÜ(×-€E„OŘ€E„Kô"‰ŘŹz‰z!Ť}×" %ŘŚ Ř ŹO‰O ŘŹi‰i‹lŘŚÜ1›ŹŚ
Ü% d¨D°$Ó7ŹŹÔŘ)ŹŚ
ÜÖT–?‰Ü  –~‰G—:‘:b 1ťfŐ%×+¨BŐ/DŚIŘ Ő"—))śC %qECŹH‰HŚMŘ-CŹH‰HŚMŘ !ťV qś[¨h  Đ,‰Ř—:”:CÜ!'¨ŁCŹI‰IaŤLÖ óń €Lr!có(,aaC€\4oCSCPR,pRVPn\ ^ 4VPn^^\ 3^^
\33Frwrxp SCPRV 2,p
RV
Pn\ V4V
PnWšPPn RV
Pn
Kt WR,R8H,p WR,R8H,p \V4p
\^\P!V4VR,P4,
P R , 4p\^VR,P4\P!V4,
P R , ^,4p\V 4^8”d'V R,P4P#R
4MR p\V 4^8”d'V R,P4P#R
4MR p\V 4^8”d'V R,P4P#R
4MR p\V 4^8”d'V R,P4P#R
4MR pSCP%R 4SCP%R 4SCP%4p\&P(VnVP-R
4p\ ^4VPnRVn
RVPn\ VPPn SCP%4p\&P(VnVP-R4p\ ^4VPnRVPn\VPPn SCP%4p\&P(VnVP-V RV R24p\ ^4VPnRVPn\VPPn SCP%R 4SCP%4p\&P(VnVP-R4p\ ^
4VPnRVn
RVPn\ VPPn SCP%4p\&P(VnVP-V R24pRVn
\ VPPn VP-RV RV R24p\.VPPn VP-V R24pRVn
\VPPn VP-RV RV R24p\.VPPn SCP%R 4SCP%4p\&P(VnVP-R4p\ ^
4VPn\.VPPn SCP14VC3RlpVC3RlpRVC3RllpVC3RlpRŚVVC3RllpRpV!R4V!RV
R V R!V R"24W»R#,R$8H,pWĚR#,R$8H,pW»R#,R%8H,pWĚR#,R%8H,pV!V 4p V!V 4p!\W»R#,R&8H,4p"\WĚR#,R&8H,4p#\W»R',P3.RŤO4,4p$\WĚR',P3.RŤO4,4p%\5SCR W.R(V RV 2V RV 2.R)VR*
R+2VR*
R+2.R,\7\V 44\7\V 44.R-\V 4V, R.
\V 4V, R.
.R/\V4 R0\V4\\V 4^4, ^d,R.
R12\V4 R0\V4\\V 4^4, ^d,R.
R12.R2\V4 R0\V4\\V 4^4, ^d,R.
R12\V4 R0\V4\\V 4^4, ^d,R.
R12.R3\7V P9R4^44\7V!P9R4^44.R5\7V P9R6^44\7V!P9R6^44.R7V" R0V"\\V 4^4, ^d,R.
R12V# R0V#\\V 4^4, ^d,R.
R12.R8V$ R0V$\\V 4^4, ^d,R.
R12V% R0V%\\V 4^4, ^d,R.
R12.R9V R:,P;4P=4R*
V R:,P;4P=4R*
.R;V R<,P;4P=4R*
V R<,P;4P=4R*
.. .RŽO4SCP%R 4V!R=4\V 4V, p&\V 4V, p'T!R>V'V&8”dR?MR@ RAV R0V'R.
RBV&R.
RCV%\\V 4^4, ^d,R.
RDV$\\V 4^4, ^d,R.
RE2
4V!RF\V4 RAV RG\V4 RAV R0\V4\\V 4^4, ^d,R.
RD\V4\\V 4^4, ^d,R.
RH2
4V!RIV#\\V 4^4, ^d,R.
RJV RGV"\\V 4^4, ^d,R.
RJV RK2 4V P9R4^4p(V!P9R4^4p)V)V(8”dV!V) RLV RMV( RAV RK24SCP14V!RN4V!RO4V!RPRQ4SCP14V!RR4V!RSR4VR#,P?4P@p*.p+V*p,\W»R#,V,8H,4p-\WĚR#,V,8H,4p.V+PCV,\7V-4V-\\V 4^4, ^d,R.
RT2\7V.4V.\\V 4^4, ^d,R.