scouting / routes /rows.py
matias-cataife's picture
browse: add rows route
c6c6a6c verified
Raw
History Blame Contribute Delete
2.19 kB
"""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)}