
    \j              
       f   S r SSK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SKr\" \5      R                  5       R                  R                  r\S-  S-  S-  r\S-  S-  S-  rS	S
SSSS.rSS/rSS0rSrSS\S\S\S\S-  4S jjrS\4S jr\S:X  a  \R:                  " \" 5       5        gg)u  
Scarica le statistiche giocatore da Understat (goals, xG, assist, xA, minuti)
e le carica nella tabella player_stats del DB. Servono al layer deterministico
dell'agente formazioni: la quota di contributo offensivo di un assente.

I nomi squadra vengono convertiti ai nomi football-data tramite la mappatura
già imparata (data/processed/team_mapping.csv).

Nota: se un giocatore ha cambiato squadra a gennaio, Understat riporta le
squadre separate da virgola; la riga viene attribuita all'ultima squadra
elencata (approssimazione accettata per il calcolo delle quote).

Uso:
    python scripts/download_players.py                 # 5 leghe, stagioni 2024 e 2025
    python scripts/download_players.py --seasons 2025
    N)Pathdataraw	understat	processedzteam_mapping.csvE0SP1D1I1F1)EPLLa_liga
BundesligaSerie_ALigue_120242025z
User-AgentzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36a	  
CREATE TABLE IF NOT EXISTS player_stats (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    understat_id INT UNSIGNED NOT NULL,
    season       VARCHAR(7)   NOT NULL,
    league_code  VARCHAR(5)   NOT NULL,
    player       VARCHAR(80)  NOT NULL,
    team         VARCHAR(60)  NOT NULL,
    position     VARCHAR(10)  NULL,
    games        SMALLINT UNSIGNED NULL,
    minutes      INT UNSIGNED      NULL,
    goals        SMALLINT UNSIGNED NULL,
    assists      SMALLINT UNSIGNED NULL,
    xg           DECIMAL(7,3) NULL,
    xa           DECIMAL(7,3) NULL,
    npxg         DECIMAL(7,3) NULL,
    UNIQUE KEY uq_player_season (understat_id, season),
    KEY idx_team (league_code, season, team)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
leagueyearforcereturnc                 >   [         R                  SSS9  [         SU  SU S3-  nUR                  5       (       aB  U(       d;  [        SUR                   35        [
        R                  " UR                  SS95      $ S	U  S
U 3n[        SSU  S
U 3S.-  n[        S5       H  n [        R                  " XESS9nUR                  5         UR                  5       S   nUR                  [
        R                  " U5      SS9  [        SU  S
U S[        U5       S35        [         R"                  " S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)NT)parentsexist_okplayers__z.jsonz
  [cache] zutf-8)encodingz$https://understat.com/getLeagueData//XMLHttpRequestzhttps://understat.com/league/)zX-Requested-WithReferer      )headerstimeoutplayersz
  [ok]    : z
 giocatorigffffff?z	  [retry    z/3] z
  [FAIL]  )RAW_DIRmkdirexistsprintnamejsonloads	read_textHEADERSrangerequestsgetraise_for_status
write_textdumpslentimesleepRequestException)
r   r   r   cacheurlr#   attemptrespr   excs
             3C:\wamp64\www\Tigertips\scripts\download_players.pyfetch_playersrA   ?   s   MM$M.$u55E||~~e
5::,'(zz%//7/;<<0$
@C-=&CF81TF$SU UG8
	*<<bAD!!#99;y)DTZZ-@JvhavRD	{*EFJJsOK  
Jse
	 (( 	*Igk]$se2cU;<JJqGaK())	*s   %BE

F3FFc                  x   [         R                  " SS9n U R                  SS[        S9  U R                  SSS9  [        R
                  " U 5        U R                  5       n[        [        R                  " [        5      R                  S	S S
95      n/ n[        5       n[        R                  5        GHU  u  pVUR                   GH>  n[!        XWUR"                  S9nUc  M  U S[%        ['        U5      S-   5      SS   3n	U H  n
U
S   R)                  S5      S   R+                  5       nUR-                  U5      nUc  UR/                  U5        MO  UR1                  ['        U
S   5      XU
S   UU
R-                  S5      ['        U
S   5      ['        U
S   5      ['        U
S   5      ['        U
S   5      [3        [5        U
S   5      S5      [3        [5        U
S   5      S5      [3        [5        U
S   5      S5      45        M     GMA     GMX     U(       a  [7        S[9        U5       35        [:        R<                  " UR>                  UR@                  URB                  URD                  SS9nURG                  5       nURI                  [J        5        URM                  5         S n[O        S![Q        U5      S"5       H*  nURS                  XUUS"-    5        URM                  5         M,     URI                  S#5        [7        S$5        URU                  5        H  u  n	n[7        S%U	 S&U 35        M     URW                  5         g!)'Nz'Scarica statistiche giocatore Understat)descriptionz	--seasons+)nargsdefaultz--force
store_true)actionF)indexr,   )r   r   r'      
team_title,idplayer_namepositiongamesr8   goalsassistsxGr!   xAnpxGz;  [ATTENZIONE] squadre senza mappatura, giocatori saltati: 	tigertips)hostportuserpassworddatabaseaZ  
        INSERT INTO player_stats (understat_id, season, league_code, player, team,
                                  position, games, minutes, goals, assists, xg, xa, npxg)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        ON DUPLICATE KEY UPDATE
            league_code = VALUES(league_code), player = VALUES(player),
            team = VALUES(team), position = VALUES(position),
            games = VALUES(games), minutes = VALUES(minutes),
            goals = VALUES(goals), assists = VALUES(assists),
            xg = VALUES(xg), xa = VALUES(xa), npxg = VALUES(npxg)
    r   i  z9SELECT season, COUNT(*) FROM player_stats GROUP BY seasonz
Giocatori in player_stats:z  r&   ),argparseArgumentParseradd_argumentDEFAULT_SEASONSconfigadd_db_args
parse_argsdictpdread_csvMAP_PATH
itertuplessetLEAGUESitemsseasonsrA   r   strintsplitstripr3   addappendroundfloatr+   sortedpymysqlconnectrX   rY   rZ   r[   cursorexecuteSCHEMAcommitr1   r7   executemanyfetchallclose)parserargsname_maprowsunmapped_teamsr   coder   r   seasonpteam_usteamconncursqlstartcounts                     r@   mainr   Y   s   $$1Z[F
3H
	,7
vDBKK)445t4LMHDUNLLD TZZ@D|vQs3t9q=1!"567FL///4R8>>@||G,<"&&w/$L&-0@$EE*%s1W:AfI'
OS9%6%$.!,eE!D'NA.F%&	*A.   ! (( K'(* 	+ ??						$(MMKID
++-CKKKKM
C q#d)T*%56 + KKKL	
()6("UG$% (JJL    __main__)F)__doc__r]   r-   sysr8   pathlibr   pandasre   rv   ra   r2   __file__resolveparentPROJECT_ROOTr(   rg   rj   r`   r0   rz   rm   boollistrA   rn   r   __name__exit r   r@   <module>r      s   "   
      H~%%'..55

%
'+
5& ;.1CC5t-6" ] ^
,# S  $+ 4=c =@ zHHTV r   