| """POST /api/rows — filter + sort the MV database, return compact table rows.""" |
|
|
| import math |
| from typing import List, Optional |
|
|
| import pandas as pd |
| from fastapi import APIRouter |
| from pydantic import BaseModel |
|
|
| from data import get_rows |
|
|
| router = APIRouter() |
|
|
|
|
| class RowsRequest(BaseModel): |
| seasons: Optional[List[str]] = None |
| leagues: Optional[List[str]] = None |
| positions: Optional[List[str]] = None |
| age_min: Optional[int] = None |
| age_max: Optional[int] = None |
| min_minutes: int = 0 |
| foot: Optional[str] = None |
| mv_min_millions: Optional[float] = None |
| mv_max_millions: Optional[float] = None |
| nationality: Optional[str] = None |
| conf: Optional[str] = None |
| sort: str = 'mv_eos' |
| sort_dir: str = 'desc' |
| limit: int = 2000 |
|
|
|
|
| def _s(v): |
| if v is None or (isinstance(v, float) and (math.isnan(v) or pd.isna(v))): |
| return None |
| return v |
|
|
|
|
| @router.post('/rows') |
| def rows(req: RowsRequest): |
| df = get_rows(seasons=req.seasons, leagues=req.leagues, positions=req.positions, |
| age_min=req.age_min, age_max=req.age_max, min_minutes=req.min_minutes, |
| foot=req.foot, mv_min_millions=req.mv_min_millions, |
| mv_max_millions=req.mv_max_millions, nationality=req.nationality, |
| conf=req.conf, sort=req.sort, sort_dir=req.sort_dir, limit=req.limit) |
| out = [] |
| for d in df.to_dict('records'): |
| out.append({ |
| 'pid': str(d['playerId']), |
| 'tm_id': _s(d['tm_id']), |
| 'j': _s(d['Jugador']), |
| 'p': _s(d['Posicion']), |
| 't': _s(d['Temporada']), |
| 'age': _s(d['age']), |
| 'nat': _s(d['nationality']), |
| 'e': _s(d['Equipo']), |
| 'c': _s(d['Competencia']), |
| 'min': _s(d['Minutos totales']), |
| 'mv': _s(d['mv_eos']), |
| 'mv_prev': _s(d['mv_eos_prev']), |
| 'mv_now': _s(d['tm_mv_now']), |
| 'src': _s(d['mv_source']), |
| 'conf': _s(d['match_conf']), |
| 'url': _s(d['tm_url']), |
| 'ct': _s(d['tm_contract_until']), |
| 'foot': _s(d['tm_foot']), |
| }) |
| return {'rows': out, 'count': len(out)} |
|
|