SSamson commited on
Commit
cdf5e89
·
verified ·
1 Parent(s): 759f2cc

Delete app.py

Browse files

"""
This Program is intended to provide a glimpse into daily NBA player projections from the app Prize-Picks and conduct a
statistical analysis into each line to identify potential value spots and different angles and trends from which to
justify the selection.

Author: Khizr Ali [email protected]

Created: March 6th, 2022
"""
# Imports
import math # Using floor method to get odds for above line
import sys # used to exit the program
import time # Using sleep() between thread requests
from datetime import date, datetime

import pandas as pd # Using DataFrames to store and manipulate data
import requests # Using GET to load data from some API
import unidecode # Decode the player names to remove accents
from bs4 import BeautifulSoup # Needed in get_player_position_list()
from scipy.stats import poisson # using poisson odds as one metric
from nba_api.stats.static import players # a list of players
from nba_api.stats.endpoints import playergamelogs, leaguegamelog # methods from nba-api to get data
from selenium import webdriver # Needed in get_dvp_ranking()
from selenium.webdriver.support.ui import Select # Needed in get_dvp_ranking()
from selenium.webdriver.common.by import By # Needed in get_dvp_ranking()
from selenium.webdriver.chrome.options import Options # Needed in get_dvp_ranking()
from selenium.webdriver.chrome.service import Service # Needed in get_dvp_ranking()
from webdriver_manager.chrome import ChromeDriverManager # Needed in get_dvp_ranking()


# Modules
# Get the Prizepicks Projections (Starting Data)
# Method is GOOD
def get_prizepicks_projections():
""" Returns a DataFrame of the PrizePicks Projections

Parameters:
-----------

Returns
---------
df: <pandas.DataFrame>
A DataFrame of the player's projection data
"""
# URL of the Prize Picks Projections page
url = 'https://partner-api.prizepicks.com/projections?single_stat=True&league_id=7&per_page=1000'
resp = requests.get(url).json()
if len(resp['data']) != 0:
# Normalizes the JSON File into a Data Frame
data = pd.json_normalize(resp['data'], max_level=3)
included = pd.json_normalize(resp['included'], max_level=3)
inc_cop = included[included['type'] == 'new_player'].copy().dropna(axis=1)

# Joins on the 'id' to add the player name to the projections
data = pd.merge(data, inc_cop,
how='left',
left_on=['relationships.new_player.data.id', 'relationships.new_player.data.type'],
right_on=['id', 'type'],
suffixes=('', '_new_player'))

# Return the data with necessary columns
data = data.rename(
columns={'attributes.name': 'name', 'attributes.line_score': 'line_score',
'attributes.stat_type': 'stat_type', 'attributes.updated_at': 'updated_at',
'attributes.description': 'opponent', 'attributes.start_time': 'start_time',
'attributes.is_promo': 'is_promo', 'attributes.position': 'position', 'attributes.team': 'team',
'attributes.team_name': 'team_name', 'attributes.market': 'market'})
return data[['id', 'name', 'line_score', 'stat_type', 'updated_at',
'opponent', 'start_time', 'is_promo', 'position',
'team', 'team_name', 'market']]
else:
print('There Are Currently no NBA Lines Available.')
sys.exit()


# Get the DVP Rankings (Starting Data)
# Method is GOOD
def get_dvp_rankings():
""" Returns a pandas.DataFrame of the NBA DVP Rankings from the last 30 days

Parameters:
-----------

Returns
---------
dvp_list: <pandas.DataFrame>
A DataFrame of each team dvp and its position
"""
chrome_options = Options()
chrome_options.add_argument("--headless")
s = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s, options=chrome_options)
driver.get('https://hashtagbasketball.com/nba-defense-vs-position')
select = Select(driver.find_element(By.NAME, 'ctl00$ContentPlaceHolder1$DDDURATION'))
select.select_by_value("30")
time.sleep(.500)
table = driver.find_element(By.ID, 'ContentPlaceHolder1_GridView1').get_attribute('outerHTML')
dvp_table = pd.read_html(table)[0]
dvp_table = dvp_table.rename(
columns={'Sort: Team': 'Team', 'Sort: Position': 'Position', 'Sort: PTS': 'PTS', 'Sort: FG%': 'FG%',
'Sort: FT%': 'FT%', 'Sort: 3PM': '3PM', 'Sort: REB': 'REB', 'Sort: AST': 'AST', 'Sort: STL': 'STL',
'Sort: BLK': 'BLK', 'Sort: TO': 'TO'})

