
    \jJ                         S r SSKrSSKrSSKrSSKrSSKrSSKrSr	Sr
SSSS.rS\R                  S	\R                  S
\4S jrS
\4S jr\S:X  a  \R$                  " \" 5       5        gg)u  
Scoring CLV dell'agente formazioni (e futuri agenti live).

Per ogni segnale in agent_signals con partita giocata:
  - snapshot: le probabilità di mercato più recenti PRIMA del segnale
    (odds_snapshots; fallback: quote pre-match in matches)
  - closing: le probabilità implicite di chiusura (imp_prob_* in matches)
  - direzione: sull'esito dove l'agente ha spostato di più la probabilità,
    la closing si è mossa nella stessa direzione dello spostamento?

KPI primario (dal design): CLV direction hit rate. >55% = l'agente vede cose
vere prima del mercato; <=52% dopo 150 segnali non nulli = kill criterion.
KPI secondario: log loss delle probabilità aggiustate vs snapshot vs closing.

Uso:
    python scripts/score_signals.py
    Ng{Gzt?gMb`?      )HDApoutcomereturnc                    [         R                  " U SS5      n X R                  SSS9-  n [        [         R                  " [         R
                  " U [         R                  " [        U5      5      U4   5      5      * 5      $ )Ng-q=r   T)axiskeepdims)npclipsumfloatmeanlogarangelen)r   r	   s     0C:\wamp64\www\Tigertips\scripts\score_signals.pyloglossr   !   s`    
5!A	EEq4E((A"''"&&299S\#:G#C!DEFFGG    c                  x   [         R                  " SS9n [        R                  " U 5        U R	                  5       n[
        R                  " UR                  UR                  UR                  UR                  SS9n[        R                  " SU5      nUR                  5         UR                  (       a  [        S5        gUR                   R#                  / SQ5       H  n[        R$                  " X4   S	S
9X4'   M     US   R'                  5       US   R'                  5       -   [(        :  US'   [        S[+        U5       SUS   R-                  5        S35        UR/                  SS/5       GH  u  u  pVn[        SU SU S[+        U5       SUS   R-                  5        S3	5        XwS      R1                  / SQS9R3                  5       n[+        U5      (       Ga}  U/ SQ   R5                  5       n	U/ SQ   R5                  5       n
U/ SQ   R5                  5       nX-
  n[6        R&                  " U5      R9                  SS9n[6        R:                  " [+        U5      5      n[6        R<                  " XU4   5      nXU4   XU4   -
  n[6        R&                  " U5      [>        :  n[6        R<                  " UU)    5      UU)    :H  nUR@                  (       aR  URC                  5       nUS:  a  S O	US!:  a  S"OS#n[        S$US% S&UR@                   S'UR-                  5        S(U 35        UR@                  S):  a  URC                  5       S*::  a  [        S+5        O[        S,5        UR1                  / S-QS9R3                  5       nUUS.   RE                  [F        5         n[+        U5      S/:  a  US.   RI                  [F        5      R5                  5       n[        S0[+        U5       S1[K        U/ SQ   R5                  5       U5      S2 S3[K        U/ SQ   R5                  5       U5      S2 35        [        5         GM     g)4NzScoring CLV dei segnali agente)description	tigertips)hostportuserpassworddatabaseaG  
        SELECT s.id AS signal_id, s.agent, s.stage, s.checked_at,
               s.delta_lambda_home, s.delta_lambda_away,
               m.result,
               m.imp_prob_home AS close_h, m.imp_prob_draw AS close_d,
               m.imp_prob_away AS close_a,
               pm.prob_home AS model_h, pm.prob_draw AS model_d, pm.prob_away AS model_a,
               pa.prob_home AS adj_h, pa.prob_draw AS adj_d, pa.prob_away AS adj_a,
               os.prob_home AS snap_h, os.prob_draw AS snap_d, os.prob_away AS snap_a
        FROM agent_signals s
        JOIN matches m ON m.id = s.match_id AND m.result IS NOT NULL
        LEFT JOIN predictions pm ON pm.match_id = s.match_id
             AND pm.stage = s.stage AND pm.source = 'model'
        LEFT JOIN predictions pa ON pa.match_id = s.match_id
             AND pa.stage = s.stage AND pa.source = 'agent_adj'
        LEFT JOIN odds_snapshots os ON os.id = (
            SELECT os2.id FROM odds_snapshots os2
            WHERE os2.match_id = s.match_id AND os2.taken_at <= s.checked_at
            ORDER BY os2.taken_at DESC LIMIT 1)
    zENessun segnale con partita giocata: lo scoring parte con la stagione.r   )agentstage
checked_atresultcoerce)errorsdelta_lambda_homedelta_lambda_awaynonnullzSegnali con esito: z | non nulli: 
r!   r"   z=== z / z (z
 segnali, z non nulli) ===)snap_hadj_hclose_h)subset)r+   snap_dsnap_a)r,   adj_dadj_a)r-   close_dclose_ar   )r   g?z&POSITIVO: l'agente anticipa il mercatogQ?zin linea col rumoreNEGATIVOz  CLV direzionale: z.1%z su z segnali (piatti esclusi: z) ->    gp=
ף?z:  *** KILL CRITERION RAGGIUNTO: valutare archiviazione ***z>  CLV direzionale: dati insufficienti (serve snapshot+closing))r,   r-   r$   r$   
   z  log loss (z partite): aggiustate z.4fz | closing )&argparseArgumentParserconfigadd_db_args
parse_argspymysqlconnectr   r   r   r   pdread_sqlcloseemptyprintcolumnsdrop
to_numericabs	MIN_DELTAr   r   groupbydropnacopyto_numpyr   argmaxr   sign	FLAT_MOVEsizer   isinRESULT_INDEXmapr   )parserargsconndfcr!   r"   grpgsnapadjrA   shiftcompidx	agent_dir
close_moveflathitsrateverdictg2ys                          r   mainrh   '   s   $$1QRF
vD??						$(MMKID 
 & 
'
B( 	JJL	xxUVZZ__GHbeH5 I +,002+,00236?@ByM 
Byr)}7H7H7J6K2
NO!zz7G*<=UG3ugRCzY##%&o7 	8 I&&1 ' 33746 	
q6634==?D/099;C78AACEJE66%=''Q'/D))CF#C4i 01IDy)DdO;J66*%	1D77:te,-D51AADyyyy{GKd{C9= 5 *  +D:T$)) E**.((*U7)E FyyCDIIK4$7RSRS ZZ=Z>CCE8!!,/0r7b=8  .779ALR	 *  '+F(G(P(P(RTU VWZ[ \$R(I%J%S%S%UWXYZ]^` a 	M  >N r   __main__)__doc__r8   sysnumpyr   pandasr?   r=   r:   rH   rO   rR   ndarrayr   r   intrh   __name__exit r   r   <module>rs      s   $  
    		QQ'Hrzz HBJJ H5 HQc Qh zHHTV r   