本文目录导读:

我来为您创建一个统计SofaScore综合评分的Python案例,由于SofaScore没有官方API,我将提供两种方法:模拟数据和网页爬取。
方法1:模拟数据统计(推荐教学用)
import pandas as pd
import numpy as np
from datetime import datetime
import random
class SofaScoreAnalyzer:
def __init__(self):
self.players_data = []
def generate_sample_data(self, num_players=20):
"""生成模拟的SofaScore球员数据"""
positions = ['前锋', '中场', '后卫', '门将']
teams = ['皇马', '巴萨', '曼城', '利物浦', '拜仁', '巴黎']
for i in range(num_players):
player = {
'player_id': f'P{i+1:03d}',
'name': f'球员{i+1}',
'team': random.choice(teams),
'position': random.choice(positions),
'age': random.randint(18, 35),
'rating': round(random.uniform(6.0, 9.5), 1), # SofaScore评分范围6.0-10.0
'goals': random.randint(0, 20),
'assists': random.randint(0, 15),
'minutes_played': random.randint(300, 3000),
'matches_played': random.randint(10, 38),
'yellow_cards': random.randint(0, 8),
'red_cards': random.randint(0, 2)
}
self.players_data.append(player)
return pd.DataFrame(self.players_data)
def analyze_ratings(self, df):
"""统计分析评分"""
print("=" * 60)
print("📊 SofaScore综合评分统计分析")
print("=" * 60)
# 1. 总体统计
print("\n【总体评分统计】")
print(f"平均评分: {df['rating'].mean():.2f}")
print(f"最高评分: {df['rating'].max():.2f}")
print(f"最低评分: {df['rating'].min():.2f}")
print(f"中位数: {df['rating'].median():.2f}")
print(f"标准差: {df['rating'].std():.2f}")
# 2. 按位置分析
print("\n【按位置评分统计】")
position_stats = df.groupby('position')['rating'].agg(['mean', 'max', 'min', 'count'])
print(position_stats.to_string())
# 3. 按球队分析
print("\n【按球队评分统计】")
team_stats = df.groupby('team')['rating'].agg(['mean', 'max', 'min', 'count'])
team_stats = team_stats.sort_values('mean', ascending=False)
print(team_stats.to_string())
# 4. 评分分布
print("\n【评分分布】")
rating_bins = pd.cut(df['rating'], bins=[6.0, 7.0, 7.5, 8.0, 8.5, 9.0, 10.0],
labels=['6.0-7.0', '7.0-7.5', '7.5-8.0', '8.0-8.5', '8.5-9.0', '9.0+'])
distribution = df['rating'].groupby(rating_bins, observed=False).count()
for interval, count in distribution.items():
bar = '█' * count
print(f"{interval}: {count}人 {bar}")
def find_top_players(self, df, top_n=5):
"""找出评分最高的球员"""
print("\n" + "=" * 60)
print(f"🏆 评分最高的{top_n}名球员")
print("=" * 60)
top_players = df.nlargest(top_n, 'rating')[['name', 'team', 'position', 'rating', 'goals', 'assists']]
for idx, player in top_players.iterrows():
print(f"⭐ {player['name']} ({player['team']}-{player['position']})")
print(f" 评分: {player['rating']} | 进球: {player['goals']} | 助攻: {player['assists']}")
def performance_metrics(self, df):
"""计算综合表现指标"""
print("\n" + "=" * 60)
print("📈 综合表现指数")
print("=" * 60)
# 综合评分(评分权重70% + 进攻贡献20% + 纪律10%)
df['attack_score'] = (df['goals'] * 2 + df['assists'] * 1.5) / 50
df['discipline_score'] = 10 - (df['yellow_cards'] * 0.5 + df['red_cards'] * 2)
df['overall_index'] = df['rating'] * 0.6 + df['attack_score'] * 30 + df['discipline_score'] * 0.4
# 标准化到0-100
df['overall_index'] = np.clip(df['overall_index'], 0, 100)
print("\n评分TOP10球员的综合指数:")
top_overall = df.nlargest(10, 'overall_index')[['name', 'team', 'rating', 'goals', 'assists', 'overall_index']]
print(top_overall.to_string(index=False))
return df
# 使用示例
if __name__ == "__main__":
# 创建分析器实例
analyzer = SofaScoreAnalyzer()
# 生成模拟数据
df = analyzer.generate_sample_data(num_players=30)
# 执行分析
analyzer.analyze_ratings(df)
analyzer.find_top_players(df, top_n=5)
df_analyzed = analyzer.performance_metrics(df)
# 导出数据
df_analyzed.to_csv('sofascore_ratings.csv', index=False, encoding='utf-8-sig')
print("\n✅ 数据已保存到 sofascore_ratings.csv")
方法2:使用爬虫获取真实数据(需要安装相应库)
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
class SofaScoreScraper:
"""SofaScore网页数据爬虫示例"""
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def fetch_player_ratings(self, league_url):
"""获取联赛球员评分数据"""
try:
response = requests.get(league_url, headers=self.HEADERS)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
players = []
# 这里假设页面结构包含球员评分信息
# 实际SofaScore的页面结构需要根据实际HTML调整
rating_elements = soup.select('.player-rating')
name_elements = soup.select('.player-name')
for name, rating in zip(name_elements, rating_elements):
player_data = {
'name': name.text.strip(),
'rating': float(rating.text.strip())
}
players.append(player_data)
return pd.DataFrame(players)
except Exception as e:
print(f"抓取失败: {e}")
return pd.DataFrame()
def analyze_token_market(self, data_file='sofascore_data.csv'):
"""分析已下载的数据文件"""
if os.path.exists(data_file):
df = pd.read_csv(data_file)
return df.describe()
return None
方法3:可视化分析
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
class SofaScoreVisualizer:
"""SofaScore数据可视化"""
def __init__(self, df):
self.df = df
def plot_rating_distribution(self):
"""绘制评分分布图"""
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
sns.histplot(self.df['rating'], bins=20, kde=True, color='skyblue')
plt.title('球员评分分布')
plt.xlabel('SofaScore评分')
plt.ylabel('球员数量')
plt.subplot(1, 2, 2)
sns.boxplot(x='position', y='rating', data=self.df)
plt.title('不同位置评分对比')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('rating_analysis.png', dpi=300)
plt.show()
def plot_team_comparison(self):
"""绘制球队评分对比"""
plt.figure(figsize=(10, 6))
team_stats = self.df.groupby('team')['rating'].mean().sort_values(ascending=True)
plt.barh(range(len(team_stats)), team_stats.values)
plt.yticks(range(len(team_stats)), team_stats.index)
plt.xlabel('平均评分')
plt.title('各球队球员平均评分比较')
for i, v in enumerate(team_stats.values):
plt.text(v + 0.02, i, f'{v:.2f}', va='center')
plt.tight_layout()
plt.savefig('team_comparison.png', dpi=300)
plt.show()
# 综合使用示例
def main():
# 创建分析器
analyzer = SofaScoreAnalyzer()
# 生成数据
df = analyzer.generate_sample_data(num_players=50)
# 统计分析
analyzer.analyze_ratings(df)
analyzer.find_top_players(df)
df_analyzed = analyzer.performance_metrics(df)
# 可视化
visualizer = SofaScoreVisualizer(df_analyzed)
visualizer.plot_rating_distribution()
visualizer.plot_team_comparison()
# 保存结果
df_analyzed.to_csv('sofascore_full_analysis.csv', index=False)
print("分析完成!")
if __name__ == "__main__":
main()
运行需要的库:
pip install pandas numpy matplotlib seaborn beautifulsoup4 requests
主要功能:
- 数据分析:均值、中位数、标准差等统计指标
- 分组统计:按位置、球队分析
- 排名功能:找出评分最高的球员
- 综合指标:结合进球、助攻、纪律的综合评分
- 可视化:评分分布图、球队对比图
这个案例可以用于足球数据分析和球员评估,您可以根据实际需求调整评分权重和分析维度。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播