
    Rho                     R   S SK Jr  S SKrS SKJr  S SKJr  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SFS jrS rS	 rS
 rS rS rS r/ SQr0 S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ S Q_S!/ S"Q_S#/ S$Q_S%/ S&Q_S'/ S(Q_S)/ S*Q_S+/ S,Q_S-/ S.Q_S// S0Q_rS1 rS2 r S3 r!SGS4 jr"\" S55      r#\RH                  " \#5      r%SHS6 jr&SIS7 jr'S8 r(S9\)S:\)S;\)4S< jr*SJS= jr+SKS> jr,SKS? jr-SKS@ jr.\/SA:X  a   \+" 5       r0\," SBSC\0SD9r1\2" SE5        \2" \15        gg)L    NPath)get_close_matches)PdfPagesMongoClientc                    [        U 5      nUR                  5       (       d  [        SU 35      eUR                  R	                  5       nUS:X  a   [
        R                  " USS9$ US:X  a   [
        R                  " U5      $ US	:X  a?  / S
QnU H  n [
        R                  " XS9s  $    [        SSR                  U5       35      e[        SU S35      e! [         a  n[        SU SU 35      eS nAff = f! [         a  n[        SU SU 35      eS nAff = f! [         a     M  [         a  n[        SU SU 35      eS nAff = f)Nu   El archivo no se encontró: z.xlsxlrd)enginez!No se pudo leer el archivo .xls: z
Error: z.xlsxz"No se pudo leer el archivo .xlsx: .csv)zutf-8
ISO-8859-1latin1cp1252)encodingu0   Error inesperado al leer CSV con codificación 'z': z7No se pudo leer el archivo CSV con las codificaciones: , z"Formato de archivo no soportado: 'z%'. Solo se permiten .csv, .xls, .xlsx)r   existsFileNotFoundErrorsuffixlowerpd
read_excel	Exception
ValueErrorread_csvUnicodeDecodeErrorjoin)ruta_archivoruta	extensioneencodings_a_probarencs         gc:\Users\julio\OneDrive\Documentos\Trabajo\IdeasFrscas\Demanda de la vivienda\../Funciones\funciones.pyleer_archivor$      s   D;;==">tf EFF!!#I F	U==f55 
g		V==&&
 
f	H%Ca{{466 & !EdiiPbFcEde
 	

 =i[Hmnoo3  	U@iPQsSTT	U  	VA$yQRPSTUU	V &  a #STWSXX[\][^!_``asN   C ,C9 D
C6 C11C69
DDD
E)	E2EEc           
      J   [        U5       n[        R                  " SS9u  p4SU R                   SSR	                  U R
                  S S 5      U R                  S   S:  a  SOS	-    S
U R                  5       R                  5        SU R                  R                  5       R                  5        S3	nUR                  S5        UR                  SSUSSSS9  UR                  U5        [        R                  " 5         U R                  5       R                  5       nXfS:     R!                  SS9nUR"                  (       d^  [        R                  " SS9u  p4UR%                  SUSS9  UR'                  S5        UR                  U5        [        R                  " 5         U R)                  5       nXwS:*     nUR"                  (       d^  [        R                  " SS9u  p4UR%                  SUSS9  UR'                  S5        UR                  U5        [        R                  " 5         [        R                  " SS9u  p4UR                  S5        U R+                  5       R-                  S5      R/                  5       n	UR                  SSU	SSSS9  UR                  U5        [        R                  " 5         U R1                  SS9R
                  n
U
 H  nX   R                  SS 9R3                  S5      n[        R                  " SS9u  p4UR5                  UR6                  R9                  [:        5      UR<                  S!S"9  UR'                  S#U S$35        UR                  U5        [        R                  " 5         M     S S S 5        [?        S%U 35        g ! , (       d  f       N= f)&N)
      )figsizez&Resumen general:
        Dimensiones: z
        Columnas: r   r&      z... z
        Duplicados: z
        Tipos de datos: z	
        offg{Gz??   top	monospace)fontsizeverticalalignmentfamilyr   F)	ascendingbarhsalmon)kindaxcolorzValores nulos por columnagrayu!   Columnas con un solo valor único   object)include)dropnaskyblue)r8   zTop 10 valores en ''u   ✅ Diagnóstico guardado en: ) r   pltsubplotsshaper   columns
