GoshawkVortexAI commited on
Commit
7d752da
·
verified ·
1 Parent(s): 4891a08

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -111
app.py CHANGED
@@ -13,107 +13,124 @@ if api_key:
13
  client = Groq(api_key=api_key)
14
 
15
  # ==========================================
16
- # 🎰 2. SLOT OYUNU OLASILIK MOTORU (POISSON)
17
  # ==========================================
18
- def calculate_slot_probabilities(symbol_count, wild_count, scatter_count, spin_count, volatility):
19
  """
20
- Slot oyunu için sembol düşme olasılıklarını Poisson ile hesaplar.
21
- - symbol_count: Makaralarda toplam sembol sayısı (ör. 20)
22
- - wild_count: Wild sembol sayısı
23
- - scatter_count: Scatter sembol sayısı
24
- - spin_count: Simüle edilecek spin sayısı
25
- - volatility: Düşük / Orta / Yüksek (ödeme sıklığını etkiler)
26
  """
27
- total_slots = max(1, symbol_count)
28
-
29
- # Volatilite katsayısı (düşük = sık küçük ödeme, yüksek = nadir büyük ödeme)
30
- vol_map = {"Düşük": 0.6, "Orta": 1.0, "Yüksek": 1.5}
31
- vol_factor = vol_map.get(volatility, 1.0)
32
-
33
- # Beklenen sembol düşme sayıları (λ)
34
- lambda_wild = (wild_count / total_slots) * spin_count * vol_factor
35
- lambda_scatter = (scatter_count / total_slots) * spin_count * vol_factor
36
- lambda_line = (1.0 / total_slots) * spin_count * vol_factor # Herhangi bir ödeme çizgisi
37
-
38
- # Poisson ile 0-10 arası düşme olasılıkları
39
- max_hits = 10
40
- wild_probs = [poisson.pmf(i, lambda_wild) for i in range(max_hits + 1)]
41
- scatter_probs = [poisson.pmf(i, lambda_scatter) for i in range(max_hits + 1)]
42
- line_probs = [poisson.pmf(i, lambda_line) for i in range(max_hits + 1)]
43
-
44
- # Kazanç olasılıkları (en az 1 eşleşme)
45
- p_wild = 1 - wild_probs[0]
46
- p_scatter = 1 - scatter_probs[0]
47
- p_any_win = 1 - line_probs[0]
48
-
49
- # Büyük kazanç (3+ scatter veya 3+ wild)
50
- p_big_win = sum(scatter_probs[3:]) + sum(wild_probs[3:])
51
-
52
- # RTP tahmini (volatiliteye göre ayarlanır, %85-98 arası)
53
- base_rtp = 92.0
54
- rtp_estimate = base_rtp - (vol_factor - 1.0) * 5.0
55
- rtp_estimate = max(80.0, min(99.0, rtp_estimate))
56
-
57
- # Ortalama ödeme çarpanı
58
- avg_multiplier = (1.0 + p_big_win * 20) * (rtp_estimate / 100.0)
59
-
60
- return {
61
- "p_wild": p_wild,
62
- "p_scatter": p_scatter,
63
- "p_any_win": p_any_win,
64
- "p_big_win": p_big_win,
65
- "lambda_wild": lambda_wild,
66
- "lambda_scatter": lambda_scatter,
67
- "lambda_line": lambda_line,
68
- "rtp_estimate": rtp_estimate,
69
- "avg_multiplier": avg_multiplier,
70
- "wild_probs": wild_probs,
71
- "scatter_probs": scatter_probs,
72
- "line_probs": line_probs,
73
- }
 
 
 
 
 
 
 
 
 
 
74
 
75
  # ==========================================
76
  # 🧠 3. TAHMİN VE ANALİZ MOTORU
77
  # ==========================================
78
- def predict_and_analyze(game_name, symbol_count, wild_count, scatter_count, spin_count, volatility):
79
- if not game_name:
80
- return "Lütfen oyun adını giriniz.", {}
 
 
 
 
 
 
81
 
