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

wen python案例 2

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

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)

这个案例提供了两种分析方式:

  1. 详细版:包含多维度分析(位置、评分、可视化)
  2. 快速版:简洁的参数传递,快速计算

使用建议:

  • 可以根据实际需求调整球员属性
  • 支持买入、卖出、租借等操作
  • 包含财务分析(投入产出比)
  • 可视化对比实力变化

你可以根据具体需求修改球员数据、转会策略等参数,获得定制的分析结果。

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