
    ,\j                         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\	S-  4S jr
S\4S jr\S:X  a  \R                  " \" 5       5        gg)u  
Tribunale dei tipster — scoring.

Regola le pick (win/loss/void) in modo DETERMINISTICO dai risultati in matches,
poi calcola per ogni tipster:
  - ROI alla quota consigliata (flat stake 1)
  - hit rate vs probabilità implicita media delle quote consigliate
  - CLV 1X2: per le pick 1X2, confronto tra la quota consigliata e la quota
    di chiusura della stessa selezione (quota consigliata > closing = il
    tipster ha preso valore prima del mercato)

Le pick su mercati per cui non abbiamo quote storiche (multigol, ecc.) hanno
solo ROI/hit rate. Prova anche a ri-agganciare le pick senza match_id.

Uso:
    python scripts/score_tipsters.py
    Nreturnc                    U S   U S   p![         R                  " U5      (       d  [         R                  " U5      (       a  g[        U5      [        U5      p!X-   nU S   U S   =(       d    SR                  5       R	                  5       pTUS:X  a  X:  a  SOX!:  a  S	OS
nXV:X  a  S$ S$ US:X  a@  X:  a  SOX!:  a  S	OS
nUS;   US;   US;   S.nXW;   a  UR                  U5      (       a  S$ S$ S$ US:X  aI  U S   n[         R                  " U5      (       a  gX8:X  a  gX8:  n	U	(       a  US:X  d  U	(       d  US:X  a  S$ S$ US:X  a/  US:  =(       a    US:  n
U
(       a  US:X  d  U
(       d  US:X  a  S$ S$ US;   a  [         R                  " U5      R                  R                  S5      R                  S   nUR                  5       R                  5       (       a  g[        US   5      [        US   5      pX1US.U   nXs=::  a  U::  a  S$   S$ g)zAEsito deterministico di una pick dai gol (None = non regolabile).hgagNmarket	selection 1x212xwinlossdouble_chance1xx212)r   r   r   
over_underlinevoidoverunderbttsr   golnogol)multigol_totalmultigol_homemultigol_awayz(\d+)\s*-\s*(\d+)   )pdisnaintstriplowergetSeriesstrextractilocany)rowr   r   totalr   seloutcomeokr   hitbothmlohivalues                  A/var/www/tigertips.talkandprofit.net/ai/scripts/score_tipsters.pysettler7      s   YD		wwr{{bggbkkWc"gGEh-#k"2"8b!?!?!A!G!G!IC#bgs3u2F2 #bgs3tO7d?'T/R58YH&HDH6{774===lwu[U[[Av "q&#,u\V\\EEIIcN&&';<AA!D668<<>>QqTC!IB#("$&&,.)r)u5)v5    c            	      H	   [         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UR                  5       nUR                  S5        UR                  5         [        R                  " SU5      nS H  n[        R                   " XE   SS	9XE'   M     UR"                  (       a  [%        S
5        gUR'                  [(        SS9US'   XDS   R+                  5       US   S:H  -     nUR-                  SS9 H4  nUR                  SUR.                  [1        UR2                  5      45        M6     UR                  5         US   UR4                  UR6                  S4'   [%        S[9        U5       S[9        U5       SUS   S:H  R;                  5        35        XDS   R=                  / SQ5         R?                  5       nUR"                  (       a  [%        S5        g[%        S5        URA                  S5       GH!  u  pXS   S:g     n[B        RD                  " US   S:H  US   S-
  S5      nUS   R+                  5       nURG                  5       (       a  X   RI                  5       O[B        RJ                  nUS   S:H  RI                  5       nURG                  5       (       a"  SUR4                  US4   -  RI                  5       O[B        RJ                  n[%        SU	 S [9        U
5       S!35        [%        S"US# S$US# S%35        [%        S&US' 35        XS(   S):H  U
S   R+                  5       -     R?                  5       nS*S+S,S-.n/ nUR-                  SS9 H|  nURM                  URN                  =(       d    S.RQ                  5       5      nU(       a  [S        UU5      OS nU(       d  MS  US:  d  M[  URU                  URV                  U-  S-
  5        M~     U(       a3  [%        S/[B        RH                  " U5      S' S0[9        U5       S135        GM  [%        S25        GM$     [9        XS   S:g     5      nUS3:  a  [%        S4U S535        URY                  5         g)6Nz!Scoring del tribunale dei tipster)description	tigertips)hostportuserpassworddatabasea  
        UPDATE tips t
        JOIN matches m ON m.match_date = DATE(t.kickoff)
        JOIN teams h ON h.id = m.home_team_id
        JOIN teams a ON a.id = m.away_team_id
        SET t.match_id = m.id
        WHERE t.match_id IS NULL AND t.kickoff IS NOT NULL
          AND (h.name = t.home_team OR t.home_team LIKE CONCAT('%%', h.name, '%%'))
          AND (a.name = t.away_team OR t.away_team LIKE CONCAT('%%', a.name, '%%'))
    aB  
        SELECT t.id, ts.name AS tipster, t.market, t.selection, t.line, t.odds,
               t.outcome, m.home_goals AS hg, m.away_goals AS ag,
               m.avgc_home, m.avgc_draw, m.avgc_away
        FROM tips t
        JOIN tipsters ts ON ts.id = t.tipster_id
        LEFT JOIN matches m ON m.id = t.match_id
    )r   oddsr   r   	avgc_home	avgc_draw	avgc_awaycoerce)errorszNessuna pick nel tribunale.r   r   )axisnew_outcomer.   	unsettledF)indexz*UPDATE tips SET outcome = %s WHERE id = %szPick totali: z | regolate ora: z | ancora aperte: )r   r   r   zGNessuna pick regolata: il verdetto arriva con le prime partite giocate.z
=== Verdetto per tipster ===tipsterr   r   rA   g      
z: z pick regolatez  hit rate: z.1%z (implicita media delle quote: )z  ROI a stake fisso: z+.1%r   r
   rB   rC   rD   )r   r   r   r	   z  CLV 1X2 medio: z su z pick (>0 = batte la chiusura)z3  CLV 1X2: nessuna pick 1X2 con closing disponibiled   z 
Nota: campione ancora piccolo (z- pick). Verdetto affidabile da ~150-200 pick.)-argparseArgumentParserconfigadd_db_args
parse_argspymysqlconnectr<   r=   r>   r?   cursorexecutecommitr    read_sql
to_numericemptyprintapplyr7   notna
itertuplesrH   r"   idlocrJ   lensumisincopygroupbynpwherer*   meannanr%   r   r$   getattrappendrA   close)parserargsconncurdfc	to_updatersettledrK   grpbetsprofitvalidroir0   impliedm1x2closing_colclvscolclosingns                          r6   mainr   C   s+   $$1TUF
vD??						$(MMKID
++-C KK 	 		 	KKM	  

B QbeH5 Q 
xx+, a0B}m$**,90LMNI!!!.@]]CI.	0 / 	KKM)2=)ABFF9??I%&	M#b'"3C	N3C D	]k9>>@AC D I##$;<=BBDG}}WX	
*+	2y>V+,$y/U2DL14DdKV""$&+iikkfm  "rvvI%'--/:?))++1txxv..4462667)2c#hZ~67SI%DWSMQRST%c$Z01 MU*c&k.?.?.AABGGI'kLu-A//1;;#4"";";"=>C),gao$Gw7Q;AFFW,q01	 .
 %bggdmD%9c$i[ I- . / GH1 34 	GI&&012A3w1! 56 7 	8JJLr8   __main__)__doc__rO   sysnumpyrg   pandasr    rT   rQ   r'   r7   r"   r   __name__exit r8   r6   <module>r      s[   $  
    #3: #LUc Up zHHTV r8   