Moving older scripts into holding cell
This commit is contained in:
parent
f0f77ffb16
commit
639e032586
1
.gitignore
vendored
1
.gitignore
vendored
@ -132,3 +132,4 @@ dmypy.json
|
|||||||
*.db
|
*.db
|
||||||
.idea
|
.idea
|
||||||
theshow/
|
theshow/
|
||||||
|
.vscode/
|
||||||
@ -2,7 +2,7 @@ import csv
|
|||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
from decimal import Decimal
|
from decimal import ROUND_HALF_EVEN, Decimal
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pybaseball as pb
|
import pybaseball as pb
|
||||||
@ -860,10 +860,38 @@ def defense_rg(all_pos: list) -> list:
|
|||||||
|
|
||||||
|
|
||||||
def sanitize_chance_output(total_chances, min_chances=1.0, rounding=0.05):
|
def sanitize_chance_output(total_chances, min_chances=1.0, rounding=0.05):
|
||||||
|
if total_chances < min_chances:
|
||||||
|
logging.debug(f'sanitize: {total_chances} is less than min_chances ({min_chances}); returning 0')
|
||||||
|
return 0
|
||||||
|
|
||||||
|
rounded_decimal = round(Decimal(str(total_chances)) / Decimal(str(rounding))) * Decimal(str(rounding))
|
||||||
|
|
||||||
|
exact_chances = [
|
||||||
|
Decimal('1.05'), Decimal('1.1'), Decimal('1.2'), Decimal('1.25'), Decimal('1.3'), Decimal('1.35'),
|
||||||
|
Decimal('1.4'), Decimal('1.5'), Decimal('1.6'), Decimal('1.65'), Decimal('1.7'), Decimal('1.75'),
|
||||||
|
Decimal('1.8'), Decimal('1.9'), Decimal('1.95'), Decimal('2.1'), Decimal('2.2'), Decimal('2.25'),
|
||||||
|
Decimal('2.4'), Decimal('2.5'), Decimal('2.55'), Decimal('2.6'), Decimal('2.7'), Decimal('2.75'),
|
||||||
|
Decimal('2.8'), Decimal('2.85'), Decimal('3.2'), Decimal('3.25'), Decimal('3.3'), Decimal('3.4'),
|
||||||
|
Decimal('3.5'), Decimal('3.6'), Decimal('3.75'), Decimal('3.8'), Decimal('3.9'), Decimal('4.2'),
|
||||||
|
Decimal('4.25'), Decimal('4.5'), Decimal('4.75'), Decimal('4.8'), Decimal('5.1'), Decimal('5.4'),
|
||||||
|
Decimal('5.7')
|
||||||
|
]
|
||||||
|
|
||||||
|
if rounded_decimal > exact_chances[-1]:
|
||||||
|
return float(rounded_decimal)
|
||||||
|
|
||||||
|
for x in exact_chances:
|
||||||
|
if rounded_decimal <= x:
|
||||||
|
return float(x)
|
||||||
|
|
||||||
|
raise ArithmeticError(f'Attempt to sanitize {total_chances} rounded to {rounded_decimal} and could not be matched to an exact result')
|
||||||
|
|
||||||
|
|
||||||
|
def legacy_sanitize_chance_output(total_chances: float, min_chances: float = 1.0, rounding: float = 0.05):
|
||||||
# r_val = mround(total_chances) if total_chances >= min_chances else 0
|
# r_val = mround(total_chances) if total_chances >= min_chances else 0
|
||||||
r_val = Decimal(total_chances) if total_chances >= min_chances else Decimal(0)
|
r_val = Decimal(total_chances) if total_chances >= min_chances else Decimal(0)
|
||||||
logging.debug(f'r_val: {r_val}')
|
logging.debug(f'r_val: {r_val}')
|
||||||
rounded_val = Decimal(float(math.floor(r_val / Decimal(rounding)) * Decimal(rounding))).quantize(Decimal("0.05"))
|
rounded_val = Decimal(float(math.floor(r_val / Decimal(rounding)) * Decimal(rounding))).quantize(Decimal("0.05"), ROUND_HALF_EVEN)
|
||||||
if math.floor(rounded_val) == rounded_val:
|
if math.floor(rounded_val) == rounded_val:
|
||||||
return rounded_val
|
return rounded_val
|
||||||
|
|
||||||
@ -885,6 +913,7 @@ def sanitize_chance_output(total_chances, min_chances=1.0, rounding=0.05):
|
|||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def mlbteam_and_franchise(mlbam_playerid):
|
def mlbteam_and_franchise(mlbam_playerid):
|
||||||
api_url = f'https://statsapi.mlb.com/api/v1/people/{mlbam_playerid}?hydrate=currentTeam'
|
api_url = f'https://statsapi.mlb.com/api/v1/people/{mlbam_playerid}?hydrate=currentTeam'
|
||||||
logging.info(f'Calling {api_url}')
|
logging.info(f'Calling {api_url}')
|
||||||
|
|||||||
1052
data-input/1997 Season Cardset/batters-advanced.csv
Normal file
1052
data-input/1997 Season Cardset/batters-advanced.csv
Normal file
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@ from typing import Literal, Optional
|
|||||||
AUTH_TOKEN = {'Authorization': f'Bearer Tp3aO3jhYve5NJF1IqOmJTmk'}
|
AUTH_TOKEN = {'Authorization': f'Bearer Tp3aO3jhYve5NJF1IqOmJTmk'}
|
||||||
DB_URL = 'https://pd.manticorum.com/api'
|
DB_URL = 'https://pd.manticorum.com/api'
|
||||||
master_debug = True
|
master_debug = True
|
||||||
alt_database = False
|
alt_database = 'dev'
|
||||||
|
|
||||||
if alt_database == 'dev':
|
if alt_database == 'dev':
|
||||||
DB_URL = 'https://pddev.manticorum.com/api'
|
DB_URL = 'https://pddev.manticorum.com/api'
|
||||||
|
|||||||
97
pybaseball_doodling.py
Normal file
97
pybaseball_doodling.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import asyncio
|
||||||
|
import requests
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import pandas as pd
|
||||||
|
import pybaseball as pb
|
||||||
|
|
||||||
|
from app.creation_helpers import get_pitching_peripherals
|
||||||
|
|
||||||
|
|
||||||
|
def pull_stats(start_date_string: str, end_date_string: str):
|
||||||
|
print(f'Pulling stats from {start_date_string} to {end_date_string}')
|
||||||
|
data = pb.batting_stats_range(start_date_string, end_date_string)
|
||||||
|
print(f'Got it!')
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def batting_game_log_table(bbref_id: str, season: int = 1998):
|
||||||
|
page_url = f'https://www.baseball-reference.com/players/gl.fcgi?id={bbref_id}&t=b&year={season}'
|
||||||
|
soup = BeautifulSoup(requests.get(page_url).text, 'html.parser')
|
||||||
|
time.sleep(3)
|
||||||
|
table = soup.find('table', {'id': 'batting_gamelogs'})
|
||||||
|
tbody = table.find('tbody')
|
||||||
|
headers = []
|
||||||
|
data = []
|
||||||
|
indeces = []
|
||||||
|
|
||||||
|
for row in tbody.find_all('tr'):
|
||||||
|
row_data = []
|
||||||
|
col_names = []
|
||||||
|
for cell in row.find_all('td'):
|
||||||
|
row_data.append(cell.text)
|
||||||
|
if len(headers) == 0:
|
||||||
|
col_names.append(cell['data-stat'])
|
||||||
|
|
||||||
|
if len(row_data) > 0:
|
||||||
|
data.append(row_data)
|
||||||
|
indeces.append(row_data[0])
|
||||||
|
if len(headers) == 0:
|
||||||
|
headers.extend(col_names)
|
||||||
|
|
||||||
|
player_frame = pd.DataFrame(data, index=indeces, columns=headers)
|
||||||
|
return player_frame
|
||||||
|
|
||||||
|
|
||||||
|
def batting_splits_table(bbref_id: str, season: int = 1998):
|
||||||
|
page_url = f'https://www.baseball-reference.com/players/split.fcgi?id={bbref_id}&year={season}&t=b'
|
||||||
|
soup = BeautifulSoup(requests.get(page_url).text, 'lxml')
|
||||||
|
time.sleep(3)
|
||||||
|
table = soup.find('table', {'id': 'plato'})
|
||||||
|
tbody = table.find('tbody')
|
||||||
|
headers = []
|
||||||
|
data = []
|
||||||
|
indeces = []
|
||||||
|
|
||||||
|
for row in tbody.findAll('tr'):
|
||||||
|
row_data = []
|
||||||
|
col_names = []
|
||||||
|
for cell in row.find_all('td'):
|
||||||
|
row_data.append(cell.text)
|
||||||
|
if len(headers) == 0:
|
||||||
|
col_names.append(cell['data-stat'])
|
||||||
|
|
||||||
|
if len(row_data) > 0:
|
||||||
|
data.append(row_data)
|
||||||
|
indeces.append(row_data[0])
|
||||||
|
if len(headers) == 0:
|
||||||
|
headers.extend(col_names)
|
||||||
|
|
||||||
|
bsplit_frame = pd.DataFrame(data, index=indeces, columns=headers)
|
||||||
|
return bsplit_frame
|
||||||
|
|
||||||
|
|
||||||
|
async def main(args):
|
||||||
|
# print('Fetching peripherals')
|
||||||
|
# peripherals = get_pitching_peripherals(2021)
|
||||||
|
# print('Got them!')
|
||||||
|
# print(f'There are {len(peripherals)} records')
|
||||||
|
|
||||||
|
# month_1 = pull_stats('1997-03-01', '1997-04-30')
|
||||||
|
# print(f'Received {len(month_1)} records.')
|
||||||
|
|
||||||
|
# print(f'Grabbing game logs...')
|
||||||
|
# player_frame = batting_game_log_table('jeterde01')
|
||||||
|
# print(f'Received {len(player_frame)} records')
|
||||||
|
|
||||||
|
print(f'Grabbing game logs...')
|
||||||
|
player_frame = batting_splits_table('jeterde01')
|
||||||
|
print(f'Received {len(player_frame)} records')
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main(sys.argv[1:]))
|
||||||
4
pytest.ini
Normal file
4
pytest.ini
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[pytest]
|
||||||
|
asyncio_mode = auto
|
||||||
|
filterwarnings =
|
||||||
|
ignore::DeprecationWarning
|
||||||
51
requirements.txt
Normal file
51
requirements.txt
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
aiohappyeyeballs==2.4.3
|
||||||
|
aiohttp==3.10.10
|
||||||
|
aiosignal==1.3.1
|
||||||
|
annotated-types==0.7.0
|
||||||
|
attrs==24.2.0
|
||||||
|
beautifulsoup4==4.12.3
|
||||||
|
bs4==0.0.2
|
||||||
|
certifi==2024.8.30
|
||||||
|
cffi==1.17.1
|
||||||
|
charset-normalizer==3.4.0
|
||||||
|
contourpy==1.3.0
|
||||||
|
cryptography==43.0.1
|
||||||
|
cycler==0.12.1
|
||||||
|
Deprecated==1.2.14
|
||||||
|
fonttools==4.54.1
|
||||||
|
frozenlist==1.4.1
|
||||||
|
idna==3.10
|
||||||
|
iniconfig==2.0.0
|
||||||
|
kiwisolver==1.4.7
|
||||||
|
lxml==5.3.0
|
||||||
|
matplotlib==3.9.2
|
||||||
|
multidict==6.1.0
|
||||||
|
numpy==2.1.2
|
||||||
|
packaging==24.1
|
||||||
|
pandas==2.2.3
|
||||||
|
pillow==11.0.0
|
||||||
|
pluggy==1.5.0
|
||||||
|
propcache==0.2.0
|
||||||
|
pyarrow==17.0.0
|
||||||
|
pybaseball==2.2.7
|
||||||
|
pycparser==2.22
|
||||||
|
pydantic==2.9.2
|
||||||
|
pydantic_core==2.23.4
|
||||||
|
PyGithub==2.4.0
|
||||||
|
PyJWT==2.9.0
|
||||||
|
PyNaCl==1.5.0
|
||||||
|
pyparsing==3.2.0
|
||||||
|
pytest==8.3.3
|
||||||
|
pytest-asyncio==0.24.0
|
||||||
|
python-dateutil==2.9.0.post0
|
||||||
|
pytz==2024.2
|
||||||
|
requests==2.32.3
|
||||||
|
scipy==1.14.1
|
||||||
|
six==1.16.0
|
||||||
|
soupsieve==2.6
|
||||||
|
tqdm==4.66.5
|
||||||
|
typing_extensions==4.12.2
|
||||||
|
tzdata==2024.2
|
||||||
|
urllib3==2.2.3
|
||||||
|
wrapt==1.16.0
|
||||||
|
yarl==1.15.4
|
||||||
68
tests/test_batter_calcs.py
Normal file
68
tests/test_batter_calcs.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
from decimal import ROUND_HALF_EVEN, Decimal
|
||||||
|
import math
|
||||||
|
|
||||||
|
from batters.calcs_batter import bp_singles, wh_singles, sanitize_chance_output
|
||||||
|
from creation_helpers import sanitize_chance_output, mround
|
||||||
|
|
||||||
|
|
||||||
|
def test_sanitize():
|
||||||
|
# def my_round_decimal(i: float):
|
||||||
|
# return Decimal(i).quantize(Decimal('0.05'), ROUND_HALF_EVEN)
|
||||||
|
|
||||||
|
# def my_round(num: float, to: float = 0.05):
|
||||||
|
# num, to = Decimal(str(num)), Decimal(str(to))
|
||||||
|
# return float(round(num / to) * to)
|
||||||
|
|
||||||
|
# assert my_round(6) == 6
|
||||||
|
# assert my_round(5.96) == 5.95
|
||||||
|
# assert my_round(5.84) == 5.85
|
||||||
|
# assert my_round(3.123) == 3.1
|
||||||
|
# assert math.floor(my_round(6)) == 6
|
||||||
|
# assert math.floor(my_round(5.96)) == 5
|
||||||
|
|
||||||
|
assert sanitize_chance_output(6) == 6.0
|
||||||
|
assert sanitize_chance_output(1.21) == 1.2
|
||||||
|
assert sanitize_chance_output(4.77) == 4.75
|
||||||
|
assert sanitize_chance_output(4.78) == 4.8
|
||||||
|
|
||||||
|
# step_1 = Decimal(6) / Decimal(0.05)
|
||||||
|
# step_1_5 = round(step_1, )
|
||||||
|
# step_2 = round(step_1)
|
||||||
|
# step_3 = float(step_2 * Decimal(0.05))
|
||||||
|
# step_4 = Decimal(step_3)
|
||||||
|
|
||||||
|
# assert Decimal(6) == Decimal(6).quantize(Decimal('0.05'), ROUND_HALF_EVEN)
|
||||||
|
|
||||||
|
# assert round(step_1) == 120
|
||||||
|
# # assert step_1 == 120
|
||||||
|
# assert step_1_5 == 120
|
||||||
|
# assert step_2 == 120
|
||||||
|
# assert step_3 == 6.0
|
||||||
|
# assert step_4 == Decimal('6.0')
|
||||||
|
|
||||||
|
# rounded_val = step_4.quantize(Decimal("0.05"), ROUND_HALF_EVEN)
|
||||||
|
# assert rounded_val == 6
|
||||||
|
# assert sanitize_chance_output(6) == 6
|
||||||
|
|
||||||
|
|
||||||
|
def test_mround():
|
||||||
|
assert mround(6) == 6.0
|
||||||
|
assert mround(1.21) == 1.2
|
||||||
|
assert mround(4.77) == 4.75
|
||||||
|
assert mround(4.78) == 4.8
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimals():
|
||||||
|
assert Decimal(8) == 8
|
||||||
|
|
||||||
|
|
||||||
|
def test_bp_singles():
|
||||||
|
assert bp_singles(23) == 5
|
||||||
|
assert bp_singles(6) == 5
|
||||||
|
assert bp_singles(3) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_wh_singles():
|
||||||
|
assert wh_singles(11, .36) == 3.75
|
||||||
|
assert wh_singles(12, .45) == Decimal('7.95')
|
||||||
|
|
||||||
7
tests/test_helpers.py
Normal file
7
tests/test_helpers.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from creation_helpers import pd_positions_df
|
||||||
|
|
||||||
|
|
||||||
|
def test_positions_df():
|
||||||
|
cardset_19_pos = pd_positions_df(19)
|
||||||
|
|
||||||
|
assert True == True
|
||||||
Loading…
Reference in New Issue
Block a user