
    'ri                         d Z ddlZddlZddlZddlmZmZ  ej                  d      Z ej                  dej                        Z ej                  d      Z ej                  d      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(d)d)i d*d*d+d+d,d,d-d-d.d.d/d0d0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9d:d:i d;d;d<d<d=d=d>d>d?d?d@dAdAdAdBdBdCdCdDdEdEdEdFdFdGdHdHdHdIdJdJdJdKdKdd8dLdd7d:dd"dddd$d%dMZi dNddOd	dPd
dQddRddSddTddUddVddWddXddYddZdd[dd\dd]dd^di d_dd`ddaddbddcdddddeddfddgddhd did!djd"dkd#dld$dmd%dnd&dod'i dpd	dqd(drd)dsd*dtddud+dvd,dwddxddyd-dzd.d{d0d|d1d}d1d~d2dd3dd4i dd5dd6dddd7dd9dd8dd:dd;dd#dd$dd$dd<dd=dddd>dd'ddi dd?dd	ddddFddLdddd+ddddddEddddddddddddCddBdddd7dJdHd8d:dAdKd#ddZd;d3d0d9dddAdEdHdJdddZi Zej%                         D ]%  \  ZZej+                         d   Zeseevs!eee<   ' dedefdZdedefdZddedee   defdZdedefdZddedee   defdZdededefdZdededefdZdedeeef   fdZ y)z9Player/team name normalization for cross-source matching.    N)OptionalTuplezpub-integrityz\s+(Jr\.?|Sr\.?|III|II|IV|V)$z[^a-z\s]z\s+ATLBOSBKNCHACHICLEDALDENDETGSWHOUINDLACLALMEMMIAMILMINNOPNYKOKCORLPHIPHXPORSACSASTORUTAWASANAARIBUFCGYCARCOLCBJEDMFLALALAKMTLNSHNJDNYINYROTTPITSEASJSSTLTBLVANVGKWPGBALTBTBRNYYNYMKCKCRCWSSFSFGSDSDPTEXCIN)r   r5   rI   r   r4   r7   GSSANONYPHOUTAHWASHzatlanta hawkszboston celticszbrooklyn netszcharlotte hornetszchicago bullszcleveland cavalierszdallas maverickszdenver nuggetszdetroit pistonszgolden state warriorszhouston rocketszindiana pacerszla clipperszlos angeles clippersz	la lakerszlos angeles lakerszmemphis grizzliesz
miami heatzmilwaukee buckszminnesota timberwolvesznew orleans pelicansznew york knickszoklahoma city thunderzorlando magiczphiladelphia 76erszphoenix sunszportland trail blazerszsacramento kingszsan antonio spursztoronto raptorsz	utah jazzzwashington wizardszanaheim duckszarizona coyoteszboston bruinszbuffalo sabreszcalgary flameszcarolina hurricaneszchicago blackhawkszcolorado avalanchezcolumbus blue jacketszdallas starszdetroit red wingszedmonton oilerszflorida pantherszlos angeles kingszmontreal canadiensu   montréal canadiensznashville predatorsznew jersey devilsznew york islandersznew york rangerszottawa senatorszphiladelphia flyerszpittsburgh penguinszsan jose sharkszseattle krakenzst. louis bluesztampa bay lightningztoronto maple leafszutah hockey clubzutah mammothzvancouver canuckszvegas golden knightszwashington capitalsWSHzwinnipeg jetszarizona diamondbackszatlanta braveszbaltimore orioleszboston red soxzchicago cubsCHCzchicago white soxzcincinnati redszcleveland guardianszcolorado rockieszdetroit tigerszhouston astroszkansas city royalszlos angeles angelsLAAzlos angeles dodgersLADzmiami marlinszmilwaukee brewerszminnesota twinsznew york metsznew york yankeesOAK)	athleticszoakland athleticszphiladelphia phillieszpittsburgh pirateszsan diego padreszsan francisco giantszseattle marinerszst. louis cardinalsztampa bay raysztexas rangersztoronto blue jayszwashington nationals)r=   NJr,   SJrQ   )r=   rA   rD   rF   rQ   )nhlmlbvaluereturnc                    | syt        j                  d|       }dj                  d |D              }|j                         j	                         }t        j                  dd|      }t        j                  d|      j	                         }|S )N NFKDc              3   L   K   | ]  }t        j                  |      r|  y wNunicodedata	combining.0cs     -scripts/publishing_integrity/normalization.py	<genexpr>z'_normalize_team_text.<locals>.<genexpr>n        Iq0E0Ea0HI   $$z[^a-z0-9\s.] )rd   	normalizejoinlowerstripresub_MULTI_SPACE)r\   nfkd
ascii_namelowereds       ri   _normalize_team_textrx   j   sw      /DIDIIJ &&(Gff_c73GsG,224GN    namec                 D   | syt        j                  d|       }dj                  d |D              }|j                         j	                         }t
        j                  d|      }t        j                  d|      }t        j                  d|      j	                         }|S )zICanonical player name: lowercase, no accents, no suffixes, single spaces.r_   r`   c              3   L   K   | ]  }t        j                  |      r|  y wrb   rc   rf   s     ri   rj   z(normalize_player_name.<locals>.<genexpr>{   rk   rl   rm   )	rd   rn   ro   rp   rq   	_SUFFIXESrs   
_NON_ALPHArt   )rz   ru   rv   results       ri   normalize_player_namer   u   s      .DIDIIJ%%'F]]2v&F^^B'Fc6*002FMry   abbrevleaguec                 
   | sy| j                         j                         }|xs dj                         j                         }|r)t        j	                  |i       j	                  |      }|r|S t
        j	                  ||      S )zBNormalize a team abbreviation or full team name to canonical form.r_   )upperrq   rp   LEAGUE_ABBREV_ALIASESgetTEAM_ABBREV_MAP)r   r   r   
