
    \jG(                        S r SSKrSSKrSSKJrJrJr  SSKJr  SSKr	SSK
rSSKrSSKr\R                  R                  S\" \" \5      R%                  5       R&                  5      5        SSKrSSKrSSKJr  SSSS	.rS
rS\	R6                  S\\   4S jrS\\   S\\\4   4S jrS\ \!\!\!4   S-  4S jr"S\#4S jr$\%S:X  a  \RL                  " \$" 5       5        gg)u  
Pronostici del giorno — tre fasce per ogni partita, pronte per il sito web.

Per ogni partita in programma:
  - probabilità 1X2 dal MERCATO (la fonte più accurata che esista, come
    dimostrato dai backtest); se mancano le quote, dal modello DC
  - griglia dei punteggi dal modello DC, RISCALATA per essere coerente con
    le probabilità 1X2 di riferimento
  - dalla griglia, tutti i mercati derivati; per ciascuna fascia si sceglie
    la selezione con probabilità più alta dentro la banda:
        sicuro       p in [0.70, 0.88]   (quota equa 1.14 - 1.43)
        equilibrato  p in [0.50, 0.68]   (quota equa 1.47 - 2.00)
        azzardo      p in [0.20, 0.38]   (quota equa 2.63 - 5.00)

Output: tabella daily_picks nel DB (il sito legge da lì) + stampa.

Uso:
    python scripts/daily_picks.py                     # partite dei prossimi 3 giorni
    python scripts/daily_picks.py --date 2026-05-24 --settle   # demo su una data passata
    N)datedatetime	timedelta)Path)settle)gffffff?g)\(?)g      ?g(\?)g?gRQ?sicuroequilibratoazzardoa  
