Узнайте, как собрать конвейер для автоматической генерации отчётов Apple Health на Python с Gemini. Практический туториал с кодом.
Каждый день ваш Apple Watch и iPhone собирают тонны данных: пульс, шаги, сон, активность. Но как превратить эту сырую информацию в полезный отчёт для врача? Вручную смотреть графики — долго и неэффективно. В этой статье мы построим конвейер на Python, который обрабатывает выгрузку Apple Health, вычисляет ключевые метрики и с помощью Gemini формирует структурированное резюме. Вы получите готовый прототип, который можно адаптировать под свои задачи.
Конвейер состоит из трёх этапов:
Мы используем симулированные данные трёх пациентов, чтобы вы могли запустить код без реальной медицинской информации.
Gemini выбран по практическим причинам:
Важно: Gemini не анализирует сырые записи, а только оформляет уже вычисленные метрики в читаемый текст. Это снижает риск галлюцинаций и сохраняет контроль над расчётами.
Apple Health позволяет экспортировать данные в XML. Вот как извлечь записи о пульсе, шагах и сне:
import xml.etree.ElementTree as ET
from datetime import datetime
def parse_health_export(filepath):
tree = ET.parse(filepath)
root = tree.getroot()
records = []
for record in root.findall('Record'):
record_type = record.get('type')
value = record.get('value')
start_date = datetime.fromisoformat(record.get('startDate'))
end_date = datetime.fromisoformat(record.get('endDate'))
records.append({
'type': record_type,
'value': float(value) if value else None,
'start': start_date,
'end': end_date
})
return records
# Пример использования
# records = parse_health_export('export.xml')
Этот код загружает все записи в список словарей. Для реального использования добавьте фильтрацию по типу и обработку ошибок.
Теперь сгруппируем записи по типу и вычислим средние значения:
def compute_metrics(records):
metrics = {}
for rec in records:
rtype = rec['type']
if rtype not in metrics:
metrics[rtype] = []
metrics[rtype].append(rec['value'])
summary = {}
for rtype, values in metrics.items():
values = [v for v in values if v is not None]
if values:
summary[rtype] = {
'mean': sum(values)/len(values),
'min': min(values),
'max': max(values),
'count': len(values)
}
return summary
# Пример
# summary = compute_metrics(records)
Для сна можно дополнительно рассчитать общую продолжительность в часах.
Установите библиотеку google-generativeai и настройте API-ключ:
import google.generativeai as genai
genai.configure(api_key='YOUR_API_KEY')
model = genai.GenerativeModel('gemini-1.5-flash')
def generate_report(patient_name, metrics):
prompt = f"""
Пациент: {patient_name}
Метрики за последний месяц:
- Средний пульс: {metrics.get('HKQuantityTypeIdentifierHeartRate', {}).get('mean', 'Нет данных')} уд/мин
- Шаги (среднее в день): {metrics.get('HKQuantityTypeIdentifierStepCount', {}).get('mean', 0):.0f}
- Сон (средняя продолжительность): {metrics.get('HKCategoryTypeIdentifierSleepAnalysis', {}).get('mean', 0):.1f} часов
Напиши краткое резюме для врача на русском языке. Отметь отклонения от нормы.
"""
response = model.generate_content(prompt)
return response.text
# Пример
# report = generate_report('Иван Петров', summary)
# print(report)
Промпт можно настроить под свои метрики. Главное — передавать только агрегированные данные, а не сырые записи.
Вы только что построили конвейер, который автоматически превращает выгрузку Apple Health в структурированный отчёт. Что делать дальше?
Этот прототип — не медицинское устройство, но он показывает, как современные LLM могут упростить анализ персональных данных. Экспериментируйте и адаптируйте под свои нужды!
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →