Created
August 6, 2023 20:46
-
-
Save amwelch/7a439a0028ccd8ac300a3d1bf6519151 to your computer and use it in GitHub Desktop.
Sleeper League Roster Ages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
from sleeper_wrapper import League, Players, User | |
import ipdb | |
import json | |
import os.path | |
from tabulate import tabulate | |
DYNO_LEAGUE = 976543638605881344 | |
league = League(DYNO_LEAGUE) | |
rosters = league.get_rosters() | |
players_file = "players_cache.json" | |
if not os.path.exists(players_file): | |
with open(players_file, "w") as ofp: | |
buf = Players() | |
ofp.write(json.dumps(buf)) | |
players = None | |
with open(players_file, "r") as ifp: | |
players = json.load(ifp) | |
rows = [] | |
for roster in rosters: | |
user = User(roster["owner_id"]).get_user() | |
roster_players = [players[x] for x in roster["players"] if x in players] | |
for x in roster_players: | |
x["owner"] = user["display_name"] | |
rows += roster_players | |
df = pd.DataFrame(rows) | |
# Filter out DST | |
df = df[df["age"].notna()] | |
df["name"] = df["first_name"] + " " + df["last_name"] | |
owner_df = ( | |
df[["owner", "age"]] | |
.groupby("owner") | |
.agg( | |
Average=("age", "mean"), | |
Median=("age", "median"), | |
Maximum=("age", "max"), | |
Minimum=("age", "min"), | |
) | |
) | |
owner_df.sort_values("Average", inplace=True) | |
print("Roster Age Stats") | |
print( | |
tabulate(owner_df, headers="keys", tablefmt="psql", showindex=True, floatfmt=".2f") | |
) | |
print( | |
"League-wide age stats: avg: {0:.2f} median: {0:.2f} min: {0:.2f} max: {0:.2f}".format( | |
df["age"].mean(), df["age"].median(), df["age"].max(), df["age"].min() | |
) | |
) | |
num_print = 10 | |
df.sort_values("age", inplace=True) | |
df_young = df[["name", "owner", "age", "position"]].head(num_print) | |
print(f"Top {num_print} Youngest Players") | |
print(tabulate(df_young, headers="keys", tablefmt="psql", showindex=False)) | |
df.sort_values("age", inplace=True, ascending=False) | |
df_old = df[["name", "owner", "age", "position"]].head(num_print) | |
print(f"Top {num_print} Oldest Players") | |
print(tabulate(df_old, headers="keys", tablefmt="psql", showindex=False)) | |
num_over_30 = len(df[df["age"] >= 30]) | |
num_under_25 = len(df[df["age"] < 25]) | |
num_25_29 = len(df[(df["age"] >= 25) & (df["age"] < 30)]) | |
total = len(df) | |
print( | |
"Players over 30: {} ({:.1f}%) Players 25-29: {} ({:.1f}%) Under 25: {} ({:.1f}%)".format( | |
num_over_30, | |
(num_over_30 / total) * 100, | |
num_25_29, | |
(num_25_29 / total) * 100, | |
num_under_25, | |
(num_under_25 / total) * 100, | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment