lunes, 27 de abril de 2026

¿Quieres dominar Scikit-Learn con un caso real? 🚢🤖


El dataset del Titanic es el "Hola Mundo" del Machine Learning, pero pocos lo abordan con un flujo de trabajo profesional. Acabo de publicar en mi canal de YouTube una clase donde resolvemos este ejercicio de principio a fin.

No nos limitamos a "entrenar un modelo"; profundizamos en lo que marca la diferencia: ✅ Exploración y limpieza de datos real. ✅ Ingeniería de variables (Feature Selection). ✅ Evaluación del modelo y métricas de supervivencia.

Si estás preparándote para trabajar en Ciencia de Datos, este tipo de proyectos prácticos son los que construyen un portfolio sólido.

📺 Mira el ejercicio completo aquí: https://youtu.be/C2iHKYwVNzU

¡Suscríbete para seguir aprendiendo Machine Learning paso a paso!




viernes, 10 de abril de 2026

¡Domina la eficiencia con Funciones Generadoras y yield! 🧠💾

Seguimos optimizando cómo manejas grandes volúmenes de datos. Ya vimos las List Comprehensions (creación rápida) y las Generator Expressions (ahorro de memoria). Es el momento de llevar ese ahorro a tus propias funciones.

¿Sabías que una función estándar calcula todos los resultados, los guarda en una lista en la RAM y luego te los devuelve? Si la lista es enorme, tu programa puede colapsar por falta de memoria. Mira este contraste visual: import sys # ❌ FUNCIÓN ESTÁNDAR (Guarda todo en RAM) def cuadrado_lista(n): resultado = [] for i in range(n): resultado.append(i * i) return resultado # Devuelve la lista completa n = 10_000_000 # 10 millones p1_lista = cuadrado_lista(n) #print(p1_lista) # ¡Cuidado si lo imprimes! print(f"RAM Lista (estándar): {sys.getsizeof(p1_lista) / 1024 / 1024:.2f} MB") # Salida: ~80-90 MB (dependiendo de tu arquitectura) La alternativa Pythonic es usar una Función Generadora. En lugar de un return final, usas la palabra clave yield dentro de un bucle. yield pausa la ejecución, devuelve el valor actual y "recuerda" el estado para continuar justo donde se quedó la próxima vez que se lo pidas con next(). # ✅ FUNCIÓN GENERADORA (Calcula bajo demanda ✨) def cuadrado_generador(n): for i in range(n): yield i * i # Devuelve el valor, pausa y recuerda estado p2_gen = cuadrado_generador(n) # No calcula nada aún #print(p2_gen) # Salida: <generator object...> print(f"RAM Objeto Generador: {sys.getsizeof(p2_gen)} bytes") # Salida: ~100-200 bytes (¡Prácticamente nada!) ¿Por qué usar yield y Funciones Generadoras? Consumo de RAM ínfimo: Procesas flujos de datos gigabytes o infinitos sin saturar la memoria, ya que solo guardas el estado actual de la función. Cálculo perezoso (Lazy Evaluation): Ideal para procesar archivos línea por línea, data streams, o cuando solo necesitas los primeros resultados de una búsqueda compleja. Encadenamiento elegante: Puedes crear pipelines de datos encadenando generadores para transformaciones eficientes. ¡Deja de acumular datos y empieza a fluir con ellos usando yield! 🚀💾 Más trucos de rendimiento y buenas prácticas aquí 👇 🎥 https://www.youtube.com/@josecodetech/




martes, 7 de abril de 2026

Programacion orientada a objetos con Python

 Hasta ahora le decíamos a Python: "haz esto, imprime aquello". Hoy vamos a cambiar las reglas del juego. 🚀


Acabo de publicar una de las clases más importantes del curso de Python: Programación Orientada a Objetos (POO). Si quieres crear aplicaciones robustas o videojuegos, necesitas dominar este concepto.

En este vídeo te explico de forma súper visual:
🏭 Qué es una Clase (El molde o plano de la fábrica).
🤖 Qué es un Objeto (El robot que nace de ese molde).
🧠 Cómo funciona el método __init__ y la palabra self.

Pasa de escribir simples instrucciones a crear entidades con vida propia y características únicas.

🎥 Tienes la clase completa y paso a paso aquí:

¿Te animas a crear tu primera clase "Mascota" o "Coche" después de ver el vídeo? ¡Te leo en los comentarios! 👇



sábado, 4 de abril de 2026

¡De programador a Científico de Datos! 🚀 Mi nuevo libro de Scikit-Learn ya está disponible.

