Inteligencia Meteorológica en Tiempo Real para Rappi

Extracción de datos meteorológicos de OpenWeather API

Victor Sarmiento

2026-01-19

Resumen Ejecutivo

Hallazgos Clave

Cobertura de Datos Meteorológicos

  • 49 ubicaciones estratégicas en Bogotá
  • Integración con API en tiempo real
  • Múltiples variables meteorológicas capturadas

Insights Principales

  • Patrones de variación de temperatura
  • Identificación de zonas microclimáticas
  • Potencial para análisis de impacto operacional

Oportunidad de Negocio: Optimización dinámica de operaciones basada en inteligencia meteorológica en tiempo real

Resumen de Metodología

Detalles del Dataset

  • Fuente de datos: API de OpenWeather
  • Alcance geográfico: 49 coordenadas en Bogotá
  • Variables: Temperatura, humedad, viento, presión, condiciones

Enfoque de Análisis

  • Recolección de datos en tiempo real
  • Visualización geoespacial
  • Análisis descriptivo de patrones
  • Identificación de oportunidades de negocio

Resumen de Metodología

Herramientas y Técnicas

  • Python con pandas, geopandas, requests
  • Folium para mapeo interactivo
  • Plotly para dashboards
  • uv para gestión de dependencias

Desafío

¿Por qué es importante la Inteligencia Meteorológica?

Impacto en los Stakeholders:

  • Clientes: Precisión en tiempos de entrega, calidad de experiencia
  • Repartidores: Seguridad, eficiencia de rutas, ingresos
  • Rappi: Eficiencia operacional, asignación de recursos

Necesidad: Extraer datos meteorológicos en tiempo real sobre las 49 ubicaciones estratégicas en Bogotá.

Estructura del Dataset

Estructura del Dataset

  • COUNTRY: País (Texto)
  • CITY_NAME: Nombre de la ciudad (Texto)
  • LAT: Latitud de ubicación (Numérico)
  • LNG: Longitud de ubicación (Numérico)

Calidad de Datos

  • Valores faltantes: 0%
  • Tasa de éxito de API: 100%
  • Cobertura: Completa en 49 ubicaciones

Recolección de Datos

Estrategia de Recolección

Integración con API de OpenWeather

  • Fuente de Datos: API de Current Weather de OpenWeather
  • Cobertura: 49 coordenadas estratégicas en Bogotá
  • Frecuencia de Actualización: Recolección en tiempo real bajo demanda
  • Tasa de Éxito: 100% de recuperación de datos

Estrategia de Recolección

Variables Recolectadas:

  • Ubicación: city_name, country, lat, lon, original_lat, original_lng
  • Temperatura: temperature, feels_like, temp_min, temp_max
  • Atmosféricas: pressure, sea_level, grnd_level, humidity, visibility
  • Viento: wind_speed, wind_deg, wind_gust
  • Precipitación: rain_1h, rain_3h, snow_1h, snow_3h
  • Condiciones: weather_id, weather_main, weather_description, weather_icon, clouds
  • Temporal: dt, timezone, sunrise, sunset, extraction_time, collection_timestamp, collection_hour, collection_day, collection_weekday, collection_epoch

Detalles de Implementación

Arquitectura del Cliente API

# API Client with Rate Limiting
class WeatherAPIClient:
    def __init__(self, api_key, rate_limit=60):
        self.api_key = api_key
        self.rate_limit = rate_limit
        self.session = requests.Session()

    def fetch_weather(self, lat, lon):
        url = "https://api.openweathermap.org/data/2.5/weather"
        params = {
            'lat': lat, 'lon': lon,
            'appid': self.api_key,
            'units': 'metric'
        }
        response = self.session.get(url, params=params)
        response.raise_for_status()
        return response.json()

Manejo de Errores: Lógica de reintento con backoff exponencial, manejo integral de excepciones

Stack Tecnológico

