Ver todo el portafolio

Nueve años de datos de actividad física

Procesamiento de 2,74 millones de registros de Apple Health con Python: lectura en streaming de un XML de 1,2 GB, agregación con pandas e informe HTML sin dependencias.

Año
2026
Estado
Código abierto y reproducible
Herramientas
Python, pandas, SVG, Web Workers, Claude Code
Nueve años de datos de actividad física

El punto de partida

La app Salud del iPhone guarda todo lo que mide, desde 2017 en mi caso. Pero te lo muestra por día, por semana o por mes. Nunca los nueve años juntos. La pregunta era operativa: qué se puede extraer de nueve años de registros si se los trata como una base de datos y no como una aplicación.

Pedí la exportación completa. Llegó un zip con un archivo XML de 1,24 GB. Ningún Excel lo abre. En unas horas lo convertí en un informe navegable, con Claude Code como apoyo.

2,74 Mregistros
45tipos de datos distintos
5dispositivos (teléfonos y relojes)
1.004rutas GPS que decidí no tocar

De 1,2 GB a un informe de 234 KB

  1. xml
    Leer sin ahogarseparse.py recorre el XML línea a línea con expresiones regulares y escribe un CSV por tipo de dato.
  2. csv
    Resumirbuild_data.py usa pandas para medianas, meses y promedios móviles de 30 días.
  3. json
    CompactarTodo lo necesario para los gráficos cabe en un JSON de 145 KB.
  4. svg
    DibujarUna pequeña librería propia de gráficos SVG, sin dependencias.
  5. html
    ExplicarUn informe que funciona sin internet. Cada gráfico dice cómo leerlo y compara con rangos de referencia publicados.

Un problema clásico de doble conteo: el teléfono y el reloj registran los mismos pasos. Sumarlos duplica la cifra. La solución fue quedarse, hora por hora, con el dispositivo que más registró.

# pasos por hora y por dispositivo → el máximo de cada hora → suma del día
por_hora = df.groupby(["hora", "fuente"]).pasos.sum()
pasos_dia = por_hora.groupby("hora").max().resample("D").sum()

Pasos diarios por año

Mediana de pasos diarios por año. La mediana, y no el promedio, para que un día de trekking no infle el año.

  • 2020 es la pandemia en un solo número: 3.591 pasos al día, menos de la mitad del año anterior.
  • 2021 no existe. No hay un solo registro de ese año. Un buen recordatorio de que los datos faltantes también cuentan algo, aunque no siempre sepamos qué.
  • 2025 fue mi mejor año: 13.867 pasos de mediana y 85% de los días sobre 8.000.
  • En total, unos 25,3 millones de pasos y 18.300 km. Más que la distancia en línea recta entre Santiago y Tokio.

2022 tiene solo 37 días con datos y 2026 llega hasta septiembre.

Actividad registrada por año

1.183 entrenamientos registrados, unas 535 horas. El reloj llegó a fines de 2022 y desde ahí se ve cómo cambian las costumbres:

2022 24
2023 387
2024 304
2025 370
2026 98

CaminataBicicletaCarreraOtros

En 2023 salí en bicicleta 243 veces. En 2025 la bici casi desaparece y la reemplazan 349 caminatas. No hace falta un modelo para ver una mudanza, un cambio de trabajo o simplemente otra rutina.

Qué no se publica

El informe completo también cubre indicadores cardíacos, sueño, oxígeno y ruido. Esos gráficos no se publican. Las rutas GPS tampoco se usaron, porque permiten reconstruir domicilio y desplazamientos.

Trabajar con datos de personas también es decidir qué no publicar. Eso vale para un censo y para mi propio teléfono.

Pruébalo con tus datos

  1. En el iPhone abre Salud, toca tu foto de perfil y elige Exportar todos los datos de salud.
  2. Pasa el archivo exportar.zip a tu computador.
  3. Arrástralo aquí abajo. Puede tardar un par de minutos si tienes años de datos.

¿Prefieres Python? Estos son los scripts, listos para correr en tu computador.