本文目录导读:

- 方案一:基于“文本日志”的简易统计(使用 Python)
- 方案二:基于“结构化表格数据”(使用 Python + Pandas)
- 方案三:数据库 SQL 统计(适用于 MySql / PostgreSQL)
- 温馨提示:如何定义“成功”?
要统计“关门防守”成功次数,首先需要明确“关门防守”在数据上的定义,在篮球或足球统计中,通常指防守方在对手进行突破或切入时,两名防守球员同时收缩夹击,迫使对手失误、投篮不中或传球失误。
由于你没有提供具体的数据格式(如数据库表、CSV文件或比赛日志),我为你编写了三种最实用的脚本方案,覆盖了最常见的统计场景,你可以根据自己的数据情况选择使用。
基于“文本日志”的简易统计(使用 Python)
适用场景:你的数据是比赛文字直播或人工记录的行文本,
12:30 对手突破,A球员和B球员关门防守,对手失误
12:45 对手突破,防守球员未能关门,对手上篮得分
13:00 对手突破,C球员和D球员关门防守,对手投篮不中
脚本逻辑:通过关键词匹配(如“关门防守”+“失误”/“不中”/“抢断”)来计算成功次数。
import re
def count_closing_defense_success(file_path):
"""
统计文本日志中关门防守成功的次数。
判定标准:日志行中包含“关门”且包含(“失误”或“不中”或“抢断”或“封盖”)。
"""
success_keywords = ['失误', '不中', '抢断', '封盖', '24秒违例']
success_count = 0
total_closing = 0
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
if '关门' in line:
total_closing += 1
# 检查是否成功
if any(keyword in line for keyword in success_keywords):
success_count += 1
print(f"[成功] {line.strip()}")
else:
print(f"[失败/未定] {line.strip()}")
print(f"\n总计关门防守次数: {total_closing}")
print(f"关门防守成功次数: {success_count}")
print(f"成功率: {success_count/total_closing:.1%}" if total_closing > 0 else "无数据")
return success_count
# 使用方法
if __name__ == "__main__":
# 假设你的日志文件叫 game_log.txt
count_closing_defense_success('game_log.txt')
基于“结构化表格数据”(使用 Python + Pandas)
适用场景:你的数据是 Excel 或 CSV,每一行代表一次防守回合,且有具体的防守类型和防守结果列。
假设数据格式(CSV示例):
| 时间 | 防守类型 | 防守人1 | 防守人2 | 防守结果 |
|---|---|---|---|---|
| 12:30 | 关门 | A | B | 对手失误 |
| 12:45 | 包夹 | C | D | 对手得分 |
| 13:00 | 关门 | E | F | 投篮不中 |
脚本逻辑:筛选 防守类型 为“关门”,且 防守结果 属于成功结果的条目。
import pandas as pd
def count_success_from_csv(csv_path):
# 读取数据
df = pd.read_csv(csv_path, encoding='utf-8')
# 筛选出所有关门防守的记录
closing_df = df[df['防守类型'] == '关门']
# 定义成功的结果类型(根据你的实际字段值调整)
success_results = ['对手失误', '投篮不中', '抢断', '盖帽', '24秒违例']
# 统计成功次数
success_df = closing_df[closing_df['防守结果'].isin(success_results)]
print(f"关门防守总次数: {len(closing_df)}")
print(f"关门防守成功次数: {len(success_df)}")
print(f"成功率: {len(success_df)/len(closing_df):.1%}" if len(closing_df) > 0 else "无记录")
# 查看具体成功明细
print("\n成功明细:")
print(success_df[['时间', '防守人1', '防守人2', '防守结果']].to_string(index=False))
return len(success_df)
# 使用方法
if __name__ == "__main__":
count_success_from_csv('defensive_stats.csv')
数据库 SQL 统计(适用于 MySql / PostgreSQL)
适用场景:数据存在数据库的 defensive_actions 表中。
表结构示例:
CREATE TABLE defensive_actions (
id INT PRIMARY KEY,
game_time VARCHAR(10),
action_type VARCHAR(20), -- 如 '关门', '包夹'
result VARCHAR(20), -- 如 '对手失误', '投篮不中', '对手得分'
defender1 VARCHAR(20),
defender2 VARCHAR(20)
);
SQL 统计语句:
SELECT
COUNT(*) AS 总关门次数,
SUM(CASE WHEN result IN ('对手失误', '投篮不中', '抢断', '盖帽', '24秒违例')
THEN 1 ELSE 0 END) AS 成功次数,
ROUND(
SUM(CASE WHEN result IN ('对手失误', '投篮不中', '抢断', '盖帽', '24秒违例')
THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1
) AS 成功率
FROM defensive_actions
WHERE action_type = '关门';
温馨提示:如何定义“成功”?
为了让脚本更准确地工作,你需要先确定你的具体标准。“关门防守成功” 指的是通过关门破坏了对方进攻,包括以下五种情况的一种:
- 迫使对方失误(传球失误、运球失误、走步)
- 迫使对方投篮不中(特别是仓促出手)
- 直接完成抢断
- 造成封盖
- 迫使对方24秒进攻违例或8秒后场违例
如果某次关门导致对方犯规(防守犯规)或对方依然得分,则不算成功。
请告诉我你的数据是什么样的(是文本、Excel还是数据库)? 如果你提供样例数据,我可以直接为你写出完全匹配的脚本。