#Fundamentos del Control de Flujo

x = 5
y = 3
resultado = x + y
print(resultado)
## 8

###Valores logicos

# Los dos valores lógicos fundamentales
verdadero = True
falso = False

# Verificar su clase
print(type(True))  # <class 'bool'>
## <class 'bool'>

# En Python no existen abreviaciones T y F
tambien_verdadero = True
tambien_falso = False

###Operadores de comparacion

# Operador de igualdad (==)
print(5 == 5)        # True
## True
print(5 == 3)        # False
## False
print("hola" == "hola")   # True
## True
print("Hola" == "hola")   # False (Python también distingue mayúsculas y minúsculas)
## False
# Operador de desigualdad (!=)
print(5 != 3)        # True
## True
print(5 != 5)        # False
## False
print("gato" != "perro")  # True
## True

Operador de desigualdad (!=)

print(5 != 3)        # True
## True
print(5 != 5)        # False
## False
print("gato" != "perro")  # True
## True
# Mayor que (>)
print(10 > 5)   # True
## True
print(3 > 8)    # False
## False
# Menor que (<)
print(2 < 7)    # True
## True
print(9 < 4)    # False
## False
# Mayor o igual que (>=)
print(5 >= 5)   # True
## True
print(5 >= 3)   # True
## True
print(2 >= 6)   # False
## False
# Menor o igual que (<=)
print(4 <= 4)   # True
## True
print(3 <= 7)   # True
## True
print(8 <= 2)   # False
## False
edad = 25
limite = 18

# Comparaciones con variables
print(edad > limite)      # True
## True
print(edad == limite)     # False
## False
print(edad >= limite)     # True
## True
precio = 150.00
descuento_minimo = 100.00
print(precio >= descuento_minimo)  # True
## True

Operadores logicos ###El Operador AND (&)

# Tabla de verdad del operador &
print(True & True)     # True
## True
print(True & False)    # False
## False
print(False & True)    # False
## False
print(False & False)   # False
## False
# Ejemplo práctico
edad = 25
tiene_licencia = True

# ¿Puede alquilar un auto? (debe ser mayor de 21 Y tener licencia)
puede_alquilar = (edad >= 21) & tiene_licencia
print(puede_alquilar)  # True
## True

###El Operador OR (|)

# Tabla de verdad del operador |
print(True | True)     # True
## True
print(True | False)    # True
## True
print(False | True)    # True
## True
print(False | False)   # False
## False
# Ejemplo práctico
es_estudiante = False
es_senior = True

# ¿Tiene descuento? (si es estudiante O es senior)
tiene_descuento = es_estudiante | es_senior
print(tiene_descuento)  # True
## True

###El Operador NOT (!)

# El operador NOT
print(not True)   # False
## False
print(not False)  # True
## True
# Ejemplo práctico
esta_lloviendo = False
salir_sin_paraguas = not esta_lloviendo
print(salir_sin_paraguas)  # True
## True

###Combinaciones Complejas

# Multiples condiciones combinadas
temperatura = 22
esta_soleado = True
es_fin_de_semana = True

# ¿Es buen dia para un futbol?
buen_dia_futbol = (temperatura >= 20) & esta_soleado & es_fin_de_semana
print(buen_dia_futbol)  # True
## True
# Usando parentesis para claridad
nota1 = 85
nota2 = 78
asistencia = 95

aprobado = ((nota1 >= 70) & (nota2 >= 70)) & (asistencia >= 80)
print(aprobado)  # True
## True

Estructuras Condicionales ###Estructura General

# if condición:
#     código a ejecutar si la condición es True

ejemplo

temperatura = 30

if temperatura > 25:
    print("Hace calor hoy")
## Hace calor hoy

###Verificación de Edad

edad = 18

if edad >= 18:
    print("Puedes votar en las elecciones")
    print("También puedes obtener una licencia de conducir")
## Puedes votar en las elecciones
## También puedes obtener una licencia de conducir

###Control de Inventario

stock = 25
stock_minimo = 10

if stock < stock_minimo:
    print("¡ALERTA! Stock bajo - necesita reabastecimiento")
    urgente = True

# En este caso, como 25 >= 10, no se ejecuta el if

###Validación de Datos

salario = 50000

if salario > 0:
    print("Salario válido registrado")
    salario_mensual = salario / 12
    print("Salario mensual:", round(salario_mensual, 2))
## Salario válido registrado
## Salario mensual: 4166.67

###Forma Compacta

# Con indentación (obligatorio en Python)
if temperatura > 30:
    print("Día muy caluroso")

# En Python también puedes ponerlo en una sola línea:
if temperatura > 30: print("Día muy caluroso")

Nota importante: Siempre usar llaves cuando tengas múltiples instrucciones:

# Definir la variable
es_viernes = True

# CORRECTO en Python: múltiples instrucciones con indentación
if es_viernes:
    print("¡Por fin viernes!")
    preparar_fin_de_semana = True
    revisar_agenda_lunes = True
## ¡Por fin viernes!
# En Python, la indentación controla qué se ejecuta dentro del if.
# Si escribes mal la indentación, el código se comportará distinto:
if es_viernes:
    print("¡Por fin viernes!")
## ¡Por fin viernes!
preparar_fin_de_semana = True  # Esta línea SIEMPRE se ejecuta

###Casos de Uso

nivel_bateria = 15

if nivel_bateria <= 20:
    print("ADVERTENCIA: Batería baja")
    if nivel_bateria <= 10:
        print("CRÍTICO: Conectar cargador inmediatamente")
        modo_ahorro_energia = True
## ADVERTENCIA: Batería baja

###Procesamiento Condicional de Datos

import numpy as np

