Sesión 3 · viernes 2 de octubre de 2026
Herramientas para el Nowcasting del Crecimiento del PIB · Bolivia
| cómo | ejemplo en este taller | |
|---|---|---|
| API | se piden datos a un servicio que responde en formato estructurado | FRED (metales, tasas de EE.UU.) |
| Archivo directo | se descarga un .xlsx / .csv desde una URL fija |
EIA (Brent), US Census (comercio) |
| Página web | se lee el HTML, se encuentra el enlace o la tabla y se descarga | INE, BCB |
Preferir en ese orden: una API es estable y documentada; una página web cambia sin aviso.
El PIB trimestral del INE, de la página al CSV
www.ine.gob.bo/referencia2017/pib_trimestral.html
.xlsx: se reconoce por su texto| código | significa |
|---|---|
200 |
todo bien |
403 |
el servidor rechaza al cliente: probar otro user-agent |
404 |
la dirección ya no existe |
500, 503 |
falla del servidor: esperar y reintentar una vez |
[ 1] BOLIVIA: PRODUCTO INTERNO BRUTO POR GRUPOS DE ACTIVIDAD ECONÓMICA ...
[ 7] BOLIVIA: MEDIDAS DE VOLUMEN ENCADENADAS DEL PRODUCTO INTERNO BRUTO ...
[ 8] BOLIVIA: INDICES DE VOLUMEN ENCADENADOS DEL PRODUCTO INTERNO BRUTO ...
[ 9] BOLIVIA: VARIACIÓN DE LAS MEDIDAS DE VOLUMEN ENCADENADAS DEL PRODUCTO ...
[11] BOLIVIA: CONTRIBUCIÓN A LA VARIACIÓN DE LAS MEDIDAS DE VOLUMEN ...Siete títulos contienen «volumen encadenado» y «producto». Buscar por palabras clave no basta.
import unicodedata
def clave(s):
"""Sin tildes, en minúsculas y con un solo espacio entre palabras."""
s = unicodedata.normalize("NFKD", s).encode("ascii", "ignore").decode()
return " ".join(s.lower().split())
buscado = clave("BOLIVIA: MEDIDAS DE VOLUMEN ENCADENADAS DEL PRODUCTO INTERNO BRUTO POR GRUPOS")
hits = [href for texto, href in enlaces if clave(texto).startswith(buscado)]
assert len(hits) == 1, "el INE cambió el título: revisar la lista"El título del PIB nominal tiene dos espacios seguidos: "BRUTO POR". Una comparación literal no lo encuentra; clave() sí.
header=None: pandas no adivina encabezados; se ve la hoja tal como esROMANO = {"I": 3, "II": 6, "III": 9, "IV": 12} # último mes del trimestre
etiq = raw[1].astype(str).str.strip()
fila = etiq[etiq.str.startswith("ACTIVIDAD")].index[0] # fila 10 de Excel
anio = raw.iloc[fila, 2:].ffill().astype(str).str[:4] # '2025 (p)' -> '2025'
mes = raw.iloc[fila + 1, 2:].astype(str).str.strip().map(ROMANO) # 'I ' -> 3
fechas = pd.to_datetime(anio + "-" + mes.astype(str) + "-01")
valores = raw.loc[etiq.str.startswith("PRODUCTO INTERNO"), 2:].iloc[0]
pib = pd.Series(valores.astype(float).values, index=fechas, name="gdp")Si el deflactor baja, se bajaron los cuadros al revés.
| fuente | 3 · encontrar | 5 · ordenar |
|---|---|---|
| INE, otros 30 cuadros | URL guardada en una tabla de fuentes | tres diseños de hoja distintos |
| BCB, boletín semanal | el nombre cambia cada semana: Semanal 38_2026.xlsx |
series por nombre; fechas repartidas en dos filas |
| EIA, Brent | el único enlace .xls de la página |
la hoja cuyo nombre dice «data»; dos filas de título |
| Baker Hughes, taladros | URL fija, que algún día cambia | filtrar country == "BOLIVIA" |
Si la página muestra una tabla HTML (<table>), una línea basta:
La página del PIB no tiene ninguna <table>: los datos están en los Excel. Primero mirar, después elegir la herramienta.
403 Forbiddentimeout y un reintentoNunca sobrescribir datos buenos con una descarga parcial. Combinar lo nuevo con el archivo existente antes de guardar.
raw/