import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# ── Dataset ─────────────────────────────────────────────────────
datos = {
'superficie': [75, 95, 60, 120, 85, 50, 110, 70, 140, 65, 90, 100],
'habitaciones': [3, 3, 2, 4, 3, 1, 4, 2, 5, 2, 3, 4],
'banios': [1, 2, 1, 2, 2, 1, 3, 1, 3, 1, 2, 2],
'antiguedad': [20, 10, 35, 5, 15, 40, 8, 25, 2, 30, 12, 7],
'dist_centro': [5.2, 3.8, 8.1, 2.1, 4.5, 9.0, 3.2, 6.7, 1.5, 7.4, 4.0, 2.8],
}
df = pd.DataFrame(datos)
cols = df.columns.tolist()
# ── Aplicar ambos métodos ────────────────────────────────────────
mm_scaler = MinMaxScaler()
std_scaler = StandardScaler()
df_mm = pd.DataFrame(mm_scaler.fit_transform(df), columns=cols)
df_std = pd.DataFrame(std_scaler.fit_transform(df), columns=cols)
# ── Comparativa visual en consola ────────────────────────────────
separador = '─' * 65
print(separador)
print('ORIGINAL (valores sin normalizar)')
print(separador)
print(df.to_string(index=False))
print(f' Min: {df.min().to_dict()}')
print(f' Max: {df.max().to_dict()}')
print()
print(separador)
print('MIN-MAX SCALER (rango [0, 1])')
print(separador)
print(df_mm.round(3).to_string(index=False))
print(f' Min: {df_mm.min().round(3).to_dict()}')
print(f' Max: {df_mm.max().round(3).to_dict()}')
print()
print(separador)
print('STANDARD SCALER (media≈0, desv.típ.≈1)')
print(separador)
print(df_std.round(3).to_string(index=False))
print(f' Medias: {df_std.mean().round(4).to_dict()}')
print(f' Desv.tip.: {df_std.std().round(3).to_dict()}')
# ── Tabla resumen por variable ───────────────────────────────────
print()
print(separador)
print('RESUMEN POR VARIABLE')
print(separador)
for col in cols:
print(f'{col:>14} | original: [{df[col].min():.1f}, {df[col].max():.1f}] | min-max: [{df_mm[col].min():.3f}, {df_mm[col].max():.3f}] | z-score: [{df_std[col].min():.3f}, {df_std[col].max():.3f}]')