- Especificación del problema
- Diagrama general simplificado de la solución
- Diagramas de los procesos de la solucion
- Versiones
- Módulos
- Archivos
- Contenedores
- Archivos de despliege para Kubernetes
Desarrollar un pipeline de análisis de datos utilizando los datos abiertos de la Ciudad de México correspondientes a la ubicación de las unidades del metrobús durante la última hora para obtener un histórico de la posición en la que se encuentra cada unidad que pueda ser consultado mediante un API Rest (o Graphql) filtrando por unidad o por alcaldía.
Diagrama general simplificado de la solución
Diagrama de proceso de consulta de datos abiertos y registro de información
Diagrama de proceso de consulta via API
- Python: 3.7.8
- MySQL: 8.0.20
- Docker: 19.03.8
- Kubernetes
- Major:"1"
- Minor:"18"
Contiene la especificación de los objetos que mapean las tablas usando el ORM SQLAlchemy
El script de la base de datos puede ser consultado aquí, el cual genera el siguiente diagrama:
Diagrama de base de datos
Este módulo recupera la información del API pública "limite de las alcaldias" y realiza el guardado en la base de datos de la aplicación.
Determina a que alcaldia pertenece cada ubicacion obtenida de API pública "Ubicación de las unidades del Metrobús" utilizando Matlibplot y Numpy, posteriormente registra la información en la base de datos.
Define el Schema del API Graphql utilizando Graphene y resuelve cada petición
A continuación se presenta el Schema utilizado:
type Unit{
id: Int
label: String
vehicleId: String
}
type TownHall{
id: Int
name: String
}
type UnitLocation{
id: Int
latitude: Float
longitude: Float
unit: Unit
townHall: TownHall
date: DateTime
}
scalar DateTime
type Query{
"""
Obtain a list of units that have been within a town hall
"""
availableUnits: [Unit]
"""
Get the history of locations/dates of a unit
"""
unitLocationHistory(
unitId: Int!
): [UnitLocation]
"""
Get a list of available town halls
"""
availableTownHalls: [TownHall]
"""
Get all the units that were in a town hall
"""
unitsInTownHall(
townHallId: Int!
): [Unit]
}
schema{
query: Query
}
Contiene los test unitarios.
- api.py: Inicia un servidor que expone el endpoint /api que corresponde a la API Graphql
- unit_location_sync.py: Inicia el proceso de guardar la informacion de las alcaldias si no existe (ver: Town hall sync), despues guarda la información de la ubicacion de las unidades del metrobus(ver:Unit location sync)
- requirements.api.py: Dependencias del contenedor API
- requirements.cron.py: Dependencias del contendor Cron
- Dockerfile.api: Dockerfile para el contenedor API
- Dockerfile.cron: Dockerfile para el contenedor Cron
- Dockerfile.database: Dockerfile para el contenedor Database
Imagen base utilizada: python:3.7.8-slim
Construccion:
docker build -t krabbit1993/metrobus_api:1.0.2 -f Dockerfile.api .
Imagen base utilizada: mysql:8.0.20
Construccion:
docker build -t krabbit1993/metrobus_cron:1.0.2 -f Dockerfile.cron .
Imagen base utilizada: python:3.7.8-slim
Construccion:
docker build -t krabbit1993/metrobus_database:1.0.0 -f Dockerfile.database .
- /kubeconfig/01-database-pv.yaml: Volumen persistente para la base de datos.
- /kubeconfig/02-database-pvc.yaml: Claims para el volumen persistente.
- /kubeconfig/03-database-secret.yaml: Credenciales para la base de datos.
- /kubeconfig/04-database-rc.yaml: Replication Controller de la base de datos
- /kubeconfig/05-database-svc.yaml: Servicio para exponer la base de datos en la red del cluster
- /kubeconfig/06-cron-rc.yaml: Replication Controller para el contenedor del cron.
- /kubeconfig/07-api-rc.yaml: Replication Controller para el contenedor del api.
- /kubeconfig/08-api-lb.yaml: Load Balancer para exponer el API.