nesticot commited on
Commit
475eb00
·
1 Parent(s): 72ba72d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +149 -149
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
- 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)
 
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)