| """ |
| 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 |
| |
| |
| total_training_sessions: int = 0 |
| total_training_minutes: float = 0.0 |
| total_videos_analyzed: int = 0 |
| |
| |
| total_distance_km: Optional[float] = None |
| avg_speed_kmh: Optional[float] = None |
| max_speed_kmh: Optional[float] = None |
| |
| |
| 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 |
|
|
| |
| |
| 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 |
| |
| |
| total_games_analyzed: int = 0 |
| total_training_sessions: int = 0 |
| |
| |
| avg_possession_percent: Optional[float] = None |
| |
| |
| total_passes: int = 0 |
| avg_passes_per_game: Optional[float] = None |
| pass_success_rate: Optional[float] = None |
| |
| |
| total_shot_attempts: int = 0 |
| total_shots_made: int = 0 |
| team_shooting_percentage: Optional[float] = None |
| |
| |
| 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_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) |
| |
| |
| last_session_date: Optional[date] = None |
| last_session_duration_minutes: Optional[float] = None |
| |
| |
| strengths: List[str] = Field(default_factory=list) |
| areas_to_improve: List[str] = Field(default_factory=list) |
| |
| |
| 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 |
|
|