datos_usuario = np.array([23, 45, 67, np.nan, 89, 12])

if np.isnan(datos_usuario).any():
    print("Detectados valores faltantes en los datos")
    
    # Contar valores faltantes
    valores_na = np.isnan(datos_usuario).sum()
    print("Número de valores NA:", valores_na)
    
    # Crear versión limpia de los datos
    datos_limpios = datos_usuario[~np.isnan(datos_usuario)]
    print("Datos limpios:", ", ".join(map(str, datos_limpios.astype(int))))
## Detectados valores faltantes en los datos
## Número de valores NA: 1
## Datos limpios: 23, 45, 67, 89, 12

##Declaraciones else ###Estructura General

# if condición:
#     código si la condición es True
# else:
#     código si la condición es False

ejemplo

edad = 16

if edad >= 18:
    print("Eres mayor de edad")
    print("Puedes votar")
else:
    print("Eres menor de edad")
    print("Aún no puedes votar")
## Eres menor de edad
## Aún no puedes votar

###Método 1: Asignación Dentro de Cada Bloque

nota = 75

if nota >= 70:
    resultado = "Aprobado"
    mensaje = "¡Felicitaciones!"
else:
    resultado = "Reprobado"
    mensaje = "Necesitas estudiar más"

print(resultado)  # "Aprobado"
## Aprobado
print(mensaje)    # "¡Felicitaciones!"
## ¡Felicitaciones!

###Método 2: Asignación del Resultado Completo

# Operador ternario en Python
nota = 65
estado = "Aprobado" if nota >= 70 else "Reprobado"
print(estado)  # "Reprobado"
## Reprobado
# Ejemplo más complejo
precio_base = 100
es_miembro = True
precio_final = precio_base * 0.9 if es_miembro else precio_base
print(precio_final)  # 90
## 90.0

###Sistema de Calificación de Crédito

puntaje_credito = 650

if puntaje_credito >= 700:
    categoria = "Excelente"
    tasa_interes = 3.5
    limite_credito = 50000
    aprobacion_automatica = True
else:
    categoria = "Regular"
    tasa_interes = 8.5
    limite_credito = 15000
    aprobacion_automatica = False

print("Categoría:", categoria)
## Categoría: Regular
print("Tasa de interés:", f"{tasa_interes}%")
## Tasa de interés: 8.5%
print("Límite de crédito: $", limite_credito)
## Límite de crédito: $ 15000
print("Aprobación automática:", aprobacion_automatica)
## Aprobación automática: False

###Calculadora de Descuentos

monto_compra = 150
descuento_aplicado = 0

if monto_compra >= 100:
    descuento_aplicado = monto_compra * 0.15  # 15% de descuento
    tipo_descuento = "Compra Mayor"
    puntos_ganados = monto_compra * 2  # Doble puntos
else:
    descuento_aplicado = 0
    tipo_descuento = "Sin descuento"
    puntos_ganados = monto_compra  # Puntos normales

monto_final = monto_compra - descuento_aplicado

print("Monto original: $", monto_compra)
## Monto original: $ 150
print("Descuento: $", round(descuento_aplicado, 2))
## Descuento: $ 22.5
print("Monto final: $", round(monto_final, 2))
## Monto final: $ 127.5
print("Tipo:", tipo_descuento)
## Tipo: Compra Mayor
print("Puntos ganados:", puntos_ganados)
## Puntos ganados: 300

###Sistema de Recomendación de Ropa

temperatura = 18
precipitacion = 0  # mm de lluvia

if temperatura >= 25:
    ropa_recomendada = "Camiseta y pantalón corto"
    accesorios = ["gorra", "lentes de sol"]
    calzado = "sandalias o tenis ligeros"
else:
    ropa_recomendada = "Suéter y pantalón largo"
    accesorios = ["bufanda", "guantes"]
    calzado = "zapatos cerrados"

# Verificar lluvia independientemente de la temperatura
if precipitacion > 0:
    accesorios.extend(["paraguas", "impermeable"])
    calzado = "botas impermeables"

print("Ropa recomendada:", ropa_recomendada)
## Ropa recomendada: Suéter y pantalón largo
print("Accesorios:", ", ".join(accesorios))
## Accesorios: bufanda, guantes
print("Calzado:", calzado)
## Calzado: zapatos cerrados

###Validación y Manejo de Errores

dividendo = 10
divisor = 3

if divisor != 0:
    resultado = dividendo / divisor
    print(f"El resultado de {dividendo} ÷ {divisor} es: {round(resultado, 2)}")
else:
    print("Error: No se puede dividir por cero")
    resultado = None  # En Python se usa None en lugar de NA
## El resultado de 10 ÷ 3 es: 3.33
entrada_usuario = "123"

# En Python las cadenas siempre son str, así que probamos convertir
try:
    numero_convertido = float(entrada_usuario)
    print("Entrada válida: es un número")
    numero_procesado = numero_convertido * 2
    print(f"Resultado: {numero_procesado}")
except ValueError:
    print("Entrada inválida: no es un número")
    numero_procesado = 0
## Entrada válida: es un número
## Resultado: 246.0
from datetime import datetime

usuario_ingresado = "admin"
password_ingresado = "12345"

# Credenciales correctas (en un sistema real estarían encriptadas)
usuario_correcto = "admin"
password_correcto = "admin123"

if usuario_ingresado == usuario_correcto and password_ingresado == password_correcto:
    print("Acceso concedido")
    sesion_activa = True
    tiempo_sesion = datetime.now()
    permisos = ["leer", "escribir", "administrar"]
    print(f"Bienvenido, {usuario_correcto}")
    print(f"Hora de inicio de sesión: {tiempo_sesion}")