82
- result = calculate_slot_probabilities(symbol_count, wild_count, scatter_count, spin_count, volatility)
 
 
 
83
 
84
  # Gradio grafiği için olasılık sözlüğü
85
  prob_dict = {
86
- "En Az 1 Wild Düşme": float(result["p_wild"]),
87
- "En Az 1 Scatter Düşme": float(result["p_scatter"]),
88
- "Herhangi Bir Kazanç": float(result["p_any_win"]),
89
- "Büyük Kazanç (3+ Scatter/Wild)": float(result["p_big_win"]),
90
  }
91
 
92
  prompt = f"""
93
- Sen uzman bir slot oyunları (sanal kumarhane) analisti ve olasılık modelleyicisisin.
 
 
 
 
94
 
95
- 🎰 Oyun: {game_name}
96
- 📊 Parametreler:
97
- - Toplam sembol sayısı: {symbol_count}
98
- - Wild sembol sayısı: {wild_count}
99
- - Scatter sembol sayısı: {scatter_count}
100
- - Simüle edilen spin sayısı: {spin_count}
101
- - Volatilite: {volatility}
102
 
103
  📈 Poisson Modeli Sonuçları:
104
- - Beklenen Wild (λ): {result['lambda_wild']:.2f} | En az 1 Wild: %{result['p_wild']*100:.1f}
105
- - Beklenen Scatter (λ): {result['lambda_scatter']:.2f} | En az 1 Scatter: %{result['p_scatter']*100:.1f}
106
- - Herhangi bir kazanç: %{result['p_any_win']*100:.1f}
107
- - Büyük kazanç (3+ Scatter/Wild): %{result['p_big_win']*100:.1f}
108
- - Tahmini RTP: %{result['rtp_estimate']:.1f}
109
- - Ortalama ödeme çarpanı: {result['avg_multiplier']:.2f}x
110
-
111
- Türkçe bir analiz raporu hazırla. Şu başlıklar bulunsun:
112
- 1. 🎯 Model Yorumu (Poisson dağılımı ve sembol düşme mantığı)
113
- 2. 🎰 Volatilite ve RTP Değerlendirmesi (oyunun risk profili)
114
- 3. 💡 Strateji ve Bahis Önerisi (spin sayısı, bütçe yönetimi, +EV değerlendirmesi)
115
-
116
- Yorumların rasyonel, nesnel ve profesyonel olsun. Kumar bağımlılığına karşı sorumlu oyun vurgusu yap.
 
117
  """
118
 
119
  if client:
@@ -129,45 +146,44 @@ def predict_and_analyze(game_name, symbol_count, wild_count, scatter_count, spin
129
  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.)"
130
  else:
131
  analysis_result = ("Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına "
132
- "'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki olasılık grafiğini görebilirsiniz.)")
133
 
134
  return analysis_result, prob_dict
135
 
136
  # ==========================================
137
  # 🎨 4. GRADIO ARAYÜZÜ
138
  # ==========================================
139
- with gr.Blocks(theme=gr.themes.Soft(primary_hue="amber", secondary_hue="slate")) as demo:
140
  gr.Markdown(
141
  """
142
- # 🎰 Slot Oyunu Olasılık & Groq AI Tahmin Radarı
143
- Bu uygulama, slot oyunu parametrelerini **Poisson Dağılımı** ile analiz ederek sembol düşme olasılıklarını ve RTP tahminini hesaplar; ardından **Groq (GPT-OSS)** yapay zekası ile strateji raporu üretir.
144
  """
145
  )
146
 
147
  with gr.Row():
148
  with gr.Column():
149
- gr.Markdown("### 🎮 Oyun Bilgileri")
150
- game_input = gr.Textbox(label="Oyun Adı", value="Gates of Olympus")
 
151
 
152
- gr.Markdown("### 🎰 Makara Parametreleri")
153
  with gr.Row():
