Skip to content

Instantly share code, notes, and snippets.

@zeimusu
Last active September 11, 2016 21:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeimusu/507cc4959bdacfd03ca7ad257c5cab9f to your computer and use it in GitHub Desktop.
Save zeimusu/507cc4959bdacfd03ca7ad257c5cab9f to your computer and use it in GitHub Desktop.
Produce a league table from a list of match results.
"""
Module that processes a list of results, and produces a sorted league table.
The list of results is a pandas data frame with format
"Home" "Home Score" "Away" "Away Score"
0 "Chelsea" 4 "Man U" 2
1 ... ... ... ...
Result is a Data frame representing the league table
Played Wins Losses Draws For Against Points Difference
Chelsea 1 1 0 0 4 2 3 2
Man U 1 0 1 0 2 4 0 -2
"""
import pandas as pd
def matches_played(team, results):
home = results[results.Home == team]
away = results[results.Away == team]
return pd.concat([home, away])
def get_wins(team, results):
home_win = results[(results.Home == team)
& (results["Home Score"] > results["Away Score"])]
away_win = results[(results.Away == team)
& (results["Home Score"] < results["Away Score"])]
return pd.concat([home_win, away_win])
def get_draws(team, results):
home_draw = results[(results.Home == team)
& (results["Home Score"] == results["Away Score"])]
away_draw = results[(results.Away == team)
& (results["Home Score"] == results["Away Score"])]
return pd.concat([home_draw, away_draw])
def get_losses(team, results):
home_loss = results[(results.Home == team)
& (results["Home Score"] < results["Away Score"])]
away_loss = results[(results.Away == team)
& (results["Home Score"] > results["Away Score"])]
return pd.concat([home_loss, away_loss])
def goals_for(team, results):
home_goals = results[results.Home == team]["Home Score"].sum()
away_goals = results[results.Away == team]["Away Score"].sum()
return home_goals + away_goals
def goals_against(team, results):
home_goals = results[results.Home == team]["Away Score"].sum()
away_goals = results[results.Away == team]["Home Score"].sum()
return home_goals + away_goals
def make_league_table(teams, results, points_per_win=3, points_per_draw=1):
league_table = pd.DataFrame(
{
"Played": [len(matches_played(team, results)) for team in teams],
"Wins": [len(get_wins(team, results)) for team in teams],
"Losses": [len(get_losses(team, results)) for team in teams],
"Draws": [len(get_draws(team, results)) for team in teams],
"For": [goals_for(team, results) for team in teams],
"Against": [goals_against(team, results) for team in teams]
},
index=teams,
columns=["Played", "Wins", "Losses", "Draws", "For", "Against"]
)
league_table['Points'] = (league_table.Wins * points_per_win
+ league_table.Draws * points_per_draw)
league_table['Difference'] = league_table.For - league_table.Against
return league_table.sort_values(by=["Points", "Difference"],
ascending=False)
def main():
teams = ["Meads", "Crawley", "Cuckfield"]
data = [
["Meads", 1, "Crawley", 0],
["Meads", 2, "Cuckfield", 2],
["Crawley", 3, "Cuckfield", 2],
["Cuckfield", 0, "Meads", 0],
["Crawley", 0, "Meads", 1],
["Cuckfield", 3, "Crawley", 2],
]
results = pd.DataFrame(
data,
columns=[
"Home",
"Home Score",
"Away",
"Away Score"])
print(make_league_table(teams, results))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment