Standings, points, matchday information
%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload
from pathlib import Path
import os

Calculating points and standings from raw (and noisy) match data seems to be too prone to error. It's not rare that there are missing matches in 'complete' datasets. Therefore, accurate information about points, standings and matchdays is needed. Thankfully, sports.de offers a clean html representation of such data that is easily parseable.

cache_prefix = 'primera_division'
league_example_url = BASE_URL + '/fussball/spanien-primera-division/se18343/2015-2016/ergebnisse-und-tabelle/'

league_example_bs = cache(league_example_url, f'league_example_{cache_prefix}')

From any result page for a league, links to all the seasons can be extracted.

season_links_from_page(bs)

season_urls = season_links_from_page(league_example_bs)
season_urls
Unexpected season link:  /fussball/spanien-primera-division/se3061/1986-1987-vorrunde/ergebnisse-und-tabelle/
Unexpected season link:  /fussball/spanien-primera-division/se3120/1986-1987-playoff-13-18/ergebnisse-und-tabelle/
Unexpected season link:  /fussball/spanien-primera-division/se3119/1986-1987-playoff-7-12/ergebnisse-und-tabelle/
Unexpected season link:  /fussball/spanien-primera-division/se3118/1986-1987-playoff-1-6/ergebnisse-und-tabelle/
{'2021': 'https://www.sport.de/fussball/spanien-primera-division/se35880/2020-2021/ergebnisse-und-tabelle/',
 '1920': 'https://www.sport.de/fussball/spanien-primera-division/se31742/2019-2020/ergebnisse-und-tabelle/',
 '1819': 'https://www.sport.de/fussball/spanien-primera-division/se28562/2018-2019/ergebnisse-und-tabelle/',
 '1718': 'https://www.sport.de/fussball/spanien-primera-division/se23902/2017-2018/ergebnisse-und-tabelle/',
 '1617': 'https://www.sport.de/fussball/spanien-primera-division/se20829/2016-2017/ergebnisse-und-tabelle/',
 '1516': 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ergebnisse-und-tabelle/',
 '1415': 'https://www.sport.de/fussball/spanien-primera-division/se15380/2014-2015/ergebnisse-und-tabelle/',
 '1314': 'https://www.sport.de/fussball/spanien-primera-division/se11980/2013-2014/ergebnisse-und-tabelle/',
 '1213': 'https://www.sport.de/fussball/spanien-primera-division/se9034/2012-2013/ergebnisse-und-tabelle/',
 '1112': 'https://www.sport.de/fussball/spanien-primera-division/se7125/2011-2012/ergebnisse-und-tabelle/',
 '1011': 'https://www.sport.de/fussball/spanien-primera-division/se5826/2010-2011/ergebnisse-und-tabelle/',
 '0910': 'https://www.sport.de/fussball/spanien-primera-division/se1484/2009-2010/ergebnisse-und-tabelle/',
 '0809': 'https://www.sport.de/fussball/spanien-primera-division/se99/2008-2009/ergebnisse-und-tabelle/',
 '0708': 'https://www.sport.de/fussball/spanien-primera-division/se5127/2007-2008/ergebnisse-und-tabelle/',
 '0607': 'https://www.sport.de/fussball/spanien-primera-division/se4470/2006-2007/ergebnisse-und-tabelle/',
 '0506': 'https://www.sport.de/fussball/spanien-primera-division/se4109/2005-2006/ergebnisse-und-tabelle/',
 '0405': 'https://www.sport.de/fussball/spanien-primera-division/se3830/2004-2005/ergebnisse-und-tabelle/',
 '0304': 'https://www.sport.de/fussball/spanien-primera-division/se3198/2003-2004/ergebnisse-und-tabelle/',
 '0203': 'https://www.sport.de/fussball/spanien-primera-division/se2762/2002-2003/ergebnisse-und-tabelle/',
 '0102': 'https://www.sport.de/fussball/spanien-primera-division/se2689/2001-2002/ergebnisse-und-tabelle/',
 '0001': 'https://www.sport.de/fussball/spanien-primera-division/se3047/2000-2001/ergebnisse-und-tabelle/',
 '9900': 'https://www.sport.de/fussball/spanien-primera-division/se3048/1999-2000/ergebnisse-und-tabelle/',
 '9899': 'https://www.sport.de/fussball/spanien-primera-division/se3049/1998-1999/ergebnisse-und-tabelle/',
 '9798': 'https://www.sport.de/fussball/spanien-primera-division/se3050/1997-1998/ergebnisse-und-tabelle/',
 '9697': 'https://www.sport.de/fussball/spanien-primera-division/se3051/1996-1997/ergebnisse-und-tabelle/',
 '9596': 'https://www.sport.de/fussball/spanien-primera-division/se3052/1995-1996/ergebnisse-und-tabelle/',
 '9495': 'https://www.sport.de/fussball/spanien-primera-division/se3053/1994-1995/ergebnisse-und-tabelle/',
 '9394': 'https://www.sport.de/fussball/spanien-primera-division/se3054/1993-1994/ergebnisse-und-tabelle/',
 '9293': 'https://www.sport.de/fussball/spanien-primera-division/se3055/1992-1993/ergebnisse-und-tabelle/',
 '9192': 'https://www.sport.de/fussball/spanien-primera-division/se3056/1991-1992/ergebnisse-und-tabelle/',
 '9091': 'https://www.sport.de/fussball/spanien-primera-division/se3058/1990-1991/ergebnisse-und-tabelle/',
 '8990': 'https://www.sport.de/fussball/spanien-primera-division/se3059/1989-1990/ergebnisse-und-tabelle/',
 '8889': 'https://www.sport.de/fussball/spanien-primera-division/se3060/1988-1989/ergebnisse-und-tabelle/',
 '8788': 'https://www.sport.de/fussball/spanien-primera-division/se2258/1987-1988/ergebnisse-und-tabelle/',
 '8586': 'https://www.sport.de/fussball/spanien-primera-division/se2262/1985-1986/ergebnisse-und-tabelle/',
 '8485': 'https://www.sport.de/fussball/spanien-primera-division/se3062/1984-1985/ergebnisse-und-tabelle/',
 '8384': 'https://www.sport.de/fussball/spanien-primera-division/se3063/1983-1984/ergebnisse-und-tabelle/',
 '8283': 'https://www.sport.de/fussball/spanien-primera-division/se3064/1982-1983/ergebnisse-und-tabelle/',
 '8182': 'https://www.sport.de/fussball/spanien-primera-division/se3065/1981-1982/ergebnisse-und-tabelle/',
 '8081': 'https://www.sport.de/fussball/spanien-primera-division/se3066/1980-1981/ergebnisse-und-tabelle/',
 '7980': 'https://www.sport.de/fussball/spanien-primera-division/se3067/1979-1980/ergebnisse-und-tabelle/',
 '7879': 'https://www.sport.de/fussball/spanien-primera-division/se3068/1978-1979/ergebnisse-und-tabelle/',
 '7778': 'https://www.sport.de/fussball/spanien-primera-division/se3069/1977-1978/ergebnisse-und-tabelle/',
 '7677': 'https://www.sport.de/fussball/spanien-primera-division/se3070/1976-1977/ergebnisse-und-tabelle/',
 '7576': 'https://www.sport.de/fussball/spanien-primera-division/se3071/1975-1976/ergebnisse-und-tabelle/',
 '7475': 'https://www.sport.de/fussball/spanien-primera-division/se3072/1974-1975/ergebnisse-und-tabelle/',
 '7374': 'https://www.sport.de/fussball/spanien-primera-division/se3073/1973-1974/ergebnisse-und-tabelle/',
 '7273': 'https://www.sport.de/fussball/spanien-primera-division/se3074/1972-1973/ergebnisse-und-tabelle/',
 '7172': 'https://www.sport.de/fussball/spanien-primera-division/se3075/1971-1972/ergebnisse-und-tabelle/',
 '7071': 'https://www.sport.de/fussball/spanien-primera-division/se3076/1970-1971/ergebnisse-und-tabelle/',
 '6970': 'https://www.sport.de/fussball/spanien-primera-division/se3077/1969-1970/ergebnisse-und-tabelle/',
 '6869': 'https://www.sport.de/fussball/spanien-primera-division/se3078/1968-1969/ergebnisse-und-tabelle/',
 '6768': 'https://www.sport.de/fussball/spanien-primera-division/se3079/1967-1968/ergebnisse-und-tabelle/',
 '6667': 'https://www.sport.de/fussball/spanien-primera-division/se3080/1966-1967/ergebnisse-und-tabelle/',
 '6566': 'https://www.sport.de/fussball/spanien-primera-division/se3081/1965-1966/ergebnisse-und-tabelle/',
 '6465': 'https://www.sport.de/fussball/spanien-primera-division/se3082/1964-1965/ergebnisse-und-tabelle/',
 '6364': 'https://www.sport.de/fussball/spanien-primera-division/se3083/1963-1964/ergebnisse-und-tabelle/',
 '6263': 'https://www.sport.de/fussball/spanien-primera-division/se3084/1962-1963/ergebnisse-und-tabelle/',
 '6162': 'https://www.sport.de/fussball/spanien-primera-division/se3085/1961-1962/ergebnisse-und-tabelle/',
 '6061': 'https://www.sport.de/fussball/spanien-primera-division/se3086/1960-1961/ergebnisse-und-tabelle/',
 '5960': 'https://www.sport.de/fussball/spanien-primera-division/se3087/1959-1960/ergebnisse-und-tabelle/',
 '5859': 'https://www.sport.de/fussball/spanien-primera-division/se3088/1958-1959/ergebnisse-und-tabelle/',
 '5758': 'https://www.sport.de/fussball/spanien-primera-division/se3089/1957-1958/ergebnisse-und-tabelle/',
 '5657': 'https://www.sport.de/fussball/spanien-primera-division/se3090/1956-1957/ergebnisse-und-tabelle/',
 '5556': 'https://www.sport.de/fussball/spanien-primera-division/se3091/1955-1956/ergebnisse-und-tabelle/',
 '5455': 'https://www.sport.de/fussball/spanien-primera-division/se3092/1954-1955/ergebnisse-und-tabelle/',
 '5354': 'https://www.sport.de/fussball/spanien-primera-division/se3093/1953-1954/ergebnisse-und-tabelle/',
 '5253': 'https://www.sport.de/fussball/spanien-primera-division/se3094/1952-1953/ergebnisse-und-tabelle/',
 '5152': 'https://www.sport.de/fussball/spanien-primera-division/se3095/1951-1952/ergebnisse-und-tabelle/',
 '5051': 'https://www.sport.de/fussball/spanien-primera-division/se3096/1950-1951/ergebnisse-und-tabelle/'}

