
    .io                        S SK rS SKrS SKrS SKJr  S SK	J
r  S SKrS SKJr  SrSrSrSrSrSrS	rS
rSrSrSrSrSrSrSrSSSSSSSSS.rSrSr Sr!/ SQr"/ SQr#S@S\RH                  S \%S-  S!\RH                  4S" jjr&S#\RN                  l(        \"\RN                  l)        S$S%S&S'S(S)S*S+S,S-S.S/S0.r*S1\RV                  S-  S!\%4S2 jr,\RZ                  S3 5       r.S4 r/S5 r0SAS6 jr1S7 r2S8 r3S9 r4S: r5S; r6SBS< jr7S= r8SCS> jr9S? r:g)D    N)MarkerClusterzZC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\REM\BD\BD_Mazatlan.xlsmVertical
HorizontalLoteVentasPreciosInfo_Prototipos_loteInfo_Prototipos_verticalInfo_Prototipos_horizontalNombre_desarrolloEstatus_proyectoFechaPrecioM2z#8B4513z#FD6A02z#FFFFFFz#2F4F4Fz#F5F5DCz#000000z#C19A6Bz#8B0000)browngoldwhite	darkslatebeigeblacklight_browndark_redzPlayfair Display, serifzLato, sans-serifzMontserrat, sans-serif)z#eff8ffz#dff0ffz#b8e3ffz#78cdffz#38b6ffz#069af1z#007acez#0061a7z#02528az#084572z#062b4b)z#e6194bz#3cb44bz#ffe119z#4363d8z#f58231z#911eb4z#46f0f0z#f032e6z#bcf60cz#fabebez#008080z#e6beffz#9a6324z#fffac8z#800000z#aaffc3z#808000z#ffd8b1z#000075z#808080figtitlereturnc                     [        [        [        S[        S   S9[        S   [        S   [        SSSSS9[        S SS	S
SSS9S9nUb  [        USSS9US'   U R                  " S0 UD6  U $ )N   r   )familysizecolorr   
   <   )lrtbhbottomRQ?leftr   )r   orientationyanchoryxanchorx)fontpaper_bgcolorplot_bgcolormarginlegend)textr/   r.   r    )dict	BODY_FONTCOLORSupdate_layout)r   r   layout_updatess      SC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\REM\benchmark.pyapply_charts_themer=   K   s    6'?CWoG_bB"+a	