else:
    print("Acceso denegado: credenciales incorrectas")
    sesion_activa = False
    intentos_fallidos = 1  # En un sistema real, incrementarías un contador
    
    # Determinar qué falló
    if usuario_ingresado != usuario_correcto:
        print("Usuario incorrecto")
    if password_ingresado != password_correcto:
        print("Contraseña incorrecta")
## Acceso denegado: credenciales incorrectas
## Contraseña incorrecta

estructura generales

# if (primera_condición):
#     # código para primera condición
# elif (segunda_condición):
#     # código para segunda condición
# elif (tercera_condición):
#     # código para tercera condición
# else:
#     # código si ninguna condición anterior fue verdadera

ejemplo

nota = 85

if nota >= 90:
    calificacion = "A"
    comentario = "Excelente trabajo"
elif nota >= 80:  # Solo se evalúa si nota < 90
    calificacion = "B"
    comentario = "Muy buen trabajo"
elif nota >= 70:  # Solo se evalúa si nota < 80
    calificacion = "C"
    comentario = "Trabajo satisfactorio"
elif nota >= 60:  # Solo se evalúa si nota < 70
    calificacion = "D"
    comentario = "Necesita mejorar"
else:  # Solo se ejecuta si nota < 60
    calificacion = "F"
    comentario = "Debe repetir el curso"

print(f"Calificación: {calificacion}")
## Calificación: B
print(comentario)
## Muy buen trabajo
numero = 75

# CORRECTO: de mayor a menor
if numero >= 90:
    categoria = "Muy alto"
elif numero >= 70:  # 75 >= 70 es True, se ejecuta aquí
    categoria = "Alto"  # Resultado correcto
elif numero >= 50:
    categoria = "Medio"  # Ya no se evalúa
else:
    categoria = "Bajo"

print(categoria)  # "Alto"
## Alto
# INCORRECTO: de menor a mayor
if numero >= 50:  # 75 >= 50 es True, se ejecuta aquí
    categoria_mala = "Medio"  # Resultado incorrecto
elif numero >= 70:
    categoria_mala = "Alto"  # Nunca se ejecuta
elif numero >= 90:
    categoria_mala = "Muy alto"  # Nunca se ejecuta

print(categoria_mala)  # "Medio"
## Medio
peso = 70  # kg
altura = 1.75  # metros

imc = peso / (altura ** 2)

if imc < 18.5:
    categoria = "Bajo peso"
    recomendacion = "Consulte con un nutricionista para ganar peso saludablemente"
    color_alerta = "azul"
elif imc < 25:
    categoria = "Peso normal"
    recomendacion = "Mantenga su estilo de vida saludable"
    color_alerta = "verde"
elif imc < 30:
    categoria = "Sobrepeso"
    recomendacion = "Considere aumentar la actividad física y mejorar la dieta"
    color_alerta = "amarillo"
elif imc < 35:
    categoria = "Obesidad clase I"
    recomendacion = "Consulte con un médico para un plan de pérdida de peso"
    color_alerta = "naranja"
elif imc < 40:
    categoria = "Obesidad clase II"
    recomendacion = "Es importante consultar con un médico especialista"
    color_alerta = "rojo"
else:
    categoria = "Obesidad clase III (mórbida)"
    recomendacion = "Consulte urgentemente con un médico especialista"
    color_alerta = "rojo_intenso"

print(f"IMC: {round(imc, 2)}")
## IMC: 22.86
print(f"Categoría: {categoria}")
## Categoría: Peso normal
print(f"Recomendación: {recomendacion}")
## Recomendación: Mantenga su estilo de vida saludable
print(f"Nivel de alerta: {color_alerta}")
## Nivel de alerta: verde
consumo_kwh = 250  # kilowatts-hora consumidos

# Tarifas escalonadas (precios por kWh)
if consumo_kwh <= 100:
    # Tarifa básica: primeros 100 kWh
    tarifa = 0.12
    costo = consumo_kwh * tarifa
    tipo_usuario = "Básico"
elif consumo_kwh <= 200:
    # Tarifa intermedia: de 101 a 200 kWh
    costo_basico = 100 * 0.12
    consumo_intermedio = consumo_kwh - 100
    costo_intermedio = consumo_intermedio * 0.18
    costo = costo_basico + costo_intermedio
    tipo_usuario = "Intermedio"
elif consumo_kwh <= 300:
    # Tarifa alta: de 201 a 300 kWh
    costo_basico = 100 * 0.12
    costo_intermedio = 100 * 0.18
    consumo_alto = consumo_kwh - 200
    costo_alto = consumo_alto * 0.25
    costo = costo_basico + costo_intermedio + costo_alto
    tipo_usuario = "Alto"
else:
    # Tarifa muy alta: más de 300 kWh
    costo_basico = 100 * 0.12
    costo_intermedio = 100 * 0.18
    costo_alto = 100 * 0.25
    consumo_muy_alto = consumo_kwh - 300
    costo_muy_alto = consumo_muy_alto * 0.32
    costo = costo_basico + costo_intermedio + costo_alto + costo_muy_alto
    tipo_usuario = "Muy Alto"

print(f"Consumo: {consumo_kwh} kWh")
## Consumo: 250 kWh
print(f"Tipo de usuario: {tipo_usuario}")
## Tipo de usuario: Alto
print(f"Costo total: ${round(costo, 2)}")
## Costo total: $42.5
print(f"Precio promedio por kWh: ${round(costo / consumo_kwh, 4)}")
## Precio promedio por kWh: $0.17
# Datos del estudiante
nota_examenes = 85
nota_tareas = 78
asistencia = 95
participacion = 88
proyecto_final = 92

