
    x]i-                         d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m	Z	  ed      Z
e
dz  dz  Ze
d	z  d
z  ZdedefdZdedee   fdZdedee   fdZdedee   fdZdededefdZd Zedk(  r e        yy)a  Build/merge betting/nfl_historical.json from Kaggle spreadspoke_scores.csv.

Source file (already present on server):
  data/kaggle/spreadspoke_scores.csv

We treat spread + total as real closing lines (hasRealOdds=True when present).
Moneyline is not provided by this dataset, so remains None.

We MERGE into existing betting/nfl_historical.json by (date, homeTeam, awayTeam):
- keep existing moneylines if present
- fill spread/total if missing
- set hasRealOdds when any real line exists
    N)Path)DictTupleOptional)datetimez/var/www/html/eventheodds/datakagglezspreadspoke_scores.csvbettingznfl_historical.jsonsreturnc                     dj                  | xs dj                         j                         j                               S )N  )joinstriplowersplit)r
   s    J/var/www/html/eventheodds/scripts/build_nfl_historical_from_spreadspoke.py_normr      s.    88QW"OO%++-33566    mdYc                     | sy | j                         } dD ])  }	 t        j                  | |      j                  d      c S  y # t        $ r Y 8w xY w)N)z%m/%d/%Yz%m/%d/%yz%Y-%m-%d)r   r   strptimestrftime	Exception)r   fmts     r   
parse_dater      s^    
))+C' 	$$S#.77
CC
   		s   $A	AAxc                     | y t        |       j                         } | dk(  s| j                         dk(  ry 	 t        |       S # t        $ r Y y w xY w)Nr   nan)strr   r   floatr   r   s    r   to_floatr#   +   sP    yAABw!'')u$Qx s   
A 	AArowc                 <   t        | j                  d            }|sy t        | j                  d      xs d      xs t        |d d       }| j                  d      }| j                  d      xs dj                         }| j                  d      xs dj                         }|r|sy | j                  d	      }| j                  d
      }	 |dvrt        |      nd }	 |dvrt        |      nd }	||	y | j                  d      xs dj                         }
t        | j                  d            }t        | j                  d            }d }d }|=|
r;t        |
      t        |      k(  r|}| }nt        |
      t        |      k(  r|}| }n	 |d uxr |d uxs |d u}||	kD  rd}n
|	|kD  rd}nd}d }|||	z
  }||z   }|dkD  rd}n
|dk  rd}nd}d }|||	z   }||kD  rd}n
||k  rd}nd}d| dt        |      j                  dd       dt        |      j                  dd       }|d||t        |      j                         rt        |      nd ||||	dd d ||dd|ddt        |      |||||	z
  ||	z   dd S # t        $ r d }Y w xY w# t        $ r d }	Y w xY w)!Nschedule_dateschedule_seasonr      schedule_week	team_homer   	team_away
score_home
score_away)Nr   team_favorite_idspread_favoriteover_under_linehomeawaydrawpushoverunderzkaggle-nfl--r   _z-at-nfl)	homeScore	awayScoreir   )moneylineHomemoneylineAway
spreadHome
spreadAwayspreadOddsHomespreadOddsAway	totalLinesource)winnerspreadCoveredtotalResultmargintotalPoints)idsportdateseasonweekhomeTeamawayTeamscoresoddshasRealOddsresult)r   getintr   r   r#   r   replacer    isdigitbool)r$   rK   rL   rM   r1   r2   shsa
home_score
away_scorefav
spread_fav
total_linespread_homespread_awayhas_realrD   spread_coveredrG   adjtotal_resulttpgids                          r   build_recordrh   7   s"   cggo./D*+0q1BSbq]F77?#DGGK &B--/DGGK &B--/Dt		B		B "* 4SW$
 "* 4SW$
 Z/ 77%&,"
3
3
5C#''"345J#''"345JKK #:t$$K%+K3Z5;&$K%+K 4'CKt,C`[_I_H J	j	 Nj({"7#N1W#N#NL*$
?!L*_"L!LvQuT{223s;<DtATATUXY\A]@^
_C  Y..0D	d##

 "!%%""#	
 H~+' :-%
