82 lines
No EOL
2.7 KiB
Python
82 lines
No EOL
2.7 KiB
Python
from analysis.team_identity_v2 import summarize_team_tags, classify_team_style
|
|
|
|
|
|
def compute_team_power_score(summary):
|
|
"""
|
|
Converts team tag percentiles into a single weighted power score.
|
|
Weights reflect real match impact:
|
|
Slayer: 30%
|
|
Objective: 25%
|
|
Consistency: 20%
|
|
Clutch: 15%
|
|
Sharpshooter: 10%
|
|
"""
|
|
|
|
return (
|
|
summary["slayer"]["avg_pct"] * 0.30 +
|
|
summary["objective_payload"]["avg_pct"] * 0.25 +
|
|
summary["consistency"]["avg_pct"] * 0.20 +
|
|
summary["clutch"]["avg_pct"] * 0.15 +
|
|
summary["sharpshooter"]["avg_pct"] * 0.10
|
|
)
|
|
|
|
|
|
def generate_prediction(teamA_players, teamB_players, teamA_name="Team A", teamB_name="Team B"):
|
|
"""
|
|
Generates a caster-ready prediction block using:
|
|
- Team Identity 2.0
|
|
- Weighted tag power scores
|
|
- Style classification
|
|
- Strength/weakness contrast
|
|
"""
|
|
|
|
# -----------------------------------------
|
|
# 1. Summaries
|
|
# -----------------------------------------
|
|
A = summarize_team_tags(teamA_players)
|
|
B = summarize_team_tags(teamB_players)
|
|
|
|
# -----------------------------------------
|
|
# 2. Power scores
|
|
# -----------------------------------------
|
|
A_power = compute_team_power_score(A)
|
|
B_power = compute_team_power_score(B)
|
|
|
|
# -----------------------------------------
|
|
# 3. Style classification
|
|
# -----------------------------------------
|
|
A_style, A_weak = classify_team_style(A)
|
|
B_style, B_weak = classify_team_style(B)
|
|
|
|
# -----------------------------------------
|
|
# 4. Determine favorite
|
|
# -----------------------------------------
|
|
diff = A_power - B_power
|
|
|
|
if abs(diff) < 5:
|
|
favorite = "Too close to call — this matchup is statistically even."
|
|
elif diff > 0:
|
|
favorite = f"{teamA_name} are favored based on stronger overall tag profile."
|
|
else:
|
|
favorite = f"{teamB_name} are favored based on stronger overall tag profile."
|
|
|
|
# -----------------------------------------
|
|
# 5. Build prediction text
|
|
# -----------------------------------------
|
|
lines = []
|
|
lines.append("MATCH PREDICTION\n")
|
|
|
|
lines.append(f"{teamA_name} Power Score: {A_power:.1f}")
|
|
lines.append(f"{teamB_name} Power Score: {B_power:.1f}\n")
|
|
|
|
lines.append(f"{teamA_name} Style: {A_style}")
|
|
lines.append(f"{teamB_name} Style: {B_style}\n")
|
|
|
|
lines.append("Key Weaknesses:")
|
|
lines.append(f" {teamA_name}: {', '.join(A_weak) if A_weak else 'No major weaknesses'}")
|
|
lines.append(f" {teamB_name}: {', '.join(B_weak) if B_weak else 'No major weaknesses'}\n")
|
|
|
|
lines.append("Prediction:")
|
|
lines.append(f" {favorite}")
|
|
|
|
return "\n".join(lines) |