
    ,iiU'                        d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZ ddlZej                            ej                            e          dd          Z ej        ed            G d	 d
          Z G d d          Zedk    rd e            Z ed           e                    ddg          Z ed ee           d            ee                                           dS dS )zd
BET.CUTTALO.COM - DATA COLLECTOR
Raccoglie dati sportivi da API gratuite per training rete neurale
    N)datetime	timedelta)DictListOptionalz..dataT)exist_okc            	           e Zd ZdZdZddddddd	d
dZddee         fdZd Z	dede
fdZd dededee
         fdZd dededee
         fdZdede
fdZddee         dej        fdZde
defdZdee
         fdZdS )!FootballDataCollectorz
    Raccoglie dati da football-data.org (API gratuita)
    - 10 richieste/minuto free tier
    - Storico partite, classifiche, statistiche
    z https://api.football-data.org/v4zPremier LeaguezLa LigazSerie A
BundesligazLigue 1zChampions LeaguezEuropean Championshipz	World Cup)PLPDSABL1FL1CLECWCNapi_keyc                     |pt           j                            dd          | _        | j        r	d| j        ini | _        d| _        t          j                    | _        d S )NFOOTBALL_DATA_API_KEY zX-Auth-Tokenr   )	osenvirongetr   headersrequest_countr   nowlast_requestselfr   s     2/var/www/html/bet.cuttalo.com/ml/data_collector.py__init__zFootballDataCollector.__init__&   sU    M"*..1H""M"M9=M552$LNN    c                     | xj         dz  c_         | j         dk    r^t          j                    | j        z
  j        }|dk     rt          j        d|z
             d| _         t          j                    | _        dS dS )zRispetta rate limit: 10 req/min   
   <   r   N)r   r   r   r   secondstimesleep)r!   elapseds     r"   _rate_limitz!FootballDataCollector._rate_limit,   s{    a##|~~(99BG||
2<(((!"D (D $#r$   endpointreturnc                 "   |                                   | j         d| }	 t          j        || j        d          }|                                 |                                S # t          $ r}t          d|            i cY d}~S d}~ww xY w)zGET request con rate limiting/   )r   timeoutzErrore API: N)	r-   BASE_URLrequestsr   r   raise_for_statusjson	Exceptionprint)r!   r.   urlresponsees        r"   _getzFootballDataCollector._get6   s    ++++	|CrJJJH%%'''==??" 	 	 	$$$%%%IIIIII	s   AA& &
B0B	B	B  competitionseasonc                 d    |                      d| d|           }|                    dg           S )z,Ottieni tutte le partite di una competizionecompetitions/z/matches?season=matchesr=   r   )r!   r?   r@   r   s       r"   get_matchesz!FootballDataCollector.get_matchesB   s8    yyNNNfNNOOxx	2&&&r$   c                     |                      d| d|           }|                    dg           }|r|d                             dg           S g S )zOttieni classificarB   z/standings?season=	standingsr   tablerD   )r!   r?   r@   r   rG   s        r"   get_standingsz#FootballDataCollector.get_standingsG   s^    yyPPPPPQQHH["--	 	1Q<##GR000	r$   team_idc                 2    |                      d|           S )zOttieni statistiche squadrazteams/)r=   )r!   rJ   s     r"   get_team_statsz$FootballDataCollector.get_team_statsO   s    yy+'++,,,r$   seasonsc                    |g d}g }dD ]r}t          d| j        |          d           |D ]M}t          d| d           |                     ||          }|                     ||          }i }|D ]L}|d         |d         |d	         |d
         |d         |d         |d         |d         d||d         d         <   M|D ]}	|	d         dk    r|	d         d         }
|	d         d         }|                    |
i           }|                    |i           }i d|	d         d|	d         d|d|d|	d         d         d|	d         d         d|
d|d |	d!         d"         d#         d$|	d!         d"         d%         d&|                     |	          d'|                    dd(          d)|                    dd*          d+|                    d	d*          d,|                    d
d*          d-|                    dd*          d.|                    dd*          |                    dd*          |                    dd*          |                    dd(          |                    dd*          |                    d	d*          |                    d
d*          |                    dd*          |                    dd*          |                    dd*          |                    dd*          |                    dd(          |                    dd(          z
  |                    dd*          |                    dd*          z
  d/}|                    |           t          j        d0           Ott          j
        |          }t          j                            t          d1          }|                    |d23           t          d4t!          |           d5|            |S )6zl
        Raccoglie dati storici per training
        Ritorna DataFrame con feature per ogni partita
        N)i  i    r>   r   r   r   r   zRaccogliendo z...z  Stagione positionpointswondrawlostgoalsForgoalsAgainstgoalDifference)rQ   rR   rS   rT   rU   rV   rW   rX   teamidstatusFINISHEDhomeTeamawayTeammatch_iddateutcDater?   r@   	home_teamname	away_teamhome_team_idaway_team_id
home_goalsscorefullTimehome
away_goalsawayresulthome_positionr'   home_pointsr   home_won	home_draw	home_losthome_goals_for)home_goals_againsthome_goal_diffaway_positionaway_pointsaway_won	away_draw	away_lostaway_goals_foraway_goals_againstaway_goal_diffposition_diffpoints_diffr&   zhistorical_matches.csvF)indexzSalvati z
 match in )r9   COMPETITIONSrE   rI   r   _get_resultappendr*   r+   pd	DataFramer   pathjoinDATA_DIRto_csvlen)r!   rM   all_matches	comp_coder@   rC   rG   team_positionsrY   matchhome_idaway_id
