
    N^iM                         d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ  ed      Z	e	dz  Z
e	dz  Zg d	Zd
edee   fdZdee   fdZdee   dee   fdZdedee   fdZdefdZd Zedk(  r e        yy)a  Build soccer league historical betting files from football-data.co.uk-style CSVs (Kaggle).

Inputs:
  data/kaggle/{league}_{season}.csv where league in (epl,bundesliga,laliga,ligue1,seriea)
  season token examples: 1920, 2021, 2122, 2223, 2324

Outputs:
  data/betting/{league}_historical.json (standard schema)

We use AvgH/AvgD/AvgA (decimal odds) when available, else B365H/B365D/B365A.
We also ingest Asian handicap (AHh) as spreadHome and infer spreadAway.
Total line is set to 2.5 when over/under odds exist.
    N)datetime)Path)Optionalz/var/www/html/eventheodds/datakagglebetting)epl
bundesligalaligaligue1serieadreturnc                     | xs dj                         } | sy dD ])  }	 t        j                  | |      j                  d      c S  y # t        $ r Y 8w xY w)N )z%d/%m/%Yz%d/%m/%y%Y-%m-%dr   )stripr   strptimestrftime	Exception)r   fmts     N/var/www/html/eventheodds/scripts/build_soccer_historical_from_footballdata.py
parse_dater      sc    	
bA3 	$$Q,55jAA
   		s   $A	AAc                     | xs dj                         } | r| j                         dv ry 	 t        |       S # t        $ r Y y w xY w)Nr   )nanan)r   lowerfloatr   xs    r   to_floatr    +   sE    	
bA	\)Qx s   
6 	AAdecc                     | y | dk  ry | dk\  rt        t        | dz
  dz              S t        t        d| dz
  z              S )Ng      ?g       @d   i)intround)r!   s    r   decimal_to_americanr&   5   sM    
{
cz
cz5#)s*+,,uTS3Y'())    tokenc                 r    t        j                  d|       }|sy t        |j                  d            }d|z   S )Nz(\d{2})(\d{2})   i  )re	fullmatchr$   group)r(   myy1s      r   infer_season_start_from_tokenr0   @   s4    
&.A
aggaj/C#:r'   leaguec                    t        t        j                  |  d            }g }|D ]  }|j                  j	                  dd      d   }t        |      xs d }t        |ddd      5 }t        j                  |      }|D ]  }t        |j                  d            }	|	s!|j                  d	      xs dj                         }
|j                  d
      xs dj                         }|
r|sl|j                  d      }|j                  d      }	 |dvrt        |      nd}|dvrt        |      nd}t        |j                  d            }t        |j                  d            }t        |j                  d            }|t        |j                  d            }|t        |j                  d            }|t        |j                  d            }t        |      }t        |      }t        |      }t        |j                  d      xs |j                  d            }d }t        |j                  d            t        |j                  d            d}||z
  }|dkD  rdn|dk  rdnd}|||||| nd |ddt!        fdd D              }|xs t        |	d d!       }|j#                  |  d"|	 d"|
j%                         j'                  d#d       d$|j%                         j'                  d#d       d | | |	||
|||d%t)        |      ||||z   d&d'|id(        	 d d d         |j+                  d) *       t,        |  d+z  }t,        j/                  d,d,-       t1        j2                  |t        |d.      d/0       t5        d1 |D              }t7        |  d2t9        |       d3| d4| d5|r|t9        |      z  d6z  ndd7d8
       y # t        $ r Y [w xY w# 1 sw Y   xY w)9Nz_*.csv_r*   r   zutf-8ignore)newlineencodingerrorsDateHomeTeamAwayTeamFTHGFTAG)Nr   r   AvgHAvgDAvgAB365HB365DB365AAHhAHChzAvg>2.5zAvg<2.5g      @homeawaydrawzfootball-data.co.uk)moneylineHomemoneylineDrawmoneylineAway
spreadHome
spreadAway	totalLinesourcec              3   D   K   | ]  }j                  |      d u  y wNget).0koddss     r   	<genexpr>zbuild_league.<locals>.<genexpr>   s$       L1txx{$6  Ls    )rH   rJ   rI   rK   rM      - z-vs-)	homeScore	awayScore)winnermargintotalPointsseasonToken)idbdl_game_idsportr1   dateseasonhomeTeamawayTeamscoresrU   hasRealOddsresultmetac                 &    | j                  dd      S )Nrc   r   rQ   r   s    r   <lambda>zbuild_league.<locals>.<lambda>   s    155+ r'   )keyz_historical.jsonT)parentsexist_okw   )indentc              3   D   K   | ]  }|j                  d       sd  yw)rh   r*   NrQ   )rS   gs     r   rV   zbuild_league.<locals>.<genexpr>   s     6Q}!5q6s     z: wrote z
 games -> z | hasRealOdds=z (r#   z.1fz%))sortedKAGGLEglobstemsplitr0   opencsv
DictReaderr   rR   r   r$   r   r    r&   anyappendr   replaceboolsortBETTINGmkdirjsondumpsumprintlen)r1   filesoutfpr(   season_startfrrowrc   rE   rF   hsas_hs_ias_iavg_havg_davg_aml_homeml_drawml_awayahh
total_liner]   r\   has_real
season_intout_filerealrU   s                                 @r   build_leaguer   J   s   6;;&012E
C Oc!$Q'4U;Ct"b78D K	q!A I!#''&/2
+1r88:
+1r88:4WWV_ggfo&(	&93r7qD'*)';3s8D
 !1 1 1=$SWWW%56E=$SWWW%56E=$SWWW%56E-e4-e4-e4 swwu~@A "
CGGI./;xPYHZ?[?g!$J #)A:fqjFf &-%,%,"%,/OC4!+3   L  AK  L  L):Sbq]


#HAdV1TZZ\-A-A#c-J,K4PTPZPZP\PdPdehilPmOno#'#$ ( $ $,0tD #'>)/6RVY]R]^*E2 wIK	 K		Ob HH+H,F8#344HMM$M.IIc4%a06#66D	VHHSXJj
/$rilSWX[\_X`S`adSdrstwQxxz
{|G ! !K	 K	s2   (B&O"O1G0O	O	OO	OO)	c                  0    t         D ]  } t        |         y rP   )LEAGUESr   )r1   s    r   mainr      s     Vr'   __main__)__doc__r{   r   r+   r   pathlibr   typingr   BASErv   r   r   strr   r   r    r$   r&   r0   r   r   __name__ r'   r   <module>r      s      	   ,-	


9
# 
(3- 
8E? *Xe_ *# * # [} [}|
 zF r'   