From ceb4103ec4eefe0f0b6444db2bab6efbe6526f5e Mon Sep 17 00:00:00 2001 From: Marko Djordjevic Date: Sun, 15 Feb 2026 21:13:20 +0100 Subject: [PATCH] fix(ml): parse datetime column and fix TA-Lib pattern names - Add parse_dates parameter when loading enriched CSV - Strip timezone from annotation timestamps to match data - Fix pattern names: CDLTHREEWHITESOLDIERS -> CDL3WHITESOLDIERS - Fix pattern names: CDLTHREEBLACKCROWS -> CDL3BLACKCROWS --- .../annotation_ingestion.cpython-313.pyc | Bin 20451 -> 20571 bytes .../ml/app/__pycache__/db.cpython-313.pyc | Bin 0 -> 4179 bytes services/ml/app/annotation_ingestion.py | 6 +++--- services/ml/config/pipeline.yaml | 4 ++-- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 179 bytes .../__pycache__/evaluation.cpython-313.pyc | Bin 0 -> 7663 bytes .../__pycache__/train.cpython-313.pyc | Bin 0 -> 18487 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 186 bytes .../__pycache__/random_forest.cpython-313.pyc | Bin 0 -> 4182 bytes .../__pycache__/xgboost_model.cpython-313.pyc | Bin 0 -> 4673 bytes 10 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 services/ml/app/__pycache__/db.cpython-313.pyc create mode 100644 services/ml/training/__pycache__/__init__.cpython-313.pyc create mode 100644 services/ml/training/__pycache__/evaluation.cpython-313.pyc create mode 100644 services/ml/training/__pycache__/train.cpython-313.pyc create mode 100644 services/ml/training/models/__pycache__/__init__.cpython-313.pyc create mode 100644 services/ml/training/models/__pycache__/random_forest.cpython-313.pyc create mode 100644 services/ml/training/models/__pycache__/xgboost_model.cpython-313.pyc diff --git a/services/ml/app/__pycache__/annotation_ingestion.cpython-313.pyc b/services/ml/app/__pycache__/annotation_ingestion.cpython-313.pyc index 9007ce58be358198d289e26452ab06285413caa3..8af78d05e709a5ff69027bb67ac49e6a7f1675d6 100644 GIT binary patch delta 1234 zcmb7?Uu;u#6vyxHw!K~N?f-U`+pfJWxRt`n(5_LoFvnp0>2|5>^%}I%Sw|_2<#yZ_ z1wxjn2^d3ShQ z@0{~J=XdY#!8Eyloj4vk96UqU)aDE21GgOii0qIBjvv?t{lS8X-5-GI-~gL*!HnAn zv(MY$=U}JHVxa|Tf@KV|9_!LbHi9o4Cmi&LV~)M32#iuGmgTL#Uq~uT&=rmGbGLF&bl8atX4VUfz69 z+_Nn1nSW_T%zThp4TzV|TsU)m_vidfb|uhzFEF?q7@YU71onb6*=PK<>370+^O+8A zsgKKa7{7Mjv4QHkB zX0b9})F!Hj%UVf4hmlK&7Z8JpS;W(bZzvL+?m<0|cnU%PCZlghoHgza8$?>~v2M3! zg7x~MF|#kq@(SBS6w?k?GlM56narvg#zr=RD{~6&xCFMu!Ntrji&e2IZE!ym=4=YT zgN?$i=b}UaX{3kPAv@A(;t~$yoe?+j>u*r=1ZfD91-(`rKU}C6YjAFKmMlU_PPu=; z)@$S5MKup^%X|4%D*vSaqqYi5vSgj>n%l7K9fCjP1#$;&9xU}&X+nc9Oipf_sA@;b nB^_^U!&WNRN2{e$QP-EyOhVWZ-yzUd{~kuO8^~`^%uf9abmkMT delta 1144 zcmb7?Urbwd6vywm?Y*?UZ7D5XZA*J^2Uv@A7+DqBR>zhtgHk%Vxw=^Y)vaw1xache z_pm8hwuc#Gwv#O^+e9DK2sVb?Cm$9)co@0@dgzy9)#+R3iw_BF5D9;Sm4OtI2TIux(%zL z)|6FX#uSj9<8-?Qsz4dd*82%#{mtIn!Es6E(j6KMyYcOK5LX9$I2UdOAHMJLSwv05 zH=EF6`arr=9X;7bAmGF9ttZu7w?DPM(pWMe*ldSapo<8=aE!Y?d*d@waxnUWX zy+vu;Ef91x{R#$Phq(GzM{eJQ{C*sO}tQr}^K| z0$SM3sZKl-jYAR_qOu>d|8ShdDO{dSSBv3Y*cbQXpV1Broo7t;ceuMP^>a`-E!xIa zc!fQ>zr-aP3j^%Z90!eJVX~;;36_S(qOlJblnlqighTtq^9wnq1J_aLR z`h2GfP0v;GTw|!vUrsT+^nRW2E(TKwWvr%Dsn&q97ftE0Y6HyTXZud> z9;M7tLObCthBZrNYTU4svW|^ZCXGY1QX;%c(6N+$r#A4kxsiTdgi|&_=kykPwX~(o2LLgb?8o!dbKHunF>3 zkF9c>MQFdVV!{!H$Dex=7GAUBVrC~!44iaryUVf_*9ZCpK^0UH_hcesgKB$%SFou^ z0Xx2t=>i9SnrXLK6O#Eu#sj!9xBx5oQMTLjHFemW>Kjr^_*?d{V~xpQ*|ArC#NHv< z^1ZhcUm9A5uW)Cs3_70ADcxU?TP8ROHwm=OxJB?2=*HG;d&ehEOpO)O#$CLfJADt7 Cg79Mi diff --git a/services/ml/app/__pycache__/db.cpython-313.pyc b/services/ml/app/__pycache__/db.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..311253df79514b8981ceb3d8ee8280b112ce021a GIT binary patch literal 4179 zcmai1O>7j&6|SD?`Rn=j*v2*n8smV6z|1b-1ru0dV_-eT*y}c|R*cf>nJ(K6J>5ff zkHO~R>>-=%YP0Mj6wqG0+DP%aj<)1dBqgFeH`!NLW9!?4q>v=MmKK&G{T`P)hNS3g`C?MMi7)Y5zNFOB#P@o6 zDXF!IukE$++NB*^d`E@)n6%{sJt*HMbx563m$Y+$C++zJ+_hWk&bLdu2E1fPKGuW! zYla{l9SEqqyO6Xe-_h@Nmr182b|KQ0_ey*7zI;;hNSjS z-N#l*_lzgqyYQ_rtk_CHv9MS)4FeZ#%``;CP(=${78{ooLz%%PY}n$oNkn@Vi(?mo zO6Ig8&IrQPtY(QNQ?2M&EE981Q?VsV?_M0#i?g^iFJfaxGw@3yEo@iHj|GPn9GhIXTZY0#+XI*UJY z5Gc=7=+YcH%sw9H!h zGfT1NX^@2wdy@>^HcvqZ`G>oVCSkO_0oHqfQbYb`Dp0&feZ45nUs`B8)nvIoP*c{_ z(+3v92M&prt=JU{Cf)<-w?Q$#OQn97z(U!=`n1J#6X}KQtXaaW1K3cpVPygBuHoyp zmMv&DAWyaku&HBNF$@zVn z&zCWc<6C76&j^x&b24o$Yh}zt%V3CUZAP9|01o0RlD_XKu zDY1u0j=6Vx}T%ReCBEEzQwV>hT?YuOH(VYtD(0RhaN{$pPj#d^zP^~zfyTL zyc!)@JpVYkgbq#wDPTW)(8`mS{~ddZa@T<%@%$Ufr#82m%Ci+V$pI>d4~7A9&6;!MV3$7kUX^d022lIGFL#HBP(c}AkaI<4+z8RSsEo0qpakp=+vY*{T331pmspVbN7 zB6=YpU+BZJpN)Obcdzo@zu8~qyZ^+e9YaAVLy19*|FP9R*t%&$w-1TTUJcl(!?J;P zqswRx-Qz^~PBPnWYjsYr6}R{Q@=T-C-aTlVJMNw4(w>EX2xr|ArB+rE2fw$>>lP7E z(+HO>sJc!HBD9;DJuA*Y7^#K6w5V93T5t)BxKF$cwVPUK)N8YtU}qbnHlx3IT5Q6b zIu!Q2dE{u%Au*H5q#L^crxaD~Yu@}4(M|k)X+d~j!@6p@+6*@yiF*s-604GGbcSNNE3f_u|lo$LmY2#}Xd}p9Y0b zgTD-ZBK+$Y9(V9>s}=Tq5I({Eir&U=D;$^R@-Fn?~gL-#7*L&D$| zo(dPREh^%6pNM^|`c-imL&h|U^P*;4bF1Za-CM4s&MTHZI5FbdW?+EgJUQpG+YJ&td!9U*jn1Z7D!k9 z2bb$R@9bKNtOX8N{h5sr?|Wm@7f5&(BhOoruw$K1thcnU$KvbB)bo%}@GSbDCs3k$ zsq)bG==^GY6!`oo*s&JqT;yK_liUP%r}qV7-+%V`xPu!B= start_time) & (df['time'] <= end_time) @@ -504,7 +504,7 @@ def run_annotation_ingestion( logger.info("Running annotation ingestion stage") # Load enriched data - enriched_df = pd.read_csv(enriched_path) + enriched_df = pd.read_csv(enriched_path, parse_dates=['time']) logger.info(f"Loaded enriched data: {enriched_df.shape}") # Process annotations diff --git a/services/ml/config/pipeline.yaml b/services/ml/config/pipeline.yaml index 0f065b7..918d7b8 100644 --- a/services/ml/config/pipeline.yaml +++ b/services/ml/config/pipeline.yaml @@ -86,8 +86,8 @@ stages: - "CDLHARAMI" - "CDLPIERCING" - "CDLDARKCLOUDCOVER" - - "CDLTHREEWHITESOLDIERS" - - "CDLTHREEBLACKCROWS" + - "CDL3WHITESOLDIERS" + - "CDL3BLACKCROWS" # Label merge strategy: "human_priority", "programmatic_priority", "both" merge_strategy: "human_priority" diff --git a/services/ml/training/__pycache__/__init__.cpython-313.pyc b/services/ml/training/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24be242721253a9b252d4521758fd101812e366f GIT binary patch literal 179 zcmey&%ge<81TiNjW`gL)AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkqXp{fzwFR1lG$ zQ<{>RSFB%9l%JKFU6QGvlv$FTpQoRkn3s~18lRY#mtT@tl3%1>oLW?tnVedzpPQp! zQk0mPmzkHYA0H2-OXB183My}L*yQG?l;)(`6|n-X06C!;#Q4a}$jDg43}gWSl~*tD literal 0 HcmV?d00001 diff --git a/services/ml/training/__pycache__/evaluation.cpython-313.pyc b/services/ml/training/__pycache__/evaluation.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4f842e5c2fc24a239ee87c8419c149fee26f987 GIT binary patch literal 7663 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 literal 0 HcmV?d00001 diff --git a/services/ml/training/__pycache__/train.cpython-313.pyc b/services/ml/training/__pycache__/train.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86eece007ba56841f086474e2899fd09f11661e8 GIT binary patch literal 18487 zcmdUXZEzb$cHrQ9@C}k62@w1k@l&8cQj|nWBt=;gB~l_qO2P;-*Q5^%5d#VmFrWvZ zBqEy)cQ?sW&R#@avJst+GQ8`Q>DX1~-fdl&y1hE3^5eYsQ8y3}13RX7wG~(8T(`NS zBJH})Kd$a|4+aBLuw`Ydu5u${y8HF(*RNl{e*N`EkIiNS0nhaNcfYp7$tfXJO{m6IoQgtu>IwC@hST7`9BL;j#w)qX@hYxr+|JoC4c$cbcnw!GUdz?uG&$iI zcXH10I<9Wq#knv{KT$v4z%}5wVWM%oiEF}f;{-LnhucFDvr6wNsflvfjNqekT8h!8 z0R=8|MuNy8lxgczh-t2!HqV;9Q*y2pqb;8Ux6baRZSbp@)s@Hie+xaN)d0(f40L53 zaZSy+8wtAWpWLRZ+0K7v?K07J)UIm^ZXaDe>!E9AyXe|ka@K=et)(5f)!npnwgx!& z98%MD7}5iB5TUMF4P6f9zqi&?t}74mch3-Xcy^DlLb7g(!D; z_5f(@Vef*RC&h}Id}LMwI7hsklp}}UgdCS*#d1TlL*69`Du+_tdkdgo7eUOndw)a5 zkYcoZcE~~;R7w<~#pUrjOE8Xs4EL3!_aokChj1GXd%rHxmO}}*PbI>*N2`4-vx`$$J1R{%p1mgkBc`6a3CeMW;v76n7PY_R2ZiPSwAv+O{ zG7wi^2qdn$m4fEd;zEQG$ny({aEuK^+$zBmn44SV0&`3L_*{&Gyiji;*0jJebKy83 z`XLgCMEoI);*T#bEX243(6d|!FEEiX%Z$X>Pov35Eoe^JCcv zHjqgeT8%gsAzF?}EOP7|Oh3hkgc$0$$Nv*v-z8=W=9eIRgw(ODdZy5|FtMHNg3(&c z(Ujzz?t-b$r`nOPofe^5l*j6PFqC~dHNlcTnDTH;Kdqa-0UAsI)G%FJj2owQJ}rXN z3dk`{*OsKrGsPBob%3(#p_M+Jg`ibFExgq}4XB}3;+P_)U!DH(^uIr(Z6(~A0I4Jh z1C3OP0!am^1QUh6gw9=}K<{FrdiBVH>_PIS;!GkA`g#hL2*;^FJiZtOy#)L~gku81 zCF%-8#X%q4QX$Yd)K63>#^DT91+_QC#iCT=Dnl`B z&<#aoKEw{)RZz|@Db6v`!Z^bX41^MlSOp>|W(FBOt z!%)#cf(zfG_JTSEqA+mc9*Xsc#LT!GV=oO-=g=sPmtu)orR}{`kfPl1z5BcOclCDf z7jfm5NDaMQ)MebZqQG{RGkCFrORW2`jqy;^ejtbf#Dj-glHf}s9MS+cOeJeB6}n%v zE(M_sf2Q>y(GP#71A7CQ!)~>piZHC80v!>wU~%RdPEd#0P|R)N&?=9!qgOS0)xb;8 z7eyv$SzMc-VNvCR4wA@72s+?Sj1<@tG?;BcgSiy6BKLw;rx~PBTM>yYeH5O&i zD;8M{GHkqOfs0*Zt|!7hSHg+87~3-k)+NID11uX$1QIc>C(dv;!gEZ#CmQL&)q_D6 zBi##2f<+n*VlQx=P-heT;(rORW#Y+xqQbs<;t#aTXP;;ZOU0@)UD1&-?_D0^>|Gw)))H3RD!E#_a(#I$Z?Q_zhbHst{M{IDYKH

H8xwrx-u2pb{YK5EX5;4O{Qc1VY2G%KRiA%o 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 Y((?rw`GUOsb;#hjx45qe`(xkzAB>4!asU7T literal 0 HcmV?d00001