home_stats
away_stats
match_datadfoutput_paths                    r"   collect_historical_dataz-FootballDataCollector.collect_historical_dataS   s   
 ?...G2 J	 J	IC$"3I">CCCDDD! G G/F///000**9f== ..y&AA	 "$% 
 
D$($4"&x.#E{ $V $V$($4(,^(<*./?*@	: 	:N4<#566 % 23 23EX*44 #J/5G#J/5G!/!3!3GR!@!@J!/!3!3GR!@!@J&""E$K&"i 0&" &y&" !&	&"
 $U:%6v%>&" $U:%6v%>&" '&" '&" %eGnZ&@&H&" %eGnZ&@&H&" !$"2"25"9"9&"  (
B)G)G!&"" &z~~h'B'B#&"$ #JNN5!$<$<%&"& $Z^^FA%>%>'&"( $Z^^FA%>%>)&"* )*..Q*G*G+&", /9nn^Q.O.O*4..9I1*M*M *4
B)G)G'1~~h'B'B$.NN5!$<$<%/^^FA%>%>%/^^FA%>%>*4..Q*G*G.8nn^Q.O.O*4..9I1*M*M *4
B)G)G*..YcegJhJh)h'1~~h'B'BZ^^T\^_E`E`'`K&" &" &"JP  &&z2222
1OGR \+&& gll8-EFF
		+U	+++9R99K99:::	r$   r   c                 v    |d         d         d         }|d         d         d         }||k    rdS ||k     rdS dS )z$0 = away win, 1 = draw, 2 = home winrh   ri   rj   rl      r   r&    )r!   r   rj   rl   s       r"   r   z!FootballDataCollector._get_result   sI    W~j)&1W~j)&1$;;1D[[1qr$   c                    g }dD ]u}|                      d| d          }|                    dg           dd         }|                     |          }d |D             }|D ]}|d         d	         }|d
         d	         }	|                    |i           }
|                    |	i           }|                    |d	         |d         || j        |         |d         d         |d
         d         ||	|
                    dd          |                    dd          |
                    dd          |                    dd          |
                    dd          |                    dd          d           w|S )z%Ottieni partite future per predizionirP   rB   z/matches?status=SCHEDULEDrC   Nr'   c                 ,    i | ]}|d          d         |S )rY   rZ   r   ).0ts     r"   
<dictcomp>z>FootballDataCollector.get_upcoming_matches.<locals>.<dictcomp>   s"    DDDQaioqDDDr$   r]   rZ   r^   ra   rc   rQ   rR   r   rX   )r_   r`   r?   competition_namerb   rd   re   rf   rn   rv   ro   rw   ru   r}   )r=   r   rI   r   r   )r!   upcomingr   r   rC   rG   r   r   r   r   r   r   s               r"   get_upcoming_matchesz*FootballDataCollector.get_upcoming_matches   s   2 	 	I99QYQQQRRDhhy"--crc2G**955IDD)DDDN   
+D1
+D1+//<<
+//<<
 %d!),#,(,(9)(D!&z!26!:!&z!26!:$+$+%/^^J%C%C%/^^J%C%C#->>(A#>#>#->>(A#>#>&0nn5Eq&I&I&0nn5Eq&I&I! !    . r$   N)r>   )__name__
__module____qualname____doc__r4   r   r   strr#   r-   r   r=   intr   rE   rI   rL   r   r   r   r   r   r   r$   r"   r   r      s         2H  %	 	L+ + + + + +/ / /
S 
T 
 
 
 
' 's 'C '4: ' ' ' '
  c T$Z    -c -d - - - -] ]tCy ]BL ] ] ] ]~ #    "d4j " " " " " "r$   r   c                   N    e Zd ZdZdZd
dee         fdZddedee	         fd	Z
dS )OddsCollectorzA
    Raccoglie quote da The Odds API (gratuito 500 req/mese)
    zhttps://api.the-odds-api.com/v4Nr   c                 T    |pt           j                            dd          | _        d S )NODDS_API_KEYr   )r   r   r   r   r    s     r"   r#   zOddsCollector.__init__   s"    D"*.."D"Dr$   
soccer_eplsportr/   c                    | j         sg S | j         d| d}| j         dddd}	 t          j        ||d          }|                                 |                                S # t          $ r}t          d	|            g cY d
}~S d
}~ww xY w)zOttieni quote per uno sportz/sports/z/oddseuh2hdecimal)apiKeyregionsmarkets
oddsFormatr2   )paramsr3   zErrore Odds API: N)r   r4   r5   r   r6   r7   r8   r9   )r!   r   r:   r   r;   r<   s         r"   get_oddszOddsCollector.get_odds   s    | 	I44444l#	
 
	|CCCCH%%'''==??" 	 	 	)a))***IIIIII	s   >A# #
B-B BBr   )r   )r   r   r   r   r4   r   r   r#   r   r   r   r   r$   r"   r   r      sz          1HE E E E E E c T$Z      r$   r   __main__zRaccogliendo dati storici...rO   r>   )rM   z

Raccolti z match)r   r5   pandasr   r7   r   r   r   typingr   r   r   r*   r   r   dirname__file__r   makedirsr   r   r   	collectorr9   r   r   r   headr   r$   r"   <module>r      s   
       				 ( ( ( ( ( ( ( ( ' ' ' ' ' ' ' ' ' ' 7<<114@@ Ht $ $ $ $M M M M M M M M`       @ z%%''I 
E
()))		*	*D$<	*	@	@B	E
'B
'
'
'(((	E"'')) r$   