¿Sientes que el Machine Learning es un mundo de matemáticas imposibles? He publicado "SCIKIT LEARN: Machine Learning Práctico con Python" para demostrarte que no es así. Este libro es el compañero definitivo para mi curso gratuito.

Mientras en los vídeos vemos la implementación en vivo, en el libro tienes la estructura teórica, las fórmulas explicadas y los flujos profesionales (como los Pipelines) para consultar a tu propio ritmo.

¿Cómo aprenderás?

Consigue tu copia  digital en Amazon: 👉 https://www.amazon.es/dp/B0CW17NBGM

¡Gracias por el apoyo de siempre! @josecodetech 👨‍💻 








jueves, 2 de abril de 2026

¡Crea clases de datos limpias y rápidas con dataclasses! 🏗️✨

¿Sigues escribiendo clases simples para almacenar datos y te pasas la mitad del tiempo definiendo métodos repetitivos como __init__, __repr__, y __eq__?


Ese código "boilerplate" (repetitivo) hace que tus clases sean largas, difíciles de leer y propensas a errores si añades un campo nuevo y olvidas actualizar los métodos.

Mira este ejemplo tradicional de una clase Producto:

# ❌ MÉTODO ANTIGUO (Verboso y repetitivo)
class ProductoTradicional:
def __init__(self, nombre: str, precio: float, stock: int):
self.nombre = nombre
self.precio = precio
self.stock = stock

def __repr__(self):
# Necesario para que print() muestre algo útil
return f"Producto(nombre='{self.nombre}', precio={self.precio}, stock={self.stock})"

def __eq__(self, other):
# Necesario para comparar si dos productos son iguales
if not isinstance(other, ProductoTradicional):
return NotImplemented
return (self.nombre, self.precio, self.stock) == (other.nombre, other.precio, other.stock)

p1 = ProductoTradicional("Teclado", 49.99, 10)
print(p1) # Producto(nombre='Teclado', precio=49.99, stock=10)
¡Es demasiado código para algo tan simple! Python 3.7 introdujo la solución perfecta: el decorador @dataclass.


# ✅ CON DATACLASSES (Limpio y Automático ✨)
from dataclasses import dataclass

@dataclass
class ProductoModerno:
nombre: str
precio: float
stock: int

# ¡Python genera automáticamente __init__, __repr__, __eq__ y más!
p2 = ProductoModerno("Teclado", 49.99, 10)
print(p2) # ProductoModerno(nombre='Teclado', precio=49.99, stock=10)
print(p1 == p2) # False (son clases distintas, pero la comparación funciona)
¿Por qué debes usar dataclasses?

Cero Boilerplate: Escribes solo los campos y sus tipos. Python se encarga del resto.

Legibilidad extrema: Tu clase se centra en los datos, no en la implementación de métodos estándar.

Funciones avanzadas gratis: Puedes hacerlas inmutables fácilmente (frozen=True) o añadir ordenación automática (order=True).

¡Deja que Python escriba el código aburrido por ti y céntrate en la lógica de tu aplicación! 🚀🏗️

Más trucos avanzados de Python aquí 👇





viernes, 27 de febrero de 2026

🚀 ¡Domina GIT de una vez por todas y certifica tus conocimientos! 💻🔥


Si trabajas escribiendo código (ya sea en equipo o tú solo), no saber usar GIT es como escribir un libro sin ir guardando los cambios. ¡Es la herramienta obligatoria para cualquier desarrollador!

Para ayudarte a dar el paso, acabo de activar el cupón JOSECODETECHFEB26 en mi curso "GIT para Desarrolladores" en Udemy. Con este enlace tienes garantizado el MEJOR PRECIO disponible y, al terminar, obtendrás tu Certificado Oficial de Udemy para lucir en tu currículum o LinkedIn. 🎓

👇 Aprovecha el descuento máximo aquí: 🔗 https://www.udemy.com/course/git-para-desarrolladores/?couponCode=JOSECODETECHFEB26


🎁 ¿QUIERES MÁS RECURSOS GRATUITOS? Mi objetivo es que nunca dejes de aprender, por eso te recuerdo que tienes a tu disposición:

📂 Mi Repositorio de GitHub: Todo el código y los ejemplos que utilizo en mis cursos están en abierto para que los descargues y practiques por tu cuenta. 👉 https://github.com/josecodetech

📺 Mi Canal de YouTube: Decenas de vídeos, tutoriales y cursos completos (¡como el de Machine Learning!) totalmente gratis. 👉 https://www.youtube.com/@josecodetech


