讲师中心 微信公众号
AI工具推荐 视频效率加速

计算网球选手胜负连 streak 的完整 Python 实现教程

落浩同学_5821

落浩同学_5821

发布时间:2026-01-10 17:19:26

|

788人浏览过

|

来源于php中文网

原创

计算网球选手胜负连 streak 的完整 Python 实现教程

本文详解如何基于 pandas dataframe 高效计算每位球员的动态胜负连 streak(胜为正数、负为负数),支持跨列识别(player1_id / player2_id 双向匹配),并保持时间顺序逻辑。

在网球等对战类体育数据分析中,球员的当前胜负连 streak(即连续获胜或失败的场次数)是刻画状态、预测表现的关键特征。但与简单累计不同,streak 具有「重置性」:一旦胜败结果反转,计数需从 ±1 重新开始(例如:赢→赢→输 → streak 从 +2 变为 −1)。更复杂的是,同一球员可能交替出现在 player1_id 或 player2_id 列中,需统一追踪其历史战绩。

以下提供一种高效、可读性强且无需分组排序的纯 Python + Pandas 实现方案,适用于大规模赛事数据(百万级记录亦可稳定运行)。

Secure Python Code Sandbox
Secure Python Code Sandbox

安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。

下载

✅ 核心思路

  • 使用字典 cnt 维护每个唯一球员 ID 的实时 streak 值(初始化为 0);
  • 按原始数据顺序逐行遍历(关键:必须保证 tourney_date 已升序排序,否则 streak 逻辑失效);
  • 对每行:
    • 记录当前 player1_id 和 player2_id 的旧 streak 值(用于新列);
    • 更新 player1_id 的 streak:若 target == 1(player1 胜),则 +1;否则 −1;
    • 更新 player2_id 的 streak:若 target == 1(player1 胜 ⇒ player2 败),则 −1;否则 +1;
  • 使用 max(..., +1) 和 min(..., −1) 并非必需(原答案此处存在逻辑偏差),正确更新应直接按胜负符号累加/重置 —— 我们将在下方修正并给出鲁棒实现。

✅ 推荐实现(修正版,逻辑严谨)

import pandas as pd
import numpy as np

# 示例数据构建(确保已按 tourney_date 升序排列!)
df = pd.DataFrame({
    'tourney_date': ['2022-10-31', '2023-02-06', '2023-02-06', '2023-02-06', '2023-02-06', '2023-02-20', '2023-02-20'],
    'player1_id': [100000, 123456, 100000, 100000, 345612, 432154, 100000],
    'player2_id': [209950, 100000, 543210, 876543, 100000, 100000, 929292],
    'target': [0, 0, 1, 1, 1, 1, 0]
})

# ✅ 正确 streak 更新逻辑:先记录旧值,再按胜负更新
player_ids = pd.concat([df['player1_id'], df['player2_id']]).unique()
streak_map = {pid: 0 for pid in player_ids}  # 初始化所有球员 streak 为 0

player1_streaks, player2_streaks = [], []

for _, row in df.iterrows():
    p1, p2, t = row['player1_id'], row['player2_id'], row['target']

    # 记录当前球员「赛前」streak(即本场开始前的状态)
    player1_streaks.append(streak_map[p1])
    player2_streaks.append(streak_map[p2])

    # 更新 streak:胜 → +1,败 → -1;首次出场为 0,首胜后变为 +1,首败后变为 -1
    if t == 1:  # player1 胜 → player1 streak +1,player2 streak -1
        streak_map[p1] = streak_map[p1] + 1 if streak_map[p1] > 0 else 1
        streak_map[p2] = streak_map[p2] - 1 if streak_map[p2] < 0 else -1
    else:  # t == 0,player1 败 → player1 streak -1,player2 streak +1
        streak_map[p1] = streak_map[p1] - 1 if streak_map[p1] < 0 else -1
        streak_map[p2] = streak_map[p2] + 1 if streak_map[p2] > 0 else 1

# 添加新列
df['player1_streak'] = player1_streaks
df['player2_streak'] = player2_streaks

print(df)

? 输出效果(符合题设预期)

  tourney_date  player1_id  player2_id  target  player1_streak  player2_streak
0   2022-10-31      100000      209950       0               0               0
1   2023-02-06      123456      100000       0               0              -1
2   2023-02-06      100000      543210       1               1               0
3   2023-02-06      100000      876543       1               2               0
4   2023-02-06      345612      100000       1               0               3
5   2023-02-20      432154      100000       1               0              -1
6   2023-02-20      100000      929292       0              -2               0

⚠️ 关键注意事项

  • 时间顺序是前提:务必先执行 df = df.sort_values('tourney_date').reset_index(drop=True),否则 streak 将完全错误;
  • 首次出场处理:规则明确「第一场为 0」,因此我们记录的是 赛前 streak,而非赛后值(题设示例表中 player1_streak 第一行即为 0);
  • 性能优化建议:对超大数据集(>100 万行),可用 df.itertuples() 替代 iterrows() 提速 3–5 倍;
  • 扩展性提示:如需同时计算「最长历史 streak」或「当前 streak 长度」,可在同一遍历中用额外字典维护 max_win_streak[pid]、max_lose_streak[pid]。

该方法避免了 groupby().apply() 的高开销与复杂状态管理,以 O(n) 时间复杂度完成双方向动态 streak 构建,是体育数据分析中轻量、可靠、易维护的标准实践。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

691

2026.04.13

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

18373

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

433

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

328

2025.12.30

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

343

2026.03.06

宝塔面板Nginx性能优化与高并发配置实践
宝塔面板Nginx性能优化与高并发配置实践

本专题围绕宝塔环境下的 Nginx 优化展开,深入讲解缓存策略、连接数调优、Gzip 压缩、静态资源加速及反向代理配置。帮助用户提升网站访问速度与并发处理能力。

936

2026.03.25

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn