
    *\j                        S r SSKJr  SSKrSSKJr  SSKJr  Sr	Sr
Sr\ " S	 S
5      5       rS\R                  S\4S jrS r S$S\R                  S\R                  S\R                  S\R                  S\R                  S\\   S\R                  S-  S\4S jjrS\S\S\S\S\S\R                  4S jrS\R                  S\\\\4   S\R                  4S  jrS\S\S\S\S\S\\\\4   4S! jrS\S"\S\\\4   4S# jrg)%a  
Modello Dixon-Coles (1997): Poisson bivariato con correzione per i punteggi
bassi (rho) e ponderazione temporale esponenziale delle partite di training.

Parametri stimati per lega:
    att[i]   - forza offensiva della squadra i
    dfn[i]   - forza difensiva della squadra i
    mu       - livello medio dei gol
    home_adv - vantaggio casa (sui gol attesi della squadra di casa)
    rho      - correzione di dipendenza per i punteggi 0-0, 1-0, 0-1, 1-1
    )	dataclassN)minimize)gammaln
   )g333333ÿg333333?      ?c                       \ rS rSr% \\   \S'   \R                  \S'   \R                  \S'   \	\S'   \	\S'   \	\S'   S\R                  4S	 jr
S
rg)DixonColesFit   teamsattdfnmuhome_advrhoreturnc                     [         R                  " U R                  U R                  U R                  U R
                  U R                  //5      $ N)npconcatenater   r   r   r   r   )selfs    >/var/www/tigertips.talkandprofit.net/ai/scripts/dixon_coles.pyparams_vectorDixonColesFit.params_vector!   s3    ~~txxDGGT]]DHH3UVWW     N)__name__
__module____qualname____firstlineno__liststr__annotations__r   ndarrayfloatr   __static_attributes__r   r   r   r	   r	      s?    9	O	OIO	JXrzz Xr   r	   paramsnc                 ^    U S U nXSU-   nU SU-     U SU-  S-      U SU-  S-      penX#XEU4$ )N      r   )r&   r'   r   r   r   r   r   s          r   _unpackr+   %   sT    
!*C
1q5/Cq1uva!eai'8&Q:K#BR3&&r   c                 >   [         R                  " U5      nU S:H  US:H  -  nU S:H  US:H  -  nU S:H  US:H  -  nU S:H  US:H  -  n	SX&   X6   -  U-  -
  XV'   SX'   U-  -   XW'   SX8   U-  -   XX'   SU-
  XY'   [         R                  " [         R                  " USS5      5      $ )z=log della correzione Dixon-Coles, vettorizzato sulle partite.r   r*   绽|=N)r   	ones_likelogclip)
hgaglam_hlam_ar   taum00m01m10m11s
             r   _tau_logr:   ,   s    
,,u
C7rQw
C7rQw
C7rQw
C7rQw
C5:
*S00CH5:##CH5:##CH3wCH66"''#ud+,,r   home_idxaway_idx
home_goals
away_goalsweightsr   x0r   c           	      X  ^ ^^^^^^ [        U5      mUR                  [        5      mUR                  [        5      m[        TS-   5      [        TS-   5      -   mUUUU UUU4S jnUc[  [        R
                  " ST-  S-   5      n[        R                  " [        TR                  5       S5      5      UST-  '   SUST-  S-   '   S/ST-  -  SS[        /-   n[        XvSUS	S
0S9n	[        U	R                  T5      u  ppn[        XZU
R                  5       -
  XR                  5       -
  XUS9$ )z9Stima i parametri massimizzando la log-likelihood pesata.r*   c                 <  > [        U T5      u  pp4nXR                  5       -
  nX"R                  5       -
  n[        R                  " X4-   UT   -   UT   -
  5      n[        R                  " X1T   -   UT   -
  5      nU* T[        R                  " U5      -  -   U-
  T
[        R                  " U5      -  -   T-
  [        TT
XgU5      -   n[        [        R                  " US-  5      [        R                  " US-  5      -   -  n	[        R                  " TU-  5      * U	-   $ )Nr)   )r+   meanr   expr/   r:   L2_REGsum)r&   r   r   r   r   r   r3   r4   llpenaltyr2   r<   r1   r;   log_factr'   r?   s             r   nllfit.<locals>.nllD   s    &-fa&8#"HHJHHJr}s8}4s8}DErM)CM9:frBFF5M))E1B4FFQRs34BFF3!8,rvvcQh/??@w|$$w..r   r)      r   g      ?)NNzL-BFGS-Bmaxiteri  )methodboundsoptions)r   r   r   r   r   r   )lenastyper$   r   r   zerosr/   maxrC   
RHO_BOUNDSr   r+   xr	   )r;   r<   r=   r>   r?   r   r@   rJ   rO   resr   r   r   r   r   r2   r1   rI   r'   s   ``  `          @@@@r   fitrX   :   s   
 	E
A			5	!B			5	!BrAva0H
/ 
/ 
zXXa!eai FF3rwwy#./1q5	1q519^q1u%|Z(PPF
3:f%s+-C #*#%%"3CbCu
*:hhj@Ps< <r   modelatt_hdfn_hatt_adfn_ac                 4   [         R                  " U R                  U R                  -   U-   U-
  5      n[         R                  " U R                  U-   U-
  5      n[         R                  " [
        S-   5      n[         R                  " U* 5      XW-  -  [         R                  " [        US-   5      5      -  n[         R                  " U* 5      Xg-  -  [         R                  " [        US-   5      5      -  n	[         R                  " X5      n
U R                  nU
S==   [        SXV-  U-  -
  S5      -  ss'   U
S==   [        SX[-  -   S5      -  ss'   U
S==   [        SXk-  -   S5      -  ss'   U
S==   [        SU-
  S5      -  ss'   XR                  5       -  $ )z<Griglia P(gol_casa=i, gol_ospite=j) per i,j in 0..MAX_GOALS.r*   )r   r   r-   )r   r*   )r*   r   )r*   r*   )r   rD   r   r   arange	MAX_GOALSr   outerr   rT   rF   )rY   rZ   r[   r\   r]   r3   r4   goalspois_hpois_agridr   s               r   score_matrixrf   ^   sG    FF588enn,u4u<=EFF588e#e+,EIIi!m$EVVUF^en,rvvgeai6H/IIFVVUF^en,rvvgeai6H/IIF88F#D
))CJ#a%-#--u55JJ#a%+ou--JJ#a%+ou--JJ#a#gu%%J((*r   re   targetc                    U R                  5       n [        R                  " [        R                  " U [        S9S5      n[        R
                  " U R                  S   [        S9n[        R                  " [        R                  " U [        S9S5      n[        X#U4U5       H-  u  pVX   R                  5       nUS:  d  M  X==   Xg-  -  ss'   M/     X R                  5       -  $ )u  
Riscala le tre regioni della griglia (vittoria casa / pari / vittoria
ospite) perché le loro somme coincidano con le probabilità target (es.
quelle implicite del mercato). I mercati derivati (over, multigol...)
diventano così coerenti con le quote 1X2.
)dtyper   r*   )
copyr   trilr.   booleyeshapetriuziprF   )re   rg   	home_mask	draw_mask	away_maskmasktss           r   rescale_to_1x2rx   q   s     99;DT6;Itzz!}D1IT6:I	i8&AJNNq5J!%J B ((*r   c                    [        XX#U5      n[        R                  " US5      R                  5       n[        R                  " U5      n[        R
                  " US5      R                  5       n[        U5      [        U5      [        U5      4$ )uK   Probabilità (H, D, A) per una partita, dati i parametri delle due squadre.rj   r*   )rf   r   rl   rF   tracerp   r$   )	rY   rZ   r[   r\   r]   re   p_homep_drawp_aways	            r   predictr~      sj     eE:DWWT2""$FXXd^FWWT1!!#F=%-v66r   teamc                 ^   XR                   ;   aK  U R                   R                  U5      n[        U R                  U   5      [        U R                  U   5      4$ [        [
        R                  " U R                  S5      5      [        [
        R                  " U R                  S5      5      4$ )zIParametri (att, dfn) di una squadra; prior da neopromossa se sconosciuta.g?)r   indexr$   r   r   r   quantile)rY   r   is      r   team_paramsr      sz    {{KKd#UYYq\"E%))A,$777 UYY-.bkk%))T6R0SSSr   r   )__doc__dataclassesr   numpyr   scipy.optimizer   scipy.specialr   r`   rU   rE   r	   r#   intr+   r:   r    r!   rX   r$   rf   tuplerx   r~   r   r   r   r   <module>r      s  
 "  # !	
	 	X 	X 	X'BJJ '3 '-" !%!<"** !<

 !<JJ!<,.JJ!<!<$(I!< JJ!< *7!<H e E &+02

& U5%3F-G BJJ $7= 7 7u 77!&7+0u1D+E7T} TC TE%,4G Tr   