# Cálculo de nota ponderada
nota_final = (
    (nota_examenes * 0.4) +
    (nota_tareas * 0.25) +
    (asistencia * 0.1) +
    (participacion * 0.1) +
    (proyecto_final * 0.15)
)

# Determinar calificación letra, puntos, descripción y mención
if nota_final >= 95:
    letra = "A+"
    puntos = 4.0
    descripcion = "Excelencia sobresaliente"
    mencion = "Suma Cum Laude"
elif nota_final >= 90:
    letra = "A"
    puntos = 4.0
    descripcion = "Excelente desempeño"
    mencion = "Magna Cum Laude"
elif nota_final >= 87:
    letra = "A-"
    puntos = 3.7
    descripcion = "Muy buen desempeño"
    mencion = "Cum Laude"
elif nota_final >= 83:
    letra = "B+"
    puntos = 3.3
    descripcion = "Buen desempeño superior"
    mencion = "Sin mención especial"
elif nota_final >= 80:
    letra = "B"
    puntos = 3.0
    descripcion = "Buen desempeño"
    mencion = "Sin mención especial"
elif nota_final >= 77:
    letra = "B-"
    puntos = 2.7
    descripcion = "Desempeño satisfactorio superior"
    mencion = "Sin mención especial"
elif nota_final >= 73:
    letra = "C+"
    puntos = 2.3
    descripcion = "Desempeño satisfactorio"
    mencion = "Sin mención especial"
elif nota_final >= 70:
    letra = "C"
    puntos = 2.0
    descripcion = "Desempeño mínimo aceptable"
    mencion = "Sin mención especial"
elif nota_final >= 65:
    letra = "D"
    puntos = 1.0
    descripcion = "Desempeño deficiente"
    mencion = "Requiere recuperación"
else:
    letra = "F"
    puntos = 0.0
    descripcion = "Desempeño insuficiente"
    mencion = "Debe repetir el curso"

# Modificadores por asistencia
if asistencia < 75:
    mencion += " - BAJA ASISTENCIA"
    if puntos > 0:
        puntos -= 0.5  # Penalización

# Reporte académico
print("=== REPORTE ACADÉMICO ===")
## === REPORTE ACADÉMICO ===
print(f"Nota final: {round(nota_final, 2)}")
## Nota final: 85.6
print(f"Calificación: {letra}")
## Calificación: B+
print(f"Puntos GPA: {puntos}")
## Puntos GPA: 3.3
print(f"Descripción: {descripcion}")
## Descripción: Buen desempeño superior
print(f"Mención: {mencion}")
## Mención: Sin mención especial
print("========================")
## ========================

#Sistema de Clasificación Meteorológica

temperatura = 22
humedad = 65
velocidad_viento = 15  # km/h
precipitacion = 2  # mm

# Clasificación principal por temperatura
if temperatura < -10:
    clima_base = "Extremadamente frío"
    actividades = "Permanecer en interiores"
elif temperatura < 0:
    clima_base = "Muy frío"
    actividades = "Deportes de invierno, ropa térmica"
elif temperatura < 10:
    clima_base = "Frío"
    actividades = "Caminatas con abrigo, actividades interiores"
elif temperatura < 20:
    clima_base = "Fresco"
    actividades = "Senderismo, actividades al aire libre con chaqueta"
elif temperatura < 25:
    clima_base = "Templado"
    actividades = "Ideal para todas las actividades al aire libre"
elif temperatura < 30:
    clima_base = "Cálido"
    actividades = "Playa, piscina, deportes acuáticos"
elif temperatura < 35:
    clima_base = "Caluroso"
    actividades = "Actividades acuáticas, evitar ejercicio intenso"
else:
    clima_base = "Extremadamente caluroso"
    actividades = "Permanecer en interiores con aire acondicionado"

print(f"Clima base: {clima_base}")
## Clima base: Templado
print(f"Actividades recomendadas: {actividades}")
## Actividades recomendadas: Ideal para todas las actividades al aire libre
import pandas as pd
import numpy as np


# Vector de números
numeros = np.array([-3, -1, 0, 2, 5, -7, 8])

# Aplicar condición a todo el vector
signos = np.where(numeros >= 0, "No negativo", "Negativo")

# Crear DataFrame
resultado = pd.DataFrame({
    "numero": numeros,
    "signo": signos
})

print(resultado)
##    numero        signo
## 0      -3     Negativo
## 1      -1     Negativo
## 2       0  No negativo
## 3       2  No negativo
## 4       5  No negativo
## 5      -7     Negativo
## 6       8  No negativo
# Lista de números
numeros = [-3, -1, 0, 2, 5, -7, 8]

# Método tradicional con bucle
signos_bucle = []
for num in numeros:
    if num >= 0:
        signos_bucle.append("No negativo")
    else:
        signos_bucle.append("Negativo")

# Mostrar resultados
print(signos_bucle)
## ['Negativo', 'Negativo', 'No negativo', 'No negativo', 'No negativo', 'Negativo', 'No negativo']

# Comparación con otra lista de signos (si ya tienes la lista signos)
# Por ejemplo, si signos = ["Negativo", "Negativo", "No negativo", ...]
# print(signos_bucle == signos)  # True si son iguales

###Usando ifelse (Método Eficiente)

# Lista de números
numeros = [-3, -1, 0, 2, 5, -7, 8]

# Método "vectorizado" con comprensión de listas
signos_ifelse = ["No negativo" if num >= 0 else "Negativo" for num in numeros]

# Mostrar resultados
print(signos_ifelse)
## ['Negativo', 'Negativo', 'No negativo', 'No negativo', 'No negativo', 'Negativo', 'No negativo']
# Comparación con el método con bucle
signos_bucle = []
for num in numeros:
    if num >= 0:
        signos_bucle.append("No negativo")
    else:
        signos_bucle.append("Negativo")

