GoshawkVortexAI commited on
Commit
10b186a
·
verified ·
1 Parent(s): 4bb4fb8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -89
app.py CHANGED
@@ -13,108 +13,109 @@ if api_key:
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
68
  # ==========================================
69
- def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, away_form, home_injuries, away_injuries):
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"""
91
- Sen uzman bir spor analisti ve profesyonel bir veri modelleyicisisin.
92
-
93
- Karşılaşma: {home_team} (Ev) vs {away_team} (Deplasman)
94
-
95
- İstastistiksel Göstergeler:
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
-
111
  Yorumların rasyonel, nesnel ve profesyonel olsun.
112
  """
113
 
114
  if client:
115
  try:
116
  response = client.chat.completions.create(
117
- model="openai/gpt-oss-120b",
118
  messages=[
119
  {"role": "user", "content": prompt}
120
  ],
@@ -132,37 +133,37 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
132
  # ==========================================
133
  # 🎨 4. GRADIO ARAYÜZÜ
134
  # ==========================================
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
-
143
  with gr.Row():
144
  with gr.Column():
145
- gr.Markdown("### 🏟️ Takım İsimleri")
146
- home_input = gr.Textbox(label="Ev Sahibi Takım", value="Arsenal")
147
- away_input = gr.Textbox(label="Deplasman Takım", value="Chelsea")
148
-
149
- gr.Markdown("### 📊 Lig ve Form Durumu")
150
  with gr.Row():
151
- home_rank_input = gr.Number(label="Ev Sahibi Lig Sırası", value=3, precision=0)
152
- away_rank_input = gr.Number(label="Deplasman Lig Sırası", value=12, precision=0)
153
  with gr.Row():
154
- home_form_input = gr.Slider(label="Ev Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=11, step=1)
155
- away_form_input = gr.Slider(label="Deplasman Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=4, step=1)
156
  with gr.Row():
157
- home_inj_input = gr.Number(label="Ev Sakat/Cezalı Sayısı", value=1, precision=0)
158
- away_inj_input = gr.Number(label="Deplasman Sakat/Cezalı Sayısı", value=3, precision=0)
159
-
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")
167
  analysis_output = gr.Markdown(value="Verileri girdikten sonra butona basarak analizi başlatabilirsiniz.")
168
 
@@ -170,9 +171,9 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate"))
170
  fn=predict_and_analyze,
171
  inputs=[
172
  home_input, away_input,
173
- home_rank_input, away_rank_input,
174
  home_form_input, away_form_input,
175
- home_inj_input, away_inj_input
176
  ],
177
  outputs=[analysis_output, prob_output]
178
  )
 
13
  client = Groq(api_key=api_key)
14
 
15
  # ==========================================
16
+ # 📊 2. POISSON DAĞILIMI İLE HARİTA TAHMİN MOTORU
17
  # ==========================================
18
+ def calculate_poisson_probabilities(home_dpc, away_dpc, home_form, away_form, home_missing, away_missing):
19
  """
20
+ Dota 2 BO3 maçları için takım güçlerini kullanarak beklenen harita sayılarını (Lambda) hesaplar.
21
+ Poisson dağılımı ile 0, 1, 2 harita kazanma olasılıklarını matrise döker.
22
  """
23
+ # 1. Takım Güçlerini Hesaplama
24
+ # DPC puanı: Yüksek puan = güçlü takım. (Puan / 1000) + 1 taban güç
25
+ home_rank_power = (home_dpc / 1000.0) + 1.0
26
+ away_rank_power = (away_dpc / 1000.0) + 1.0
27
+
28
+ # Form gücü: Son 5 maç formu (0-5 arası galibiyet). (Form / 5) * 1.5 + 0.5
29
+ home_form_power = (home_form / 5.0) * 1.5 + 0.5
30
+ away_form_power = (away_form / 5.0) * 1.5 + 0.5
31
+
32
+ # Eksik oyuncu cezası: Her eksik oyuncu gücü %15 düşürür
33
+ home_penalty = max(0.4, 1.0 - (home_missing * 0.15))
34
+ away_penalty = max(0.4, 1.0 - (away_missing * 0.15))
35
+
36
+ # Turnuva/Ev sahibi avantajı (Dota 2'de genelde %10)
37
+ home_advantage = 1.10
38
+
39
+ # 2. Beklenen Harita Kazanma Sayıları (Lambda - λ)
40
+ # BO3'te temel harita kazanma ortalaması: Ev için 1.4, Deplasman için 1.1
41
+ base_home_maps = 1.4
42
+ base_away_maps = 1.1
43
+
44
+ lambda_home = base_home_maps * home_rank_power * home_form_power * home_penalty * home_advantage
45
+ lambda_away = base_away_maps * away_rank_power * away_form_power * away_penalty
46
+
47
+ # Lambda değerlerini BO3 mantığına sıkıştır (0.1 ile 2.5 arası)
48
+ lambda_home = max(0.1, min(2.5, lambda_home))
49
+ lambda_away = max(0.1, min(2.5, lambda_away))
50
+
51
+ # 3. Poisson Matrisi (0, 1, 2 harita kazanma)
52
+ max_maps = 2
53
+ home_probs = [poisson.pmf(i, lambda_home) for i in range(max_maps + 1)]
54
+ away_probs = [poisson.pmf(i, lambda_away) for i in range(max_maps + 1)]
55
+
56
+ # Skor matrisi (Ev x Deplasman harita sayısı)
57
  score_matrix = np.outer(home_probs, away_probs)
58
 
59
+ # 4. Maç Kazanma Olasılıklarını Toplama (BO3 formatına göre)
60
+ # Ev kazanır: 2-0 veya 2-1
61
+ p_home_win = score_matrix[2, 0] + score_matrix[2, 1]
62
+ # Deplasman kazanır: 0-2 veya 1-2
63
+ p_away_win = score_matrix[0, 2] + score_matrix[1, 2]
64
+ # Beraberlik Dota 2'de olmaz, ama matris bütünlüğü için 1-1 durumu (teorik)
65
+ p_draw = score_matrix[1, 1]
66
 
67
  return p_home_win, p_draw, p_away_win, lambda_home, lambda_away, score_matrix
68
 
69
  # ==========================================
70
  # 🧠 3. TAHMİN VE ANALİZ MOTORU
71
  # ==========================================
72
+ def predict_and_analyze(home_team, away_team, home_dpc, away_dpc, home_form, away_form, home_missing, away_missing):
73
  if not home_team or not away_team:
74
  return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
75
 
 
76
  p_home, p_draw, p_away, lam_home, lam_away, score_matrix = calculate_poisson_probabilities(
77
+ home_dpc, away_dpc, home_form, away_form, home_missing, away_missing
78
  )
79
 
80
+ # En olası harita skorunu bulma
81
  max_prob_idx = np.unravel_index(np.argmax(score_matrix), score_matrix.shape)
82
  most_likely_score = f"{max_prob_idx[0]} - {max_prob_idx[1]}"
83
  most_likely_prob = score_matrix[max_prob_idx] * 100
84
 
85
  # Gradio grafiği için dictionary formatı
86
  prob_dict = {
87
+ f"{home_team} Kazanır (2-0 / 2-1)": float(p_home),
88
+ f"{away_team} Kazanır (0-2 / 1-2)": float(p_away),
89
+ "Teorik Beraberlik (1-1)": float(p_draw)
90
  }
91
 
92
  prompt = f"""
93
+ Sen uzman bir Dota 2 analisti ve profesyonel bir veri modelleyicisisin.
94
+
95
+ Karşılaşma: {home_team} vs {away_team} (BO3 Formatı)
96
+
97
+ İstatistiksel Göstergeler:
98
+ - {home_team}: DPC Puanı: {home_dpc}, Son 5 Maç Formu (Galibiyet): {home_form}, Eksik Oyuncu: {home_missing}
99
+ - {away_team}: DPC Puanı: {away_dpc}, Son 5 Maç Formu (Galibiyet): {away_form}, Eksik Oyuncu: {away_missing}
100
+
101
+ Poisson Dağılım Modeli Sonuçları (Harita Bazlı):
102
+ - Beklenen Harita Kazanma Sayıları (λ): {home_team} {lam_home:.2f} - {away_team} {lam_away:.2f}
103
+ - {home_team} Maçı Kazanma Olasılığı (2-0 veya 2-1): %{p_home*100:.1f}
104
+ - {away_team} Maçı Kazanma Olasılığı (0-2 veya 1-2): %{p_away*100:.1f}
105
+ - En Olası Harita Skoru: {most_likely_score} (Olasılık: %{most_likely_prob:.1f})
106
+
 
107
  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:
108
+ 1. 🎯 Model Yorumu (Poisson dağılımı ve beklenen harita sayılarının mantığı)
109
+ 2. 🗺️ Olası Harita Skoru ve Draft Değerlendirmesi
110
+ 3. 💡 Değerli Bahis Önerisi (Handikap, Toplam Harita Üst/Alt, +EV Değerlendirmesi)
111
+
112
  Yorumların rasyonel, nesnel ve profesyonel olsun.
113
  """
114
 
115
  if client:
116
  try:
117
  response = client.chat.completions.create(
118
+ model="openai/gpt-oss-120b",
119
  messages=[
120
  {"role": "user", "content": prompt}
121
  ],
 
133
  # ==========================================
134
  # 🎨 4. GRADIO ARAYÜZÜ
135
  # ==========================================
136
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="red", secondary_hue="slate")) as demo:
137
  gr.Markdown(
138
  """
139
+ # 🎮 Dota 2 Poisson Dağılımı & Groq Hibrit Maç Tahmin Radarı
140
+ Bu uygulama, girdiğiniz takım verilerini **Poisson Dağılımı** ile analiz ederek BO3 maçlarda beklenen harita sayılarını ve maç kazanma olasılıklarını hesaplar, ardından **Groq (GPT-OSS)** yapay zekası ile matematiksel olarak yorumlar.
141
  """
142
  )
143
+
144
  with gr.Row():
145
  with gr.Column():
146
+ gr.Markdown("### ⚔️ Takım İsimleri")
147
+ home_input = gr.Textbox(label="Takım 1 (Ev Sahibi)", value="Team Spirit")
148
+ away_input = gr.Textbox(label="Takım 2 (Deplasman)", value="Gaimin Gladiators")
149
+
150
+ gr.Markdown("### 📊 DPC ve Form Durumu")
151
  with gr.Row():
152
+ home_dpc_input = gr.Number(label="Takım 1 DPC Puanı", value=1500, precision=0)
153
+ away_dpc_input = gr.Number(label="Takım 2 DPC Puanı", value=800, precision=0)
154
  with gr.Row():
155
+ home_form_input = gr.Slider(label="Takım 1 Form (Son 5 Maç Galibiyet)", minimum=0, maximum=5, value=4, step=1)
156
+ away_form_input = gr.Slider(label="Takım 2 Form (Son 5 Maç Galibiyet)", minimum=0, maximum=5, value=2, step=1)
157
  with gr.Row():
158
+ home_miss_input = gr.Number(label="Takım 1 Eksik Oyuncu", value=0, precision=0)
159
+ away_miss_input = gr.Number(label="Takım 2 Eksik Oyuncu", value=1, precision=0)
160
+
161
  submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
162
 
163
  with gr.Column():
164
+ gr.Markdown("### 📈 Matematiksel Maç Kazanma Olasılıkları (Poisson)")
165
  prob_output = gr.Label(label="Olasılık Dağılımı")
166
+
167
  gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
168
  analysis_output = gr.Markdown(value="Verileri girdikten sonra butona basarak analizi başlatabilirsiniz.")
169
 
 
171
  fn=predict_and_analyze,
172
  inputs=[
173
  home_input, away_input,
174
+ home_dpc_input, away_dpc_input,
175
  home_form_input, away_form_input,
176
+ home_miss_input, away_miss_input
177
  ],
178
  outputs=[analysis_output, prob_output]
179
  )