dvp_table['Team'] = dvp_table['Team'].str[:3]
dvp_table['PTS'] = dvp_table['PTS'].str[:4]
dvp_table['FG%'] = dvp_table['FG%'].str[:4]
dvp_table['FT%'] = dvp_table['FT%'].str[:4]
dvp_table['3PM'] = dvp_table['3PM'].str[:3]
dvp_table['REB'] = dvp_table['REB'].str[:-3]
dvp_table['AST'] = dvp_table['AST'].str[:-3]
dvp_table['STL'] = dvp_table['STL'].str[:3]
dvp_table['BLK'] = dvp_table['BLK'].str[:3]
dvp_table['TO'] = dvp_table['TO'].str[:3]

dvp_table['PTS'] = pd.to_numeric(dvp_table['PTS'])
dvp_table['FG%'] = pd.to_numeric(dvp_table['FG%'])
dvp_table['FT%'] = pd.to_numeric(dvp_table['FT%'])
dvp_table['3PM'] = pd.to_numeric(dvp_table['3PM'])
dvp_table['REB'] = pd.to_numeric(dvp_table['REB'])
dvp_table['AST'] = pd.to_numeric(dvp_table['AST'])
dvp_table['STL'] = pd.to_numeric(dvp_table['STL'])
dvp_table['BLK'] = pd.to_numeric(dvp_table['BLK'])
dvp_table['TO'] = pd.to_numeric(dvp_table['TO'])

driver.close()
return dvp_table


# Get a list of players and their position (Starting Data)
# Take a look at .replace() method issuing a warning
def get_player_position_list():
""" Returns a pandas.DataFrame of the NBA DVP Rankings from the last 30 days

Parameters:
-----------

Returns
---------
player_info_list: <list>
A list of players information including their position
"""
url = 'https://www.basketball-reference.com/leagues/NBA_2022_per_game.html'
r = requests.get(url)
r_html = r.text
soup = BeautifulSoup(r_html, 'html.parser')

table = soup.find_all(class_="full_table")

""" Extracting List of column names"""
head = soup.find(class_="thead")
column_names_raw = [head.text for _ in head][0]
column_names_polished = column_names_raw.replace("\n", ",").split(",")[2:-1]

"""Extracting full list of player_data"""
players_list = []

for i in range(len(table)):

player_ = []

for td in table[i].find_all("td"):
player_.append(unidecode.unidecode(td.text))

players_list.append(player_)

player_info_list = pd.DataFrame(players_list, columns=column_names_polished).set_index("Player")
# cleaning the player's name from occasional special characters
# player_info_list.index = player_info_list.index.str.encode('utf-8')
player_info_list.index = player_info_list.index.str.replace('*', '', regex=True)
return player_info_list


# Get a log of the last 10 games of all players listed in projections (Starting Data) (PrizePicks Projections Required)
# Look into changing the data to be streamlined and per player instead of all together
def get_game_logs(list_of_player_names):
""" Returns Two Lists. 1. List of Player Names 2. list of pandas.DataFrame containing logs of the last 10 games

Parameters:
-----------
list_of_projections: <pandas.DataFrame>
A DataFrame containing the Prize Picks Projections

Returns
---------
player_names: <List>
A List of the player's names
game_logs: <List>
A List of type pandas.DataFrame where each index contains the logs of the last 10 games played
"""
player_names = []
no_logs = []
game_logs = []
print('GETTING GAME LOGS')
for name in list_of_player_names:
if name not in player_names:
player = players.find_players_by_full_name(name)[0]
if player['is_active']:
player_id = str(player['id'])
player_logs = playergamelogs.PlayerGameLogs(date_from_nullable='10/31/2021',
player_id_nullable=player_id,
season_nullable='2021-22',
last_n_games_nullable=10).get_data_frames()[0]
player_names.append(name)
player_logs['ID'] = player_id
game_logs.append(player_logs)
time.sleep(.700)
print(name, ' added to logs')
else:
no_logs.append(name)
game_logs = pd.concat(game_logs, axis=0)
print('FINISHED ALL ELIGIBLE GAME LOGS', no_logs)
return game_logs, no_logs


