Procesamiento Eficiente de Datos de Atletas con Pandas y Funciones Python

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 7,06 KB

Script de Procesamiento de Datos de Atletas con Pandas

Importaciones y Funciones Auxiliares


import pandas as pd
import numpy as np
from datetime import datetime as dt

def lee_fecha(x):
    # Convierte una cadena de texto a formato datetime
    return dt.strptime(x, '%Y-%m-%d')

def tiempo_a_segundos(tiempo):
    # Convierte una cadena de tiempo 'HH:MM:SS' a segundos totales
    segundos = 0
    partes_tiempo = tiempo.split(':')
    horas_tiempo = int(partes_tiempo[0])
    minutos_tiempo = int(partes_tiempo[1])
    segundos_tiempo = int(partes_tiempo[2])
    segundos = segundos_tiempo + minutos_tiempo * 60 + horas_tiempo * 60 * 60
    return segundos

def edad(fecha_nacimiento):
    # Calcula la edad a partir de la fecha de nacimiento (formato datetime de NumPy)
    fecha_nacimiento = dt.strptime(np.datetime_as_string(fecha_nacimiento, unit='s'), '%Y-%m-%dT%H:%M:%S')
    hoy = dt.today()
    edad_calculada = hoy.year - fecha_nacimiento.year
    # Ajusta la edad si aún no ha cumplido años este año
    if (hoy.month < fecha_nacimiento.month) or (hoy.month == fecha_nacimiento.month and hoy.day < fecha_nacimiento.day):
        edad_calculada -= 1
    return edad_calculada

Procesamiento Principal del DataFrame


# Carga de datos
infile = 'datos_nuevos.csv'
df = pd.read_csv(infile, parse_dates=['fecha_nacimiento'], date_parser=lee_fecha)

# Limpieza inicial: Eliminar columnas preexistentes si es necesario
# Asegúrate de que estas columnas existan antes de intentar eliminarlas o maneja el error
try:
    df.drop(['tiempo_en_segundos', 'edad', 'diferencia'], axis=1, inplace=True)
except KeyError as e:
    print(f"Advertencia: No se pudieron eliminar algunas columnas: {e}")

# Entrada de tiempos (Bucle desactivado por 'while False')
# Descomentar y ajustar si se necesita entrada interactiva de tiempos
# index = 0
# while False: # Cambiar a True para activar
#     nombre = input('Ingrese nombre del atleta: ')
#     tiempo = input('Ingrese el tiempo obtenido (HH:MM:SS): ')
#     # Validar formato de tiempo aquí si es necesario
#     df.loc[df['nombre'] == nombre, 'tiempo'] = tiempo
#     continuar = input('¿Desea agregar más atletas? (S/N): ').upper()
#     if continuar == 'N':
#         break

# Cálculo y adición de la columna 'tiempo_en_segundos'
# Asumiendo que la columna 'tiempo' existe y tiene el formato 'HH:MM:SS'
if 'tiempo' in df.columns:
    tiempos_seg = []
    for t in df['tiempo'].to_numpy():
        tiempos_seg.append(tiempo_a_segundos(str(t))) # Asegurar que sea string
    df['tiempo_en_segundos'] = tiempos_seg
else:
    print("Advertencia: La columna 'tiempo' no existe en el DataFrame.")

# Cálculo y adición de la columna 'edad'
edades_calc = []
for fecha_nac in df['fecha_nacimiento'].to_numpy():
    edades_calc.append(edad(fecha_nac))
df['edad'] = edades_calc

# Filtrado y obtención de los 3 primeros lugares por categoría
print("--- Resultados por Categoría ---")

# Definición de filtros
mujeres = df['genero'] == 'M'
hombres = df['genero'] == 'H'
nobinarios = df['genero'] == 'O'
mayores_45 = df['edad'] >= 45

print("\nTop 3 Mujeres:")
print(df[mujeres].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))

print("\nTop 3 Hombres:")
print(df[hombres].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))

print("\nTop 3 No Binarios:")
# Verificar si hay datos antes de imprimir
if not df[nobinarios].empty:
    print(df[nobinarios].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))
else:
    print("No hay datos para la categoría No Binarios.")

print("\nTop 3 Mujeres (Mayores de 45):")
if not df[mujeres & mayores_45].empty:
    print(df[mujeres & mayores_45].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))
else:
    print("No hay datos para Mujeres Mayores de 45.")

print("\nTop 3 Hombres (Mayores de 45):")
if not df[hombres & mayores_45].empty:
    print(df[hombres & mayores_45].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))
else:
    print("No hay datos para Hombres Mayores de 45.")

print("\nTop 3 No Binarios (Mayores de 45):")
if not df[nobinarios & mayores_45].empty:
    print(df[nobinarios & mayores_45].sort_values(by='tiempo_en_segundos')[['nombre', 'nacionalidad']].head(3))
else:
    print("No hay datos para No Binarios Mayores de 45.")

# Cálculo y adición de la columna 'diferencia_con_primero'
if 'tiempo_en_segundos' in df.columns and not df['tiempo_en_segundos'].empty:
    tiempo_minimo = df['tiempo_en_segundos'].min()
    df['diferencia'] = df['tiempo_en_segundos'] - tiempo_minimo
else:
    print("Advertencia: No se puede calcular la diferencia, 'tiempo_en_segundos' no disponible.")

# Guardar el DataFrame modificado
df.to_csv('datos_nuevos.csv', index=False) # Evitar guardar el índice de pandas como columna

print("\nProcesamiento completado. Datos guardados en 'datos_nuevos.csv'")

Ejemplos de Funciones en Python

Función: Recibe parámetros y retorna valores

Calcula el factorial de un número.


def factorial(n):
    # Calcula el producto de los números desde 1 hasta n
    mult = 1
    for i in range(1, n + 1):
        mult = mult * i
    return mult

# Ejemplo de uso
num = int(input("Ingrese número para calcular factorial: "))
num_fact = factorial(num)
print(f"El factorial de {num} es: {num_fact}")

Función: No recibe parámetros y sí retorna valores

Genera una lista de 10 números aleatorios entre 0 y 100.


import random as r

def generar_aleatorios():
    # Crea una lista de 10 enteros aleatorios
    lista_aleatoria = []
    for i in range(10):
        lista_aleatoria.append(r.randint(0, 100))
    return lista_aleatoria

# Ejemplo de uso
lista_generada = generar_aleatorios()
print(f"Lista aleatoria generada: {lista_generada}")

Función: No recibe parámetros y tampoco retorna valores

Genera una lista de 10 números aleatorios y la imprime directamente (efecto secundario).


import random as r

def imprimir_aleatorios():
    # Genera e imprime una lista de 10 enteros aleatorios
    lista_aleatoria = []
    for i in range(10):
        lista_aleatoria.append(r.randint(0, 100))
    print(f"Lista aleatoria impresa desde la función: {lista_aleatoria}")

# Ejemplo de uso
imprimir_aleatorios()

Función: Recibe parámetros y no retorna valores

Suma dos números e imprime el resultado directamente.


def sumando(a, b):
    # Calcula e imprime la suma de a y b
    suma = a + b
    print(f"La suma de {a} y {b} es: {suma}")

# Ejemplo de uso
x = int(input("Ingrese el primer valor: "))
y = int(input("Ingrese el segundo valor: "))
sumando(x, y)

Entradas relacionadas: