4.5 KiB
4.5 KiB
Stats Service API - Статистические рекомендации и агрегаты
Endpoints
GET /api/v1/stats/summary
Получить агрегированную статистику для дашборда.
Response:
{
"total_cases": 8,
"active_cases": 7,
"closed_cases": 1,
"by_gender": {"М": 8},
"by_age_group": {
"8-11": 6,
"12-14": 2
},
"by_psychotype": {},
"by_diagnosis": {"здоров": 3},
"by_season": {
"зима": 3,
"весна": 1,
"лето": 1
},
"avg_distance_km": 2.3,
"avg_search_duration_hours": 4.5,
"survival_rate": 100.0
}
POST /api/v1/stats/recommendation
Получить статистические рекомендации на основе похожих случаев.
Фильтры (в порядке приоритета):
- Возраст ±2 года + сезон + terrain
- Возраст ±2 года + сезон (если < 5 случаев)
- Возраст ±2 года (если < 5 случаев)
- Все случаи (если < 5 случаев)
Request:
{
"age": 10,
"season": "лето",
"terrain_primary": "лес"
}
Response:
{
"median_distance_km": 2.3,
"top_directions": [
{
"direction": "СВ",
"count": 1,
"percentage": 100.0
}
],
"top_location_types": ["forest"],
"survival_rate": 100.0,
"sample_size": 1,
"filters_used": {
"age_range": "8 to 12",
"season": "лето",
"terrain": "лес"
}
}
GET /api/v1/stats/heatmap
Получить данные для тепловой карты находок.
Query Parameters:
age_min(optional): Минимальный возрастage_max(optional): Максимальный возрастseason(optional): Сезонoutcome(optional): Исход (alive/deceased)
Response:
{
"points": [
{
"lat": 53.9,
"lon": 27.56,
"intensity": 1.0,
"case_id": "uuid",
"distance_km": 2.3,
"outcome": "alive"
}
],
"total": 1
}
Функции stats_service.py
get_statistical_recommendation()
SQL выборка похожих случаев с фильтрами:
- Возраст ±2 года
- Сезон
- Terrain (тип местности)
- Минимум 5 случаев для выборки
Возвращает:
median_distance_km- медианное расстояние находкиtop_directions- топ-3 направления с процентамиtop_location_types- топ-5 типов локацийsurvival_rate- процент выживаемостиsample_size- размер выборкиfilters_used- использованные фильтры
get_dashboard_stats()
Агрегаты для дашборда:
- Общее количество случаев (всего, активных, закрытых)
- Распределение по полу, возрасту, психотипу, диагнозам, сезонам
- Средняя дистанция находки
- Средняя длительность поиска
- Процент выживаемости
get_heatmap_data()
Данные для тепловой карты с фильтрами:
- Возраст (min/max)
- Сезон
- Исход (alive/deceased)
Тестирование
# 1. Получить агрегаты дашборда
curl http://localhost:8000/api/v1/stats/summary
# 2. Получить статистические рекомендации
curl -X POST http://localhost:8000/api/v1/stats/recommendation \
-H "Content-Type: application/json" \
-d '{"age": 10, "season": "лето", "terrain_primary": "лес"}'
# 3. Получить данные для тепловой карты
curl "http://localhost:8000/api/v1/stats/heatmap?age_min=8&age_max=12"
Протестировано (2026-05-05)
✅ GET /api/v1/stats/summary - работает ✅ POST /api/v1/stats/recommendation - работает ✅ GET /api/v1/stats/heatmap - работает
Технические детали
- Синхронная SQLAlchemy (не async)
- PostgreSQL ARRAY - используется
any()вместоcontains() - Fallback механизм - если выборка < 5 случаев, расширяются фильтры
- Pydantic модели - валидация входных/выходных данных
Дата создания
2026-05-05