
    foi7                         d Z ddlZddlZddlmZmZ 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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/d0d/i d1d/d2d3d4d3d5d3d6d7d8d7d9d7d:d;d<d;d=d;d>d?d@d?dAd?dBdCdDdCdEdCdFdGi dHdGdIdGdJdKdLdKdMdKdNdKdOdPdQdPdRdPdSdTdUdTdVdTdWdXdYdXdZdXd[dXd\d]i d^d]d_d]d`dadbdadcdadddadedfdgdfdhdfdidjdkdjdldjdmdjdndodpdodqdodrdsdsdsdtdtdtdudududvdvdvdwi dxdydzdyd{dyd|dd}dd~dddddddddddddddddddddddi dddddddddddddd#dd#dd'dd'dddddddd/dd/dd3dd3i dd3dddddddddddddddddddd7dd7ddddddCddCddKi ddKddddddddddddddddddddaddaddƓddƓddƓddʓddʓdddddddddddddvdvdϜi ddѓddѓddѓddyddydd	dd	ddddddۓddۓddۓddddddddddi dddddddddddddddddddd'dd'ddddddddddddi dddpdddKddKddddddddd dddddddddddddd	d
dd
i ddddddddddddddaddaddƓddƓddƓdddddddd̓dd̓dd i d!d d"d d#d d$d%d&d%d'd%d(dtd)dtd*dtd+dud,dud-d.d/d.d0d.d1d2d3d2d4d2d2d5d5d5d6d6d6d7d8Zd9 Zd: Zd; Ze	d<k(  r e        yy(=  z
Backfill Opening/Closing Lines from GameOdds to SportsGame
Uses GameOdds.openingLineValue and current lines for historical games.

Run: python3 scripts/backfill_opening_closing_from_gameodds.py
    N)datetimetimezonezatlanta hawksATLhawksatlantazboston celticsBOScelticsbostonzbrooklyn netsBKNnetsbrooklynzcharlotte hornetsCHAhornets	charlottezchicago bullsCHIbullschicagozcleveland cavaliersCLE	cavalierscavs	clevelandzdallas mavericksDAL	mavericksmavsdallaszdenver nuggetsDENnuggetsdenverzdetroit pistonsDETpistonsdetroitzgolden state warriorsGSWwarriorszgolden statezhouston rocketsHOUrocketshoustonzindiana pacersINDpacersindianazlos angeles clippersLACclipperszla clipperszlos angeles lakersLALlakersz	la lakerszmemphis grizzliesMEM	grizzliesmemphisz
miami heatMIAheatmiamizmilwaukee bucksMILbucks	milwaukeezminnesota timberwolvesMINtimberwolveswolves	minnesotaznew orleans pelicansNOPpelicansznew orleansznew york knicksNYKknicksznew yorkzoklahoma city thunderOKCthunderzoklahoma cityokczorlando magicORLmagicorlandozphiladelphia 76ersPHI76erssixersphiladelphiazphoenix sunsPHXsunsphoenixzportland trail blazersPORztrail blazersblazersportlandzsacramento kingsSACkings
sacramentozsan antonio spursSASTORUTAWAS)spurszsan antonioztoronto raptorsraptorstorontoz	utah jazzjazzutahzwashington wizardswizards
washingtonzarizona cardinalsARI	cardinalsarizonazatlanta falconsfalconszbaltimore ravensBALravens	baltimorezbuffalo billsBUFbillsbuffalozcarolina panthersCARpantherscarolinazchicago bearsbearszcincinnati bengalsCINbengals
cincinnatizcleveland brownsbrownszdallas cowboyscowboyszdenver broncosbroncoszdetroit lionslionszgreen bay packersGBpackersz	green bayzhouston texanstexanszindianapolis coltscoltsindianapoliszjacksonville jaguarsJAXjaguarsjacksonvillezkansas city chiefsKCchiefszkansas cityzlas vegas raidersLVraidersz	las vegaszlos angeles chargerschargerszlos angeles ramsLARramszmiami dolphinsdolphinszminnesota vikingsvikingsznew england patriotsNEpatriotsznew englandznew orleans saintsNOsaintsznew york giantsNYGgiantsznew york jetsNYJjetszphiladelphia eagleseagleszpittsburgh steelersPITsteelers
pittsburghzsan francisco 49ersSF49ersSEATBTEN)zsan francisconinerszseattle seahawksseahawksseattleztampa bay buccaneers
buccaneersbucsz	tampa bayztennessee titanstitans	tennesseezwashington commanders
commanderszanaheim ducksANAducksanaheimzarizona coyotescoyoteszboston bruinsbruinszbuffalo sabressabreszcalgary flamesCGYflamescalgaryzcarolina hurricanes
hurricanescaneszchicago blackhawks
blackhawkszcolorado avalancheCOL	avalancheavscoloradozcolumbus blue jacketsCBJzblue jacketscolumbuszdallas starsstarszdetroit red wingsz	red wingszedmonton oilersEDMoilersedmontonzflorida panthersFLAfloridazlos angeles kingsLAKzminnesota wildwildzmontreal canadiensMTL	canadienshabsmontrealznashville predatorsNSH	predatorspreds	nashvilleznew jersey devilsNJDdevilsz
new jerseyznew york islandersNYI	islandersznew york rangersNYRrangerszottawa senatorsOTTsenatorssensottawazphiladelphia flyersflyerszpittsburgh penguinspenguinspenszsan jose sharksSJSsharkszsan josezseattle krakenkrakenzst. louis bluesSTLblueszst louis blueszsaint louis bluesztampa bay lightningTBL	lightningboltsztoronto maple leafszmaple leafsleafszutah hockey clubrZ   zvancouver canucksVANcanucks	vancouverzvegas golden knightsVGKzgolden knightsknightsWSHWPG)vegaszwashington capitalscapitalscapszwinnipeg jetsr   winnipeg)nbanflnhlc                 0   | sy t        |       dk  r| j                         r| S | j                         j                         }t        j                  |i       }||v r||   S |j                         D ]  \  }}||v s||v s|c S  | d d j                         S )N      )lenisupperlowerstripTEAM_ALIASESgetitemsupper)	team_nameleague
team_lowerleague_aliasesaliasabbrevs         K/var/www/html/eventheodds/scripts/backfill_opening_closing_from_gameodds.pynormalize_teamr   w   s    
9~y002"((*J!%%fb1N^#j))'--/ vJ*"5M Ra=      c                     d} 	 t        | d      5 }|D ]b  }|j                  d      s|j                  dd      d   j                         j                  d      j                  d      d   c cd d d        S  	 d d d        t
        j                  j                  d	d
      j                  d      d   S # 1 sw Y   ;xY w# t        $ r Y Iw xY w)Nz/var/www/html/eventheodds/.envrzSPORTS_DATABASE_URL==   "?r   SPORTS_DATABASE_URL )open
startswithsplitr   FileNotFoundErrorosenvironr   )env_pathflines      r   load_db_urlr     s    /H(C  	RA R??#9:::c1-a0668>>sCII#NqQQ	R 	RR	R ::>>/4::3?BB	R 	R  s:   B? B3AB3-	B? 7B39B? 3B<8B? ?	C
Cc                     t        d       t        d       t        dt        j                  t        j                        j                                 t        d       t               } t        j                  |       }|j                         }ddd}t        d       |j                  d       i }|j                         D ]F  }|\	  }}}}	}
}}}}t        |	|      }t        |
|      }|t        |      ||f}||d u|d u|d u|d||<   H t        d	t        |       d
       t        d       |j                  d       |j                         }t        dt        |       d       g }g }|D ]  }|\  }}}}	}
}}}}}}|	r|
st        |	|      }t        |
|      }|t        |      ||f}|j                  |      }|s0|t        |      ||f}|j                  |      }|r|r| nd }|r| nd }|s|!|d   s|j!                  ||r| nd |d   f       |d   s|d   r||n|}||j!                  ||r| nd |d   f        t        d       |r8|j#                  d|       t        |      |d<   t        dt        |       d       |r8|j#                  d|       t        |      |d<   t        dt        |       d       |j%                          t        d       |j                  d       |j&                  |d<   t        d|j&                   d       |j%                          t        d       |j                  d        t        d!d"d#d$d%d&d$d'd(d$d)d(       t        d!d* d$d* d$d+ d$d+        |j                         D ]O  }|\  }}}}|dkD  rd,|z  |z  d-d.} d,|z  |z  d-d.}!nd/x} }!t        d!|d#d$|d&d$|d&d0| d1d2|d&d0|!d1d3       Q |j)                          |j)                          t        d4       t        d5       t        d6|d           t        d7|d           t        d8|j                  dd              t        d       |S )9Nz<============================================================z-BACKFILL: Opening/Closing Lines from GameOddszTime: r   )openingclosingz(
[1] Building SportsGame lookup index...a  
        SELECT id, league, DATE("gameDate"), "homeTeam", "awayTeam", "homeScore",
               "openingSpreadHome", "closingSpreadHome", "spreadHome"
        FROM "SportsGame"
        WHERE "gameDate" >= '2024-10-01'
          AND "spreadHome" IS NOT NULL
    )idhas_openinghas_closing	completedcurrent_spreadz
  Indexed z  SportsGame records with spreadsz2
[2] Processing GameOdds with opening line data...a  
        SELECT DISTINCT ON (league, "gameId")
            league, "gameId", DATE("gameDate") as gd, "homeTeam", "awayTeam",
            "openingLineValue", "openingHomeOdds", "openingAwayOdds",
            "lineValue", "homeOdds", "awayOdds"
        FROM "GameOdds"
        WHERE market = 'spreads'
          AND "gameDate" IS NOT NULL
          AND "gameDate" >= '2024-10-01'
        ORDER BY league, "gameId", "fetchedAt" DESC
    z  Found z unique games in GameOddsr  r  r  r  z
[3] Applying updates...z
            UPDATE "SportsGame"
            SET "openingSpreadHome" = %s, "openingSpreadAway" = %s, "updatedAt" = NOW()
            WHERE id = %s
        r	  z  Set z opening lines from GameOddsz
            UPDATE "SportsGame"
            SET "closingSpreadHome" = %s, "closingSpreadAway" = %s, "updatedAt" = NOW()
            WHERE id = %s
        r
  z closing lines from GameOddszF
[4] Setting closing lines from current spreads for remaining games...a  
        UPDATE "SportsGame"
        SET "closingSpreadHome" = "spreadHome",
            "closingSpreadAway" = "spreadAway",
            "closingTotal" = "total",
            "closingMoneylineHome" = "moneylineHome",
            "closingMoneylineAway" = "moneylineAway",
            "updatedAt" = NOW()
        WHERE "homeScore" IS NOT NULL
          AND "closingSpreadHome" IS NULL
          AND "spreadHome" IS NOT NULL
          AND "gameDate" >= '2024-10-01'
    closing_from_currentz# closing lines from current spreadsz
[5] Coverage Report:a  
        SELECT
            league,
            COUNT(*) FILTER (WHERE "homeScore" IS NOT NULL) as completed,
            COUNT(*) FILTER (WHERE "openingSpreadHome" IS NOT NULL) as has_opening,
            COUNT(*) FILTER (WHERE "closingSpreadHome" IS NOT NULL) as has_closing
        FROM "SportsGame"
        WHERE "gameDate" >= '2024-10-01'
          AND league IN ('nba', 'nfl', 'nhl', 'ncaab', 'epl', 'mma')
        GROUP BY league
        ORDER BY completed DESC
    z  Leaguez<10 	Completedz>10Openingz>15Closingz
----------z---------------d   z.1f%z0%z (z>5z) )z=
============================================================zBackfill Complete:z  Opening lines set: z  Closing lines set: z  Closing from current: )printr   nowr   utc	isoformatr  psycopg2connectcursorexecutefetchallr   strr   r   appendexecutemanycommitrowcountclose)"db_urlconncurstats	sg_lookuprowsg_idr   gdhomeawayscorer	  r
  spread	home_norm	away_normkeygameoddsupdates_openingupdates_closinggame_idopen_val	open_home	open_awaycurr_val	curr_home	curr_awaysgkey2	close_valr  open_pct	close_pcts"                                     r   run_backfillrF     s	   	(O	
9:	F8<<-779:
;<	(O]FF#D
++-Ca(E 

56KK  	 I||~ 
ILFvr4ugw"40	"40	s2w	95"$."$.d*$
	#
 
Js9~&&F
GH 

?@KK 
 
	 ||~H	HS]O#<
=>OO  ajmgT49iS\^g4"40	"40	s2w	95]]3CGY	:Dt$B(0H9d(0H9d =(9""H8xirRVx#XY k?2m#4$,$8hI$&&	I:PTVXY]V^'_`A aD 
%'   		
 /is?+,,HIJ   		
 /is?+,,HIJKKM 

STKK  	 %(LLE
 !	F3<<. C
DEKKM 

"#KK  	 
BxnAk#.a	#a	#
OP	Bvhaxq&
23||~ n.1+	7Gq=g+i/4A6Hw;y05Q7I#''Hy6#,a	#a}Bxm2gVY]Z\]fgi\jjklmn IIKJJL	/	 	!%	"2!3
45	!%	"2!3
45	$UYY/Eq%I$J
KL	(OLr   __main__)
__doc__r  r  r   r   r   r   r  rF  __name__ r   r   <module>rK     s    	 '
 '095%!*E3;U 	 !' 0:5 	U	 %.u	 7B5	
 	
 !(
 1:5 	u '25 ;A% JUV[ 	E $/ 8>u GOPU 	% "+E 4<U 	5 #,U 5>u 	  )3E <J5 	5 #,U 5>u 	% "*5 3<U 	 (25 ;H 	e &.u 7B5 	U %0 9B5  	e!  $U!  -4U!" 	5#" #*5#" 3>u#$ 	!%%$ *8%$ AI%%$ R]^c%& 	'& (25'& ;H'( 	5)( #+E)( 4>u)* 	 +* )25+* ;J5+* SXY^+, 	-, !(-, 1:5-. 	e/. &-e/. 6>u/. GUV[/0 	10  &u10 /812 	!%32 *9%32 BKE32 T^_d34 	E54 $+E54 4@56 	U76 .35 UuE5#U=@!U!$/!8A5!5!"+U! 	E! $,U! 5@! 		! !(	! 1:5	!
 	U!
 %/!
 8B5! 	! !(! 	e! &/! 8DU! 	E! $,U! 	%! "+E! 	%! "+E! 	! !(! 	T! $-d! 5@! 	%! "*5! 	e! &-e! 6DU! 	! (1%! :H!  	d!!  %-d!!  5B4!!" 	T#!" $-d#!" 5@#!$ 	%!$ (25%!& 	E'!& $*5'!( 	%)!( ",U)!* 	U+!* %.u+!, 	-!, '1$-!, 9Ft-!. 	d/!. %-d/!0 	51!0 #+E1!2 	3!2 !'3!4 	u5!4 '/5!6 	u7!6 '1%7!6 :Fu7!8 	t9!8 &-d9!8 FJUY!u $D$UY!U!&eA!D"" '"095"5""+U" 	" !)%" 	%	" "*5	"
 	%"
 "*5"
 3<U" 	u" '3E" <CE" 	e" &25" 	e" &1%" :?" HRSX" 	 " )7" @J5" 	"  '" 	U" %0" 	5" #+E" 4>u" 	E" $.u" 7@" 	U" %,U" 	%" "("  	e!"  &1%!"  :@!"  ISTY!"" 	u#"" '25#"" ;B5#"" KVW\#"$ 	U%"$ %-e%"$ 6B5%"& 	e'"& &1%'"( 	E)"( $-e)"* 	5+"* #-e+"* 6<U+"* EMe+", 	u-", '/-". 	u/". '1%/". :@/"0 	51"0 #+E1"0 4>u1"2 	%3"2 "*53"4 	55"4 #*55"4 3CE5"4 L_`e5"6 	u7"6 '257"6 ;B57"8 	u9"8 '4U9"8 =DU9": 	E;": $*5;"< 	U="< %.u="< 7B5="> 	?"> (8?"> AJ5?"> \a$%5C"GfR!	ChV zN r   