print(signos_bucle == signos_ifelse)  # True si son iguales
## True

###Clasificación de Estudiantes

import pandas as pd

# Datos de estudiantes
estudiantes = ["Ana", "Pedro", "Luis", "María", "Carlos", "Sofia", "Diego", "Laura"]
notas = [95, 67, 82, 88, 45, 91, 73, 79]

# Clasificación simple: Aprobado/Reprobado usando comprensión de listas
estado = ["Aprobado" if nota >= 70 else "Reprobado" for nota in notas]

# Crear DataFrame con resultados
reporte_estudiantes = pd.DataFrame({
    "nombre": estudiantes,
    "nota": notas,
    "estado": estado
})

print(reporte_estudiantes)
##    nombre  nota     estado
## 0     Ana    95   Aprobado
## 1   Pedro    67  Reprobado
## 2    Luis    82   Aprobado
## 3   María    88   Aprobado
## 4  Carlos    45  Reprobado
## 5   Sofia    91   Aprobado
## 6   Diego    73   Aprobado
## 7   Laura    79   Aprobado
# Datos de estudiantes
estudiantes = ["Ana", "Pedro", "Luis", "María", "Carlos", "Sofia", "Diego", "Laura"]
notas = [95, 67, 82, 88, 45, 91, 73, 79]

# Clasificación simple
estado = ["Aprobado" if nota >= 70 else "Reprobado" for nota in notas]

# Información adicional
necesita_recuperacion = ["Sí" if nota < 70 else "No" for nota in notas]
excelencia = ["Excelente" if nota >= 90 else "Regular" for nota in notas]

# Crear lista de diccionarios (similar a un DataFrame)
reporte_estudiantes = []
for i in range(len(estudiantes)):
    reporte_estudiantes.append({
        "nombre": estudiantes[i],
        "nota": notas[i],
        "estado": estado[i],
        "necesita_recuperacion": necesita_recuperacion[i],
        "excelencia": excelencia[i]
    })

# Mostrar resultados
for alumno in reporte_estudiantes:
    print(alumno)
## {'nombre': 'Ana', 'nota': 95, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Excelente'}
## {'nombre': 'Pedro', 'nota': 67, 'estado': 'Reprobado', 'necesita_recuperacion': 'Sí', 'excelencia': 'Regular'}
## {'nombre': 'Luis', 'nota': 82, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Regular'}
## {'nombre': 'María', 'nota': 88, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Regular'}
## {'nombre': 'Carlos', 'nota': 45, 'estado': 'Reprobado', 'necesita_recuperacion': 'Sí', 'excelencia': 'Regular'}
## {'nombre': 'Sofia', 'nota': 91, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Excelente'}
## {'nombre': 'Diego', 'nota': 73, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Regular'}
## {'nombre': 'Laura', 'nota': 79, 'estado': 'Aprobado', 'necesita_recuperacion': 'No', 'excelencia': 'Regular'}

###ifelse Anidado para Múltiples Categorías Puedes anidar múltiples ifelse para crear clasificaciones más complejas:

import pandas as pd

# Datos de ejemplo
edades = [5, 12, 15, 18, 25, 35, 45, 55, 65, 75, 85]

# Clasificación de edades usando comprensión de listas anidada
categorias = [
    "Niño" if edad < 13 else
    "Adolescente" if edad < 18 else
    "Joven adulto" if edad < 25 else
    "Adulto" if edad < 65 else
    "Adulto mayor"
    for edad in edades
]

# Crear DataFrame
clasificacion_edades = pd.DataFrame({
    "edad": edades,
    "categoria": categorias
})

print(clasificacion_edades)
##     edad     categoria
## 0      5          Niño
## 1     12          Niño
## 2     15   Adolescente
## 3     18  Joven adulto
## 4     25        Adulto
## 5     35        Adulto
## 6     45        Adulto
## 7     55        Adulto
## 8     65  Adulto mayor
## 9     75  Adulto mayor
## 10    85  Adulto mayor
import pandas as pd

# Datos de ejemplo
edades = [5, 12, 15, 18, 25, 35, 45, 55, 65, 75, 85]

# Clasificación de edades
categorias = [
    "Niño" if edad < 13 else
    "Adolescente" if edad < 18 else
    "Joven adulto" if edad < 25 else
    "Adulto" if edad < 65 else
    "Adulto mayor"
    for edad in edades
]

# Recomendaciones específicas
recomendaciones = [
    "Educación primaria y juegos" if edad < 13 else
    "Educación secundaria" if edad < 18 else
    "Educación superior o trabajo" if edad < 25 else
    "Vida laboral activa" if edad < 65 else
    "Jubilación y cuidados"
    for edad in edades
]

# Crear DataFrame
clasificacion_edades = pd.DataFrame({
    "edad": edades,
    "categoria": categorias,
    "recomendacion": recomendaciones
})

print(clasificacion_edades)
##     edad     categoria                 recomendacion
## 0      5          Niño   Educación primaria y juegos
## 1     12          Niño   Educación primaria y juegos
## 2     15   Adolescente          Educación secundaria
## 3     18  Joven adulto  Educación superior o trabajo
## 4     25        Adulto           Vida laboral activa
## 5     35        Adulto           Vida laboral activa
## 6     45        Adulto           Vida laboral activa
## 7     55        Adulto           Vida laboral activa
## 8     65  Adulto mayor         Jubilación y cuidados
## 9     75  Adulto mayor         Jubilación y cuidados
## 10    85  Adulto mayor         Jubilación y cuidados
import pandas as pd