def get_player_position(position_list, name):
""" Returns Two Lists. 1. List of Player Names 2. list of pandas.DataFrame containing logs of the last 10 games

Parameters:
-----------
list_of_projections: <pandas.DataFrame>
A DataFrame containing the Prize Picks Projections

Returns
---------
player_names: <List>
A List of the player's names
game_logs: <List>
A List of type pandas.DataFrame where each index contains the logs of the last 10 games played
"""
if name == 'Robert Williams III':
name = 'Robert Williams'

return position_list[position_list.index == name]['Pos'][0]


# Get the Poisson Odds of the player going OVER their projected total given previous 10 performances
# Method is GOOD
def get_poisson_odds(game_log, prop_type, line_score):
""" Returns a Value of the PrizePicks Projection Poisson odds to go over the suggested line_score

Parameters:
-----------
game_log: <pandas.DataFrame>
A DataFrame containing the players l10 Game Logs
prop_type: <String>
A string containing the type of prop it is eg. Points, Rebounds, Assists, etc.
line_score: <float>
A float valu

Files changed (1) hide show
  1. app.py +0 -565
app.py DELETED
@@ -1,565 +0,0 @@
1
- import pandas
2
- import csv
3
- import os
4
-
5
- def prizepicks_6_legs_flex(wager, odds):
6
- #calculate EV
7
- value_win_6 = wager * 24
8
- odds_win_6 = 1
9
- for i in range(len(odds)):
10
- odds_win_6 *= odds[i]
11
- value_win_6 *= odds_win_6
12
-
13
- value_win_5 = wager
14
- odds_win_5 = 0
15
- for i in range(len(odds)):
16
- temp = 1 - odds[i]
17
- for n in range(len(odds)):
18
- if n == i:
19
- continue
20
- temp *= odds[n]
21
- odds_win_5 += temp
22
- value_win_5 *= odds_win_5
23
-
24
- value_win_4 = 0.6 * wager * -1
25
- odds_win_4 = 0
26
- for i in range(len(odds)):
27
- temp_1 = 1 - odds[i]
28
- for n in range(len(odds)):
29
- if n <= i:
30
- continue
31
- temp_2 = (1 - odds[n]) * temp_1
32
- for j in range(len(odds)):
33
- if j == i or j == n:
34
- continue
35
- temp_2 *= odds[j]
36
- odds_win_4 += temp_2
37
- value_win_4 *= odds_win_4
38
-
39
- value_win_3 = wager * -1
40
- odds_win_3 = 0
41
- for i in range(len(odds)):
42
- temp_1 = 1 - odds[i]
43
- for n in range(len(odds)):
44
- if n <= i:
45
- continue
46
- temp_2 = (1 - odds[n]) * temp_1
47
- for j in range(len(odds)):
48
- if j <= n:
49
- continue
50
- temp_3 = (1 - odds[j]) * temp_2
51
- for k in range(len(odds)):
52
- if k == i or k == n or k == j:
53
- continue
54
- temp_3 *= odds[k]
55
- odds_win_3 += temp_3
56
- value_win_3 *= odds_win_3
57
-
58
- odds_inverse = []
59
- for i in range(len(odds)):
60
- odds_inverse.append(1 - odds[i])
61
-
62
- value_win_2 = wager * -1
63
- odds_win_2 = 0
64
- for i in range(len(odds_inverse)):
65
- temp_1 = 1 - odds_inverse[i]
66
- for n in range(len(odds_inverse)):
67
- if n <= i:
68
- continue
69
- temp_2 = (1 - odds_inverse[n]) * temp_1
70
- for j in range(len(odds_inverse)):
71
- if j == i or j == n:
72
- continue
73
- temp_2 *= odds_inverse[j]
74
- odds_win_2 += temp_2
75
- value_win_2 *= odds_win_2
76
-
77
- value_win_1 = wager * -1
78
- odds_win_1 = 0
79
- for i in range(len(odds_inverse)):
80
- temp = 1 - odds_inverse[i]
81
- for n in range(len(odds_inverse)):
82
- if n == i:
83
- continue
84
- temp *= odds_inverse[n]
85
- odds_win_1 += temp
86
- value_win_1 *= odds_win_1
87
-
88
- value_win_0 = wager * -1
89
- odds_win_0 = 1
90
- for i in range(len(odds_inverse)):
91
- odds_win_0 *= odds_inverse[i]
92
- value_win_0 *= odds_win_0
93
-
94
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3 + value_win_4 + value_win_5 + value_win_6
95
- print("$" + str(wager) + " 6-legs flex play with implied odds: " + str(odds))
96
- print("Chance to win 6/6 (PnL $" + str(wager * 24) + "): " + str(odds_win_6))
97
- print("Chance to win 5/6 (PnL $" + str(wager) + "): " + str(odds_win_5))
98
- print("Chance to win 4/6 (PnL $" + str(wager * -0.6) + "): " + str(odds_win_4))
99
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_3 + odds_win_2 + odds_win_1 + odds_win_0))
100
- print("Expected PnL: $" + str(ev))
101
- print()
102
- return ev, "6-legs flex"
103
-
104
- def prizepicks_5_legs_flex(wager, odds):
105
- #calculate EV
106
- value_win_5 = wager * 9
107
- odds_win_5 = 1
108
- for i in range(len(odds)):
109
- odds_win_5 *= odds[i]
110
- value_win_5 *= odds_win_5
111
-
112
- value_win_4 = wager
113
- odds_win_4 = 0
114
- for i in range(len(odds)):
115
- temp = 1 - odds[i]
116
- for n in range(len(odds)):
117
- if n == i:
118
- continue
119
- temp *= odds[n]
120
- odds_win_4 += temp
121
- value_win_4 *= odds_win_4
122
-
123
- value_win_3 = 0.6 * wager * -1
124
- odds_win_3 = 0
125
- for i in range(len(odds)):
126
- temp_1 = 1 - odds[i]
127
- for n in range(len(odds)):
128
- if n <= i:
129
- continue
130
- temp_2 = (1 - odds[n]) * temp_1
131
- for j in range(len(odds)):
132
- if j == i or j == n:
133
- continue
134
- temp_2 *= odds[j]
135
- odds_win_3 += temp_2
136
- value_win_3 *= odds_win_3
137
-
138
- odds_inverse = []
139
- for i in range(len(odds)):
140
- odds_inverse.append(1 - odds[i])
141
-
142
- value_win_2 = wager * -1
143
- odds_win_2 = 0
144
- for i in range(len(odds_inverse)):
145
- temp_1 = 1 - odds_inverse[i]
146
- for n in range(len(odds_inverse)):
147
- if n <= i:
148
- continue
149
- temp_2 = (1 - odds_inverse[n]) * temp_1
150
- for j in range(len(odds_inverse)):
151
- if j == i or j == n:
152
- continue
153
- temp_2 *= odds_inverse[j]
154
- odds_win_2 += temp_2
155
- value_win_2 *= odds_win_2
156
-
157
- value_win_1 = wager * -1
158
- odds_win_1 = 0
159
- for i in range(len(odds_inverse)):
160
- temp = 1 - odds_inverse[i]
161
- for n in range(len(odds_inverse)):
162
- if n == i:
163
- continue
164
- temp *= odds_inverse[n]
165
- odds_win_1 += temp
166
- value_win_1 *= odds_win_1
167
-
168
- value_win_0 = wager * -1
169
- odds_win_0 = 1
170
- for i in range(len(odds_inverse)):
171
- odds_win_0 *= odds_inverse[i]
172
- value_win_0 *= odds_win_0
173
-
174
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3 + value_win_4 + value_win_5
175
- print("$" + str(wager) + " 5-legs flex play with implied odds: " + str(odds))
176
- print("Chance to win 5/5 (PnL $" + str(wager * 9) + "): " + str(odds_win_5))
177
- print("Chance to win 4/5 (PnL $" + str(wager) + "): " + str(odds_win_4))
178
- print("Chance to win 3/5 (PnL $" + str(wager * -0.6) + "): " + str(odds_win_3))
179
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_2 + odds_win_1 + odds_win_0))
180
- print("Expected PnL: $" + str(ev))
181
- print()
182
- return ev, "5-legs flex"
183
-
184
- def prizepicks_4_legs_flex(wager, odds):
185
- #calculate EV
186
- value_win_4 = wager * 4
187
- odds_win_4 = 1
188
- for i in range(len(odds)):
189
- odds_win_4 *= odds[i]
190
- value_win_4 *= odds_win_4
191
-
192
- value_win_3 = wager * 0.5
193
- odds_win_3 = 0
194
- for i in range(len(odds)):
195
- temp = 1 - odds[i]
196
- for n in range(len(odds)):
197
- if n == i:
198
- continue
199
- temp *= odds[n]
200
- odds_win_3 += temp
201
- value_win_3 *= odds_win_3
202
-
203
- value_win_2 = wager * -1
204
- odds_win_2 = 0
205
- for i in range(len(odds)):
206
- temp_1 = 1 - odds[i]
207
- for n in range(len(odds)):
208
- if n <= i:
209
- continue
210
- temp_2 = (1 - odds[n]) * temp_1
211
- for j in range(len(odds)):
212
- if j == i or j == n:
213
- continue
214
- temp_2 *= odds[j]
215
- odds_win_2 += temp_2
216
- value_win_2 *= odds_win_2
217
-
218
- odds_inverse = []
219
- for i in range(len(odds)):
220
- odds_inverse.append(1 - odds[i])
221
-
222
- value_win_1 = wager * -1
223
- odds_win_1 = 0
224
- for i in range(len(odds_inverse)):
225
- temp = 1 - odds_inverse[i]
226
- for n in range(len(odds_inverse)):
227
- if n == i:
228
- continue
229
- temp *= odds_inverse[n]
230
- odds_win_1 += temp
231
- value_win_1 *= odds_win_1
232
-
233
- value_win_0 = wager * -1
234
- odds_win_0 = 1
235
- for i in range(len(odds_inverse)):
236
- odds_win_0 *= odds_inverse[i]
237
- value_win_0 *= odds_win_0
238
-
239
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3 + value_win_4
240
- print("$" + str(wager) + " 4-legs flex play with implied odds: " + str(odds))
241
- print("Chance to win 4/4 (PnL $" + str(wager * 4) + "): " + str(odds_win_4))
242
- print("Chance to win 3/4 (PnL $" + str(wager * 0.5) + "): " + str(odds_win_3))
243
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_2 + odds_win_1 + odds_win_0))
244
- print("Expected PnL: $" + str(ev))
245
- print()
246
- return ev, "4-legs flex"
247
-
248
- def prizepicks_4_legs_power(wager, odds):
249
- #calculate EV
250
- value_win_4 = wager * 9
251
- odds_win_4 = 1
252
- for i in range(len(odds)):
253
- odds_win_4 *= odds[i]
254
- value_win_4 *= odds_win_4
255
-
256
- value_win_3 = wager * -1
257
- odds_win_3 = 0
258
- for i in range(len(odds)):
259
- temp = 1 - odds[i]
260
- for n in range(len(odds)):
261
- if n == i:
262
- continue
263
- temp *= odds[n]
264
- odds_win_3 += temp
265
- value_win_3 *= odds_win_3
266
-
267
- value_win_2 = wager * -1
268
- odds_win_2 = 0
269
- for i in range(len(odds)):
270
- temp_1 = 1 - odds[i]
271
- for n in range(len(odds)):
272
- if n <= i:
273
- continue
274
- temp_2 = (1 - odds[n]) * temp_1
275
- for j in range(len(odds)):
276
- if j == i or j == n:
277
- continue
278
- temp_2 *= odds[j]
279
- odds_win_2 += temp_2
280
- value_win_2 *= odds_win_2
281
-
282
- odds_inverse = []
283
- for i in range(len(odds)):
284
- odds_inverse.append(1 - odds[i])
285
-
286
- value_win_1 = wager * -1
287
- odds_win_1 = 0
288
- for i in range(len(odds_inverse)):
289
- temp = 1 - odds_inverse[i]
290
- for n in range(len(odds_inverse)):
291
- if n == i:
292
- continue
293
- temp *= odds_inverse[n]
294
- odds_win_1 += temp
295
- value_win_1 *= odds_win_1
296
-
297
- value_win_0 = wager * -1
298
- odds_win_0 = 1
299
- for i in range(len(odds_inverse)):
300
- odds_win_0 *= odds_inverse[i]
301
- value_win_0 *= odds_win_0
302
-
303
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3 + value_win_4
304
- print("$" + str(wager) + " 4-legs power play with implied odds: " + str(odds))
305
- print("Chance to win 4/4 (PnL $" + str(wager * 9) + "): " + str(odds_win_4))
306
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_3 + odds_win_2 + odds_win_1 + odds_win_0))
307
- print("Expected PnL: $" + str(ev))
308
- print()
309
- return ev, "4-legs power"
310
-
311
- def prizepicks_3_legs_flex(wager, odds):
312
- #calculate EV
313
- value_win_3 = wager * 1.25
314
- odds_win_3 = 1
315
- for i in range(len(odds)):
316
- odds_win_3 *= odds[i]
317
- value_win_3 *= odds_win_3
318
-
319
- value_win_2 = wager * 0.25
320
- odds_win_2 = 0
321
- for i in range(len(odds)):
322
- temp = 1 - odds[i]
323
- for n in range(len(odds)):
324
- if n == i:
325
- continue
326
- temp *= odds[n]
327
- odds_win_2 += temp
328
- value_win_2 *= odds_win_2
329
-
330
- odds_inverse = []
331
- for i in range(len(odds)):
332
- odds_inverse.append(1 - odds[i])
333
-
334
- value_win_1 = wager * -1
335
- odds_win_1 = 0
336
- for i in range(len(odds_inverse)):
337
- temp = 1 - odds_inverse[i]
338
- for n in range(len(odds_inverse)):
339
- if n == i:
340
- continue
341
- temp *= odds_inverse[n]
342
- odds_win_1 += temp
343
- value_win_1 *= odds_win_1
344
-
345
- value_win_0 = wager * -1
346
- odds_win_0 = 1
347
- for i in range(len(odds_inverse)):
348
- odds_win_0 *= odds_inverse[i]
349
- value_win_0 *= odds_win_0
350
-
351
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3
352
- print("$" + str(wager) + " 3-legs flex play with implied odds: " + str(odds))
353
- print("Chance to win 3/3 (PnL $" + str(wager * 1.25) + "): " + str(odds_win_3))
354
- print("Chance to win 2/3 (PnL $" + str(wager * 0.25) + "): " + str(odds_win_2))
355
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_1 + odds_win_0))
356
- print("Expected PnL: $" + str(ev))
357
- print()
358
- return ev, "3-legs flex"
359
-
360
- def prizepicks_3_legs_power(wager, odds):
361
- #calculate EV
362
- value_win_3 = wager * 4
363
- odds_win_3 = 1
364
- for i in range(len(odds)):
365
- odds_win_3 *= odds[i]
366
- value_win_3 *= odds_win_3
367
-
368
- value_win_2 = wager * -1
369
- odds_win_2 = 0
370
- for i in range(len(odds)):
371
- temp = 1 - odds[i]
372
- for n in range(len(odds)):
373
- if n == i:
374
- continue
375
- temp *= odds[n]
376
- odds_win_2 += temp
377
- value_win_2 *= odds_win_2
378
-
379
- odds_inverse = []
380
- for i in range(len(odds)):
381
- odds_inverse.append(1 - odds[i])
382
-
383
- value_win_1 = wager * -1
384
- odds_win_1 = 0
385
- for i in range(len(odds_inverse)):
386
- temp = 1 - odds_inverse[i]
387
- for n in range(len(odds_inverse)):
388
- if n == i:
389
- continue
390
- temp *= odds_inverse[n]
391
- odds_win_1 += temp
392
- value_win_1 *= odds_win_1
393
-
394
- value_win_0 = wager * -1
395
- odds_win_0 = 1
396
- for i in range(len(odds_inverse)):
397
- odds_win_0 *= odds_inverse[i]
398
- value_win_0 *= odds_win_0
399
-
400
- ev = value_win_0 + value_win_1 + value_win_2 + value_win_3
401
- print("$" + str(wager) + " 3-legs power play with implied odds: " + str(odds))
402
- print("Chance to win 3/3 (PnL $" + str(wager * 4) + "): " + str(odds_win_3))
403
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_2 + odds_win_1 + odds_win_0))
404
- print("Expected PnL: $" + str(ev))
405
- print()
406
- return ev, "3-legs power"
407
-
408
- def prizepicks_2_legs_power(wager, odds):
409
- #calculate EV
410
- value_win_2 = wager * 2
411
- odds_win_2 = 1
412
- for i in range(len(odds)):
413
- odds_win_2 *= odds[i]
414
- value_win_2 *= odds_win_2
415
-
416
- value_win_1 = wager * -1
417
- odds_win_1 = 0
418
- for i in range(len(odds)):
419
- temp = 1 - odds[i]
420
- for n in range(len(odds)):
421
- if n == i:
422
- continue
423
- temp *= odds[n]
424
- odds_win_1 += temp
425
- value_win_1 *= odds_win_1
426
-
427
- odds_inverse = []
428
- for i in range(len(odds)):
429
- odds_inverse.append(1 - odds[i])
430
-
431
- value_win_0 = wager * -1
432
- odds_win_0 = 1
433
- for i in range(len(odds_inverse)):
434
- odds_win_0 *= odds_inverse[i]
435
- value_win_0 *= odds_win_0
436
-
437
- ev = value_win_0 + value_win_1 + value_win_2
438
- print("$" + str(wager) + " 2-legs power play with implied odds: " + str(odds))
439
- print("Chance to win 2/2 (PnL $" + str(wager * 2) + "): " + str(odds_win_2))
440
- print("Chance to lose (PnL $" + str(wager * -1) + "): " + str(odds_win_1 + odds_win_0))
441
- print("Expected PnL: $" + str(ev))
442
- print()
443
- return ev, "2-legs power"
444
-
445
- def sort_plays(plays):
446
- plays.sort(key = lambda x: x[0], reverse=True)
447
- return plays
448
-
449
- def main():
450
- input_fname = "All-Sports_PrizePicks Optimizer.csv"
451
- output_fname = "dgf.csv"
452
-
453
- with open(input_fname, newline='') as inFile, open(output_fname, 'w', newline='') as outFile:
454
- r = csv.reader(inFile)
455
- w = csv.writer(outFile)
456
-
457
- next(r, None)
458
- w.writerow(['First Name', 'Last Name', 'Sport', 'Team', 'Over/Under', 'Prop', 'PrizePicks Line',
459
- 'Sportsbook Line', 'DGF', 'Pinnacle', 'Fanduel', 'DraftKings', 'Barstool', 'MGM', 'Caesars',
460
- 'BetOnline', 'Bovada', 'Bet365', 'FoxBet', 'Odds to hit'])
461
-
462
- for row in r:
463
- w.writerow(row)
464
-
465
- data = pandas.read_csv('dgf.csv')
466
- top_lines = data.iloc [[0,1,2,3,4,5]]
467
- print(top_lines)
468
- odds = top_lines['Odds to hit'].tolist()
469
-
470
- plays_6 = top_lines.iloc [[0,1,2,3,4,5], [0,1,4,5,6]]
471
- plays_5 = top_lines.iloc [[0,1,2,3,4], [0,1,4,5,6]]
472
- plays_4 = top_lines.iloc [[0,1,2,3], [0,1,4,5,6]]
473
- plays_3 = top_lines.iloc [[0,1,2], [0,1,4,5,6]]
474
- plays_2 = top_lines.iloc [[0,1], [0,1,4,5,6]]
475
-
476
- for i in range(len(odds)):
477
- odds[i] = odds[i]/100
478
-
479
- wager = 100
480
- plays = []
481
- pp_6_legs_flex = prizepicks_6_legs_flex(wager, odds)
482
- pp_6_legs_flex_ev = pp_6_legs_flex[0]
483
- plays.append(pp_6_legs_flex)
484
-
485
- pp_5_legs_flex = prizepicks_5_legs_flex(wager, odds[:5])
486
- pp_5_legs_flex_ev = pp_5_legs_flex[0]
487
- plays.append(pp_5_legs_flex)
488
-
489
- pp_4_legs_flex = prizepicks_4_legs_flex(wager, odds[:4])
490
- pp_4_legs_flex_ev = pp_4_legs_flex[0]
491
- plays.append(pp_4_legs_flex)
492
-
493
- pp_4_legs_power = prizepicks_4_legs_power(wager, odds[:4])
494
- pp_4_legs_power_ev = pp_4_legs_power[0]
495
- plays.append(pp_4_legs_power)
496
-
497
- pp_3_legs_flex = prizepicks_3_legs_flex(wager, odds[:3])
498
- pp_3_legs_flex_ev = pp_3_legs_flex[0]
499
- plays.append(pp_3_legs_flex)
500
-
501
- pp_3_legs_power = prizepicks_3_legs_power(wager, odds[:3])
502
- pp_3_legs_power_ev = pp_3_legs_power[0]
503
- plays.append(pp_3_legs_power)
504
-
505
- pp_2_legs_power = prizepicks_2_legs_power(wager, odds[:2])
506
- pp_2_legs_power_ev = pp_2_legs_power[0]
507
- plays.append(pp_2_legs_power)
508
-
509
- outputs = []
510
-
511
- output_6_flex = ""
512
- output_6_flex += "$" + str(wager) + " 6-legs flex play expected PnL: $" + str(float("{:.2f}".format(pp_6_legs_flex_ev))) + "\n"
513
- output_6_flex += str(plays_6)
514
- output_6_flex += "\n"
515
- tup_6_flex = (pp_6_legs_flex_ev, output_6_flex)
516
- outputs.append(tup_6_flex)
517
-
518
- output_5_flex = ""
519
- output_5_flex += "$" + str(wager) + " 5-legs flex play expected PnL: $" + str(float("{:.2f}".format(pp_5_legs_flex_ev))) + "\n"
520
- output_5_flex += str(plays_5)
521
- output_5_flex += "\n"
522
- tup_5_flex = (pp_5_legs_flex_ev, output_5_flex)
523
- outputs.append(tup_5_flex)
524
-
525
- output_4_flex = ""
526
- output_4_flex += "$" + str(wager) + " 4-legs flex play expected PnL: $" + str(float("{:.2f}".format(pp_4_legs_flex_ev))) + "\n"
527
- output_4_flex += str(plays_4)
528
- output_4_flex += "\n"
529
- tup_4_flex = (pp_4_legs_flex_ev, output_4_flex)
530
- outputs.append(tup_4_flex)
531
-
532
- output_4_power = ""
533
- output_4_power += "$" + str(wager) + " 4-legs power play expected PnL: $" + str(float("{:.2f}".format(pp_4_legs_power_ev))) + "\n"
534
- output_4_power += str(plays_4)
535
- output_4_power += "\n"
536
- tup_4_power = (pp_4_legs_power_ev, output_4_power)
537
- outputs.append(tup_4_power)
538
-
539
- output_3_flex = ""
540
- output_3_flex += "$" + str(wager) + " 3-legs flex play expected PnL: $" + str(float("{:.2f}".format(pp_3_legs_flex_ev))) + "\n"
541
- output_3_flex += str(plays_3)
542
- output_3_flex += "\n"
543
- tup_3_flex = (pp_3_legs_flex_ev, output_3_flex)
544
- outputs.append(tup_3_flex)
545
-
546
- output_3_power = ""
547
- output_3_power += "$" + str(wager) + " 3-legs power play expected PnL: $" + str(float("{:.2f}".format(pp_3_legs_power_ev))) + "\n"
548
- output_3_power += str(plays_3)
549
- output_3_power += "\n"
550
- tup_3_power = (pp_3_legs_power_ev, output_3_power)
551
- outputs.append(tup_3_power)
552
-
553
- output_2_power = ""
554
- output_2_power += "$" + str(wager) + " 2-legs power play expected PnL: $" + str(float("{:.2f}".format(pp_2_legs_power_ev))) + "\n"
555
- output_2_power += str(plays_2)
556
- output_2_power += "\n"
557
- tup_2_power = (pp_2_legs_power_ev, output_2_power)
558
- outputs.append(tup_2_power)
559
-
560
- sort_plays(outputs)
561
- for i in range(len(outputs)):
562
- print(outputs[i][1])
563
-
564
- if __name__ == "__main__":
565
- main()