CREATE TABLE IF NOT EXISTS daily_picks (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    match_id     INT UNSIGNED NOT NULL,
    generated_at DATETIME NOT NULL,
    tier         ENUM('sicuro','equilibrato','azzardo') NOT NULL,
    market       VARCHAR(30) NOT NULL,
    selection    VARCHAR(40) NOT NULL,
    line         DECIMAL(4,1) NULL,
    label        VARCHAR(60) NOT NULL,
    probability  DECIMAL(6,4) NOT NULL,
    fair_odds    DECIMAL(7,3) NOT NULL,
    prob_source  ENUM('market','model') NOT NULL,
    outcome      ENUM('win','loss','void','unsettled') NOT NULL DEFAULT 'unsettled',
    UNIQUE KEY uq_pick (match_id, tier),
    CONSTRAINT fk_dp_match FOREIGN KEY (match_id) REFERENCES matches (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
gridreturnc                    U R                   S   n[        R                  R                  [        R                  " U5      [        R                  " U5      5      n[        R                  " U5      SS2S4   [        R
                  " U[        S9-  n[        R
                  " U[        S9SS2S4   [        R                  " U5      -  n[        R                  " U S5      R                  5       n[        R                  " U 5      n[        R                  " U S5      R                  5       nSSSSUS	.SS
SSUS	.SSSSUS	.SSSSXV-   S	.SSSSXg-   S	.SSSSXW-   S	.SSSSXS:  US:  -     R                  5       S	.SSSSXS:H  US:H  -     R                  5       S	./nS H0  n	UR                  SSU	SU	 3XU	:     R                  5       S	.5        M2     S H0  n	UR                  SSU	S U	 3XU	:     R                  5       S	.5        M2     S! H?  u  pUR                  S"U
 S#U 3SS$U
 S#U 3XU
:  X+:*  -     R                  5       S	.5        MA     S% Hy  u  pUR                  S&U
 S#U 3SS'U
 S#U 3XU
:  X;:*  -     R                  5       S	.5        UR                  S(U
 S#U 3SS)U
 S#U 3XU
:  XK:*  -     R                  5       S	.5        M{     U$ )*z4Tutti i mercati derivati dalla griglia dei punteggi.r   N)dtype   1x21z1 (casa))market	selectionlinelabelpXzX (pareggio)2z
2 (ospite)double_chance1XzDoppia chance 1XX2zDoppia chance X212zDoppia chance 12bttsgolzGol (entrambe segnano)nogolNoGol)g      ?      @      @
over_underoverzOver )r#   r$   g      @underzUnder )r      )      )r   r+   )r*      multigol_total-z	Multigol ))r   r*   r(   multigol_homezMultigol Casa multigol_awayzMultigol Ospite )shapenpaddouterarangeonesinttrilsumtracetriuappend)r   ntothgagp1pxp2outr   lohis               .C:\wamp64\www\Tigertips\scripts\daily_picks.pycandidates_from_gridrH   <   s$   

1A
&&,,ryy|RYYq\
2C	1ag	#!6	6B	#	q$w	'"))A,	6B	r				 B	$B	q				BsD:TVWsD>XZ[sD<VXY"tN`gigno"tN`gigno"tN`gignotF^eipqkqvx{|v|j}e~  fC  fC  fE  	FVZbc\chjnoho[pVqVuVuVwx	C  

l$TF^$Tz2B2F2F2HJ 	K    

l$%dV_4d
3C3G3G3IK 	L   3

.t1RD\SW(AbT2bySY>W9X9\9\9^` 	a 3 #

ord!B4LRV-bT2$7d"HQSQYCZ>[>_>_>ac 	d

ord!B4LRV/t1RD9BhSUS[E\@]@a@a@ce 	f #
 J    candsc                     0 n[         R                  5        HE  u  nu  p4U  Vs/ s H  oSUS   s=::  a  U::  d  M  O  M  UPM     nnU(       d  M8  [        US S9X'   MG     U$ s  snf )Nr   c                     U S   $ )Nr    )cs    rG   <lambda>pick_tiers.<locals>.<lambda>f   s    QsVrI   )key)TIERSitemsmax)rJ   pickstierrE   rF   rN   in_bands          rG   
pick_tiersrX   a   sd    E++-hr#:eQsV'9r'91'91e:7g+;<EK ( L ;s   A"A"A"c                    S HJ  u  pnX   (       d  M  [        X   5      S:  d  M$  [        X   5      [        X   5      [        X   5      4s  $    U S   U S   U S   penU(       ae  U(       a^  U(       aW  [        U5      S:  aH  [        U5      [        U5      [        U5      penSU-  SU-  -   SU-  -   nSU-  U-  SU-  U-  SU-  U-  4$ g)uF   Probabilità implicite normalizzate dalle quote pre-match disponibili.))imp_himp_dimp_ar   avg_homeavg_drawavg_awayr   N)float)rowhdaohodoar&   s           rG   market_probsrh   j   s    1a66eCFma'=%-sv>> 2 Z#j/3z?BB	bRE"IM2Yb	592vBR'2v}a"ftmQVd]::rI   c                  
   [         R                  " SS9n U R                  SS SS9  U R                  S[        SS9  U R                  S	S
SS9  [        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                  [        5        UR!                  5         UR"                  (       a  UR"                  =pEUR"                  nOR[%        ["        R&                  " 5       5      n[%        ["        R&                  " 5       [)        UR*                  S9-   5      nS n[,        R.                  " SX$U4S9nUR0                  (       a  [3        SU SU S35        g[3        S[5        U5       SU SU S35        0 nSn	/ n
UR7                  SS9 GHI  nUR8                  U;  a+  [:        R<                  " X+R8                  US9XR8                  '   XR8                     n[>        R@                  " XRB                  5      u  p[>        R@                  " XRD                  5      u  nn[>        RF                  " XXU5      n[I        URK                  5       5      nU(       a  SOSnU(       a  [>        RL                  " UU5      n[O        [Q        U5      5      n[3        UR8                   SURB                   S URD                   S!URR                   S"U S#3
5        S$ H  nURU                  U5      nUc  [3        S%US& S'35        M)  S(US)   -  n[3        S%US& S*US+   S, S-US)   S. S/US0 35        UR                  S1[        URV                  5      UUS   US2   US3   US+   [Y        US)   S45      [Y        US5      U4	5        U	S(-  n	U
R[                  UUS   US2   US3   UR\                  UR^                  [        URV                  5      S5.5        M     UR!                  5         GML     [3        S6U	 35        UR`                  (       Ga  U
(       Ga  [,        Rb                  " U
5      nURe                  [`        S(S79US8'   URg                  S8/S99R7                  SS9 H6  nUR                  S:URh                  URj                  URl                  45        M8     UR!                  5         [3        S;5        URg                  S8/S99Ro                  S<5       HO  u  nnUS8   S=:H  Rq                  5       nUS8   S>:g  Rq                  5       n[3        SUS& S*U S?U S@UU-  SA SB3	5        MQ     URs                  5         g)CNz*Genera i pronostici del giorno a tre fasce)descriptionz--datez<Data specifica (YYYY-MM-DD); default: prossimi --days giorni)defaulthelpz--daysr)   )typerk   z--settle
store_truez2Regola subito gli esiti (per demo su date passate))actionrl   	tigertips)hostportuserpassworddatabase)daysa  
        SELECT m.id, l.code AS league, m.match_date, h.name AS home, a.name AS away,
               m.imp_prob_home AS imp_h, m.imp_prob_draw AS imp_d,
               m.imp_prob_away AS imp_a, m.avg_home, m.avg_draw, m.avg_away,
               m.home_goals AS hg, m.away_goals AS ag
        FROM matches m
        JOIN leagues l ON l.id = m.league_id
        JOIN teams h ON h.id = m.home_team_id
        JOIN teams a ON a.id = m.away_team_id
        WHERE m.match_date BETWEEN %s AND %s
        ORDER BY l.code, m.match_date
    )paramszNessuna partita tra z e z6 (esegui sync_fixtures.py per caricare il calendario).r   z	Partite: z (z -> z)
F)index)cutoffr   modelz  z - z  (z)  []r   z   z<12z (nessuna selezione in banda)r   r    r   z<24z p=z.1%z  quota equa z.2fa[  
                INSERT INTO daily_picks
                    (match_id, generated_at, tier, market, selection, line,
                     label, probability, fair_odds, prob_source)
                VALUES (%s, NOW(), %s, %s, %s, %s, %s, %s, %s, %s)
                ON DUPLICATE KEY UPDATE
                    generated_at = NOW(), market = VALUES(market),
                    selection = VALUES(selection), line = VALUES(line),
                    label = VALUES(label), probability = VALUES(probability),
                    fair_odds = VALUES(fair_odds), prob_source = VALUES(prob_source)
            r   r   r+   )rV   r   r   r   r?   r@   match_idz)
Pick salvate/aggiornate in daily_picks: )axisoutcome)subsetzEUPDATE daily_picks SET outcome = %s WHERE match_id = %s AND tier = %sz
=== Esiti (demo) ===rV   winvoid/z vinte (z.0%)):argparseArgumentParseradd_argumentr7   configadd_db_args
parse_argspymysqlconnectrq   rr   rs   rt   cursorexecuteSCHEMAcommitr   strtodayr   rv   pdread_sqlemptyprintlen
itertuplesleagueimpactfit_currentdcteam_paramshomeawayscore_matrixrh   _asdictrescale_to_1x2rX   rH   
match_dategetidroundr<   r?   r@   r   	DataFrameapplydropnar   r}   rV   groupbyr9   close)parserargsconncur	date_fromdate_tory   dfmodelsn_saved	all_picksrrz   att_hdfn_hatt_adfn_ar   targetsourcerU   rV   rN   fairsdfgrpwinsvalids                               rG   mainr   w   s   $$1]^F
$[  ]
sA6

<Q  S
vD??						$(MMKID
++-CKKKKMyy"ii'	

%	djjlYDII%>>?	  
'*
,B 
xx$YKs7) <F F 	G	Ic"gYb4y
<=FGI]]]'886!%11$PF88xx ~~eVV4~~eVV4uuU5Aaiik*#$$T62D/56
"QVVHCxs1<<.VHANO8D		$AyD:%BCDqv:DCSz1W:c"2#afS\ B  $Sz+ ,KK 
 add)T1X;+&	G*eAcFA.dAHI qLGdak+,[>1V9$%DD#add)M N+ 90 	O (R 
6wi
@A{{{yll9%62II;/:::GAKK <AJJ79 H 	&'I;7??GID#	Ne+002D^v-224EBtCj$qxuS7IKL H
 	JJLrI   __main__)'__doc__r   sysr   r   r   pathlibr   numpyr2   pandasr   r   r   pathinsertr   __file__resolveparentdixon_colesr   r   score_tipstersr   rR   r   ndarraylistdictrH   rX   tupler`   rh   r7   r   __name__exitrM   rI   rG   <module>r      s   *  
 . .      3tH~--/667 8   !V
("rzz "d4j "Jd4j T#t)_ 
ueU23d: 
gc gT zHHTV rI   