
    y[j               
          S r SSKrSSKrSSKrSSKJr  SSKrSSKr	SSK
r
Sr\" \5      R                  5       R                  R                  r\S-  S-  S-  r\S-  S-  rS	S
SSSSS.r/ SQr/ SQrSS\S\S\S\S-  4S jjrS\S\S\	R0                  S-  4S jrS\	R0                  S\	R0                  4S jrS\4S jr\S:X  a  \R<                  " \" 5       5        gg)u  
Punto 1 della roadmap: scarica lo storico partite + quote da football-data.co.uk
e produce un dataset unico e pulito pronto per il modello base e il backtesting.

Uso:
    python scripts/download_data.py                          # default: 6 leghe, stagioni 2017/18 -> 2025/26
    python scripts/download_data.py --leagues I1 E0          # solo Serie A e Premier League
    python scripts/download_data.py --seasons 2223 2324 2425 # stagioni specifiche
    python scripts/download_data.py --force                  # ri-scarica anche i file già in cache

Output:
    data/raw/football-data/<season>_<div>.csv   (CSV originali, cache)
    data/processed/matches.csv                  (dataset unico normalizzato)
    N)Pathz:https://www.football-data.co.uk/mmz4281/{season}/{div}.csvdatarawzfootball-data	processedzSerie AzSerie BzPremier LeaguezLa Liga
