Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import os
|
| 2 |
import numpy as np
|
| 3 |
-
import xgboost as xgb
|
| 4 |
import gradio as gr
|
|
|
|
| 5 |
from groq import Groq
|
| 6 |
|
| 7 |
# ==========================================
|
|
@@ -13,33 +13,55 @@ if api_key:
|
|
| 13 |
client = Groq(api_key=api_key)
|
| 14 |
|
| 15 |
# ==========================================
|
| 16 |
-
# 📊 2.
|
| 17 |
# ==========================================
|
| 18 |
-
def
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
# ==========================================
|
| 45 |
# 🧠 3. TAHMİN VE ANALİZ MOTORU
|
|
@@ -48,17 +70,21 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
|
|
| 48 |
if not home_team or not away_team:
|
| 49 |
return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
|
| 50 |
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
| 57 |
|
|
|
|
| 58 |
prob_dict = {
|
| 59 |
-
f"{home_team} Galibiyeti (1)": p_home,
|
| 60 |
-
"Beraberlik (X)": p_draw,
|
| 61 |
-
f"{away_team} Galibiyeti (2)": p_away
|
| 62 |
}
|
| 63 |
|
| 64 |
prompt = f"""
|
|
@@ -70,13 +96,15 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
|
|
| 70 |
- {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
|
| 71 |
- {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
|
| 72 |
|
| 73 |
-
|
|
|
|
| 74 |
- {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
|
| 75 |
- Beraberlik Olasılığı: %{p_draw*100:.1f}
|
| 76 |
- {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
|
|
|
|
| 77 |
|
| 78 |
Yukarıdaki matematiksel olasılıkları ve takım durumlarını analiz ederek Türkçe bir rapor hazırla. Raporda şu başlıklar mutlaka bulunsun:
|
| 79 |
-
1. 🎯 Model Yorumu (
|
| 80 |
2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
|
| 81 |
3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
|
| 82 |
|
|
@@ -85,7 +113,6 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
|
|
| 85 |
|
| 86 |
if client:
|
| 87 |
try:
|
| 88 |
-
# Model güncellendi ve max_tokens eklendi
|
| 89 |
response = client.chat.completions.create(
|
| 90 |
model="openai/gpt-oss-120b",
|
| 91 |
messages=[
|
|
@@ -98,7 +125,7 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
|
|
| 98 |
except Exception as e:
|
| 99 |
analysis_result = f"Groq API Analiz Hatası: {str(e)}\n\n(Lütfen GROQ_API_KEY değişkeninizi Hugging Face Secrets alanına doğru eklediğinizden emin olun.)"
|
| 100 |
else:
|
| 101 |
-
analysis_result = "Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına 'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki
|
| 102 |
|
| 103 |
return analysis_result, prob_dict
|
| 104 |
|
|
@@ -108,8 +135,8 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
|
|
| 108 |
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
|
| 109 |
gr.Markdown(
|
| 110 |
"""
|
| 111 |
-
# ⚽
|
| 112 |
-
Bu uygulama, girdiğiniz takım verilerini **
|
| 113 |
"""
|
| 114 |
)
|
| 115 |
|
|
@@ -133,7 +160,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate"))
|
|
| 133 |
submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
|
| 134 |
|
| 135 |
with gr.Column():
|
| 136 |
-
gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (
|
| 137 |
prob_output = gr.Label(label="Olasılık Dağılımı")
|
| 138 |
|
| 139 |
gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
|
|
|
|
| 1 |
import os
|
| 2 |
import numpy as np
|
|
|
|
| 3 |
import gradio as gr
|
| 4 |
+
from scipy.stats import poisson
|
| 5 |
from groq import Groq
|
| 6 |
|
| 7 |
# ==========================================
|
|
|
|
| 13 |
client = Groq(api_key=api_key)
|
| 14 |
|
| 15 |
# ==========================================
|
| 16 |
+
# 📊 2. POISSON DAĞILIMI İLE GOL TAHMİN MOTORU
|
| 17 |
# ==========================================
|
| 18 |
+
def calculate_poisson_probabilities(home_rank, away_rank, home_form, away_form, home_injuries, away_injuries):
|
| 19 |
+
"""
|
| 20 |
+
Takım güçlerini (sıralama, form, sakatlık) kullanarak beklenen gol sayılarını (Lambda) hesaplar.
|
| 21 |
+
Ardından Poisson dağılımı ile 0-5 arası gol atma olasılıklarını matrise döker.
|
| 22 |
+
"""
|
| 23 |
+
# 1. Takım Güçlerini Hesaplama (Basit bir formülasyon)
|
| 24 |
+
# Lig sıralaması: 1. sıra en güçlü, 20. sıra en zayıf (20 - sıra + 1)
|
| 25 |
+
home_rank_power = max(1, 21 - home_rank)
|
| 26 |
+
away_rank_power = max(1, 21 - away_rank)
|
| 27 |
+
|
| 28 |
+
# Form gücü: Form puanı 0-15 arası. (Form / 15) * 2 + 0.5 (0.5 ile 2.5 arası çarpan)
|
| 29 |
+
home_form_power = (home_form / 15.0) * 2 + 0.5
|
| 30 |
+
away_form_power = (away_form / 15.0) * 2 + 0.5
|
| 31 |
+
|
| 32 |
+
# Sakatlık cezası: Her sakat oyuncu gücü %10 düşürür
|
| 33 |
+
home_injury_penalty = max(0.5, 1.0 - (home_injuries * 0.10))
|
| 34 |
+
away_injury_penalty = max(0.5, 1.0 - (away_injuries * 0.10))
|
| 35 |
+
|
| 36 |
+
# Ev sahibi avantajı (Futbolda ortalama %15-20 avantajdır)
|
| 37 |
+
home_advantage = 1.20
|
| 38 |
+
|
| 39 |
+
# 2. Beklenen Gol Sayıları (Lambda - λ)
|
| 40 |
+
# Temel gol ortalaması varsayımı: Ev için 1.5, Deplasman için 1.2
|
| 41 |
+
base_home_goals = 1.5
|
| 42 |
+
base_away_goals = 1.2
|
| 43 |
+
|
| 44 |
+
lambda_home = base_home_goals * (home_rank_power / 10.0) * home_form_power * home_injury_penalty * home_advantage
|
| 45 |
+
lambda_away = base_away_goals * (away_rank_power / 10.0) * away_form_power * away_injury_penalty
|
| 46 |
|
| 47 |
+
# Lambda değerlerini mantıklı bir aralığa sıkıştır (0.1 ile 4.0 arası)
|
| 48 |
+
lambda_home = max(0.1, min(4.0, lambda_home))
|
| 49 |
+
lambda_away = max(0.1, min(4.0, lambda_away))
|
| 50 |
+
|
| 51 |
+
# 3. Poisson Matrisi (0-5 gol arası)
|
| 52 |
+
max_goals = 5
|
| 53 |
+
home_probs = [poisson.pmf(i, lambda_home) for i in range(max_goals + 1)]
|
| 54 |
+
away_probs = [poisson.pmf(i, lambda_away) for i in range(max_goals + 1)]
|
| 55 |
+
|
| 56 |
+
# Skor matrisi (Ev x Deplasman)
|
| 57 |
+
score_matrix = np.outer(home_probs, away_probs)
|
| 58 |
+
|
| 59 |
+
# 4. Kazanma Olasılıklarını Toplama
|
| 60 |
+
p_home_win = np.sum(np.tril(score_matrix, -1)) # Ev sahibinin daha fazla gol attığı alt üçgen
|
| 61 |
+
p_draw = np.sum(np.diag(score_matrix)) # Beraberlik (kökler)
|
| 62 |
+
p_away_win = np.sum(np.triu(score_matrix, 1)) # Deplasmanın daha fazla gol attığı üst üçgen
|
| 63 |
+
|
| 64 |
+
return p_home_win, p_draw, p_away_win, lambda_home, lambda_away, score_matrix
|
| 65 |
|
| 66 |
# ==========================================
|
| 67 |
# 🧠 3. TAHMİN VE ANALİZ MOTORU
|
|
|
|
| 70 |
if not home_team or not away_team:
|
| 71 |
return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
|
| 72 |
|
| 73 |
+
# Poisson hesaplamalarını yap
|
| 74 |
+
p_home, p_draw, p_away, lam_home, lam_away, score_matrix = calculate_poisson_probabilities(
|
| 75 |
+
home_rank, away_rank, home_form, away_form, home_injuries, away_injuries
|
| 76 |
+
)
|
| 77 |
+
|
| 78 |
+
# En olası skoru bulma
|
| 79 |
+
max_prob_idx = np.unravel_index(np.argmax(score_matrix), score_matrix.shape)
|
| 80 |
+
most_likely_score = f"{max_prob_idx[0]} - {max_prob_idx[1]}"
|
| 81 |
+
most_likely_prob = score_matrix[max_prob_idx] * 100
|
| 82 |
|
| 83 |
+
# Gradio grafiği için dictionary formatı
|
| 84 |
prob_dict = {
|
| 85 |
+
f"{home_team} Galibiyeti (1)": float(p_home),
|
| 86 |
+
"Beraberlik (X)": float(p_draw),
|
| 87 |
+
f"{away_team} Galibiyeti (2)": float(p_away)
|
| 88 |
}
|
| 89 |
|
| 90 |
prompt = f"""
|
|
|
|
| 96 |
- {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
|
| 97 |
- {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
|
| 98 |
|
| 99 |
+
Poisson Dağılım Modeli Sonuçları:
|
| 100 |
+
- Beklenen Gol Sayıları (λ): {home_team} {lam_home:.2f} - {away_team} {lam_away:.2f}
|
| 101 |
- {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
|
| 102 |
- Beraberlik Olasılığı: %{p_draw*100:.1f}
|
| 103 |
- {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
|
| 104 |
+
- En Olası Skor: {most_likely_score} (Olasılık: %{most_likely_prob:.1f})
|
| 105 |
|
| 106 |
Yukarıdaki matematiksel olasılıkları ve takım durumlarını analiz ederek Türkçe bir rapor hazırla. Raporda şu başlıklar mutlaka bulunsun:
|
| 107 |
+
1. 🎯 Model Yorumu (Poisson dağılımı ve beklenen gol sayılarının mantığı)
|
| 108 |
2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
|
| 109 |
3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
|
| 110 |
|
|
|
|
| 113 |
|
| 114 |
if client:
|
| 115 |
try:
|
|
|
|
| 116 |
response = client.chat.completions.create(
|
| 117 |
model="openai/gpt-oss-120b",
|
| 118 |
messages=[
|
|
|
|
| 125 |
except Exception as e:
|
| 126 |
analysis_result = f"Groq API Analiz Hatası: {str(e)}\n\n(Lütfen GROQ_API_KEY değişkeninizi Hugging Face Secrets alanına doğru eklediğinizden emin olun.)"
|
| 127 |
else:
|
| 128 |
+
analysis_result = "Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına 'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki Poisson grafik tahminini görebilirsiniz.)"
|
| 129 |
|
| 130 |
return analysis_result, prob_dict
|
| 131 |
|
|
|
|
| 135 |
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
|
| 136 |
gr.Markdown(
|
| 137 |
"""
|
| 138 |
+
# ⚽ Poisson Dağılımı & Groq Hibrit Maç Tahmin Radarı
|
| 139 |
+
Bu uygulama, girdiğiniz takım verilerini **Poisson Dağılımı** ile analiz ederek beklenen gol sayılarını ve kazanma olasılıklarını hesaplar, ardından **Groq (GPT-OSS)** yapay zekası ile matematiksel olarak yorumlar.
|
| 140 |
"""
|
| 141 |
)
|
| 142 |
|
|
|
|
| 160 |
submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
|
| 161 |
|
| 162 |
with gr.Column():
|
| 163 |
+
gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (Poisson)")
|
| 164 |
prob_output = gr.Label(label="Olasılık Dağılımı")
|
| 165 |
|
| 166 |
gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
|