
    ߤh1              	       P   S SK r S SKrS SKrS SKrS SKrS SKJ	r	  S SK
r
S SKrS SKr\	" 5         SS\S\R                  4S jjrS\S\4S jr SS\S	\S\R                  4S
 jjrSS\S\S\S\R                  4S jjrS\R                  S\R(                  S\S-  4S jrS\R                  S\R(                  S\S-  4S jrS rS\R                  S\4S jrS\4S jrS\R                  S\S-  4S jrS\R                  S\R                  4S jrS\\R                  \4   4S jrg)    N)load_dotenv
debug_jsonreturnc                    [         R                  " SS5      nU(       d  [        S5      eSnSnSU SU SU S	3n[        R                  " US
S9nUR                  5         UR                  5       nU (       a$  [        R                  " USS9SS n[        SU5        Sn UR	                  S/ 5      n	U	(       a6  [        U	[        5      (       a!  U	S   R	                  S5      (       a  U	S   S   nUc   UR	                  S5      =(       d    0 n
U
R	                  S5      n[        U[        5      (       aj  U(       ac  U Vs/ s HV  nUR	                  S5      =(       d    UR	                  S5      UR	                  S5      =(       d    UR	                  S5      S.PMX     nnU(       dX  UR	                  S5      =(       d2    UR	                  S5      =(       d    UR	                  S5      =(       d    Sn[        SU 35      eS [        S![        R                  4S" jn/ nU H  nUR	                  S5      nUR	                  S5      nUb  Uc  M-  [        U[        5      (       a   UR                  S#S5      R!                  5       n[        R"                  " US$S%9n[        R$                  " U5      (       a  M   U" U5      nUR'                  U[)        U5      S&.5        M     [        R*                  " U5      R-                  S'S(/S)9nUR.                  (       a  [        S*5      eUR1                  S'5      nUS'   R3                  [        5      R                  R                  S+S,SS-9US.'   US'   R4                  R7                  S/S09US1'   1 S2knU[9        UR:                  5      -
  nU(       a  [        S3U 35      eU/ S4Q   R=                  S5S69$ ! [         a     GNf = fs  snf ! [         a     GNIf = f! [         a     GM  f = f)7u  
Descarga la serie histórica del PIB nacional trimestral a precios constantes base 2018 (INEGI/BIE).
Devuelve DF con columnas: period_str ("YYYYTn"), period (pd.Period 'Q'), date (fin de trimestre), value (float).
Lanza RuntimeError con mensaje claro si no hay datos.
INEGI_TOKEN zFalta INEGI_TOKEN en el .envi: 0700zOhttps://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/z/es/z/false/BIE/2.0/z
?type=json   )timeoutF)ensure_asciiNi  zDEBUG INEGI JSON PREVIEW:Seriesr   OBSERVATIONSDataObservations
TimePeriodTIME_PERIOD	OBS_VALUEValue)r   r   MessageNotamessagez!Sin observaciones en la respuestazINEGI sin datos: pr   c                 &   [        U 5      R                  5       n[        R                  " SU5      nU(       d  [	        SU  35      e[        UR                  S5      5      [        UR                  S5      5      pC[        R                  " U SU 3SS9$ )N(\d{4}).*?([1-4])zNo puedo interpretar periodo:       Qfreq)	strstripresearch
ValueErrorintgrouppdPeriod)r   smyqs        ^C:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\Economics_data\functions.py_parse_period_to_q4fetch_pib_const_nacional.<locals>._parse_period_to_qM   sr    FLLNII*A.=aSABB1771:AGGAJ1yyA3as#..    ,coerceerrors)periodvaluer5   r6   subsetu;   La serie regresó vacía después de parsear observaciones.r   Tregex
period_strendhowdate>   r@   r6   r5   r<   z'Faltan columnas en el DataFrame final: )r<   r5   r@   r6   Tdrop)osgetenvRuntimeErrorrequestsgetraise_for_statusjsondumpsprint
isinstancelist	Exceptionr    r'   r(   replacer!   
to_numericisnaappendfloat	DataFramedropnaemptysort_valuesastypedtto_timestampsetcolumnsreset_index)r   tokenINDICADOR_PIB_CONSTarea_geourlrdatapreviewobservationsseries	data_nodeobs_altomsg_apir.   rowstpvalr6   perdfexpectedmissings                          r-   fetch_pib_const_nacionalrr      s    IImR(E9:: H()hZugZ	Y 
 	S"%A668D **T6u=)73 L(B'j..6!9==3P3P!!9^4L
 	(.BImmN3G'4((W % 
 % ()uu\':'RaeeM>R%&UU;%7%I155> %    ((9%w&)9wTXXi=PwTw.wi899/c /bii / DUU=!eeK :c3++c2&,,.Cc(3775>>	$R(C 	sU5\:; " 
d		"	"8W*=	"	>B	xxXYY		!B(|**3/33;;CE;RB|H--%-8BvJ 9HRZZ(GDWINOO78DD$DOOG     		@  		sK   AO  0AO ;AOO -O' 
OOO 
O$#O$'
O65O6textc                     [        U [        5      (       d  U $  U R                  S5      R                  S5      nSU ;   a&  SU;   d  SU;   d  SU;   d  SU;   d  SU;   d  S	U;   a  U$ U $ ! [         a     U $ f = f)
u   
Si el CSV se leyó con el encoding incorrecto y trae 'Ã­' en vez de 'í',
intentamos reparar con round-trip latin1->utf8. Si no hay error, devolvemos arreglado.
latin1zutf-8   Ã   á   é   í   ó   ú   ñ)rL   r    encodedecoderN   )rs   repaireds     r-   _fix_mojibaker   x   s    
 dC  ;;x(//84<TX-1ATXEUY]aiYimqu}m}  BF  JR  BRO K  Ks   AA' '
A54A5path	value_colc                 .    [         R                  " U SS9nSUR                  ;   a.  US   R	                  [
        5      R                  [        5      US'   S[
        S[         R                  S-  4S jnUR                  S	UR                  S	S5      5      R                  U5      US
'   UR                  S
/S9nS nUS   R                  U5      US'   UR                  S/S9nUR                  SS
/5      nUS
   R	                  [
        5      R
                  R                  SSSS9US'   US
   R                  R                  SS9US'   UR                  / SQSS9S   R!                  5       nU/ SQ   $ ! [         a    [         R                  " U SS9n GN|f = f)u  
Lee el CSV descargado de DataMéxico (PIB trimestral por actividad), limpia y devuelve
un DataFrame largo listo para graficar:
  columnas -> ['sector','period','period_str','date','value']

- Corrige encoding (intenta 'utf-8-sig' y fallback a 'latin-1')
- Repara mojibake (Ã­ -> í) si hace falta
- Convierte 'Quarter' a Period trimestral y a fecha (fin de trimestre)
- Convierte la columna de valores (GDP o Time) a float
- Agrega por duplicados si existieran
z	utf-8-sig)encodingzlatin-1Sectorr,   r   Nc                 D   [         R                  " U 5      (       a  g [        U 5      R                  5       n[        R
                  " SU5      nU(       d  g [        UR                  S5      5      [        UR                  S5      5      pC[         R                  " U SU 3SS9$ )Nr   r   r   r   r   )	r'   rQ   r    r!   r"   r#   r%   r&   r(   )r,   r)   r*   r+   ts        r-   parse_quarter_to_period7load_gdp_by_sector_csv.<locals>.parse_quarter_to_period   sr    771::FLLNII*A.1771:AGGAJ1yyA3as#..r0   Quarterr5   r7   c                      [        [        U 5      R                  SS5      5      $ ! [         a    [        R
                  s $ f = f)Nr1   r   )rS   r    rO   rN   npnanxs    r-   to_float(load_gdp_by_sector_csv.<locals>.to_float   s9    	QR011 	66M	s   #& AAGDPr6   r   r9   Fr:   r<   r=   r>   r@   )r   r5   r<   r@   )as_index)r   r5   r<   r@   r6   )r'   read_csvUnicodeDecodeErrorr\   rX   r    mapr   r(   rG   rU   rW   rO   rY   rZ   groupbysum)r   r   ro   r   r   outs         r-   load_gdp_by_sector_csvr      s    3[[4
 2::(|**3/33MB8/3 /299t+; / 66)RVVIt%<=AABYZBxL	8*	%B U)--)BwK	7)	$B 
8,	-B(|**3/33;;CE;RB|H--%-8BvJ ::@5:QRYZ^^`CBCCQ  3[[	23s   E1 1FFr^   fecha_inicio	fecha_finc                    SnSU S3nU(       a  U(       a  U SU SU SU  3nOU SU  3n[         R                  " U5      nUR                  5         UR                  5       nUS   S   S   S	   n[        R
                  " U5      n	U	R                  S
SS.SS9  [        R                  " U	S
   SS9U	S
'   [        R                  " U	S   SS9U	S'   U	R                  S
5      R                  SS9$ )uD  
Descarga la serie SP30578 del Banxico (INPC Variación mensual)
en formato DataFrame.

Parámetros:
    token (str): Tu token del Banxico.
    fecha_inicio (str): Fecha inicial (opcional, 'YYYY-MM-DD')
    fecha_fin (str): Fecha final (opcional, 'YYYY-MM-DD')
    
Retorna:
    pd.DataFrame con columnas ['fecha', 'valor']
SP30578z8https://www.banxico.org.mx/SieAPIRest/service/v1/series/z/datos/z?token=bmxrf   r   datosFechaValor)fechadatoT)r\   inplace)dayfirstr2   r3   rA   )rF   rG   rH   rI   r'   rT   renameto_datetimerP   rW   r]   )
r^   r   r   seie_idBASE_URLra   resprc   serie_datosro   s
             r-   get_inflacion_anualr      s    G J'RXYH 	
!L>9+WUGD
'%) <<D99;D u+h'*73K 
k	"BII94IH ..Gt<BwK--7H=BwK>>'"..D.99r0   	df_sortedcurrent_datec                 t    U R                   U S   U:     nUR                  (       a  gUR                  S   S   $ )ue   Devuelve la variación del mes anterior disponible (pudiera no ser exactamente -1 mes si hay huecos).r@   N	Inflacion)locrV   iloc)r   r   prevs      r-   get_prev_valuer      s7    ==6*\9:Dzz99R=%%r0   c                    U[         R                  " SS9-
  nX S   R                  R                  UR                  :H  U S   R                  R                  UR                  :H  -     nUR
                  (       a  gUR                  S   S   $ )uW   Devuelve la variación del mismo mes del año previo (si existe exactamente esa fecha).r   )yearsr@   Nr   r   )r'   
DateOffsetrY   yearmonthrV   r   )r   r   targetyoys       r-   get_yoy_valuer      sz    BMM22F
v&))..&++=v&))//6<<?A BC
yy88B<$$r0   c                     U S S3$ )Nz+.2fz pp r   s    r-   fmt_ppr     s    XS>r0   
df_periodoc                     U R                   (       a  [        R                  $ U S   R                  S 5      U S'   SU S   -   U S'   [        R                  " U S   5      nUS-
  S-  nU$ )un   
Inflación acumulada compuesta a partir de variaciones mensuales (%).
Fórmula: Π(1 + r_i/100) - 1  -> en %
r   c                     SU S-  -   S-  S-
  $ )Nr   d   gUUUUUU?r   r   s    r-   <lambda>%inflacion_acumulada.<locals>.<lambda>  s    !aPSe)W[I\_`I`r0   Tasa_Mensualr   Factor_Crecimientor   )rV   r   r   applyprod)r   producto_compuestoinflacion_acumuladas      r-   r   r   	  sy    
 vv ",K!8!>!>?`!aJ~ ():n+E'EJ#$ ,@!AB .1S8 r0   c                      [         R                  " SS5      [         R                  " SS5      [         R                  " SS5      SS.$ )Nr   r   BANXICO_TOKENDB_URLi  )r   r   r   	CACHE_TTL)rC   rD   r   r0   r-   get_settingsr   #  s9    yy3?B7))Hb)	 r0   ro   c                     U R                   (       a  g U R                  S5      S   R                  5       nUR                  5       $ )Ncve_entperiodo)rV   r   maxmin)ro   last_by_states     r-   last_common_quarterr   +  s6    	xxJJy))488:Mr0   c                     U R                  SS/5      R                  5       n U R                  S5      S   R                  S5      U S'   SU S   U S   -
  -  U S   -  U S'   U $ )Nr   r   valorr   	valor_lagr   qoq_pct)rW   copyr   shift)ro   s    r-   compute_qoqr   0  si    	I.	/	4	4	6Bjj+G4::1=B{O2g;K89B{OKByMIr0   c                     [        SS5       V s/ s H  o S PM     nn / SQnSS/n/ n[        R                  R                  S5      n[	        X5       HT  u  pgUR                  SS	5      n[        U5       H.  u  p	UR                  XgXXR                  S
S5      -  -   S.5        M0     MV     [        R                  " U5      n
S[        R                  R                  5       R                  S5      SS.nX4$ s  sn f )Nr   !   02d) AguascalienteszBaja CaliforniazBaja California SurCampecheCoahuilaColimaChiapas	Chihuahuau   Ciudad de MéxicoDurango
GuanajuatoGuerreroHidalgoJaliscou   Méxicou
   MichoacánMorelosNayaritu   Nuevo LeónOaxacaPueblau
   QuerétarozQuintana Roou   San Luis PotosíSinaloaSonoraTabasco
TamaulipasTlaxcalaVeracruzu   Yucatán	Zacatecas2024T42025T1*   _   i   r   r   )r   estador   r   apiz%Y-%m-%d %H:%M UTCz,MOCK de arranque; sustituir por API INEGI/BD)source
fetched_atnote)ranger   randomdefault_rngzipuniform	enumeraterR   r'   rT   	Timestamputcnowstrftime)iestadosnombresperiodsrk   rngcvenombaser   ro   metas               r-   fetch_itaee_mockr  6  s    #(B<0<aCz<G0G !GD
))


#C){{2s#g&DAKKC1VWZeZefhjkZlVlOlmn ' * 
d	B ll))+445IJ>D
 8O/ 1s   C4)F)r   )NN) rC   timetypingr9   pandasr'   numpyr   dotenvr   r"   rI   rF   boolrT   rr   r    r   r   r   r  rS   r   r   r   r   dictr   r   r   tupler  r   r0   r-   <module>r      st   	      	   fP fP",, fPP  & :D
:D:D \\:D@*:s *:# *: *:XZXdXd *:X&bll &",, &5SW< &%R\\ % %%RV, %!BLL !U !4d BLL S4Z 
BLL R\\ %d 23 r0   