v1.2.0 独立详情页+赛季选择+季后赛对阵图:/team|player|game|news|person/<id> 详情页(交叉链接);弹窗加查看完整详情;排名页多赛季切换(2024-25/2025-26);季后赛bracket对阵图(playoffs.py);seed_seasons补充数据
This commit is contained in:
+164
@@ -0,0 +1,164 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
赛季补充数据(独立于主 seed,不覆盖现有数据):
|
||||
1. 补齐 2025-26 季后赛首轮缺失系列(每系列 2 场,高顺位 2-0 晋级)
|
||||
2. 生成 2024-25 赛季:常规赛排名(30 队)+ 完整季后赛对阵(首轮 8 系列 / 次轮 4 / 分区决赛 2 / 总决赛 3 场)
|
||||
用法:python3 seed_seasons.py
|
||||
"""
|
||||
import logging
|
||||
import random
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
|
||||
log = logging.getLogger("seed_seasons")
|
||||
|
||||
from db import init_db, execute, query, query_one # noqa: E402
|
||||
|
||||
random.seed(42)
|
||||
|
||||
# ---------------------------------------------------------------- 2025-26 季后赛补充
|
||||
# (轮次, 时间, 主队code, 客队code, 主分, 客分)
|
||||
R1_2026 = [
|
||||
("季后赛首轮", "2026-04-20 08:00", "CLE", "ORL", 120, 98),
|
||||
("季后赛首轮", "2026-04-23 07:30", "CLE", "ORL", 115, 102),
|
||||
("季后赛首轮", "2026-04-20 07:00", "NYK", "MIA", 108, 96),
|
||||
("季后赛首轮", "2026-04-23 08:00", "NYK", "MIA", 110, 104),
|
||||
("季后赛首轮", "2026-04-21 08:00", "MIL", "IND", 112, 101),
|
||||
("季后赛首轮", "2026-04-24 08:30", "MIL", "IND", 109, 105),
|
||||
("季后赛首轮", "2026-04-19 10:00", "DEN", "HOU", 121, 110),
|
||||
("季后赛首轮", "2026-04-22 09:30", "DEN", "HOU", 118, 109),
|
||||
# 已有系列补第 2 场(胜方再胜 → 2-0)
|
||||
("季后赛首轮", "2026-04-22 10:00", "OKC", "MIN", 126, 110),
|
||||
("季后赛首轮", "2026-04-25 08:00", "BOS", "PHI", 118, 99),
|
||||
("季后赛首轮", "2026-05-01 10:30", "LAL", "MEM", 117, 105),
|
||||
# 次轮补第 2 场(胜方再胜 → 2-0)
|
||||
("季后赛次轮", "2026-05-09 08:30", "BOS", "MIL", 114, 101),
|
||||
("季后赛次轮", "2026-05-19 08:00", "CLE", "NYK", 118, 105),
|
||||
("季后赛次轮", "2026-05-18 09:30", "DEN", "LAL", 116, 108),
|
||||
]
|
||||
|
||||
# ---------------------------------------------------------------- 2024-25 赛季
|
||||
# 常规赛战绩:基于 2025-26 战绩微调(保证排名接近,冠军悬念不同)
|
||||
_W25 = { # code -> (wins, losses) 与 standings 排名一致
|
||||
"BOS": (61, 21), "CLE": (57, 25), "NYK": (53, 29), "MIL": (50, 32),
|
||||
"IND": (48, 34), "MIA": (45, 37), "ORL": (44, 38), "PHI": (42, 40),
|
||||
"ATL": (40, 42), "CHI": (37, 45), "BKN": (34, 48), "TOR": (31, 51),
|
||||
"DET": (28, 54), "WAS": (21, 61), "CHA": (20, 62),
|
||||
"OKC": (66, 16), "DEN": (56, 26), "LAL": (54, 28), "GSW": (52, 30),
|
||||
"DAL": (50, 32), "MEM": (49, 33), "HOU": (48, 34), "MIN": (47, 35),
|
||||
"LAC": (46, 36), "SAC": (43, 39), "PHX": (41, 41), "SAS": (37, 45),
|
||||
"POR": (29, 53), "UTA": (24, 58), "NOP": (23, 59),
|
||||
}
|
||||
CONF25 = { # code -> (conference, rank)
|
||||
"BOS": ("东部", 1), "CLE": ("东部", 2), "NYK": ("东部", 3), "MIL": ("东部", 4),
|
||||
"IND": ("东部", 5), "MIA": ("东部", 6), "ORL": ("东部", 7), "PHI": ("东部", 8),
|
||||
"ATL": ("东部", 9), "CHI": ("东部", 10), "BKN": ("东部", 11), "TOR": ("东部", 12),
|
||||
"DET": ("东部", 13), "WAS": ("东部", 14), "CHA": ("东部", 15),
|
||||
"OKC": ("西部", 1), "DEN": ("西部", 2), "LAL": ("西部", 3), "GSW": ("西部", 4),
|
||||
"DAL": ("西部", 5), "MEM": ("西部", 6), "HOU": ("西部", 7), "MIN": ("西部", 8),
|
||||
"LAC": ("西部", 9), "SAC": ("西部", 10), "PHX": ("西部", 11), "SAS": ("西部", 12),
|
||||
"POR": ("西部", 13), "UTA": ("西部", 14), "NOP": ("西部", 15),
|
||||
}
|
||||
|
||||
# 2024-25 季后赛对阵(每系列 2 场,高顺位 2-0 晋级;总决赛 3 场 2-1,凯尔特人夺冠)
|
||||
# 格式: (轮次, [(主队, 客队, 主分, 客分), ...])
|
||||
PLAYOFFS25 = [
|
||||
("季后赛首轮", [
|
||||
("BOS", "PHI", 124, 102), ("BOS", "PHI", 118, 96), # 1 vs 8
|
||||
("CLE", "ORL", 112, 95), ("CLE", "ORL", 109, 98),
|
||||
("NYK", "MIA", 105, 97), ("NYK", "MIA", 111, 103),
|
||||
("MIL", "IND", 110, 101), ("MIL", "IND", 107, 99),
|
||||
("OKC", "MIN", 123, 108), ("OKC", "MIN", 117, 104),
|
||||
("DEN", "HOU", 119, 106), ("DEN", "HOU", 114, 107),
|
||||
("LAL", "MEM", 116, 110), ("LAL", "MEM", 121, 112),
|
||||
("GSW", "DAL", 120, 113), ("GSW", "DAL", 115, 109),
|
||||
]),
|
||||
("季后赛次轮", [
|
||||
("BOS", "MIL", 116, 105), ("BOS", "MIL", 112, 100), # 上半区
|
||||
("CLE", "NYK", 108, 101), ("CLE", "NYK", 114, 106), # 下半区
|
||||
("OKC", "GSW", 125, 117), ("OKC", "GSW", 121, 110),
|
||||
("DEN", "LAL", 117, 111), ("DEN", "LAL", 113, 108),
|
||||
]),
|
||||
("东部决赛", [
|
||||
("BOS", "CLE", 115, 102), ("BOS", "CLE", 110, 104),
|
||||
]),
|
||||
("西部决赛", [
|
||||
("OKC", "DEN", 118, 112), ("OKC", "DEN", 121, 116),
|
||||
]),
|
||||
("总决赛", [
|
||||
("BOS", "OKC", 108, 105), ("OKC", "BOS", 118, 112), ("BOS", "OKC", 117, 110),
|
||||
]),
|
||||
]
|
||||
|
||||
VENUES = {
|
||||
"BOS": "TD花园", "CLE": "速贷中心", "NYK": "麦迪逊广场花园", "MIL": "费哲论坛球馆",
|
||||
"OKC": "佩科姆中心", "DEN": "波尔球馆", "LAL": "加密网球馆", "GSW": "大通中心",
|
||||
"ORL": "安利中心", "MIA": "卡塞亚中心", "IND": "甘布里吉球场", "PHI": "富国银行中心",
|
||||
"MIN": "目标中心", "HOU": "丰田中心", "MEM": "联邦快递球馆", "DAL": "美航中心",
|
||||
}
|
||||
|
||||
|
||||
def _team_ids():
|
||||
return {r["code"]: r["id"] for r in query("SELECT id, code FROM teams")}
|
||||
|
||||
|
||||
def _insert_game(league_id, season, rnd, gt, home_id, away_id, hs, as_, venue, bcast="TNT"):
|
||||
execute("""INSERT INTO games(league_id,season,round_name,game_time,status,home_team_id,away_team_id,
|
||||
home_score,away_score,venue,broadcast) VALUES(?,?,?,?,?,?,?,?,?,?,?)""",
|
||||
(league_id, season, rnd, gt, "finished", home_id, away_id, hs, as_, venue, bcast))
|
||||
|
||||
|
||||
def add_2025_26_round1():
|
||||
tid = _team_ids()
|
||||
league_id = query_one("SELECT id FROM leagues WHERE code='NBA'")["id"]
|
||||
n = 0
|
||||
for rnd, gt, h, a, hs, as_ in R1_2026:
|
||||
if query_one("SELECT 1 FROM games WHERE round_name=? AND game_time=?", (rnd, gt)):
|
||||
continue
|
||||
_insert_game(league_id, "2025-26", rnd, gt, tid[h], tid[a], hs, as_, VENUES.get(h, "球馆"))
|
||||
n += 1
|
||||
log.info("2025-26 季后赛首轮补充 %d 场", n)
|
||||
|
||||
|
||||
def seed_2024_25():
|
||||
tid = _team_ids()
|
||||
league_id = query_one("SELECT id FROM leagues WHERE code='NBA'")["id"]
|
||||
# 排名
|
||||
n_s = 0
|
||||
for code, (w, l) in _W25.items():
|
||||
conf, rk = CONF25[code]
|
||||
if not query_one("SELECT 1 FROM standings WHERE season='2024-25' AND team_id=?", (tid[code],)):
|
||||
execute("""INSERT INTO standings(league_id,season,team_id,wins,losses,win_pct,conference,rank)
|
||||
VALUES(?,?,?,?,?,?,?,?)""",
|
||||
(league_id, "2024-25", tid[code], w, l, round(w / (w + l), 4), conf, rk))
|
||||
n_s += 1
|
||||
# 比赛
|
||||
n_g = 0
|
||||
for rnd, games in PLAYOFFS25:
|
||||
for i, (h, a, hs, as_) in enumerate(games):
|
||||
gt = _gt25(rnd, i)
|
||||
if query_one("SELECT 1 FROM games WHERE round_name=? AND game_time=?", (rnd, gt)):
|
||||
continue
|
||||
_insert_game(league_id, "2024-25", rnd, gt, tid[h], tid[a], hs, as_,
|
||||
VENUES.get(h, "球馆"))
|
||||
n_g += 1
|
||||
log.info("2024-25 赛季:排名 %d 行,季后赛 %d 场", n_s, n_g)
|
||||
|
||||
|
||||
def _gt25(rnd, i):
|
||||
base = {"季后赛首轮": "2025-04-19", "季后赛次轮": "2025-05-06",
|
||||
"东部决赛": "2025-05-20", "西部决赛": "2025-05-21", "总决赛": "2025-06-03"}[rnd]
|
||||
from datetime import datetime, timedelta
|
||||
d = datetime.strptime(base, "%Y-%m-%d") + timedelta(days=i)
|
||||
hour = "08:30" if rnd == "总决赛" else "09:00"
|
||||
return f"{d.strftime('%Y-%m-%d')} {hour}"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
init_db()
|
||||
add_2025_26_round1()
|
||||
seed_2024_25()
|
||||
from db import table_count
|
||||
for r in query("SELECT season, COUNT(*) c FROM games GROUP BY season"):
|
||||
log.info("games %s: %d 场", r["season"], r["c"])
|
||||
for r in query("SELECT season, COUNT(*) c FROM standings GROUP BY season"):
|
||||
log.info("standings %s: %d 行", r["season"], r["c"])
|
||||
Reference in New Issue
Block a user