{"id":32529721,"url":"https://github.com/pr0nel/snowflake-poc","last_synced_at":"2026-05-07T19:04:04.446Z","repository":{"id":316580537,"uuid":"1063585782","full_name":"Pr0nel/snowflake-poc","owner":"Pr0nel","description":"Pipeline de datos end-to-end implementando arquitectura Medallion (Bronze → Silver → Gold) en Snowflake para procesar órdenes de retail desde archivos Excel hasta vistas analíticas listas para negocio.","archived":false,"fork":false,"pushed_at":"2025-10-23T15:53:38.000Z","size":3439,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-23T17:41:47.412Z","etag":null,"topics":["pandas","python","snowflake","sql","sqlalchemy","yaml"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Pr0nel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-24T20:45:49.000Z","updated_at":"2025-10-23T15:53:41.000Z","dependencies_parsed_at":"2025-09-25T13:27:58.618Z","dependency_job_id":null,"html_url":"https://github.com/Pr0nel/snowflake-poc","commit_stats":null,"previous_names":["pr0nel/snowflake-poc"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Pr0nel/snowflake-poc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pr0nel%2Fsnowflake-poc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pr0nel%2Fsnowflake-poc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pr0nel%2Fsnowflake-poc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pr0nel%2Fsnowflake-poc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Pr0nel","download_url":"https://codeload.github.com/Pr0nel/snowflake-poc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pr0nel%2Fsnowflake-poc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281427336,"owners_count":26499409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pandas","python","snowflake","sql","sqlalchemy","yaml"],"created_at":"2025-10-28T11:20:55.120Z","updated_at":"2025-10-28T11:20:57.839Z","avatar_url":"https://github.com/Pr0nel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Snowflake Data Pipeline - Proof of Concept and Analytics\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![Snowflake](https://img.shields.io/badge/snowflake-standard-29b5e8.svg)](https://www.snowflake.com/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n## Descripción\n\nEste repositorio contiene una **prueba de concepto (POC)** desarrollada como parte de una implementación de la **arquitectura Medallion** (Bronze -\u003e Silver -\u003e Gold) en **Snowflake**, diseñada para ingestar, transformar y exponer datos listos para análisis. El objetivo es demostrar habilidades prácticas en:\n\n- Ingesta e integración de datos\n- Modelamiento y arquitectura de datos\n- Programación en Python y SQL\n- Uso de Snowflake\n- Calidad, trazabilidad y buenas prácticas de ingeniería de datos\n\n---\n\n## Tabla de Contenidos\n\n- [Arquitectura](#arquitectura)\n- [Tecnologías](#tecnologías)\n- [Instalación](#instalación)\n- [Configuración](#configuración)\n- [Ejecución](#ejecución)\n- [Estructura del Proyecto](#estructura-del-proyecto)\n- [Vistas de Análisis](#vistas-de-análisis)\n- [Validación de Datos](#validación-de-datos)\n- [Próximos Pasos](#próximos-pasos)\n\n---\n\n## Arquitectura\n\n```\nRAW (Bronze Layer)\n├── RAW_ORDERS (10,000 registros)\n├── RAW_RETURNS (284 registros)\n└── RAW_PEOPLE (3 gerentes regionales)\n        ↓\nCURATED (Silver Layer)\n├── CURATED_ORDERS (enriquecida con métricas)\n└── CURATED_PEOPLE (gerentes regionales)\n        ↓\nBUSINESS (Gold Layer)\n├── 8 Vistas de análisis de negocio\n├── Análisis de rentabilidad\n├── Desempeño regional\n└── Métricas KPI\n```\n\n### Flujo ETL\n\n1. **Ingesta**: Excel -\u003e CSV -\u003e Snowflake (RAW layer)\n2. **Validación**: Detección de duplicados, verificación de integridad\n3. **Deduplicación**: Tabla auxiliar + transacciones explícitas\n4. **Transformación**: Enriquecimiento con cálculos de negocio (Silver layer)\n5. **Análisis**: Vistas materializadas para BI (Gold layer)\n\n---\n\n## Tecnologías\n\n| Capa | Tecnología | Versión |\n|------|-----------|---------|\n| **Orquestación** | Python | 3.8+ |\n| **ETL** | Pandas, Snowflake Connector | 3.17.4+ |\n| **Almacenamiento** | Snowflake (Standard Edition) | - |\n| **SQL** | Snowflake SQL | - |\n| **Infraestructura** | GCP (Snowflake) | - |\n| **Seguridad** | PAT (Programmatic Access Token), variables de entorno | - |\n| **CI/CD** | (Preparado para Airflow/dbt) | - |\n\n---\n\n## Instalación\n\n### Requisitos Previos\n\n- Python 3.8+\n- Cuenta Snowflake (Free Trial compatible)\n\n### 1. Clonar el Repositorio\n\n```\ngit clone https://github.com/tu-usuario/snowflake-poc.git\ncd snowflake-poc\n```\n\n### 2. Crear Entorno Virtual\n\n```\npython3 -m venv venv\nsource venv/bin/activate  # Linux/Mac\n# o\n.\\venv\\Scripts\\Activate   # Windows\n```\n\n### 3. Instalar Dependencias\n\n```\npip install -r requirements.txt\n```\n\n**Dependencias principales:**\n- `snowflake-connector-python==3.17.4`\n- `pandas\u003e=1.5.0`\n- `pyyaml\u003e=6.0`\n- `python-dotenv\u003e=0.20.0`\n\n---\n\n## Configuración\n\n### 1. Variables de Entorno\n\nCrear archivo `.env` en la raíz del proyecto:\n\n```env\n# Snowflake Connection\nSNOWFLAKE_USER=tu_usuario\nSNOWFLAKE_PASSWORD=tu_contraseña\nSNOWFLAKE_ACCOUNT=tu_account_id\nSNOWFLAKE_ROLE=tu_rol\nSNOWFLAKE_WAREHOUSE_COMPUTE=COMPUTE_WH\nSNOWFLAKE_WAREHOUSE_ANALYTICS=ANALYTICS_WH\nSNOWFLAKE_DATABASE=tu_database\nSNOWFLAKE_SCHEMA_BRONZE=RAW\nSNOWFLAKE_SCHEMA_SILVER=CURATED\nSNOWFLAKE_SCHEMA_GOLD=BUSINESS\n\n# Rutas\nCONFIG_PATH=config/config.yaml\n```\n\n### 2. Archivo de Configuración (`config/config.yaml`)\n\n```\ningestion:\n  sources:\n    - id: eu_superstore\n      path: ./data/Sample_EU.xlsx\n      type: excel\n      schema: RAW\n      tables:\n        - sheet: Orders\n          name: ORDERS\n          method: put_copy_into\n        - sheet: Returns\n          name: RETURNS\n          method: write_pandas\n        - sheet: People\n          name: PEOPLE\n          method: write_pandas\n  settings:\n    create_csv: true\n    temp_dir: ./data/temp\n```\n\n---\n\n## Ejecución\n\n### Ejecutar Pipeline Completo\n\n```\npython3 scripts/main.py\n```\n\n**Esto ejecuta:**\n\n1. **FASE 1**: Setup de infraestructura (warehouses, DB, schemas)\n2. **FASE 2**: Ingesta de datos (XLSX -\u003e CSV -\u003e Snowflake)\n3. **FASE 3**: Validación y limpieza (detección de duplicados)\n4. **FASE 4**: Transformación a SILVER (enriquecimiento)\n5. **FASE 5**: Creación de vistas GOLD (análisis)\n\n### Logs\n\nLos logs se escriben en consola con timestamps:\n\n```\n[02:43:34] - [INFO] - Iniciando pipeline...\n[02:43:43] - [INFO] - Cambiando a warehouse: COMPUTE_WH\n[02:43:46] - [INFO] - Archivo SQL ejecutado con éxito. 9 sentencias ejecutadas.\n...\n```\n\n---\n\n## Estructura del Proyecto\n\n```\nsnowflake-poc/\n├── config/\n│   └── config.yaml                 # Configuración de ingesta\n├── data/\n│   ├── Sample_EU.xlsx              # Datos fuente\n│   └── temp/                       # CSVs intermedios\n├── scripts/\n│   ├── main.py                     # Orquestador principal\n│   ├── ingest.py                   # Lógica de ingesta (PUT, write_pandas)\n│   ├── convert_xlsx_to_csv.py      # Conversión Excel a CSVs\n│   └── validation_cleansing.py     # Validación y deduplicación\n├── sql/\n│   ├── 01_setup_infra.sql          # Warehouses, DB, schemas\n│   ├── 02_create_raw_tables.sql    # Tablas en capa RAW\n│   ├── 03_transform_curated.sql    # Transformaciones a SILVER\n│   └── 04_build_business_views.sql # Vistas GOLD\n├── .env.example                    # Template de variables\n├── requirements.txt                # Dependencias Python\n└── README.md                       # Este archivo\n```\n\n---\n\n## Vistas de Análisis\n\n### 1. Órdenes, Ventas y Ganancia por Año (Pregunta 1)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_ORDERS_SALES_PROFIT_BY_YEAR;\n```\n\n![V_ORDERS_SALES_PROFIT_BY_YEAR](images/v1.jpg \"ORDERS SALES PROFIT BY YEAR\")\n\n**Métricas:** Total de órdenes, clientes únicos, ventas, ganancia, margen, crecimiento\n\n### 2. Órdenes por Día de la Semana 2017 (Pregunta 2)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_ORDERS_BY_DAY_OF_WEEK_2017;\n```\n\n![V_ORDERS_BY_DAY_OF_WEEK_2017](images/v2.jpg \"ORDERS BY DAY OF WEEK 2017\")\n\n**Insights:** Viernes es el día más fuerte (22% del volumen), Jueves muestra anomalía (-90%)\n\n### 3. Ventas por Segmento (Pregunta 3)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_SALES_BY_SEGMENT_ALL_YEARS;\n```\n\n![V_SALES_BY_SEGMENT_ALL_YEARS](images/v3.jpg \"SALES BY SEGMENT ALL YEARS\")\n\n**Análisis:** Desempeño por segmento (Consumer, Corporate, Home Office) con margen por año\n\n### 4. Top 10 Productos 2017 (Pregunta 4)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_TOP_10_PRODUCTS_2017;\n```\n\n![V_TOP_10_PRODUCTS_2017](images/v4.jpg \"TOP 10 PRODUCTS 2017\")\n\n### 5. Bottom 10 Productos 2015 (Pregunta 5)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_BOTTOM_10_PRODUCTS_2015;\n```\n\n![V_BOTTOM_10_PRODUCTS_2015](images/v5.jpg \"BOTTOM 10 PRODUCTS 2015\")\n\n### 6. Órdenes Devueltas 2015 (Pregunta 6)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_RETURNED_ORDERS_2015;\n```\n\n![V_RETURNED_ORDERS_2015](images/v6.jpg \"RETURNED ORDERS 2015\")\n\n### 7. Devoluciones por Gerente Regional 2015 (Pregunta 7)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_RETURNED_BY_MANAGER_2015;\n```\n\n![V_RETURNED_BY_MANAGER_2015](images/v7.jpg \"RETURNED BY MANAGER 2015\")\n\n**Análisis Regional:**\n- Central (Emily Burns): 6.24% tasa de devolución\n- North (Ross DeVincentis): 5.53% tasa de devolución (mejor rentabilidad)\n- South (Damaia Kotsonis): 4.85% tasa de devolución (mejor calidad)\n\n### 8. KPIs de Desempeño Empresa (Pregunta 8)\n\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_COMPANY_PERFORMANCE_KPI;\n```\n\n![V_COMPANY_PERFORMANCE_KPI_1](images/v8_1.jpg \"COMPANY PERFORMANCE KPI\")\n![V_COMPANY_PERFORMANCE_KPI_2](images/v8_2.jpg \"COMPANY PERFORMANCE KPI\")\n\n### Análisis Críticos Adicionales\n\n**Rentabilidad de Productos:**\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_PRODUCT_PROFITABILITY_ANALYSIS;\n```\n\n![V_PRODUCT_PROFITABILITY_ANALYSIS](images/va_1.jpg \"PRODUCT PROFITABILITY ANALYSIS\")\n\n**Órdenes No Rentables:**\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_UNPROFITABLE_ORDERS_ANALYSIS;\n```\n\n![V_UNPROFITABLE_ORDERS_ANALYSIS](images/va_2.jpg \"UNPROFITABLE ORDERS ANALYSIS\")\n\n**Desempeño Regional:**\n```\nSELECT * FROM BPOLABS_POC.BUSINESS.V_REGIONAL_PERFORMANCE;\n```\n\n![V_REGIONAL_PERFORMANCE](images/va_3.jpg \"REGIONAL PERFORMANCE\")\n\n---\n\n## Validación de Datos\n\n### Validaciones Automáticas Ejecutadas\n\n1. **Archivo fuente existe:** Verifica ruta de Excel\n2. **Tablas destino existen:** Valida antes de ingesta\n3. **Duplicados detectados:** Por PK\n4. **Integridad de columnas:** Validación de tipos\n5. **Deduplicación segura:** Tabla auxiliar + transacciones\n\n---\n\n## Próximos Pasos\n\n### Mejoras Planificadas\n\n- Documentación de lineaje\n- Integración con Apache Airflow para orquestación automática\n- Migración a dbt para transformaciones SQL\n- Dashboard en Tableau/Looker conectado a vistas\n\n### Optimizaciones\n\n- Incremental loads (cargar solo datos nuevos)\n- Clustering automático en Snowflake\n- Compresión de archivos en stages\n- Monitoreo de costs en Snowflake\n\n### Recomendaciones de Negocio\n\nBasado en los datos analizados:\n\n1. **Urgente:** Revisar 37.71% de productos no serían rentables\n2. **Estrategia:** Implementar dynamic pricing para intervenir margen negativo\n3. **Regional:** Replicar mejores prácticas de la region SOUTH\n4. **Operacional:** Investigar anomalía de jueves en 2017\n\n---\n\n## Contribuir\n\n1. Fork el repositorio\n2. Crear rama feature (`git checkout -b feature/mejora`)\n3. Commit cambios (`git commit -am 'Add feature'`)\n4. Push a rama (`git push origin feature/mejora`)\n5. Abrir Pull Request\n\n---\n\n## Licencia\n\nEste proyecto está bajo licencia MIT. Ver archivo `LICENSE` para detalles.\n\n---\n\n## Autor\n\n**[Pablo Ratache Rojas]** - Data Engineer\n\n- GitHub: [@Pr0nel](https://github.com/Pr0nel)\n- LinkedIn: [Pablo Ratache](www.linkedin.com/in/pablo-ratache-rojas-9a9602140)\n- Portfolio: [Pablo's Portfolio](https://pr0nel.github.io/cv_pablo_ratache/)\n\n---\n\n## Contacto \u0026 Soporte\n\nPara reportar bugs o sugerir mejoras, abrir un [Issue](https://github.com/tu-usuario/snowflake-poc/issues).\n\n---\n\n## Changelog\n\n### v1.0.0 (2025-10-23)\n- Pipeline completo funcional\n- 8 vistas de análisis principales\n- Validación de datos\n- Documentación completa","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpr0nel%2Fsnowflake-poc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpr0nel%2Fsnowflake-poc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpr0nel%2Fsnowflake-poc/lists"}