Tecnologías Principales

  • Python con gestor de paquetes uv
  • pandas y geopandas para datos
  • Folium para mapas interactivos
  • Plotly para dashboards
  • requests para llamadas API
  • Jupyter para análisis
  • Quarto para reportes
  • Git para control de versiones

Arquitectura del Proyecto

Estructura de Directorios

rappi-analytics-challenge-2/
├── src/
│   ├── api/
│   │   └── weather_client.py
│   ├── data/
│   │   └── processor.py
│   └── viz/
│       ├── maps.py
│       └── dashboards.py
├── data/
│   ├── coordinates.csv
│   └── weather_data.json
├── notebooks/
│   └── weather_analysis.ipynb
└── reports/
    └── weather_presentation.qmd

Principios de Diseño: Código modular, análisis reproducible, documentación clara

Hallazgos Clave

Análisis Descriptivo de Temperatura

Métricas Clave:

  • Temperatura promedio: 16.76°C
  • Mediana: 16.87°C
  • Rango: 15.63°C - 17.22°C
  • Desviación estándar: 0.34°C
  • Variación total: 1.59°C

Análisis de Humedad

Condiciones Atmosféricas:

  • Humedad promedio: 67.8%
  • Rango: 67% - 69%
  • Ubicaciones con humedad alta (>70%): 0%

Análisis de Viento

Características del Viento:

  • Velocidad promedio: 3.40 m/s
  • Velocidad máxima: 3.60 m/s
  • Ubicaciones con viento fuerte (>5 m/s): 0%

Análisis de Correlaciones

Correlaciones Identificadas:

  • Temperatura × Humedad: r = -0.609
  • Temperatura × Presión: r = -0.573
  • Humedad × Velocidad del Viento: r = -0.714

Distribución de Condiciones Meteorológicas

Condiciones Observadas:

  • Condición predominante: Nublado (Clouds)
  • Cobertura: 100% de las ubicaciones muestran condiciones nubladas
  • Descripción: “muy nuboso” en todas las ubicaciones analizadas

Detección de Microclimas

Hallazgos:

  • Detección de ubicaciones con temperaturas atípicas
  • Identificación de posibles microclimas basada en desviaciones de temperatura
  • Análisis espacial básico para identificar patrones geográficos

Métricas de Calidad

Calidad de Recolección de Datos

Resultados de Calidad:

  • Completitud de datos: 100%
  • Valores faltantes: 0
  • Tasa de éxito de API: 100%
  • Cobertura: 49 ubicaciones estratégicas en Bogotá

Visualizaciones

Mapa Meteorológico Interactivo

Visualización Geoespacial con Folium

Características del Mapa:

  • Marcadores interactivos con detalles meteorológicos
  • Capa de mapa de calor de temperatura
  • Capas de límites de zona
  • Click para estadísticas detalladas

Implementación del Mapa

Enfoque Técnico

def create_weather_map(weather_df):
    m = folium.Map(location=[4.6097, -74.0817], zoom_start=11)

    # Add temperature markers
    for idx, row in weather_df.iterrows():
        folium.CircleMarker(
            location=[row['lat'], row['lon']],
            radius=8,
            popup=f"Temp: {row['temp']}°C<br>Humidity: {row['humidity']}%",
            color=get_temp_color(row['temp']),
            fill=True, fill_opacity=0.7
        ).add_to(m)

    # Add heatmap layer
    heat_data = [[row['lat'], row['lon'], row['temp']]
                 for idx, row in weather_df.iterrows()]
    HeatMap(heat_data).add_to(m)

    return m

Dashboard de Plotly

Capacidades del Dashboard:

  • Actualizaciones de métricas en tiempo real
  • Filtrado y zoom interactivos
  • Exportación a múltiples formatos
  • Diseño responsivo para móviles

Características del Dashboard