# Datos de calificaciones
materias = ["Matemáticas", "Ciencias", "Historia", "Literatura", "Arte", "Deportes"]
puntuaciones = [95, 78, 85, 92, 68, 88]

# Sistema de calificación con letras
calificaciones_letra = [
    "A+" if p >= 95 else
    "A" if p >= 90 else
    "B+" if p >= 85 else
    "B" if p >= 80 else
    "C+" if p >= 75 else
    "C" if p >= 70 else
    "F"
    for p in puntuaciones
]

# Determinar estado
estado_materia = ["Aprobada" if p >= 70 else "Reprobada" for p in puntuaciones]

# Calcular puntos GPA
puntos_gpa = [
    4.0 if p >= 95 else
    4.0 if p >= 90 else
    3.5 if p >= 85 else
    3.0 if p >= 80 else
    2.5 if p >= 75 else
    2.0 if p >= 70 else
    0.0
    for p in puntuaciones
]

# Crear DataFrame
reporte_academico = pd.DataFrame({
    "materia": materias,
    "puntuacion": puntuaciones,
    "letra": calificaciones_letra,
    "estado": estado_materia,
    "gpa": puntos_gpa
})

print(reporte_academico)
##        materia  puntuacion letra     estado  gpa
## 0  Matemáticas          95    A+   Aprobada  4.0
## 1     Ciencias          78    C+   Aprobada  2.5
## 2     Historia          85    B+   Aprobada  3.5
## 3   Literatura          92     A   Aprobada  4.0
## 4         Arte          68     F  Reprobada  0.0
## 5     Deportes          88    B+   Aprobada  3.5
import pandas as pd

# --- Bloque 1: Estadísticas generales de calificaciones ---
puntuaciones = [95, 78, 85, 92, 68, 88]
puntos_gpa = [4.0, 2.5, 3.5, 4.0, 0.0, 3.5]  # mismo que calculado antes

promedio_general = sum(puntuaciones) / len(puntuaciones)
gpa_general = sum(puntos_gpa) / len(puntos_gpa)
materias_aprobadas = sum(1 for p in puntuaciones if p >= 70)
materias_reprobadas = sum(1 for p in puntuaciones if p < 70)

print(f"Promedio general: {promedio_general:.2f}")
## Promedio general: 84.33
print(f"GPA general: {gpa_general:.2f}")
## GPA general: 2.92
print(f"Materias aprobadas: {materias_aprobadas}")
## Materias aprobadas: 5
print(f"Materias reprobadas: {materias_reprobadas}")
## Materias reprobadas: 1
# --- Bloque 2: Reporte de ventas mensuales ---
meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
         "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
ventas = [45000, 52000, 48000, 55000, 62000, 58000,
          71000, 68000, 59000, 63000, 75000, 82000]
meta_mensual = 60000

# Evaluación de rendimiento
rendimiento = [
    "Excepcional" if v >= meta_mensual * 1.2 else
    "Cumplió meta" if v >= meta_mensual else
    "Cerca de meta" if v >= meta_mensual * 0.8 else
    "Bajo rendimiento"
    for v in ventas
]

# Bonificación
bonificacion = [
    v * 0.05 if v >= meta_mensual * 1.2 else
    v * 0.03 if v >= meta_mensual else
    0
    for v in ventas
]

# Trimestres
trimestre = [
    "Q1" if m in ["Enero", "Febrero", "Marzo"] else
    "Q2" if m in ["Abril", "Mayo", "Junio"] else
    "Q3" if m in ["Julio", "Agosto", "Septiembre"] else
    "Q4"
    for m in meses
]

# Crear DataFrame
reporte_ventas = pd.DataFrame({
    "mes": meses,
    "trimestre": trimestre,
    "ventas": ventas,
    "meta": [meta_mensual]*12,
    "rendimiento": rendimiento,
    "bonificacion": bonificacion
})

print(reporte_ventas)
##            mes trimestre  ventas   meta       rendimiento  bonificacion
## 0        Enero        Q1   45000  60000  Bajo rendimiento           0.0
## 1      Febrero        Q1   52000  60000     Cerca de meta           0.0
## 2        Marzo        Q1   48000  60000     Cerca de meta           0.0
## 3        Abril        Q2   55000  60000     Cerca de meta           0.0
## 4         Mayo        Q2   62000  60000      Cumplió meta        1860.0
## 5        Junio        Q2   58000  60000     Cerca de meta           0.0
## 6        Julio        Q3   71000  60000      Cumplió meta        2130.0
## 7       Agosto        Q3   68000  60000      Cumplió meta        2040.0
## 8   Septiembre        Q3   59000  60000     Cerca de meta           0.0
## 9      Octubre        Q4   63000  60000      Cumplió meta        1890.0
## 10   Noviembre        Q4   75000  60000       Excepcional        3750.0
## 11   Diciembre        Q4   82000  60000       Excepcional        4100.0
import pandas as pd

# Datos
meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
         "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
ventas = [45000, 52000, 48000, 55000, 62000, 58000,
          71000, 68000, 59000, 63000, 75000, 82000]

# Crear DataFrame
reporte_ventas = pd.DataFrame({
    "mes": meses,
    "ventas": ventas
})

# Asignar trimestre
def asignar_trimestre(mes):
    if mes in ["Enero", "Febrero", "Marzo"]:
        return "Q1"
    elif mes in ["Abril", "Mayo", "Junio"]:
        return "Q2"
    elif mes in ["Julio", "Agosto", "Septiembre"]:
        return "Q3"
    else:
        return "Q4"

reporte_ventas["trimestre"] = reporte_ventas["mes"].apply(asignar_trimestre)

