Sistema de análisis y gestión de datos de usuarios y sesiones de visualización con arquitectura dual de bases de datos: PostgreSQL para datos relacionales estructurados y MongoDB para almacenamiento de documentos JSON.
- PostgreSQL: Base de datos relacional para datos estructurados con integridad referencial
- MongoDB: Base de datos NoSQL para documentos JSON flexibles
- FastAPI: Framework web moderno para crear APIs RESTful
- Docker: Orquestación de servicios mediante contenedores
Antes de comenzar, asegúrese de tener instalado:
- Docker Desktop
- Visual Studio Code (recomendado)
- Git
git clone https://github.com/JoaquinMO17/Proyectos_Visualizacion
cd Proyectos_Visualizacion# Crear archivo .env con las siguientes variables:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=AbraKada99$
POSTGRES_DB=videoanalysisdb
POSTGRES_HOST=db
POSTGRES_PORT=5432
DATABASE_URL=postgresql://postgres:AbraKada99$@db:5432/videoanalysisdb# Asegurarse de que Docker Desktop esté ejecutándose
docker compose up --builddocker ps
# Deberías ver 3 contenedores:
# - fastapi-app (aplicación)
# - fastapi-db (PostgreSQL)
# - fastapi-mongodb (MongoDB)http://localhost:8000
Descripción: Muestra información general de la API y todos los endpoints disponibles
Respuesta: JSON con estructura de endpoints organizados por base de datos
Ejemplo:
curl http://localhost:8000/Descripción: Documentación interactiva de la API (Swagger UI)
Acceso: Abrir en navegador http://localhost:8000/docs
Descripción: Verifica la conexión con PostgreSQL y muestra conteos de tablas
Respuesta: Estado de conexión y cantidad de registros por tabla
Ejemplo:
curl http://localhost:8000/Descripción: Ejecuta el proceso ETL completo (Extract, Transform, Load)
Función: Extrae datos del CSV, los transforma y los carga en PostgreSQL
Modo: Síncrono (espera hasta completar)
Ejemplo:
curl http://localhost:8000/test-dbDescripción: Ejecuta el proceso ETL en segundo plano
Función: Mismo que /run-etl pero no bloquea la respuesta
Modo: Asíncrono (retorna inmediatamente)
Ejemplo:
curl -X POST http://localhost:8000/run-etl
Descripción: Ejecuta el proceso ETL en segundo plano
Función: Mismo que /run-etl pero no bloquea la respuesta
Modo: Asíncrono (retorna inmediatamente)
Ejemplo:
curl -X GET http://localhost:8000/users
#### `GET /users`
**Descripción**: Lista películas con paginación
**Parámetros**:
- `skip` (int): Número de registros a saltar (default: 0)
- `limit` (int): Cantidad de registros a retornar (default: 10)
**Ejemplo**:
```bash
# Obtener primeros 10 usuarios
curl http://localhost:8000/users
# Obtener 20 usuarios saltando los primeros 10
curl "http://localhost:8000/users?skip=10&limit=20"Descripción: Obtiene los usuarios más activos o recientes
Parámetros:
limit(int): Cantidad de usuarios (1-100, default: 10)
Ejemplo:
# Top 10 usuarios activos
curl http://localhost:8000/api/users/activeDescripción: Busca sesiones de visualización para un usuario específico Parámetros de ruta:
user_id(int): ID del usuario
Ejemplo:
curl http://localhost:8000/api/sessions/statisticsDescripción: Búsqueda avanzada de sesiones con múltiples filtros Par+ametros:
min_duration(int): Duración mínima de la sesión (en segundos)max_duration(int): Duración máxima de la sesión (en segundos)user_country(int): País del usuario
Ejemplo:
# Búsqueda combinada
curl "http://localhost:8000/api/sessions/search?min_duration=600&user_country=US"Descripción: Verifica conexión con MongoDB
Respuesta: Estado, colecciones disponibles y conteo de documentos
Ejemplo:
curl http://localhost:8000/test-mongodbDescripción: Lista contenidos desde MongoDB con ordenamiento
Función: Carga los documentos de 'content.json' Parámetros:
'skip (int):' Documentos a saltar (default: 0)
'limit (int):' Límite de documentos (1-100, default: 10)
'sort_by (str):' Campo para ordenar (default: "title")
'order (str):' "asc" o "desc" (default: "asc")
# Últimos contenidos por año
curl http://localhost:8000/mongo/content?sort_by=year&order=desc
# Ordenar por título ascendente
curl "http://localhost:8000/mongo/content?sort_by=title&order=asc&limit=20"Descripción: Búsqueda flexible en MongoDB
Parámetros:
q(str): Búsqueda general (título, descripción, género)title(str): Filtro por títulodirector(str): Filtro por génerocountry(str): Año de lanzamientomin_year(int): Límite de resultados
Ejemplo:
# Búsqueda general por palabra clave
curl "http://localhost:8000/mongo/search?q=documentary"
# Búsqueda específica
curl "http://localhost:8000/mongo/search?genre=Action&release_year=2020"Descripción: Estadísticas agregadas desde MongoDB (metadata de contenido)
Respuesta:
- Total de contenidos
- Distribución por año de lanzamiento
- Top 10 géneros más frecuentes
Ejemplo:
curl http://localhost:8000/mongo/statsDescripción: Agregaciones complejas de MongoDB Respuesta:
- Distribución de contenidos por duración
- Contenidos por director/creador
- Estadísticas por género
Ejemplo:
curl http://localhost:8000/mongo/aggregationsDescripción: Sincroniza todos los datos de PostgreSQL a MongoDB
Función: Copia información clave de usuarios/sesiones a MongoDB para análisis combinado.
Ejemplo:
curl -X POST http://localhost:8000/mongo/sync# Acceder a PostgreSQL
docker exec -it fastapi-db psql -U postgres -d videoanalysisdb
# Comandos útiles en PostgreSQL:
\dt # Listar tablas (users, viewing_sessions, etc.)
\d users # Describir tabla
SELECT COUNT(*) FROM viewing_sessions; # Contar registros# Acceder a MongoDB
docker exec -it fastapi-mongodb mongosh -u admin -p admin123 --authenticationDatabase admin
# Comandos útiles en MongoDB:
use analysis_db
show collections
db.content.countDocuments()
db.content.findOne()
db.content.find({release_year: 2023}).limit(5)- Extract: Lee archivo CSV (
data/users.csv, data/viewing_sessions.csv) y JSON - Transform:
- Limpia y valida datos
- Normaliza Usuarios y Sesiones para PostgreSQL.
- Prepara Contenidos para MongoDB.
- Load:
- PostgreSQL: Carga incremental de Usuarios y Sesiones.
- MongoDB: Carga de Contenidos y metadata sincronizada.
# 1. Ejecutar ETL para cargar datos en PostgreSQL (Usuarios y Sesiones)
curl -X POST http://localhost:8000/run-etl
# 2. Sincronizar metadata clave a MongoDB y asegurar que content.json esté cargado
curl -X POST http://localhost:8000/mongo/sync
# 3. Verificar datos
curl http://localhost:8000/test-db # PostgreSQL
curl http://localhost:8000/test-mongodb # MongoDB
# 4. Consultar datos
curl http://localhost:8000/api/users/active
curl http://localhost:8000/mongo/stats.
├── app.py # API principal FastAPI
├── database.py # Conexión PostgreSQL
├── mongodb_database.py # Conexión MongoDB
├── models.py # Modelos SQLAlchemy
├── requirements.txt # Dependencias Python
├── docker-compose.yml # Configuración Docker
├── Dockerfile # Imagen Docker
├── .env # Variables de entorno
├── data/
│ ├── users.csv # Datos origen: Usuarios
│ ├── viewing_sessions.csv # Datos origen: Sesiones de visualización
│ ├── content.json # Datos origen: Metadata de contenidos
│ ├── raw/ # JSONs generados
│ └── processed/ # CSVs procesados
└── scripts/
├── etl.py # Pipeline ETL principal
├── extract.py # Extracción de datos
├── transform.py # Transformación
├── validate.py # Validación
├── load.py # Carga PostgreSQL
├── init-mongo.js # Script inicialización MongoDB
└── services/
└── user_service.py # Servicio PostgreSQL (ajustado)
# Iniciar servicios
docker compose up -d
# Ver logs
docker compose logs -f
# Detener servicios
docker compose down
# Limpiar todo (incluye volúmenes)
docker compose down -v
# Reconstruir contenedores
docker compose up --build# Usar curl para pruebas rápidas
curl http://localhost:8000/endpoint
# O usar herramientas como:
# - Postman
# - Thunder Client (VSCode extension)
# - HTTPie: http localhost:8000/endpointProblema: Puerto 5432 o 27017 ya está en uso
Solución: Detener servicios locales o cambiar puertos en docker-compose.yml
Problema: MongoDB no tiene datos
Solución:
- Ejecutar ETL primero:
curl -X POST http://localhost:8000/run-etl - Sincronizar a MongoDB:
curl -X POST http://localhost:8000/mongo/sync
Problema: No se puede conectar a la API
Solución: Verificar que todos los contenedores estén ejecutándose con docker ps
Problema: El proceso ETL falla
Solución: Verificar que los archivos 'users.csv', 'viewing_sessions.csv' y 'content.json' estén en la carpeta 'data/'.
- Isaías De Jesús López Tzec @Iasisa
- Joaquin de Jesús Murguía Ortiz @JoaquinMO17
- Valeria De Los Ángeles Paredes Dzib @valinyourarea
- Damaris Esther Pech Aque @damapech1
- Ana Paula Ramírez Romero @AnaPauR
- Krishna Sandoval Cambranis @Playmaker3334