league_keyaliass        ri   normalize_team_abbrevr      sr    LLN  "E,B%%'--/J%))*b9==eDLue,,ry   c                     | syt        |       S )z9Lowercase, stripped team display name for fuzzy matching.r_   )rx   )rz   s    ri   normalize_team_namer      s    %%ry   c                     t        |       }|syt        j                  |      }|r|S |j                         d   }|t        v r	t        |   S t        | |      S )zOResolve abbreviations, full team names, and nicknames to a canonical team code.r_   r[   )rx   TEAM_NAME_MAPr   splitNICKNAME_ABBREV_MAPr   )r\   r   
normalizeddirect_namenicknames        ri   canonicalize_team_identifierr      s_    %e,J##J/K!"%H&&"8,, //ry   name_aname_bc                 0    t        |       t        |      k(  S )z-Compare two player names after normalization.)r   )r   r   s     ri   player_names_matchr      s     (,A&,IIIry   player_namec                     t        |       }|j                         }t        |      dk\  r|d    d|d    d| j                         S | d| j                         S )z2Generate a canonical ID from player name + league.   r   _r[   )r   r   lenrp   )r   r   normpartss       ri   extract_player_canonical_idr      sd     -DJJLE
5zQ(1U2YKq17799V1VH##%%ry   sgo_idc                     | sy| j                  d      }t        |      dk\  rN|d   j                         }|dd }|r|d   j                         r|dd }dj	                  d |D              }||fS | dfS )	zEParse SGO playerID (FIRST_LAST_N_LEAGUE) into (display_name, league).)r_   r_   r      r[   Nrm   c              3   <   K   | ]  }|j                           y wrb   )
capitalize)rg   ps     ri   rj   z&parse_sgo_player_id.<locals>.<genexpr>   s     >a1<<>>s   r_   )r   r   rp   isdigitro   )r   r   r   
name_partsdisplays        ri   parse_sgo_player_idr      s    LLE
5zQr"3BZ
*R.002#CRJ((>:>>  B<ry   rb   )!__doc__rr   rd   loggingtypingr   r   	getLoggerlogcompile
IGNORECASEr}   r~   rt   r   r   r   r   items	team_nameteam_abbrevr   r   strrx   r   r   r   r   boolr   r   r    ry   ri   <module>r      s]	   ? 	   "g( BJJ7G	RZZ$
rzz&!	5 %u.3U<A5 
5  !&u /4U =B5 
5	 	 !&u	 /4U	 =B5	
 
5
 
 !&u
 /4U
 =B5 
5  !&u /4U =B5 
5  !&u /4U =B5 
5  !&u /4U =B5 
5  !&u /4U =A% 
5  !&u /4U =B5 
5  !&u /4U =B5 
5  !&u /4U =B5 
5   %e .3E <A%  	%!  !   %e!  .25!  ;@!" 	%#" #"  %e#" 5:%uU
uE%+4&U&,e&5De& & !0& 9Nu& 	&  0	& 9J5	&
 U&
 %6u&
 ?OPU& 5& 1%& :Ee& %& "5e& >J5& u& 7& @VW\& u& 6u& ?Nu& %& "0& 9QRW& &  3E& <Me& & -e& U& .u& 7Fu& e& .u& 7LU&  %!&  "6u!&  ?VW\!&" E#&" /#&" 8I%#&$ %&$  3E%&$ <PQV%&& 5'&& #8'&& ATUZ'&( %)&( "4U)&( =Nu)&* 5+&* #8+&* ARSX+&, e-&, /-&, 8Me-&. 5/&. #5e/&. >LU/&0 1&0 !71&0 @UV[1&2 U3&6 E7&6 $4U7&6 =PQV7&8 e9&8 ,U9&8 5H9&: u;&: 4U;&: =OPU;&< e=&< .u=&< 7KE=&> %?&> "7?&> @OPU?&@ A&@ !25A&@ ;J5A&B C&B -2"%UZ!uUZe%!K&T   "  +113 4I{ $HH$77(3H%4    $-# -x} - -&c &c &0 0Xc] 0c 0"Js JC JD J
&S &# &# & c3h ry   