7.3 基础数据盘点:你能拿到的原始字段
基础造房子先看建材。这一篇盘点你能从接口拿到的原料。
一、五类原料
| 类别 | 典型字段 | 能构造什么 |
|---|---|---|
| 赛事结果 | 比分、进球时间、主客、赛事 | 基础统计、胜负分布 |
| 技术统计 | 射门、射正、控球、角球、犯规、传球 | 攻防强度、效率指标 |
| 事件流 | 进球、换人、黄红牌(含时间) | 比赛节奏、临场变化分析 |
| 阵容与球员 | 首发、替补、球员逐场数据 | 阵容完整度、球员贡献度 |
| 市场数据 | 数据数值快照、历史变化 | 隐含概率、离散度、预期差 |
二、关键字段清单
技术统计中最重要的字段
| 字段 | 为什么重要 |
|---|---|
| 射门次数 / 射正次数 | 进攻量的基础 |
| 控球率 | 比赛主导权(但参考综合性价比被高估) |
| 角球数 | 持续的进攻压迫指标 |
| 犯规 / 黄牌数 | 比赛激烈程度与防守方式 |
| 传球成功率 | 技术稳定性(需结合对手强度看) |
市场数据的字段
| 字段 | 用途 |
|---|---|
| 主胜 / 平局 / 客胜数据数值 | 换算隐含概率 |
| 让球实力预期门槛 | 实力差距的市场定价 |
| 进球数预期实力预期门槛 | 进球期望的市场定价 |
| 快照时间 | 观察数据数值随时间的变动 |
三、数据质量的三个现实问题
问题一:覆盖度不一致
不同联赛的数据颗粒度不同。主流联赛字段完整,小联赛可能只有基础统计。
应对策略:在代码里做字段存在性检查,缺失时降级处理而不是报错。
def safe_get(data, *keys, default=None):
"""安全地从嵌套字典中取值,任一环节缺失都返回默认值"""
cur = data
for k in keys:
if not isinstance(cur, dict) or k not in cur:
return default
cur = cur[k]
return cur if cur is not None else default
# 示例:取射门次数,缺失时用 None 而不是抛异常
shots = safe_get(match, 'stats', 'home', 'shots', default=None)
if shots is None:
print('该场次无射门数据,跳过')
问题二:口径差异
同一个「射门次数」,不同数据源的判定标准可能不同(是否包含被封堵的射门)。
应对策略:同一套指标必须始终用同一数据源,不要混用。
问题三:缺失值
| 缺失类型 | 处理方式 |
|---|---|
| 完全缺失 | 该场次排除,不要用均值填充 |
| 偶发缺失 | 可用同类均值填充,但需标记 |
| 结构性缺失 | 如小联赛没有高阶数据,需降级处理 |
重要原则:缺失值不要用均值填充。
足球数据的缺失往往不是随机的——小联赛更容易缺数据,而小联赛本身就有系统性特征。
用均值填充会把这个偏差带入模型。更好的做法是「排除该样本」或「降级使用基础字段」。
四、数据获取的最小代码骨架
import os, json, time, requests
from pathlib import Path
API_KEY = os.environ.get('QIUXIAOCE_API_KEY', 'YOUR_API_KEY_HERE')
BASE = 'https://www.qiuxiaoce.com/wp-json/abv2-creator/v1'
CACHE = Path('./data_cache')
CACHE.mkdir(exist_ok=True)
HEADERS = {'X-API-Key': API_KEY, 'Accept': 'application/json'}
def fetch(path, params=None, cache_key=None, ttl=604800):
"""带本地缓存的请求。历史数据不会变,缓存 7 天。"""
if cache_key:
f = CACHE / f'{cache_key}.json'
if f.exists() and time.time() - f.stat().st_mtime < ttl:
return json.loads(f.read_text(encoding='utf-8'))
r = requests.get(f'{BASE}{path}', headers=HEADERS, params=params, timeout=20)
r.raise_for_status()
data = r.json()
if cache_key:
(CACHE / f'{cache_key}.json').write_text(
json.dumps(data, ensure_ascii=False), encoding='utf-8')
return data
# 拉取一支球队最近的比赛(用于构建滚动统计)
team_id = 42
fixtures = fetch(f'/teams/{team_id}/fixtures', cache_key=f'team_{team_id}_fixtures')
五、原料决定上限
你不可能用烂数据造出好指标。
特征工程的重要性远高于模型选择。同样一个逻辑回归,喂 5 个粗糙特征和喂 30 个精心构造的特征,效果差距可能是数量级的。
这也是为什么球小策把绝大部分精力放在数据层。
下一步该看什么
- 第一个完整构造示例 → 7.4 xG 简化模型
- 权重怎么定 → 7.8
足球赛事前瞻 | AI 智能分析 | 足球数据解读 - 球小策