Pre-Season 6 Updates

This commit is contained in:
Cal Corum 2023-10-19 23:16:47 -05:00
parent a44250803a
commit 96be768ec9
10 changed files with 1134 additions and 168 deletions

File diff suppressed because it is too large Load Diff

View File

@ -54,10 +54,10 @@ def complex_data_to_csv(complex_data: List):
else:
data_list = [[x for x in complex_data[0].keys()]]
for line in complex_data:
logging.info(f'line: {line}')
logging.debug(f'line: {line}')
this_row = []
for key in line:
logging.info(f'key: {key}')
logging.debug(f'key: {key}')
if line[key] is None:
this_row.append('')
@ -395,11 +395,35 @@ class Roster(BaseModel):
# this_roster.card26]
class Result(BaseModel):
away_team = ForeignKeyField(Team)
home_team = ForeignKeyField(Team)
away_score = IntegerField()
home_score = IntegerField()
away_team_value = IntegerField(null=True)
home_team_value = IntegerField(null=True)
away_team_ranking = IntegerField(null=True)
home_team_ranking = IntegerField(null=True)
scorecard = CharField()
week = IntegerField()
season = IntegerField()
ranked = BooleanField()
short_game = BooleanField()
game_type = CharField(null=True)
@staticmethod
def select_season(season=None):
if not season:
season = Current.get().season
return Result.select().where(Result.season == season)
class BattingStat(BaseModel):
card = ForeignKeyField(Card)
team = ForeignKeyField(Team)
roster_num = IntegerField()
vs_team = ForeignKeyField(Team)
result = ForeignKeyField(Result, null=True)
pos = CharField()
pa = IntegerField()
ab = IntegerField()
@ -438,6 +462,7 @@ class PitchingStat(BaseModel):
team = ForeignKeyField(Team)
roster_num = IntegerField()
vs_team = ForeignKeyField(Team)
result = ForeignKeyField(Result, null=True)
ip = FloatField()
hit = IntegerField()
run = IntegerField()
@ -462,29 +487,6 @@ class PitchingStat(BaseModel):
game_id = IntegerField()
class Result(BaseModel):
away_team = ForeignKeyField(Team)
home_team = ForeignKeyField(Team)
away_score = IntegerField()
home_score = IntegerField()
away_team_value = IntegerField(null=True)
home_team_value = IntegerField(null=True)
away_team_ranking = IntegerField(null=True)
home_team_ranking = IntegerField(null=True)
scorecard = CharField()
week = IntegerField()
season = IntegerField()
ranked = BooleanField()
short_game = BooleanField()
game_type = CharField(null=True)
@staticmethod
def select_season(season=None):
if not season:
season = Current.get().season
return Result.select().where(Result.season == season)
class Award(BaseModel):
name = CharField()
season = IntegerField()
@ -577,9 +579,9 @@ BattingCard.add_index(bc_index)
class BattingCardRatings(BaseModel):
battingcard = ForeignKeyField(BattingCard)
vs_hand = CharField(default='R')
pull_rate: FloatField()
center_rate: FloatField()
slap_rate: FloatField()
pull_rate = FloatField()
center_rate = FloatField()
slap_rate = FloatField()
homerun = FloatField()
bp_homerun = FloatField()
triple = FloatField()

View File

@ -6,7 +6,7 @@ import logging
import pydantic
from pandas import DataFrame
from ..db_engine import db, BattingStat, model_to_dict, fn, Card
from ..db_engine import db, BattingStat, model_to_dict, fn, Card, Player, Current
from ..dependencies import oauth2_scheme, valid_token, LOG_DATA
logging.basicConfig(
@ -69,6 +69,12 @@ async def get_batstats(
season: int = None, week_start: int = None, week_end: int = None, created: int = None, csv: bool = None):
all_stats = BattingStat.select().join(Card).join(Player)
if season is not None:
all_stats = all_stats.where(BattingStat.season == season)
else:
curr = Current.latest()
all_stats = all_stats.where(BattingStat.season == curr.season)
if card_id is not None:
all_stats = all_stats.where(BattingStat.card_id == card_id)
if player_id is not None:
@ -79,8 +85,6 @@ async def get_batstats(
all_stats = all_stats.where(BattingStat.vs_team_id == vs_team_id)
if week is not None:
all_stats = all_stats.where(BattingStat.week == week)
if season is not None:
all_stats = all_stats.where(BattingStat.season == season)
if week_start is not None:
all_stats = all_stats.where(BattingStat.week >= week_start)
if week_end is not None:

View File

@ -48,6 +48,9 @@ class BattingCardRatingsModel(pydantic.BaseModel):
avg: float = 0.0
obp: float = 0.0
slg: float = 0.0
pull_rate: float = 0.0
center_rate: float = 0.0
slap_rate: float = 0.0
@validator("avg", always=True)
def avg_validator(cls, v, values, **kwargs):
@ -143,10 +146,9 @@ async def get_card_scouting(team_id: int, ts: str, cardset_id: list = Query(defa
if this_team is None or ts != this_team.team_hash() or this_team.has_guide != 1:
logging.warning(f'Team_id {team_id} attempted to pull ratings')
db.close()
raise HTTPException(
status_code=401,
detail='You are not authorized to pull card ratings.'
)
return 'Your team does not have the ratings guide enabled. If you have purchased a copy, ping Cal to ' \
'make sure it is enabled on your team. If you are interested, you can pick it up here: ' \
'https://ko-fi.com/manticorum/shop'
all_ratings = BattingCardRatings.select()
if cardset_id is not None:
@ -163,6 +165,8 @@ async def get_card_scouting(team_id: int, ts: str, cardset_id: list = Query(defa
x['player_id'] = x['battingcard']['player']['player_id']
x['player_name'] = x['battingcard']['player']['p_name']
x['rarity'] = x['battingcard']['player']['rarity']['name']
x['cardset_id'] = x['battingcard']['player']['cardset']['id']
x['cardset_name'] = x['battingcard']['player']['cardset']['name']
del x['battingcard']
del x['player']
@ -173,12 +177,13 @@ async def get_card_scouting(team_id: int, ts: str, cardset_id: list = Query(defa
vl = pd.DataFrame(vl_vals)
vr = pd.DataFrame(vr_vals)
db.close()
output = pd.merge(vl, vr, on='player_id', suffixes=('_vl', '_vr'))
first = ['player_id', 'player_name', 'rarity', 'hand', 'variant']
exclude = first + ['id_vl', 'id_vr']
output = output[first + [col for col in output.columns if col not in exclude]]
db.close()
first = ['player_id', 'player_name', 'cardset_name', 'rarity', 'hand', 'variant']
exclude = first + ['id_vl', 'id_vr', 'vs_hand_vl', 'vs_hand_vr']
output = output[first + [col for col in output.columns if col not in exclude]].sort_values(by=['player_id'])
# output = output.sort_values(by=['player_id'])
return Response(content=pd.DataFrame(output).to_csv(index=False), media_type='text/csv')

View File

@ -1,10 +1,11 @@
from fastapi import APIRouter, Depends, HTTPException, Query, Response
from typing import Literal, Optional, List
import logging
import pandas as pd
import pydantic
from pydantic import validator, root_validator
from ..db_engine import db, PitchingCardRatings, model_to_dict, chunked, PitchingCard, Player, query_to_csv
from ..db_engine import db, PitchingCardRatings, model_to_dict, chunked, PitchingCard, Player, query_to_csv, Team
from ..dependencies import oauth2_scheme, valid_token, LOG_DATA
logging.basicConfig(
@ -126,6 +127,54 @@ async def get_card_ratings(
return return_val
@router.get('/scouting')
async def get_card_scouting(team_id: int, ts: str, cardset_id: list = Query(default=None)):
this_team = Team.get_or_none(Team.id == team_id)
logging.debug(f'Team: {this_team} / has_guide: {this_team.has_guide}')
if this_team is None or ts != this_team.team_hash() or this_team.has_guide != 1:
logging.warning(f'Team_id {team_id} attempted to pull ratings')
db.close()
return 'Your team does not have the ratings guide enabled. If you have purchased a copy, ping Cal to ' \
'make sure it is enabled on your team. If you are interested, you can pick it up here: ' \
'https://ko-fi.com/manticorum/shop'
all_ratings = PitchingCardRatings.select()
if cardset_id is not None:
set_players = Player.select(Player.player_id).where(Player.cardset_id << cardset_id)
set_cards = PitchingCard.select(PitchingCard.id).where(PitchingCard.player << set_players)
all_ratings = all_ratings.where(PitchingCardRatings.pitchingcard << set_cards)
vl_query = all_ratings.where(PitchingCardRatings.vs_hand == 'L')
vr_query = all_ratings.where(PitchingCardRatings.vs_hand == 'R')
vl_vals = [model_to_dict(x) for x in vl_query]
for x in vl_vals:
x.update(x['pitchingcard'])
x['player_id'] = x['pitchingcard']['player']['player_id']
x['player_name'] = x['pitchingcard']['player']['p_name']
x['rarity'] = x['pitchingcard']['player']['rarity']['name']
x['cardset_id'] = x['pitchingcard']['player']['cardset']['id']
x['cardset_name'] = x['pitchingcard']['player']['cardset']['name']
del x['pitchingcard']
del x['player']
vr_vals = [model_to_dict(x) for x in vr_query]
for x in vr_vals:
x['player_id'] = x['pitchingcard']['player']['player_id']
del x['pitchingcard']
vl = pd.DataFrame(vl_vals)
vr = pd.DataFrame(vr_vals)
db.close()
output = pd.merge(vl, vr, on='player_id', suffixes=('_vl', '_vr'))
first = ['player_id', 'player_name', 'cardset_name', 'rarity', 'hand', 'variant']
exclude = first + ['id_vl', 'id_vr', 'vs_hand_vl', 'vs_hand_vr']
output = output[first + [col for col in output.columns if col not in exclude]].sort_values(by=['player_id'])
# output = output.sort_values(by=['player_id'])
return Response(content=pd.DataFrame(output).to_csv(index=False), media_type='text/csv')
@router.get('/{ratings_id}')
async def get_one_rating(ratings_id: int, token: str = Depends(oauth2_scheme)):
if not valid_token(token):

View File

@ -5,7 +5,7 @@ import logging
import pydantic
from pandas import DataFrame
from ..db_engine import db, PitchingStat, model_to_dict, Card, Player
from ..db_engine import db, PitchingStat, model_to_dict, Card, Player, Current
from ..dependencies import oauth2_scheme, valid_token, LOG_DATA
logging.basicConfig(
@ -61,6 +61,12 @@ async def get_pit_stats(
all_stats = PitchingStat.select().join(Card).join(Player)
logging.debug(f'pit query:\n\n{all_stats}')
if season is not None:
all_stats = all_stats.where(PitchingStat.season == season)
else:
curr = Current.latest()
all_stats = all_stats.where(PitchingStat.season == curr.season)
if card_id is not None:
all_stats = all_stats.where(PitchingStat.card_id == card_id)
if player_id is not None:
@ -71,8 +77,6 @@ async def get_pit_stats(
all_stats = all_stats.where(PitchingStat.vs_team_id == vs_team_id)
if week is not None:
all_stats = all_stats.where(PitchingStat.week == week)
if season is not None:
all_stats = all_stats.where(PitchingStat.season == season)
if week_start is not None:
all_stats = all_stats.where(PitchingStat.week >= week_start)
if week_end is not None:

View File

@ -1,6 +1,7 @@
import os.path
import base64
import pandas as pd
from fastapi import APIRouter, Depends, HTTPException, Request, Response, Query
from fastapi.responses import FileResponse
from fastapi.templating import Jinja2Templates
@ -146,24 +147,44 @@ async def get_players(
# raise HTTPException(status_code=404, detail=f'No players found')
if csv:
all_players.order_by(-Player.rarity.value, Player.p_name)
data_list = [['id', 'name', 'value', 'image', 'image2', 'mlbclub', 'franchise', 'cardset', 'rarity', 'pos_1',
'pos_2', 'pos_3', 'pos_4', 'pos_5', 'pos_6', 'pos_7', 'pos_8', 'headshot', 'vanity_card',
'strat_code', 'bbref_id', 'description', 'for_purchase', 'ranked_legal']]
for line in final_players:
data_list.append(
[
line.player_id, line.p_name, line.cost, line.image, line.image2, line.mlbclub, line.franchise,
line.cardset, line.rarity, line.pos_1, line.pos_2, line.pos_3, line.pos_4, line.pos_5, line.pos_6,
line.pos_7, line.pos_8, line.headshot, line.vanity_card, line.strat_code, line.bbref_id,
line.description, line.cardset.for_purchase, line.cardset.ranked_legal
# line.description, line.cardset.in_packs, line.quantity
]
)
return_val = DataFrame(data_list).to_csv(header=False, index=False)
card_vals = [model_to_dict(x) for x in all_players]
db.close()
return Response(content=return_val, media_type='text/csv')
for x in card_vals:
x['player_name'] = x['p_name']
x['cardset_name'] = x['cardset']['name']
x['rarity'] = x['rarity']['name']
x['for_purchase'] = x['cardset']['for_purchase']
x['ranked_legal'] = x['cardset']['ranked_legal']
if x['player_name'] not in x['description']:
x['description'] = f'{x["description"]} {x["player_name"]}'
card_df = pd.DataFrame(card_vals)
output = card_df[[
'player_id', 'player_name', 'cost', 'image', 'image2', 'mlbclub', 'franchise', 'cardset_name', 'rarity',
'pos_1', 'pos_2', 'pos_3', 'pos_4', 'pos_5', 'pos_6', 'pos_7', 'pos_8', 'headshot', 'vanity_card',
'fangr_id', 'bbref_id', 'description', 'for_purchase', 'ranked_legal'
]]
return Response(content=pd.DataFrame(output).to_csv(index=False), media_type='text/csv')
# all_players.order_by(-Player.rarity.value, Player.p_name)
# data_list = [['id', 'name', 'value', 'image', 'image2', 'mlbclub', 'franchise', 'cardset', 'rarity', 'pos_1',
# 'pos_2', 'pos_3', 'pos_4', 'pos_5', 'pos_6', 'pos_7', 'pos_8', 'headshot', 'vanity_card',
# 'strat_code', 'bbref_id', 'description', 'for_purchase', 'ranked_legal']]
# for line in final_players:
# data_list.append(
# [
# line.player_id, line.p_name, line.cost, line.image, line.image2, line.mlbclub, line.franchise,
# line.cardset, line.rarity, line.pos_1, line.pos_2, line.pos_3, line.pos_4, line.pos_5, line.pos_6,
# line.pos_7, line.pos_8, line.headshot, line.vanity_card, line.strat_code, line.bbref_id,
# line.description, line.cardset.for_purchase, line.cardset.ranked_legal
# # line.description, line.cardset.in_packs, line.quantity
# ]
# )
# return_val = DataFrame(data_list).to_csv(header=False, index=False)
#
# db.close()
# return Response(content=return_val, media_type='text/csv')
else:
return_val = {'count': len(final_players), 'players': []}
@ -362,6 +383,10 @@ async def get_batter_card(
raise HTTPException(status_code=404, detail=f'Ratings not found for batting card {this_bc.id}')
card_data = get_batter_card_data(this_player, this_bc, rating_vl, rating_vr, all_pos)
if this_player.description in this_player.cardset.name:
card_data['cardset_name'] = this_player.cardset.name
else:
card_data['cardset_name'] = this_player.description
card_data['request'] = request
html_response = templates.TemplateResponse("player_card.html", card_data)
@ -379,6 +404,10 @@ async def get_batter_card(
raise HTTPException(status_code=404, detail=f'Ratings not found for pitching card {this_pc.id}')
card_data = get_pitcher_card_data(this_player, this_pc, rating_vl, rating_vr, all_pos)
if this_player.description in this_player.cardset.name:
card_data['cardset_name'] = this_player.cardset.name
else:
card_data['cardset_name'] = this_player.description
card_data['request'] = request
html_response = templates.TemplateResponse("player_card.html", card_data)

View File

@ -1,4 +1,6 @@
from datetime import datetime
import pandas as pd
from fastapi import APIRouter, Depends, HTTPException, Response
from typing import Optional
import logging
@ -392,23 +394,23 @@ async def get_team_cards(team_id, csv: Optional[bool] = True):
db.close()
raise HTTPException(status_code=404, detail=f'No cards found')
data_list = [[
'cardset', 'player', 'rarity', 'image', 'image2', 'pos_1', 'pos_2', 'pos_3', 'pos_4', 'pos_5', 'pos_6',
'pos_7', 'pos_8', 'cost', 'mlbclub', 'franchise', 'set_num', 'bbref_id', 'player_id', 'card_id'
]]
for line in all_cards:
data_list.append(
[
line.player.cardset, line.player.p_name, line.player.rarity, line.player.image, line.player.image2,
line.player.pos_1, line.player.pos_2, line.player.pos_3, line.player.pos_4, line.player.pos_5,
line.player.pos_6, line.player.pos_7, line.player.pos_8, line.player.cost, line.player.mlbclub,
line.player.franchise, line.player.set_num, line.player.bbref_id, line.player.player_id, line.id
]
)
return_val = DataFrame(data_list).to_csv(header=False, index=False)
card_vals = [model_to_dict(x) for x in all_cards]
db.close()
return Response(content=return_val, media_type='text/csv')
for x in card_vals:
x.update(x['player'])
x['player_id'] = x['player']['player_id']
x['player_name'] = x['player']['p_name']
x['cardset_id'] = x['player']['cardset']['id']
x['cardset_name'] = x['player']['cardset']['name']
x['rarity'] = x['player']['rarity']['name']
x['card_id'] = x['id']
card_df = pd.DataFrame(card_vals)
output = card_df[[
'cardset_name', 'player_name', 'rarity', 'image', 'image2', 'pos_1', 'pos_2', 'pos_3', 'pos_4', 'pos_5',
'pos_6', 'pos_7', 'pos_8', 'cost', 'mlbclub', 'franchise', 'fangr_id', 'bbref_id', 'player_id', 'card_id']]
return Response(content=pd.DataFrame(output).to_csv(index=False), media_type='text/csv')
@router.post('')

View File

@ -54,10 +54,10 @@ def complex_data_to_csv(complex_data: List):
else:
data_list = [[x for x in complex_data[0].keys()]]
for line in complex_data:
logging.info(f'line: {line}')
logging.debug(f'line: {line}')
this_row = []
for key in line:
logging.info(f'key: {key}')
logging.debug(f'key: {key}')
if line[key] is None:
this_row.append('')
@ -183,7 +183,7 @@ class Player(BaseModel):
fangr_id = CharField(null=True)
description = CharField()
quantity = IntegerField(default=999)
mlb_player = ForeignKeyField(MlbPlayer, null=True)
mlbplayer = ForeignKeyField(MlbPlayer, null=True)
def __str__(self):
return f'{self.cardset} {self.p_name} ({self.rarity.name})'
@ -395,11 +395,35 @@ class Roster(BaseModel):
# this_roster.card26]
class Result(BaseModel):
away_team = ForeignKeyField(Team)
home_team = ForeignKeyField(Team)
away_score = IntegerField()
home_score = IntegerField()
away_team_value = IntegerField(null=True)
home_team_value = IntegerField(null=True)
away_team_ranking = IntegerField(null=True)
home_team_ranking = IntegerField(null=True)
scorecard = CharField()
week = IntegerField()
season = IntegerField()
ranked = BooleanField()
short_game = BooleanField()
game_type = CharField(null=True)
@staticmethod
def select_season(season=None):
if not season:
season = Current.get().season
return Result.select().where(Result.season == season)
class BattingStat(BaseModel):
card = ForeignKeyField(Card)
team = ForeignKeyField(Team)
roster_num = IntegerField()
vs_team = ForeignKeyField(Team)
result = ForeignKeyField(Result, null=True)
pos = CharField()
pa = IntegerField()
ab = IntegerField()
@ -438,6 +462,7 @@ class PitchingStat(BaseModel):
team = ForeignKeyField(Team)
roster_num = IntegerField()
vs_team = ForeignKeyField(Team)
result = ForeignKeyField(Result, null=True)
ip = FloatField()
hit = IntegerField()
run = IntegerField()
@ -462,29 +487,6 @@ class PitchingStat(BaseModel):
game_id = IntegerField()
class Result(BaseModel):
away_team = ForeignKeyField(Team)
home_team = ForeignKeyField(Team)
away_score = IntegerField()
home_score = IntegerField()
away_team_value = IntegerField(null=True)
home_team_value = IntegerField(null=True)
away_team_ranking = IntegerField(null=True)
home_team_ranking = IntegerField(null=True)
scorecard = CharField()
week = IntegerField()
season = IntegerField()
ranked = BooleanField()
short_game = BooleanField()
game_type = CharField(null=True)
@staticmethod
def select_season(season=None):
if not season:
season = Current.get().season
return Result.select().where(Result.season == season)
class Award(BaseModel):
name = CharField()
season = IntegerField()
@ -577,6 +579,9 @@ BattingCard.add_index(bc_index)
class BattingCardRatings(BaseModel):
battingcard = ForeignKeyField(BattingCard)
vs_hand = CharField(default='R')
pull_rate = FloatField()
center_rate = FloatField()
slap_rate = FloatField()
homerun = FloatField()
bp_homerun = FloatField()
triple = FloatField()

View File

@ -16,16 +16,21 @@ migrator = SqliteMigrator(db_engine.db)
# last_game = CharField(null=True)
# game_type = CharField(null=True)
mlb_player = ForeignKeyField(db_engine.MlbPlayer, field=db_engine.MlbPlayer.id, null=True)
result = ForeignKeyField(db_engine.Result, field=db_engine.Result.id, null=True)
# active_theme = ForeignKeyField(PackTheme, to_field='id', field_type=int, null=True)
# active_theme = ForeignKeyField(db_engine.PackTheme, field=db_engine.PackTheme.id, null=True) # for careers
# game_type = CharField(null=True)
# pack_team = ForeignKeyField(db_engine.Team, field=db_engine.Team.id, null=True)
# pack_cardset = ForeignKeyField(db_engine.Cardset, field=db_engine.Cardset.id, null=True)
pull_rate = FloatField(default=0.333)
migrate(
# migrator.add_column('current', 'active_theme_id', active_theme),
# migrator.add_column('pack', 'pack_team_id', pack_team),
migrator.add_column('player', 'mlbplayer_id', mlb_player),
# migrator.add_column('player', 'mlbplayer_id', mlb_player),
migrator.add_column('battingstat', 'result_id', result),
migrator.add_column('pitchingstat', 'result_id', result),
# migrator.add_column('battingcardratings', 'pull_rate', pull_rate),
# migrator.rename_column('cardset', 'available', 'for_purchase')
# migrator.add_column('player', 'offense_col', offense_col),
# migrator.add_column('comment_tbl', 'comment', comment_field),