
    j              	          d Z ddlmZ ddlZddlZdddddd	d
ddZddddddddZg dZ	dddddddZ
dg dfdg dfd g d!fd"Zd#ddddd$Zd%d&d%d"ZdZdZd)d*d'Zd+d,d(Zy)-a  Synthetic fixture world with PLANTED ground truth.

We generate reference tables (tvuniverse, gl_ratings, curves, factors) and a
history of observed broadcasts (global_sports) from a known generative model:

  log AMA = log(session_base) + log(share_ratio_vs_flagship) + log(hour_w)
            + log(weekday_w) + log(telecast_mult) + Normal(0, sigma)

Because WE own the truth, the engine's job is measurable: recover it.
    )annotationsN      ?皙?ffffff?gQ?333333?Q?皙?{Gz?)LIVEDELAYEDz	ON-DEMANDPRE_POST_ANALYSISOTHERS
HIGHLIGHTSREPEATARCHIVE?g)\(?g\(\?g?gffffff?g333333?)r                     )r   g      ?g
ףp=
?gQ?r	   r   g333333??g      ?r   r   Q?皙?g333333?r   r   r   皙?g333333?r   gffffff?r   r   g?)i r   )i0  r   )iY  r   )i`m  r   )i4!  r   )ih  r   )IndiazUnited Kingdom	AustraliaSouth AfricaUAE	Singaporeg)\(?)Mumbai KingsChennai TitanszDelhi ChargerszPunjab LionszBengal RiderszHyderabad HawksgQ?)r   r   Englandr   g;On?)zPatna PirateszU MumbazJaipur PantherszBengal Warriors)zT20 Super LeagueWorld Test SeriesPremier Kabaddig?)r   r   r$   r"   r#   r   r   c                \	  &' t         j                  j                  |       }i g g c&}}t        j	                         D ]  \  }\  }}|j                  ||d       t        j                  |j                  dd|            d d d   }t        |      D 	cg c]  }	|j                         d    d|	dz     }
}	t        t        |
|            &|<   &|   D ]-  \  }}|j                  ||t        t        |      d      d	       /  t        j                  |      }t        j                  |      }d
 'g }t        j                   d      }t        |      D ]  }|t        j"                  |      z   }t$        j	                         D ]  \  }\  }}|j                         dk  st        |j'                  |dd            }&j	                         D ]^  \  }}
||fdv r|j                         dk  s"|
t)        |j+                  dt-        dt/        |
                           \  }}|
d   d   }t)        |j'                  g dg d            }|j                         dk  rdnt1        |j'                  g d            } '||||||j3                         ||      }t        t        j4                  ||j7                  dt8              z               }|j                  |||dj;                  |      |j=                         j?                         |j3                         ||t        |d      d	       a   t        j                  |      }|||t        j                  t@        j	                         D cg c]
  \  }}||d c}}      t        j                  tB        j	                         D cg c]
  \  }}||d c}}      t        j                  tE        tF              D  cg c]
  \  }} || d c} }      t        j                  tH        j	                         D ! cg c]
  \  }!} |!| d c} }!      t        j                  tJ        j	                         D "#cg c]  \  }"}#|"|#tL        d c}#}"      d }$d"&'fd!}%|$|%fS c c}	w c c}}w c c}}w c c} }w c c} }!w c c}#}"w )#N)countrytvuniverse_000g{Gz?r   r   z Sports r   r   )r(   channelti_total_day_sharec                P   t         |    \  }}	t        |   d   }
||
z  }t        t        j                  |D cg c]  }t
        j                  |d       c}            }t        |    |k(  rt        nd}t        j                  |      t        j                  ||z        z   t        j                  t        |         z   t        j                  t        |         z   t        j                  t        |         z   t        j                  |      z   t        j                  |      z   S c c}w )Nr   r   )EVENTS	COUNTRIESfloatnpmeanTEAM_WEIGHTgetHOSTHOST_UPLIFTlogHOUR_W	WEEKDAY_WTELECAST_MULT)eventr(   channel_shareflagship_sharehourwdtelecastteams	base_frac_tvusessionttwhosts                  engine/world.pytrue_log_amaz!build_world.<locals>.true_log_ama8   s    e}	1 #c/277UCKOOAs3CDE"5kW4{#w"&&)G"HH&&&')+	")>?&&x01246FF2J?ACN 	O Ds   D#z
2025-10-01daysr   r   Freplace>   r&   r!   r%   r    gffffff?)               )r	   r   皙?r   rV   pr   r   )r   r   r    | )	
event_namer(   r+   rA   dateweekdayr>   telecast_typeama_000)r]   
multiplier)r\   weight)r>   r`   )teamr`   )rZ   host_countryfactor)
tvuniverse
gl_ratingsglobal_sportstelecast_multipliersweekday_weightshour_weightsteam_weightshost_factorc                T   | d      }t        |      | d      }t        | d         j                  d      D cg c]  }|j                          }}t	        t        j                   | d   | d   ||d   d   t        | d         t        | d	         | d
   |                  S c c}w )Nr(   r+   rA   |rZ   r   r   r>   r\   r]   )dictstrsplitstripr0   r1   expint)rowchssharerF   rA   channelsrJ   s        rI   truth_fnzbuild_world.<locals>.truth_fnt   s    s9~&S	#i.)$'G$5$;$;C$@AqAARVVL\):C	NE),QCF4D),S^)<c/>R).0 1 2 	2 Bs   B%)returnr0   )'r1   randomdefault_rngr/   itemsappendsortuniformrangerp   listziproundr0   pd	DataFrame	Timestamp	Timedeltar.   choicers   integersminlenro   r\   rr   normalNOISE_SIGMAjoinr[   	isoformatr:   r9   	enumerater8   r3   r5   r6   )(seedn_history_daysrnggl_rowstvu_rowsr(   rD   nchsharesiru   chshrd   re   rowsstartdr[   r;   rC   poolrA   flagshipr>   r@   muamarf   kvhwrF   ecrefrx   rw   rJ   s(                                         @@rI   build_worldr   )   s'   
))


%C"$b"Hgx(0 H#sGsCDT456tt<=B3ZH'--/!$%XacU3HH S&!12w' 	HFBNNw227b	12EG H	HH h'Jg&J	O DLL&E>" @r||++ & 	@E9Atzz|d"SZZaZ?@$,NN$4 @LGS
 w' ,J J zz|c)!$SaQC9I)J%K!LB#&q6!9"3::.BF\:#]^-0ZZ\C-?6

+N OP !)%"h*.,,.(EK#BFF2

1k0J+J$KL5W02UZZ=N-1YY[-B-B-D046>05c1%? @#@	@@8 LL&M !
& "?L?R?R?TUtq!q2U!W<<5>__5FGTQa(GI2;F2CD$!Qa1%DF2=2C2C2EF$!Qa1%FH||'A qKH '(C 2 =Y Ip VGDF's$   "R7R3R*R&R""R(c                <   t         j                  j                  |      }| d   }| d   j                  d      d   j	                  t
              j                         }g t        j                  d      }}t        t        j                               }t        |      D ]i  }	|t        |j                  dt        |                     \  }
\  }}t        |j!                  t        t"                          }t        |j!                  ||               }|t        j$                  t        |j                  dd                  z   }t        |j!                  g d	            }t        |j!                  t        t&              g d
            }t        |j!                  |dd            }|j)                  |
|||d    d|d    dj+                  |      |j-                         j/                         |j1                         ||d	       l t        j2                  |      S )z?A future schedule to estimate (dates AFTER the history window).rf   re   r(   r+   z
2026-06-01r   -   rK   )   rQ   rR   rS   rT   rU      )r   {Gz?皙?r   r   r   r	   r
   rW   r   FrM   z vs r   rY   )	rZ   country_namechannel_nameprogramme_namesports_teamsbroadcast_dater\   r>   r]   )r1   rz   r{   groupbyapplyr   to_dictr   r   r.   r|   r   rs   r   r   ro   r   r/   r   r:   r}   r   r[   r   r\   r   )r   r   n_rowsr   gschannels_by_countryr   r   eventsr   r;   rC   r   r(   r   r[   r>   r@   rA   s                      rI   build_scheduler      s   
))


%C	_	B|,44Y?	J!E$K	 bll<0%D&,,.!F6] 1!#cll1c&k&B"CDy4cjji12/89:r||S\\!R-@)ABB3:::;<szz$}"59`zabSZZaZ785'SU*/(4az'B%*ZZ%6'+yy{'<'<'> $&.0 	11 <<    )      )r   rs   r   rs   )r   i  )r   rs   r   rs   ry   zpd.DataFrame)__doc__
__future__r   numpyr1   pandasr   r:   r9   r8   r/   r.   r3   r5   r6   r   r   r    r   rI   <module>r      s   	 #  $T&*d$D2 $4DTdK	
R [{
	
  !U V!RSab	
 4DRV!%'#+"$Slr   