# Sumar ventas por trimestre
ventas_q1 = reporte_ventas.loc[reporte_ventas["trimestre"] == "Q1", "ventas"].sum()
ventas_q2 = reporte_ventas.loc[reporte_ventas["trimestre"] == "Q2", "ventas"].sum()
ventas_q3 = reporte_ventas.loc[reporte_ventas["trimestre"] == "Q3", "ventas"].sum()
ventas_q4 = reporte_ventas.loc[reporte_ventas["trimestre"] == "Q4", "ventas"].sum()

print(f"Ventas Q1: {ventas_q1}")
## Ventas Q1: 145000
print(f"Ventas Q2: {ventas_q2}")
## Ventas Q2: 175000
print(f"Ventas Q3: {ventas_q3}")
## Ventas Q3: 198000
print(f"Ventas Q4: {ventas_q4}")
## Ventas Q4: 220000
import pandas as pd
import numpy as np

# Datos con valores faltantes
temperaturas = [22, 25, np.nan, 18, 30, np.nan, 15, 28, 24, np.nan]
ciudades = ["Madrid", "Barcelona", "Valencia", "Sevilla", "Bilbao",
            "Málaga", "Zaragoza", "Murcia", "Palma", "Córdoba"]

# Crear DataFrame
reporte_clima = pd.DataFrame({
    "ciudad": ciudades,
    "temperatura": temperaturas
})

# Clasificación de temperatura
def clasificar_temp(temp):
    if pd.isna(temp):
        return "Sin datos"
    elif temp >= 25:
        return "Caluroso"
    elif temp >= 20:
        return "Templado"
    else:
        return "Frío"

# Recomendación de ropa
def ropa_para_temp(temp):
    if pd.isna(temp):
        return "Consultar pronóstico"
    elif temp >= 25:
        return "Ropa ligera"
    elif temp >= 20:
        return "Ropa normal"
    else:
        return "Abrigo"

reporte_clima["clasificacion"] = reporte_clima["temperatura"].apply(clasificar_temp)
reporte_clima["ropa"] = reporte_clima["temperatura"].apply(ropa_para_temp)

print(reporte_clima)
##       ciudad  temperatura clasificacion                  ropa
## 0     Madrid         22.0      Templado           Ropa normal
## 1  Barcelona         25.0      Caluroso           Ropa ligera
## 2   Valencia          NaN     Sin datos  Consultar pronóstico
## 3    Sevilla         18.0          Frío                Abrigo
## 4     Bilbao         30.0      Caluroso           Ropa ligera
## 5     Málaga          NaN     Sin datos  Consultar pronóstico
## 6   Zaragoza         15.0          Frío                Abrigo
## 7     Murcia         28.0      Caluroso           Ropa ligera
## 8      Palma         24.0      Templado           Ropa normal
## 9    Córdoba          NaN     Sin datos  Consultar pronóstico
import pandas as pd
import numpy as np

# Datos con valores faltantes
temperaturas = [22, 25, np.nan, 18, 30, np.nan, 15, 28, 24, np.nan]

# Filtrar temperaturas válidas
temp_validas = [t for t in temperaturas if not np.isnan(t)]

# Cálculos estadísticos
promedio_temp = round(np.mean(temp_validas), 1)
ciudades_con_datos = len(temp_validas)
ciudades_sin_datos = len(temperaturas) - ciudades_con_datos

print(f"Temperatura promedio: {promedio_temp} °C")
## Temperatura promedio: 23.1 °C
print(f"Ciudades con datos: {ciudades_con_datos}")
## Ciudades con datos: 7
print(f"Ciudades sin datos: {ciudades_sin_datos}")
## Ciudades sin datos: 3
# Con nombres (más común)
# resultado = {
#   "opcion1": valor1,
#   "opcion2": valor2,
#   "opcion3": valor3
# }.get(expresion, valor_por_defecto)

# Con posiciones numéricas (lista)
# opciones = [valor1, valor2, valor3]
# resultado = opciones[numero-1] if 1 <= numero <= len(opciones) else valor_por_defecto

Ejemplo

# Función para determinar si un año es bisiesto
def es_bisiesto(anio):
    return anio % 4 == 0 and (anio % 100 != 0 or anio % 400 == 0)

# Datos
mes = "febrero"
anio = 2024

# Diccionario con número de días por mes (febrero se maneja aparte)
dias_por_mes = {
    "enero": 31,
    "febrero": 29 if es_bisiesto(anio) else 28,
    "marzo": 31,
    "abril": 30,
    "mayo": 31,
    "junio": 30,
    "julio": 31,
    "agosto": 31,
    "septiembre": 30,
    "octubre": 31,
    "noviembre": 30,
    "diciembre": 31
}

# Obtener días (None si el mes no es válido)
dias_en_mes = dias_por_mes.get(mes, None)

if dias_en_mes is not None:
    print(f"{mes.capitalize()} de {anio} tiene {dias_en_mes} días")
else:
    print("Mes no válido")
