我来为你创建一个分析球队转会窗后实力变化的Python案例,这个案例会模拟转会市场操作,并计算球队实力的变化。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class TransferWindowAnalyzer:
"""转会窗实力变化分析器"""
def __init__(self):
# 球员属性权重
self.attribute_weights = {
'attack': 0.25, # 进攻
'defense': 0.25, # 防守
'midfield': 0.20, # 中场
'physical': 0.15, # 身体素质
'technique': 0.15 # 技术能力
}
# 位置系数
self.position_factor = {
'前锋': 1.2,
'中场': 1.1,
'后卫': 1.1,
'门将': 1.0
}
def create_squad(self, team_name, players_data):
"""创建球队阵容"""
squad_df = pd.DataFrame(players_data)
squad_df['team'] = team_name
squad_df['rating'] = self.calculate_player_rating(squad_df)
return squad_df
def calculate_player_rating(self, df):
"""计算球员综合评分"""
rating = 0
for attr, weight in self.attribute_weights.items():
if attr in df.columns:
rating += df[attr] * weight
return rating
def simulate_transfer(self, squad_df, transfer_list):
"""模拟转会操作"""
temp_squad = squad_df.copy()
for transfer in transfer_list:
action = transfer['action']
player_name = transfer.get('player', '')
if action == 'buy': # 买人
new_player = self.create_player(transfer['player_data'])
temp_squad = pd.concat([temp_squad, new_player], ignore_index=True)
print(f"✅ 买入: {transfer['player_data']['name']} - {transfer['cost']}万欧元")
elif action == 'sell': # 卖人
temp_squad = temp_squad[temp_squad['name'] != player_name]
print(f"❌ 卖出: {player_name} - {transfer.get('fee', 0)}万欧元")
elif action == 'loan': # 租借
if transfer.get('in', True): # 租入
new_player = self.create_player(transfer['player_data'])
temp_squad = pd.concat([temp_squad, new_player], ignore_index=True)
print(f"📥 租入: {transfer['player_data']['name']}")
else: # 租出
temp_squad = temp_squad[temp_squad['name'] != player_name]
print(f"📤 租出: {player_name}")
return temp_squad
def create_player(self, player_data):
"""创建球员数据"""
df = pd.DataFrame([player_data])
df['rating'] = self.calculate_player_rating(df)
return df
def calculate_team_strength(self, squad_df):
"""计算球队整体实力"""
if len(squad_df) == 0:
return 0
# 计算不同位置的评分
positions = ['前锋', '中场', '后卫', '门将']
position_scores = {}
for pos in positions:
pos_players = squad_df[squad_df['position'] == pos]
if len(pos_players) > 0:
pos_score = pos_players['rating'].mean() * self.position_factor[pos]
position_scores[pos] = pos_score
else:
position_scores[pos] = 0
# 整体实力 = 不同位置的平均分
overall_strength = np.mean(list(position_scores.values()))
# 附加因素:阵容深度
squad_depth = min(len(squad_df) / 20, 1.0) # 假设理想阵容为20人
final_strength = overall_strength * (0.8 + 0.2 * squad_depth)
return final_strength, position_scores
def analyze_transfer_impact(self, before_squad, after_squad):
"""分析转会影响"""
print("\n" + "="*50)
print("转会窗实力分析报告")
print("="*50)
# 整体实力对比
before_strength, before_positions = self.calculate_team_strength(before_squad)
after_strength, after_positions = self.calculate_team_strength(after_squad)
change = after_strength - before_strength
change_percent = (change / before_strength * 100) if before_strength else 0
print(f"\n📊 整体实力变化: {before_strength:.2f} → {after_strength:.2f}")
print(f" {'📈 提升' if change > 0 else '📉 下降'}: {abs(change):.2f} ({abs(change_percent):.1f}%)")
# 各位置实力变化
print("\n📍 各位置实力变化:")
position_names = {'前锋': '攻击线', '中场': '中场', '后卫': '防线', '门将': '门将'}
for pos, cn_name in position_names.items():
before = before_positions.get(pos, 0)
after = after_positions.get(pos, 0)
diff = after - before
if diff != 0:
symbol = "📈" if diff > 0 else "📉"
print(f" {cn_name}: {before:.1f} → {after:.1f} ({symbol}{diff:+.1f})")
else:
print(f" {cn_name}: {before:.1f} (无变化)")
# 阵容深度对比
print(f"\n👥 阵容规模: {len(before_squad)}人 → {len(after_squad)}人")
# 综合评估
print("\n🎯 综合评价:")
if change > 2:
print(" ⭐ 转会操作效果显著,球队实力大幅提升")
elif change > 0.5:
print(" ✅ 转会操作积极,球队实力有所增强")
elif change > -0.5:
print(" ➡️ 转会操作基本平衡,球队实力变化不大")
elif change > -2:
print(" ⚠️ 转会操作有待商榷,球队实力略有下降")
else:
print(" ❌ 转会操作效果不佳,球队实力明显下降")
return {
'before_strength': before_strength,
'after_strength': after_strength,
'change': change,
'change_percent': change_percent,
'before_positions': before_positions,
'after_positions': after_positions
}
def visualize_change(self, before_squad, after_squad, team_name):
"""可视化实力变化"""
before_strength, before_positions = self.calculate_team_strength(before_squad)
after_strength, after_positions = self.calculate_team_strength(after_squad)
# 创建子图
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 1. 整体实力对比
axes[0].bar(['转会前', '转会后'], [before_strength, after_strength],
color=['#FF6B6B', '#4ECDC4'], alpha=0.7)
axes[0].set_ylabel('综合实力')
axes[0].set_title(f'{team_name} 整体实力对比')
axes[0].grid(alpha=0.3)
# 在柱状图上添加数值
for i, v in enumerate([before_strength, after_strength]):
axes[0].text(i, v + 0.1, f'{v:.2f}', ha='center')
# 2. 各位置雷达图
positions = list(before_positions.keys())
values_before = [before_positions[pos] for pos in positions]
values_after = [after_positions[pos] for pos in positions]
# 雷达图数据
angles = np.linspace(0, 2 * np.pi, len(positions), endpoint=False).tolist()
values_before += values_before[:1]
values_after += values_after[:1]
angles += angles[:1]
ax2 = plt.subplot(122, polar=True)
ax2.plot(angles, values_before, 'o-', linewidth=2, label='转会前', color='#FF6B6B')
ax2.fill(angles, values_before, alpha=0.25, color='#FF6B6B')
ax2.plot(angles, values_after, 'o-', linewidth=2, label='转会后', color='#4ECDC4')
ax2.fill(angles, values_after, alpha=0.25, color='#4ECDC4')
ax2.set_xticks(angles[:-1])
ax2.set_xticklabels(['攻击线', '中场', '防线', '门将'])
ax2.set_title('各位置实力对比')
ax2.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
plt.tight_layout()
return fig
def main():
"""主函数 - 示例分析"""
# 创建分析器
analyzer = TransferWindowAnalyzer()
# 1. 创建转会前的球队阵容(简化示例)
before_players = [
{'name': 'C. 罗纳尔多', 'position': '前锋', 'attack': 9.0, 'defense': 4.0,
'midfield': 5.0, 'physical': 8.5, 'technique': 8.5, 'age': 38},
{'name': 'B. 费尔南德斯', 'position': '中场', 'attack': 8.0, 'defense': 6.0,
'midfield': 8.5, 'physical': 7.0, 'technique': 8.0, 'age': 29},
{'name': 'V. 迪亚斯', 'position': '后卫', 'attack': 5.0, 'defense': 8.5,
'midfield': 6.0, 'physical': 8.0, 'technique': 6.5, 'age': 26},
{'name': 'J. 门德斯', 'position': '门将', 'attack': 2.0, 'defense': 8.0,
'midfield': 3.0, 'physical': 7.5, 'technique': 6.0, 'age': 31},
# 可以添加更多球员...
]
# 补充一些球员让阵容更完整
before_players.extend([
{'name': 'R. 桑切斯', 'position': '中场', 'attack': 7.0, 'defense': 6.5,
'midfield': 8.0, 'physical': 7.5, 'technique': 7.5, 'age': 27},
{'name': 'L. 马丁内斯', 'position': '后卫', 'attack': 5.5, 'defense': 8.0,
'midfield': 6.5, 'physical': 8.0, 'technique': 6.0, 'age': 30},
{'name': 'M. 内马尔', 'position': '前锋', 'attack': 9.0, 'defense': 3.0,
'midfield': 6.5, 'physical': 7.0, 'technique': 9.5, 'age': 31},
{'name': 'P. 瓜迪奥拉', 'position': '中场', 'attack': 6.0, 'defense': 7.5,
'midfield': 9.0, 'physical': 6.5, 'technique': 8.5, 'age': 28},
{'name': 'T. 席尔瓦', 'position': '后卫', 'attack': 4.5, 'defense': 8.5,
'midfield': 6.0, 'physical': 8.0, 'technique': 6.5, 'age': 25},
{'name': 'D. 德赫亚', 'position': '门将', 'attack': 1.5, 'defense': 8.5,
'midfield': 2.5, 'physical': 7.0, 'technique': 6.0, 'age': 32}
])
before_squad = analyzer.create_squad('示例队', before_players)
# 2. 模拟转会操作
transfer_list = [
{
'action': 'buy',
'player_data': {
'name': 'O. 贝林厄姆', 'position': '中场', 'attack': 8.5,
'defense': 7.5, 'midfield': 9.0, 'physical': 8.5, 'technique': 8.0,
'age': 20
},
'cost': 15000 # 万欧元
},
{
'action': 'sell',
'player': 'C. 罗纳尔多',
'fee': 5000
},
{
'action': 'buy',
'player_data': {
'name': 'A. 姆巴佩', 'position': '前锋', 'attack': 9.5,
'defense': 4.5, 'midfield': 6.5, 'physical': 9.0, 'technique': 9.0,
'age': 25
},
'cost': 25000
}
]
# 3. 执行转会
print("\n🏗️ 转会窗操作模拟:")
print("-" * 40)
after_squad = analyzer.simulate_transfer(before_squad, transfer_list)
# 4. 分析转会影响
result = analyzer.analyze_transfer_impact(before_squad, after_squad)
# 5. 可视化
fig = analyzer.visualize_change(before_squad, after_squad, '示例队')
plt.show()
# 6. 输出详细转会信息
print("\n📋 转会明细:")
print(f" 总投入: {(15000 + 25000):,}万欧元")
print(f" 总收入: 5,000万欧元")
print(f" 净投入: {20000:,}万欧元")
# 额外建议
print("\n💡 后续建议:")
if result['change'] > 0:
print(" - 保持现有阵容稳定性")
print(" - 关注新援的融入情况")
print(" - 制定长远发展计划")
else:
print(" - 考虑补充关键位置球员")
print(" - 可能需要调整战术体系")
print(" - 关注年轻球员的培养")
if __name__ == "__main__":
main()
让我再提供一个更实用的简化版本,方便快速分析:
import pandas as pd
import numpy as np
def quick_transfer_analysis(player_ratings, transfers):
"""
快速转会分析函数
参数:
player_ratings: 字典,格式为 {'player_name': rating}
transfers: 列表,每项为 {'action': 'buy'/'sell', 'player': 'name', 'rating': 85}
返回:
分析结果字典
"""
# 计算转会前总实力
before_strength = sum(player_ratings.values())
before_count = len(player_ratings)
# 模拟转会
after_ratings = player_ratings.copy()
total_spent = 0
total_income = 0
print("="*50)
print("快速转会分析")
print("="*50)
for transfer in transfers:
if transfer['action'] == 'buy':
player = transfer['player']
rating = transfer['rating']
cost = transfer.get('cost', 0)
after_ratings[player] = rating
total_spent += cost
print(f"🟢 买入: {player} (评分{rating}, 花费{cost}万欧)")
elif transfer['action'] == 'sell':
player = transfer['player']
fee = transfer.get('fee', 0)
if player in after_ratings:
del after_ratings[player]
total_income += fee
print(f"🔴 卖出: {player} (收入{fee}万欧)")
# 计算转会后的总实力
after_strength = sum(after_ratings.values())
after_count = len(after_ratings)
# 计算变化
change = after_strength - before_strength
avg_change = change / max(after_count, 1)
# 输出结果
print("\n" + "="*50)
print("分析结果")
print("="*50)
print(f"总实力: {before_strength} → {after_strength}")
print(f"平均评分: {before_strength/before_count:.2f} → {after_strength/after_count:.2f}")
print(f"实力变化: {change:+.2f} ({change/before_strength*100:+.1f}%)")
print(f"转会净投入: {total_spent - total_income:+,}万欧元")
# 效率分析
if total_spent > 0:
points_per_million = change / total_spent
print(f"每万欧提升: {points_per_million:.4f} 点")
# 简单评级
if change > 0:
ratio = change / before_strength
if ratio > 0.2:
print("\n评级: ⭐⭐⭐ 巨大提升")
elif ratio > 0.1:
print("\n评级: ⭐⭐ 明显提升")
else:
print("\n评级: ⭐ 小幅提升")
else:
print("\n评级: ⚠️ 实力下降,需要调整")
return {
'before': before_strength,
'after': after_strength,
'change': change,
'net_spend': total_spent - total_income
}
# 使用示例
if __name__ == "__main__":
# 球员初始评分
squad = {
'C. 罗纳尔多': 85,
'B. 费尔南德斯': 88,
'V. 迪亚斯': 84,
'J. 门德斯': 82,
'R. 桑切斯': 86,
'L. 马丁内斯': 84,
'M. 内马尔': 89,
'P. 瓜迪奥拉': 87,
'T. 席尔瓦': 83,
'D. 德赫亚': 86
}
# 转会操作
transfers = [
{'action': 'buy', 'player': 'A. 姆巴佩', 'rating': 91,
'cost': 25000},
{'action': 'sell', 'player': 'C. 罗纳尔多', 'fee': 5000},
{'action': 'buy', 'player': 'O. 贝林厄姆', 'rating': 89,
'cost': 15000}
]
# 执行分析
result = quick_transfer_analysis(squad, transfers)
这个案例提供了两种分析方式:
- 详细版:包含多维度分析(位置、评分、可视化)
- 快速版:简洁的参数传递,快速计算
使用建议:
- 可以根据实际需求调整球员属性
- 支持买入、卖出、租借等操作
- 包含财务分析(投入产出比)
- 可视化对比实力变化
你可以根据具体需求修改球员数据、转会策略等参数,获得定制的分析结果。