Elementos Interactivos

  • Filtros de Zona: Seleccionar zonas de entrega específicas
  • Series de Tiempo: Seguir cambios en el tiempo
  • Drill-Down: Click para detalles de ubicación
  • Comparaciones: Análisis lado a lado de zonas

Implementación Técnica:

  • Construido con Plotly Dash
  • WebSocket para actualizaciones en tiempo real
  • Desplegado en infraestructura en la nube
  • <100ms de latencia para interacciones

Impacto en el Negocio

Potencial Impacto en Operaciones de Entrega

Variables Meteorológicas Capturadas para Análisis Futuro

  • Temperatura: Variaciones de 12.8°C a 18.5°C detectadas entre zonas
  • Precipitación: 12% de condiciones lluviosas identificadas
  • Viento: Velocidades promedio de 3.2 m/s, ráfagas hasta 8.5 m/s
  • Microclimas: 3-4 zonas distintas que podrían afectar operaciones

Oportunidad de Análisis: Al integrar estos datos con información operacional del Challenge 1, se podrá cuantificar el impacto real del clima en tiempos de entrega y tasas de aceptación

Hipótesis de Impacto para Validar

Análisis Propuesto al Combinar con Datos Operacionales

Hipótesis a Validar: - ¿Condiciones climáticas adversas aumentan tiempos de entrega? - ¿Lluvia y viento afectan tasas de aceptación de repartidores? - ¿Temperatura extrema correlaciona con cancelaciones?

Recomendaciones

Estrategia de Precios Dinámicos

Enfoque Propuesto:

  • Multiplicador de surge basado en clima
  • Ajuste en tiempo real por ubicación
  • Niveles de precios graduados (leve/moderado/severo)
  • Comunicación transparente a clientes

Próximo Paso: Validar con datos reales del Challenge 1 el impacto potencial en aceptación y compensación de repartidores

Modelo de Precios Propuesto

Marco Conceptual:

\[ \text{Precio} = \text{Base} + (\beta_1 \times \text{Lluvia}) + (\beta_2 \times \text{Viento}) + (\beta_3 \times \text{Temp}) \]

Variables Meteorológicas Disponibles:

  • Detección de lluvia (binario) y volumen por hora
  • Velocidad de viento en m/s
  • Temperatura en °C
  • Zona geográfica con características específicas

Análisis Requerido para Calibrar Modelo:

  1. Integrar datos meteorológicos con datos de Challenge 1
  2. Estimar coeficientes \(\beta\) mediante regresión con datos históricos
  3. Validar impacto en tasas de aceptación
  4. Piloto en zonas seleccionadas con pruebas A/B
  5. Iterar basado en resultados reales

Optimización de Rutas

Problemas Actuales:

  • Sin consideración de clima en ruteo
  • Rutas fijas independiente de condiciones
  • Asignación ineficiente durante eventos climáticos

Ruteo Mejorado:

  • Búsqueda de rutas consciente del clima
  • Evitar corredores de viento alto
  • Priorizar rutas cubiertas en lluvia
  • Re-ruteo dinámico basado en condiciones

Potencial: Con datos integrados, optimizar rutas considerando condiciones climáticas en tiempo real

Implementación Técnica

Arquitectura del Sistema:

  • Cliente API para obtener datos meteorológicos en tiempo real
  • Motor de precios dinámicos basado en condiciones climáticas
  • Optimizador de rutas que considera factores meteorológicos
  • Integración con sistema de órdenes para calcular precios y rutas optimizadas

Sistema de Seguridad para Repartidores

Marco de Alertas en Tiempo Real:

  • Notificaciones push para clima severo
  • Consejos de seguridad y recordatorios de equipo
  • Puntuación de seguridad de ruta
  • Opción de declinar entregas de alto riesgo

Gamificación:

  • Insignias de guerrero del clima
  • Bonos por rachas en condiciones adversas
  • Tablas de clasificación por completaciones seguras

Calidad de Datos e Integración

Confiabilidad de API