2
/ A  
  
s$   I: J :J	J	JJexistingnewc           	         i }| D ]c  }|j                  d      xs dt        |j                  dd            t        |j                  dd            f}|d   sS|d   sY|d   s_|||<   e d}d}|D ]  }|j                  d      xs dt        |j                  dd            t        |j                  dd            f}||v rr||   }|j                  d      xs i }|j                  d      xs i }	d	D ]:  }
|j                  |
      |	j                  |
      '|	j                  |
      ||
<   < |j                  d
      |	j                  d
      |d
<   |j                  d      |	j                  d      |d<   |j                  d      }|dv r|	j                  dd      |d<   ||d<   t        |j                  d      xs; |j                  d      xs( |j                  d      d uxs |j                  d      d u      |d<   |j                  d      s|j                  d      r|d   |d<   |dz  }|||<   |dz  } t        |j	                               }|j                  d        |||fS )NrK   r   rN   rO   r         rQ   )r>   r?   rB   r<   r=   rC   )Nestimated_DO_NOT_BACKTESTr   rR   r>   rB   rS   c                 &    | j                  dd      S )NrK   r   rT   r"   s    r   <lambda>zmerge.<locals>.<lambda>   s    155+ r   )key)rT   r   rX   listvaluessort)ri   rj   idxgrr   addedupdatedcurcur_oddsnew_oddsksrcouts                r   merger      s   ,.C uuV}"E!%%
2*>$?quuZXZG[A\]q6c!fQCH
 EG  uuV}"E!%%
2*>$?quuZXZG[A\]#:c(Cwwv,"HuuV}*H< 2<<?*x||A/J"*,,q/HQK2 ||O,4,4LL,I)||O,4,4LL,I) ,,x(C99%-\\(8%D""CK!%cggm&<  'lm@T  'lYaYeYefrYs{Y  'l  FN  FR  FR  S^  F_  gk  Fk  "mC 778$x !(HqLGCHQJEA D szz|
CHH+H,wr   c                     t         j                         st        dt                t        j                  j                  dd       g } t        j                         r$	 t        j                  t        t        d            } g }t        t         dd      5 }t        j                  |      }|D ]!  }t        |      }|s|j                  |       # 	 d d d        t        | |      \  }}}t        t        d      5 }t        j                  ||d	
       d d d        t!        d |D              }	t#        dt                t#        dt%        |        dt%        |       d| d|        t#        dt%        |       d|	 d|r|	t%        |      z  dz  nddd       y # t        $ r g } Y (w xY w# 1 sw Y   xY w# 1 sw Y   xY w)NzMissing T)parentsexist_okrr   zutf-8)newlineencodingwrm   )indentc              3   D   K   | ]  }|j                  d       sd  yw)rR   rl   Nrp   ).0rw   s     r   	<genexpr>zmain.<locals>.<genexpr>   s     9QAEE-$8q9s     z#Merged NFL Kaggle spreadspoke into z
Existing: z | New built: z
 | Added: z | Updated: zTotal: z | hasRealOdds: z (d   r   z.1fz%))SRCexists
SystemExitOUTparentmkdirjsonloadopenr   csv
DictReaderrh   appendr   dumpsumprintlen)
ri   rj   fr   r$   recmergedrx   ry   reals
             r   mainr      s   ::<8C5)**JJTD1H
zz|	yyc#/H C	c2	0  ANN1 	 Cs#C

3	   #8S1FE7	c# '!		&!A&' 9&99D	/u
56	Js8}o^CH:Zwl[bZc
de	GCK= 0bSY$s6{:J3:N_`ad8eeg
hi'  	H	   ' 's0   #F (F.?F.;F:F+*F+.F7:G__main__)__doc__r   r   pathlibr   typingr   r   r   r   BASEr   r   r    r   r   r!   r#   dictrh   rs   r   r   __name__ r   r   <module>r      s       ( ( ,-
Xo00
Y..7S 7S 7	C 	HSM 		 	 	od ox~ od/D /t / /dj> zF r   