## Febrero de 2024 tiene 29 días
def obtener_info_dia(dia):
    dia = dia.lower()  # Hacer case-insensitive
    info_dias = {
        "lunes": {
            "nombre": "Lunes",
            "tipo": "Laboral",
            "actividad": "Comenzar la semana con energía",
            "estado_animo": "Motivado",
            "color": "Azul"
        },
        "martes": {
            "nombre": "Martes",
            "tipo": "Laboral",
            "actividad": "Continuar con el ritmo de trabajo",
            "estado_animo": "Concentrado",
            "color": "Verde"
        },
        "miercoles": {
            "nombre": "Miércoles",
            "tipo": "Laboral",
            "actividad": "Punto medio de la semana",
            "estado_animo": "Equilibrado",
            "color": "Amarillo"
        },
        "jueves": {
            "nombre": "Jueves",
            "tipo": "Laboral",
            "actividad": "Prepararse para el final de semana",
            "estado_animo": "Expectante",
            "color": "Naranja"
        },
        "viernes": {
            "nombre": "Viernes",
            "tipo": "Laboral",
            "actividad": "Finalizar tareas y planificar el fin de semana",
            "estado_animo": "Alegre",
            "color": "Rosa"
        },
        "sabado": {
            "nombre": "Sábado",
            "tipo": "Fin de semana",
            "actividad": "Relajarse y disfrutar tiempo libre",
            "estado_animo": "Relajado",
            "color": "Púrpura"
        },
        "domingo": {
            "nombre": "Domingo",
            "tipo": "Fin de semana",
            "actividad": "Descansar y prepararse para la nueva semana",
            "estado_animo": "Tranquilo",
            "color": "Rojo"
        }
    }
    
    # Valor por defecto si el día no es válido
    return info_dias.get(dia, {
        "nombre": "Desconocido",
        "tipo": "Inválido",
        "actividad": "Verificar el día ingresado",
        "estado_animo": "Confundido",
        "color": "Gris"
    })

# Ejemplo de uso
dia_actual = "viernes"
info_dia = obtener_info_dia(dia_actual)

print(f"Día: {info_dia['nombre']}")
## Día: Viernes
print(f"Tipo: {info_dia['tipo']}")
## Tipo: Laboral
print(f"Actividad: {info_dia['actividad']}")
## Actividad: Finalizar tareas y planificar el fin de semana
print(f"Estado de ánimo: {info_dia['estado_animo']}")
## Estado de ánimo: Alegre
print(f"Color asociado: {info_dia['color']}")
## Color asociado: Rosa

###Calculadora con switch

def calculadora(operacion, a, b):
    # Validar que los números sean válidos
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        return {"resultado": None, "error": "Los operandos deben ser numéricos"}

    # Definir las operaciones
    operaciones = {
        "suma": lambda x, y: x + y,
        "+": lambda x, y: x + y,
        "resta": lambda x, y: x - y,
        "-": lambda x, y: x - y,
        "multiplicacion": lambda x, y: x * y,
        "*": lambda x, y: x * y,
        "division": lambda x, y: "DIV0" if y == 0 else x / y,
        "/": lambda x, y: "DIV0" if y == 0 else x / y,
        "potencia": lambda x, y: x ** y,
        "^": lambda x, y: x ** y,
        "modulo": lambda x, y: x % y,
        "%": lambda x, y: x % y
    }

    func = operaciones.get(operacion)
    if func is None:
        return {"resultado": None, "error": "Operación no reconocida"}

    resultado = func(a, b)
    if resultado == "DIV0":
        return {"resultado": None, "error": "División por cero"}

    return {"resultado": resultado, "error": None}


# Ejemplos de uso
print(calculadora("suma", 10, 5))
## {'resultado': 15, 'error': None}
print(calculadora("+", 10, 5))
## {'resultado': 15, 'error': None}
print(calculadora("division", 10, 0))
## {'resultado': None, 'error': 'División por cero'}
print(calculadora("/", 15, 3))
## {'resultado': 5.0, 'error': None}
print(calculadora("potencia", 2, 8))
## {'resultado': 256, 'error': None}
print(calculadora("xyz", 5, 3))  # Operación inválida
## {'resultado': None, 'error': 'Operación no reconocida'}

###Sistema de Conversión de Unidades

def convertir_unidad(valor, de_unidad, a_unidad):
    # Normalizar unidades a minúsculas
    de = de_unidad.lower()
    a = a_unidad.lower()
    
    # Factores de conversión a metros (unidad base)
    factor_a_metros = {
        "mm": 0.001,
        "cm": 0.01,
        "m": 1,
        "km": 1000,
        "in": 0.0254,
        "ft": 0.3048,
        "yd": 0.9144,
        "mi": 1609.344
    }.get(de, None)
    
    factor_de_metros = {
        "mm": 1000,
        "cm": 100,
        "m": 1,
        "km": 0.001,
        "in": 39.3701,
        "ft": 3.28084,
        "yd": 1.09361,
        "mi": 0.000621371
    }.get(a, None)
    
    if factor_a_metros is None or factor_de_metros is None:
        return {
            "resultado": None,
            "error": "Unidad no reconocida",
            "unidades_validas": ["mm", "cm", "m", "km", "in", "ft", "yd", "mi"]
        }
    
    # Realizar conversión
    metros = valor * factor_a_metros
    resultado_final = metros * factor_de_metros
    
    return {
        "valor_original": valor,
        "unidad_original": de_unidad,
        "valor_convertido": resultado_final,
        "unidad_final": a_unidad,
        "formula": f"{valor} {de_unidad} = {round(resultado_final, 6)} {a_unidad}"
    }

# Ejemplos de conversión
print(convertir_unidad(100, "cm", "m"))
## {'valor_original': 100, 'unidad_original': 'cm', 'valor_convertido': 1.0, 'unidad_final': 'm', 'formula': '100 cm = 1.0 m'}
print(convertir_unidad(5, "ft", "m"))
## {'valor_original': 5, 'unidad_original': 'ft', 'valor_convertido': 1.524, 'unidad_final': 'm', 'formula': '5 ft = 1.524 m'}
print(convertir_unidad(1, "xyz", "m"))  # Unidad inválida
## {'resultado': None, 'error': 'Unidad no reconocida', 'unidades_validas': ['mm', 'cm', 'm', 'km', 'in', 'ft', 'yd', 'mi']}