DL-Broadcast-Tool/analysis/predictions_v2.py

82 lines
2.7 KiB
Python
Raw Normal View History

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)