LMLK commited on
Commit
829121e
·
verified ·
1 Parent(s): 6226874

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +6 -4
  2. index.html +658 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Advanced Player Prop Calculator
3
- emoji: 🐠
4
- colorFrom: purple
5
  colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: advanced-player-prop-calculator
3
+ emoji: 🐳
4
+ colorFrom: yellow
5
  colorTo: green
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,658 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>SportsBet Pro Calculator | Advanced Player Prop Analysis</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <script>
10
+ tailwind.config = {
11
+ theme: {
12
+ extend: {
13
+ colors: {
14
+ primary: '#1e40af',
15
+ secondary: '#1e3a8a',
16
+ accent: '#3b82f6',
17
+ dark: '#0f172a',
18
+ light: '#f8fafc'
19
+ }
20
+ }
21
+ }
22
+ }
23
+ </script>
24
+ <style>
25
+ .gradient-bg {
26
+ background: linear-gradient(135deg, #1e40af 0%, #3b82f6 100%);
27
+ }
28
+ .card-shadow {
29
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
30
+ }
31
+ .input-highlight {
32
+ transition: all 0.3s ease;
33
+ }
34
+ .input-highlight:focus {
35
+ border-color: #3b82f6;
36
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
37
+ }
38
+ .tab-active {
39
+ border-bottom: 3px solid #3b82f6;
40
+ color: #3b82f6;
41
+ font-weight: 600;
42
+ }
43
+ .result-card {
44
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
45
+ }
46
+ .result-card:hover {
47
+ transform: translateY(-5px);
48
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
49
+ }
50
+ </style>
51
+ </head>
52
+ <body class="bg-gray-50 min-h-screen">
53
+ <!-- Header -->
54
+ <header class="gradient-bg text-white">
55
+ <div class="container mx-auto px-4 py-6">
56
+ <div class="flex justify-between items-center">
57
+ <div class="flex items-center space-x-2">
58
+ <i class="fas fa-calculator text-3xl"></i>
59
+ <h1 class="text-2xl font-bold">SportsBet Pro</h1>
60
+ </div>
61
+ <nav>
62
+ <ul class="flex space-x-6">
63
+ <li><a href="#calculator" class="hover:text-blue-200 transition">Calculator</a></li>
64
+ </ul>
65
+ </nav>
66
+ </div>
67
+ </div>
68
+ </header>
69
+
70
+ <!-- Hero Section -->
71
+ <section class="gradient-bg text-white py-16">
72
+ <div class="container mx-auto px-4 text-center">
73
+ <h2 class="text-4xl font-bold mb-4">Advanced Player Prop Calculator</h2>
74
+ <p class="text-xl max-w-2xl mx-auto mb-8">Analyze and compare no-vig probabilities and statistical predictions for player props with our professional tools</p>
75
+ <a href="#calculator" class="bg-white text-primary px-6 py-3 rounded-lg font-semibold hover:bg-blue-50 transition inline-block">Get Started</a>
76
+ </div>
77
+ </section>
78
+
79
+ <!-- Calculator Section -->
80
+ <section id="calculator" class="py-12 bg-white">
81
+ <div class="container mx-auto px-4">
82
+ <h2 class="text-3xl font-bold text-center mb-12 text-dark">Player Prop Calculator</h2>
83
+
84
+ <!-- Tabs -->
85
+ <div class="flex justify-center mb-8 border-b border-gray-200">
86
+ <button id="noVigTab" class="px-6 py-3 font-medium text-gray-600 hover:text-primary transition tab-active">No-Vig Calculator</button>
87
+ <button id="statisticalTab" class="px-6 py-3 font-medium text-gray-600 hover:text-primary transition">Statistical Prediction</button>
88
+ <button id="compareTab" class="px-6 py-3 font-medium text-gray-600 hover:text-primary transition">Compare Results</button>
89
+ </div>
90
+
91
+ <!-- No-Vig Calculator -->
92
+ <div id="noVigContent" class="calculator-content">
93
+ <div class="max-w-4xl mx-auto bg-gray-50 rounded-xl p-8 card-shadow">
94
+ <h3 class="text-2xl font-semibold mb-6 text-dark">No-Vig Probability Calculator</h3>
95
+ <div class="grid md:grid-cols-2 gap-6">
96
+ <div>
97
+ <label class="block text-gray-700 mb-2">Over Odds (American)</label>
98
+ <input type="number" id="overOdds" placeholder="-122" class="w-full px-4 py-2 border rounded-lg input-highlight">
99
+ </div>
100
+ <div>
101
+ <label class="block text-gray-700 mb-2">Under Odds (American)</label>
102
+ <input type="number" id="underOdds" placeholder="+162" class="w-full px-4 py-2 border rounded-lg input-highlight">
103
+ </div>
104
+ </div>
105
+ <div class="mt-6">
106
+ <label class="block text-gray-700 mb-2">Player Name (Optional)</label>
107
+ <input type="text" id="playerName" placeholder="Search player..." class="w-full px-4 py-2 border rounded-lg input-highlight">
108
+ </div>
109
+ <div class="mt-6">
110
+ <label class="block text-gray-700 mb-2">Stat Type</label>
111
+ <select id="statType" class="w-full px-4 py-2 border rounded-lg input-highlight">
112
+ <option value="points">Points</option>
113
+ <option value="rebounds">Rebounds</option>
114
+ <option value="assists">Assists</option>
115
+ <option value="other">Other</option>
116
+ </select>
117
+ </div>
118
+ <button id="calculateNoVig" class="mt-8 bg-primary text-white px-6 py-3 rounded-lg font-semibold hover:bg-secondary transition w-full">Calculate No-Vig Probabilities</button>
119
+ </div>
120
+
121
+ <!-- Results -->
122
+ <div id="noVigResults" class="max-w-4xl mx-auto mt-8 hidden">
123
+ <div class="bg-white rounded-xl p-8 card-shadow">
124
+ <h4 class="text-xl font-semibold mb-4 text-dark">No-Vig Probability Results</h4>
125
+ <div class="grid md:grid-cols-2 gap-6">
126
+ <div class="result-card bg-gray-50 p-6 rounded-lg">
127
+ <h5 class="font-medium text-gray-700 mb-2">Over Probability</h5>
128
+ <p id="overProb" class="text-3xl font-bold text-primary">--%</p>
129
+ </div>
130
+ <div class="result-card bg-gray-50 p-6 rounded-lg">
131
+ <h5 class="font-medium text-gray-700 mb-2">Under Probability</h5>
132
+ <p id="underProb" class="text-3xl font-bold text-primary">--%</p>
133
+ </div>
134
+ </div>
135
+ <div class="mt-6">
136
+ <button id="saveNoVig" class="bg-accent text-white px-4 py-2 rounded-lg font-medium hover:bg-blue-500 transition">Save for Comparison</button>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+
142
+ <!-- Statistical Prediction -->
143
+ <div id="statisticalContent" class="calculator-content hidden">
144
+ <div class="max-w-4xl mx-auto bg-gray-50 rounded-xl p-8 card-shadow">
145
+ <h3 class="text-2xl font-semibold mb-6 text-dark">Statistical Prediction Calculator</h3>
146
+ <div class="grid md:grid-cols-2 gap-6">
147
+ <div>
148
+ <label class="block text-gray-700 mb-2">Projected Mean (μ)</label>
149
+ <input type="number" step="0.1" id="meanValue" placeholder="e.g. 22.5" class="w-full px-4 py-2 border rounded-lg input-highlight">
150
+ </div>
151
+ <div>
152
+ <label class="block text-gray-700 mb-2">Standard Deviation (σ)</label>
153
+ <div class="flex">
154
+ <input type="number" step="0.1" id="stdDevValue" placeholder="e.g. 5.2" class="w-full px-4 py-2 border rounded-l-lg input-highlight">
155
+ <button id="calculateStdDev" class="bg-gray-200 px-4 py-2 border rounded-r-lg hover:bg-gray-300 transition">Calculate σ</button>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ <div class="mt-6">
160
+ <label class="block text-gray-700 mb-2">Line Value (X)</label>
161
+ <input type="number" step="0.1" id="lineValue" placeholder="e.g. 24.5" class="w-full px-4 py-2 border rounded-lg input-highlight">
162
+ </div>
163
+ <div class="mt-6">
164
+ <label class="block text-gray-700 mb-2">Player Name (Optional)</label>
165
+ <input type="text" id="statPlayerName" placeholder="Search player..." class="w-full px-4 py-2 border rounded-lg input-highlight">
166
+ </div>
167
+ <div class="mt-6">
168
+ <label class="block text-gray-700 mb-2">Stat Type</label>
169
+ <select id="statStatType" class="w-full px-4 py-2 border rounded-lg input-highlight">
170
+ <option value="points">Points</option>
171
+ <option value="rebounds">Rebounds</option>
172
+ <option value="assists">Assists</option>
173
+ <option value="other">Other</option>
174
+ </select>
175
+ </div>
176
+ <button id="calculateStatistical" class="mt-8 bg-primary text-white px-6 py-3 rounded-lg font-semibold hover:bg-secondary transition w-full">Calculate Statistical Probabilities</button>
177
+ </div>
178
+
179
+ <!-- Std Dev Calculator Modal -->
180
+ <div id="stdDevModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center hidden z-50">
181
+ <div class="bg-white rounded-xl p-8 max-w-md w-full mx-4">
182
+ <h4 class="text-xl font-semibold mb-4">Calculate Standard Deviation</h4>
183
+ <div class="mb-4">
184
+ <label class="block text-gray-700 mb-2">Enter historical data (comma separated)</label>
185
+ <textarea id="historicalData" class="w-full px-4 py-2 border rounded-lg input-highlight" rows="4" placeholder="e.g. 18, 22, 25, 19, 21"></textarea>
186
+ </div>
187
+ <div class="flex justify-end space-x-4">
188
+ <button id="cancelStdDev" class="px-4 py-2 border rounded-lg hover:bg-gray-100 transition">Cancel</button>
189
+ <button id="confirmStdDev" class="bg-primary text-white px-4 py-2 rounded-lg hover:bg-secondary transition">Calculate</button>
190
+ </div>
191
+ </div>
192
+ </div>
193
+
194
+ <!-- Results -->
195
+ <div id="statisticalResults" class="max-w-4xl mx-auto mt-8 hidden">
196
+ <div class="bg-white rounded-xl p-8 card-shadow">
197
+ <h4 class="text-xl font-semibold mb-4 text-dark">Statistical Prediction Results</h4>
198
+ <div class="grid md:grid-cols-2 gap-6">
199
+ <div class="result-card bg-gray-50 p-6 rounded-lg">
200
+ <h5 class="font-medium text-gray-700 mb-2">Probability Over</h5>
201
+ <p id="statOverProb" class="text-3xl font-bold text-primary">--%</p>
202
+ <p class="text-sm text-gray-500 mt-1">(1−Φ((X−μ)/σ))×100%</p>
203
+ </div>
204
+ <div class="result-card bg-gray-50 p-6 rounded-lg">
205
+ <h5 class="font-medium text-gray-700 mb-2">Probability Under</h5>
206
+ <p id="statUnderProb" class="text-3xl font-bold text-primary">--%</p>
207
+ <p class="text-sm text-gray-500 mt-1">Φ((X−μ)/σ)×100%</p>
208
+ </div>
209
+ </div>
210
+ <div class="mt-6">
211
+ <button id="saveStatistical" class="bg-accent text-white px-4 py-2 rounded-lg font-medium hover:bg-blue-500 transition">Save for Comparison</button>
212
+ </div>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ <!-- Compare Results -->
218
+ <div id="compareContent" class="calculator-content hidden">
219
+ <div class="max-w-4xl mx-auto bg-gray-50 rounded-xl p-8 card-shadow">
220
+ <h3 class="text-2xl font-semibold mb-6 text-dark">Compare Calculation Methods</h3>
221
+
222
+ <div id="noSavedResults" class="text-center py-8">
223
+ <i class="fas fa-exchange-alt text-4xl text-gray-300 mb-4"></i>
224
+ <p class="text-gray-500">No saved results to compare yet. Calculate and save results from the other tabs to compare them here.</p>
225
+ </div>
226
+
227
+ <div id="comparisonResults" class="hidden">
228
+ <div class="grid md:grid-cols-2 gap-6 mb-8">
229
+ <div class="bg-white p-6 rounded-lg card-shadow">
230
+ <h4 class="text-lg font-semibold mb-4" id="compareMethod1">Method 1</h4>
231
+ <div class="space-y-4">
232
+ <div>
233
+ <p class="text-gray-600">Over Probability</p>
234
+ <p class="text-xl font-bold" id="compareOver1">--%</p>
235
+ </div>
236
+ <div>
237
+ <p class="text-gray-600">Under Probability</p>
238
+ <p class="text-xl font-bold" id="compareUnder1">--%</p>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ <div class="bg-white p-6 rounded-lg card-shadow">
243
+ <h4 class="text-lg font-semibold mb-4" id="compareMethod2">Method 2</h4>
244
+ <div class="space-y-4">
245
+ <div>
246
+ <p class="text-gray-600">Over Probability</p>
247
+ <p class="text-xl font-bold" id="compareOver2">--%</p>
248
+ </div>
249
+ <div>
250
+ <p class="text-gray-600">Under Probability</p>
251
+ <p class="text-xl font-bold" id="compareUnder2">--%</p>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ </div>
256
+
257
+ <div class="bg-white p-6 rounded-lg card-shadow">
258
+ <h4 class="text-lg font-semibold mb-4">Comparison Analysis</h4>
259
+ <div class="space-y-4">
260
+ <div>
261
+ <p class="text-gray-600">Over Probability Difference</p>
262
+ <p class="text-xl font-bold" id="overDiff">--%</p>
263
+ </div>
264
+ <div>
265
+ <p class="text-gray-600">Under Probability Difference</p>
266
+ <p class="text-xl font-bold" id="underDiff">--%</p>
267
+ </div>
268
+ <div>
269
+ <p class="text-gray-600">Recommendation</p>
270
+ <p class="text-lg font-semibold" id="recommendation">--</p>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ </section>
279
+
280
+ <!-- How to Use Section -->
281
+ <section id="how-to-use" class="py-12 bg-gray-50">
282
+ <div class="container mx-auto px-4">
283
+ <h2 class="text-3xl font-bold text-center mb-12 text-dark">How to Use the Calculator</h2>
284
+
285
+ <div class="max-w-4xl mx-auto">
286
+ <div class="bg-white rounded-xl p-8 card-shadow mb-8">
287
+ <h3 class="text-2xl font-semibold mb-4 text-dark flex items-center">
288
+ <i class="fas fa-percentage mr-3 text-primary"></i> No-Vig Calculator
289
+ </h3>
290
+ <div class="space-y-4">
291
+ <p>1. <strong>Find player prop odds</strong> from sportsbooks like FanDuel (search at <a href="https://sportsbook.fanduel.com/search" class="text-accent hover:underline" target="_blank">sportsbook.fanduel.com/search</a>)</p>
292
+ <p>2. <strong>Enter the American odds</strong> for both Over and Under (e.g., -122 for Over, +162 for Under)</p>
293
+ <p>3. Optionally enter the player name and stat type for reference</p>
294
+ <p>4. Click "Calculate No-Vig Probabilities" to see the true probabilities without the bookmaker's vig</p>
295
+ <p>5. Save results to compare with other methods</p>
296
+ </div>
297
+ </div>
298
+
299
+ <div class="bg-white rounded-xl p-8 card-shadow mb-8">
300
+ <h3 class="text-2xl font-semibold mb-4 text-dark flex items-center">
301
+ <i class="fas fa-chart-line mr-3 text-primary"></i> Statistical Prediction
302
+ </h3>
303
+ <div class="space-y-4">
304
+ <p>1. <strong>Determine the projected mean (μ)</strong> for the player's performance (based on historical data or projections)</p>
305
+ <p>2. <strong>Enter the standard deviation (σ)</strong> or calculate it using historical data</p>
306
+ <p>3. <strong>Input the line value (X)</strong> you want to evaluate against</p>
307
+ <p>4. Optionally enter the player name and stat type for reference</p>
308
+ <p>5. Click "Calculate Statistical Probabilities" to see the predicted probabilities</p>
309
+ <p>6. Save results to compare with other methods</p>
310
+ </div>
311
+ </div>
312
+
313
+ <div class="bg-white rounded-xl p-8 card-shadow">
314
+ <h3 class="text-2xl font-semibold mb-4 text-dark flex items-center">
315
+ <i class="fas fa-balance-scale mr-3 text-primary"></i> Compare Results
316
+ </h3>
317
+ <div class="space-y-4">
318
+ <p>1. <strong>Calculate and save results</strong> from both methods above</p>
319
+ <p>2. <strong>Navigate to the Compare tab</strong> to view side-by-side analysis</p>
320
+ <p>3. The calculator will show probability differences and provide a recommendation</p>
321
+ <p>4. Use this comparison to identify potential value bets where methods disagree</p>
322
+ </div>
323
+ </div>
324
+ </div>
325
+ </div>
326
+ </section>
327
+
328
+ <!-- About Section -->
329
+ <section id="about" class="py-12 bg-white">
330
+ <div class="container mx-auto px-4">
331
+ <div class="max-w-4xl mx-auto">
332
+ <h2 class="text-3xl font-bold text-center mb-12 text-dark">About SportsBet Pro Calculator</h2>
333
+
334
+ <div class="bg-gray-50 rounded-xl p-8 card-shadow">
335
+ <div class="space-y-6">
336
+ <div>
337
+ <h3 class="text-xl font-semibold mb-2 text-dark">No-Vig Probability</h3>
338
+ <p class="text-gray-700">The no-vig calculator removes the bookmaker's margin (vigorish) to show the true implied probabilities of each outcome. This helps you understand the market's actual assessment of probabilities without the book's built-in advantage.</p>
339
+ </div>
340
+
341
+ <div>
342
+ <h3 class="text-xl font-semibold mb-2 text-dark">Statistical Prediction</h3>
343
+ <p class="text-gray-700">Using the normal distribution formula, this method calculates the probability of a player exceeding or falling short of a given line based on their projected performance (mean) and consistency (standard deviation). The formula used is:</p>
344
+ <div class="bg-gray-100 p-4 rounded-lg mt-2">
345
+ <p class="font-mono text-sm">
346
+ Probability Over = (1−Φ((X−μ)/σ))×100%<br>
347
+ Probability Under = Φ((X−μ)/σ)×100%
348
+ </p>
349
+ </div>
350
+ <p class="text-gray-700 mt-2">Where Φ is the cumulative distribution function of the standard normal distribution.</p>
351
+ </div>
352
+
353
+ <div>
354
+ <h3 class="text-xl font-semibold mb-2 text-dark">Standard Deviation</h3>
355
+ <p class="text-gray-700">Standard deviation (σ) measures how spread out a player's performance is from their average. A higher σ means more variability in outcomes. You can calculate σ by entering historical performance data for the player.</p>
356
+ </div>
357
+ </div>
358
+ </div>
359
+ </div>
360
+ </div>
361
+ </section>
362
+
363
+ <!-- Footer -->
364
+ <footer class="bg-dark text-white py-8">
365
+ <div class="container mx-auto px-4">
366
+ <div class="flex flex-col md:flex-row justify-between items-center">
367
+ <div class="flex items-center space-x-2 mb-4 md:mb-0">
368
+ <i class="fas fa-calculator text-2xl"></i>
369
+ <span class="text-xl font-bold">SportsBet Pro</span>
370
+ </div>
371
+ <div class="text-center md:text-right">
372
+ <p class="text-gray-400">© 2023 SportsBet Pro Calculator. All rights reserved.</p>
373
+ <p class="text-gray-400 text-sm mt-1">For entertainment purposes only. Gamble responsibly.</p>
374
+ </div>
375
+ </div>
376
+ </div>
377
+ </footer>
378
+
379
+ <script>
380
+ // Tab functionality
381
+ document.addEventListener('DOMContentLoaded', function() {
382
+ const tabs = {
383
+ noVig: {
384
+ tab: document.getElementById('noVigTab'),
385
+ content: document.getElementById('noVigContent')
386
+ },
387
+ statistical: {
388
+ tab: document.getElementById('statisticalTab'),
389
+ content: document.getElementById('statisticalContent')
390
+ },
391
+ compare: {
392
+ tab: document.getElementById('compareTab'),
393
+ content: document.getElementById('compareContent')
394
+ }
395
+ };
396
+
397
+ // Initialize first tab as active
398
+ activateTab('noVig');
399
+
400
+ // Tab click events
401
+ tabs.noVig.tab.addEventListener('click', () => activateTab('noVig'));
402
+ tabs.statistical.tab.addEventListener('click', () => activateTab('statistical'));
403
+ tabs.compare.tab.addEventListener('click', () => activateTab('compare'));
404
+
405
+ function activateTab(activeTab) {
406
+ // Reset all tabs and contents
407
+ Object.keys(tabs).forEach(tab => {
408
+ tabs[tab].tab.classList.remove('tab-active');
409
+ tabs[tab].content.classList.add('hidden');
410
+ });
411
+
412
+ // Activate selected tab
413
+ tabs[activeTab].tab.classList.add('tab-active');
414
+ tabs[activeTab].content.classList.remove('hidden');
415
+
416
+ // Update comparison view if needed
417
+ if (activeTab === 'compare') {
418
+ updateComparisonView();
419
+ }
420
+ }
421
+
422
+ // No-Vig Calculator
423
+ document.getElementById('calculateNoVig').addEventListener('click', calculateNoVig);
424
+
425
+ function calculateNoVig() {
426
+ const overOdds = parseFloat(document.getElementById('overOdds').value);
427
+ const underOdds = parseFloat(document.getElementById('underOdds').value);
428
+
429
+ if (isNaN(overOdds) || isNaN(underOdds)) {
430
+ alert('Please enter valid odds for both Over and Under');
431
+ return;
432
+ }
433
+
434
+ // Convert American odds to implied probabilities
435
+ const overProb = americanToImplied(overOdds);
436
+ const underProb = americanToImplied(underOdds);
437
+
438
+ // Calculate no-vig probabilities
439
+ const totalProb = overProb + underProb;
440
+ const noVigOver = (overProb / totalProb) * 100;
441
+ const noVigUnder = (underProb / totalProb) * 100;
442
+
443
+ // Display results
444
+ document.getElementById('overProb').textContent = noVigOver.toFixed(2) + '%';
445
+ document.getElementById('underProb').textContent = noVigUnder.toFixed(2) + '%';
446
+ document.getElementById('noVigResults').classList.remove('hidden');
447
+
448
+ // Save for comparison
449
+ window.noVigResult = {
450
+ method: 'No-Vig Probability',
451
+ over: noVigOver,
452
+ under: noVigUnder,
453
+ player: document.getElementById('playerName').value || 'Unknown Player',
454
+ stat: document.getElementById('statType').value
455
+ };
456
+ }
457
+
458
+ function americanToImplied(odds) {
459
+ if (odds > 0) {
460
+ return 100 / (odds + 100);
461
+ } else {
462
+ return -odds / (-odds + 100);
463
+ }
464
+ }
465
+
466
+ // Statistical Calculator
467
+ document.getElementById('calculateStatistical').addEventListener('click', calculateStatistical);
468
+ document.getElementById('calculateStdDev').addEventListener('click', showStdDevModal);
469
+ document.getElementById('cancelStdDev').addEventListener('click', hideStdDevModal);
470
+ document.getElementById('confirmStdDev').addEventListener('click', calculateStdDevFromData);
471
+
472
+ function calculateStatistical() {
473
+ const mean = parseFloat(document.getElementById('meanValue').value);
474
+ const stdDev = parseFloat(document.getElementById('stdDevValue').value);
475
+ const line = parseFloat(document.getElementById('lineValue').value);
476
+
477
+ if (isNaN(mean) || isNaN(stdDev) || isNaN(line)) {
478
+ alert('Please enter valid numbers for Mean, Standard Deviation, and Line Value');
479
+ return;
480
+ }
481
+
482
+ if (stdDev <= 0) {
483
+ alert('Standard Deviation must be greater than 0');
484
+ return;
485
+ }
486
+
487
+ // Calculate z-score
488
+ const z = (line - mean) / stdDev;
489
+
490
+ // Calculate probabilities using standard normal CDF approximation
491
+ const underProb = standardNormalCDF(z) * 100;
492
+ const overProb = (1 - standardNormalCDF(z)) * 100;
493
+
494
+ // Display results
495
+ document.getElementById('statOverProb').textContent = overProb.toFixed(2) + '%';
496
+ document.getElementById('statUnderProb').textContent = underProb.toFixed(2) + '%';
497
+ document.getElementById('statisticalResults').classList.remove('hidden');
498
+
499
+ // Save for comparison
500
+ window.statisticalResult = {
501
+ method: 'Statistical Prediction',
502
+ over: overProb,
503
+ under: underProb,
504
+ player: document.getElementById('statPlayerName').value || 'Unknown Player',
505
+ stat: document.getElementById('statStatType').value
506
+ };
507
+ }
508
+
509
+ // Standard Normal CDF approximation
510
+ function standardNormalCDF(z) {
511
+ // Abramowitz and Stegun approximation
512
+ const t = 1 / (1 + 0.2316419 * Math.abs(z));
513
+ const d = 0.3989423 * Math.exp(-z * z / 2);
514
+ let prob = d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));
515
+
516
+ if (z > 0) {
517
+ prob = 1 - prob;
518
+ }
519
+
520
+ return prob;
521
+ }
522
+
523
+ function showStdDevModal() {
524
+ document.getElementById('stdDevModal').classList.remove('hidden');
525
+ }
526
+
527
+ function hideStdDevModal() {
528
+ document.getElementById('stdDevModal').classList.add('hidden');
529
+ }
530
+
531
+ function calculateStdDevFromData() {
532
+ const dataInput = document.getElementById('historicalData').value;
533
+ const dataPoints = dataInput.split(',').map(item => parseFloat(item.trim())).filter(item => !isNaN(item));
534
+
535
+ if (dataPoints.length < 2) {
536
+ alert('Please enter at least 2 valid numbers');
537
+ return;
538
+ }
539
+
540
+ // Calculate mean
541
+ const mean = dataPoints.reduce((sum, val) => sum + val, 0) / dataPoints.length;
542
+
543
+ // Calculate variance
544
+ const variance = dataPoints.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / dataPoints.length;
545
+
546
+ // Standard deviation is square root of variance
547
+ const stdDev = Math.sqrt(variance);
548
+
549
+ // Update the standard deviation field
550
+ document.getElementById('stdDevValue').value = stdDev.toFixed(2);
551
+
552
+ // Close modal
553
+ hideStdDevModal();
554
+ }
555
+
556
+ // Save buttons
557
+ document.getElementById('saveNoVig').addEventListener('click', () => {
558
+ if (window.noVigResult) {
559
+ localStorage.setItem('savedNoVigResult', JSON.stringify(window.noVigResult));
560
+ alert('No-Vig results saved for comparison');
561
+ } else {
562
+ alert('Please calculate results first');
563
+ }
564
+ });
565
+
566
+ document.getElementById('saveStatistical').addEventListener('click', () => {
567
+ if (window.statisticalResult) {
568
+ localStorage.setItem('savedStatisticalResult', JSON.stringify(window.statisticalResult));
569
+ alert('Statistical results saved for comparison');
570
+ } else {
571
+ alert('Please calculate results first');
572
+ }
573
+ });
574
+
575
+ // Comparison view
576
+ function updateComparisonView() {
577
+ const noVigResult = JSON.parse(localStorage.getItem('savedNoVigResult'));
578
+ const statisticalResult = JSON.parse(localStorage.getItem('savedStatisticalResult'));
579
+
580
+ if (!noVigResult && !statisticalResult) {
581
+ document.getElementById('noSavedResults').classList.remove('hidden');
582
+ document.getElementById('comparisonResults').classList.add('hidden');
583
+ return;
584
+ }
585
+
586
+ document.getElementById('noSavedResults').classList.add('hidden');
587
+ document.getElementById('comparisonResults').classList.remove('hidden');
588
+
589
+ if (noVigResult && statisticalResult) {
590
+ // Both results available
591
+ document.getElementById('compareMethod1').textContent = noVigResult.method;
592
+ document.getElementById('compareOver1').textContent = noVigResult.over.toFixed(2) + '%';
593
+ document.getElementById('compareUnder1').textContent = noVigResult.under.toFixed(2) + '%';
594
+
595
+ document.getElementById('compareMethod2').textContent = statisticalResult.method;
596
+ document.getElementById('compareOver2').textContent = statisticalResult.over.toFixed(2) + '%';
597
+ document.getElementById('compareUnder2').textContent = statisticalResult.under.toFixed(2) + '%';
598
+
599
+ // Calculate differences
600
+ const overDiff = (statisticalResult.over - noVigResult.over).toFixed(2);
601
+ const underDiff = (statisticalResult.under - noVigResult.under).toFixed(2);
602
+
603
+ document.getElementById('overDiff').textContent = (overDiff > 0 ? '+' : '') + overDiff + '%';
604
+ document.getElementById('underDiff').textContent = (underDiff > 0 ? '+' : '') + underDiff + '%';
605
+
606
+ // Recommendation
607
+ let recommendation = '';
608
+ const threshold = 5; // Percentage difference threshold for recommendation
609
+
610
+ if (Math.abs(overDiff) > threshold || Math.abs(underDiff) > threshold) {
611
+ if (statisticalResult.over > noVigResult.over + threshold) {
612
+ recommendation = 'Statistical model suggests higher Over probability - consider Over bet';
613
+ } else if (statisticalResult.under > noVigResult.under + threshold) {
614
+ recommendation = 'Statistical model suggests higher Under probability - consider Under bet';
615
+ } else if (noVigResult.over > statisticalResult.over + threshold) {
616
+ recommendation = 'Market suggests higher Over probability than model - caution on Over bet';
617
+ } else if (noVigResult.under > statisticalResult.under + threshold) {
618
+ recommendation = 'Market suggests higher Under probability than model - caution on Under bet';
619
+ }
620
+ } else {
621
+ recommendation = 'Methods generally agree - no strong edge identified';
622
+ }
623
+
624
+ document.getElementById('recommendation').textContent = recommendation;
625
+
626
+ } else if (noVigResult) {
627
+ // Only no-vig result available
628
+ document.getElementById('compareMethod1').textContent = noVigResult.method;
629
+ document.getElementById('compareOver1').textContent = noVigResult.over.toFixed(2) + '%';
630
+ document.getElementById('compareUnder1').textContent = noVigResult.under.toFixed(2) + '%';
631
+
632
+ document.getElementById('compareMethod2').textContent = 'No saved statistical results';
633
+ document.getElementById('compareOver2').textContent = '--%';
634
+ document.getElementById('compareUnder2').textContent = '--%';
635
+
636
+ document.getElementById('overDiff').textContent = '--%';
637
+ document.getElementById('underDiff').textContent = '--%';
638
+ document.getElementById('recommendation').textContent = 'Save statistical results to compare';
639
+
640
+ } else if (statisticalResult) {
641
+ // Only statistical result available
642
+ document.getElementById('compareMethod1').textContent = statisticalResult.method;
643
+ document.getElementById('compareOver1').textContent = statisticalResult.over.toFixed(2) + '%';
644
+ document.getElementById('compareUnder1').textContent = statisticalResult.under.toFixed(2) + '%';
645
+
646
+ document.getElementById('compareMethod2').textContent = 'No saved no-vig results';
647
+ document.getElementById('compareOver2').textContent = '--%';
648
+ document.getElementById('compareUnder2').textContent = '--%';
649
+
650
+ document.getElementById('overDiff').textContent = '--%';
651
+ document.getElementById('underDiff').textContent = '--%';
652
+ document.getElementById('recommendation').textContent = 'Save no-vig results to compare';
653
+ }
654
+ }
655
+ });
656
+ </script>
657
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=LMLK/advanced-player-prop-calculator" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
658
+ </html>