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)