Python案例认为转会窗操作后实力变化?

wen python案例 3

本文目录导读:

Python案例认为转会窗操作后实力变化?

  1. 核心逻辑
  2. Python 代码实现
  3. 运行结果解读(模拟数据下)
  4. 如何用于真实场景?
  5. 代码扩展方向

这是一个利用Python分析足球转会窗对球队实力影响的有趣案例,虽然无法通过简单代码精确衡量战术磨合或化学反应,但我们可以构建一个基于球员市场价值、关键数据统计和转会净投入的量化模型,来近似评估球队实力的变化。

以下是一个完整的Python分析案例,包含数据模拟、计算和可视化。

核心逻辑

  1. 球员评分模型:每位球员有一个综合能力评分(基于身价、进球、助攻、防守数据等模拟得出)。
  2. 转入/转出:定义每个窗口的转入和转出球员列表及其评分。
  3. 实力变化计算
    • 转入球员总评分 / 转入人数 (转入平均质量)
    • 转出球员总评分 / 转出人数 (流失平均质量)
    • 净实力变化 = 转入平均评分 - 转出平均评分
  4. 位置补强分析:区分前锋、中场、后卫、门将,看哪个位置得到了加强或削弱。
  5. 财务效率:计算单位花费带来的评分提升(性价比)。

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)} 人")

运行结果解读(模拟数据下)

当你运行这段代码,会看到:

  1. 转入/转出明细:显示球员名字、位置、身价、评分。
  2. 核心指标
    • 净支出:可能是巨额投入(如 5.2亿 - 0.45亿 = 4.75亿)。
    • 净实力变化:(92+89+87+84+83)/5 - (85+88+84+78+86)/5 = 87.0 - 84.2 = +2.8分,说明新援平均实力高于离队球员。
  3. 位置分析
    • 前锋:哈兰德(92)> 马赫雷斯(85) → 加强
    • 中场:贝林厄姆(89)+ 索博斯洛伊(84)替换京多安(88)+ 帕尔默(78) → 平均提升。
    • 后卫:格瓦迪奥尔(87)替换拉波尔特(84)+ 坎塞洛(86) → 平均略降但年轻化。
  4. 可视化:左侧条形图清晰对比每个球员的评分;右侧柱状图展示各位置实力变化(正数加强,负数削弱)。
  5. 财务效率性价比 = 评分 / (转会费/1000万),比如格拉利什 6000万得83分,性价比 13.8;哈兰德 1.8亿得92分,性价比 5.1,后者虽然贵但评分高,性价比低意味着溢价高。

如何用于真实场景?

你可以用以下真实数据替换模拟数据:

  • 数据来源:从 Transfermarkt、SofaScore、Whoscored 爬取球员身价、Whoscored综合评分、上赛季关键数据。
  • 评分模型改进
    • 能力评分 = 身价权重 * 标准化身价 + 进攻权重 * (进球+助攻) + 防守权重 * (抢断+拦截+解围) + 年龄调整
    • 使用 线性回归PCA 从历史数据中训练评分权重。
  • 增加权重:主力球员评分×1.2,轮换球员×1.0,青年球员×0.8,更准确反映实际贡献。

代码扩展方向

  1. 多窗口对比:对比2023夏窗 vs 2024夏窗,看实力是否逐年提升。
  2. 联赛竞争力模型:将本队实力变化与联赛其他强队(如转会更猛的队伍)对比。
  3. 伤病风险调整:根据球员过去2年出场次数,对评分进行折损(脆皮球员扣分)。
  4. Web界面:用 Streamlit 做成交互式App,让用户上传自己的转会数据。

这个案例提供了一个可量化、可复现的框架,让你从“感觉转会操作不错”升级到“用数据证明实力变化+3.5%”,如果你有具体的球队或转会数据,我可以帮你写一个定制化版本。

抱歉,评论功能暂时关闭!