Apunte práctico · Clases 0 a 6 · Primer parcial

De variables sueltas
a un pipeline
que se puede confiar

Este resumen sigue el orden real de la cursada: primero código legible y a prueba de errores, después los dos pilares técnicos (NumPy y Pandas), después limpieza y formatos de archivo, y por último cómo comunicar lo que encontraste con Matplotlib y Seaborn. Cada clase tiene los conceptos clave, ejemplos de código reales de las diapositivas, y los errores típicos que marca la cátedra.

Basado en tus exámenes rendidos

Tu dominio por tema

Se actualiza con cada "★ Rendir examen" que corregís con IA — la práctica libre no suma acá.

Cargando…

Clase 00

Introducción y calendario

Presentación institucional de la materia: por qué Python en ciencia de datos, y el mapa completo del cuatrimestre.

Conceptos clave

  • Origen de Python (Guido van Rossum, CWI, 1989-1991) y por qué se volvió estándar en ciencia de datos.
  • Estructura del curso: unidades 1 a 6, clases 1 a 21, dos parciales, simulacros, recuperatorio y final.
  • Mapa temático completo: introducción → buenas prácticas/excepciones → NumPy/Pandas → limpieza/formatos → Matplotlib → Seaborn → estadística descriptiva/groupby → outliers/transformaciones → Scikit-learn → Git/GitHub → testing (Pytest/unittest).

Clase 02

Buenas prácticas (PEP8, docstrings) y manejo básico de errores

Transformar "código que funciona" en código legible, documentado y robusto ante errores — la base de calidad que se exige en toda la materia.

Conceptos clave

  • PEP 8: indentación de 4 espacios, snake_case para variables/funciones, CapWords para clases, imports agrupados al inicio.
  • PEP 257 / docstrings: triple comilla """...""", formato con Args, Returns, Raises; se accede con __doc__ y help().
  • Comentarios efectivos: explican el "por qué" (decisiones, reglas de negocio), no repiten el "qué" del código.
  • Excepciones: modelo try / except / else / finally; raise ... from exc para encadenar y conservar la causa original; excepciones propias heredando de ValueError/Exception.
  • E/S de datos: TXT (open()), CSV (csv.DictReader), JSON (json.load/json.dump); pathlib.Path en vez de strings sueltos.

Ejemplo

def cargar_configuracion(ruta: str) -> dict:
    """Carga configuración desde un archivo JSON.

    Args:
        ruta: Ubicación del archivo.
    Returns:
        Diccionario con la configuración.
    Raises:
        FileNotFoundError: Si la ruta no existe.
    """
    try:
        texto = Path(ruta).read_text(encoding="utf-8")
        return json.loads(texto)
    except FileNotFoundError as exc:
        raise FileNotFoundError(f"No existe: {ruta}") from exc
    except json.JSONDecodeError as exc:
        raise ValueError("El archivo no contiene JSON válido") from exc

Errores típicos

  • Nombres crípticos (cp(x) en vez de calcular_promedio(...)).
  • Comentarios que repiten el código en vez de explicar la decisión.
  • except: vacío o except Exception: pass que oculta bugs reales.
  • No cerrar archivos (olvidar with open(...)) ni fijar encoding="utf-8".

Clase 02.1

Manejo robusto de excepciones con JSON, TXT y CSV

Aplica el manejo de errores específicamente a leer/escribir archivos de datos: archivos faltantes, permisos, codificación, formatos inválidos y columnas ausentes.

Conceptos clave

  • Principios: fallar pronto, ser específico (capturar FileNotFoundError, PermissionError, json.JSONDecodeError, csv.Error, UnicodeDecodeError según el caso), cerrar recursos con with, registrar contexto con logging.exception().
  • Flujo recomendado: comprobar ruta → abrir seguro → parsear formato → validar estructura → convertir tipos → reportar/elevar.
  • Excepción de dominio reutilizable, ej. class DataFileError(Exception), que envuelve errores técnicos con raise ... from exc.
  • Capas de error distintas: lectura (FileNotFoundError, OSError), parseo (JSONDecodeError, csv.Error), validación (ValueError, KeyError), negocio (reglas propias).
  • Pandas como alternativa de alto nivel: pd.read_csv(on_bad_lines="error"), pd.to_numeric(errors="raise").

