# Proyecto Python: análisis de pagos de Sakila

Analiza una exportación documentada de sakila.payment con pandas. El proyecto calcula controles, resúmenes por mes y por staff_id, y deja CSV para respaldar conclusiones. Sakila es una base de ejemplo ficticia; sus valores no describen un negocio real.

## Requisitos y datos

- Python 3.11 o posterior.
- Instala desde esta carpeta con py -m pip install -r requirements.txt (Windows) o python3 -m pip install -r requirements.txt (macOS/Linux).
- La exportación está en data/payments-analysis.csv. Contiene 16,044 filas y cuatro columnas. También se puede [descargar por separado](/datasets/sakila/payments-analysis.csv).
- Se generó con MySQL Community Server 8.4.11 desde la distribución original de Sakila. El dump usado tuvo SHA-256 EF4AB9AAB7A433311EFF6558561BF47DE231FE9F6D49F03DE67E593418DF719C; el CSV tiene SHA-256 39A77051650E5ACDB90A5AA4ECEC267CD5B6FCDE8F24262F3329711F9260B963.

Sakila declara sakila-schema.sql y sakila-data.sql bajo licencia New BSD; la nota completa se incluye en data/Sakila-LICENSE.txt. Consulta la [licencia oficial](https://dev.mysql.com/doc/sakila/en/sakila-license.html) y la [guía de instalación](https://dev.mysql.com/doc/sakila/en/sakila-installation.html). Este paquete contiene solo una exportación reducida, no el dump.

### Procedencia y significado de las filas

Consulta de origen ejecutada en el esquema oficial:

~~~sql
SELECT payment_id, payment_date, amount, staff_id
FROM sakila.payment
ORDER BY payment_id;
~~~

- Grano: una fila por pago.
- Clave: payment_id.
- payment_date es la fecha y hora del pago; amount es el importe del registro.
- staff_id identifica al miembro del personal que procesó el pago. No identifica una tienda.
- Se omitieron customer_id, nombres, correos y columnas innecesarias para este análisis.
- Sakila es ficticia. Los datos son registros de esa muestra, no información operativa de una empresa.

El CSV se incluye para que el curso se pueda seguir sin instalar MySQL. Si exportas otra versión de Sakila, valida esquema, filas y periodo antes de comparar resultados.

## Archivos

~~~text
sakila-python-analysis/
  README.md
  requirements.txt
  data/payments-analysis.csv
  data/Sakila-LICENSE.txt
  starter/analyze_payments.py
  solution/analyze_payments.py
  solution/findings-template.md
  solution/test_analyze_payments.py
  expected/quality_checks.csv
  expected/monthly_summary.csv
  expected/staff_summary.csv
~~~

El archivo starter contiene tareas pendientes. La solución y sus pruebas se incluyen para revisar el proyecto después de intentarlo.

## Ejecución de referencia

Desde esta carpeta:

~~~text
py solution/analyze_payments.py
py -m unittest discover -s solution -p "test_*.py"
~~~

En macOS/Linux, sustituye py por python3. Para elegir archivos:

~~~text
py solution/analyze_payments.py --input data/payments-analysis.csv --output output
~~~

El programa escribe monthly_summary.csv, staff_summary.csv y quality_checks.csv. Si una clave se repite, una fecha no se interpreta o aparece un importe negativo o un valor obligatorio vacío, se detiene con el problema. Un importe cero se conserva porque no hay una regla que lo declare inválido.

## Salida esperada

- 16,044 filas válidas; fechas entre 2005-05-24 y 2006-02-14.
- Suma de amount: 67406.56; promedio: aproximadamente 4.20; mediana: 3.99.
- Hay cinco meses con filas: mayo, junio, julio y agosto de 2005, y febrero de 2006. No trates estas filas como meses consecutivos: faltan meses en el extracto.
- Julio de 2005 tiene el mayor total observado (28368.91). Esto describe solo las filas del CSV.
- Hay dos valores de staff_id. La comparación es por identificador de quien procesó el pago, no por tienda o desempeño.
- Los controles incluidos terminan con issue_count igual a cero.

Los CSV de expected permiten comparar encabezados, grano y resultados. Conteos y sumas deben reconciliar con el archivo de entrada.

## Criterios de aceptación

1. El archivo de entrada no se modifica; el script no conecta a una base ni escribe en ella.
2. Cada fila representa un pago y payment_id es único.
3. Fechas, importes e identificadores obligatorios se validan antes de resumir.
4. Los resultados por mes y por personal reconcilian con 16,044 filas y el total 67406.56.
5. Se generan tres CSV con encabezados y valores reproducibles.
6. No se presenta staff_id como ubicación de tienda ni se llama error a un valor atípico sin investigarlo.
7. findings.md incluye tres observaciones con una medida y al menos dos límites.
8. No se afirma que la muestra describe actividad empresarial real.

## Entrega y rúbrica (100 puntos)

Entrega el script completado, las pruebas, los tres archivos y una copia completada de solution/findings-template.md llamada findings.md.

| Criterio | Puntos |
|---|---:|
| Procedencia, grano, clave y controles | 25 |
| Agregaciones y reconciliación | 25 |
| Interpretación de mediana, dispersión y valores atípicos | 20 |
| Observaciones respaldadas y límites | 20 |
| Organización, instrucciones y pruebas | 10 |

Aprobación sugerida: 70 puntos. Una conclusión que confunda la muestra con datos de una empresa o que cambie el archivo original debe corregirse antes de entregar.