154
- symbol_input = gr.Number(label="Toplam Sembol Sayısı", value=20, precision=0)
155
- spin_input = gr.Number(label="Simüle Edilecek Spin", value=100, precision=0)
 
 
156
  with gr.Row():
157
- wild_input = gr.Number(label="Wild Sembol Sayısı", value=3, precision=0)
158
- scatter_input = gr.Number(label="Scatter Sembol Sayısı", value=2, precision=0)
159
-
160
- gr.Markdown("### 📊 Volatilite")
161
- volatility_input = gr.Radio(
162
- choices=["Düşük", "Orta", "Yüksek"],
163
- value="Orta",
164
- label="Oyun Volatilitesi"
165
- )
166
 
167
  submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
168
 
169
  with gr.Column():
170
- gr.Markdown("### 📈 Sembol Düşme Olasılıkları (Poisson)")
171
  prob_output = gr.Label(label="Olasılık Dağılımı")
172
 
173
  gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
@@ -175,16 +191,14 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="amber", secondary_hue="slate"))
175
 
176
  submit_btn.click(
177
  fn=predict_and_analyze,
178
- inputs=[game_input, symbol_input, wild_input, scatter_input, spin_input, volatility_input],
 
 
 
 
 
179
  outputs=[analysis_output, prob_output]
180
  )
181
 
182
- gr.Markdown(
183
- """
184
- ---
185
- ⚠️ **Sorumlu Oyun Uyarısı**: Bu uygulama yalnızca eğitim ve olasılık analizi amaçlıdır. Slot oyunları şans oyunlarıdır; kaybetme riski her zaman vardır. Lütfen bütçenizi aşmayın ve sorumlu oynayın.
186
- """
187
- )
188
-
189
  if __name__ == "__main__":
190
  demo.launch()
 
13
  client = Groq(api_key=api_key)
14
 
15
  # ==========================================
16
+ # ⚽ 2. FIFA H2H POISSON GOL TAHMİN MOTORU
17
  # ==========================================
18
+ def calculate_poisson_probabilities(home_rating, away_rating, home_form, away_form, home_injuries, away_injuries):
19
  """
20
+ FIFA H2H sanal lig için Poisson tabanlı gol tahmini.
21
+ - rating: Takım genel gücü (1-99, FIFA Overall Rating)
22
+ - form: Son 5 maç formu (0-15 puan)
23
+ - injuries: Sakat/cezalı oyuncu sayısı
 
 
24
  """