Ejemplo

def leer_ventas_csv(path: str) -> list[dict]:
    columnas = {"fecha", "producto", "region_ventas", "cantidad_ventas"}
    with Path(path).open("r", encoding="utf-8", newline="") as archivo:
        lector = csv.DictReader(archivo)
        if not lector.fieldnames or not columnas.issubset(lector.fieldnames):
            faltantes = columnas - set(lector.fieldnames or [])
            raise ValueError(f"Columnas faltantes: {faltantes}")
        return list(lector)

Antipatrones a evitar

  • Capturar todo con except Exception sin registrar ni reelevar.
  • Ignorar errores (except: pass o devolver [] como si nada hubiese pasado).
  • No validar columnas del CSV/JSON, asumiendo estructura perfecta.
  • Mensajes ambiguos ("Error" sin ruta, operación ni causa).

Clase 02.2

Bibliotecas de ciencia de datos (repaso integrador)

El "mapa" del stack de Python para ciencia de datos — cuál biblioteca usar según la tarea — y puente hacia NumPy/Pandas y Matplotlib/Seaborn.

Conceptos clave

  • NumPy: ndarray, cálculo vectorizado — np.array(), np.mean(), np.where(), np.reshape().
  • pandas: Series/DataFrame — read_csv(), head(), describe(), groupby(), merge().
  • Matplotlib: plt.plot(), plt.bar(), plt.hist(). seaborn: sns.scatterplot(), sns.heatmap().
  • SciPy complementa NumPy (optimización, álgebra lineal, estadística). scikit-learn: patrón fit() / predict() / score().
  • Pipeline integrador típico: entrada → validación → análisis (pandas+NumPy) → modelo → salida (reporte.csv + log).

Ejemplo

try:
    df = pd.read_csv("ventas.csv")
    df["monto"] = pd.to_numeric(df["monto"])
    resumen = df.groupby("producto")["monto"].sum()
except FileNotFoundError:
    print("No existe ventas.csv")
except KeyError as error:
    print(f"Columna faltante: {error}")

Clase 03

NumPy y Pandas: arreglos y datos tabulares

Los dos pilares técnicos del resto de la materia: cálculo vectorizado con NumPy y manipulación de datos tabulares con Pandas.

Conceptos clave

  • ndarray: propiedades ndim, shape, size, dtype; conversión con .astype().
  • Vectorización y broadcasting: operar arreglos enteros sin loops for explícitos.
  • Indexación y máscaras booleanas: x[1:3], x[::2], arr[arr >= 18].
  • Series y DataFrame: pd.Series(...), pd.DataFrame({...}); inspección con head(), info(), describe(), dtypes.
  • loc vs iloc: df.loc[] por etiqueta (incluye ambos extremos), df.iloc[] por posición (excluye el final).
  • Condiciones booleanas combinadas con &/| (nunca and/or).
  • Limpieza: .str.replace(), pd.to_numeric(errors="coerce"), .fillna(), .drop_duplicates().
  • Agrupar/pivotear/combinar: groupby().agg(), pd.pivot_table(), pd.merge(on=..., how=...).
  • np.where() para una regla condicional, np.select() para varias reglas a la vez.

Ejemplo

ventas['precio'] = ventas['precio'].str.replace('$', '', regex=False)
ventas['precio'] = pd.to_numeric(ventas['precio'], errors='coerce')
ventas['precio'] = ventas['precio'].fillna(ventas['precio'].median())

condiciones = [reporte['minutos'] <= 25, reporte['minutos'] <= 40]
reporte['clasificacion'] = np.select(condiciones, ['Rápida', 'Normal'], default='Demorada')

