Syntrex commited on
Commit
160bca6
·
verified ·
1 Parent(s): f6b5f1a

Rename analytics/bankroll.txt to analytics/bankroll.py

Browse files
Files changed (2) hide show
  1. analytics/bankroll.py +59 -0
  2. analytics/bankroll.txt +0 -0
analytics/bankroll.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import pandas as pd
4
+
5
+ from analytics.edge import american_to_decimal
6
+
7
+
8
+ def grade_profit(stake: float, odds: int, result: str) -> float:
9
+ result = result.lower()
10
+ if result == "win":
11
+ decimal_odds = american_to_decimal(odds)
12
+ return stake * (decimal_odds - 1.0)
13
+ if result == "loss":
14
+ return -stake
15
+ return 0.0
16
+
17
+
18
+ def bankroll_curve(bets_df: pd.DataFrame) -> pd.DataFrame:
19
+ if bets_df.empty:
20
+ return pd.DataFrame(columns=["bet_id", "cum_profit"])
21
+
22
+ df = bets_df.sort_values("bet_id").copy()
23
+ df["cum_profit"] = df["profit"].fillna(0.0).cumsum()
24
+ return df[["bet_id", "cum_profit"]]
25
+
26
+
27
+ def summary_metrics(bets_df: pd.DataFrame) -> dict[str, float]:
28
+ if bets_df.empty:
29
+ return {
30
+ "bets": 0,
31
+ "stake": 0.0,
32
+ "profit": 0.0,
33
+ "roi": 0.0,
34
+ "win_rate": 0.0,
35
+ }
36
+
37
+ graded = bets_df[bets_df["result"].isin(["win", "loss"])].copy()
38
+ if graded.empty:
39
+ return {
40
+ "bets": 0,
41
+ "stake": 0.0,
42
+ "profit": 0.0,
43
+ "roi": 0.0,
44
+ "win_rate": 0.0,
45
+ }
46
+
47
+ total_stake = float(graded["stake"].sum())
48
+ total_profit = float(graded["profit"].sum())
49
+ wins = int((graded["result"] == "win").sum())
50
+ losses = int((graded["result"] == "loss").sum())
51
+ total = wins + losses
52
+
53
+ return {
54
+ "bets": total,
55
+ "stake": total_stake,
56
+ "profit": total_profit,
57
+ "roi": (total_profit / total_stake) if total_stake else 0.0,
58
+ "win_rate": (wins / total) if total else 0.0,
59
+ }
analytics/bankroll.txt DELETED
File without changes