개발/프로젝트
웹대시보드 프로젝트 4일차
웅'jk
2022. 12. 21. 09:31
3일차에서 말했던 대로 멀티셀렉트박스를 이용하여 구성을 바꾸고
선수탭을 작업하기 시작하였습니다.
다만 여기서 데이터컬럼명을 rename하는 과정에서 빼먹은 부분이 있어 그부분을 수정하였습니다.
1. app.py
import streamlit as st
from home import home
from team import team
from player import player
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
def main() :
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Linux':
rc('font', family='NanumGothic')
team_name_list = ['(팀을 선택해주세요)','ATL', 'BOS', 'NOP', 'CHI', 'DAL', 'DEN', 'HOU', 'LAC', 'LAL',
'MIA', 'MIL', 'MIN', 'BKN', 'NYK', 'ORL', 'IND', 'PHI', 'PHX',
'POR', 'SAC', 'SAS', 'OKC', 'TOR', 'UTA', 'MEM', 'WAS', 'DET',
'CHA', 'CLE', 'GSW']
st.sidebar.title('메뉴')
choose = st.sidebar.selectbox('카테고리',['홈','팀','선수'])
if choose == '홈' :
home()
if choose == '팀' :
team_name = st.sidebar.selectbox('팀 정보',team_name_list)
if team_name != '(팀을 선택해주세요)' :
team(team_name)
else :
st.title('팀을 선택해주세요.')
if choose =='선수' :
player_name = st.sidebar.text_input('선수명(영어로만)',max_chars=100)
if player_name != '' :
player(player_name)
else :
st.sidebar.error('선수명을 입력해주세요.')
image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAFPCAMAAACYmceDAAAA2FBMVEX///8dQorIEC4AK4DEAA4AKH8ANYT24eMAN4UALIERPIfEAACUoL+stcwaQInEAAv09fgAL4LHAChjdaV3hq8AMoPt7/TGACAAJn/4+fv46erGABzr7fPFABX89fbf4uvwztHPQ1O6wdWAjrScpsPlpqynsMnU2OTejZX67u9sfarz1tncgouRnb0AHXzKz97rvMDUYGzosrdEXZcoSY5UaZ41UpLSU2HWanXKITnNN0nuxsrgk5o7VpR9i7K+xNfYdH4AFHkAAHXjn6XPR1bLKj/SVmPUYm477DVsAAARWUlEQVR4nO2d20LbOBCG44QYxy6mMYSEhkDKudAAhVB6oEAPbN//jdaWHNuSRtJIsrN7kf+KQjBfdRjNjKRxq7XSSiuttNJKK6200korrbTS/1q7qd5m2im0t9DOHvk3+WnxC/uAauQ52Hi663e7nVI9UOkPur/mhwXVySSKNktFhb5+OVl3ZNo5nnf8MI49jML4mvnlk7WkDShJxpvt83f2UHsXowBHlMm/53//wyvIlWkYfbJtstkoQDN5XrAlPmE/kXK1k+jFBupg7htAefFn6CGXkZyrPRxPjameR/juy9Q5Ax9z+X4o52pHj4ZUpyMjKC++kz3pQdFe7bWXRqk8f0P2qP1NBVZ7YsL1bErl9Q+kD/uo6sb2Gr4fD4ypvK78adOJCqsdfcdizc1Guyebh1TqXkz7EbkmzYwsA1EIGK1CkRpr+AVFtWPehV74ZI/Vji4xWNuhOVYwc8BK/iCo3lo0luefyh/4QTO2cM11bD6yVGZLOxOz0fWix/psPA292L86lD/w91iH1V7TUu11zanmh2dv5U/8plp9qCZTHdaGeR8OrlUPfKcb8VkvnuuwnsznYW9H9cBz5dpDlbzXYf0wH1odRQ+2WtoBT5pLh2VOpW4txIBPFemwBuZcCu+h1bpdqwWrb95ag2fVA5VuYIGlW67N7YMXHKke+AWDtanDsll6AtUDUZ3YCFZ4Lx9dj6ghv/mhASyvJ117PiCMaWNYfTgaS/UJM7IQWBZDPjWoMss1xTVWe1OXkrDCGsme9hXXWM1gyQKM34oUxBKwJAHGJbIHm8KS2NM/2LZqCAt2mb9rffiGsTqgNZXn3JaDFc+hB52gHK3msIIR1FhI814/Vhz4/qDfCY9AW4oILGrHisMwGPw4Pt14PpPY9weEB1/RmiNWHKQN1JvfX8yOFR78ZWJG5YgV9udHhwfKiILoH0MqJ6y4cy/1FFiZ2AaKpUvSy7H4TQqFzlV573qxAmkuGdDln00jMOtODIStE7Wm31BOvCNWaNJWVDdD/MC3xIrDXWOsNBZDrz+WWOD6opc6Je+MNTi2olLvRDljqbLuau0/4PrRykBYdiHRCarBbLDUOQad3n1DxNU6rF0RKx7YzMKKHvUNZoE1UOTccbrUBmbmWLHnSpVKuQdrhdVXpNzx0riFxlj2xoHVH/Vmp8ZuCVh9ZQbSQG3lnrUOq9NMY7Va66pQyBRrUMvIIjpX2C9DrDisjarVUvSiIVZguUaDupU3lyHWSB/lGKgurPCiTirFrpQZVh8d66Akn4xmWMp9AAtJ40cjLOV+vY0eZb1ohAWn0xwk3U03warPwheSDS5dIqmKNVCcIrCULOtlguXXTtV6kQwuAyy/Tguf60RiUfFYca9+qtZ3yZjHY9VuHTKtS/IleKyuY7wDSnYMCI3lFhxKJbEQaKx6fYdCjp2oPL7mIJgKjTXaawZLsu+JxFIeQTTQlD9IIPEhkFiSE8qGWn8QDpVKVh8clvyEsok+Rsn4d51YdcSs37MNloQ/U+qCFcfuVF+IhUq+1oilOq6J03o7dxX4E1AuWM7rzoci0bbGHSmVnE/CYIXbjlQVt2p8y/5E4tlgsHqu1mG/XPmGH9kfSVwIBBa8I26iynlA4bwy7EIgsNzzDtVUFn8AFz6zgcByDsOma4o/CO+36LHc+5CZbRNu+YHTNjqstx1nZ3mfcfWG3BWQS3DM67HUJ5QRYg/AJp9U0HisjiNV6yv7F/lzwRCVHmvk6mldciYg4o79/YWmohbrytU88IEzP+bBrI0W66dr4oG3l7zLdQNFsPrWcpyIggFI/rIfeAfZef3YcjRb74Whw495q9bquC3UwBUH/qgrNOYR5tQpnAYG9OSG/cgt0Fx6LLf9Q6AlhPsfFljpUt1V3vhQax0Yz8L9D6BF9a3ltPt0CY1n3p8H1h+MG/jDHmsK7ZbzBhVwblC+fPzm+eyAyDjWmAJJBt5xBpoLFycGgz7RTwtjAYRcE/4zQmbXJNOsOp4v177o541PuM8I1g0x5Csa2ZhWMeZK2vxn+EsHRlh9O8sqNteEixZZd7+tv/RQxRpY2ntx21BsLm6f3wDLtw2uAXedX4B4k4rHsjgNuBBgu/jMDbcc4LEc1iAgFhSay7ITXbapgS2U5JX7DGu60FhO5zKAoGtNGcaisaQ3ijD6RxxdyTf2I+y8wGK5eV1QFmtzynyEXRexWG6pN9Dt4lJKVq3lmD6FTkVxV+CZJR2LZbNIVwSli7hsxBcbLMesLrjLGjHrMWPnkVjOmXkoL8O6g0x0jcRy3ooC7wcz94GZ5C4Syzn3Bia62XTEpjmWqr4DSpCJaA83qx/5NDTGck4JtkSfazL+OK1+4rIdjRMzLOV9d5SENNcr70OkLv3J4hg2EqvnvCfMprESwW3OlRu4pWExa97kQXrLPBqaYLmf3KosLpGiOMaHlywQx44t973q0opHfJjI6t37BD0T3XeFi5Ntm2qqVjZrsea0hkNSueUa8xkIUR+Hy1p8WotkJO+VQrqMdIUXFkv1wB2Leuv8bgGoF131jJr8rUxk53CMKka2j8VyP1T2iTSWkEOCdY4NMZyPQpCNMn05H6p9bEDmfJyZRFyRJkGEVS1RNdUYNw1RKnMQI5f4NVMaQ/Bbr9YqsZwHfWog9AWskCqx4p7jkZZ3m/ryNFhV026uC1CS6KuQIVXBivuOz3oZ8tkja1Vzp/4bt2fdTrTVvrCqYrmOrvWoESznyRg10ome13U7qvvQxJD3nA82n2urfdlhOZ5svsEVwTTHcmuu9Yg/dloTlmNzRZjanDZYbs31Wtfg4rHijovt+rKG7UXNlVwey21lfBwnuA+eaOaGgOXkPd+OhY1XWJFpazl5z5cTXF3hR3Msl42D1OUa/kV8LNJd9xaxnPybqN1e03fja2KO5RTJkrhaV7b6n6H2cjyAFW7b2wiSB9dw/R3r7+wDWF7YDe6PTq1GPs2gRmLatNRDFubaYGVkgX9l05f5Jr88HZif97fE8iy31Be7BuNX2F6e5xlWeyyvZ9GNRb45iT6JYCfDxV6HA5bNVdjKea5k89tJNSMx/bhWbsA4YNnchWVOc2av6fjyeHtzc3vy8U80qe4nuGDFfXNLwW/gJcPxZDIeD7kNNBcsLzBfh5BFkpywLMr/oOoOu2KZj3pkTSk3LPPSUorSFDViGR8IQtaAdMUKDUu8IYtAumIZFwGS3TuvGcvUeMFXQmrHMt4OklUPqBnL65lt6mFeElAHlmdYJgxT2LoOLMNuVBZHqhFLUYkcFHizpwGsuG+Ux0GMrlqwTI2qfmGsB8vrmx2G05rUmrAMSw1Al1UawTJ0cXQrY11Ynm+UJpxq6oHXhuWNjOIzTfX0+rA8IyvB31psDssszFaPrhqxzIYXeC2xESxvZOJLKHuxVqy4a2C9lO9eqRXLi2O8j6OMgerFMhn24OXShrBMAscltlY67NG+l8pLrR3LG2HTS78V7k39WN4I2Y+ykmANYXk9nFlVvYKvCSxvgDu9tOTWSpchVCykyHU1gwW8TxiQ4rVyDWGhivWryrA2hIXhAm83N4yF4FIkb5rDQnAtfchTLt26Ddx4WwKWF2jurytq6TaJ5QWflf6XfCo2i+WFnioTLZ+KDWN5sa/Y6JBPxaaxUv9eEdb+V52YcY3k2Rzpqtg8VuroSDfSpImuZWB5/p1kQkqn4lKwvDCQvN5eWqd5KViyASadikvC8rz+FtSR/91MXCgIAEsh22lZHlbakWLoIds6WCJW2mCe0GC/4UG/VKzU5F/wKUM4W7lcrLTBrriRvw8217KxxJOYN1CFvqVjiW/WEAuHmWMFueLiH9lXYRAwP1ggQN8UrjpCLzg1xAqOc2WvuQ9m2VdbsRde0G++mc2efnSLl6fH88Wn7ypcYrlgwI8wxOouvr8dLu7pHgfsZfC9i8Wbt8t9s1lQfQbvGAKpG1usU39x2fpNwN9RP12UtigKdG/41RYXrk6IvWiLdT2QY7WOgrzHq58ue1EY9OLWgS3WTkeB1eqTsVQWczmovlE9ENJM4ly0xcreKC/H2ibNRc7N7ghPEWtv1jfkW/ehgHV0d39B9wsOSaeRKUF/VH0Zt3CEHDgOZI2VTi56irjE2vbDPK91RjqNvLX6DVls5hULIbRWjTOxdeiLWOGiSjEdS+TFMUek/e7D8hlCEQcg5rfGShtEjrXX8xZ2c5t86KmCJZzmAPbwbLCobzICsbwSix6s3yJrzbHKnrovPgSLRjHzmPaGFIuazTvys8OqPeVOTUDhj+4NNRDWNZn0F6EGi353TmwqY0+9DjO6oINmVq1FnnocyLEOesXQpnsH5BuF2NMJUJhh01oHeQMIWEGBlc1EatauiE3n3knHHDuG3GYbrD3yl/Z6dHGRYnWyqbE7ogOpX3W5Ukes8idEKDust9QK9ChNifXEYpE32ux1aIf9YLAY1xmKyWywdn+RH93T105CWJmVp4U/z/r0fTsXIfOcaiEHyJc3K/6Ym9NfZNQc9Y45rHBxZyqbeNRqXg/orxwFzHOqzQW9scOsVGaO9ZOYyI3uGxZrux/0qAXPrCe9m3c46BFzcuqzWJVXmkFb/FatRWs3n41mLNbh7Dj3sNLOzOubnfp0Qj4POKwy0vgNFX6zwRqQNtm9OmKxCs384u/Ocut21uewSlMP7cJaYeXzm9ZiAHx5YqT6+Rrtkxbc63FY3mgRXkMnD6zGVn6ReesexromWHRMbYV5sboRj1W61ICFsMOilwHf3MFYrY1sIBEnsHUX54FOyGOVcRHg2FhhzWkLPHss1kYx5NPgNve85nF+cfA+5rDKkn/AomiHRe+GHHRZrNRAdChDag7yId1dfLHNN1enSCkB+WY7rJCuKL84rHDhG6TzLiB9lC7ReZnnGWdPK44ukBK0w4rpwJmLWPMCi5jxnXQC0mh1g7enlWuO4uCyxKI28mJHwCqWamoXDq6C4Cf51jVvTytOl/gaRS1WF8D6HNPZfXwgx6KTdSfL1yy+xSkoQw3z1oKx6Ky/PpNj8WXXgPxdedFe2B3WFbpqwVh0eu08y7G66gexg14sTW6HlftLcqxYeOnpnDdcJZZY69ASK69hKx9bYs5vS7DzZdRfV2tVInYYKy+pdHaYikarTzxW5dU3wr6itg7PCMBKHfPSu4TtVr4S3vUHA+qWsYE1wSobVLAQWiw2ZCmwygJT1cgnLjI2+beyzG9It3oOeXtazUXwy48W6weMVfZAJb81/7xFzcJzHkOS/1T+P7gWHMHKzhS/WvOvNxDEhiwFVu63tEDHJg0o8tqa2ciMaQse8I5gtegf56EKL3cTxA6JEqtY0gCs3V5M/QNiQ/OGFV72zvwWG5UJr8ITxK5lJVbxUAArDRjpB+mKk7+ZdcAZLib9xoY/iGIWIxirqIUC+PK9ioNT/FLrjsNiaqjeMINeV6WixZnBEiteRC48FtnFyGcZbeoeXfu4wLriB7a4tK5+aHERnr9xmoqsIwH58nQjxQ63s6/Jps/RHdnzie+z72xQlzSYkY/ybjOb2mX6EFO/Jaw+zs8Ul1/6fvaXQ/JVthe2+HBc/CzjqvxWIe4KTvViGarazSnvwNUjLrNbKWotvGUElies/XWIu8JeSVUiC9NdC6FnLVjsRlkZ/kxwpW5SO8QvZ3WI27QuLITwuh+5fgi+Ug1Y7KmbohNR9XeoduP6hxeHtdhhMaocthPW3l5ced58T1Fb5IbV23ndXAHzTmdq5ZNoakSV6l4I9NzEvi6S9OGwrV8LBR2P6m2waqXsrLGS6MUcKtXefbdOsOqO1LckmbxOrahSnW2N+KXNQeU93oe16JuqQJFWO6d3o74fhGG6KjvrinK9a399tBhUvM42ZkdP21QXjLaQKj5PuL7XVXtxpZVWWmmllVZaaaWVVvrf6V/EaLFuufXbZQAAAABJRU5ErkJggg=='
st.sidebar.image(image,use_column_width='always')
if __name__ == '__main__' :
main()
2. data_init.py
import pandas as pd
df_teams = pd.read_csv('data/teams.csv')
df_games = pd.read_csv('data/games.csv')
df_players = pd.read_csv('data/players.csv')
df_games_detail = pd.read_csv('data/games_details.csv',low_memory = False)
df_teams = df_teams.loc[:,['TEAM_ID','ABBREVIATION','YEARFOUNDED','CITY','ARENA']]
df_games = df_games.loc[:,['GAME_DATE_EST','GAME_ID','HOME_TEAM_ID','PTS_home','AST_home','REB_home','TEAM_ID_away','PTS_away','AST_away','REB_away','HOME_TEAM_WINS']]
# 문제 없는 데이터프레임
df_games_detail_1 = df_games_detail.loc[:,:'START_POSITION']
# 문제 있는 데이터프레임 짜른 뒤 수정
df_games_detail_2 = df_games_detail.loc[:,'COMMENT':].shift(-1,axis= 1)
# 짜른 두 코드를 합쳤다.
df_games_detail = pd.concat([df_games_detail_1,df_games_detail_2],axis=1)
df_games_detail = df_games_detail.loc[:,['GAME_ID', 'TEAM_ID','PLAYER_ID','PLAYER_NAME','START_POSITION',
'COMMENT','MIN', 'FG_PCT', 'FG3_PCT',
'DREB', 'REB', 'AST', 'STL', 'BLK','TO']]
rename ={ 'GAME_DATE_EST' : '경기날짜' ,'GAME_ID':'경기ID', 'HOME_TEAM_ID':'홈팀ID','PTS_home':'홈팀점수','AST_home':'홈팀어시','REB_home':'홈팀리바운드','TEAM_ID_away':'어웨이팀ID','PTS_away':'어웨이팀점수','AST_away':'어웨이팀어시','REB_away':'어웨이팀리바운드','HOME_TEAM_WINS':'홈팀승리여부' }
df_games = df_games.rename(columns=rename)
df_games=df_games.fillna(0)
rename_detail = { 'GAME_ID':'경기ID','TEAM_ID':'팀ID','PLAYER_ID':'선수ID','PLAYER_NAME':'선수명',
'START_POSITION':'포지션',
'COMMENT':'출전시간','MIN':'2점슛', 'FG_PCT':'3점슛', 'FG3_PCT':'자유투',
'DREB':'리바운드','REB':'어시스트','AST':'가로채기','STL':'블락','BLK':'턴오버','TO':'파울'}
df_games_detail = df_games_detail.rename(columns=rename_detail)
df_games_detail = df_games_detail.fillna(0)
rename_playes = { 'PLAYER_NAME':'선수명','TEAM_ID':'팀ID','PLAYER_ID':'선수ID','SEASON':'시즌' }
df_players=df_players.rename(columns=rename_playes)
rename_team = {'TEAM_ID':'팀ID','ABBREVIATION':'팀약어','YEARFOUNDED':'팀창설해',
'CITY':'연고지','ARENA':'홈구장'}
df_teams = df_teams.rename(columns=rename_team)
# 가공을 편하게 하기위해 df_games에 홈팀명,어웨이팀명 추가
df_teams_home = df_teams.rename(columns={'팀ID':'홈팀ID'})
new_data = pd.merge(df_games,df_teams_home).iloc[:,:-3].rename(columns={'팀약어':'홈팀'})
df_teams_away = df_teams.rename(columns={'팀ID':'어웨이팀ID'})
df_games=pd.merge(new_data,df_teams_away).iloc[:,:-3].rename(columns={'팀약어':'어웨이팀'})
# 가공을 편하게 하기 위해 df_platers에 팀명 추가
df_players=pd.merge(df_players,df_teams).iloc[:,0:4+1]
# 가공을 편하게 하기 위해 df_games_detail 에 날짜 추가
df_games_detail=pd.merge(df_games_detail,df_games).loc[:,:'경기날짜'].sort_values('경기날짜',ascending=False)
# 가공을 편하게 하기위해 df_games_detail에 약어 추가
df_games_detail = pd.merge(df_games_detail,df_teams).iloc[:,:-3]
3.player.py
import streamlit as st
import data_init
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import platform
from matplotlib import font_manager, rc
def player(player_name) :
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Linux':
rc('font', family='NanumGothic')
elif platform.system() == 'Windows':
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
# 데이터를 읽어온다.
# 선수 데이터
df_players = data_init.df_players
# 선수 스탯 데이터
df_games_detail = data_init.df_games_detail
# 팀정보
df_team = data_init.df_teams
# header
st.header('선수 정보')
# 선수명 확인
player_list = df_players[df_players['선수명'].str.contains(player_name,case=False)]['선수명'].unique().tolist()
if len(player_list) > 1 :
st.error('중복되는 선수명을 가진 선수가 있습니다. 내역을 보시고 다시 입력해주세요.')
player = pd.DataFrame(player_list,columns=['선수명'])
st.dataframe(player)
elif len(player_list) == 0 :
st.error('등록된 선수가 없습니다. 다시 입력해주세요.')
elif len(player_list) == 1 :
player = player_list[0]
# 플레이어 데이터 보여주기
df_player = df_players[df_players['선수명'] == player]
st.dataframe(df_player.iloc[:,[0,4,2,3]])
# 스탯 조회하기
# 선수 데이터 가져오기
df_player_data = df_games_detail[df_games_detail['선수ID'] == df_player['선수ID'].unique()[0]].sort_values('경기날짜',ascending=False)
# 1. 기간 선택하기
st.subheader('선수 스탯 조회하기')
radio_status = st.radio('검색',['날짜별','소속팀별'])
if radio_status == '날짜별' :
start_date = st.date_input('시작 날짜')
end_date = st.date_input('종료 날짜')
start_date = start_date.strftime('%Y-%m-%d')
end_date = end_date.strftime('%Y-%m-%d')
if start_date > end_date :
st.error('시작 날짜를 종료 날짜보다 전으로 설정해주세요.')
else :
if df_player_data['경기날짜'].values[0] < start_date :
st.error('경기정보가 없습니다.')
else :
df_player_data_set=df_player_data[( df_player_data['경기날짜'] >= start_date ) & (df_player_data['경기날짜'] <= end_date) ]
multiselectbox_list = ['상세','공격지표','수비지표']
selected_player_data = st.multiselect('데이터 선택',multiselectbox_list)
if '상세' in selected_player_data :
st.dataframe(df_player_data_set.iloc[:,[15,16,3,4,5,6,7,8,9,10,11,12,13,14,]])
if '공격지표' in selected_player_data :
offense_data_date = df_player_data_set.iloc[:,[6,7,8,-2]]
chart_offense_data_date = px.bar(offense_data_date,x='경기날짜',y=['2점슛','3점슛','자유투'] ,barmode='group')
st.plotly_chart(chart_offense_data_date)
if '수비지표' in selected_player_data :
defense_data_date = df_player_data_set.iloc[:,[9,10,11,12,13,14,-2]]
chart_defense_data_date = px.bar(defense_data_date,x='경기날짜',y=['리바운드','어시스트','가로채기','블락','턴오버','파울'] ,barmode='group')
st.plotly_chart(chart_defense_data_date)
elif radio_status =='소속팀별' :
pass
4. team.py
import streamlit as st
import pandas as pd
import team_url as tu
import data_init
import matplotlib.pyplot as plt
import numpy as np
import platform
from matplotlib import font_manager, rc
import plotly.express as px
def team(team_name) :
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Linux':
rc('font', family='NanumGothic')
elif platform.system() == 'Windows':
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
# 팀의 데이터를 읽어온다.
df_teams = data_init.df_teams
df_games = data_init.df_games
df_games_detail = data_init.df_games_detail
# 팀정보 헤더 지정
st.header(team_name)
# 팀의 맞는 이미지 생성
st.subheader('로고')
st.image(tu.team_url(team_name),width=500)
# 사이드바에서 선택한 팀으로 정보
st.subheader('정보')
df_teams_info = df_teams.loc[df_teams['팀약어'] == team_name,'팀약어':]
st.dataframe(df_teams_info)
# 시즌별 성적보기
st.header('일자별 성적보기')
team_id = df_teams[df_teams['팀약어'] == team_name]['팀ID'].values[0]
# 시작과 끝 종료날짜를 설정하여 데이터 가져오기
start_date = st.date_input('시작 날짜')
end_date = st.date_input('종료 날짜')
start_date = start_date.strftime('%Y-%m-%d')
end_date = end_date.strftime('%Y-%m-%d')
if start_date > end_date :
st.error('시작 날짜를 종료 날짜보다 전으로 설정해주세요.')
# 전적을 비교하기 위한 list 생성
team_name_list = ['','ATL', 'BOS', 'NOP', 'CHI', 'DAL', 'DEN', 'HOU', 'LAC', 'LAL',
'MIA', 'MIL', 'MIN', 'BKN', 'NYK', 'ORL', 'IND', 'PHI', 'PHX',
'POR', 'SAC', 'SAS', 'OKC', 'TOR', 'UTA', 'MEM', 'WAS', 'DET',
'CHA', 'CLE', 'GSW']
if df_games['경기날짜'][0] < start_date :
st.error('경기정보가 없습니다. 날짜를 조정해주세요.')
else :
# 홈 / 어웨이 선택
selected = st.selectbox('홈/어웨이 선택',['홈','어웨이'])
list_selected_box = ['상세','득점','어시스트','리바운드','역대전적','선수 스탯']
if selected == '홈' :
# 홈성적
st.subheader('홈 성적')
home_multi = st.multiselect('데이터 선택',list_selected_box)
df_games_home = df_games.loc[ (df_games['홈팀ID']==team_id) & (start_date<=df_games['경기날짜']) & (df_games['경기날짜']<=end_date),:]
df_games_home = df_games_home.sort_values('경기날짜',ascending=False)
if '상세' in home_multi :
st.subheader('상세')
st.dataframe(df_games_home.iloc[:,[11,12,0,3,4,5,7,8,9]])
if '득점' in home_multi :
#득점 데이터
st.subheader('득점')
recently_game = st.slider('홈 경기 득점 경기 수',min_value=3,max_value=int(df_games_home['경기ID'].count()),value=7)
recently_point_pig = px.bar(df_games_home.head(recently_game),x='경기날짜',y=['홈팀점수','어웨이팀점수'],barmode='group')
st.plotly_chart(recently_point_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '어시스트' in home_multi :
#어시스트 데이터
st.subheader('어시스트')
recently_game = st.slider('홈 경기 어시스트 경기 수',min_value=3,max_value=int(df_games_home['경기ID'].count()),value=7)
recently_assist_pig = px.bar(df_games_home.head(recently_game),x='경기날짜',y=['홈팀어시','어웨이팀어시'],barmode='group')
st.plotly_chart(recently_assist_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '리바운드' in home_multi :
#리바운드 데이터
st.subheader('리바운드')
recently_game = st.slider('최근 경기 리바운드 경기 수',min_value=3,max_value=int(df_games_home['경기ID'].count()),value=7)
recently_rebound_pig = px.bar(df_games_home.head(recently_game),x='경기날짜',y=['홈팀리바운드','어웨이팀리바운드'],barmode='group')
st.plotly_chart(recently_rebound_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '역대전적' in home_multi:
st.subheader('역대 홈 전적비교')
compare_home_team = st.selectbox('팀선택',team_name_list)
print(compare_home_team+' '+team_name)
if compare_home_team != '' and compare_home_team != team_name :
compare_team_id_home = df_teams[df_teams['팀약어'] == compare_home_team]['팀ID'].values[0]
data_home = df_games[(df_games['홈팀ID'] ==team_id) & (df_games['어웨이팀ID'] ==compare_team_id_home)]
st.dataframe(data_home.iloc[:,[11,0,3,4,5,12,7,8,9,10]].sort_values('경기날짜',ascending=False))
if data_home.empty == False :
data_home = data_home.mean(numeric_only=None)
data_home['어웨이승리'] = 1 - data_home['홈팀승리여부']
fig_home = plt.figure()
plt.subplot(2,2,1)
plt.pie(data_home[[9,10]],autopct='%.1f',startangle = 90)
plt.title('홈팀 승률')
plt.legend(['홈','어웨이'])
plt.subplot(2,2,2)
plt.pie(data_home[[2,6]],autopct='%.1f',startangle=90)
plt.title('평균 득점')
plt.legend(['홈','어웨이'])
plt.subplot(2,2,3)
plt.pie(data_home[[3,7]],autopct='%.1f',startangle=90)
plt.title('평균 어시')
plt.legend(['홈','어웨이'])
plt.subplot(2,2,4)
plt.pie(data_home[[4,8]],autopct='%.1f',startangle=90)
plt.title('평균 리바운드')
plt.legend(['홈','어웨이'])
st.pyplot(fig_home)
else :
st.title('')
elif compare_home_team == team_name :
st.error('같은 팀 입니다. 다른 팀을 선택해주세요.')
else :
st.error('팀을 선택해주세요')
if '선수 스탯' in home_multi :
st.subheader('홈경기 선수 스탯')
home_game_id = df_games_home['경기ID']
print(team_id)
home_team_player_info = df_games_detail[(df_games_detail['경기ID'].isin(home_game_id)) & (df_games_detail['팀ID'] == team_id)].iloc[:,3:].groupby('선수명').mean()
st.dataframe(home_team_player_info)
st.info('선수의 자세한 스탯은 카테고리 - 선수 를 이용해주세요.')
else :
st.write('')
elif selected =='어웨이' :
st.subheader('어웨이 성적')
away_multi = st.multiselect('데이터 선택',list_selected_box)
df_games_away = df_games.loc[ (df_games['어웨이팀ID']==team_id) & (start_date<=df_games['경기날짜']) & (df_games['경기날짜']<=end_date),:]
df_games_away = df_games_away.sort_values('경기날짜',ascending=False)
if '상세' in away_multi :
st.subheader('상세')
st.dataframe(df_games_away.iloc[:,[11,12,0,3,4,5,7,8,9]])
if '득점' in away_multi :
#득점 데이터
st.subheader('득점')
recently_game = st.slider('어웨이 경기 득점 경기 수',min_value=3,max_value=int(df_games_away['경기ID'].count()),value=7)
recently_point_pig = px.bar(df_games_away.head(recently_game),x='경기날짜',y=['홈팀점수','어웨이팀점수'],barmode='group')
st.plotly_chart(recently_point_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '어시스트' in away_multi :
#어시스트 데이터
st.subheader('어시스트')
recently_game = st.slider('어웨이 경기 어시스트 경기 수',min_value=3,max_value=int(df_games_away['경기ID'].count()),value=7)
recently_assist_pig = px.bar(df_games_away.head(recently_game),x='경기날짜',y=['홈팀어시','어웨이팀어시'],barmode='group')
st.plotly_chart(recently_assist_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '리바운드' in away_multi :
#리바운드 데이터
st.subheader('리바운드')
recently_game = st.slider('어웨이 경기 리바운드 경기 수',min_value=3,max_value=int(df_games_away['경기ID'].count()),value=7)
recently_rebound_pig = px.bar(df_games_away.head(recently_game),x='경기날짜',y=['홈팀리바운드','어웨이팀리바운드'],barmode='group')
st.plotly_chart(recently_rebound_pig)
st.info('자세히 보고싶은 부분을 좌클릭으로 영역 지정 해주세요.')
if '역대전적' in away_multi :
st.subheader('역대 어웨이 전적비교')
compare_away_team = st.selectbox('팀 선택',team_name_list)
if compare_away_team != '' and compare_away_team != team_name:
compare_team_id_away = df_teams[df_teams['팀약어'] == compare_away_team]['팀ID'].values[0]
data_away=df_games[(df_games['홈팀ID'] == compare_team_id_away) & (df_games['어웨이팀ID'] ==team_id)]
st.dataframe(data_away.iloc[:,[11,0,3,4,5,12,7,8,9,10]].sort_values('경기날짜',ascending=False))
if data_away.empty == False :
data_away = data_away.mean(numeric_only=None)
data_away['어웨이승리'] = 1 - data_away['홈팀승리여부']
fig_away = plt.figure()
plt.subplot(2,2,1)
plt.pie(data_away[[10,9]],autopct='%.1f',startangle = 90)
plt.title('어웨이팀 승률')
plt.legend(['어웨이','홈'])
plt.subplot(2,2,2)
plt.pie(data_away[[6,2]],autopct='%.1f',startangle=90)
plt.title('평균 득점')
plt.legend(['어웨이','홈'])
plt.subplot(2,2,3)
plt.pie(data_away[[7,3]],autopct='%.1f',startangle=90)
plt.title('평균 어시')
plt.legend(['어웨이','홈'])
plt.subplot(2,2,4)
plt.pie(data_away[[8,4]],autopct='%.1f',startangle=90)
plt.title('평균 리바운드')
plt.legend(['어웨이','홈'])
st.pyplot(fig_away)
else :
st.title('')
elif compare_away_team == team_name :
st.error('같은 팀 입니다. 다른 팀을 선택해주세요.')
else :
st.error('팀을 선택해주세요')
if '선수 스탯' in away_multi :
st.subheader('어웨이경기 선수 스탯')
home_away_id = df_games_away['경기ID']
away_team_player_info = df_games_detail[(df_games_detail['경기ID'].isin(home_away_id)) & (df_games_detail['팀ID'] == team_id)].iloc[:,3:].groupby('선수명').mean()
st.dataframe(away_team_player_info)
st.info('선수의 자세한 스탯은 카테고리 - 선수 를 이용해주세요.')
else :
st.write('')