Errores típicos

  • Usar and/or en vez de &/| al combinar condiciones en Pandas.
  • Columna numérica que quedó como object por símbolos o texto mezclado ($ en precios, "dos" en vez de 2) — limpiar antes de pd.to_numeric.
  • Confundir df.loc[0:2] (incluye el 2) con df.iloc[0:2] (excluye la posición 2).

Clase 04

Preparación y movimiento de datos: índices, limpieza y formatos

Indexación avanzada, combinar datasets (concat vs. merge), un proceso de limpieza basado en diagnóstico, y persistencia en CSV/Excel/SQL/JSON. La clase más orientada a "pipeline reproducible".

Conceptos clave

  • concat apila (misma estructura, sin clave común) — merge relaciona (clave común, con cardinalidad 1:1/1:N/N:M). Son operaciones distintas que se confunden seguido.
  • merge: tipos de join inner/left/right/outer; validate="many_to_one"; indicator=True para ver qué coincidió.
  • Diagnóstico de calidad: df.isna().sum(), df.duplicated().sum(), df.nunique(), df.describe(include="all").
  • Nulos: eliminar vs. imputar (mediana robusta, moda para categorías); marcar con una columna bandera df['col_faltante'].
  • Tipos: pd.to_numeric(errors="coerce"), pd.to_datetime(errors="coerce", dayfirst=True), .astype("category").
  • Formatos de E/S: CSV (sep, decimal, parse_dates), Excel (sheet_name=None para todas las hojas), SQL (read_sql_query con parámetros — nunca concatenar), JSON (json_normalize para aplanar estructuras anidadas).
  • index=False al exportar, para no escribir el índice como columna.

Ejemplo

mascara = (ventas["importe_num"] >= 800) & ventas["producto"].isin(["A", "B"])
seleccion = ventas.loc[mascara, ["cliente_id", "producto", "importe_num"]]

ventas_clientes = ventas.merge(clientes, on="cliente_id", how="left",
                                validate="many_to_one", indicator=True)

df["importe_num"] = pd.to_numeric(
    df["importe"].str.replace("$", "", regex=False), errors="coerce"
)

Errores típicos

  • Confundir concat con merge, o alinear por índice con concat(axis=1) cuando los índices no son la misma entidad.
  • No validar la cardinalidad antes de un merge → explosión de filas por relación N:M inesperada.
  • No parametrizar consultas SQL (riesgo de inyección).
  • Olvidar index=False al exportar.

Clase 05

Visualización con Matplotlib

Traducir una pregunta analítica en una visualización correcta (tendencia, comparación, distribución, relación), con la interfaz Figure/Axes. Énfasis en comunicación honesta, no sólo en sintaxis.

Conceptos clave

  • Elección de gráfico según la pregunta: tendencia → líneas; comparación → barras (base en cero); distribución → histograma; relación → dispersión (no prueba causalidad).
  • Anatomía: Figure = lienzo completo, Axes = área de dibujo; fig, ax = plt.subplots(...).
  • Subgráficos múltiples: plt.subplots(n, m, figsize=...), indexado axes[i,j].
  • Ajuste lineal con np.polyfit(x, y, 1) para una recta de tendencia sobre un scatter.
  • Cierre: fig.tight_layout(), plt.show(), fig.savefig(..., dpi=...).

Ejemplo

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(meses, ventas, marker="o")
ax.set_title("Ventas mensuales"); ax.set_xlabel("Mes"); ax.set_ylabel("Unidades")
fig.tight_layout(); plt.show()

m = np.mean(df['minutos'])
plt.hist(df['minutos'], bins=np.arange(15,55,5), color='teal', edgecolor='white')
plt.axvline(m, color='red', linestyle='--', label=f'Media={m:.1f}')
plt.legend()

Errores frecuentes

  • Eje truncado (no empezar en cero) que exagera diferencias en barras.
  • Título genérico ("Ventas") en vez de uno que comunique el hallazgo.
  • Miles de puntos superpuestos en un scatter sin alpha (transparencia).
  • Confundir correlación con causalidad al interpretar una recta ajustada.

Clase 06

Visualización con Seaborn

