Salta el contingut

Projecte 1 — El Rebost de Blanes

Camp Valor
Empresa El Rebost de Blanes (supermercat online, fundat el 2019)
Sector Alimentació / e-commerce local
Nivell Júnior — la teva primera setmana com a becari/ària de dades
Durada estimada 5-6 hores
Blocs relacionats Bloc 1 (fonaments), Bloc 2 (relacional), Bloc 5 (ETL i qualitat), Bloc 7 (visualització)

Context

El Rebost de Blanes és un supermercat online que porta la compra a domicili a Blanes, Lloret de Mar i Tossa de Mar. Té 5 anys d'història, un catàleg d'uns 3.000 productes i unes 40.000 comandes anuals. L'empresa mai ha tingut ningú dedicat a dades: totes les consultes es feien "a mà" obrint Excels exportats des del programa de gestió (ERP). Acabes de començar-hi com a becari/ària i el teu cap et diu: "Aquí tens accés a la base de dades i uns quants exports en CSV. Necessitem entendre millor els nostres clients i les nostres vendes."

Datasets

Fitxer Contingut Files
clients.csv Taula de clients: id_client, nom, email, data_alta, municipi 8.000
comandes.csv Comandes: id_comanda, id_client, data_comanda, total_euros 33.133
vendes_2025.csv Export brut de l'ERP amb els problemes de qualitat del Dia 3 431

Dia 1 — Primera exploració

Se't dona accés a la base de dades PostgreSQL de producció (només lectura) amb les taules clients i comandes, i un export vendes_2025.csv extret directament de l'ERP.

import pandas as pd

df = pd.read_csv("vendes_2025.csv")
print(df.info())
print(df.head())
print(df.isnull().sum())

Tasca: fes una primera exploració amb pandas del fitxer vendes_2025.csv i respon: quantes files té, quines columnes tenen valors nuls, i quin sembla ser el problema més greu de qualitat que detectes a simple vista?

Dia 2 — Segmentació de clients amb SQL

El teu cap vol saber quants clients registrats mai han fet cap comanda (per decidir si val la pena llançar-los una campanya de reactivació).

SELECT COUNT(*) AS clients_sense_comandes
FROM clients c
LEFT JOIN comandes co ON c.id_client = co.id_client
WHERE co.id_comanda IS NULL;

-- Resultat: 1.847 clients sense cap comanda registrada

Tasca: escriu la consulta que, a més del recompte, llisti aquests 1.847 clients ordenats per data d'alta (els més antics primer, ja que són els que fa més temps que "s'han perdut"). Després, escriu una segona consulta que calculi, per a cada client amb comandes, el nombre de dies transcorreguts des de la seva última compra, per identificar clients en risc d'abandonar (per exemple, més de 90 dies sense comprar).

Dia 3 — Neteja del CSV de vendes

El fitxer vendes_2025.csv ve directament de l'ERP i té els problemes típics d'un export fet sense pensar en anàlisi de dades posterior:

id_venda data client preu quantitat
10234 03/01/2025 4021 12,50 2
10235 2025-01-03 4022 "8.90" 1
10234 03/01/2025 4021 12,50 2
10236 03-01-2025 15,00 3

Problemes a resoldre:

  1. Dates en tres formats diferents (03/01/2025, 2025-01-03, 03-01-2025) dins del mateix fitxer.
  2. Preus com a text, alguns amb coma decimal ("12,50") i altres amb punt i cometes ("8.90").
  3. Files duplicades (la comanda 10234 apareix dues vegades exactes).
  4. Client nul a la fila 10236: cal decidir si es descarta la fila o es marca com a "client desconegut".

Tasca: escriu un script Python amb pandas que llegeixi el CSV i apliqui les quatre correccions. Documenta amb un comentari, per a cada problema, quina decisió has pres i per què (per exemple: descartar files amb client nul, o no).

Dia 4 — Pipeline de raw a silver

Amb el codi de neteja del Dia 3 ja provat, cal convertir-lo en un pipeline reproduïble. El teu cap fa servir Airflow per a altres processos i vol que aquest hi encaixi.

Tasca:

  1. Dissenya un DAG d'Airflow amb com a mínim tres tasques: extreu_csv (llegeix el fitxer en brut), neteja_dades (aplica les correccions del Dia 3) i carrega_silver (escriu el resultat net a una taula silver.vendes).
  2. Puja el codi a un repositori Git i redacta un missatge de commit clar.
  3. Simula una revisió de codi (code review): identifica tu mateix/a dos punts millorables del teu propi codi (per exemple, manca de gestió d'errors si el fitxer no existeix, o un nom de variable poc clar).

Dia 5 — Incident en producció i dashboard

Incident: el DAG que vas crear ahir ha fallat aquesta nit. Als logs d'Airflow hi ha aquest error:

ValueError: time data '31/02/2025' does not match format '%d/%m/%Y'

Tasca (part 1 — diagnòstic): explica per què falla exactament aquesta data i proposa una modificació al codi de neteja perquè les dates invàlides (com un 31 de febrer, que no existeix) es marquin com a error en lloc d'aturar tot el pipeline.

Tasca (part 2 — mètriques i dashboard): un cop reparat el pipeline, construeix una taula agregada amb els KPI que el teu cap ha demanat: vendes totals per setmana, ticket mitjà, i les 10 categories de producte més venudes. Presenta aquestes dades en un dashboard senzill (Power BI o una llibreria Python de visualització, a triar).

Lliurament

  • Script de neteja de dades (Dia 3) amb comentaris justificant cada decisió.
  • Definició del DAG d'Airflow (Dia 4).
  • Consultes SQL del Dia 2.
  • Explicació de l'incident i la correcció (Dia 5).
  • Captura o fitxer del dashboard final amb els KPI.

Mòdul M5074 Sistemes de Big Data | Institut Sa Palomera (Blanes) | Curs CEIABD 2026-2027