duplicatedsumdtypesvalue_countsto_dictaxistextsavefigcloseisnullsort_valuesemptyplot	set_titlenuniquedescriberound	to_stringselect_dtypesheadr4   indexastypestrvaluesprint)df
nombre_pdfpdffigr7   textonulosunicosirrelevantesresumencolumnas_objcolvaloress                r#   diagnostico_base_datos_pdfri   9   s   	*	,,w/hhZ  99RZZ_-"((1+:JPRST U]]_((*+ ,//199;< =		 	
c52{[C		 		!ai ,,u,={{ll73GCJJFrJ:LL45KKIIK k*!!ll73GC6b?LL<=KKIIK ,,w/
++-%%a(224
1geKXC		 '''9AACg**%*8==bAGll73GCGGGMM((-w~~YGOLL.se156KKIIK  Y 
h 
*:,
78i 
	s   M1N
N"c                    SS K nU R                  U R                  5       S:*     nU R                  US9n U R	                  SUR
                  5      n U R                   H  n [        R                  " X   SS9X'   M     U $ !    M(  = f)Nr   r)   rC   *ignore)errors)numpyrC   rR   dropreplacenanr   
to_numeric)r]   npcolumnas_irrelevantesrg   s       r#   limpiar_base_viviendarv   p   s    JJrzz|q'89	.	/B 
C	 B zz	mmBGH=BG  I	s    A??Bc                    SSK nSSKnUR                  " [        U R                  R
                  5      S/[        U R                  R
                  5      S9nUR                  " U R                  S/S9nUR                  " S/S9nUR                  " S/S9nUR                  " S	/S9nUR                  " S
/S9nUR                  " S/S9n	UR                  " S/S9n
UR                  " U R                  5       R                  5       S/S9nUR                  " U R                  5       S/S9nU R                   GH  nX   R                  S:X  d  X   R                  R                  S:X  a  X   R                  5       nUR                  (       d  UR                  5       OSUR                  U'   UR                  (       d  UR!                  5       OSUR                  U'   X   R#                  5       UR                  U'   X   R                  SS9nUR                  " XR$                  " U5      -  5      * nUU
R                  U'   GM  X   R'                  5       UR                  U'   X   R)                  5       U	R                  U'   X   R#                  5       UR                  U'   X   R+                  5       S:w  a(  X   R+                  5       X   R-                  5       -  S-  OSnUU
R                  U'   GM     U
S   U
S   R                  5       -  S-  U
S'   UR/                  U5      R/                  U5      R/                  U5      R/                  U5      R/                  U5      R/                  U5      R/                  U5      R/                  U	5      R/                  U
5      n[1        SU R2                  S    SU R2                  S    S35        U$ )u  
Esta función realiza un análisis exploratorio inicial de una base de datos proporcionada.
Proporciona información sobre el tipo de datos, valores frecuentes, valores nulos, 
valores mínimos y máximos, importancia de las variables.
Parámetros:
- data (DataFrame): Un DataFrame de pandas que contiene los datos a analizar.

Retorna:
- result (DataFrame): Un DataFrame que resume el análisis de las variables en el conjunto de datos.
r   NNombres)rC   rX   
Data_Typesrk   u   Valor más frecuentezValor menos frecuenteUnique_ValuesMinMaxImportance_PercentageMissing_ValuesPresent_Valuesr;   categoryzN/AT)	normalized   z#La base de datos tiene un total de z	 filas y r)   z
 columnas.)pandasro   	DataFramelistrC   r[   rF   rM   rE   countdtypenamerG   rO   idxmaxlocidxminrR   log2minmaxstdmeanr   r\   rB   )datar   rt   rC   
data_typesmost_frequent_valuesleast_frequent_valuesunique_values
min_values
max_values
importancemissing_valuespresent_valuesrg   rG   value_counts_normalizedentropycvresults                      r#   analisis_base_dato_1r      s    ll4 3 34ykQUVZVbVbViViQjkG dkkL>BJ <<1G0HILL2I1JK LL/):;M ug.Jug.J '>&?@J \\$++-"3"3"5@P?QRN \\$**,9I8JKN ||9??h&$)//*>*>**L9113LIUI[I[L,?,?,Aaf $$S)JVJ\J\\-@-@-Bbg!%%c*%)Y%6%6%8Mc"&*i&<&<t&<&L#vv5@W8XXYYG")JNN3 #')--/JNN3"&)--/JNN3%)Y%6%6%8Mc"?Cy}}RS?S$)--/DINN$44;YZB"$JNN3+ . ,66M+NQ[\sQtQxQxQz+z  B  +BJ&' \\*%**+?@EEF[\aabpqvv  xF  G  L  L  MZ  [  `  `  ak  l  q  q  r|  }  B  B  CM  NF 
/

1i

STV`
ab M    c                 \    U R                   U R                  5       R                  5          nU$ N)rC   isnaall)r]   columnas_vaciass     r#   r   r      s"    jj1Or   c                 t   SSK n0 n[        U 5      nU R                   Vs0 s H  oDX   R                  5       U-  S-  _M     nn[	        5       n[        SSS5       HN  nUR                  5        VVs/ s H  u  pHX:  d  M  XF;  d  M  UPM     n	nnXSU S3'   UR                  U	5        MP     U$ s  snf s  snnf )up  
Analiza la cobertura de datos en cada columna de un DataFrame.

La función evalúa el porcentaje de valores no nulos en cada columna y clasifica las columnas 
en diferentes niveles de cobertura en intervalos de 10%, desde 100% hasta 0%.

Parámetros:
df (pd.DataFrame): DataFrame a analizar.

Retorna:
dict: Un diccionario donde las claves son descripciones del porcentaje de datos presentes 
      y los valores son listas de nombres de columnas que cumplen con dicho criterio.

Como llamar a la funcion:
resultado = analizar_columnas_vacias(base_datos)
for key, value in resultado.items():
    print(f"{key}: {value}")

r   Nr   izColumnas con al menos z
% de datos)r   lenrC   r   setrangeitemsupdate)
r]   r   info_columnastotal_filasrg   	coberturacolumnas_asignadas
porcentajepctcolumnas_filtradass
             r#   "analizar_porcentaje_datos_columansr      s    ( Mb'KEGZZPZcbgmmo3c99ZIPCc*
2;//2C{2ChcsGXc]`]zc2C{I[.zl*EF!!"45 +
  Q
 |s   "B/1B4 B4B4c                    SSK nUR                  R                  R                  X   5      (       d  [	        SU S35      eX   R                  5       nX   R                  5       nX   R                  5       nX   R                  5       nX   R                  5       nX   R                  S5      nX   R                  S5      n	X-
  n
X   R                  S5      nX   R                  S5      nX   R                  S	5      nX   R                  5       nX   R                  5       nUR                  " / S
QUUUUUU
UUUUU/S.5      nUR                  SU S3SSS9  / nUS:  a  UR                  S5        O)US:  a  UR                  S5        OUR                  S5        US:  a  UR                  S5        O)US:  a  UR                  S5        OUR                  S5        U
S:  a  UR                  S5        O)U
S:  a  UR                  S5        OUR                  S5        [!        S5        U H  n[!        SU 35        M     U$ )u  
Función que evalúa las métricas estadísticas de una columna numérica en un DataFrame.

La función calcula varias métricas estadísticas, como el valor máximo, mínimo, promedio,
mediana, desviación estándar, percentiles, asimetría, curtosis, y el rango intercuartílico
(IQR) de la columna proporcionada. Luego, crea un DataFrame con los resultados, lo guarda en
un archivo CSV y muestra el resumen de las métricas.

Argumentos:
df (DataFrame): El DataFrame que contiene la columna a evaluar.
columna (str): El nombre de la columna a evaluar.

Salida:
- Un DataFrame con las métricas estadísticas.
- Un archivo CSV con el resumen estadístico.
- Un texto explicando las conclusiones basadas en las métricas calculadas.
r   NLa columna 'u<   ' no es numérica. Por favor, ingrese una columna numérica.g      ?g      ?g?      ?r,   )u   Máximau   MínimoPromedioMedianau   Desviación Estándaru   Rango Intercuartílico (IQR)zPercentil 10zPercentil 50zPercentil 90u
   AsimetríaCurtosis)u   MétricaValorResumen_Estadistico_r   Fr   rX   r   u=   La distribución de los datos está sesgada hacia la derecha.u?   La distribución de los datos está sesgada hacia la izquierda.u,   La distribución de los datos es simétrica.uZ   Los datos tienen colas más pesadas que una distribución normal (curtosis leptocúrtica).uZ   Los datos tienen colas más ligeras que una distribución normal (curtosis platicúrtica).uP   La distribución de los datos tiene una curtosis normal (curtosis mesocúrtica).r&   u&   Los datos tienen una dispersión baja.2   u&   Los datos tienen una dispersión alta.u(   La dispersión de los datos es moderada.z
Conclusiones:z- )r   apitypesis_numeric_dtyper   r   r   r   medianr   quantileskewkurtosisr   to_csvappendr\   )r]   columnar   valor_mas_altovalor_mas_bajopromediomedianadesviacion_estandarQ1Q3IQRpercentil_10percentil_50percentil_90	asimetriacurtosisresumen_estadisticoconclusiones
conclusions                      r#   estadistica_descriptivar      sR   &  66<<((55<y0lmnn [__&N[__&N{!Hk  "G+//+			d	#B			d	#B
'C;''-L;''-L;''-L  "I{##%H ,,
 
( < !5gYdC5[gh L 1}[\	Q]^JK!|xy	Axyno
RxDE	rDEFG 

"
:,  # r   c                 Z   XR                   ;  a  [        SU S35      eX   R                  5       R                  5       nUS/Ul         US   R	                  5       nUS   U-  S-  US'   US   R                  5       US'   X3S   U:*     nUR                  SS/S9n[        SU S	U 35        U$ )
u3  
Analiza una columna del DataFrame proporcionando información sobre la distribución de sus valores
en cuanto a su frecuencia, porcentaje y porcentaje acumulado.

Parámetros:
df (DataFrame): El DataFrame que contiene los datos a analizar.
nombre_columna (str): El nombre de la columna que se analizará.
porcentaje_acumulado (float): El porcentaje acumulado máximo que debe mostrarse en los resultados.

Retorna:
DataFrame: Un DataFrame con las siguientes columnas:
    - 'nombre_columna': Los valores únicos en la columna analizada.
    - 'Cantidad': La cantidad de ocurrencias de cada valor.
    - 'Porcentaje': El porcentaje de ocurrencias de cada valor respecto al total.
    - 'Porcentaje Acumulado': El porcentaje acumulado hasta cada valor.

Lanza:
ValueError: Si 'nombre_columna' no existe en el DataFrame.
r   z' no existe en el DataFrame.Cantidadr   
PorcentajezPorcentaje Acumuladork   z'Estos son los datos que representan el z % de los valores. De la columna )rC   r   rG   reset_indexrE   cumsumrp   r\   )r]   nombre_columnaporcentaje_acumuladodf_ana
suma_activs        r#   analizar_columnasr   f  s    , ZZ'<'77STUU ,,.::<F$j1FN 
#'')J #:.;sBF< &,L%9%@%@%BF!" 126JJKF [[L1G#H[IF 
34H3IIijxiy
z{Mr   )Tienda de ropaBoutique de moda
   ZapateríaTienda de ropa deportivaTienda de accesoriosTienda de ropa infantilRefaccionaria   Taller mecánicoVenta de autopartesLavado de autos   Tienda de llantas y alineación"Venta de motocicletas y accesoriosRestaurante
   Cafetería	   Taquería	   Pizzería   Pastelería y reposteríaTienda de abarrotes   Carnicería   Frutería y verdulería   Tienda de productos orgánicos Tienda de celulares y accesorios#   Venta y reparación de computadoras   Tienda de electrodomésticosVenta de videojuegos y consolas    Tienda de cámaras y fotografíaFarmaciaSpaSpa y centro de masajesu   Estéticapeluquería	   Barbería   Tienda de cosméticosTienda de productos naturalessuplementosGymPilatesBoxTienda de muebles   Ferretería   Tienda de iluminación"   Venta de artículos de decoraciónTienda de colchones	   Librería    Tienda de música e instrumentos"   Tienda de cómics y coleccionables   JugueteríaCine o sala de entretenimientoAgencia de viajesInmobiliaria   Consultoría empresarial   Centro de copiado e impresión!Agencia de publicidad y marketingEscuela de idiomas o cursos   Tienda de artículos deportivosTienda de pesca y camping!Tienda de bicicletas y accesorios.Tienda de alimentos y accesorios para mascotasVeterinaria   Estética caninaDespacho de abogados   Notaría   Correduría pública   Mediación y arbitrajeAgencia de cobranza&   Oficina de gestoría legal y trámites%   Consultoría en propiedad intelectualDespacho contable   Asesoría financieraCasa de bolsa!   Cooperativa de ahorro y préstamoAgencia de seguros   Consultoría en inversiones   Oficina de crédito y cobranzaHospital   Clínica médicaConsultorio dental   Laboratorio clínico   Centro de rehabilitación   ÓpticaFarmacia con consultorio   Nutrición y dietética   Psicología y terapiaHotel de lujoHotel boutiqueHotel de negociosMotelHostal   Cabañas y ecoturismoAirbnb y alquiler vacacionalResort con todo incluidoGlamping (camping de lujo)Bomberos   Protección Civil   Policía Municipal   Policía Estatal#   Policía Federal (Guardia Nacional)Seguridad Privada+C5 o C4 (centro de monitoreo y emergencias)	Cruz Roja   Cruz ÁmbarERUM#   Grupos de Rescate en Montaña y MarHospitales de Urgencias,   Centros de donación de sangre y trasplantes   Presidencia de la República2   Secretaría de Hacienda y Crédito Público (SHCP)(   Secretaría de Educación Pública (SEP)   Secretaría de Salud (SSA)0   Secretaría de Seguridad y Protección CiudadanaC   Secretaría de Relaciones Exteriores (SRE - pasaportes, consulados)   Secretaría de Turismo&   Instituto Nacional de Migración (INM),   Servicio de Administración Tributaria (SAT)Gobernatura del Estado"   Secretaría de Finanzas del Estado%   Secretaría de Movilidad y Transporte$   Secretaría de Desarrollo Económico   Secretaría de Medio Ambiente<   Registro Civil (actas de nacimiento, matrimonio, defunción)   Fiscalía General del EstadoPresidencia Municipal   Tesorería Municipal#   Desarrollo Urbano y Obras Públicas(   Seguridad Pública y Tránsito Municipalr>  >   Servicios Públicos Municipales (agua, recolección de basura)1DIF Municipal (Desarrollo Integral de la Familia)zRopa y Moda)r   r   r   r   r   r   zAutomotriz y Refacciones)r   r   r   r   r   r   zAlimentos y Bebidas)	r   r   r   r   r   r   r   r   r   u   Tecnología y Electrónica)r   r   r   r   r   zSalud y Belleza)r   r   r   u   Estética y peluqueríar   r  r  Suplementosr  r  r  zHogar y Muebles)r  r  r	  r
  r  zEntretenimiento y Cultura)r  r  r  r  r  zServicios y Oficinas)r  r  r  r  r  r  zDeportes y Aire Libre)r  r  r  Mascotas)r  r  r  u   Jurídico y Legal)r  r  r  r   r!  r"  r#  zFinanzas y Contabilidad)r$  r%  r&  r'  r(  r)  r*  zSalud y Medicina)	r+  r,  r-  r.  r/  r0  r1  r2  r3  zHoteles y Hospedaje)	r4  r5  r6  r7  r8  r9  r:  r;  r<  u   Seguridad y Protección Civil)r=  r>  r?  r@  rA  rB  rC  u   Rescate y Emergencias Médicas)rD  rE  rF  rG  rH  rI  zDependencias de Gobierno)rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  c                 "   Sn[         R                  " U 5      n[         R                  " U5      n[         R                  " X -
  5      n[         R                  " X1-
  5      n[         R                  " US-  5      S-  [         R                  " U5      [         R                  " U5      -  [         R                  " US-  5      S-  -  -   n	S[         R                  " [         R
                  " U	5      [         R
                  " SU	-
  5      5      -  n
XJ-  nU$ )u   
Calcula la distancia en kilómetros entre dos puntos en la Tierra dados por sus latitudes y longitudes
utilizando la fórmula de Haversine.
i  r:   r)   )mathradianssincosatan2sqrt)lat1lon1lat2lon2Rphi1phi2	delta_phidelta_lambdaac	distancias               r#   calcular_distancia_haversineru  q  s    
 	A<<D<<DT[)I<<,LQ1$txx~'FR^abRbIcghIh'hhA	DJJtyy|TYYq1u%566AIr   c                    SSK nSSKnSnUR                  US9n/ nU GH  n UR                  XUS-  S9n	/ nU	(       GaM  [        U	R                  S	/ 5      5       H  u  pUR                  S
S5      nUR                  SS5      nUR                  S0 5      R                  S0 5      R                  SS5      nUR                  S0 5      R                  S0 5      R                  SS5      nUS:X  d  US:X  a  M  [        U S   U S   UU5      nUU::  d  M  U SU 3nSU SU 3nUR                  US-   XUUUU/5        M     U	R                  S5      nU(       a+  [        R                  " S5        UR                  XUS-  US9n	OO
U	(       a  GMM  UR                  U5        GM     UR                  " U/ SQS9nU$ ! [         a  n
[        SU SU
 35         Sn
A
GM  Sn
A
ff = f)u  
Obtiene una lista de establecimientos cercanos a las coordenadas proporcionadas,
basándose en una lista de tipos de establecimientos.

Args:
coordenadas (tuple): Coordenadas de latitud y longitud (lat, lng).
establecimientos (list): Lista de tipos de establecimientos a buscar (ej. ['restaurantes', 'cafeterías']).
radius (Number): Radio de busqueda en Km

Returns:
pd.DataFrame: DataFrame con la información de los establecimientos encontrados.
r   Nz'AIzaSyA5GlM3Rq9HWUauiSx2LEA2PzhMo-4k2GE)keyi  )querylocationradiusz#Error al realizar la consulta para z: resultsr   No disponibleformatted_addressgeometryry  latlngr)   r   zhttps://www.google.com/maps?q=,next_page_tokenr:   )rx  ry  rz  
page_token)IDzNombre de establecimientoEstablecimiento	DomiciliolatitudlongitudzLiga de Google Mapsrk   )
googlemapsr   Clientplacesr   r\   	enumerategetru  r   timesleepextendr   )coordenadasestablecimientosrz  r  r   api_keygmapsresultados_totalesestablecimiento
resultadosr    establecimientos_localidadidxlugarnombre	direccionr  r  rt  coordenadas_strliga_google_mapsr  r]   s                          r#   "obtener_establecimientos_localidadr    s*     8G'*E  ,	OZ`aeZefJ &(" '
y"(EF
6?;!II&9?K	ii
B/33JCGG_ii
B/33JCGG_/)SO-C 9QUVY\^ab	 &),RuoO *HuAcU'S$ /55sQwYbdgiln~  7B  C) G. )nn->?O

1"\\^dei^i  wF\  G
= jB 	!!"<=[ ,` 
(  3e  
fBI]  	77H1#NO	s   F88
GGGc                     SS K nSS KnSnX   nSnUUS.n UR                  XgS9nUR                  5       n	U	S   S:X  a  U	S   S   n
U
R                  S	S
5      nU
R                  S/ 5      nSU;   a  SnO#SU;   a	  SU;   a  SnOSU;   a  SnOSU;   a  SnOSnU
R                  SS/5      S   nUR                  " XU/5      $ UR                  " / SQ5      $ ! [
         a  nUR                  " / SQ5      s S nA$ S nAff = f)Nr   z'AIzaSyD-8YtqddehkKMliUFm7hC7d_TQvaXrIHsz:https://maps.googleapis.com/maps/api/place/textsearch/json)rx  rw  )paramsstatusOKr{  ratingr|  r   fine_diningzAlta Cocina
restaurantcasualzCocina Casual	fast_foodu   Comida Rápidacafer   zOtro Tipo de CocinaTipo no disponible)r|  r  r  )Error al obtener datosr  r  )requestsr   r  jsonSeriesr   )rowr   r  r   r  restauranteurlr  responser   r  calificaciontipostipo_cocina
tipo_lugarr    s                   r#   obtener_informacion_restauranter    s0   7G,K GC F
#i<<<3}} >T!OA&E !99X?L IIgr*E %+&8u+<-%.5*3 7-A,BCAFJ 99lDEE99Z[[ iyyghhis$   B)C C 
C=C82C=8C=c                 6   X   R                  5       R                  5       nUS/Ul        / SQnUS:X  a  [        R                  " UUSUXSS0UUS9nO\US:X  a(  [        R
                  " UUSUUS9nUR                  SS	9  O.US
:X  a  [        R                  " UUSUXSS0SS9nO[        S5      eUR                  [        SSSS9[        SSSS9[        SSSSSS[        SSSSS9S9/SUR                  5       S 9  UR                  5         UR                  U5        g!)"u  
Genera un gráfico interactivo que muestra el total de cada tipo de comercio,
y permite hacer clic para obtener más detalles. Se puede seleccionar el tipo de gráfico.

Args:
df (pd.DataFrame): DataFrame con los datos de los establecimientos.
colum_to_grafic (srt): Nombre de la columna a graficar.
title_grafica (str): Título de la gráfica.
name_grafica (str): Nombre con el que se guardará el archivo de la gráfica.
tipo_grafica (str): Tipo de gráfico a generar ('bar', 'pie', etc.). Por defecto es 'bar'.
r   )z#FFB3BAz#FFDFBAz#FFFFBAz#BAFFC9z#BAE1FFz#D9D9D9z#FFB3D9barTotal)xytitlelabelsr8   color_discrete_sequencepie)namesr[   r  r  zu<b>%{label}</b><br>Cantidad: %{value}<br>Porcentaje: %{percent:.2%}<br><extra>Haga clic para ver los detalles</extra>)hovertemplatelinelinear)r  r  r  r  
line_shapeu=   El tipo de gráfico no es válido. Usa 'bar', 'pie' o 'line'.zLato, sans-serif   black)r2   sizer8   zRoboto, sans-serif   r*   r   gffffff?paperFzPlayfair Display, serif   z#FF0000italic)r2   r  r8   style)rJ   r  r  xrefyref	showarrowfontzevent+select)
title_fontr  annotations	clickmoder  N)rG   r   rC   pxr  r  update_tracesr  r   update_layoutdictuppershow
write_html)r]   colum_to_grafictitle_graficaname_graficatipo_graficaconteo_comerciospastel_colorsr`   s           r#   graficar_interactivor    sp    *779EEG /< bM uff%&!(,z7S*-:< 
	ff%*&(-:	< 	K 	 	
 
	gg&'")-
GT!)+ XYY 1'J-BgFTw6RyX`a
  !!!#   HHJ NN< r   z`C:/Users/julio/OneDrive/Documentos/Trabajo/Ideas Frescas/MacroDatos/Claves_Estado_Municipio.xlsxc                    U R                  5       R                  5       n U(       a  UR                  5       R                  5       OSn[        S   R                  5       nX;  a!  [	        XSSS9nU(       a	  SUS    S3$ S	U  S
3$ [        [        S   U :H     nU(       d  U(       a  SUS   R
                  S   0$ S$ US   R                  5       nX;  ao  [	        XSSS9nU(       a	  SUS    S3$ [        [        S   U:H     nUR                  (       d*  US   R                  5       nS	U SSR                  U5       3$ S	U S3$ XUS   U:H     R
                  S   n	U(       a  U	S   U	S   S.$ S$ )up  
Devuelve claves de entidad y municipio si se solicita explícitamente.
En caso de error o error tipográfico, sugiere o informa el problema.

Parámetros:
------------
nombre_entidad : str
    Nombre del estado (ej. "Sinaloa").
nombre_municipio : str, opcional
    Nombre del municipio (ej. "Mazatlán").
retornar_resultado : bool
    Si es True, retorna un dict con claves correctas. Si es False, solo reporta errores/sugerencias.

Retorna:
--------
None si todo está correcto y retornar_resultado=False.
Mensaje de error o sugerencia si hay problemas.
Claves {'CVE_ENT': ..., 'CVE_MUN': ...} si retornar_resultado=True.
NNOM_ENTr)   g333333?)ncutoffu   ¿Quisiste decir 'r   z'?r?   u   ' no es válido.CVE_ENTNOM_MUNz' pertenece a: r   u$   ' no se encontró en ningún estado.CVE_MUN)r  r  )stripr  	DF_CLAVESuniquer   ilocrO   r   )
nombre_entidadnombre_municipioretornar_resultado	entidadessugerenciasdf_ent
municipiosmun_otroestadosfilas
             r#   obtener_claves_estado_munr  a  s   ( $))+113N;K'--/557QU)$++-I&'QsS:E#KN#326oQ~N^^nKooy+~=>F9K	6),11!45UQUU	"))+J)'(8RUV'A'7r::Yy15EEF~~y)002G'(		'8J7KLL#$$HII#'778==a@DGYtI4	?Cc_ccr   c           
      ,   SS K nSSKJn  U" S5      S-  S-  nUR                  " U5      nU b
  XUS   U :H     nUb
  XUS   U:H     nSSS	S
SSS[	        S5      /n/ SQnUR
                  " US   UUSS9US'   USS/   nUR                  SSS9S   R                  5       R                  5       n	/ SQnXS   R                  U5         n	U	R                  S5      R                  U5      R                  5       n	SS/U	l        US   R                  5       n
U	S   R                  S5      U	S'   US   R                  5       R                  5       nUS   R                  5       R!                  5       nX-  S-  U	S'   U c  Uc  SnOUc  SnOSnU	R#                  USSS9  U	$ )Nr   r   ..
MacroDatoszpobreza22.csvent	ubica_geoi  i(#  iPF  i0u  iȯ  i inf)EDD+C-CC+zA/BictpcF)binsr  rightzNivel Socioeconomico)observedzIngreso Promedior:   r   r   z)Nivel Socioeconomico a nivel nacional.csvz#Nivel Socioeconomico del estado.csvz3Nivel Socioeconomico del estado y del municipio.csvr   r   )r   pathlibr   r   floatcutgroupbyr   r   isin	set_indexreindexrC   rT   rG   rE   tolistr   )estado	municipior   r   csv_pobrezapobreza_datar  r  ingreso_promingreso_promediopromedio_generalsumarh   
csv_nombres                 r#   NSE_CONEVALr    s	   t*|+o=K ;;{+L #$76$AB #$=$JK tT5%eED4F ,.66W	,L'(  *@ ABL $++,BU+ST[\aacooq 6F (9O(P(U(UV\(]^'112HIQQRXYeeg !78JK $G,113+;<N+O+U+UVW+X'( ./<<>BBDD12??AHHJG&-n%;\" ~)+@
		:
 K
 JelKr   c           
      ^   SSK nSSKnSSKJn  U" S5      S-  S-  nUR                  " U5      nUR                  SSS	S
SSSS.SS9  UR                  SS9nU/ SQ   nXS   R                  5       R                  5       ;  a0  [        SU  SUS   R                  5       R                  5        35      eXS   U :H     nUS   R                  5       R                  5       n	X;  a  [        SU SU  SU	 35      eXS   U:H     nXS   R                  U5         nUR                  SU SU  S3SSS 9  U$ )!u  
Función que procesa y filtra los datos socioeconómicos por AGEB de un municipio específico dentro de un estado
utilizando la base de datos 'NSE_por_AGEB_AMAI.xlsx'. La función valida que el 'estado' y el 'municipio' sean
correctos antes de realizar el procesamiento de los datos.

Argumentos:
estado (str): El nombre del estado a filtrar en la base de datos.
municipio (str): El nombre del municipio a filtrar en la base de datos.
zona_total_estudio (DataFrame):lista de AGEB a filtrar. 

Salida:
CSVs generados:
- 'Nivel_Socioeconomico_por_AGEB_{municipio}_{estado}.csv' con los datos filtrados.
- 'Nivel_Socioeconomico_por_AGEB_{municipio}_{estado}_agrupado.csv' con los datos agrupados por 'AGEB'.
r   Nr   r  r  zNSE_por_AGEB_AMAI.xlsxABr  r  r  r  r   r  )u,   TOTAL DE VIVIENDAS POR NIVEL SOCIOECONÓMICOz
Unnamed: 8z
Unnamed: 9zUnnamed: 10zUnnamed: 11zUnnamed: 12zUnnamed: 13T)rC   inplacerX   )NOMBRE ENTIDADNOMBRE MUNICIPIOzNOMBRE LOCALIDADAGEBr  r  r  r  r  r   r  zNIVEL PREDOMINANTEr  zEl estado 'u=   ' no está en la base de datos. Los estados disponibles son: r   zEl municipio 'u   ' no está en el estado 'z2'. Los municipios disponibles en este estado son: r!  ,Nivel_Socioeconomico_por_AGEB_de_interes_en__r   Fr   r   )r   ro   r	  r   r   renamerp   r  r  r   r  r   )
r  r  zona_total_estudior   rt   r   nse_amai	data_amaidata_amai_zona_estudiomunicipios_disponibless
             r#   nivel_socioeconomico_AMAIr*    s   "  DzL(+CCH h'I 8< &*  + Q'I ' (   /0779@@BB;vh.k%&67>>@GGIJL M 	M 4K[4\`f4fg 44FGNNPWWY.>)4MfX V--C,DF G 	G 4K]4^bk4kl 464R4W4WXj4kl !!$PQZP[[\]c\ddh"iqv  BN!  O!!r   r  r  	localidadc                    SSK nSSKJn  U" S5      nUR                  " U5      nUS   R	                  [
        5      US'   US   R
                  R                  SS5      US'   US   R
                  R                  SS5      US	'   US   R
                  R                  SS
5      US'   US   R
                  R                  S
S5      US'   US   R
                  R                  SS5      US'   / SQnUR                   Vs/ s H  oU;  d  M
  UPM     n	nXgU	-      nXfS   U :H  US	   U:H  -  US   U:H  -     n
S nU
S   R                  U5      U
S'   / SQnX   n
SU  SU SU S3nU
R                  USS9  U
$ s  snf )u/  
Esta función procesa y clasifica los datos del archivo 'enigh_gastohogar.csv' 
en función de las categorías de gasto y filtra los datos por Estado, Municipio 
y Localidad. Los resultados se guardan en un archivo CSV y se retornan como 
un DataFrame para su posterior uso.

Parámetros:
estado (str): Código del Estado para filtrar los datos.
municipio (str): Código del Municipio para filtrar los datos.
localidad (str): Código de la Localidad para filtrar los datos.

Retorna:
DataFrame: Un DataFrame con los datos filtrados y clasificados por gasto.
r   Nr   zXC:/Users/julio_2h7cnt5/OneDrive/Documentos/Ideas Frescas/MacroDatos/enigh_gastohogar.csvfoliovivr:   Estado   	Municipio   	Localidadr&   Manzana   Numero_orden)r-  r.  r0  r2  r3  c                    U R                  S5      (       d  U S:X  a  gU R                  S5      (       d  U S:X  a  gU R                  S5      (       a  gU S	;   a  gU R                  S
5      (       d  U S:X  a  gU R                  S5      (       d  U R                  S5      (       a  gU S;   a  gU R                  S5      (       d,  U R                  S5      (       d  U R                  S5      (       a  gU S;   a  gU R                  S5      (       d  U S:X  a  gU R                  S5      (       d  U S:X  a  gU S;   a  gU S:X  a  gU S ;   a  g!g")#NAT901	Alimentosr  T903Limpiezar   
Personales)
F002R007L029N001N002N012N013N014N015T904r  T905u
   EducaciónBM
Transporte)F001F003F004F005F006F007F008F009F010F011F012F013F014R005R006R012L013N008N016T902T914T906GIKVivienda)R001R002R003R004R008R009R010R011R013N005N007N009T907T910T912HT909zVestido y CalzadoJT911Salud)L001L002L003L004L005L006L007L008L009L010L011L012L014L015L017L018L019L020L021L022L023L024L025L026L027L028N003N006T913EsparcimientoN004u   Turísticos)N010N011T908T915T916zTransparencias de GastoOtro)
startswith)claves    r#   clasificar_gasto1gastohogar_zona_estudio.<locals>.clasificar_gastoa  sL   C  EVOc""evoc""ffc""evoc""e&6&6s&;&;  G  Gc""e&6&6s&;&;u?O?OPS?T?T  O  Oc""evo&c""evo    "f_ >>,r   r     Clasificación gasto)r-  r.  r0  r2  r3  r  r  
tipo_gasto
forma_pag1
forma_pag2
forma_pag3
lugar_comp
frecuenciacantidadgastogastohogar_r#  r   Fr  )
r   r	  r   r   rY   rZ   slicerC   applyr   )r  r  r+  r   r   gastohogar_path
gastohogarcolsrg   
cols_extragastohogar_filtrador  columnasnombre_archivos                 r#   gastohogar_zona_estudior  3  s      uvO _-J (
3::3?Jz &j155;;AqAJx(488>>q!DJ{(488>>q!DJ{&z266<<QCJy!+J!7!;!;!A!A"b!IJ~ GD!+!3!3G!3#$#!3JG:-.J %&:f&D&0&=&J&L&0&=&J&L M
@ 3Fg2N2T2TUe2f./OH .7 #6(!I;a	{$GN ~U; q Hs   <	E4	E4c                 (    [        U 5      nX1   nXB   $ r   r   )uridb_namecollection_nameclientdbs        r#   conectar_mongor    s    F	Br   c                     Uc
  [        5       n[        UR                  SU 05      5      n[        R                  " U5      $ )NPuerto)r  r   findr   r   )puerto	coleccionr  s      r#   consultar_puertor    s7    "$	innh%789J<<
##r   c                 v    U c
  [        5       n [        R                  " [        U R	                  5       5      5      $ r   )r  r   r   r   r  )r  s    r#   obtener_todor    s+    "$	<<Y^^-.//r   c                     Uc
  [        5       n[        U [        R                  5      (       d  [	        S5      eU R                  SS9nUR                  U5      n[        [        UR                  5       S35        g )Nz)Debe proporcionar un DataFrame de pandas.records)orientz registros insertados.)
r  
isinstancer   r   r   rH   insert_manyr\   r   inserted_ids)df_nuevor  	registros	resultados       r#   agregar_datosr    sl    "$	h--DEE  	 2I%%i0I	S''())?
@Ar   __main__u   Mazatlán, Sin.r/  )limiter  u    Primeros registros de Mazatlán:)zdiagnostico_datos.pdf)r  )NF)NN)zmongodb://localhost:27017/puertos_crucerosarribos_pasajerosr   )3matplotlib.pyplotpyplotr@   r   r   r	  r   difflibr   osr  rc  plotly.expressexpressr  matplotlib.backends.backend_pdfr   ro   rt   pymongor   r$   ri   rv   r   r   r   r   r   	comercioscategorias_establecimientosru  r  r  r  CLAVES_PATHr   r  r  r  r*  rZ   r  r  r  r  r  __name__r  r]   r\    r   r#   <module>r     sB       % 	    4  
%pN59n0JX
 FgT/t9	@M M
  !M  M ! #M"  #M*  +M2   "3M:  ;MB  CMH  IMN  OMV   WM^  _Mh  iMp $ &qMx % 'yM@  !AM b"Rj3ilH!b uvMM+&	/dnFRO"d]C ]C ]C ]F$0	B z I 
+A	KB	
,-	"I r   