Matchdays

get_matchday_links(bs, expected_length=34)

matchday_links = get_matchday_links(league_example_bs, expected_length=None)
matchday_links
['https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md1/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md2/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md3/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md4/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md5/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md6/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md7/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md8/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md9/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md10/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md11/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md12/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md13/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md14/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md15/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md16/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md17/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md18/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md19/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md20/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md21/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md22/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md23/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md24/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md25/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md26/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md27/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md28/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md29/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md30/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md31/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md32/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md33/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md34/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md35/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md36/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md37/ergebnisse-und-tabelle/',
 'https://www.sport.de/fussball/spanien-primera-division/se18343/2015-2016/ro57057/spieltag/md38/ergebnisse-und-tabelle/']

Dates

get_matchday_dates[source]

get_matchday_dates(matchday_bs)

example_matchday_bs = cache(matchday_links[0], f'sportde_matchday_example_{cache_prefix}')
get_matchday_dates(example_matchday_bs)
[datetime.datetime(2015, 8, 23, 0, 0),
 datetime.datetime(2015, 8, 22, 0, 0),
 datetime.datetime(2015, 8, 21, 0, 0),
 datetime.datetime(2015, 8, 24, 0, 0)]

Matches

get_match_infos[source]

get_match_infos(matchday_bs)