BundesligazLigue 1)I1I2E0SP1D1F1)	171818191920202121222223232424252526)3DivDateTimeHomeTeamAwayTeamFTHGFTAGFTRHTHGHTAGHTRHSASHSTASTHCACHFAFHYAYHRARB365HB365DB365APSHPSDPSAAvgHAvgDAvgAMaxHMaxDMaxAB365CHB365CDB365CAPSCHPSCDPSCAAvgCHAvgCDAvgCAMaxCHMaxCDMaxCAzB365>2.5zB365<2.5zAvg>2.5zAvg<2.5seasondivforcereturnc           
         [         R                  SSS9  [         U  SU S3-  nUR                  5       (       a!  U(       d  [        SUR                   35        U$ [
        R                  XS9n[        S5       H  n [        R                  " USS	9nUR                  S
:X  a  [        SU  SU S35          gUR                  5         UR                  UR                  5        [        SUR                   S[        UR                  5      S-   S35        Us  $    [        SU 35        g! [        R                   a>  n[        SUS-    SU SU 35        [         R"                  " SUS-   -  5         SnAM  SnAff = f)zLScarica un CSV (con cache locale) e restituisce il path, o None se fallisce.Tparentsexist_ok_z.csvz
  [cache] )rF   rG         )timeouti  z
  [404]   /z non esiste, saltoNz
  [ok]     (i   z KB)z	  [retry    z/3] :    z
  [FAIL]  )RAW_DIRmkdirexistsprintnameBASE_URLformatrangerequestsgetstatus_coderaise_for_statuswrite_bytescontentlenRequestExceptiontimesleep)rF   rG   rH   desturlattemptrespexcs           0C:\wamp64\www\Tigertips\scripts\download_data.pydownload_csvro   A   sZ   MM$M.xqT**D{{}}U
499+&'
///
1C8	*<<R0D3&
6(!C50BCD!!#T\\*JtyykC,=,E+FdKLK  
Jse
	 (( 	*Igk]$se2cU;<JJqGaK())	*s   <7D'5AD''E9;3E44E9pathc                     U R                  5       SS S:X  a  SOSn[        R                  " XSS9nUR                  R                  R                  5       Ul        UR                  / S
QSS9nUR                  (       a  g[        R                  " UR                  S9n[         H(  nXcR                  ;   a  X6   O[        R                  XV'   M*     SUSS  SUSS  3US'   [        R                   " US   SSSS9US'   UR                  S/S9nU$ ! [         a%  n[        SU R                   S	U 35         SnAgSnAff = f)z>Legge un CSV grezzo e lo normalizza alle colonne KEEP_COLUMNS.NrO   s   ﻿z	utf-8-sigzlatin-1skip)encodingon_bad_linesz  [ERRORE lettura] rU   )r   r   r   any)subsethowindex20rV   rR   Seasonr   Tmixedcoerce)dayfirstr]   errors)rv   )
read_bytespdread_csvcolumnsstrstrip	ExceptionrZ   r[   dropnaempty	DataFramery   KEEP_COLUMNSnpnanto_datetime)rp   rF   rs   dfrm   outcols          rn   load_csvr   [   s*    #'//"3BQ"7?"J;PY[[vFZZ^^))+

 
:	FB	xx ,,RXX
&C!ZZ/27RVV  AfQRj\2CM..VtGT\]CK
**VH*
%CJ#  #DII;b67s   AD 
D>D99D>r   c                    / SQn[         R                  " [        R                  U R                  S9n[         R                  " [        R                  U R                  S9n[         R                  " [        R                  U R                  S9n[         R                  " [         R
                  U R                  SS9nU H  u  pgp[         R                  " X   SS9n
[         R                  " X   SS9n[         R                  " X   SS9nU
R                  S5      UR                  S5      -  UR                  S5      -  UR                  5       -  nUR                  5       (       d  M  SU
-  SU-  SU-  npX-   U-   nUU-  U   X-'   UU-  U   X='   UU-  U   XM'   XU'   M     UR                  S5      U S	'   UR                  S5      U S
'   UR                  S5      U S'   XPS'   U $ )u   
Converte le quote in probabilità implicite normalizzate (senza margine del
bookmaker). Priorità: Pinnacle closing > media closing > Bet365 closing >
Pinnacle pre-match > media pre-match > Bet365 pre-match.
))r=   r>   r?   pinnacle_closing)r@   rA   rB   avg_closing)r:   r;   r<   b365_closing)r1   r2   r3   pinnacle)r4   r5   r6   avg)r.   r/   r0   b365rx   string)ry   dtyper}   )r   rT      ImpProbHImpProbDImpProbAImpProbSource)r   Seriesr   r   ry   NA
to_numericgtisnaru   round)r   priorityprob_hprob_dprob_asourcecol_hcol_dcol_ar[   odds_hodds_dodds_avalidraw_hraw_draw_a	overrounds                     rn   add_implied_probabilitiesr   w   s   H YYrvvRXX.FYYrvvRXX.FYYrvvRXX.FYYruuBHHH=F%-!ery:ry:ry:		!vyy|+fiil:V[[]Jyy{{&j!f*a&jeuME)	*E2*E2*E2u &. \\!_BzN\\!_BzN\\!_BzN I    c                  8   [         R                  " SS9n U R                  SS[        [        5      [        [        5      SSSR                  [        5       S3S	9  U R                  S
S[        SSS9  U R                  SSSS9  U R                  5       n[        S[        UR                  5       S[        UR                  5       S35        / nUR                   HP  nUR                   H=  n[        X4UR                  S9nUc  M  [        XS5      nUc  M,  UR                  U5        M?     MR     U(       d  [        S5        g[         R"                  " USS9nUR%                  SS/5      R'                  SS9n[)        U5      n[*        R-                  SSS9  [*        S-  nUR/                  USS 9  [        S!5        [        S"[        U5       35        [        S#US   R1                  5       R3                  5        S$US   R5                  5       R3                  5        35        [        S%US&   R7                  5       R9                  5        S'US&   R7                  5       R;                  5       S( S35        US)   R=                  / S*Q5      n	[        S+U	R9                  5        S'U	R;                  5       S( S35        [        S,5        US   R?                  5       RA                  5        H*  u  pJ[        S-[        RC                  XD5      S. SU
 35        M,     [        S/U 35        g0)1Nz6Scarica storico partite + quote da football-data.co.uk)descriptionz	--leagues+DIVzCodici lega (default:  ))nargsdefaultchoicesmetavarhelpz	--seasonsSSEEzDStagioni in formato '2324' per 2023/24 (default: 2017/18 -> 2025/26))r   r   r   r   z--force
store_trueu   Ri-scarica i file già in cache)actionr   z
Download: z	 leghe x z	 stagioni)rH   zNessun dato scaricato.rT   T)ignore_indexr   r   )droprK   zmatches.csvFrx   z
=== Riepilogo dataset ===zPartite totali:      zPeriodo:             z -> zCon quote (1X2):     r   rS   z.1%r   )r   r   r   zCon quote closing:   z
Partite per lega:z  z<16z
Salvato in: r   )"argparseArgumentParseradd_argumentlistLEAGUESjoinDEFAULT_SEASONS
parse_argsrZ   re   leaguesseasonsro   rH   r   appendr   concatsort_valuesreset_indexr   PROCESSED_DIRrX   to_csvmindatemaxnotnasummeanisinvalue_countsitemsr`   )parserargsframesrF   rG   rp   r   matchesout_pathclosingcounts              rn   mainr      s   $$1ijF
3WtT[} %.DSXXgEVDWWX,Y  [
3QWc  e
	,=^_D	Js4<<()3t||3D2EY
OPF,,<<C4::>D|$'B~b!    &'iiT2G!!65/2>>D>IG'0Gt4},HNN85N) 

'(	!#g,
01	!'&/"5"5"7"<"<">!?tGFODWDWDYD^D^D`Ca
bc	!'*"5";";"="A"A"C!D Ej!'')..05Q8 9o&++,_`G	!'++-7<<>#2Fa
HI	
 en11399;
7;;s(-Qug67 <	N8*
%&r   __main__)F)__doc__r   sysrg   pathlibr   numpyr   pandasr   r_   r\   __file__resolveparentPROJECT_ROOTrW   r   r   r   r   r   boolro   r   r   r   intr   __name__exit r   rn   <module>r      s    
     GH~%%'..55

%
'/
9v%3 



 [$ 3 t t 44  )< 8&",, &2<< &R,c ,^ zHHTV r   