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_casepara variables/funciones,CapWordspara clases, imports agrupados al inicio. - PEP 257 / docstrings: triple comilla
"""...""", formato conArgs,Returns,Raises; se accede con__doc__yhelp(). - 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 excpara encadenar y conservar la causa original; excepciones propias heredando deValueError/Exception. - E/S de datos: TXT (
open()), CSV (csv.DictReader), JSON (json.load/json.dump);pathlib.Pathen 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 decalcular_promedio(...)). - Comentarios que repiten el código en vez de explicar la decisión.
except:vacío oexcept Exception: passque oculta bugs reales.- No cerrar archivos (olvidar
with open(...)) ni fijarencoding="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,UnicodeDecodeErrorsegún el caso), cerrar recursos conwith, registrar contexto conlogging.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 conraise ... 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 Exceptionsin registrar ni reelevar. - Ignorar errores (
except: passo 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
forexplícitos. - Indexación y máscaras booleanas:
x[1:3],x[::2],arr[arr >= 18]. - Series y DataFrame:
pd.Series(...),pd.DataFrame({...}); inspección conhead(),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
&/|(nuncaand/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/oren vez de&/|al combinar condiciones en Pandas. - Columna numérica que quedó como
objectpor símbolos o texto mezclado ($ en precios, "dos" en vez de 2) — limpiar antes depd.to_numeric. - Confundir
df.loc[0:2](incluye el 2) condf.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 joininner/left/right/outer;validate="many_to_one";indicator=Truepara 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=Nonepara todas las hojas), SQL (read_sql_querycon parámetros — nunca concatenar), JSON (json_normalizepara aplanar estructuras anidadas). index=Falseal 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
concatconmerge, o alinear por índice conconcat(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=Falseal 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=...), indexadoaxes[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
heatmaporegplot. pairplotcon 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
concatapila (misma estructura, sin clave).mergerelaciona (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__ohelp(). Ver clase 02 - dpi / vectorialClase 06
- PNG con
dpialto 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 vuelveNaN/NaTen 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
Figurees el lienzo completo (puede tener varios gráficos).Axeses 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
mergeque agrega una columna_mergeindicando 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
locselecciona por etiqueta (incluye ambos extremos del rango).ilocselecciona 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,CapWordspara 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=Trueinterpreta DD/MM/AAAA,errors="coerce"evita que falle todo por una fecha mala. Ver clase 04 - validate= (merge)Clase 04
- Parámetro de
mergeque 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