25
+ # 1. Takım güçlerini normalize et (FIFA rating 1-99 arası)
26
+ home_attack = max(0.5, home_rating / 70.0) # 70 ortalama rating kabul edildi
27
+ away_attack = max(0.5, away_rating / 70.0)
28
+
29
+ # 2. Form gücü (0-15 -> 0.5-2.0 çarpan)
30
+ home_form_power = (home_form / 15.0) * 1.5 + 0.5
31
+ away_form_power = (away_form / 15.0) * 1.5 + 0.5
32
+
33
+ # 3. Sakatlık cezası: her eksik oyuncu %12 güç kaybı
34
+ home_penalty = max(0.4, 1.0 - (home_injuries * 0.12))
35
+ away_penalty = max(0.4, 1.0 - (away_injuries * 0.12))
36
+
37
+ # 4. Ev sahibi avantajı (FIFA H2H'de ev sahibi ~%15 avantajlı)
38
+ home_advantage = 1.15
39
+
40
+ # 5. Beklenen gol sayıları (Lambda - λ)
41
+ # FIFA H2H ortalama gol: Ev ~1.6, Deplasman ~1.2
42
+ base_home_goals = 1.6
43
+ base_away_goals = 1.2
44
+
45
+ lambda_home = base_home_goals * home_attack * home_form_power * home_penalty * home_advantage
46
+ lambda_away = base_away_goals * away_attack * away_form_power * away_penalty
47
+
48
+ # Lambda değerlerini makul aralığa sıkıştır
49
+ lambda_home = max(0.1, min(4.5, lambda_home))
50
+ lambda_away = max(0.1, min(4.5, lambda_away))
51
+
52
+ # 6. Poisson matrisi (0-6 gol arası)
53
+ max_goals = 6
54
+ home_probs = [poisson.pmf(i, lambda_home) for i in range(max_goals + 1)]
55
+ away_probs = [poisson.pmf(i, lambda_away) for i in range(max_goals + 1)]
56
+
57
+ score_matrix = np.outer(home_probs, away_probs)
58
+
59
+ # 7. Sonuç olasılıkları
60
+ p_home_win = np.sum(np.tril(score_matrix, -1))
61
+ p_draw = np.sum(np.diag(score_matrix))
62
+ p_away_win = np.sum(np.triu(score_matrix, 1))
63
+
64
+ # 8. Alt/Üst 2.5 gol olasılığı
65
+ p_under_25 = 0.0
66
+ p_over_25 = 0.0
67
+ for i in range(max_goals + 1):
68
+ for j in range(max_goals + 1):
69
+ if i + j <= 2:
70
+ p_under_25 += score_matrix[i, j]
71
+ else:
72
+ p_over_25 += score_matrix[i, j]
73
+
74
+ # 9. Karşılıklı gol (BTTS) olasılığı
75
+ p_btts_yes = 0.0
76
+ for i in range(1, max_goals + 1):
77
+ for j in range(1, max_goals + 1):
78
+ p_btts_yes += score_matrix[i, j]
79
+
80
+ return (p_home_win, p_draw, p_away_win, lambda_home, lambda_away,
81
+ score_matrix, p_under_25, p_over_25, p_btts_yes)
82
 
83
  # ==========================================
84
  # 🧠 3. TAHMİN VE ANALİZ MOTORU
85
  # ==========================================
86
+ def predict_and_analyze(home_team, away_team, home_rating, away_rating,
87
+ home_form, away_form, home_injuries, away_injuries):
88
+ if not home_team or not away_team:
89
+ return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
90
+
91
+ (p_home, p_draw, p_away, lam_home, lam_away,
92
+ score_matrix, p_under, p_over, p_btts) = calculate_poisson_probabilities(
93
+ home_rating, away_rating, home_form, away_form, home_injuries, away_injuries
94
+ )
95
 
96
+ # En olası skoru bul
97
+ max_idx = np.unravel_index(np.argmax(score_matrix), score_matrix.shape)
98
+ most_likely_score = f"{max_idx[0]} - {max_idx[1]}"
99
+ most_likely_prob = score_matrix[max_idx] * 100
100
 
101
  # Gradio grafiği için olasılık sözlüğü
102
  prob_dict = {
103
+ f"{home_team} Galibiyeti (1)": float(p_home),
104
+ "Beraberlik (X)": float(p_draw),
105
+ f"{away_team} Galibiyeti (2)": float(p_away)
 
106
  }
107
 
108
  prompt = f"""
109
+ Sen uzman bir FIFA (EA Sports FC) H2H sanal futbol analistisin.
110
+ Aşağıdaki verilere göre Türkçe bir maç öncesi analiz raporu hazırla.
111
+
112
+ ⚽ Karşılaşma: {home_team} (Ev) vs {away_team} (Deplasman)
113
+ 🏆 Format: FIFA H2H Sanal Ligi
114
 
115
+ 📊 Takım Güçleri (FIFA Overall Rating):
116
+ - {home_team}: Rating {home_rating}, Form (Son 5 Maç) {home_form}/15, Sakat/Cezalı {home_injuries}
117
+ - {away_team}: Rating {away_rating}, Form (Son 5 Maç) {away_form}/15, Sakat/Cezalı {away_injuries}
 
 
 
 
118
 
119
  📈 Poisson Modeli Sonuçları:
120
+ - Beklenen Gol (λ): {home_team} {lam_home:.2f} - {away_team} {lam_away:.2f}
121
+ - 1 (Ev Sahibi): %{p_home*100:.1f}
122
+ - X (Beraberlik): %{p_draw*100:.1f}
123
+ - 2 (Deplasman): %{p_away*100:.1f}
124
+ - En Olası Skor: {most_likely_score} (%{most_likely_prob:.1f})
125
+ - Alt 2.5: %{p_under*100:.1f} | Üst 2.5: %{p_over*100:.1f}
126
+ - Karşılıklı Gol (BTTS): %{p_btts*100:.1f}
127
+
128
+ Raporda şu başlıklar bulunsun:
129
+ 1. 🎯 Model Yorumu (Poisson ve beklenen gollerin mantığı)
130
+ 2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst, BTTS değerlendirmesi)
131
+ 3. 💡 Değerli Bahis Önerisi (+EV değerlendirmesi)
132
+
133
+ Yorumların rasyonel, nesnel ve profesyonel olsun.
134
  """