🙏 ¡UN PEQUEÑO FAVOR! Crear todo este contenido, tanto el gratuito como el premium, lleva muchísimas horas de dedicación. La mejor forma de apoyarme para que pueda seguir creando material es compartiendo esta publicación, recomendándola a tus compañeros de sector, o simplemente dejando un "Me gusta" y un comentario. ¡Me ayuda muchísimo a llegar a más gente! 🔄💙

¡Nos vemos en la terminal de comandos! 👨‍💻👩‍💻




domingo, 15 de febrero de 2026

One Hot Encoding

 Estoy avanzando a toda máquina con la creación de mi nuevo curso de Machine Learning con Python, basado en mi próximo libro. Hoy he subido el Capítulo 5 y quiero compartir un adelanto exclusivo con mi comunidad más cercana, solo para suscriptores del canal.


En este episodio abordamos uno de los problemas más comunes al preparar datos: ¿Cómo hacemos que un algoritmo entienda palabras como "Rojo", "Verde" o "Azul"? 🎨➡️🔢

Las máquinas solo entienden números, y aquí es donde entra en juego el One Hot Encoding.

🚀 Estado del Curso:
El curso completo se lanzará al público general en Mayo, pero si quieres ir aprendiendo y viendo el progreso paso a paso, ya puedes acceder al contenido de forma anticipada.

📽️ Mira el video 5 aquí: https://www.youtube.com/watch?v=cPF20XACsgM

¿Utilizáis get_dummies de Pandas o preferís OneHotEncoder de Scikit-learn? En el vídeo os cuento por qué prefiero el segundo para producción. 😉



martes, 10 de febrero de 2026

¡Haz tus funciones legibles con NamedTuple! 🏷️🧐

¿Alguna vez has tenido una función que devuelve varios valores y luego no recuerdas qué era cada cosa?


# ❌ El problema: ¿Qué es el 200? ¿Qué es el 50?
resultado = obtener_dimensiones()
ancho = resultado[0]
alto = resultado[1]
Usar índices ([0], [1]) es confuso y propenso a errores. Podrías usar un diccionario, pero los diccionarios son mutables y más pesados. ¡La solución elegante es NamedTuple!

NamedTuple te permite crear pequeñas estructuras de datos donde cada posición tiene un nombre. Es como una tupla, ¡pero con etiquetas!

Mira la diferencia:

from typing import NamedTuple

# ✅ Definimos la estructura
class Dimensiones(NamedTuple):
ancho: int
alto: int
unidad: str

def obtener_pantalla():
return Dimensiones(1920, 1080, "px")

# ¡Ahora el código se explica solo!
pantalla = obtener_pantalla()

print(f"Resolución: {pantalla.ancho}x{pantalla.alto} {pantalla.unidad}")
# Salida: Resolución: 1920x1080 px
¿Por qué usar NamedTuple?

Legibilidad total: Accedes por nombre (pantalla.ancho) no por índice.

Inmutable: Los datos no se pueden cambiar por accidente, lo que evita bugs.

Ligero: Consume mucha menos memoria que una clase normal o un diccionario.

Auto-completado: Tu editor de código (VS Code, PyCharm) te sugerirá los nombres de los campos.

¡Deja de adivinar qué hay en la posición [0] y empieza a usar nombres! 🚀

Más trucos de Pythonic Code aquí 👇



domingo, 8 de febrero de 2026

Control de excepciones

 💥 ¿Tu programa de Python "explota" y se cierra cuando el usuario mete un dato incorrecto? ¡Qué rabia!


Te enseño a ponerle una RED DE SEGURIDAD a tu código.
🕸️ Aprende a usar try, except y finally para que tus aplicaciones sean profesionales y a prueba de fallos.





sábado, 7 de febrero de 2026

🖥️ Mi pantalla ahora mismo: El combo definitivo.



A la izquierda ▶️: El curso en vídeo subiéndose al canal. A la derecha 📖: El manuscrito final del libro "Python Para Todos".

Llevo tiempo queriendo crear algo que cierre el círculo del aprendizaje. A veces necesitas leer para entender la lógica y otras necesitas ver cómo se escribe el código en tiempo real.

Con este proyecto, no tienes que elegir. He sincronizado ambos mundos para llevarte de Cero a Programador sin que te pierdas en el camino.

Fijaos en la portada del libro... 🤖 ¿Os gusta el estilo?

Ya falta muy poco para el lanzamiento oficial. Suscríbete al canal (link en la imagen) para ser el primero en enterarte.