Last active
September 11, 2016 21:04
-
-
Save zeimusu/507cc4959bdacfd03ca7ad257c5cab9f to your computer and use it in GitHub Desktop.
Produce a league table from a list of match results.
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
""" | |
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