本文目录导读:

这是一个利用Python分析足球转会窗对球队实力影响的有趣案例,虽然无法通过简单代码精确衡量战术磨合或化学反应,但我们可以构建一个基于球员市场价值、关键数据统计和转会净投入的量化模型,来近似评估球队实力的变化。
以下是一个完整的Python分析案例,包含数据模拟、计算和可视化。
核心逻辑
- 球员评分模型:每位球员有一个综合能力评分(基于身价、进球、助攻、防守数据等模拟得出)。
- 转入/转出:定义每个窗口的转入和转出球员列表及其评分。
- 实力变化计算:
- 转入球员总评分 / 转入人数 (转入平均质量)
- 转出球员总评分 / 转出人数 (流失平均质量)
- 净实力变化 = 转入平均评分 - 转出平均评分
- 位置补强分析:区分前锋、中场、后卫、门将,看哪个位置得到了加强或削弱。
- 财务效率:计算单位花费带来的评分提升(性价比)。
Python 代码实现
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
# 设置中文显示(避免乱码)
matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False
# 1. 模拟数据:转会窗操作
# 假设一支球队在2024年夏季转会窗的操作
# 转入球员数据 [姓名, 位置, 转会费(万欧), 能力评分(0-100), 上赛季进球, 上赛季助攻, 抢断/拦截]
transfers_in = [
["哈兰德", "前锋", 18000, 92, 36, 8, 0],
["贝林厄姆", "中场", 12000, 89, 10, 12, 45],
["格瓦迪奥尔", "后卫", 9000, 87, 3, 2, 68],
["索博斯洛伊", "中场", 7000, 84, 7, 9, 32],
["格拉利什", "前锋", 6000, 83, 5, 10, 18],
]
# 转出球员数据 [姓名, 位置, 转会费(万欧), 能力评分(0-100), 上赛季关键贡献]
transfers_out = [
["马赫雷斯", "前锋", 3500, 85, 12, 8],
["京多安", "中场", 0, 88, 9, 7], # 自由转会身价为0
["拉波尔特", "后卫", 3000, 84, 2, 1],
["帕尔默", "中场", 4500, 78, 1, 3],
["坎塞洛", "后卫", 2500, 86, 3, 4],
]
# 2. 转换为DataFrame方便分析
df_in = pd.DataFrame(transfers_in, columns=["姓名", "位置", "转会费", "能力评分", "进球", "助攻", "抢断"])
df_out = pd.DataFrame(transfers_out, columns=["姓名", "位置", "转会费", "能力评分", "进球", "助攻"])
print("="*50)
print("📊 【转会窗操作明细】")
print("="*50)
print("\n✅ 转入球员:")
print(df_in[["姓名", "位置", "转会费", "能力评分"]].to_string(index=False))
print("\n❌ 转出球员:")
print(df_out[["姓名", "位置", "能力评分"]].to_string(index=False))
# 3. 计算整体实力变化指标
avg_in_rating = df_in["能力评分"].mean()
avg_out_rating = df_out["能力评分"].mean()
net_rating_change = avg_in_rating - avg_out_rating
total_in_fee = df_in["转会费"].sum()
total_out_fee = df_out["转会费"].sum()
net_spend = total_in_fee - total_out_fee
print("\n" + "="*50)
print("💰 【核心财务指标】")
print("="*50)
print(f"转入总花费:{total_in_fee:,.0f} 万欧")
print(f"转出总收入:{total_out_fee:,.0f} 万欧")
print(f"净支出:{net_spend:,.0f} 万欧")
print("\n" + "="*50)
print("📈 【实力变化指标】")
print("="*50)
print(f"转入球员平均能力评分:{avg_in_rating:.1f}")
print(f"转出球员平均能力评分:{avg_out_rating:.1f}")
print(f"⚠️ 净实力变化(转入平均-转出平均):{net_rating_change:+.1f}")
if net_rating_change > 0:
print("新援平均质量高于离队球员,纸面实力提升 ✅")
elif net_rating_change < 0:
print("新援平均质量低于离队球员,纸面实力下降 ❌")
else:
print("平均质量持平,但需看位置匹配度 ⚖️")
# 4. 位置维度分析
print("\n" + "="*50)
print("🔍 【位置补强分析】")
print("="*50)
positions = ["前锋", "中场", "后卫", "门将"]
for pos in positions:
pos_in = df_in[df_in["位置"] == pos]
pos_out = df_out[df_out["位置"] == pos]
in_count = len(pos_in)
out_count = len(pos_out)
if in_count > 0:
in_avg = pos_in["能力评分"].mean()
else:
in_avg = 0
if out_count > 0:
out_avg = pos_out["能力评分"].mean()
else:
out_avg = 0
change = in_avg - out_avg
sign = "+" if change > 0 else ""
print(f"\n📌 {pos}:")
print(f" 转入 {in_count} 人, 平均评分 {in_avg:.1f}")
print(f" 转出 {out_count} 人, 平均评分 {out_avg:.1f}")
if change != 0:
print(f" 实力变化:{sign}{change:.1f} 分")
if in_count > 0 and out_count == 0:
print(" ✅ 新增位置深度")
elif in_count == 0 and out_count > 0:
print(" ❌ 位置人员流失")
elif in_count > 0 and out_count > 0:
if change > 0:
print(" ✅ 该位置得到加强")
else:
print(" ❌ 该位置被削弱")
# 5. 可视化:实力变化对比
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 左图:球员评分对比
ax1 = axes[0]
all_players = df_in[["姓名", "能力评分"]].rename(columns={"姓名":"name", "能力评分":"score"})
all_players["type"] = "转入"
out_players = df_out[["姓名", "能力评分"]].rename(columns={"姓名":"name", "能力评分":"score"})
out_players["type"] = "转出"
combined = pd.concat([all_players, out_players], ignore_index=True)
# 绘制横向条形图
bars1 = ax1.barh(combined["name"], combined["score"], color=combined["type"].map({"转入":"#27ae60", "转出":"#e74c3c"}), edgecolor='white')
ax1.set_xlabel("能力评分 (0-100)", fontsize=12)
ax1.set_title("🧑🤝🧑 转入 vs 转出 球员评分", fontsize=14, fontweight='bold')
ax1.axvline(x=avg_in_rating, color='#27ae60', linestyle='--', linewidth=1.5, label=f'转入均分 {avg_in_rating:.1f}')
ax1.axvline(x=avg_out_rating, color='#e74c3c', linestyle='--', linewidth=1.5, label=f'转出均分 {avg_out_rating:.1f}')
ax1.legend()
# 在条上显示评分
for i, (name, score) in enumerate(zip(combined["name"], combined["score"])):
ax1.text(score + 0.5, i, f'{score:.0f}', va='center', fontsize=9)
# 右图:位置实力变化热力图(柱状图)
ax2 = axes[1]
pos_list = []
change_list = []
for pos in ["前锋", "中场", "后卫"]:
pi = df_in[df_in["位置"] == pos]["能力评分"].mean() if len(df_in[df_in["位置"] == pos]) > 0 else 0
po = df_out[df_out["位置"] == pos]["能力评分"].mean() if len(df_out[df_out["位置"] == pos]) > 0 else 0
pos_list.append(pos)
change_list.append(pi - po)
colors = ['#2ecc71' if x > 0 else '#e74c3c' for x in change_list]
bars2 = ax2.bar(pos_list, change_list, color=colors, edgecolor='white', width=0.5)
ax2.axhline(y=0, color='gray', linestyle='-', linewidth=1)
ax2.set_ylabel("实力变化 (分)", fontsize=12)
ax2.set_title("🎯 各位置实力变化", fontsize=14, fontweight='bold')
# 在柱子上显示数值
for bar, val in zip(bars2, change_list):
height = bar.get_height()
ax2.text(bar.get_x() + bar.get_width()/2., height + 0.5 if height > 0 else height - 1.5,
f'{val:+.1f}', ha='center', va='bottom' if height > 0 else 'top', fontsize=10, fontweight='bold')
plt.tight_layout()
plt.show()
# 6. 财务效率分析(性价比)
print("\n" + "="*50)
print("💡 【财务效率分析】")
print("="*50)
df_in["性价比"] = df_in["能力评分"] / (df_in["转会费"] / 1000) # 每千万欧获得的评分
print("\n转入球员性价比(评分/千万欧):")
sorted_in = df_in.sort_values("性价比", ascending=False)
for _, row in sorted_in.iterrows():
print(f" {row['姓名']:8s} | 评分 {row['能力评分']:2d} | 身价 {row['转会费']:5.0f}万 | 性价比 {row['性价比']:.2f}")
# 附加:综合实力评分(加权)
print("\n" + "="*50)
print("🧮 【综合实力评分(加权模型)】")
print("="*50)
# 简单加权:球队总实力 = 转入平均*转入人数 - 转出平均*转出人数 + 位置匹配度(简化)
total_in_strength = df_in["能力评分"].sum()
total_out_strength = df_out["能力评分"].sum()
net_strength = total_in_strength - total_out_strength
print(f"转入总评分:{total_in_strength:.0f}")
print(f"转出总评分:{total_out_strength:.0f}")
print(f"净评分变化(总和):{net_strength:+.0f}")
print(f"转入人数:{len(df_in)} 人, 转出人数:{len(df_out)} 人")
运行结果解读(模拟数据下)
当你运行这段代码,会看到:
- 转入/转出明细:显示球员名字、位置、身价、评分。
- 核心指标:
- 净支出:可能是巨额投入(如 5.2亿 - 0.45亿 = 4.75亿)。
- 净实力变化:
(92+89+87+84+83)/5 - (85+88+84+78+86)/5 = 87.0 - 84.2 = +2.8分,说明新援平均实力高于离队球员。
- 位置分析:
- 前锋:哈兰德(92)> 马赫雷斯(85) → 加强。
- 中场:贝林厄姆(89)+ 索博斯洛伊(84)替换京多安(88)+ 帕尔默(78) → 平均提升。
- 后卫:格瓦迪奥尔(87)替换拉波尔特(84)+ 坎塞洛(86) → 平均略降但年轻化。
- 可视化:左侧条形图清晰对比每个球员的评分;右侧柱状图展示各位置实力变化(正数加强,负数削弱)。
- 财务效率:
性价比 = 评分 / (转会费/1000万),比如格拉利什 6000万得83分,性价比 13.8;哈兰德 1.8亿得92分,性价比 5.1,后者虽然贵但评分高,性价比低意味着溢价高。
如何用于真实场景?
你可以用以下真实数据替换模拟数据:
- 数据来源:从 Transfermarkt、SofaScore、Whoscored 爬取球员身价、Whoscored综合评分、上赛季关键数据。
- 评分模型改进:
能力评分=身价权重 * 标准化身价 + 进攻权重 * (进球+助攻) + 防守权重 * (抢断+拦截+解围) + 年龄调整。- 使用 线性回归 或 PCA 从历史数据中训练评分权重。
- 增加权重:主力球员评分×1.2,轮换球员×1.0,青年球员×0.8,更准确反映实际贡献。
代码扩展方向
- 多窗口对比:对比2023夏窗 vs 2024夏窗,看实力是否逐年提升。
- 联赛竞争力模型:将本队实力变化与联赛其他强队(如转会更猛的队伍)对比。
- 伤病风险调整:根据球员过去2年出场次数,对评分进行折损(脆皮球员扣分)。
- Web界面:用 Streamlit 做成交互式App,让用户上传自己的转会数据。
这个案例提供了一个可量化、可复现的框架,让你从“感觉转会操作不错”升级到“用数据证明实力变化+3.5%”,如果你有具体的球队或转会数据,我可以帮你写一个定制化版本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播