Seaborn como interfaz estadística de alto nivel sobre Matplotlib, usada junto con Pandas: Pandas organiza → Seaborn visualiza → Matplotlib controla figura/exportación.

Conceptos clave

  • sns.heatmap(df.corr(), annot=True): cerca de +1/-1 = asociación lineal fuerte; cerca de 0 = poca asociación lineal (no independencia).
  • sns.boxplot() + sns.stripplot(): mediana, caja = rango intercuartílico, puntos externos = posibles atípicos.
  • sns.pairplot(hue=...): matriz de relaciones por pares — útil con pocas variables, lento con muchas.
  • Multivariado con un solo scatter: hue, size, style — una variable por canal visual, sin sobrecargar.
  • Exportación para informes: PNG (dpi=300) para web/Office, PDF/SVG (vectorial) para impresión.

Ejemplo

corr = df.select_dtypes("number").corr()
sns.heatmap(corr, annot=True, cmap="vlag", vmin=-1, vmax=1)

sns.boxplot(data=df, x="Curso", y="Nota", hue="Curso", legend=False)
sns.stripplot(data=df, x="Curso", y="Nota", color="black", alpha=.4)

sns.scatterplot(data=df, x="Horas", y="Nota", hue="Curso", size="Proyectos",
                 style="Curso", sizes=(40, 220), alpha=.78)

Errores típicos

  • Interpretar correlación ≈ 0 como "independencia" (sólo indica poca asociación lineal).
  • Confundir correlación con causalidad al leer un heatmap o regplot.
  • pairplot con demasiadas columnas: lento y difícil de leer.
  • Codificar más de una variable por canal visual sin criterio (color + forma + tamaño a la vez).

Herramienta transversal

Chuleta rápida

Las funciones que más se usan, agrupadas por biblioteca. Para cuando sabés qué querés hacer pero no te acordás cómo se llama.

Python base y manejo de errores

try / except / else / finallyIntenta, atrapa errores específicos, corre else si no hubo error, y finally siempre al final.
raise ... from excRelanza una excepción nueva conservando la causa original (no se pierde el traceback).
with open(...) as fAbre un recurso y lo cierra solo, incluso si algo falla adentro.
pathlib.Path(ruta)Rutas de archivo multiplataforma: .exists(), .read_text(), .stat().
logging.exception(msg)Registra el traceback completo del error sin cortar la ejecución.
csv.DictReader / json.loadLeer CSV/JSON directo como diccionarios, sin parsear a mano.

NumPy

np.array(lista)Crea un ndarray a partir de una lista o lista de listas.
.ndim .shape .size .dtypeDimensiones, forma, cantidad de elementos y tipo de dato de un ndarray.
arr[arr > x]Máscara booleana: selecciona sólo los elementos que cumplen la condición.
np.mean() np.std() np.median()Estadística descriptiva vectorizada, sin loops.
np.where(cond, si, no)Una regla condicional vectorizada.
np.select([c1,c2], [v1,v2], default=)Varias reglas condicionales evaluadas en orden.
np.argmax() / np.argmin()Índice del valor máximo/mínimo del arreglo.
np.polyfit(x, y, 1)Pendiente e intercepto de la recta que mejor ajusta los puntos.

Pandas — selección y limpieza

df.head() .info() .describe()Primeras filas, tipos/nulos por columna, estadística resumen.
df.loc[] vs df.iloc[]loc por etiqueta (incluye el extremo). iloc por posición (lo excluye).
df[(c1) & (c2)]Filtrado booleano combinado — nunca and/or.
pd.to_numeric(col, errors="coerce")Convierte a número; lo que no se puede convertir queda NaN.
df.fillna() / df.dropna()Imputar o eliminar valores nulos.
df.drop_duplicates(subset=[...])Saca filas duplicadas según una clave.
df.astype("category")Convierte una columna a tipo categórico.
pd.to_datetime(col, errors="coerce")Texto a fecha real. Recién ahí podés ordenar cronológicamente o usar .dt.month.
df.sort_values(by=, ascending=False)Ordena por valor. Por defecto es ascendente: "de mayor a menor" necesita ascending=False.
serie.idxmax() / .idxmin()Etiqueta de la fila con el valor máximo o mínimo. Se combina con df.loc[] para traer esa fila entera — max() da el valor, idxmax() da dónde está.

