Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -337,176 +337,176 @@ def server(input, output, session):
|
|
337 |
selected=list(players_list_new[0:10]))
|
338 |
|
339 |
|
340 |
-
|
341 |
-
@output
|
342 |
-
@render.table
|
343 |
-
def result():
|
344 |
-
|
345 |
-
|
346 |
-
return player_games_df[(player_games_df.date <= pd.to_datetime(input.date()))&(player_games_df.player_id.isin(rookie_list))].groupby(['player_id','Player','Position']).agg(
|
347 |
-
GP = ('GP','count'),
|
348 |
-
Stat = (f'{input.stat()}','sum')
|
349 |
-
).reset_index().sort_values(by=['Stat','GP'],ascending=[False,True]).reset_index(drop=True)
|
350 |
-
|
351 |
-
else:
|
352 |
-
return player_games_df[player_games_df.date <= pd.to_datetime(input.date())].groupby(['player_id','Player','Position']).agg(
|
353 |
-
GP = ('GP','count'),
|
354 |
-
Stat = (f'{input.stat()}','sum')
|
355 |
-
).reset_index().sort_values(by=['Stat','GP'],ascending=[False,True]).reset_index(drop=True)
|
356 |
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
else:
|
368 |
-
team_select_title = f'{team_abv_nst_dict[team_select_list[0]]} '
|
369 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
370 |
|
371 |
-
|
372 |
-
|
373 |
-
|
|
|
|
|
|
|
|
|
|
|
374 |
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
|
383 |
-
rookie = ''
|
384 |
-
if input.rookie_switch():
|
385 |
-
rookie = 'Rookie '
|
386 |
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
|
|
|
|
|
|
392 |
|
393 |
-
|
394 |
-
|
395 |
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
|
401 |
-
|
402 |
-
sns.set_theme(style="whitegrid", palette="pastel")
|
403 |
-
#print(type([input.date()))
|
404 |
-
date_range_list = [pd.to_datetime(input.date())]
|
405 |
-
for k in range(len(date_range_list)):
|
406 |
-
print(date_range_list[k])
|
407 |
stat = input.stat()
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
team_schedule_url_merge
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
|
|
|
|
|
|
|
|
|
|
422 |
|
423 |
-
|
424 |
-
|
425 |
|
426 |
-
|
427 |
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
team_schedule_url_merge[i]['team_game'][0] = 0
|
433 |
-
team_schedule_url_merge[i]['player_game'][0] = 0
|
434 |
-
team_schedule_url_merge[i]['stat'][0] = 0
|
435 |
-
|
436 |
|
437 |
-
|
438 |
-
team_schedule_url_merge[i]['player_game'][
|
439 |
-
team_schedule_url_merge[i]['
|
440 |
-
team_schedule_url_merge[i]['stat'][j] = team_schedule_url_merge[i]['stat'][j] - team_schedule_url_merge[i][stat][j]
|
441 |
-
|
442 |
-
if len(team_schedule_url_merge[i]) >3:
|
443 |
-
if pd.isna(team_schedule_url_merge[i].iloc[3]['player_game']) and pd.isna(team_schedule_url_merge[i].iloc[1]['player_game']) == True:
|
444 |
-
team_schedule_url_merge[i]['player_game'][2] = np.nan
|
445 |
-
team_schedule_url_merge[i]['stat'][2] = np.nan
|
446 |
-
|
447 |
-
if len(team_schedule_url_merge[i]) >3:
|
448 |
-
if pd.isna(team_schedule_url_merge[i].iloc[len(team_schedule_url_merge[i])-1]['player_game']) == True:
|
449 |
-
team_schedule_url_merge[i]['stat'][len(team_schedule_url_merge[i])-1] = np.nanmax(team_schedule_url_merge[i]['stat'])
|
450 |
-
|
451 |
-
if not (team_schedule_url_merge[i]['team_game'].values[1] == team_schedule_url_merge[i]['player_game'].values[0]):
|
452 |
-
team_schedule_url_merge[i].loc[0,'team_game'] = np.nan
|
453 |
|
|
|
|
|
|
|
|
|
|
|
454 |
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
style='normal', size=14)
|
464 |
-
|
465 |
-
ax.axhline(0,color='black',linestyle ="--",linewidth=2,alpha=1.0,label='Missed Games')
|
466 |
-
ax.axhline(0,color='black',linestyle ="-",linewidth=2,alpha=1.0)
|
467 |
-
|
468 |
-
if 'Total' in stat:
|
469 |
-
stat = stat.replace('Total ',"")
|
470 |
-
|
471 |
-
|
472 |
-
colour_scheme = ['#648FFF','#785EF0','#DC267F','#FE6100','#FFB000','#FAEF3B','#861318','#2ED3BC','#341BBF','#B37E2C']
|
473 |
-
|
474 |
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
480 |
|
481 |
-
fig.set_facecolor('#ffffff')
|
482 |
-
ax.set(xlim=(0,max([team_schedule_url_merge[x].team_game.max() for x in range(len(team_schedule_url_merge))])))
|
483 |
-
ax.set(ylim=(0,max([team_schedule_url_merge[x].stat.max() for x in range(len(team_schedule_url_merge))])))
|
484 |
-
|
485 |
-
ax.legend_.remove()
|
486 |
-
|
487 |
-
if per_game == False:
|
488 |
-
fig.suptitle(f'{rookie}{team_select_title}{position_select_title}{stat} Race',y=.98,fontsize=32,color='black',**cgfont)
|
489 |
-
ax.set_ylabel(stat,fontsize=20,color='black',**cgfont)
|
490 |
-
# else:
|
491 |
-
# fig.suptitle(stat+' Per Game, All Situations',y=.99,fontsize=48,color='black',**cgfont)
|
492 |
-
# ax.set_ylabel(stat+"/GP",fontsize=20,color='black',**cgfont)
|
493 |
-
ax.set_title(str(current_season)[0:4]+'-'+str(start_season)[-4:]+' Season',y=1.01,fontsize=18,color='black',**cgfont,x=0,ha='left')
|
494 |
-
ax.set_xlabel('Team Game',fontsize=20,color='black',**cgfont)
|
495 |
-
ax.tick_params(axis="x", labelsize=24,colors='black')
|
496 |
-
ax.set_facecolor('#ffffff')
|
497 |
-
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
|
498 |
-
ax.tick_params(axis="y", labelsize=24,colors='black')
|
499 |
-
ax.yaxis.set_major_locator(MaxNLocator(integer=True))
|
500 |
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
510 |
|
511 |
|
512 |
app = App(app_ui, server)
|
|
|
337 |
selected=list(players_list_new[0:10]))
|
338 |
|
339 |
|
340 |
+
|
341 |
+
@output
|
342 |
+
@render.table
|
343 |
+
def result():
|
344 |
+
if input.rookie_switch():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
345 |
|
346 |
+
return player_games_df[(player_games_df.date <= pd.to_datetime(input.date()))&(player_games_df.player_id.isin(rookie_list))].groupby(['player_id','Player','Position']).agg(
|
347 |
+
GP = ('GP','count'),
|
348 |
+
Stat = (f'{input.stat()}','sum')
|
349 |
+
).reset_index().sort_values(by=['Stat','GP'],ascending=[False,True]).reset_index(drop=True)
|
350 |
+
|
351 |
+
else:
|
352 |
+
return player_games_df[player_games_df.date <= pd.to_datetime(input.date())].groupby(['player_id','Player','Position']).agg(
|
353 |
+
GP = ('GP','count'),
|
354 |
+
Stat = (f'{input.stat()}','sum')
|
355 |
+
).reset_index().sort_values(by=['Stat','GP'],ascending=[False,True]).reset_index(drop=True)
|
|
|
|
|
356 |
|
357 |
+
|
358 |
+
@output
|
359 |
+
@render.plot(alt="A histogram")
|
360 |
+
def plot():
|
361 |
+
|
362 |
+
team_select_list = [input.team_select()]
|
363 |
+
position_select_list = [input.position_select()]
|
364 |
|
365 |
+
if team_select_list[0] == 'All':
|
366 |
+
team_select_title = 'NHL '
|
367 |
+
else:
|
368 |
+
team_select_title = f'{team_abv_nst_dict[team_select_list[0]]} '
|
369 |
+
|
370 |
+
|
371 |
+
if position_select_list[0] == 'All':
|
372 |
+
position_select_title = ''
|
373 |
|
374 |
+
|
375 |
+
elif position_select_list[0] == 'F':
|
376 |
+
position_select_title = 'Forwards '
|
377 |
|
378 |
+
|
379 |
+
else:
|
380 |
+
position_select_title = 'Defense '
|
381 |
|
|
|
|
|
|
|
382 |
|
383 |
+
rookie = ''
|
384 |
+
if input.rookie_switch():
|
385 |
+
rookie = 'Rookie '
|
386 |
+
|
387 |
+
i = 0
|
388 |
+
#rookie = ''
|
389 |
+
current_season = '2023'
|
390 |
+
start_season = '2024'
|
391 |
|
392 |
+
|
393 |
+
# player_lookup_list = ['Connor McDavid','David Pastrnak','Nathan MacKinnon']
|
394 |
|
395 |
+
|
396 |
+
type(input.id())
|
397 |
+
print(input.id())
|
398 |
+
player_lookup_list = list(input.id())[0:10]
|
399 |
|
400 |
+
|
|
|
|
|
|
|
|
|
|
|
401 |
stat = input.stat()
|
402 |
+
sns.set_theme(style="whitegrid", palette="pastel")
|
403 |
+
#print(type([input.date()))
|
404 |
+
date_range_list = [pd.to_datetime(input.date())]
|
405 |
+
for k in range(len(date_range_list)):
|
406 |
+
print(date_range_list[k])
|
407 |
+
stat = input.stat()
|
408 |
+
team_schedule_url_merge = []
|
409 |
+
max_games_player = []
|
410 |
+
max_games_team = []
|
411 |
+
max_stat = []
|
412 |
+
per_game = False
|
413 |
+
for i in range(0,len(player_lookup_list)):
|
414 |
+
team_schedule_url_merge.append(player_games_df[(player_games_df.player_id == int(player_lookup_list[i]))&(date_range_list[k] >= player_games_df.date)].reset_index(drop=True))
|
415 |
+
#print('touble',i, player_lookup_list[i],len(player_games_df[(player_games_df.player_id == player_lookup_list[i])]))
|
416 |
+
team_schedule_url_merge[i].index = team_schedule_url_merge[i].team_game
|
417 |
+
team_schedule_url_merge[i] = team_schedule_url_merge[i].reindex(np.arange(team_schedule_url_merge[i].team_game.min(), team_schedule_url_merge[i].team_game.max() + 1)).reset_index(drop=True)
|
418 |
+
#team_schedule_url_merge[0]['team_game'] = team_schedule_url_merge[0]['index']
|
419 |
+
#team_schedule_url_merge[0]['player_game'] =
|
420 |
+
#schedule_ccount_df[schedule_ccount_df['team'].isin(team_schedule_url_merge[0].Team.unique())].merge(right=team_schedule_url_merge[0],left_on=['date','team'],right_on=['date','Team'],how='left')
|
421 |
|
422 |
+
|
423 |
+
team_schedule_url_merge[i]['stat'] = team_schedule_url_merge[i][stat].cumsum()
|
424 |
|
425 |
+
|
426 |
|
427 |
+
|
428 |
+
#team_schedule_url_merge[i]['stat'] = team_schedule_url_merge[i][stat_pick]
|
429 |
+
team_schedule_url_merge[i] = team_schedule_url_merge[i].append(team_schedule_url_merge[i]).sort_index()
|
430 |
+
team_schedule_url_merge[i] = team_schedule_url_merge[i].append(team_schedule_url_merge[i].iloc[0]).sort_index().reset_index(drop=True)
|
|
|
|
|
|
|
|
|
431 |
|
432 |
+
team_schedule_url_merge[i]['team_game'][0] = 0
|
433 |
+
team_schedule_url_merge[i]['player_game'][0] = 0
|
434 |
+
team_schedule_url_merge[i]['stat'][0] = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
435 |
|
436 |
+
|
437 |
+
for j in range(1,len(team_schedule_url_merge[i]),2):
|
438 |
+
team_schedule_url_merge[i]['player_game'][j] = team_schedule_url_merge[i]['player_game'][j]-1
|
439 |
+
team_schedule_url_merge[i]['team_game'][j] = team_schedule_url_merge[i]['team_game'][j]-1
|
440 |
+
team_schedule_url_merge[i]['stat'][j] = team_schedule_url_merge[i]['stat'][j] - team_schedule_url_merge[i][stat][j]
|
441 |
|
442 |
+
if len(team_schedule_url_merge[i]) >3:
|
443 |
+
if pd.isna(team_schedule_url_merge[i].iloc[3]['player_game']) and pd.isna(team_schedule_url_merge[i].iloc[1]['player_game']) == True:
|
444 |
+
team_schedule_url_merge[i]['player_game'][2] = np.nan
|
445 |
+
team_schedule_url_merge[i]['stat'][2] = np.nan
|
446 |
|
447 |
+
if len(team_schedule_url_merge[i]) >3:
|
448 |
+
if pd.isna(team_schedule_url_merge[i].iloc[len(team_schedule_url_merge[i])-1]['player_game']) == True:
|
449 |
+
team_schedule_url_merge[i]['stat'][len(team_schedule_url_merge[i])-1] = np.nanmax(team_schedule_url_merge[i]['stat'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
450 |
|
451 |
+
if not (team_schedule_url_merge[i]['team_game'].values[1] == team_schedule_url_merge[i]['player_game'].values[0]):
|
452 |
+
team_schedule_url_merge[i].loc[0,'team_game'] = np.nan
|
453 |
+
|
454 |
+
|
455 |
+
max_games_player.append(np.around(np.nanmax(team_schedule_url_merge[i]['player_game'])))
|
456 |
+
max_games_team.append(np.around(np.nanmax(team_schedule_url_merge[i]['team_game'])))
|
457 |
+
max_stat.append((np.around(np.nanmax(team_schedule_url_merge[i]['stat']))))
|
458 |
+
|
459 |
+
|
460 |
+
fig, ax = plt.subplots(figsize=(15,15))
|
461 |
+
cgfont = {'fontname':'Century Gothic'}
|
462 |
+
font = font_manager.FontProperties(family='Century Gothic',
|
463 |
+
style='normal', size=14)
|
464 |
+
|
465 |
+
ax.axhline(0,color='black',linestyle ="--",linewidth=2,alpha=1.0,label='Missed Games')
|
466 |
+
ax.axhline(0,color='black',linestyle ="-",linewidth=2,alpha=1.0)
|
467 |
+
|
468 |
+
if 'Total' in stat:
|
469 |
+
stat = stat.replace('Total ',"")
|
470 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
471 |
|
472 |
+
colour_scheme = ['#648FFF','#785EF0','#DC267F','#FE6100','#FFB000','#FAEF3B','#861318','#2ED3BC','#341BBF','#B37E2C']
|
473 |
+
|
474 |
+
|
475 |
+
for i in range(len(team_schedule_url_merge)):
|
476 |
+
sns.lineplot(team_schedule_url_merge[i].reset_index()['team_game'],team_schedule_url_merge[i].reset_index()['stat'],linewidth=3-i*.2,color=colour_scheme[i])
|
477 |
+
plt.plot(team_schedule_url_merge[i]['team_game'],team_schedule_url_merge[i]['stat'],color=ax.lines[i*2+2].get_color(),label=str(i+1)+'. '+team_schedule_url_merge[i]['Player'][0]+', '+str(int(max_stat[i]))+' '+stat+' in '+str(int(max(team_schedule_url_merge[i]['player_game'])))+' Games',linewidth=6)
|
478 |
+
ax.lines[i*2+2].set_linestyle("--")
|
479 |
+
|
480 |
+
|
481 |
+
fig.set_facecolor('#ffffff')
|
482 |
+
ax.set(xlim=(0,max([team_schedule_url_merge[x].team_game.max() for x in range(len(team_schedule_url_merge))])))
|
483 |
+
ax.set(ylim=(0,max([team_schedule_url_merge[x].stat.max() for x in range(len(team_schedule_url_merge))])))
|
484 |
+
|
485 |
+
ax.legend_.remove()
|
486 |
+
|
487 |
+
if per_game == False:
|
488 |
+
fig.suptitle(f'{rookie}{team_select_title}{position_select_title}{stat} Race',y=.98,fontsize=32,color='black',**cgfont)
|
489 |
+
ax.set_ylabel(stat,fontsize=20,color='black',**cgfont)
|
490 |
+
# else:
|
491 |
+
# fig.suptitle(stat+' Per Game, All Situations',y=.99,fontsize=48,color='black',**cgfont)
|
492 |
+
# ax.set_ylabel(stat+"/GP",fontsize=20,color='black',**cgfont)
|
493 |
+
ax.set_title(str(current_season)[0:4]+'-'+str(start_season)[-4:]+' Season',y=1.01,fontsize=18,color='black',**cgfont,x=0,ha='left')
|
494 |
+
ax.set_xlabel('Team Game',fontsize=20,color='black',**cgfont)
|
495 |
+
ax.tick_params(axis="x", labelsize=24,colors='black')
|
496 |
+
ax.set_facecolor('#ffffff')
|
497 |
+
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
|
498 |
+
ax.tick_params(axis="y", labelsize=24,colors='black')
|
499 |
+
ax.yaxis.set_major_locator(MaxNLocator(integer=True))
|
500 |
+
|
501 |
+
fig.text(x=0.025,y=0.01,s="Created By: @TJStats",color='black', fontsize=20, horizontalalignment='left',**cgfont)
|
502 |
+
fig.text(x=0.975,y=0.01,s="Data: Natural Stat Trick",color='black', fontsize=20, horizontalalignment='right',**cgfont)
|
503 |
+
fig.text(x=.975,y=0.92,s='Date: '+input.date().strftime('%B %d, %Y'),color='black', fontsize=18, horizontalalignment='right',**cgfont)
|
504 |
+
|
505 |
+
ax.legend(prop=font,bbox_to_anchor=(0.01, 0.99),loc='upper left',framealpha=1,frameon=True)
|
506 |
+
plt.tight_layout()
|
507 |
+
#fig.savefig('gif_race/'+stat+rookie+str(date_range_list[k].date())+'.png', facecolor=fig.get_facecolor(), edgecolor='none',bbox_inches='tight',dpi=100)
|
508 |
+
#plt.close()
|
509 |
+
#fig.legend(prop=font,loc='best',framealpha=1,frameon=True)
|
510 |
|
511 |
|
512 |
app = App(app_ui, server)
|