NBA Feed
팀 뉴스와 경기 정보를 제공, 점수는 직접 확인할 때까지 숨겨져 있습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
ML-powered UFC fight analytics. Scrapes every UFC event from UFCStats.com, trains machine learning models on historical outcomes, and publishes weekly predictions for upcoming cards with a full transparency scorecard.README 전문 보기 ↗ML-powered UFC fight analytics. Scrapes every UFC event from UFCStats.com, trains machine learning models on historical outcomes, and publishes weekly predictions for upcoming cards with a full transparency scorecard.
Live site: kabes-maybes.vercel.app
text(), no ORM model layer)kabes-maybes-api, us-central1)@theme block in index.css)main)All endpoints versioned under /api/v1. Swagger docs at /docs.
| Method | Path | Description |
|---|---|---|
| GET | /health | Liveness check |
| GET | /health/db | DB readiness (503 if unreachable) |
| GET | /api/v1/fighters | Paginated fighter list (?search=, ?page=, ?page_size=) |
| GET | /api/v1/fighters/{id} | Fighter profile + physical stats + career record |
| GET | /api/v1/fights | Paginated fight list (filters: event, fighter, weight class, method) |
| GET | /api/v1/fights/{id} | Fight detail + round-by-round stats |
| GET | /api/v1/events | Paginated event list (?year=) |
| GET | /api/v1/events/{id} | Event detail + full fight card |
| POST | /api/v1/predictions/fight-outcome | Win probability + method breakdown |
| POST | /api/v1/chat | Natural-language Q&A — converts question to SQL, executes, returns formatted answer (Groq/gpt-oss-120b) |
| GET | /api/v1/analytics/style-evolution | Finish rates, output metrics, and physical stats by year (?weight_class=) |
| GET | /api/v1/analytics/fighter-endurance/{id} | Round-by-round performance profile |
| GET | /api/v1/analytics/betting-insights | Model vs Vegas ROI summary, strategy leaderboard, calibration data |
| GET | /api/v1/analytics/betting-insights/fights | Fight-level model vs Vegas breakdown (filterable by conviction, weight class) |
| GET | /api/v1/analytics/betting-roi | Aggregated ROI by strategy and conviction bucket |
| GET | /api/v1/upcoming/events | Upcoming UFC events ordered by date |
| GET | /api/v1/upcoming/events/{id} | Upcoming event card + pre-computed predictions |
9 GitHub Actions workflows keep everything current:
Daily 03:00 UTC → daily-keepalive ping Supabase to prevent free tier pause
Daily 06:00 UTC → pipeline-health open a GitHub issue if a pipeline run failed
or a finished card's predictions were not archived
Saturday 15:00 UTC → upcoming-predictions scrape announced fights + compute predictions
Sunday 14:00 UTC → weekly-ufc-scraper scrape completed events from UFCStats
→ post-scrape-clean ETL (FK resolution, type parsing, derived cols)
+ archive pre-fight predictions before features change
(runs even if validation fails)
→ feature-engineering rebuild training_data.parquet
→ retrain retrain models + commit artefacts
→ deploy-backend build Docker image + deploy to Cloud Run
Every push / PR → pipeline-check run the pipeline's gates against live data
scripts/check-pipeline.sh is the same check, runnable locally and wired into a pre-push hook (git config core.hooksPath .githooks).
| Subset | Accuracy | Fights |
|---|---|---|
| All fights (test set) | 63.57% | 958 |
Test period: Apr 2024 - Jun 2026. Model: the win/loss classifier is re-selected on every retrain by validation AUC from three candidates - logistic regression, random forest, and gradient boosting (XGBoost). The three sit within noise of each other, so the selected model varies retrain to retrain.
Features: 30 differentials across physical attributes, rolling striking/grappling metrics, experience, and time-based features. Full per-event and conviction-bucket breakdowns are live on the Betting Insights page.
git clone https://github.com/kibbbles/ufc_analytics_platform.git
cd ufc_analytics_platform
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r backend/requirements.txt
Create .env in the project root:
DATABASE_URL=postgresql://...
ENVIRONMENT=development
LOG_LEVEL=DEBUG
ALLOWED_ORIGINS=["http://localhost:3000"]
cd backend && python run_dev.py
# API: http://localhost:8000
# Docs: http://localhost:8000/docs
cd frontend && npm install
npm run dev # http://localhost:3000 (proxies /api → :8000)
npm run build # production build
npm run type-check
npm run lint
ufc_analytics_platform/
├── backend/
│ ├── api/
│ │ ├── main.py # FastAPI app, CORS, middleware, exception handlers
│ │ ├── dependencies.py # get_db() session dependency
│ │ ├── routers/health.py # /health, /health/db
│ │ └── v1/endpoints/ # fighters, fights, events, predictions, upcoming,
│ │ # past_predictions, analytics, chat
│ ├── core/ # config, logging, middleware
│ ├── db/ # SQLAlchemy engine + SessionLocal
│ ├── features/ # Feature engineering pipeline
│ │ ├── pipeline.py # build_prediction_features(fighter_a_id, fighter_b_id, as_of)
│ │ ├── extractors.py # get_fights_long_df(), get_stats_df()
│ │ ├── rolling_metrics.py # 3/5/7-fight rolling averages + EWA
│ │ └── run_build.py # Entry point → training_data.parquet
│ ├── ml/ # Models + evaluation
│ │ ├── win_loss_v1.joblib # Win/loss classifier (best of LR / RF / XGBoost by val AUC)
│ │ ├── method_v1.joblib # Method classifier (KO/TKO, Sub, Dec)
│ │ ├── metrics.json # Test set metrics
│ │ └── run_train.py # Entry point
│ ├── schemas/ # Pydantic v2 request/response models
│ ├── scraper/
│ │ ├── live_scraper.py # Weekly scraper — all 6 core tables
│ │ ├── upcoming_scraper.py # Upcoming events + fighter matching
│ │ ├── run_upcoming.py # Entry point for upcoming scraper
│ │ ├── compute_past_predictions.py # Retroactive scorecard backfill
│ │ ├── archive_completed_predictions.py # Freeze pre-fight snapshots (Task 26)
│ │ ├── post_scrape_clean.py # ETL orchestrator (4 phases)
│ │ └── validate_etl.py # Data quality validation
│ ├── db/migrations/ # SQL migration files
│ ├── run_dev.py # Dev server launcher
│ └── gunicorn.conf.py # Production server config (reads $PORT)
├── frontend/
│ └── src/
│ ├── components/ # common/, layout/, features/
│ ├── hooks/ # useApi, useDarkMode, useDebounce
│ ├── pages/ # One file per route (lazy-loaded)
│ ├── router/index.tsx # createBrowserRouter
│ ├── services/ # Axios client + API service classes (chatService, etc.)
│ ├── types/api.ts # TypeScript interfaces mirroring Pydantic schemas
│ └── utils/ # Pure helpers
├── .github/workflows/ # 9 automation workflows
├── Dockerfile # Python 3.12-slim, Gunicorn
├── render.yaml # Render IaC (fallback config)
└── docs/ # project_history.ipynb, project_writeup.ipynb
Kabe (kay-bee) — @kibbbles
Last Updated: 2026-07-03
| GET | /api/v1/upcoming/fights/{id} | Single upcoming fight + full feature differentials |
| GET | /api/v1/past-predictions | Model scorecard — summary stats + recent outcomes |
| GET | /api/v1/past-predictions/events | Paginated past events with per-event accuracy |
| GET | /api/v1/past-predictions/events/{id} | All predictions for a specific past event |
| GET | /api/v1/past-predictions/fights | Fight-level search across all past predictions |
| GET | /api/v1/past-predictions/fights/{id} | Single past prediction by fight ID |