
    <]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  ed      Z	e	dz  dz  Z
e	dz  d	z  Zd
edefdZdee   fdZdee   fdZdedee   fdZdeeeeef   ef   fdZd Zedk(  r e        yy)aL  Build/merge betting/nhl_historical.json from Kaggle nhl_data_plus.csv.

Source:
  data/kaggle/nhl_data_plus.csv

The Kaggle file is team-level (two rows per game_id). We group into one game:
- homeTeam / awayTeam from is_home
- scores from goals_for
- totalLine from over_under
- spreadHome from 'spread' (appears to be HOME team puck line)
- spreadAway = -spreadHome
- moneyline: only favorite_moneyline is provided; we assign it to home if spreadHome<0 else to away if spreadHome>0.

We merge by (date, homeTeam, awayTeam) into betting/nhl_historical.json, filling missing fields only.
    N)Path)DictTupleOptionalz/var/www/html/eventheodds/datakaggleznhl_data_plus.csvbettingznhl_historical.jsonsreturnc                     dj                  | xs dj                         j                         j                               S )N  )joinstriplowersplit)r	   s    E/var/www/html/eventheodds/scripts/build_nhl_historical_from_kaggle.pynormr      s.    88QW"OO%++-33566    c                     | y t        |       j                         }|dk(  s&|j                         dk(  s|j                         dk(  ry 	 t        t	        |            S # t
        $ r Y y w xY wNr   nanan)strr   r   intfloat	Exceptionxr	   s     r   to_intr       sb    yAABw!'')t#qwwyE'958} s   
A 	A*)A*c                     | y t        |       j                         }|dk(  s&|j                         dk(  s|j                         dk(  ry 	 t        |      S # t        $ r Y y w xY wr   )r   r   r   r   r   r   s     r   to_floatr!   ,   s]    yAABw!'')t#qwwyE'9Qx s   

A 	A! A!dtc                 P    | sy | j                         } | j                  d      d   S )Nr   r   )r   r   )r"   s    r   	date_onlyr$   8   s&    	B88C=r   c                     i } t        t        dd      5 }t        j                  |      }|D ]>  }|j	                  d      }|s| j                  |dg i      }|d   j                  |       @ 	 d d d        i }| j                         D ]g  \  }}|d   }t        |      dk  rt        d |D        d       }t        d |D        d       }	|r|	sFt        |j	                  d	      xs d      }
|
sg|j	                  d
      xs dj                         }|	j	                  d
      xs dj                         }|r|st        |j	                  d            }t        |	j	                  d            }||t        |j	                  d            xs t        |
d d       }t        |j	                  d            }t        |j	                  d            }|| nd }t        |j	                  d            }d }d }|||dk  r|}n|dkD  r|}t        d ||||fD              }||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 d|
|||||d|||||d d!d!d"t%        |      |||||z
  ||z   d#d$}|||
t!        |      t!        |      f<   j |S # 1 sw Y   xY w)%Nr   zutf-8)newlineencodinggame_idrows   c              3   v   K   | ]1  }t        |j                  d             j                         dv s.| 3 yw)is_home)1TruetrueNr   getr   .0r   s     r   	<genexpr>zbuild_games.<locals>.<genexpr>R   s/     ]1AEE),<(=(C(C(EI\(\Q]   /99c              3   v   K   | ]1  }t        |j                  d             j                         dv s.| 3 yw)r,   )0FalsefalseNr0   r2   s     r   r4   zbuild_games.<locals>.<genexpr>S   s/     _1AEE),<(=(C(C(EI^(^Q_r5   date	team_name	goals_forseason   
over_underspreadfavorite_moneyliner   c              3   $   K   | ]  }|d u 
 y wN )r3   vs     r   r4   zbuild_games.<locals>.<genexpr>t   s     Rq}Rs   homeawaydrawpushoverunderzkaggle-nhl--r   _z-at-nhl)	homeScore	awayScorer   i)moneylineHomemoneylineAway