Returns [[home_team, away_team, home_goals, away_goals], ...]

get_match_infos(example_matchday_bs)
[['Málaga', 'FC Sevilla', 0, 0],
 ['Espanyol', 'Getafe', 1, 0],
 ['Deportivo', 'S. Sebastian', 0, 0],
 ['Atlético', 'UD Las Palmas', 1, 0],
 ['Rayo', 'Valencia', 0, 0],
 ['Athletic', 'Barcelona', 0, 1],
 ['Sporting Gijón', 'Real Madrid', 0, 0],
 ['Levante', 'RC Celta', 1, 2],
 ['Betis Sevilla', 'Villarreal', 1, 1],
 ['Granada CF', 'Eibar', 1, 3]]

Standings

get_standings[source]

get_standings(matchday_bs)

Returns [[rank, team, games_played, wins, draw, lost, total_goals_scored, total_goals_received, points], ...]

get_standings(example_matchday_bs)
[['1', 'RC Celta', '1', '1', '0', '0', '2', '1', '3'],
 ['2', 'Atlético', '1', '1', '0', '0', '1', '0', '3'],
 ['2', 'Barcelona', '1', '1', '0', '0', '1', '0', '3'],
 ['4', 'Espanyol', '1', '1', '0', '0', '1', '0', '3'],
 ['5', 'Eibar', '1', '1', '0', '0', '3', '1', '3'],
 ['6', 'Betis Sevilla', '1', '0', '1', '0', '1', '1', '1'],
 ['6', 'Villarreal', '1', '0', '1', '0', '1', '1', '1'],
 ['8', 'Deportivo', '1', '0', '1', '0', '0', '0', '1'],
 ['8', 'Málaga', '1', '0', '1', '0', '0', '0', '1'],
 ['8', 'Rayo', '1', '0', '1', '0', '0', '0', '1'],
 ['8', 'Real Madrid', '1', '0', '1', '0', '0', '0', '1'],
 ['8', 'S. Sebastian', '1', '0', '1', '0', '0', '0', '1'],
 ['8', 'FC Sevilla', '1', '0', '1', '0', '0', '0', '1'],
 ['14', 'Valencia', '1', '0', '1', '0', '0', '0', '1'],
 ['15', 'Sporting Gijón', '1', '0', '1', '0', '0', '0', '1'],
 ['16', 'Levante', '1', '0', '0', '1', '1', '2', '0'],
 ['17', 'Athletic', '1', '0', '0', '1', '0', '1', '0'],
 ['17', 'Getafe', '1', '0', '0', '1', '0', '1', '0'],
 ['19', 'UD Las Palmas', '1', '0', '0', '1', '0', '1', '0'],
 ['20', 'Granada CF', '1', '0', '0', '1', '1', '3', '0']]

Scrape entire season

scrape_season[source]

scrape_season(season, season_link, expected_matchdays=None, do_cache=False)

standings, matchdays, games = scrape_season('2021', season_urls['2021'], do_cache=True)

set_dtypes[source]

set_dtypes(df, dtypes)

save_season[source]

save_season(standings, matchdays, games, league, save_path)

paths = save_season(standings, matchdays, games, 'premier_league', Path('../data/'))

for path in paths:
    assert path.is_file()
    os.remove(path)