ENOE — Encuesta Nacional de Ocupación y Empleo¶
Acceso programático al dataset trimestral del INEGI sobre el mercado laboral mexicano (2005T1–2025T1): ~101.5 M microdatos en cinco tablas, 13 indicadores agregados nacionales y por entidad, distribuciones por sector económico y por posición en la ocupación.
→ Para uso narrado, ver Tutorial ENOE.
Namespace¶
datos_mexico.endpoints.enoe.EnoeNamespace ¶
Bases: BaseNamespace
Endpoints del dataset ENOE (Encuesta Nacional de Ocupación y Empleo).
La ENOE es la fuente oficial trimestral del INEGI sobre el mercado laboral mexicano. El observatorio expone tres familias de endpoints:
- Catálogos y metadata (5):
health,metadata,indicadores,entidades,etapas. - Indicadores agregados (5): series y snapshots nacionales y por entidad, ranking por indicador.
- Distribuciones (4): ocupados por sector económico y por posición en la ocupación, snapshot y serie.
- Microdatos (3):
microdatos_schema,microdatos_count,microdatos_iter(sync generator) ymicrodatos_to_pandas(helper opcional que requiere pandas instalado).
Cobertura: 2005T1-2025T1 (80 trimestres, gap documental en 2020T2),
nacional + 32 entidades federativas, ~101.5M microdatos en cinco
tablas (viv, hog, sdem, coe1, coe2), 13 indicadores
agregados y 76 mil agregados.
Examples:
Top 5 estados con mayor desempleo en el trimestre más reciente:
>>> from datos_mexico import DatosMexico
>>> with DatosMexico() as client:
... r = client.enoe.ranking(
... periodo="2025T1",
... indicador="tasa_desocupacion",
... limit=5,
... )
... for e in r.ranking:
... print(f"{e.rank}. {e.entidad_nombre}: {e.valor:.2f}%")
1. Tabasco: 4.97%
2. Coahuila de Zaragoza: 3.56%
3. Durango: 3.46%
4. Ciudad de México: 3.45%
5. Tamaulipas: 3.37%
Notes
El observatorio mantiene un dominio operativo uniforme de
15 años o más en toda la serie (re-cálculo en la etapa
clásica pre-2020T1 que originalmente publicaba 14+). El cambio de
marco muestral en 2020T3 y la redefinición del TCCO en 2020T1
están documentados como caveats tipados (slug cambio_marco_2020T3,
redefinicion_tcco_2020T1) en cada response que los toque.
See Also
Documentación INEGI: https://www.inegi.org.mx/programas/enoe/15ymas/
health ¶
Estado del dataset ENOE: último periodo, conteos, cobertura.
Endpoint: GET /api/v1/enoe/health
metadata ¶
Metadata completa del dataset: fuente, tablas y caveats.
Endpoint: GET /api/v1/enoe/metadata
indicadores ¶
Catálogo de los 13 indicadores agregados disponibles.
Endpoint: GET /api/v1/enoe/catalogos/indicadores
Returns:
| Type | Description |
|---|---|
IndicadoresResponse
|
Response con |
IndicadoresResponse
|
unidad, fórmula, caveat aplicable). |
entidades ¶
Catálogo de las 32 entidades federativas con clave INEGI.
Endpoint: GET /api/v1/enoe/catalogos/entidades
etapas ¶
Catálogo de etapas metodológicas (clasica, etoe_telefonica, enoe_n).
Endpoint: GET /api/v1/enoe/catalogos/etapas-metodologicas
serie_nacional ¶
serie_nacional(
*,
indicador: str,
desde: str | None = None,
hasta: str | None = None,
etapa: EtapaSlug | None = None,
) -> SerieNacionalResponse
Serie temporal nacional de un indicador.
Endpoint: GET /api/v1/enoe/indicadores/nacional/serie
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
indicador
|
str
|
Slug del indicador (ej. |
required |
desde
|
str | None
|
Periodo inicial inclusivo en formato |
None
|
hasta
|
str | None
|
Periodo final inclusivo. |
None
|
etapa
|
EtapaSlug | None
|
Filtra por etapa metodológica. |
None
|
Raises:
| Type | Description |
|---|---|
NotFoundError
|
Si el indicador no existe en el catálogo. |
snapshot_nacional ¶
Snapshot de los 13 indicadores nacionales en un periodo.
Endpoint: GET /api/v1/enoe/indicadores/nacional/snapshot
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
periodo
|
str
|
Trimestre en formato |
required |
serie_entidad ¶
serie_entidad(
*,
indicador: str,
entidad_clave: str,
desde: str | None = None,
hasta: str | None = None,
etapa: EtapaSlug | None = None,
) -> SerieEntidadResponse
Serie temporal por entidad federativa para un indicador.
Endpoint: GET /api/v1/enoe/indicadores/entidad/serie
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
indicador
|
str
|
Slug del indicador. |
required |
entidad_clave
|
str
|
Clave INEGI de 2 dígitos (ej. |
required |
desde
|
str | None
|
Periodo inicial inclusivo. |
None
|
hasta
|
str | None
|
Periodo final inclusivo. |
None
|
etapa
|
EtapaSlug | None
|
Filtra por etapa metodológica. |
None
|
snapshot_entidad ¶
Snapshot de un indicador para las 32 entidades en un periodo.
Endpoint: GET /api/v1/enoe/indicadores/entidad/snapshot
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
periodo
|
str
|
Trimestre |
required |
indicador
|
str
|
Slug del indicador. |
required |
ranking ¶
ranking(
*,
periodo: str,
indicador: str,
orden: OrdenRanking = "desc",
limit: int = 5,
) -> RankingResponse
Ranking de entidades por un indicador en un periodo.
Endpoint: GET /api/v1/enoe/indicadores/entidad/ranking
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
periodo
|
str
|
Trimestre |
required |
indicador
|
str
|
Slug del indicador. |
required |
orden
|
OrdenRanking
|
|
'desc'
|
limit
|
int
|
Cantidad de entidades a devolver (1..32). |
5
|
distribucion_sectorial_snapshot ¶
distribucion_sectorial_snapshot(
*,
periodo: str,
nivel: NivelGeografico = "nacional",
entidad_clave: str | None = None,
) -> DistribucionSectorialSnapshot
Composición de ocupados por sector económico (12 sectores SCIAN).
Endpoint: GET /api/v1/enoe/ocupados/por-sector/snapshot
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
periodo
|
str
|
Trimestre |
required |
nivel
|
NivelGeografico
|
|
'nacional'
|
entidad_clave
|
str | None
|
Obligatorio si |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Si |
distribucion_sectorial_serie ¶
distribucion_sectorial_serie(
*,
sector_clave: str,
nivel: NivelGeografico = "nacional",
entidad_clave: str | None = None,
desde: str | None = None,
hasta: str | None = None,
) -> DistribucionSectorialSerie
Serie temporal de un sector económico.
Endpoint: GET /api/v1/enoe/ocupados/por-sector/serie
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sector_clave
|
str
|
Clave del sector (ej. |
required |
nivel
|
NivelGeografico
|
|
'nacional'
|
entidad_clave
|
str | None
|
Obligatorio si |
None
|
desde
|
str | None
|
Periodo inicial |
None
|
hasta
|
str | None
|
Periodo final |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Si |
distribucion_posicion_snapshot ¶
distribucion_posicion_snapshot(
*,
periodo: str,
nivel: NivelGeografico = "nacional",
entidad_clave: str | None = None,
) -> DistribucionPosicionSnapshot
Composición de ocupados por posición en la ocupación (4 categorías).
Endpoint: GET /api/v1/enoe/ocupados/por-posicion/snapshot
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
periodo
|
str
|
Trimestre |
required |
nivel
|
NivelGeografico
|
|
'nacional'
|
entidad_clave
|
str | None
|
Obligatorio si |
None
|
distribucion_posicion_serie ¶
distribucion_posicion_serie(
*,
pos_clave: int,
nivel: NivelGeografico = "nacional",
entidad_clave: str | None = None,
desde: str | None = None,
hasta: str | None = None,
) -> DistribucionPosicionSerie
Serie temporal de una posición en la ocupación.
Endpoint: GET /api/v1/enoe/ocupados/por-posicion/serie
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pos_clave
|
int
|
Clave de la posición (1=subordinados, 2=empleadores, 3=cuenta propia, 4=no remunerados). |
required |
nivel
|
NivelGeografico
|
|
'nacional'
|
entidad_clave
|
str | None
|
Obligatorio si |
None
|
desde
|
str | None
|
Periodo inicial |
None
|
hasta
|
str | None
|
Periodo final |
None
|
microdatos_schema ¶
Schema (columnas y descripciones) de una tabla de microdatos.
Endpoint: GET /api/v1/enoe/microdatos/{tabla}/schema
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tabla
|
TablaMicrodatos
|
|
required |
microdatos_count ¶
microdatos_count(
tabla: TablaMicrodatos,
*,
periodo: str,
entidad_clave: str | None = None,
sex: int | None = None,
eda_min: int | None = None,
eda_max: int | None = None,
) -> MicrodatosCount
Conteo de microdatos con filtros sin descargar las filas.
Endpoint: GET /api/v1/enoe/microdatos/{tabla}/count
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tabla
|
TablaMicrodatos
|
|
required |
periodo
|
str
|
Trimestre |
required |
entidad_clave
|
str | None
|
Clave INEGI de 2 dígitos. |
None
|
sex
|
int | None
|
Sexo INEGI ( |
None
|
eda_min
|
int | None
|
Edad mínima inclusiva; aplica a sdem/coe1/coe2. |
None
|
eda_max
|
int | None
|
Edad máxima inclusiva; aplica a sdem/coe1/coe2. |
None
|
microdatos_page ¶
microdatos_page(
tabla: TablaMicrodatos,
*,
periodo: str,
page: int = 1,
per_page: int = 1000,
entidad_clave: str | None = None,
sex: int | None = None,
eda_min: int | None = None,
eda_max: int | None = None,
include_extras: bool = True,
) -> MicrodatosListResponse
Una página de microdatos con paginación explícita.
Endpoint: GET /api/v1/enoe/microdatos/{tabla}/list
Para iterar sobre todas las páginas en orden, usar
:meth:microdatos_iter. Para volcar todo a un DataFrame, usar
:meth:microdatos_to_pandas.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tabla
|
TablaMicrodatos
|
Tabla de microdatos. |
required |
periodo
|
str
|
Trimestre |
required |
page
|
int
|
Número de página (1-indexed). |
1
|
per_page
|
int
|
Filas por página (1..1000). |
1000
|
entidad_clave
|
str | None
|
Filtro opcional por entidad. |
None
|
sex
|
int | None
|
Filtro opcional por sexo. |
None
|
eda_min
|
int | None
|
Edad mínima. |
None
|
eda_max
|
int | None
|
Edad máxima. |
None
|
include_extras
|
bool
|
Si |
True
|
microdatos_iter ¶
microdatos_iter(
tabla: TablaMicrodatos,
*,
periodo: str,
entidad_clave: str | None = None,
sex: int | None = None,
eda_min: int | None = None,
eda_max: int | None = None,
per_page: int = 1000,
include_extras: bool = True,
limit: int | None = None,
) -> Iterator[dict[str, Any]]
Iterador síncrono sobre microdatos paginados.
Hace requests pagina-a-pagina contra
/api/v1/enoe/microdatos/{tabla}/list y produce un dict por
fila. La iteración termina cuando la API marca has_next=False o
cuando se alcanza limit (si se especifica).
Examples:
Iterar todos los microdatos sociodemográficos de CDMX en 2025T1:
>>> with DatosMexico() as client:
... for row in client.enoe.microdatos_iter(
... "sdem", periodo="2025T1", entidad_clave="09",
... ):
... # procesar row sin cargar todo a memoria
... ...
Acotar a una muestra rápida (los primeros 100 registros):
>>> with DatosMexico() as client:
... filas = list(
... client.enoe.microdatos_iter(
... "sdem", periodo="2025T1",
... entidad_clave="09", limit=100,
... )
... )
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tabla
|
TablaMicrodatos
|
Tabla de microdatos. |
required |
periodo
|
str
|
Trimestre |
required |
entidad_clave
|
str | None
|
Filtro opcional por entidad. |
None
|
sex
|
int | None
|
Filtro opcional por sexo (1=hombre, 2=mujer). |
None
|
eda_min
|
int | None
|
Edad mínima inclusiva. |
None
|
eda_max
|
int | None
|
Edad máxima inclusiva. |
None
|
per_page
|
int
|
Filas por request (1..1000). Default 1000 minimiza el número de requests. |
1000
|
include_extras
|
bool
|
Si |
True
|
limit
|
int | None
|
Máximo de filas a producir (atajo para muestras).
|
None
|
Yields:
| Type | Description |
|---|---|
dict[str, Any]
|
|
dict[str, Any]
|
la tabla. |
microdatos_to_pandas ¶
microdatos_to_pandas(
tabla: TablaMicrodatos,
*,
periodo: str,
entidad_clave: str | None = None,
sex: int | None = None,
eda_min: int | None = None,
eda_max: int | None = None,
per_page: int = 1000,
include_extras: bool = True,
limit: int | None = None,
) -> pd.DataFrame
Descarga microdatos a un pandas.DataFrame.
Construye internamente el iterador (:meth:microdatos_iter) y lo
materializa en un único DataFrame. Para volúmenes grandes (>100k
filas) considerar usar :meth:microdatos_iter y procesar por
chunks.
Examples:
>>> with DatosMexico() as client:
... df = client.enoe.microdatos_to_pandas(
... "sdem", periodo="2025T1",
... entidad_clave="09", limit=1000,
... )
... df["eda"].mean()
... # 41.5
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tabla
|
TablaMicrodatos
|
Tabla de microdatos. |
required |
periodo
|
str
|
Trimestre |
required |
entidad_clave
|
str | None
|
Filtro opcional por entidad. |
None
|
sex
|
int | None
|
Filtro opcional por sexo. |
None
|
eda_min
|
int | None
|
Edad mínima. |
None
|
eda_max
|
int | None
|
Edad máxima. |
None
|
per_page
|
int
|
Filas por request. |
1000
|
include_extras
|
bool
|
Si |
True
|
limit
|
int | None
|
Máximo de filas a descargar. |
None
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
|
DataFrame
|
un DataFrame vacío. |
Raises:
| Type | Description |
|---|---|
ImportError
|
Si |
Modelos¶
Modelos Pydantic para el dataset ENOE (Encuesta Nacional de Ocupación y Empleo).
Cobertura del observatorio ENOE: ~101.5M microdatos en cinco tablas
(viv, hog, sdem, coe1, coe2) y ~76 mil indicadores
agregados (nacionales y por entidad federativa), entre 2005T1 y 2025T1.
Fuente: INEGI — ENOE 15+_.
.. _ENOE 15+: https://www.inegi.org.mx/programas/enoe/15ymas/
Convenciones (consistentes con CONSAR/ENIGH):
- Indicadores numéricos (valores de tasas, conteos expandidos, participaciones)
llegan como
floatointdesde la API. Los modelos los preservan comofloat/intpuros: para los indicadores ENOE no se hace aritmética monetaria exacta, así queDecimalagregaría fricción sin beneficio. Los conteos expandidos (n_*,total_*) sonint. periodoes siemprestrcon formatoYYYYTQ(ej."2025T1").entidad_clavees siemprestrcon dos dígitos (ej."09"para CDMX); seguir el contrato canónico del observatorio post-Sub-fase 3.10c.etapaesstr | Nonecon los slugs"clasica","etoe_telefonica", o"enoe_n".extra="allow"heredado del base config: si la API agrega campos nuevos, los modelos no rompen.
EnoeHealth ¶
EnoeTablaInfo ¶
CaveatMetodologico ¶
Bases: DatosMexicoModel
Caveat metodológico tipado.
Cada caveat documenta una salvedad publicada por el observatorio: cambio de marco muestral en 2020T3, redefinición del TCCO post-2020T1, re-cálculo del dominio 15+ en la etapa clásica, gap documental en 2020T2, etc.
EnoeMetadata ¶
IndicadorRef ¶
IndicadoresResponse ¶
EntidadRef ¶
EntidadesResponse ¶
EtapaRef ¶
EtapasResponse ¶
CoberturaTemporal ¶
PuntoSerie ¶
SerieNacionalResponse ¶
IndicadorSnapshotItem ¶
SnapshotNacionalResponse ¶
SerieEntidadResponse ¶
EntidadSnapshotRow ¶
SnapshotEntidadResponse ¶
RankingEntidadRow ¶
RankingResponse ¶
DistribucionSectorialRow ¶
DistribucionSectorialSnapshot ¶
DistribucionSectorialSerie ¶
DistribucionPosicionRow ¶
DistribucionPosicionSnapshot ¶
DistribucionPosicionSerie ¶
MicrodatoColumna ¶
MicrodatosSchema ¶
MicrodatosCount ¶
MicrodatosPagination ¶
MicrodatosListResponse ¶
Bases: DatosMexicoModel
Respuesta de GET /api/v1/enoe/microdatos/{tabla}/list.
data se preserva como list[dict] (sin tipar cada fila) porque
cada tabla tiene un schema diferente y los nombres de columna son
estables solo dentro de una tabla. Para análisis tipado, consultar el
schema con :meth:EnoeNamespace.microdatos_schema y trabajar sobre el
DataFrame de :meth:EnoeNamespace.microdatos_to_pandas.