
    Ggk                         d dl mZ d dlZd dlZd dlZd dlmZ dZ	d Z
d Zd ZddZd Zd Zd	 Zdd
ZddZd ZdededefdZy)    N'AIzaSyD-8YtqddehkKMliUFm7hC7d_TQvaXrIHsc                    d}t        j                  |       }t        j                  |      }t        j                  || z
        }t        j                  ||z
        }t        j                  |dz        dz  t        j                  |      t        j                  |      z  t        j                  |dz        dz  z  z   }	dt        j                  t        j
                  |	      t        j
                  d|	z
              z  }
||
z  }|S )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        )mathradianssincosatan2sqrt)lat1lon1lat2lon2Rphi1phi2	delta_phidelta_lambdaac	distancias               ^C:\Users\julio_2h7cnt5\OneDrive\Documentos\Ideas Frescas\AMPI 17 FEB\../Funciones\funciones.pycalcular_distancia_haversiner      s    
 	A<<D<<DTD[)I<<t,LQ1$txx~'FR^abRbIcghIh'hhA	DJJtyy|TYYq1u%566AAI    c                    ddl }ddl}d}|j                  |      }g }|D ]q  }	 |j                  || |dz        }	g }|	r@t        |	j                  d	g             D ]  \  }}|j                  d
d      }|j                  dd      }|j                  di       j                  di       j                  dd      }|j                  di       j                  di       j                  dd      }|dk(  s|dk(  rt        | d   | d   ||      }||k  s| d| }d| d| }|j                  |dz   ||||||g        |	j                  d      }|r.t        j                  d       |j                  || |dz  |      }	nn|	r@|j                  |       t |j                  |g d      }|S # t        $ r}
t        d| d|
        Y d}
~
d}
~
ww xY w)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   Nr   )keyi  )querylocationradiusz#Error al realizar la consulta para z: resultsnameNo disponibleformatted_addressgeometryr   latlngr   z, zhttps://www.google.com/maps?q=,next_page_tokenr   )r   r   r    
page_token)IDzNombre de establecimientoEstablecimiento	DomiciliolatitudlongitudzLiga de Google Mapscolumns)
googlemapspandasClientplaces	Exceptionprint	enumerategetr   appendtimesleepextend	DataFrame)coordenadasestablecimientosr    r2   pdapi_keygmapsresultados_totalesestablecimiento
resultadoseestablecimientos_localidadidxlugarnombre	direccionr&   r'   r   coordenadas_strliga_google_mapsr)   dfs                          r   "obtener_establecimientos_localidadrP      s0    7G'*E  ,	OkZ`aeZefJ &(" '
y"(EF
U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
= B 	!!"<=[ ,` 
(  3e  
fBI]  	77H1#NO	s   F--	G6GGc                    dd l }dd l}d}| |   }d}||d}	 |j                  ||      }|j                         }	|	d   dk(  rx|	d   d   }
|
j                  d	d
      }|
j                  dg       }d|v rd}nd|v rd|v rd}nd|v rd}n	d|v rd}nd}|
j                  ddg      d   }|j	                  |||g      S |j	                  g d      S # t
        $ r}|j	                  g d      cY d }~S d }~ww xY w)Nr   r   z:https://maps.googleapis.com/maps/api/place/textsearch/json)r   r   )paramsstatusOKr!   ratingr#   typesfine_diningzAlta Cocina
restaurantcasualzCocina Casual	fast_foodu   Comida Rápidacafeu
   CafeteríazOtro Tipo de CocinaTipo no disponible)r#   r\   r\   )Error al obtener datosr]   r]   )requestsr3   r9   jsonSeriesr6   )rowcolumnar^   rA   rB   restauranteurlrR   responsedatarJ   calificaciontipostipo_cocina
tipo_lugarrG   s                   r   obtener_informacion_restauranterk   k   s6   7Gg,K GC F
#i<<F<3}} >T!OA&E !99X?L IIgr*E %+&8u+<-%.5*3 7-A,BCAFJ 99lKDEE99Z[[ iyyghhis$   B"C ;C 	C4C/)C4/C4c                 f   | |   j                         j                         }|dg|_        g d}|dk(  r!t        j                  ||d|||ddi||      }nb|dk(  r-t        j
                  ||d||      }|j                  d	       n0|d