spreadHome
spreadAway	totalLinesourcespreadOddsHomespreadOddsAway)winnerspreadCoveredtotalResultmargintotalPoints)idbdl_game_idsportr:   r=   homeTeamawayTeamscoresoddshasRealOddsresult)openSRCcsv
DictReaderr1   
setdefaultappenditemslennextr$   r   r   r   r!   anyr   replacebool)per_gamefrrowgidgoutr)   rF   rG   r:   	home_team	away_teamshsar=   ouspread_homespread_awayfav_mlml_homeml_awayhas_realrY   spread_coveredr\   adjtotal_resulttprecs                                 r   build_gamesr   @   s|    "H	c2	0 "ANN1 	"C'')$C##C&"6AfIS!	"" -/C.." b<Qyt9q=]]_cd__aef4&)/R0XXk*0b779	XXk*0b779		DHH[)*DHH[)*:*+<s48}dhh|,-txx12(3(?|T!567+"9Q q Rr;.QRR 7F"WFF""WF;&CQw!'q!'!'>bBBw%b&%  vQtI'>'>s3'G&HTR[_MdMdehilMmLno!!$&R8!(!())""&"&	  > !/+r'!Bw)
: 9<T4	?DO45Eb<H J_" "s   AK66L c                     t         j                         st        dt                g } t        j                         r$	 t	        j
                  t        t        d            } t               }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}|j                         D ]  \  }}||v r||   }|j                  d
      xs i |j                  d
      xs i }	dD ]:  }
j                  |
      |	j                  |
      '|	j                  |
      |
<   < j                  d      dv rdd<   |d
<   t        |j                  d      xs t        fddD                    |d<   |j                  d      s|j                  d      r|d   |d<   |dz  }|||<   |dz  } t        |j                               }|j!                  d        t        j"                  j%                  dd       t	        j&                  |t        t        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)%NzMissing ru   r:   r   ra   rb   r      r*   rd   )rQ   rR   rS   rT   rU   rW   rX   rV   )Nestimated_DO_NOT_BACKTESTr   re   c              3   D   K   | ]  }j                  |      d u  y wrC   r1   )r3   kcur_oddss     r   r4   zmain.<locals>.<genexpr>   s)       DedeHLLQRO[_D_  Des    )rQ   rR   rS   rU   rf   c                 &    | j                  dd      S )Nr:   r   r   )r   s    r   <lambda>zmain.<locals>.<lambda>   s    155+ r   )keyT)parentsexist_okw)indentc              3   D   K   | ]  }|j                  d       sd  yw)re   r   Nr   )r3   rx   s     r   r4   zmain.<locals>.<genexpr>   s     6Q}!5q6s     zMerged NHL Kaggle into z
Existing: z | Kaggle games: z
 | Added: z | Updated: zTotal: z | hasRealOdds: z (d   z.1fz%))rh   exists
SystemExitOUTjsonloadrg   r   r   r1   r   rm   rr   rp   listvaluessortparentmkdirdumpsumprintrn   )existingkaggle_gamesidxrx   r   addedupdatedkgcurnew_oddsr   ry   realr   s                @r   mainr      s   ::<8C5)**H
zz|	yyc#/H =L,.C uuV}"Dz")=$>QUU:VXEY@Z[q6c!fQCH
 EG%%' R#:c(Cwwv,"Hvvf~+H  2<<?*x||A/J"*,,q/HQK2 ||H%)LL%-""CK!%cggm&<  'e  De  jd  De  Ae  "fC778$)9 "8HqLGCHQJE+. szz|
CHH+H,JJTD1IIc4C=+6#66D	#C5
)*	Js8}o%6s<7H6ITYSZZfgnfo
pq	GCH:-dV2StCH}S7HVWX[5\\^
_`]  	H	s   #K# #K21K2__main__)__doc__ri   r   pathlibr   typingr   r   r   BASErh   r   r   r   r   r   r   r!   r$   dictr   r   __name__rD   r   r   <module>r      s        ( (,-
Xo++
Y..7C 7C 7	# 		8E? 	# (3- rT%S#.45 rj6ar zF r   