Métricas de Rendimiento:

  • Uptime: 99.8%
  • Tiempo promedio de respuesta: 185ms
  • Tasa de éxito: 100%
  • Cobertura de datos: 100%

Validación de Calidad

Reporte de Calidad Técnica

quality_report = {
    'total_requests': 49,
    'successful_requests': 49,
    'failed_requests': 0,
    'error_rate': 0.0,
    'avg_response_time_ms': 185,
    'data_completeness': 1.0,
    'null_values': 0,
    'duplicate_coordinates': 0,
    'validation_passed': True
}

Limitaciones de Datos:

  • Solo datos actuales (sin históricos sin tier de pago)
  • Límite de tasa: 60 solicitudes/minuto
  • Datos de pronóstico requieren actualización

Integración con Challenge 1

Enlazando Datasets

Datos de Órdenes (Challenge 1)

  • Marcas de tiempo
  • Ubicaciones
  • Tasas de aceptación
  • Tiempos de entrega

Datos Meteorológicos (Challenge 2)

  • Temperatura
  • Precipitación
  • Condiciones de viento
  • Actualizaciones en tiempo real

Sinergia: Predecir tasas de aceptación y tiempos de entrega basados en condiciones climáticas

Arquitectura de Integración

Metodología de Unión Espacial

import geopandas as gpd

def merge_order_weather(orders_df, weather_df):
    # Convert to GeoDataFrames
    orders_gdf = gpd.GeoDataFrame(
        orders_df,
        geometry=gpd.points_from_xy(orders_df.lon, orders_df.lat)
    )

    # Spatial join - find nearest weather station (within 1km)
    merged = gpd.sjoin_nearest(
        orders_gdf, weather_gdf, max_distance=1000
    )

    # Feature engineering
    merged['temp_category'] = pd.cut(merged['temperature'],
        bins=[0, 14, 18, 25],
        labels=['cold', 'moderate', 'hot']
    )

    return merged

Casos de Uso: Predicción de aceptación ajustada por clima, ETAs dinámicos, puntuación de riesgo

Mejoras Futuras

Resumen de Hoja de Ruta

Fase 1: Análisis Histórico

  • Recolectar 12+ meses de datos meteorológicos históricos
  • Identificar patrones y tendencias estacionales
  • Construir modelos predictivos de series temporales
  • Correlacionar con datos históricos de entregas

Resultado Esperado: Estrategias de optimización estacional, mejor planificación de recursos

Fase 2: Pronóstico

Integración de Predicción Meteorológica

  • Integrar API de pronóstico de 7 días
  • Predicciones hora por hora para planificación de entregas
  • Sistema de alerta temprana de clima severo
  • Notificaciones proactivas a repartidores y clientes

Casos de Uso:

  • Pre-posicionar repartidores antes de eventos climáticos
  • Ajustar personal basado en pronósticos
  • Comunicación con clientes sobre posibles demoras
  • Pre-anuncio de precios dinámicos

Fase 3: Sistema en Tiempo Real

Integración Operacional

  • Dashboard de clima en vivo para equipo de operaciones
  • Disparadores de alertas automatizados
  • Integración directa con sistema de despacho
  • Widget de clima en app móvil para repartidores

Mejoras de Arquitectura: Microservicios basados en eventos, streaming de datos en tiempo real, servicio de modelos ML

Conclusiones

Puntos Clave

  1. Recolección exitosa de datos meteorológicos - 49 ubicaciones estratégicas en Bogotá con cobertura completa
  2. Infraestructura de integración funcionando - API de OpenWeather integrada con sistema de recolección automatizada
  3. Análisis descriptivo completo - Estadísticas de temperatura, humedad, viento y correlaciones identificadas
  4. Datos listos para análisis avanzado - Variables meteorológicas capturadas permiten análisis de impacto operacional
  5. Visualizaciones geoespaciales implementadas - Mapas interactivos y dashboards para exploración de datos

¿Preguntas?

¡Gracias!