k(  r t        j                  ||d|||ddid      }nt        d      |j                  t        ddd      t        ddd      t        ddddddt        dddd            gd|j                                 |j                          |j                  |       y!)"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'.
    Cantidad)z#FFB3BAz#FFDFBAz#FFFFBAz#BAFFC9z#BAE1FFz#D9D9D9z#FFB3D9barTotal)xytitlelabelscolorcolor_discrete_sequencepie)namesvaluesrr   ru   zu<b>%{label}</b><br>Cantidad: %{value}<br>Porcentaje: %{percent:.2%}<br><extra>Haga clic para ver los detalles</extra>)hovertemplatelinelinear)rp   rq   rr   rs   
line_shapeu=   El tipo de gráfico no es válido. Usa 'bar', 'pie' o 'line'.zLato, sans-serif   black)familysizert   zRoboto, sans-serif          ?gffffff?paperFzPlayfair Display, serif   z#FF0000italic)r   r   rt   style)textrp   rq   xrefyref	showarrowfontzevent+select)
title_fontr   annotations	clickmoderr   N)value_countsreset_indexr1   pxrn   rv   update_tracesrz   
ValueErrorupdate_layoutdictuppershow
write_html)rO   colum_to_grafictitle_graficaname_graficatipo_graficaconteo_comerciospastel_colorsfigs           r   graficar_interactivor      sv    /*779EEG /< bM uff%&!(,oz7S*-:< 
	ff%*&(-:	< 	K 	 	
 
	gg&'")-
GT!)+ XYY 1'J-BgFTw6RyX`a
  !!!#   HHJ NN< r   c                 <	   dd l }dd l}|j                  t        | j                  j
                        dgt        | j                  j
                              }|j                  | j                  dg      }|j                  dg      }|j                  dg      }| j                  D ]  }| |   j                  dk(  s| |   j                  j                  d	k(  r}| |   j                         }|j                  s=|j                         g|j                  |<   |j                         g|j                  |<   d
g|j                  |<   d
g|j                  |<   dg|j                  |<   dg|j                  |<    |j                  | j                         j                         dg      }	|j                  | j!                         dg      }
|j                  dg      }| j                  D ]#  }| |   j#                         g|j                  |<   % |j                  dg      }| j                  D ]$  }	 | |   j%                         g|j                  |<   & |j                  dg      }| j                  D ]$  }	 | |   j'                         g|j                  |<   & |j                  dg      }| j                  D ]  }| |   j                  dk(  s| |   j                  j                  d	k(  rJ| |   j                  d      }|j                  ||j)                  |      z         }|g|j                  |<   {| |   j+                         dk7  r;| |   j+                         | |   j-                         z  dz  }|g|j                  |<   dg|j                  |<    |d   |d   j                         z  dz  |d<   t/        d| j0                  d    d| j0                  d    d       |j3                  |      j3                  |      j3                  |      j3                  |	      j3                  |
      j3                  |      j3                  |      j3                  |      j3                  |      }|S #  dg|j                  |<   Y UxY w#  dg|j                  |<   Y 'xY w)Nr   Nombres)r1   index
Data_Typesr0   u   Valor más frecuentezValor menos frecuenteobjectcategoryNahzN/AMissing_ValuesPresent_ValuesUnique_ValuesMinMaxImportance_PercentageT)	normalized   z#La base de datos tiene un total de z	 filas y r   z
 columnas.)r3   numpyr>   listr1   rx   dtypesdtyper"   r   emptyidxmaxlocidxminisnullsumcountnuniqueminmaxlog2stdmeanr7   shapejoin)rf   rA   npr1   
data_typesmost_frequent_valuesleast_frequent_valuescolr   missing_valuespresent_valuesunique_values
min_values
max_values
importanceentropycvresults                     r   analisis_base_dato_1r      s    ll4 3 34$-;!%dll&9&9!:  <G
 dkkL>BJ <<1G0H<ILL2I1JLK||9??h&$s)//*>*>**L9113L%%1=1D1D1F0G$((-2>2E2E2G1H%))#.16$((-27%))#. .3G $$S).3W!%%c*   \\$++-"3"3"5+;*< " >N \\$**,+;*< " >N LL/):L;M||"&s)"3"3"5!6#  ug.J||	*#'9==?"3JNN3  ug.J||	*#'9==?"3JNN3  '>&?@J||9??h&$s)//*>*>**L911D1ALvvlRWW\-BBCCG#*)JNN3 Cy}}!#3immoS	(88C?')d
s#'(c
s#  ,66M+NQ[\sQtQxQxQz+z  B  +BJ&' 
/

1i

STV`
ab\\*%**+?@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MC	*#('JNN3	*#('JNN3s   2!Q.8!R.RRc                    ddl }|j                  j                  j                  | |         st	        d| d      | |   j                         }| |   j                         }| |   j                         }| |   j                         }| |   j                         }| |   j                  d      }| |   j                  d      }	|	|z
  }
| |   j                  d      }| |   j                  d      }| |   j                  d	      }| |   j                         }| |   j                         }|j                  g d
||||||
|||||gd      }|j                  d| ddd       g }|dkD  r|j                  d       n(|dk  r|j                  d       n|j                  d       |dkD  r|j                  d       n(|dk  r|j                  d       n|j                  d       |
dk  r|j                  d       n(|
dkD  r|j                  d       n|j                  d       t!        d       |D ]  }t!        d|         |S )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   g?)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_.csvF
ISO-8859-1r   encodingu=   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).
   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- )r3   apirV   is_numeric_dtyper   r   r   r   medianr   quantileskewkurtosisr>   to_csvr:   r7   )rO   rb   rA   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   F  sk   &  66<<((G5<y0lmnn [__&N[__&N'{!Hk  "GW+//+	G		d	#B	G		d	#B
r'Cg;''-Lg;''-Lg;''-L7  "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                 b   || j                   vrt        d| d      | |   j                         j                         }|dg|_         |d   j	                         }|d   |z  dz  |d<   |d   j                         |d<   ||d   |k     }|j                  ddg      }t        d| d	|        |S )
us  
    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.rm   r   
PorcentajezPorcentaje Acumulador0   z'Estos son los datos que representan el z % de los valores. De la columna )r1   r   r   r   r   cumsumdropr7   )rO   nombre_columnaporcentaje_acumuladodf_ana
suma_activs        r   analizar_columnasr     s    , RZZ'<'77STUU ,,.::<F$j1FN 
#'')J #:.;sBF< &,L%9%@%@%BF!" F126JJKF [[L1G#H[IF 
34H3IIijxiy
z{Mr   c                     dd l }ddlm}  |d      }|j                  |      }||d   | k(     }|r||d   |k(     }|j                  ry ||d   j
                  d   S |ddg   j
                  d   S )Nr   Pathz`C:/Users/julio_2h7cnt5/OneDrive/Documentos/Ideas Frescas/MacroDatos/Claves_Estado_Municipio.xlsxNOM_ENTNOM_MUNCVE_ENTCVE_MUN)r3   pathlibr  
read_excelr   iloc)nombre_entidadnombre_municipiorA   r  claves_municipiorO   df_filtrados          r   obtener_claves_estado_munr    s     ~	'	(B R	]n45K !+i"8<L"LM  9%**1-- 	9-.33A66r   c           
      8   dd l }ddlm}  |d      dz  dz  }|j                  |      }| ||d   | k(     }|||d   |k(     }ddd	d
dddt	        d      g}g d}|j                  |d   ||d      |d<   |ddg   }|j                  dd      d   j                         j                         }	g d}|	|	d   j                  |         }	|	j                  d      j                  |      j                         }	ddg|	_        |d   j                         }
|	d   j                  d      |	d<   |d   j                         j                         }|d   j                         j!                         }||z  dz  |	d<   | |d}n|d}nd}|	j#                  |dd       |	S )Nr   r  ..
MacroDatoszpobreza22.csvent	ubica_geoi  i(#  iPF  i0u  iȯ  i inf)EDD+C-CC+zA/BictpcF)binsrs   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   )r3   r  r  read_csvfloatcutgroupbyr   r   isin	set_indexreindexr1   roundr   r   tolistr   )estado	municipiorA   r  csv_pobrezapobreza_datar  rs   ingreso_promingreso_promediopromedio_generalsumavalores
csv_nombres                 r   NSE_CONEVALr3    s   t*|+o=K ;;{+L #L$76$AB #L$=$JK tT5%eED4F ,.66W	 ,2 ,L'(  *@ ABL $++,BU+ST[\aacooq 6F ((89O(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           
      p   ddl }ddl}ddlm}  |d      dz  dz  }|j	                  |      }|j                  ddd	d
ddddd       |j                  d      }|g d   }| |d   j                         j                         vr0t        d|  d|d   j                         j                                ||d   | k(     }|d   j                         j                         }	||	vrt        d| d|  d|	       ||d   |k(     }||d   j                  |         }|j                  d| d|  ddd        |S )!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)r1   inplacer   )NOMBRE ENTIDADNOMBRE MUNICIPIOzNOMBRE LOCALIDADAGEBr5  r  r  r  r  r  r  zNIVEL PREDOMINANTEr8  zEl estado 'u=   ' no está en la base de datos. Los estados disponibles son: r9  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   )r3   r   r  r  r	  renamer   uniquer(  r   r$  r   )
r)  r*  zona_total_estudiorA   r   r  nse_amai	data_amaidata_amai_zona_estudiomunicipios_disponibless
             r   nivel_socioeconomico_AMAIrD  H  s   "  DzL(+CCH h'I 8< &*  + Q'I ' (   Y/0779@@BB;vh.k%&67>>@GGIJL M 	M 44JK[4\`f4fg 44FGNNPWWY..>)4MfX V--C,DF G 	G 44JK]4^bk4kl 44J64R4W4WXj4kl !!$PQZP[[\]c\ddh"iqv  BN!  O!!r   r)  r*  	localidadc                    ddl }ddlm}  |d      }|j                  |      }|d   j	                  t
              |d<   |d   j
                  j                  dd      |d<   |d   j
                  j                  dd      |d	<   |d   j
                  j                  dd
      |d<   |d   j
                  j                  d
d      |d<   |d   j
                  j                  dd      |d<   g d}|j                  D cg c]	  }||vs| }	}|||	z      }||d   | k(  |d	   |k(  z  |d   |k(  z     }
d }|
d   j                  |      |
d<   g d}|
|   }
d|  d| d| d}|
j                  |d       |
S c c}w )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)rG  rH  rJ  rL  rM  c                    | j                  d      s| dk(  ry| j                  d      s| dk(  ry| j                  d      ry| d	v ry| j                  d
      s| dk(  ry| j                  d      s| j                  d      ry| dv ry| j                  d      s"| j                  d      s| j                  d      ry| dv ry| j                  d      s| dk(  ry| j                  d      s| dk(  ry| dv ry| dk(  ry| d v ry!y")#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_gastoz1gastohogar_zona_estudio.<locals>.clasificar_gasto  s+   C EVOc"evoc"ffc"evoc"e&6&6s&;  G  Gc"e&6&6s&;u?O?OPS?T  O  Oc"evo&c"evo    "f_ >>,r   r     Clasificación gasto)rG  rH  rJ  rL  rM  r  r  
tipo_gasto
forma_pag1
forma_pag2
forma_pag3
lugar_comp
frecuenciacantidadgastogastohogar_r<  r   Fr7  )
r3   r  r  r   astypestrslicer1   applyr   )r)  r*  rE  rA   r  gastohogar_path
gastohogarcolsr   
cols_extragastohogar_filtrador  columnasnombre_archivos                 r   gastohogar_zona_estudior    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#s$#!3JGD:-.J %j&:f&D&0&=&J&L&0&=&J&L M
@ 3Fg2N2T2TUe2f./OH .h7 #6(!I;a	{$GN ~U; q Hs   ;	E4E4)rn   )N)NN)matplotlib.pyplotpyplotpltosr;   r   plotly.expressexpressr   API_KEYr   rP   rk   r   r   r   r   r  r3  rD  r  r   r   r   <module>r     s|      	    4"IX3inH!^RjgT/d7:FRO"d]C ]C ]C ]r   