N "&EQ"Gw''J    plotly_darkEneFebMarAbrMayJunJulAgoSepOctNovDic)                        	   r!         fechac                     U b  [         R                  " U 5      (       a  g[        U R                      SU R                   3$ )N -)pdisnaSPANISH_MONTH_ABBRmonthyear)rW   s    r<   format_periodor`   j   s5    } -.a

|<<r>   c                  d   [         R                  " [        5      n [         R                  " U [        5      n[         R                  " U [
        5      n[         R                  " U [        5      n[         R                  " U [        5      n[         R                  " U [        5      n[         R                  " U [        5      n[         R                  " U [        5      n[         R                  " U [        5      n[        UR                  ;   a#  [         R                  " U[           SS9U[        '   [        UR                  ;   a#  [         R                  " U[           SS9U[        '   [         UR                  ;   a3  U[            R#                  SS0SS9R%                  [&        5      U[         '   UUUUUUUU4$ )z/Carga las hojas necesarias desde el Excel base.coerceerrorsz[\$,]rY   T)regex)r[   	ExcelFile
EXCEL_PATH
read_excelSHEET_VERTICALSHEET_HORIZONTAL
SHEET_LOTESHEET_VENTASSHEET_PRECIOSSHEET_INFO_LOTESHEET_INFO_VERTICALSHEET_INFO_HORIZONTALCOL_FECHA_VENTAScolumnsto_datetimeCOL_FECHA_PRECIOSCOL_PRECIO_VIVIENDAreplaceastypefloat)	xlsdf_verticaldf_horizontaldf_lote	df_ventas
df_preciosdf_info_lotedf_info_verticaldf_info_horizontals	            r<   	load_datar   p   sR    ,,z
"C--^4KMM#'78MmmC,Gc<0IsM2J==o6L}}S*=>s,AB 9,,,&(nnY?O5PYa&b	"#J...(*zBS7T]e(f
$% j000*+Wh^4W0VE] 	&' 		 	r>   c                 N    U S:X  a  U$ U S:X  a  U$ U S:X  a  U$ [        SU  35      e)u3   Devuelve el DF correcto según el tipo de proyecto.r   r   r   z Tipo de proyecto no reconocido: )
ValueError)tiporz   r{   r|   s       r<   get_df_by_tipor      s=    z			;D6BCCr>   c                 N    US:X  a  SnOUS:X  a  SnOSnU R                  US5      $ )u8   Obtiene 'unidades planeadas' según el tipo de proyecto.r   Departamentos_planeadosr   Casas_planeadosLotes_planeadosr   )get)rowr   cols      r<   get_unidades_planeadasr      s1    z'		773?r>   c                    U R                  5       nSS1R                  UR                  5      (       d  g UR                  [        R
                  [        R
                  * /[        R                  5      nUR                  SS/S9nUR                  (       a  g US   R                  [        5      R                  5       nUS   R                  [        5      R                  5       n[        R                  " X4/SSS9nUS   R                  [        5      R                  5       R!                  5       n/ SQn[#        U5       VV	s0 s H  u  pXU[%        U5      -     _M     n
nn	['        5       R)                  U5      nUR+                  5        GH>  u  p[        US   5      n[        US   5      nUS	   n[        UR-                  SS
5      5      nUR-                  SS 5      nUR-                  SS 5      nUR-                  SS 5      n[.        R0                  " U5      (       a  SUS 3OS
n[.        R0                  " U5      (       a  US OS
n[.        R0                  " U5      (       a  US OS
nSU SU SU SU SU S3nU
R-                  US5      n[        R2                  " X/SUSS[        R4                  " USS9US9R)                  U5        GMA     SnU
R7                  5        H  u  n	nUSU S U	 S!3-  nM     US"-  nUR9                  5       R:                  R=                  [        R>                  " U5      5        URA                  U5        U$ s  sn	nf )#NLatitudLongitudsubsetrV   zCartoDB positron)location
zoom_starttilesZona)
z#1f77b4z#ff7f0ez#2ca02cz#d62728z#9467bdz#8c564bz#e377c2z#7f7f7fz#bcbd22z#17becfProyectou   —Precio actual   Ventas promedio último mes   m² promedio disponible$,.0fz.2fz
        <b>z</b><br>
        Zona: z<br>
        Precio promedio: u!   <br>
        Ventas último mes: u&   <br>
        m² promedio disponible: z	
        z#3186ccrQ   Tg?i,  )	max_width)r   radiusr    fillfill_opacitypopuptooltipz
    <div style="
        position: fixed; bottom: 20px; left: 20px; z-index: 9999;
        background: white; padding: 10px 12px; border: 1px solid #ccc; border-radius: 8px;
        font-size: 13px; color:#000000;">
        <b>Zonas</b><br>
    zD<span style="display:inline-block;width:12px;height:12px;background:z-;margin-right:6px;border-radius:2px;"></span>z<br>z</div>)!copyissubsetrr   rv   npinfnandropnaemptyrw   rx   meanfoliumMapstruniquetolist	enumeratelenr   add_toiterrowsr   r[   notnaCircleMarkerPopupitemsget_roothtml	add_childElementsave)df_bmarchivo_htmldflat_clon_cmzonasbase_colorsizcolor_by_zonacluster_r$   latlonproyectozonaprecioventasm2_disp
precio_txt
ventas_txtm2_txt
popup_htmlr    legend_htmlcs                               r<   make_benchmark_mapr      s   	Bz"++BJJ77	RVVbffW%rvv	.B	9j1	2B	xx yM  ',,.EzN!!%(--/E

UNrASTA vJc"))+224EK
 GPPUFVWFVdaQAK(8$899FVMWo$$Q'GAiL!AjM"Z=155'(-4d;%%148*,((6*:*:q&
(*(8(8s|e
%'XXg%6%6GC=E: f $ &'L )""( *	
 !!$	2Z,,zS9	
 &/A FK ##%1I!DR	
 &
 8KJJL{ ;<FF<Hm Xs   ?Mc                     [         R                  " U 5      (       d  [         R                  " U5      (       a  gUR                  U R                  -
  S-  UR                  U R                  -
  -   $ )z-Diferencia en meses enteros entre dos fechas.NrV   )r[   r\   r_   r^   )f_inif_fins     r<   
meses_diffr     sH    	wwu~~JJ#r)U[[5;;-FGGr>   c           	      >   X [            R                  U5         R                  5       nUR                  (       a  [        R
                  " / SQS9$ [        R                  " U[           SS9U[        '   [        R                  " US   SS9R                  S5      US'   UR                  [         [        /5      n/ nUR                  [         5       H  u  pEUR                  [        5      nU[           R                  5       nUS   R                  5       n[        [        U5      5       HZ  nUS:X  a  Sn	O"[        XhS-
     Xh   5      n	U	(       a  U	S::  a  Sn	U	S:  a  Xx   U	-  OXx   n
UR!                  UXh   U
US:H  S.5        M\     M     [        R
                  " U5      $ )u  
Calcula la serie histórica de 'ventas promedio último mes' por proyecto,
usando la lógica de: Ventas_periodo / meses_entre_fechas.

Cada fila tendrá:
  - Proyecto
  - Fecha (fin del periodo)
  - Ventas_promedio_ult_mes
  - Es_primer_registro (para marcar entrada del proyecto)
)r   r   Ventas_promedio_ult_mesEs_primer_registrorr   rb   rc   Ventas_periodor   rL   )COL_PROYECTOisinr   r   r[   	DataFramers   rq   
to_numericfillnasort_valuesgroupbyr   ranger   r   append)r}   proyectos_seleccionadosr   	registrosr   grpfechasr   r   
diff_mesesproms              r<   compute_ventas_promedio_seriesr   	  sr    
\*//0GH	I	N	N	PB	xx||$jkk>>"-=*>xPB==,<)=hOVVWXYB	'78	9BIL1oo./%&--/%&--/s3xAAv
'1uvyA
!Z1_!"J-7!^69z)D (#Y/3+,6	 ! 20 <<	""r>   c                    X"[            U :H     R                  5       n[        R                  n[        R                  n[        R                  n	UR                  (       Gde  [
        UR                  ;   GaP  [        R                  " U[
           SS9U[
        '   [        UR                  ;   a#  [        R                  " U[           SS9U[        '   UR                  [        5      nU[           R                  5       n
Xf[           U
:H     nX[
           S:     nUR                  (       d  U[
           R                  5       nU[           R                  5       nXf[           U:H     nX[
           S:     nUR                  (       dB  U[
           R                  5       n[        UR                  ;   a  U[           R                  5       n	US:X  a  UnSnOUS:X  a  UnSnOUnSn[        R                  nUUR                  ;   aF  UU[            U :H     nUR                  (       d&  [        R                  " UU   SS9R                  5       nXxUU	4$ )u  
Calcula:
- precio inicial (promedio de la primera fecha de precios, precios > 0)
- precio final (promedio de la última fecha de precios, precios > 0)
- m² promedio proyecto (de Info_Prototipo_*)
- m² promedio disponible (en la última fecha de precios, prototipos con precio > 0)
rb   rc   r   r   Medida_terrenor   u   Medida_construcción)r   r   r   r   r   ru   rr   r[   r   COL_M2_PRECIOSr   rt   minr   max)r   r   r~   r   r   r   df_pprecio_inicialprecio_finalm2_promedio_disponible	fecha_min
df_primeradf_primera_pos	fecha_max	df_ultimadf_ultima_posdf_infocol_m2m2_promediodf_is                       r<   get_precios_y_m2r  9  s   & .(:;@@BDVVN66LVV:::-= %'MM$7J2KT\$] !T\\)#%==n1Eh#WD  12 *+//1	01Y>?
#/B$Ca$GH##+,?@EEGN *+//1	/0I=>	!,?"@1"DE""()<=BBDL !6!66)6~)F)K)K)M&
 v~!		"'$'&&K w|,89zz--VXFKKMK6LLLr>   c                    Uc  S/S-  $ U S   R                  5       nU S   R                  5       nUU[           R                  U5      U[           U:H  -     R                  5       nUR                  (       aY  U S   R                  5       nU S   R                  5       n	U S   R                  5       n
U S   R                  5       nUUS	S	SSSUU	U
U/$ S
 H<  nXR                  ;   d  M  [        R                  " X|   SS9R                  S	5      X|'   M>     SUR                  ;   a  US   R                  5       OS	nSUR                  ;   a  US   R                  5       OS	nU(       a  US	:  a  X-  S-  OSnSUR                  ;   a  UR                  [        SS9S   R                  5       nU SS/   R                  US[        SS9n[        R                  " US   SS9R                  S	5      US'   [        R                  " US   SS9R                  S	5      US'   [        R                  " US   S	:  US   US   -  US   5      US'   US   R                  5       nOSnX"S   U:H     R                  5       n[        R                  " US   SS9US'   UR                  (       d  US   R                  5       OSnU S   R                  5       nU S   R                  5       n	U S   R                  5       n
U S   R                  5       nUUUUUUUUU	U
U/$ )u  
Calcula KPIs para un periodo específico usando:
- df_bm: info estática de proyectos (meses, unidades, precios, m², etc.)
- df_ventas: corte de inventario / ventas a la fecha objetivo
- df_series: series de ventas promedio último mes por proyecto (para ese periodo)
NrU   Meses en ventaUnidades planeadasPrecio inicialr      m² promedio proyector   r   )Inventario_disponibleVentas_acumuladasr   rb   rc   r  r  d   Fas_indexr   r*   left_onright_onhowRitmor   r   )r   sumr   r   rq   r   r   rr   r[   r   r   r   merger   where)r   r}   	df_series	proyectosfecha_objetivo	kpi_meseskpi_unidadesdf_vkpi_pikpi_pfkpi_m2kpi_m2dr   kpi_dispkpi_vendidakpi_pctdf_vadf_merge_ritmo	kpi_ritmodf_spkpi_ult_mess                        r<   compute_kpis_periodor*    s    v{
 &',,.I-.224L
 	<	 	%	%i	0	#	$	6	8 df 	
 zz'(--/',,../44612779
 	
 P,,diAHHKDI P 7NQUQ]Q]6]t+,002cdH5HDLL5X$*+//1^_K 5A\TUEU{)C/[_G dll*LLL67JKSU 	
 
,<=>DD!	 E 
 /1mm.//

&) 	*+ ,.==+,X,

&) 	'( #%((+,q0./.AQ2RR./#
w
 #7+002		
 (N:;@@BE')}}'((E
#$ BG%12779RVK
 #$))+F?#((*F*+002F-.335G 	 r>   c
           	         [        XX45      n
/ nU GHy  nX[           U:H     nUR                  (       a  M%  UR                  S   nUR	                  S[
        R                  5      nUR	                  S[
        R                  5      nUR	                  SS5      n[        X5      nUR	                  [        S5      nUb'  [        U5      R                  5       R                  5       OSnXU[           U:H     R                  5       nUR                  [        5      nUR                  (       a	  SnSnSnSnOUR                  S   nSU;   a  SnOUR	                  S	S5      nSU;   a  UnOUR	                  S
S5      nU(       a  US:  a  UU-  nOUnUR	                  SS5      n[        U5      S:  a9  UR                  S   nU[           nU[           n[!        UU5      nUb  US:X  a  SnOSnUS:  a  UU-  OUnU(       a  US:  a  SU;   a  Sn OUU-  n OSn [#        UU UUUU	5      u  n!n"n#n$UR	                  SS5      n%UR	                  SS5      n&UR%                  0 SU_SU_SU_SU_SU_SU_SU_SU _SU_SU_SU!_SU"_SU#_SU$_SU%_S U&_5        GM|     [
        R&                  " U5      n'U'R                  (       d  SU'R(                  ;   a  U'S   S!-  U'S'   U'$ )"zRConstruye el DataFrame con los KPIs de benchmark para los proyectos seleccionados.r   Fecha_inicio_ventaFecha_fin_ventasMeses_ventaNrY   vendidor  r  r   rM   rL   g      ?r   Estatus_ventar   Fecha inicio preventaFecha fin ventar  r  Oferta disponibleOferta vendida	% vendido    Ritmo mensual ventas históricasr   r	  r   r
  r   zEstatus ventar  )r   r   r   ilocr   r[   NaTr   COL_ESTATUSr   striplowerr   r   rq   r   r   r  r   r   rr   )(r   r   rz   r{   r|   r}   r~   r   r   r   df_baser   r   df_projrow_projfecha_inicio	fecha_finmeses_ventaunidades_planeadasestatusestatus_strdf_ventoferta_disponibleoferta_vendidaritmo_mensual_histventas_prom_ult_mesultimaventas_periodo	penultimaf_ultf_penr   porcentaje_vendidor   r   r  m2_disp_promr   r2  	df_results(                                           r<   build_benchmark_dfrT    s    TGGI+,/8;<== <<?
  ||$8"&&ALL!3RVV<	ll=!4
 4HC
 ,,{D16=6Ic'l((*002r
 l3x?@EEG%%&67== !N!""#\\"%F K'$%!$*JJ/F$J! K'!3!',?!C {Q%3k%A"%3" $ZZ(8!<N7|q #LL,	/0!"23'u5
%q!"J
AKa.:"=Uc
 "4q"8K'%("%36H%H"!%
 CSC
?k< ||FD)
 !_d;H' "9 !+	
 %&8 $%6 !. / 34F ./B !.   ( *<    !	
[ ,D Y'I ??{i.?.??!*;!7#!=	+r>   c                 J    [         R                  " U 5      (       a  gU SU S3 $ )NrZ   ,.fr[   r\   r/   decs     r<   fmt_numr[    s$    	wwqzz3%qy\r>   c                 B    [         R                  " U 5      (       a  gU S $ )NrZ   r   rX  )r/   s    r<   fmt_intr]    s    	wwqzzXr>   c                 N    [         R                  " U 5      (       a  gSU SU S3 3$ )NrZ   r   rV  rW  rX  rY  s     r<   	fmt_moneyr_    s)    	wwqzzqC5	lr>   c                  &   [         R                  " S5        [         R                  " S5        [        5       u  n nnnnnnn[         R                  " S/ SQSS9n[        XX5      n	[        U	[           R                  5       R                  5       R                  5       5      n
[         R                  " SU
S9nU(       d  [         R                  " S	5        g [        UUU UUUUUUU5
      n[        S
S/nU Vs/ s H  oU	R                  ;   d  M  UPM     nnU(       a(  X   R                  5       nUR!                  US[        SS9nUR"                  (       a  [         R$                  " S5        g / SQnU H0  nUUR                  ;   d  M  [&        R(                  " UU   SS9UU'   M2     [+        X;5      n[         R                  " S5      u  nnU   [         R,                  " S5        X3[           R/                  U5         R                  5       n[&        R0                  " U[2           SS9U[2        '   UR                  [2        /S9n[        U[2           R                  5       5      n[5        U5      S:  a  US   OS n[5        U5      S:  a  US   OS n[5        U5      S:  a  US   OS nUUU/nU Vs/ s H  n[7        U5      PM     nn[9        XUUU5      [9        XUUU5      [9        XUUU5      /n/ SQn[&        R:                  " SUUS   US   US   US   US   US   05      nS n UR                  5       n!U!R                   H"  nUS:w  d  M  U!U   R=                  U 5      U!U'   M$     [         R>                  " U!SS9  S S S 5        U   [         R,                  " S 5        [A        U5      n"U"c  [         R                  " S!5        OSS"K!J"n#  U#" U"S#S$S%9  S S S 5        [         R                  " S5      u  n$n%U$   UR                  5       n&[&        R0                  " U&S&   SS9U&S&'   U&R                  S&/S9n&U&R"                  (       a  [         R                  " S'5        GOU&S&   RG                  5       n'[7        U'5      n([         R                  " S(U( 35        U&U&S&   U':H     R                  5       n)U)RI                  SS)S*9S+   RK                  5       RM                  S+S,0S-9n*U*U*S,   S:     n*U*R"                  (       a  [         R                  " S.5        GOU*S,   RO                  5       n+U*S,   U+-  S/-  U*S0'   U*RQ                  S0S)S19n*[5        U*5      S2::  a  / S3Qn,U,S [5        U*5       n-[R        RT                  " U*SS,S4S59n.U.RW                  S)[Y        U-S69S7S8S9S:9  [         RZ                  " U.SS9  U*RQ                  S0S)S19R]                  S5      n/S;R_                  S< U/Ra                  5        5       5      n0[         Rb                  " S=U0 35        U*/ S>Q   R                  5       n1GOU*R                  5       n2[5        U25      S?:  a  U2R]                  S@5      R                  5       n3U2Rd                  S@S  R                  5       n4[&        R:                  " SA/U4S,   RO                  5       /U4S0   RO                  5       /S>.5      n5[&        Rf                  " U3U5/SSB9n2U2RQ                  S0S)S19n2U2S   R                  5       n6[R        Rh                  " U2SS0S0SC9n7U7RW                  SDSESFU2S,   SG9  U7Rk                  S SHSI9  U7Rm                  SJU6SK9  [         RZ                  " U7SS9  U*RQ                  S0S)S19R]                  S5      n/S;R_                  SL U/Ra                  5        5       5      n0[         Rb                  " S=U0 35        U2/ S>Q   n1W1Ro                  S)SM9Rq                  SN5      n8[         Rr                  " SOU8SPSQSR9  S S S 5        U%   [         R                  " SS5        UR"                  (       a  [         R                  " ST5        GOxUR                  5       n&[&        R0                  " U&S&   SS9U&S&'   U&R                  S&/S9n&[        U&S&   R                  5       5      n9U9(       d  [         R                  " SU5        GOU9SS  n:U&U&S&   R/                  U:5         R                  5       n;U;RI                  S&S/S)S*9S+   RK                  5       n;U;RI                  S&S)S*9S+   RO                  5       RM                  S+SV0S-9n<U;R!                  U<S&SSW9n;U;S+   U;SV   -  S/-  U;S0'   U;S&   R=                  [6        5      U;SX'   U: V=s/ s H  n=[7        U=5      PM     n>n=[&        Rt                  " U;SX   U>SSY9U;SX'   [        U;S   R                  5       R                  5       5      n?[5        U>5      S:  a  U>S   OS n@[5        U?5      SZ:  a  W@b  U;U;SX   W@:H     R                  5       nAUARQ                  S0S)S19nAUAS   R]                  S?5      R                  5       nB[         R                  " S[[5        U?5       S\35        [         R                  " S]U?UBS?S^9nCUC(       a  U;U;S   R/                  WC5         n;O([         R                  " S_5        U;Rd                  SS n;OU?nCU;R"                  (       a  [         R                  " S`5        GOU;R                  5       n;U;R!                  USSa/   SSSW9n;U;RM                  SaSb0SSc9  U;RQ                  / SdQ/ SeQS19n;U;RI                  SX5      Rw                  5       S-   U;Sf'   U;RQ                  SSX/5      R                  5       nDUDSf   Ry                  [z        5      UDSg'   [R        R|                  " UDSXSfSS[~        Sg/ ShQSi9nEUERW                  Sj[Y        Sk[Y        SSlSm9Sn9[Y        SoSp9SqSr9  UDSf   RG                  5       nFUER                  SsSStUFSt-   /SuSSvSw9  UERm                  SXSx9  UERk                  [Y        SySzSSS{S|S}S[Y        SkS~9SS9
S9  UERk                  SSS9  [         RZ                  " UESS9  U;/ SQ   RQ                  SXSf/5      nGUGRo                  S)SM9Rq                  SN5      nH[         Rr                  " SUHSSQSR9  S S S 5        [         R                  " S5        UR"                  (       a  [         R                  " ST5        GOURI                  S&S)S*9S+   RK                  5       RQ                  S&5      nI[&        R(                  " UIS+   SS9UIS+'   UIS+   R                  5       S/-  UIS'   UUS      RI                  SS)S*9S&   R                  5       nJUJRI                  S&5      S   R=                  [        5      R                  5       RQ                  S&5      nK[        S[5        UK5      S-   5      UKS'   [        R                  " 5       nLULR                  [        R                  " UIS&   UIS+   SSUIS+    VMs/ s H$  nM[&        R                  " UM5      (       d  WMS OSPM&     snMSjSS95        WLR                  [        R                  " WIS&   UIS   SS[Y        SS9SSS95        UIS+   RG                  5       nNWKRa                  5        H  u  nOnPWIR                  UIS&   UPS&   :H  S+4   nQUQR"                  (       d  WQRd                  S   OWNnRWLR                  [        R                  " WPS&   /UR/SSSS[{        UPS   5      /SSUPS    3SUPS    S3S)S95        M     WLRk                  S&[Y        S,S9[Y        SSSS)S9S9  [        UL5      nL[         R                  " S2S/5      u  nSnTUS   [         RZ                  " ULSS9  S S S 5        WT   WKR"                  (       d|  WKR                  5       nUUUS&   R                  R                  S5      UUS&'   UUS   R=                  S 5      UUS'   UU/ SQ   nU[         R                  " S5        [         R                  " UU5        S S S 5        WIRo                  S)SM9Rq                  SN5      nV[         Rr                  " SUVSSQSR9  [         R                  " S5        UR"                  (       a  [         R                  " ST5        GOkWIR                  5       nW[&        R(                  " UWS+   SS9UWS+'   UWS+   R                  S5      nXUWUWS+   UX:*     nYUYS+   RK                  5       nZ[        R                  " 5       n[U[R                  [        R                  " UYS&   UYS+   SSUYS+    VMs/ s H$  nM[&        R                  " UM5      (       d  WMS OSPM&     snMSjSS95        [&        R                  " WZ5      (       d  W[R                  WZSSSUZS 3SS9  W[Rk                  S&SSI9  [        U[5      n[[         RZ                  " U[SS9  WYRo                  S)SM9Rq                  SN5      n\[         Rr                  " SU\SSQSR9  SSSSSSSSSSS.
n][         R,                  " S5        SUR                  ;   a!  US   R                  R                  S5      US'   SUR                  ;   a1  US   R                  R                  S5      US'   UR                  SSS9n[         R>                  " UR                  R                  W]5      5        g s  snf s  snf ! , (       d  f       GNv= f! , (       d  f       GN4= f! , (       d  f       GN.= fs  sn=f ! , (       d  f       GN= fs  snMf ! , (       d  f       GN= f! , (       d  f       GN!= fs  snMf )NzBenchmark de Proyectosz
        **Crea tu propio Benchmark**.
        
        1. Selecciona el **tipo de proyecto** (Vertical, Horizontal o Lote).  
        2. Selecciona uno o varios proyectos para incluir en el benchmark.  
        zTipo de proyecto a analizar:)r   r   r   T)options
horizontalz3Selecciona los proyectos a incluir en el benchmark:)ra  z6Selecciona al menos un proyecto para ver el benchmark.r   r   r   r*   r  uA   No se pudo construir el benchmark con la información disponible.)r  r  r5  r6  r7  r8  r   r	  r   r
  r   rb   rc   rM   z2Indicadores principales de proyectos seleccionadosr   rL   r/  r1  rN   )zPromedio meses en ventazUnidades planeadas (suma)zOferta disponible (suma)zOferta vendida (suma)z% vendido (promedio)u'   Ritmo mensual ventas históricas (prom)r   zPrecio inicial promediozPrecio actual promedior
  r   	Indicadorr   c                 r    U b  [         R                  " U 5      (       a  g[        U 5      S:  a  SU S 3$ U S $ )NrZ   i r   r   z,.2f)r[   r\   abs)vs    r<   fmt_valbenchmark_page.<locals>.fmt_valL  s9    yBGGAJJ1v1T(|#Xr>   )use_container_widthz.Mapa de ubicaciones de proyectos seleccionadoszSLos proyectos seleccionados no tienen coordenadas suficientes para mostrar el mapa.)	st_foliumi  i  )widthheightr   z'No hay datos suficientes para graficar.u0   #### Participación en ventas del último mes - Fr  r   r   r   u.   No hay proyectos con ventas en el último mes.r     Participación_%)	ascendingrP   )z#FFE697z#FFD85B#FFC000z#F3B700z#DAA400g333333?)namesvalueshole)colorsz%{percent:.0%}insideuk   <b>%{label}</b><br>Participación: %{percent:.1%}<br>Ventas prom. último mes: %{value:,.2f}<extra></extra>)sortmarkertexttemplatetextpositionhovertemplate, c              3   D   #    U  H  u  pUS     SUS   S S3v   M     g7fr   z (rn  ,.1fz%)Nr6   .0r   r   s      r<   	<genexpr>!benchmark_page.<locals>.<genexpr>  4      (&5FA z?+2c2D.Ed-K2N&5    u$   Top 3 proyectos por participación: )r   r   rn  r!   rT   zResto de proyectos)ignore_index)r/   r-   r5   z#8EB4E3z
%{y:.1f} %ug   <b>%{x}</b><br>Participación: %{y:.1f}%<br>Ventas prom. último mes: %{customdata:,.2f}<extra></extra>)marker_colorrx  rz  
customdatau   % de participación en ventas)xaxis_titleyaxis_titlearray)categoryordercategoryarrayc              3   D   #    U  H  u  pUS     SUS   S S3v   M     g7fr}  r6   r  s      r<   r  r    r  r  )indexzutf-8u'   Descargar datos de participación (CSV)z#participacion_ventas_ultimo_mes.csvztext/csv)labeldata	file_namemimeuC   #### Participación en ventas del último mes (últimos 3 periodos)z4No hay historial suficiente de ventas para graficar.u%   No hay fechas válidas para graficar.Total_fecha)onr  Periodo)
categoriesorderedrS   z> Hay **zf proyectos** en el benchmark. Para una mejor lectura, selecciona hasta **10** proyectos para comparar.u3   Proyectos a mostrar en la comparación de periodos:)ra  defaultmax_selectionsu9   Selecciona al menos un proyecto para mostrar la gráfica.uD   No hay suficientes datos para graficar la comparación por proyecto.r8  
Ritmo_hist)rr   inplace)r  rn  r  r   )TFFFRank
Rank_label)r   r  rn  r   r  )r/   r-   r    markerscolor_discrete_sequencer5   custom_dataz
top centerrV   r   )rl  r    )r   linerO   )rl  u   <b>%{customdata[0]}</b><br>Periodo: %{x}<br>Rank: %{customdata[1]}<br>Participación: %{customdata[2]:.1f}%<br>Ventas prom. último mes: %{customdata[3]:,.2f}<br>Ritmo mensual histórico: %{customdata[4]:,.2f}<extra></extra>)ry  rw  r  rz  reversedg      ?u   Posición en el rankingzrgba(128,128,128,0.2))	autorangedtickr   
title_textshowgrid	gridcolor)r  rg  topr)   zrgba(0,0,0,0)zrgba(255,255,255,0.2))r      )
r+   r,   r-   r.   r/   bgcolorbordercolorborderwidthr0   	itemwidth)r4   	Proyectosclosest)legend_title_text	hovermode)r  r   r  rn  r   r  u+   Descargar ranking últimos 3 periodos (CSV)zranking_ultimos_3_periodos.csvuH   #### Evolución promedio de ventas del último mes (todos los proyectos)
Pct_changer   Marcazlines+markers+textu   Ventas prom. último mesz.1frY   uG   Fecha: %{x|%b %Y}<br>Ventas prom. último mes: %{y:,.2f}<extra></extra>)r/   r-   modenamer5   ry  rz  zlines+markersz% cambio vs periodo anteriordot)dashy2u9   Fecha: %{x|%b %Y}<br>Variación: %{y:.1f}%<extra></extra>)r/   r-   r  r  r  yaxisrz  zmarkers+textstar   rp  zbottom centerz	Ingreso #z$<br>Fecha: %{x|%b %Y}<extra></extra>)r/   r-   r  marker_symbolmarker_sizer  r5   ry  r  rz  
showlegend)r   r-   right)r   
overlayingsider  )r  r  yaxis2z%b-%Yc                 $    SR                  U 5      $ )Nr{  )join)lsts    r<   <lambda> benchmark_page.<locals>.<lambda>h  s    		#r>   Proyectos que ingresan)r  r   r  u   ##### Ingresos por ⭐zDescargar serie promedio (CSV)z$serie_promedio_ventas_ultimo_mes.csvuA   #### Evolución promedio de ventas del último mes (sin outliers)g      ?zPromedio sin outlierszJFecha: %{x|%b %Y}<br>Ventas prom. (sin outliers): %{y:,.2f}<extra></extra>r  zPromedio sin outliers: r~  ztop left)r-   	line_dash
line_colorannotation_textannotation_positionzVentas promedio sin outliersz"Descargar serie sin outliers (CSV)zserie_promedio_sin_outliers.csvz{:,.0f}z	{:,.1f} %z{:,.2f}z${:,.0f})
r  r5  r6  r7  r8  r   r	  r   r
  r   zResumen comparativor3  r4  r   )axis)Ustheadermarkdownr   radior   sortedr   r   r   r   multiselectinforT  rr   r   r  r   warningr[   r   r   	subheaderr   rs   rq   r   r`   r*  r   apply	dataframer   streamlit_foliumrk  r   r   r   renamer  r   pxpieupdate_tracesr7   plotly_chartheadr  r   captionr9  concatbarr:   update_xaxesto_csvencodedownload_buttonCategoricalcumcountrw   r   r  BUMP_COLORSupdate_yaxes
pct_changer   listreset_indexr   goFigure	add_traceScatterr\   locr=   dtstrftimetablequantile	add_hlinedropstyleformat)^rz   r{   r|   r}   r~   r   r   r   r   df_tipoproyectos_disponiblesr   r   geo_colsr   df_geonum_colsr   r  c1c2df_v_selfechas_ordenf0f1f2periodosr/   periodos_fmtkpis_por_periodoindicadoresdf_kpisrh  df_kpis_fmtr   rk  c13c14df_series_localultima_fechaperiodo_label	df_ultimodf_pietotaldonut_colorsrt  fig_pietop3txt_top	df_exportdf_bartop9resto	resto_rowcategoria_ordenfig_barcsv_piefechas_unicasultimas_fechasdf_3ptotalesrW  periodos_ordenproyectos_unicosperiodo_mas_reciente	df_actualtop_defaultproyectos_seleccionados_c14	df_sortedfig_bumpmax_rankdf_export_c14csv_c14df_totalprimerosentradasfig_line_avgrg  max_yr   r   y_valy_plotcol_graf	col_tabla	legend_df	csv_totaldf_total_noq75	df_no_outpromedio_no_outfig_line_nocsv_nofmts^                                                                                                 r<   benchmark_pagerB    s   II&'KK	$ 		 88&2D TGG"7<#8#?#?#A#H#H#J#Q#Q#ST nn=%
 #
HI
 E i4H#<8aGOO';8H<"'')!	  
 {{


VW
H %--uSz(CE#J  /yRI
 ZZ]FB
 

IJ|499:QRSXXZ%'^^H=M4NW_%`!"??+;*<?=h'78??AB!$\!2a!7\"T!$\!2a!7\"T!$\!2a!7\"TB<3;<8aq)8< !)=TVXY )=TVXY )=TVXY

 ,,[Q!1!!4Q!1!!4Q!1!!4	
	 lln$$AK!,Q!5!5g!>A % 	[d;u 
~ 

EFu%9GGij2as3/ 
 zz!}HC
 
 $..*#%>>/'2JS[#\ )00	0B  GG=> +73779L*<8MKKJ=/Z[ ((@L(PQVVXI !!*u!=>WX!:<Y Z[  F#@AAEFF||HI
 <=AAC-34Q-RUZ-Z]`-`)*  ++,>%+P
 v;!#$L *-CK8F ff(<!	G ))"#62%5%-U * 
 OOGF "--.@E-RWWXYZD"ii (&*mmo( G JJ!EgYOP !''f g l l nI $[[]F6{R'%{{1~224 &AB 4 4 6$&LL-A,B@EFc@d@h@h@j?k5:;M5N5R5R5T4U%	 "$D)+<4!P $//0Be/TF&,Z&8&?&?&AO ff$,/	G ))%.%1Z $**G#H * 	 ))$($C *  ((&-&5 )  OOGF "--.@E-RWWXYZD"ii (&*mmo( G JJ!EgYOP &'f gI  &&U&3::7CG??	u 
R 

YZ??GGJK (nn.O')~~og6NW_'`OG$-44WI4FO #?7#;#B#B#DEM ?@!.rs!3'(@(E(En(UV[[] MM7J"7%MHIbcTV  MM'EM:;TUSUV%>$NVO 
 GVD34u]7KKcQ ()
 $)>#7#7#Gi  >L!L^."3^!L#%>>)$- $i  $*%
*;*B*B*D*K*K*M#N  >A=PST=T~b'9Z^$'(1,1E1Q %eI&6:N&N O T T VI ) 5 56HTY 5 ZI"+J"7"<"<R"@"G"G"IKKK"3'7#8"9 :c c
 35..M 0 +')	3/ 3 %eJ&7&<&<=X&Y Z  [\ %

1Q 3C/;;GGbc
 "JJLE "KKz+MNO%" ( E
 LL!C\ R $ !  "--`"= . E %*MM)$<$E$E$G!$KE&M !& 1 1:y2I J O O QI.7.?.F.Fs.KIl+  "ww!# ( $0;)% H" **%1#$Qg2NO!]. +   )0446H))","HsN3#<!%"9 *  ))Y)?**#(+$)$*"$3(?()!%2&(  +  ***5"+ +  OOH$G %*t%!k9f"56 " ,222?FFwOG&&K$"B'	 
V KKZ[
FG g67PQTV[! 	
 /1mm.//
*+
 "**C!D!O!O!QTW!W i 456WZ%W0:SU 	 W%j1U4[[][!	 	 "!S]Q%67
 yy{ 	JJ7#45)/DLMfDghDgq

3:Dgh)I	
  	JJ7#<($3u%;	
  23779'')FAsLL'!2c'l!BD]!]^E*/++UZZ]5F""

7|nh'"( "!*c'l+,!0$S\N3#CL> 2; ;  % *2 	"":;4	 	# 		
 *,7 jj!Q0)
 OOLdC  >>$MMO	%.w%7%:%:%C%CG%L	'"6?
6K6Q6Q.7	23 &&RS	45#  OO%O077@	
2<		
 KKST
FG mmo131282
-. 34==dC  ,E F# MN	 $$=>CCE
 iik 	JJG$56),DMNgDhiDhq

3:Dhi)L	
  ww''!!! $"9/$9O P$. "  	!!6 	" 	

 )5
> !!!.55g>
67		
R (&# ,5'0$#!*#,C LL&' %--/)./F)G)J)J)S)ST[)\%&EMM)#():#;#>#>#G#G#P 

.Q
7LL##C()_ =~ = 
~ 
( 
d "MS 
z iL X Yz js   4AKAK
C!AK(+AK# BAK(	0AK(A
AK:0O5AL/E4AL##AL8L/AL#+AL5AL:$BAME+AMK#AK(K(
AK7K:
AL	L
ALLAL#L#
AL2L:
AM	M
AM)N)zmapa_benchmark.html)rL   )r   );	streamlitr  pandasr[   numpyr   plotly.expressexpressr  plotly.graph_objectsgraph_objectsr  r   folium.pluginsr   rg   ri   rj   rk   rl   rm   rn   ro   rp   r   r;  rq   rt   ru   r   r9   
TITLE_FONTr8   ALT_FONTPICTON_BLUEr  r  r   r=   defaultstemplater  r]   	Timestampr`   
cache_datar   r   r   r   r   r   r  r*  rT  r[  r]  r_  rB  r6   r>   r<   <module>rR     s       !  ( k
 
(0 4  #       	
 '
	#BII cDj BII * % &1 # 5U5U%U =",,- =# = $ $N	D	OdH-#`IMXyxYxn*r>   