Pandas — combinar y agrupar

pd.concat([...], axis=0)Apila filas de tablas con la misma estructura, sin clave común.
pd.merge(a, b, on=, how=)Relaciona dos tablas por una clave común (como un JOIN de SQL).
df.groupby(col).agg({...})Agregación por grupo (suma, promedio, conteo, etc.).
pd.pivot_table(values=, index=, columns=, aggfunc=)Tabla pivote: cruza dos dimensiones con un valor agregado.

Pandas — formatos de archivo

pd.read_csv(sep=, decimal=, parse_dates=[...])Leer CSV controlando separador, decimal y columnas de fecha.
pd.read_excel(sheet_name=)Leer una hoja (o todas, con sheet_name=None) de un Excel.
pd.read_json() / json_normalize()Leer JSON y aplanar estructuras anidadas a columnas.
df.to_csv(archivo, index=False)Exportar sin escribir el índice como columna extra.
df.to_excel(archivo, index=False)Exportar a Excel. La extensión manda: si el archivo pedido es .csv, va to_csv.
df.to_json(archivo, orient="records")Exportar JSON con un objeto por fila, el formato que esperan las APIs.

Matplotlib

fig, ax = plt.subplots()Crea la figura (lienzo) y el área de dibujo (Axes).
ax.plot() .bar() .hist() .scatter()Línea, barras, histograma, dispersión.
plt.subplots(n, m)Panel con varios gráficos (n×m), indexado axes[i,j].
plt.title() .xlabel() .ylabel()Título y nombre de cada eje. Con la interfaz de Axes llevan prefijo: ax.set_title().
plt.grid(True, alpha=.3)Cuadrícula discreta de fondo.
plt.bar_label(barras)Escribe el valor encima de cada barra. Necesita guardar lo que devuelve plt.bar().
ax.axvline() / ax.axhline()Línea de referencia vertical u horizontal: la media sobre un histograma, el umbral sobre barras.
plt.tight_layout() / plt.show()Acomoda los márgenes para que no se recorten las etiquetas, y muestra la figura.
fig.savefig(archivo, dpi=)Exportar la figura a un archivo de imagen. Siempre antes de show().

Seaborn

sns.heatmap(df.corr(), annot=True)Mapa de calor de correlaciones entre variables numéricas.
sns.boxplot() / sns.stripplot()Distribución por grupo + observaciones individuales superpuestas.
sns.pairplot(df, hue=)Relaciones por pares entre variables numéricas.
sns.scatterplot(hue=, size=, style=)Varias variables codificadas en un mismo gráfico.

Herramienta transversal

Glosario

Definiciones cortas para repaso rápido. El enlace lleva a la clase donde se desarrolla.

