05/23 Phase 15

This commit is contained in:
2026-05-23 15:05:58 -04:00
parent 8eea1e976f
commit 4edc527458
5 changed files with 306 additions and 0 deletions
+45
View File
@@ -28,6 +28,7 @@ from core.analyzer import (
pair_analysis, odd_even_ratio, sum_range_analysis, delta_analysis,
)
from core.exporter import export_frequency_excel, ensure_exports_dir
from core.odds import game_odds
_LAST_N_OPTIONS = {
"All draws": None,
@@ -83,6 +84,34 @@ class AnalysisScreen(ttk.Frame):
self._oe_fig, self._oe_canvas = self._make_tab(nb, "Odd/Even")
self._sum_fig, self._sum_canvas = self._make_tab(nb, "Sum Range")
self._delta_fig, self._delta_canvas = self._make_tab(nb, "Deltas")
self._make_odds_tab(nb)
def _make_odds_tab(self, notebook):
frame = ttk.Frame(notebook)
notebook.add(frame, text="Odds")
ttk.Label(
frame,
text="Mathematical odds based on the game's pool size. "
"Not all tiers pay prizes in every game.",
foreground="#666666", padding=(8, 6, 8, 2),
).pack(anchor="w")
cols = ("tier", "odds", "probability")
tv = ttk.Treeview(frame, columns=cols, show="headings", selectmode="none")
tv.heading("tier", text="Prize Tier")
tv.heading("odds", text="Odds (1 in X)")
tv.heading("probability", text="Probability")
tv.column("tier", width=210, anchor="w")
tv.column("odds", width=210, anchor="e")
tv.column("probability", width=160, anchor="e")
vsb = ttk.Scrollbar(frame, orient="vertical", command=tv.yview)
tv.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
tv.pack(fill="both", expand=True, padx=8, pady=(0, 8))
self._odds_tv = tv
def _make_tab(self, notebook, title):
frame = ttk.Frame(notebook)
@@ -132,6 +161,7 @@ class AnalysisScreen(ttk.Frame):
self._redraw_odd_even()
self._redraw_sum_range()
self._redraw_deltas()
self._redraw_odds()
def _redraw_frequency(self):
self._freq_fig.clear()
@@ -196,6 +226,21 @@ class AnalysisScreen(ttk.Frame):
_draw_deltas(ax, self._game_id)
self._delta_canvas.draw()
def _redraw_odds(self):
for row in self._odds_tv.get_children():
self._odds_tv.delete(row)
if self._game_id is None:
return
for r in game_odds(self._game_id):
p = r["probability"]
if p >= 0.001:
pct = f"{p * 100:.4f}%"
elif p >= 0.000001:
pct = f"{p * 100:.6f}%"
else:
pct = f"{p:.2e}"
self._odds_tv.insert("", "end", values=(r["tier"], r["odds_str"], pct))
def _export_frequency(self):
if self._game_id is None:
messagebox.showinfo("Export", "Select a game first.")