135
 
136
  if client:
 
146
  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.)"
147
  else:
148
  analysis_result = ("Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına "
149
+ "'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki Poisson grafik tahminini görebilirsiniz.)")
150
 
151
  return analysis_result, prob_dict
152
 
153
  # ==========================================
154
  # 🎨 4. GRADIO ARAYÜZÜ
155
  # ==========================================
156
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="green", secondary_hue="slate")) as demo:
157
  gr.Markdown(
158
  """
159
+ # ⚽ FIFA H2H Sanal Lig Poisson Tahmin Radarı
160
+ Bu uygulama, FIFA H2H sanal lig maçları için **Poisson Dağılımı** kullanarak gol ve sonuç tahminleri üretir; ardından **Groq (GPT-OSS)** yapay zekası ile analiz raporu hazırlar.
161
  """
162
  )
163
 
164
  with gr.Row():
165
  with gr.Column():
166
+ gr.Markdown("### 🏟️ Takım İsimleri")
167
+ home_input = gr.Textbox(label="Ev Sahibi Takım", value="Real Madrid")
168
+ away_input = gr.Textbox(label="Deplasman Takım", value="Barcelona")
169
 
170
+ gr.Markdown("### ⭐ Takım Güçleri (FIFA Overall Rating)")
171
  with gr.Row():
172
+ home_rating_input = gr.Number(label="Ev Sahibi Rating (1-99)", value=85, precision=0)
173
+ away_rating_input = gr.Number(label="Deplasman Rating (1-99)", value=84, precision=0)
174
+
175
+ gr.Markdown("### 📊 Form ve Sakatlık Durumu")
176
  with gr.Row():
177
+ home_form_input = gr.Slider(label="Ev Form (Son 5 Maç Puanı, Max 15)", minimum=0, maximum=15, value=11, step=1)
178
+ away_form_input = gr.Slider(label="Deplasman Form (Son 5 Maç Puanı, Max 15)", minimum=0, maximum=15, value=9, step=1)
179
+ with gr.Row():
180
+ home_inj_input = gr.Number(label="Ev Sakat/Cezalı Sayısı", value=1, precision=0)
181
+ away_inj_input = gr.Number(label="Deplasman Sakat/Cezalı Sayısı", value=2, precision=0)
 
 
 
 
182
 
183
  submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
184
 
185
  with gr.Column():
186
+ gr.Markdown("### 📈 Maç Sonucu Olasılıkları (Poisson)")
187
  prob_output = gr.Label(label="Olasılık Dağılımı")
188
 
189
  gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
 
191
 
192
  submit_btn.click(
193
  fn=predict_and_analyze,
194
+ inputs=[
195
+ home_input, away_input,
196
+ home_rating_input, away_rating_input,
197
+ home_form_input, away_form_input,
198
+ home_inj_input, away_inj_input
199
+ ],
200
  outputs=[analysis_output, prob_output]
201
  )
202
 
 
 
 
 
 
 
 
203
  if __name__ == "__main__":
204
  demo.launch()