
    *h(                     z   S SK JrJrJr  S SKrS SKJrJr  S SK	J
r
  S SKrSSSSS.r/ S	QrS
SS S S S S.r/ SQ/ SQ/ SQ/ SQ/ SQS.r/ SQr/ SQ/ SQ/ SQ/ SQ/ SQS.r/ SQrSrSrSr\" 5       rS rS rS&S jrS rS rS rS rS rS\R>                  4S jr S \\\!\4      S\\"   4S! jr#S"\$S\$4S# jr%S$ r&S% r'g)'    )AnyDictListN)load_players_dataload_teams_data)get_player_stats         )GKDEFMIDFWD)z5-4-1z5-3-2z5-2-3z4-5-1z4-4-2z4-3-3z3-4-3z3-5-2   g      ?)adisun)r         ?      ?gffffff?r   r   r   333333?r   r         )r   r   r   g?g333333?r   gffffff?gffffff?r   r   r   )r   r   r   r   r   g皙?r   r   r   r   )r   r   r   r   {Gz?g333333ÿr   r   g      ?g      ?r   )r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   MNG)points_per_gameform	ict_indexexpected_goalsexpected_assistsexpected_goals_concededgoals_scoredassistsclean_sheetssaves
Difficultyb   d   c                 8    [         U S-
     nUS   US   US   S.$ )z,
Returns the team name for a given team ID.
r   id
short_namecode)r,   namer.   )TEAMS)team_idteams     9G:\Projects\Python Projects\Fantasy API\squad\services.pyget_team_namer4   F   s,     1Dt*d<&8$v,OO    c                 R    [        S U  5       5      nU[        :  d
  U[        :  a  gg)zN
Validates overall team constraints:
  - Total price within the budget range.
c              3   *   #    U  H	  oS    v   M     g7fnow_costN .0players     r3   	<genexpr> validate_team.<locals>.<genexpr>S   s     <tVZ(t   FT)sum
BUDGET_MIN
BUDGET_MAX)r2   total_prices     r3   validate_teamrE   N   s)    
 <t<<KZ;#;r5   c           
      $   [         R                  5        Vs0 s H  o3/ _M     nnU  H$  nUS   U;   d  M  XES      R                  U5        M&     [        U5       GH-  n/ n0 nSn	[         R	                  5        H  u  p:UR                  U/ 5      n[        S[        [        U5      U-  5      5      nUSU n/ nSn[        U5      U
:  ay  US:  as  [        R                  " U5      nUU;  a;  UR                  US   S5      nU[        :  a  UR                  U5        US-   UUS   '   US-  n[        U5      U
:  a  US:  a  Ms  [        U5      U
:  a  Sn	  OUR                  U5        M     U	(       d  GM  [        U5      (       d  GM,  Us  $    gs  snf )	ap  
Generates a team using greedy randomized selection:
  - For each position, sort players by a greedy metric ('form') or (Total points).
  - Create a Restricted Candidate List (RCL) from the top rcl_percent of players.
  - Randomly select players from the RCL while enforcing the maximum team constraint.
  - Validate overall constraints (budget and team composition).
element_typeTr   Nr      r2   F)	SELECTIONkeysappendrangeitemsgetmaxintlenrandomchoiceMAX_PLAYERS_PER_TEAMextendrE   )playersmax_attemptsrcl_percentposposition_groupspattemptr2   team_countsvalidcount
candidatesrcl_sizerclselected_for_positionattempts_for_position	candidatecurrent_team_counts                     r3   generate_team_greedy_randomizedrg   Z   s    +4..*:;*:3Bw*:O;^/n-.55a8 
 & $//+JC(,,S"5J 1c#j/K"?@AHYh'C$&!$%!+,u49NQT9T"MM#.	!%::)469JA)N&),@@-44Y?9Ka9OIf$56%*% +,u49NQT9T ()E1KK-.5 ,: 5]4((KI 'L Y <s   Fc                 .   / / S.n[        [        R                  5       5      nS/nUR                  U R	                  S5       Vs/ s H  n[        U5      PM     sn5        [        [        X45      5      nUR                  5        Hy  u  pxU V	s/ s H  oS   U:X  d  M  U	PM     n
n	[        U
S S9n
US   R                  U
S U  V	s/ s H  oPM     sn	5        US   R                  XS   V	s/ s H  oPM     sn	5        M{     U$ s  snf s  sn	f s  sn	f s  sn	f )	N)XISubsr   -rG   c                     U S   * $ Ntotal_pointsr:   xs    r3   <lambda> create_team_XI.<locals>.<lambda>   s    >1B0Br5   keyri   rj   )
listrI   rJ   rU   splitrP   dictziprM   sorted)	formationr2   team_layout	positionsplayers_countplayers_numplayers_by_positionspositionr_   r=   position_candidatess              r3   create_team_XIr      s#   R(KY^^%&ICMiooc>RS>R{#k*>RSTI =>/557!%
!%v)?8)KF 	 
 %%C
 	D  7J6E7R!S7RV&7R!STF""9LV9T#U9TvF9T#UV 8  T
 "T#Us   DDDD
+D
c           
      R   0 nSnSn[        [        R                  5       5      n[         H  nS/nSnUR	                  UR                  S5       Vs/ s H  n[        U5      PM     sn5        [        [        XF5      5      n	U	R                  5        Hq  u  pU  Vs/ s H  nUS   U
:X  d  M  [        US   5      PM     nn[        [        U5      5      n[        US S9nU[        US	U  Vs/ s H  oS
   PM	     sn5      -  nMs     XqU'   Xr:  d  M  UnUnM     U$ s  snf s  snf s  snf )a4  
Suggest a team formation using greedy selection:
  - For each position, choose the best players by a greedy metric ('form') or (Total points) to make the best XI for the given foramtion and team.
  - Assign each formation a score Calculated fto the greedy metric
  - Choose The Formation with Heighst score
r    r   rk   rG   r,   c                     U S   * $ rm   r:   ro   s    r3   rq   (suggest_team_formation.<locals>.<lambda>   s    Q~5F4Fr5   rs   Nrn   )ru   rI   rJ   
FORMATIONSrU   rv   rP   rw   rx   rM   r   ry   calculate_player_expected_scorerA   )r2   scoreheighst_scoreselected_formationr|   rz   r}   metric_scorer~   r   r   r_   r=   r   position_players_scoress                  r3   suggest_team_formationr      sW    EMY^^%&I	)//RUBVWBV;c+.BVWX#C	$AB399;OH ##"F.)X5 / ."   #
 '-/0CD'# #)#)G# C6I&56QR6QF'6QR L  <  (i'(M!*1  2 - X# Ss   D
D*D*D$c                     [         R                  " U 5      nU/ SQ   nUS   R                  S 5      US'   UR                  SS9$ )N)	web_namerG   r2   r9   r   rn   statusnews	opta_coder2   c                     [        U 5      $ N)r4   ro   s    r3   rq   format_squad.<locals>.<lambda>   s	    M!,<r5   recordsorient)pd	DataFrameapplyto_dict)squaddfs     r3   format_squadr      sK    	e	B	
	

B F!!"<=BvJ::Y:''r5   c                  \    [        5       n U R                  SS/SS/S9n U R                  SS9$ )Nr   rn   F)by	ascendingr   r   )create_player_selection_poolsort_valuesr   )rV   s    r3   selectable_players_datar      s@    *,G!!^$ " G ??)?,,r5   c                     U S   n[         U   nSn[        [        5       H  u  pEU[        X   5      X$   -  -  nM     [	        X0S   -  S5      $ )NrG   r   availabilityr   )SSELECTION_WEIGHTS	enumerateSELECTION_COLSfloatround)rowrY   weightsweighted_sumr   cols         r3    calculate_player_composite_scorer      sX    
n
C %GLN+ch'*44 ,N 33Q77r5   returnc                     [         R                  " [        5       5      n X S      n [        [        S S 5        U / SQ[        S S -      nUS   R                  S 5      US'   [         R                  " [        5      SS/   nUR                  SS	0S
9n[         R                  " XS	SS9nUR                  [        SS9US'   U$ )N
can_select)r   r9   r   rn   r2   rG   r   r   r   c                     [         U    $ r   )STATUS)elems    r3   rq   .create_player_selection_pool.<locals>.<lambda>  s    VD\r5   r   r,   r(   r2   )columnsinner)onhowr   )axisr   )r   r   r   print
SCORE_COLSmapr0   renamemerger   calculate_composite_score)rV   player_selectionteamss      r3   r   r      s    ll,./Gl+,G	*Sb/		
 Sb/
	 (8'A'E'E!(^$ LL| 45ELL$L0Exx 0FP 0 6 6! !7 !W r5   pos_playersc                 t    / nU  H0  nSnUS   nUS   nUS   S-  nUS   S-  n[        US   5      S	-  nM2     g )
Ng?expected_goals_per_90expected_assists_per_90r   g      $@r    g      Y@r2   r
   )!get_current_gw_opponent_diffuclty)	r   players_scoresr=   minutes_played_probability	xg_per_90	xa_per_90r   r    match_difficultys	            r3   r   r     se     N%("23	45	f~$;'%/	<VF^LqP  	r5   r1   c                     g r   r:   )r1   s    r3   r   r     s    r5   c                  h    [        5       n [        U 5      n[        S U 5       5      [        U5      S.$ )Nc              3   *   #    U  H	  oS    v   M     g7fr8   r:   r;   s     r3   r>   &select_random_squad.<locals>.<genexpr>#  s     Fvz 2r@   )zTotal Team PriceTeam)r   rg   rA   r   )playersListr2   s     r3   select_random_squadr     s4    )+K*;7DFFFT" r5   c                 6    [        U 5      n[        X5      nXS.$ )N)	Formationr   )r   r   )r2   rz   r{   s      r3   
pick_squadr   (  s    &t,I 1K"88r5   )i'  r   )(typingr   r   r   pandasr   fantasy_data.servicesr   r   players.servicesr   rR   rI   r   r   r   r   EXPECTED_POINTS_WEIGHTSEXPECTED_POINTS_COLSrB   rC   rT   r0   r4   rE   rg   r   r   r   r   r   r   r   strr   r   rP   r   r   r   r:   r5   r3   <module>r      s)   " "  D -  			
 
		
	
	
	

 CBI
D,  CBI
D,   

 P	5p$$N((-8bll :	d38n%		%[		c 	S 	9r5   