astype("category")Clase 04
Convierte una columna a tipo categórico: usa menos memoria y deja claro que son valores discretos. Ver clase 04
broadcastingClase 03
NumPy expande automáticamente arreglos de formas compatibles para operar elemento a elemento (ej. arreglo + escalar). Ver clase 03
cardinalidad (merge)Clase 04
La relación entre las claves de dos tablas al unirlas: 1:1, 1:N o N:M. No validarla puede multiplicar filas sin darte cuenta. Ver clase 04
concat vs mergeClase 04
concat apila (misma estructura, sin clave). merge relaciona (clave común, como un JOIN). Son operaciones distintas que se confunden seguido. Ver clase 04
DataFileError (patrón)Clase 02.1
Excepción propia que envuelve errores técnicos de lectura de archivos con raise ... from exc, para dar un mensaje de dominio claro. Ver clase 02.1
DataFrameClase 03
Estructura tabular de Pandas: filas + columnas con nombre, cada columna puede tener su propio tipo de dato. Ver clase 03
docstring (PEP 257)Clase 02
Cadena de documentación entre """...""" al inicio de módulo/función/clase; se accede con __doc__ o help(). Ver clase 02
dpi / vectorialClase 06
PNG con dpi alto sirve para web/Office; PDF/SVG son vectoriales (no pierden calidad al ampliar), mejores para impresión. Ver clase 06
errors="coerce"Clase 03
Parámetro de pd.to_numeric/pd.to_datetime: lo que no se puede convertir se vuelve NaN/NaT en vez de romper el programa. Ver clase 03
fallar prontoClase 02.1
Principio de manejo de errores: detectar y reportar un problema apenas ocurre, no dejar que se propague silenciosamente. Ver clase 02.1
Figure vs AxesClase 05
Figure es el lienzo completo (puede tener varios gráficos). Axes es el área de dibujo individual dentro de esa figura. Ver clase 05
fit / predict / scoreClase 02.2
Patrón de scikit-learn: fit() entrena, predict() genera predicciones, score() evalúa el modelo. Ver clase 02.2
groupbyClase 03
Agrupa filas por el valor de una columna para aplicar una agregación (suma, promedio, conteo) a cada grupo. Ver clase 03
heatmapClase 06
Mapa de calor: matriz coloreada según un valor numérico, típicamente correlaciones (df.corr()). Ver clase 06
hue / size / styleClase 06
Canales visuales de Seaborn para codificar variables extra en un mismo gráfico: color, tamaño y forma del marcador. Ver clase 06
indicator=TrueClase 04
Parámetro de merge que agrega una columna _merge indicando si cada fila vino de un lado, del otro, o de ambos. Ver clase 04
index=FalseClase 04
Parámetro al exportar (to_csv, etc.) para no escribir el índice del DataFrame como columna extra. Ver clase 04
loc vs ilocClase 03
loc selecciona por etiqueta (incluye ambos extremos del rango). iloc selecciona por posición (excluye el final). Ver clase 03
logging.exception()Clase 02.1
Registra el traceback completo de un error capturado, sin interrumpir el programa ni exponerlo al usuario final. Ver clase 02.1
máscara booleanaClase 03
Indexar un arreglo/Series con una condición (arr[arr >= 18]) para quedarte sólo con lo que la cumple. Ver clase 03
ndarrayClase 03
Estructura base de NumPy: arreglo n-dimensional homogéneo, con ndim, shape, size, dtype. Ver clase 03
pairplotClase 06
Matriz de gráficos con las relaciones por pares entre varias variables numéricas. Lento/difícil de leer con muchas columnas. Ver clase 06
pathlib.PathClase 02
Manejo de rutas de archivo orientado a objetos y multiplataforma, en vez de concatenar strings. Ver clase 02
PEP 8Clase 02
Guía de estilo de Python: indentación de 4 espacios, snake_case, CapWords para clases, imports agrupados. Ver clase 02
pivot_tableClases 03/04
Tabla pivote: cruza dos columnas como filas/columnas nuevas, con un valor agregado en cada celda. Ver clase 04
raise ... from excClase 02
Relanza una excepción nueva (más específica o de dominio) conservando la excepción original como causa. Ver clase 02
SeriesClase 03
Estructura unidimensional de Pandas con índice; una columna de un DataFrame es una Series. Ver clase 03
threshold de binsClase 05
La cantidad de intervalos de un histograma cambia lo que se ve; conviene probar varias opciones, no dejarla arbitraria. Ver clase 05
to_datetimeClase 04
Convierte texto a fecha; dayfirst=True interpreta DD/MM/AAAA, errors="coerce" evita que falle todo por una fecha mala. Ver clase 04
validate= (merge)Clase 04
Parámetro de merge que chequea la cardinalidad esperada (ej. "many_to_one") y falla si no se cumple. Ver clase 04

Herramienta transversal

Flashcards

Repaso activo sobre las 7 clases. Hacé clic en la tarjeta (o apretá Espacio) para ver la respuesta; → pasa a la siguiente.

—

—

Cargando…

clic o Espacio para revelar