File size: 3,561 Bytes
c6abe34 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | """
Pydantic models for analytics and metrics schemas.
"""
from datetime import datetime, date
from typing import Optional, List, Dict, Any
from uuid import UUID
from pydantic import BaseModel, Field
class MetricType(BaseModel):
"""Type definition for a metric."""
name: str
unit: str
description: Optional[str] = None
class PlayerMetric(BaseModel):
"""Single metric value for a player."""
player_id: UUID
metric_type: str
value: float
timestamp: datetime
video_id: Optional[UUID] = None
session_id: Optional[UUID] = None
class PlayerAnalyticsSummary(BaseModel):
"""Aggregated analytics summary for a player."""
player_id: UUID
period_start: date
period_end: date
# Performance metrics
total_training_sessions: int = 0
total_training_minutes: float = 0.0
total_videos_analyzed: int = 0
# Movement stats
total_distance_km: Optional[float] = None
avg_speed_kmh: Optional[float] = None
max_speed_kmh: Optional[float] = None
# Skill stats
total_shot_attempts: int = 0
total_shots_made: int = 0
total_shots_missed: int = 0
shot_success_rate: Optional[float] = Field(None, description="Shot success percentage (0-100)")
avg_shot_form_consistency: Optional[float] = None
total_dribbles: int = 0
# Progress indicators
speed_trend: Optional[str] = Field(None, description="'improving', 'stable', 'declining'")
form_trend: Optional[str] = None
class Config:
from_attributes = True
class TeamAnalyticsSummary(BaseModel):
"""Aggregated analytics summary for a team."""
organization_id: UUID
period_start: date
period_end: date
# Team stats
total_games_analyzed: int = 0
total_training_sessions: int = 0
# Possession
avg_possession_percent: Optional[float] = None
# Passing
total_passes: int = 0
avg_passes_per_game: Optional[float] = None
pass_success_rate: Optional[float] = None
# Shooting
total_shot_attempts: int = 0
total_shots_made: int = 0
team_shooting_percentage: Optional[float] = None
# Defense
total_interceptions: int = 0
avg_interceptions_per_game: Optional[float] = None
class Config:
from_attributes = True
class SkillSummary(BaseModel):
"""Personal skill summary for dashboard display."""
player_id: UUID
last_updated: datetime
# Overall scores (0-100)
overall_score: float = Field(..., ge=0, le=100)
shooting_score: float = Field(..., ge=0, le=100)
dribbling_score: float = Field(..., ge=0, le=100)
movement_score: float = Field(..., ge=0, le=100)
consistency_score: float = Field(..., ge=0, le=100)
# Recent session summary
last_session_date: Optional[date] = None
last_session_duration_minutes: Optional[float] = None
# Improvement areas
strengths: List[str] = Field(default_factory=list)
areas_to_improve: List[str] = Field(default_factory=list)
# Recommendations
recommendations: List[str] = Field(default_factory=list)
class ProgressData(BaseModel):
"""Progress tracking data point."""
date: date
value: float
metric_type: str
class ProgressReport(BaseModel):
"""Progress report over time."""
player_id: UUID
metric_type: str
period_start: date
period_end: date
data_points: List[ProgressData]
trend: str = Field(..., description="'improving', 'stable', 'declining'")
percent_change: Optional[float] = None
|