Análisis de datos de F1: GP de Singapur 2026 con Python y una API
¿Qué podemos descubrir sobre una carrera de Fórmula 1 utilizando datos? En este análisis del Gran Premio de Singapur 2026 vamos a trabajar con una API deportiva, Python y Pandas para obtener resultados, comparar posiciones y generar visualizaciones que nos permitan responder preguntas concretas.
El objetivo no es solamente consultar quién terminó primero, sino analizar la diferencia entre la parrilla de salida y el resultado final, identificar remontadas y detectar qué pilotos perdieron posiciones durante la carrera.
1. Herramientas utilizadas
- API de Fórmula 1: servicio disponible a través de RapidAPI para consultar datos de carreras.
- Python: lenguaje utilizado para realizar las solicitudes y procesar los resultados.
- Requests: biblioteca para realizar solicitudes HTTP.
- Pandas: biblioteca para transformar los datos JSON en tablas y realizar cálculos.
- Matplotlib y Pillow: herramientas que podemos utilizar para crear gráficas e imágenes para nuestros análisis y Shorts.
2. ¿Qué es una API REST y qué información obtenemos?
Una API permite que una aplicación consulte información de otro servicio. En este proyecto utilizamos una API de Fórmula 1 accesible mediante RapidAPI.
La solicitud se realiza mediante HTTP y la respuesta se recibe en formato JSON. Posteriormente, podemos transformar esa respuesta en un DataFrame de Pandas para trabajar con los datos de los pilotos.
La documentación del proveedor es la referencia para conocer los endpoints disponibles, los parámetros requeridos y los campos incluidos en cada respuesta.
Recurso: RapidAPI Hub.
3. Consultar los resultados mediante Python
Para consultar los resultados de una carrera utilizamos el endpoint de rankings de carrera y el identificador correspondiente. En nuestro análisis trabajamos con estos identificadores:
- 2593: Sprint de Singapur 2026.
- 2595: carrera principal de Singapur 2026.
El siguiente ejemplo muestra cómo realizar la solicitud. Debes configurar tu propia clave de RapidAPI y confirmar que tu suscripción tenga acceso al endpoint.
import os
import requests
import pandas as pd
API_KEY = os.environ["RAPIDAPI_KEY"]
API_HOST = "api-formula-1.p.rapidapi.com"
race_id = 2595 # Carrera principal de Singapur
url = f"https://{API_HOST}/rankings/races"
headers = {
"x-rapidapi-key": API_KEY,
"x-rapidapi-host": API_HOST
}
params = {
"race": race_id
}
response = requests.get(
url,
headers=headers,
params=params,
timeout=30
)
response.raise_for_status()
data = response.json()
df_Singapore_GP = pd.json_normalize(
data["response"]
)
print(df_Singapore_GP.head())
print(df_Singapore_GP.columns.tolist())
Importante: configura la variable de entorno RAPIDAPI_KEY con tu propia clave. No publiques claves privadas en el blog, GitHub ni en capturas de pantalla.
4. Explorar y preparar los datos
Una vez obtenida la respuesta, el siguiente paso consiste en revisar las columnas y los tipos de datos. Entre los campos que utilizamos para el análisis están:
driver.name: nombre del piloto.driver.image: imagen del piloto, cuando está disponible.grid: posición de salida.position: posición reportada por la API.time: tiempo reportado o indicador de abandono, según el registro.laps: vueltas completadas reportadas por la API.team.name: nombre del equipo, cuando está disponible.
Podemos revisar la estructura de los datos con:
print(df_Singapore_GP.shape)
print(df_Singapore_GP.info())
print(df_Singapore_GP.head())
Es importante convertir las posiciones a valores numéricos antes de realizar operaciones matemáticas. También debemos revisar los registros con DNF, ya que un abandono no debe interpretarse automáticamente como un resultado final equivalente al de un piloto que completó la carrera.
5. Calcular las posiciones ganadas y perdidas
Una pregunta interesante consiste en comparar la posición de salida con la posición final reportada. Para ello utilizamos la diferencia entre ambas columnas.
df = df_Singapore_GP.copy()
df["grid"] = pd.to_numeric(
df["grid"], errors="coerce"
)
df["position"] = pd.to_numeric(
df["position"], errors="coerce"
)
# Cambio neto de posiciones
df["cambio_posiciones"] = (
df["grid"] - df["position"]
)
# Valores positivos: avanzó posiciones.
# Valores negativos: perdió posiciones.
print(
df[[
"driver.name",
"grid",
"position",
"cambio_posiciones"
]].sort_values(
"cambio_posiciones",
ascending=False
)
)
Con esta convención, un valor positivo indica que el piloto terminó en una posición mejor que la de salida. Un valor negativo indica que terminó en una posición peor.
Por ejemplo, pasar de la posición 22 a la 10 representa una mejora neta de 12 posiciones. En cambio, pasar de la posición 3 a la 6 representa una pérdida neta de 3 posiciones.
Este indicador mide el cambio entre salida y resultado; no equivale necesariamente al número exacto de adelantamientos realizados en pista.
6. Identificar a los pilotos que perdieron posiciones
Para estudiar las pérdidas de posiciones de los pilotos que terminaron la carrera, podemos excluir los registros identificados como DNF y ordenar el resultado de mayor a menor pérdida.
df["time"] = df["time"].astype(str)
df_finalistas = df[
(df["time"].str.upper() != "DNF") &
df["grid"].notna() &
df["position"].notna()
].copy()
df_finalistas["posiciones_perdidas"] = (
df_finalistas["position"] -
df_finalistas["grid"]
)
df_perdidas = df_finalistas[
df_finalistas["posiciones_perdidas"] > 0
].sort_values(
"posiciones_perdidas",
ascending=False
)
display(
df_perdidas[[
"driver.name",
"grid",
"position",
"posiciones_perdidas"
]]
)
En el GP de Singapur, este análisis nos permitió contrastar una pregunta que surgió en los comentarios: ¿fue Lewis Hamilton quien más posiciones perdió?
En los datos que analizamos, Hamilton salió desde la tercera posición y terminó sexto, mientras que Pierre Gasly pasó de la séptima a la undécima posición. La comparación muestra por qué es útil comprobar las impresiones de los aficionados con datos estructurados.
La clasificación anterior considera a quienes terminaron la carrera. Si queremos estudiar también los abandonos, debemos analizarlos por separado y verificar cómo representa la API sus posiciones y registros.
7. De los datos a una visualización
Una vez calculadas las diferencias, podemos construir una gráfica con el nombre de cada piloto, su posición de salida, su posición final y el número de posiciones ganadas o perdidas.
Para crear los recursos visuales de nuestros Shorts, podemos utilizar Python y Pillow para diseñar una imagen vertical, incorporar las fotografías disponibles de los pilotos y resaltar los resultados más relevantes.
Este paso transforma una tabla de resultados en una historia fácil de entender: una pregunta, una comparación y una conclusión basada en datos.
8. Sprint y carrera principal: analizar cada sesión por separado
El GP de Singapur nos permite estudiar dos sesiones distintas: la Sprint y la carrera principal. Aunque podemos aplicar la misma metodología a ambas, es importante conservar los identificadores y los DataFrames por separado para no mezclar resultados.
- Sprint: identificador 2593.
- Carrera principal: identificador 2595.
También debemos verificar qué sesión representa cada respuesta de la API y revisar los abandonos antes de publicar una clasificación. La calidad del análisis depende tanto de los cálculos como de la interpretación correcta de los datos.
Conclusión
Las APIs deportivas permiten convertir los resultados de Fórmula 1 en un proyecto de análisis de datos reproducible. Con Python y Pandas podemos consultar información, preparar tablas, calcular diferencias de posiciones y responder preguntas que van más allá de quién ganó la carrera.
En Programación para Todos utilizamos este enfoque para crear análisis técnicos y visualizaciones sobre deportes, tecnología y datos.
¿Qué otro análisis de Fórmula 1 te gustaría ver? Podemos estudiar las posiciones ganadas, los abandonos, las diferencias de tiempo o la evolución de los resultados durante la temporada.
🌐 Visita también nuestro dashboard de Fórmula 1.
Comentarios
Publicar un comentario
Dejanos tus dudas y comentarios